diff --git a/arch/ppc/briq/init.c b/arch/ppc/briq/init.c index 6c63114..9c87e32 100644 --- a/arch/ppc/briq/init.c +++ b/arch/ppc/briq/init.c @@ -53,9 +53,13 @@ unexpected_excep( int vector ) ; } +uint32_t isa_io_base; + void entry( void ) { + isa_io_base = 0x80000000; + printk("\n"); printk("=============================================================\n"); printk("OpenBIOS %s [%s]\n", OPENBIOS_RELEASE, OPENBIOS_BUILD_DATE ); diff --git a/arch/ppc/mol/init.c b/arch/ppc/mol/init.c index ee8534c..581c433 100644 --- a/arch/ppc/mol/init.c +++ b/arch/ppc/mol/init.c @@ -48,9 +48,13 @@ unexpected_excep( int vector ) ; } +uint32_t isa_io_base; + void entry( void ) { + isa_io_base = 0x80000000; + printk("\n"); printk("=============================================================\n"); printk("OpenBIOS %s [%s]\n", OPENBIOS_RELEASE, OPENBIOS_BUILD_DATE ); diff --git a/arch/ppc/pearpc/init.c b/arch/ppc/pearpc/init.c index b8ca34c..4483949 100644 --- a/arch/ppc/pearpc/init.c +++ b/arch/ppc/pearpc/init.c @@ -56,9 +56,13 @@ unexpected_excep( int vector ) ; } +uint32_t isa_io_base; + void entry( void ) { + isa_io_base = 0x80000000; + printk("\n"); printk("=============================================================\n"); printk("OpenBIOS %s [%s]\n", OPENBIOS_RELEASE, OPENBIOS_BUILD_DATE ); diff --git a/arch/ppc/qemu/init.c b/arch/ppc/qemu/init.c index 8885297..2e28f72 100644 --- a/arch/ppc/qemu/init.c +++ b/arch/ppc/qemu/init.c @@ -22,6 +22,7 @@ #include "openbios/config.h" #include "openbios/bindings.h" +#include "openbios/pci.h" #include "openbios/nvram.h" #include "qemu/qemu.h" #include "ofmem.h" @@ -33,21 +34,6 @@ extern void ob_pci_init( void ); extern void ob_adb_init( void ); extern void setup_timers( void ); -#if 0 -int -get_bool_res( const char *res ) -{ - char buf[8], *p; - - p = BootHGetStrRes( res, buf, sizeof(buf) ); - if( !p ) - return -1; - if( !strcasecmp(p,"true") || !strcasecmp(p,"yes") || !strcasecmp(p,"1") ) - return 1; - return 0; -} -#endif - void unexpected_excep( int vector ) { @@ -56,9 +42,34 @@ unexpected_excep( int vector ) ; } +enum { + ARCH_PREP = 0, + ARCH_MAC99, + ARCH_HEATHROW, +}; + +pci_arch_t known_arch[] = { + [ARCH_PREP] = { "PREP", 0x1057, 0x4801, 0x80800000, 0x800c0000, + 0x80000000, 0x00100000, 0xf0000000, 0x10000000, + 0x80000000, 0x00010000, 0x00000000, 0x00400000, + }, + [ARCH_MAC99] = { "MAC99", 0x106b, 0x001F, 0xf2800000, 0xf2c00000, + 0xf2000000, 0x02000000, 0x80000000, 0x10000000, + 0xf2000000, 0x00800000, 0x00000000, 0x01000000, + }, + [ARCH_HEATHROW] = { "HEATHROW", 0x1057, 0x0002, 0xfec00000, 0xfee00000, + 0x80000000, 0x7f000000, 0x80000000, 0x01000000, + 0xfe000000, 0x00800000, 0xfd000000, 0x01000000, + }, +}; +pci_arch_t *arch; +uint32_t isa_io_base; + void entry( void ) { + arch = &known_arch[ARCH_HEATHROW]; + isa_io_base = arch->io_base; printk("\n"); printk("=============================================================\n"); printk("OpenBIOS %s [%s]\n", OPENBIOS_RELEASE, OPENBIOS_BUILD_DATE ); @@ -115,10 +126,9 @@ arch_of_init( void ) set_property( ph, "rtas-size", (char*)&size, sizeof(size) ); } #endif - #if 0 /* tweak boot settings */ - autoboot = !!get_bool_res("autoboot"); + autoboot = !!getbool("autoboot?"); #endif autoboot = 0; if( !autoboot ) @@ -127,7 +137,7 @@ arch_of_init( void ) setenv("boot-command", "qemuboot"); #if 0 - if( get_bool_res("tty-interface") == 1 ) + if( getbool("tty-interface?") == 1 ) #endif fword("activate-tty-interface"); diff --git a/include/openbios/pci.h b/include/openbios/pci.h new file mode 100644 index 0000000..af5d592 --- /dev/null +++ b/include/openbios/pci.h @@ -0,0 +1,22 @@ +#ifndef _H_PCI +#define _H_PCI + +typedef struct pci_arch_t pci_arch_t; + +struct pci_arch_t { + char * name; + uint16_t vendor_id; + uint16_t device_id; + uint32_t cfg_addr; + uint32_t cfg_data; + uint32_t cfg_base; + uint32_t cfg_len; + uint32_t mem_base; + uint32_t mem_len; + uint32_t io_base; + uint32_t io_len; + uint32_t rbase; + uint32_t rlen; +}; + +#endif /* _H_PCI */ diff --git a/include/ppc/io.h b/include/ppc/io.h index 68a3722..aaa070a 100644 --- a/include/ppc/io.h +++ b/include/ppc/io.h @@ -10,9 +10,7 @@ extern unsigned long virt_offset; #ifndef BOOTSTRAP -#ifndef _IO_BASE -#define _IO_BASE 0x80000000 -#endif +extern uint32_t isa_io_base; /* * The insw/outsw/insl/outsl macros don't do byte-swapping. @@ -20,15 +18,15 @@ extern unsigned long virt_offset; * are arrays of bytes, and byte-swapping is not appropriate in * that case. - paulus */ -#define insw(port, buf, ns) _insw_ns((uint16_t *)((port)+_IO_BASE), (buf), (ns)) -#define outsw(port, buf, ns) _outsw_ns((uint16_t *)((port)+_IO_BASE), (buf), (ns)) +#define insw(port, buf, ns) _insw((uint16_t *)((port)+isa_io_base), (buf), (ns)) +#define outsw(port, buf, ns) _outsw((uint16_t *)((port)+isa_io_base), (buf), (ns)) -#define inb(port) in_8((uint8_t *)((port)+_IO_BASE)) -#define outb(val, port) out_8((uint8_t *)((port)+_IO_BASE), (val)) -#define inw(port) in_le16((uint16_t *)((port)+_IO_BASE)) -#define outw(val, port) out_le16((uint16_t *)((port)+_IO_BASE), (val)) -#define inl(port) in_le32((uint32_t *)((port)+_IO_BASE)) -#define outl(val, port) out_le32((uint32_t *)((port)+_IO_BASE), (val)) +#define inb(port) in_8((uint8_t *)((port)+isa_io_base)) +#define outb(val, port) out_8((uint8_t *)((port)+isa_io_base), (val)) +#define inw(port) in_le16((uint16_t *)((port)+isa_io_base)) +#define outw(val, port) out_le16((uint16_t *)((port)+isa_io_base), (val)) +#define inl(port) in_le32((uint32_t *)((port)+isa_io_base)) +#define outl(val, port) out_le32((uint32_t *)((port)+isa_io_base), (val)) /* * 8, 16 and 32 bit, big and little endian I/O operations, with barrier. diff --git a/kernel/forth.c b/kernel/forth.c index 0b1bbd2..49a4d5f 100644 --- a/kernel/forth.c +++ b/kernel/forth.c @@ -6,6 +6,7 @@ * the copyright and warranty status of this work. */ +extern uint32_t isa_io_base; /* * dup ( x -- x x )