From 82a6bdc293c924fae9f2ffcdaa753ea026c8ae6f Mon Sep 17 00:00:00 2001 From: "Ronald G. Minnich" Date: Fri, 8 Dec 2000 19:45:35 +0000 Subject: [PATCH] vastly improved IPL and chipsizer. Looks like DoC is a go on this machine, but we'll see. --- romimages/RON_ASUS_CUA/Makefile | 11 +++- src/northbridge/acer/m1631/ipl.S | 101 +++++++++++++++++++++++++------ 2 files changed, 94 insertions(+), 18 deletions(-) diff --git a/romimages/RON_ASUS_CUA/Makefile b/romimages/RON_ASUS_CUA/Makefile index ff287aa579..d76d7ffddc 100644 --- a/romimages/RON_ASUS_CUA/Makefile +++ b/romimages/RON_ASUS_CUA/Makefile @@ -45,10 +45,19 @@ floppy: all # we need the vmlinux.bin.gz padded out and then cat the linuxbios.rom # at then end. We always copy it to /tmp so that a waiting root shell # can put it on the floppy (see ROOTDOIT) -romimage: linuxbios.rom vmlinux.bin.gz.block +romimage: linuxbios.rom vmlinux.bin.gz.block docipl cat vmlinux.bin.gz.block linuxbios.rom > romimage cp romimage /tmp +docipl: ipl.o + objcopy -O binary -R .note -R .comment -S ipl.o adocipl + dd if=adocipl of=docipl bs=1 skip=1040384 + +# I have noe idea why you can not use $(CPUFLAGS) to compile ipl.S +# a bug with -Di686 ?? +ipl.o: $(TOP)/src/northbridge/acer/m1631/ipl.S + gcc -save-temps -c -I$(TOP)/src/include -I$(TOP)/src $< + linuxbios.rom: linuxbios.strip mkrom ./mkrom -s 64 -f -o linuxbios.rom linuxbios.strip diff --git a/src/northbridge/acer/m1631/ipl.S b/src/northbridge/acer/m1631/ipl.S index 20073cb268..57703f9efc 100644 --- a/src/northbridge/acer/m1631/ipl.S +++ b/src/northbridge/acer/m1631/ipl.S @@ -1,3 +1,4 @@ +#include #include #define DOC_WIN_SEG 0xfe00 #define DOC_STACK_SEG 0x0400 @@ -16,7 +17,61 @@ * ror it 16 bits, and as we grow the CAS, we just inc cs, and that will * set the right value. */ -#define INIT_MCR $0xf6640000 +#define INIT_MCR $0xf6641000 +/*#include */ +.org 0xfe000 +.code16 +_start: jmp _realstart +gdt: //GDT entry 0 (null segment) + .byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + // GDT 1 + .word 0xffff, 0x0000 /* flat code segment */ + .byte 0x0, 0x9a, 0xcf, 0x0 + + .word 0xffff, 0x0000 /* flat data segment */ + .byte 0x0, 0x92, 0xcf, 0x0 + +gdtptr: + .word 3*8-1 + .long gdt /* we know the offset */ + .long 0 + +_realstart: + + cli + movw %cs, %ax + movw %ax, %es + + .byte 0x66 /* prefix */ + .byte 0x26 + .byte 0x0f, 0x01, 0x16 /* lgdt [es:offset]*/ + .word gdtptr - EXT(_start) /* offset in segment */ + + movl %cr0, %eax + andl $0x7FFAFFD1, %eax /* PG,AM,WP,NE,TS,EM,MP = 0 */ + orl $0x60000001, %eax /* CD, NW, PE = 1 */ + movl %eax, %cr0 + + /* invalidate the cache */ + invd + data32 ljmp $0x8, $.Lprotected + +.Lprotected: + .code32 + movw $0x10, %bx + movw %bx, %es + movw %bx, %ds +#ifdef USE_BIG_REAL + andb $0xfe, %al + movl %eax, %cr0 + ljmp $0xfe00, $.Lunprotected +Lunprotected: +code16 +#endif + + /* WARNING: The new CALLSP code trashes the stack! */ + /* I will leave this here for now, but you should also set it later. */ + xorl %edi, %edi movb $0x6c, %al CALLSP(pci_read_dword) @@ -26,17 +81,18 @@ CALLSP(pci_write_dword) rorl $16, %ecx /* test 8 bit CAS */ - movb $0, (%edi) + movb $0, 0 movb $1, 0x800 - cmpb $0,(%edi) + cmpb $0,0 jnz sizeram inc %cl - movb $1, 0x1000 - cmpb $0, (%edi) + /* change the value we store each time. It makes debugging easier */ + movb $2, 0x1000 + cmpb $0, 0 jnz sizeram inc %cl - movb $1, 0x2000 - cmpb $0, (%edi) + movb $3, 0x2000 + cmpb $0, 0 jnz sizeram inc %cl @@ -50,15 +106,24 @@ sizeram: /* now size the dram */ /* you had best have at least 32M; that's as small as we go */ /* rorr 20 the ecx value, to get row size into lsb */ - movb $0, (%edi) + movb $0, 0 ror $20, %ecx movl $0x400000, %esi -1: - movb $1, (%esi) +1: +#ifdef USE_BIG_REAL + addr32 movb $4, %es:(%esi) +#else + movb $4, %es:(%esi) +#endif + cmpb $4, %es:(%esi) + jne 1f inc %cl - jz 1b + rol $1, %esi + jmp 1b /* size is now in esi */ /* %ecx has setting for register */ +1: + ror $1, %esi rol $20, %ecx /* set 4 banks. */ orb $1, %cl @@ -69,11 +134,11 @@ sizeram: * Just set 4-bank mode, and set non-zero numbers into a few places. * if the byte at 0 changes, you have two banks. Trivial. */ - movb $0, (%edi) - movb $1, 0x1000 - movb $1, 0x2000 - movb $1, 0x4000 - cmpb $0, (%edi) + movb $0, 0 + movb $5, 0x1000 + movb $6, 0x2000 + movb $7, 0x4000 + cmpb $0, 0 jz 1f /* only one bank */ orl $80000, %ecx 1: @@ -109,7 +174,8 @@ pci_read_dword: inl %dx, %eax mov %eax, %ecx RETSP - .org 0x01f0 + + .org 0xfe1f0 reset_vector: .byte 0xea # jmp to fe00:0000, where IPL .word 0x0000, DOC_WIN_SEG # starts in DoC @@ -117,4 +183,5 @@ reset_vector: spl_vector: .byte 0xea # jmp to 8000:0000, where SPL .word 0x0000, SPL_RAM_SEG # (LinuxBIOS) starts in RAM +pad: .byte 0, 0, 0, 0, 0, 0