Subject: Re: any chance to use a modern linux kernel on Pegasos1 G3 ?

From: Sven Luther <[email-masked]>
Date: Tue, 15 Mar 2011 18:49:24 +0100

On Tue, Mar 15, 2011 at 06:14:48PM +0100, Gerhard Pircher wrote:
> 
> -------- Original-Nachricht --------
> > Datum: Tue, 15 Mar 2011 17:44:49 +0100
> > Von: nello martuscielli <[email-masked]>
> > An: 
> > CC: [email-masked], "acrux @ cruxppc" <[email-masked]>
> > Betreff: Re: any chance to use a modern linux kernel on Pegasos1 G3 ?
> 
> > ok, it seems that no one is interested to fix Pegasos1 G3 600MHz
> > support.
> > 
> > But if someone is capable (i don't have this skill) here what it
> > happens reading from serial debug console untill it freezes with
> > linux-2.6.36.4
> > 
> > Pegasos Boot Strap (c) 2002 bplan GmbH
> > Running on CPU PVR:00083311
> > PLL setting : 00000001
> > Enable L1 ICache...                                                   
> > Done.
> > Setting ROM Defaults...                                               
> > Done.
> > Configuring SDRAM...
> > 08000000
> > 10000000
> > Delaying...Done.
> > RAMSIZE = 18000000
> > 00000004
> > Reading W83194 : 00FFFFFFFFFF0000                                     
> > Done.
> > Setting Front Side Bus to 100MHz...                                   
> > Done.
> > Releasing IDE reset ...                                               
> > Done.
> > Configuring Legacy Devices
> > Initializing KBD...                                                   
> > Done.
> > PLL setting : 00000003
> > 10000000
> > Done.
> > FFFFFFFF
> > BIOS: Stage 2 entered arg(FFFC0000,00000000,18000000)
> > BIOS: MachineInfo at 0FFFFE68
> > BIOS: set MemPool limit to BAT size (old=18000000 new=10000000)
> > BIOS: 0F6FFFE8 bytes added to mempool
> > LoadFromRFS: starting
> > LoadFromRFS: lib module 00 has abs load adr at 00C00000
> > CopyModule: start
> > CopyModule: load address : 00C00000
> > CopyModule: copy module to ram...done
> > ModuleCopy: expanding... done
> > LoadFromRFS: 00000001 modules out of 00000001 loaded
> > InitLib: start
> > InitLib: call module as OF
> > allocated g_e=0xFD00008 (len=19232)
> > install_root: pkg=0xFD53B90
> > after init_environ e=0xFD00008
> > running nvramrc...
> > after running nvramrc
> > no/bad nvramrc - performing default startup script
> > Bus addresses:
> >            253@2
> > I/O addresses:
> >           7936@FE002100
> > Memory addresses:
> >           127M@88040000
> >           1.3G@98000000
> > Prefetchable memory addresses:
> > install_ata_disk_driver: reg=0x1000
> > init_drive: reset controller 0x1000/0x100E
> > init_drive: allow 4-bits for heads
> > init_drive: select drive 0
> > init_drive: seccnt=0x1 sector=0x1 cyl_lo=0x0 cyl_hi=0x0
> > init_drive: error=0x1 status=0x50 status2=0x50
> > init_drive: identify drive: atapi=0
> > install_ata_disk_driver: return no error (0)
> > install_ata_disk_driver: reg=0x1000
> > init_drive: allow 4-bits for heads
> > init_drive: select drive 1
> > init_drive: seccnt=0x1 sector=0x1 cyl_lo=0x14 cyl_hi=0xEB
> > init_drive: error=0x1 status=0x0 status2=0x0
> > init_drive: identify drive: atapi=1
> > atapi_cmd: cmdlen=12
> > atapi_cmd: inlen=8 len=65534
> > install_ata_disk_driver: return no error (0)
> > install_ata_disk_driver: reg=0x1010
> > init_drive: reset controller 0x1010/0x101E
> > init_drive: allow 4-bits for heads
> > init_drive: select drive 0
> > init_drive: seccnt=0x20 sector=0x20 cyl_lo=0x20 cyl_hi=0x20
> > init_drive: error=0x20 status=0x20 status2=0x20
> > ATA-wait-ready: timeout: status=0x20
> > init_drive: failed
> > install_ata_disk_driver: reg=0x1010
> > init_drive: allow 4-bits for heads
> > init_drive: select drive 1
> > init_drive: seccnt=0x30 sector=0x30 cyl_lo=0x30 cyl_hi=0x30
> > init_drive: error=0x30 status=0x30 status2=0x30
> > ATA-wait-ready: timeout: status=0x30
> > init_drive: failed
> > Bus addresses:
> >            254@2
> > I/O addresses:
> >              8@FE001038
> >           3072@FE001400
> >            48K@FE004000
> > Memory addresses:
> >           1792@A0000100
> >           1.2G@A0001000
> > Prefetchable memory addresses:
> >            12M@FD400000
> > F_INSTALL_CONSOLE: BEGIN
> > F_INSTALL_CONSOLE: ALIASING SCREEN
> > F_INSTALL_CONSOLE: ALIASING KBD
> > EMULATION INT HANDLER ENTERED WITH:
> > INT NO: 15
> > 
> > EAX=0003 EBX=1111 ECX=2222 EDX=3333 ESP=0000 EBP=5555 ESI=6666 EDI=7777
> >  AX=4E08  BX=C505  CX=0003  DX=202A  SP=6CAA  BP=5555  SI=5CF9  DI=7777
> >  DS=C000  ES=BAD0  SS=C000  CS=F000  IP=FE15   NV UP -- PL ZR NA PE NC
> > CS:IP = F4  C558 C000 0244 3000 0000 01B4 AC63 0200
> > UNHANDLED INT 10 FUNCTION 0007 WITHIN EMULATION
> > F_INSTALL_CONSOLE: END
> > auto-booting...
> > do_load: dev="" dlen=0 args="" alen=0
> > do_load: alstr=""
> > do_load: path doesn't start with /
> > do_load: <diag-device> == <eth>
> > do_load: no args..use the default
> > do_load: <diag-file> == <diag>
> > try_load: dev="eth" dlen=3 args="diag" alen=4
> > entering main read/eval loop...
> > 
> > [...]
> > atapi_cmd: cmdlen=12
> > atapi_cmd: inlen=2048 len=2048
> > iso_walk: read: name="zImage.chrp" extent=0x44FD size=0x337272 ret=no
> > error
> > iso9660: return R_END
> > file_system: return end (-4089)
> > disk-label return len=3371634 ret=end (-4089)
> > ata_disk_close
> > disk-label close:
> > checking exec type Fcode
> > fcode_is_exec: load=0x400000 loadlen=3371634
> > checking exec type Forth
> > checking exec type ELF
> > f_go:
> > checking exec type Fcode
> > fcode_is_exec: load=0x400000 loadlen=3371634
> > checking exec type Forth
> > checking exec type ELF
> > alloc_aligned: a 0xFD548E8 align 0xFD5491C size 0xFD54918 addr 0xFD54914
> > alloc_constrained: min 0x0, max 0xFFFFFFFF, align 0x1000, mask
> > 0xFFFFFFFF, size 0x332000, addr 0x300000
> > alloc_constrained: acells 0x1 scells 0x1 t1 0xC t2 0xFD5490C u1
> > 0xFD54910 u2 0xFD54914 u3 0xFD54918
> > alloc_constrained: allocator_block 0xFD54930, next 0x0 addr 0x300000
> > size 0xFD00000
> > alloc_constrained: fsblock 0x0
> > alloc_constrained: addr[] 0x300000
> > alloc_constrained: bsize[] 0xFD00000
> > alloc_constrained: passed min check
> > alloc_constrained: addr 0x300000, align 0xFFF, off 0x69696969
> > sum 0x0
> > alloc_constrained: passed align check
> > alloc_constrained: passed max check
> > alloc_constrained: passed mask check
> > alloc_constrained: passed full size check
> > alloc_constrained: passed size check
> > alloc_aligned: a 0xFD548E8 align 0xFD5491C size 0xFD54918 addr 0xFD54914
> > alloc_constrained: min 0x0, max 0xFFFFFFFF, align 0x1000, mask
> > 0xFFFFFFFF, size 0x6883C0, addr 0x632000
> > alloc_constrained: acells 0x1 scells 0x1 t1 0xC t2 0xFD5490C u1
> > 0xFD54910 u2 0xFD54914 u3 0xFD54918
> > alloc_constrained: allocator_block 0xFD54930, next 0x0 addr 0x632000
> > size 0xF9CE000
> > alloc_constrained: fsblock 0x0
> > alloc_constrained: addr[] 0x632000
> > alloc_constrained: bsize[] 0xF9CE000
> > alloc_constrained: passed min check
> > alloc_constrained: addr 0x632000, align 0xFFF, off 0x0
> > sum 0x0
> > alloc_constrained: passed align check
> > alloc_constrained: passed max check
> > alloc_constrained: passed mask check
> > alloc_constrained: passed full size check
> > alloc_constrained: passed size check
> > 
> > 
> > 
> > and here giving a try with a smaller (1.9MB) linux boot kernel
> > [...]
> > atapi_cmd: cmdlen=12
> > atapi_cmd: inlen=2048 len=2048
> > iso_walk: read: name="zImage.chrp" extent=0x3CC size=0x1D8A1A ret=no error
> > iso9660: return R_END
> > file_system: return end (-4089)
> > disk-label return len=1935898 ret=end (-4089)
> > ata_disk_close
> > disk-label close:
> > checking exec type Fcode
> > fcode_is_exec: load=0x400000 loadlen=1935898
> > checking exec type Forth
> > checking exec type ELF
> > f_go:
> > checking exec type Fcode
> > fcode_is_exec: load=0x400000 loadlen=1935898
> > checking exec type Forth
> > checking exec type ELF
> > alloc_aligned: a 0xFD548E8 align 0xFD5491C size 0xFD54918 addr 0xFD54914
> > alloc_constrained: min 0x0, max 0xFFFFFFFF, align 0x1000, mask
> > 0xFFFFFFFF, size 0x1D3000, addr 0x300000
> > alloc_constrained: acells 0x1 scells 0x1 t1 0xC t2 0xFD5490C u1
> > 0xFD54910 u2 0xFD54914 u3 0xFD54918
> > alloc_constrained: allocator_block 0xFD54930, next 0x0 addr 0x300000
> > size 0xFD00000
> > alloc_constrained: fsblock 0x0
> > alloc_constrained: addr[] 0x300000
> > alloc_constrained: bsize[] 0xFD00000
> > alloc_constrained: passed min check
> > alloc_constrained: addr 0x300000, align 0xFFF, off 0x69696969
> > sum 0x0
> > alloc_constrained: passed align check
> > alloc_constrained: passed max check
> > alloc_constrained: passed mask check
> > alloc_constrained: passed full size check
> > alloc_constrained: passed size check
> > alloc_aligned: a 0xFD548E8 align 0xFD5491C size 0xFD54918 addr 0xFD54914
> > alloc_constrained: min 0x0, max 0xFFFFFFFF, align 0x1000, mask
> > 0xFFFFFFFF, size 0x3AC9A0, addr 0x4D3000
> > alloc_constrained: acells 0x1 scells 0x1 t1 0xC t2 0xFD5490C u1
> > 0xFD54910 u2 0xFD54914 u3 0xFD54918
> > alloc_constrained: allocator_block 0xFD54930, next 0x0 addr 0x4D3000
> > size 0xFB2D000
> > alloc_constrained: fsblock 0x0
> > alloc_constrained: addr[] 0x4D3000
> > alloc_constrained: bsize[] 0xFB2D000
> > alloc_constrained: passed min check
> > alloc_constrained: addr 0x4D3000, align 0xFFF, off 0x0
> > sum 0x0
> > alloc_constrained: passed align check
> > alloc_constrained: passed max check
> > alloc_constrained: passed mask check
> > alloc_constrained: passed full size check
> > alloc_constrained: passed size check
> 
> I don't know much about the Pegasos OF, but did you give GRUB2 for OF
> a try? Maybe it can boot a newer Linux kernel, if it is not a device
> tree related problem.
> 
> On the other side you mentioned this workaround in
> arch/ppc/kernel/prom_init.c to me some time ago:
> 
> unsigned long __init prom_init(int r3, int r4, prom_entry pp) :
> >        node = call_prom("finddevice", 1, 1, "/");
> >        rc = call_prom("getprop", 4, 1, node, "model", model, sizeof(model));
> >        if (rc > 0 && !strncmp (model, "Pegasos", 7)
> >                && strncmp (model, "Pegasos2", 8)) {
> >                /* Pegasos 1 has a broken translate method in the OF,
> >                 * and furthermore the BATs are mapped 1:1 so the phys
> >                 * address calculated above is correct, so let's use
> >                 * it directly.
> >                 */
> >        } else if (offset == 0) {
> >                /* If we are already running at 0xc0000000, we assume we were
> >                 * loaded by an OF bootloader which did set a BAT for us.
> >                 * This breaks OF translate so we force phys to be 0.
> >                 */
> >                prom_print("(already at 0xc0000000) phys=0\n");
> >                phys = 0;
> >        } else if (call_prom("getprop", 4, 1, prom_chosen, "mmu",
> >                             &prom_mmu, sizeof(prom_mmu)) <= 0) {
> >                prom_print(" no MMU found\n");
> >        } else if (call_prom_ret("call-method", 4, 4, result, "translate",
> >                                 prom_mmu, &_stext, 1) != 0) {
> >                prom_print(" (translate failed)\n");
> >        } else {
> >                /* We assume the phys. address size is 3 cells */
> >                phys = result[2];
> >        }
> 
> Can anybody comment, if this "broken translate method in the OF" would
> still be needed for arch/powerpc?

Well, since this is long dead hardware not produced anymore, i don't see how the 
OF could have unbroken itself by moving to powerpc.

It has been age since i looked into this, but to the best of my knowledge (and i
wrote the above code or at least the earlier versions) it should be still broken.

But YMMV, ...

Friendly,

Sven Luther