Subject: cause of early indigo2 crash

From: Florian Lohoff <[email-masked]>
Date: Wed, 5 Apr 2000 22:34:13 +0200

Hi,
i discovered that the prom of the indigo2 reports 2 MEMTYPE_FREE
segments - One at 08002000 and the other at 88000000 - The second one
at least 16 times larger - If i exclude the first segment from beeing
freed and thus used the kernel boots much further - This is what
i did in the arch/mips/arc/memory.c

        for (i = 0; pblocks[i].size; i++)
                if (pblocks[i].type == MEMTYPE_FREE &&
                                pblocks[i].base != 0x8002000)
                        free_bootmem(pblocks[i].base, pblocks[i].size);

Now i get a very different crash - After SCSI Detection i get

scsi::resize_dma_pool: WARNING, dma_sectors=0, wanted=96, scaling
scsi::resize_dma_pool: WARNING, dma_sectors=0, wanted=80, scaling
scsi::resize_dma_pool: WARNING, dma_sectors=0, wanted=64, scaling
scsi::resize_dma_pool: WARNING, dma_sectors=0, wanted=48, scaling
       WARNING, not enough memory, pool not expanded
Unable to handle kernel paging request at virtual address 00000000, epc == 880cc668, ra == 880cc5d8
[...]

Thats it - Might the first area be DMA bounce buffer only which have to
be initialized in the memory controller ?

Flo
-- 
Florian Lohoff		[email-masked]		      	+49-subject-2-change
"Technology is a constant battle between manufacturers producing bigger and
more idiot-proof systems and nature producing bigger and better idiots."

---

From: Florian Lohoff <[email-masked]>
Date: Thu, 6 Apr 2000 12:08:31 +0200

On Thu, Apr 06, 2000 at 10:51:17AM +0200, Geert Uytterhoeven wrote:
>   ^^^^^
> What's here? Usually it tells the function where it crashes.

:) I dont have an System.map available - But i think i know the cause
of the crash - I think the arch/mips/arc/memory.c forgets to
allocate/not-free the memory the kernel - I dont think the ARC Prom is
able to mark the kernel memory different - But i cant see a location
where it explicitly reserves/allocates the kernel pages. Dec and ddb
to something like free_bootmem(bootmap,&_end,size-_end) - Nothing
like that in the arc things ... They free all memory segments
the ARC Prom gives back as "MEMTYPE_FREE" (arc_contigm, arc_freem)
and then it just takes the largest segment (there are 2 segments 
- before and after the arc-prom segment) and installs the bootmem-map
in there. The next alloc and memset causes the crash as it allocates
from 88002000 which is the end of the mem map - My suspicion is (Which
ill try tonight) that the memory map with 2 pages is that small
that is just overwrites parts of the kernel with no effect - The next alloc
and memset is 4MB - This destroys the kernel completely and though causes
a crash.

> I see these panics sometimes as well. Where does the crash happen? Please
> lookup in System.map.

Ill do tonight

Flo

---

From: Geert Uytterhoeven <[email-masked]>
Date: Thu, 6 Apr 2000 10:51:17 +0200 (MET DST)

^^^^^

Gr{oetje,eeting}s,

						Geert

--
Geert Uytterhoeven ------------- Sony Software Development Center Europe (SDCE)
[email-masked] ------------------- Sint-Stevens-Woluwestraat 55
Voice +32-2-7248638 Fax +32-2-7262686 ---------------- B-1130 Brussels, Belgium

---

From: Florian Lohoff <[email-masked]>
Date: Thu, 6 Apr 2000 23:05:05 +0200

> I see these panics sometimes as well. Where does the crash happen? Please

Its in drivers/scsi/scsi_dma.c 

It happens due to no available scsi dma buffers which is caused by
the fact that MAX_DMA_ADDRESS is below the lowest free memory segment
(Kernel overlaps). If i increase the MAX_DMA_ADDRESS include/asm/dma.h.

As most of the drivers dont use the MAX_DMA_ADDRESS (zone allocator should
have made it obsolete) i suggest leaving it like it is and changing
arch/mips/mm/init.c to:

#if defined(CONFIG_ISA) || defined(CONFIG_PCI)
        if (low < max_dma)
                zones_size[ZONE_DMA] = low;
        else {
                zones_size[ZONE_DMA] = max_dma;
                zones_size[ZONE_NORMAL] = low - max_dma;
        }
#else
        zones_size[ZONE_DMA] = low;
#endif

as the dma.h comment says that this only applies to standard PC 
dma controllers.

If no one objects ill commit this.

Flo