Author: blueswirl Date: 2009-01-07 16:43:10 +0100 (Wed, 07 Jan 2009) New Revision: 362
Modified: openbios-devel/arch/ppc/build.xml openbios-devel/arch/ppc/qemu/init.c openbios-devel/arch/ppc/qemu/qemu.fs openbios-devel/arch/sparc64/tree.fs openbios-devel/drivers/ide.c openbios-devel/drivers/pci.c openbios-devel/drivers/pci.fs openbios-devel/drivers/pci_database.h openbios-devel/forth/util/pci.fs Log: Really create a tree for PCI devices (Laurent Vivier)
Modified: openbios-devel/arch/ppc/build.xml =================================================================== --- openbios-devel/arch/ppc/build.xml 2009-01-06 20:27:01 UTC (rev 361) +++ openbios-devel/arch/ppc/build.xml 2009-01-07 15:43:10 UTC (rev 362) @@ -142,7 +142,6 @@ <external-object source="target/arch/ppc/qemu/kernel.o"/> <object source="qemu/main.c" flags="-Iarch/ppc"/> <object source="qemu/methods.c" flags="-Iarch/ppc"/> - <object source="qemu/tree.c" flags="-Iarch/ppc"/> <object source="qemu/vfd.c" flags="-Iarch/ppc"/> <object source="qemu/console.c" flags="-Iarch/ppc"/> </library>
Modified: openbios-devel/arch/ppc/qemu/init.c =================================================================== --- openbios-devel/arch/ppc/qemu/init.c 2009-01-06 20:27:01 UTC (rev 361) +++ openbios-devel/arch/ppc/qemu/init.c 2009-01-07 15:43:10 UTC (rev 362) @@ -427,18 +427,6 @@ const struct cpudef *cpu; char buf[64];
- devtree_init(); - - /* ISA BASE */ - - push_str("/"); - fword("find-device"); - - PUSH(isa_io_base); - fword("encode-int"); - push_str("isa-io-base"); - fword("property"); - /* memory info */
push_str("/memory");
Modified: openbios-devel/arch/ppc/qemu/qemu.fs =================================================================== --- openbios-devel/arch/ppc/qemu/qemu.fs 2009-01-06 20:27:01 UTC (rev 361) +++ openbios-devel/arch/ppc/qemu/qemu.fs 2009-01-07 15:43:10 UTC (rev 362) @@ -44,51 +44,6 @@ ; SYSTEM-initializer
-\ ------------------------------------------------------------------------- -\ device tree fixing -\ ------------------------------------------------------------------------- - -\ add decode-address methods -: (make-decodable) ( phandle -- ) - - dup " #address-cells" rot get-package-property 0= if - decode-int nip nip - over " decode-unit" rot find-method if 2drop else - ( save phandle ncells ) - - over active-package! - case - 1 of ['] parse-hex " decode-unit" is-xt-func endof - 3 of - " bus-range" active-package get-package-property 0= if - decode-int nip nip - ['] encode-unit-pci " encode-unit" is-xt-func - " decode-unit" is-func-begin - ['] (lit) , , - ['] decode-unit-pci-bus , - is-func-end - then - endof - endcase - then - then - drop -; - -: init-qemu-tree ( -- ) - active-package - - iterate-tree-begin - begin ?dup while - - dup (make-decodable) - - iterate-tree - repeat - - active-package! -; - \ use the tty interface if available : activate-tty-interface " /packages/terminal-emulator" find-dev if drop
Modified: openbios-devel/arch/sparc64/tree.fs =================================================================== --- openbios-devel/arch/sparc64/tree.fs 2009-01-06 20:27:01 UTC (rev 361) +++ openbios-devel/arch/sparc64/tree.fs 2009-01-07 15:43:10 UTC (rev 362) @@ -33,6 +33,43 @@ " /openprom" find-device " OBP 3.10.24 1999/01/01 01:01" encode-string " version" property
+device-end + +\ we only implement DD and DD,F +: encode-unit-pci ( phys.lo phy.mid phys.hi -- str len ) + nip nip ff00 and 8 >> dup 3 >> + swap 7 and + ( ddddd fff ) + + ?dup if + pocket tohexstr + " ," pocket tmpstrcat + else + 0 0 pocket tmpstrcpy + then + >r + rot pocket tohexstr r> tmpstrcat drop +; + +dev / + +\ simple pci bus node +new-device + " pci" device-name + 3 encode-int " #address-cells" property + 2 encode-int " #size-cells" property + 0 encode-int 0 encode-int encode+ " bus-range" property + " pci" encode-string " device_type" property + + external + : open ( cr ." opening PCI" cr ) true ; + : close ; + : decode-unit 0 decode-unit-pci-bus ; + : encode-unit encode-unit-pci ; +finish-device + +device-end + dev /pci
\ simple isa bus node
Modified: openbios-devel/drivers/ide.c =================================================================== --- openbios-devel/drivers/ide.c 2009-01-06 20:27:01 UTC (rev 361) +++ openbios-devel/drivers/ide.c 2009-01-07 15:43:10 UTC (rev 362) @@ -1312,7 +1312,7 @@ uint32_t io_port1, uint32_t ctl_port1) { int i, j; - char nodebuff[32]; + char nodebuff[128]; phandle_t dnode, aliases; int hd_found, cd_found;
Modified: openbios-devel/drivers/pci.c =================================================================== --- openbios-devel/drivers/pci.c 2009-01-06 20:27:01 UTC (rev 361) +++ openbios-devel/drivers/pci.c 2009-01-07 15:43:10 UTC (rev 362) @@ -40,6 +40,34 @@
const pci_arch_t *arch;
+#define IS_NOT_RELOCATABLE 0x80000000 +#define IS_PREFETCHABLE 0x40000000 +#define IS_ALIASED 0x20000000 + +enum { + CONFIGURATION_SPACE = 0, + IO_SPACE = 1, + MEMORY_SPACE_32 = 2, + MEMORY_SPACE_64 = 3, +}; + +static inline void pci_encode_phys_addr(cell *phys, int flags, int space_code, + pci_addr dev, uint8_t reg, uint64_t addr) +{ + + /* phys.hi */ + + phys[0] = flags | (space_code << 24) | dev | reg; + + /* phys.mid */ + + phys[1] = addr >> 32; + + /* phys.lo */ + + phys[2] = addr; +} + static void ob_pci_open(int *idx) { @@ -58,11 +86,82 @@ { }
+/* ( str len -- phys.lo phys.mid phys.hi ) */
+static void +ob_pci_decode_unit(int *idx) +{ + PUSH(0); + fword("decode-unit-pci-bus"); +} + +/* ( phys.lo phy.mid phys.hi -- str len ) */ + +static void +ob_pci_encode_unit(int *idx) +{ + char buf[28]; + cell hi = POP(); + cell mid = POP(); + cell lo = POP(); + int n, p, t, ss, bus, dev, fn, reg; + + n = hi & IS_NOT_RELOCATABLE; + p = hi & IS_PREFETCHABLE; + t = hi & IS_ALIASED; + ss = (hi >> 24) && 0x03; + + bus = (hi >> 16) & 0xFF; + dev = (hi >> 11) & 0x1F; + fn = (hi >> 8) & 0x07; + reg = hi & 0xFF; + + switch(ss) { + case CONFIGURATION_SPACE: + + if (fn == 0) /* DD */ + snprintf(buf, sizeof(buf), "%x", dev); + else /* DD,F */ + snprintf(buf, sizeof(buf), "%x,%d", dev, fn); + break; + + case IO_SPACE: + + /* [n]i[t]DD,F,RR,NNNNNNNN */ + snprintf(buf, sizeof(buf), "%si%s%x,%x,%x,%x", + n ? "n" : "", /* relocatable */ + t ? "t" : "", /* aliased */ + dev, fn, reg, t ? lo & 0x03FF : lo); + break; + + case MEMORY_SPACE_32: + + /* [n]m[t][p]DD,F,RR,NNNNNNNN */ + snprintf(buf, sizeof(buf), "%sm%s%s%x,%x,%x,%x", + n ? "n" : "", /* relocatable */ + t ? "t" : "", /* aliased */ + p ? "p" : "", /* prefetchable */ + dev, fn, reg, lo ); + break; + + case MEMORY_SPACE_64: + + /* [n]x[p]DD,F,RR,NNNNNNNNNNNNNNNN */ + snprintf(buf, sizeof(buf), "%sx%s%x,%x,%x,%llx", + n ? "n" : "", /* relocatable */ + p ? "p" : "", /* prefetchable */ + dev, fn, reg, ((uint64_t)mid << 32) | (uint64_t)lo ); + break; + } + push_str(buf); +} + NODE_METHODS(ob_pci_node) = { { NULL, ob_pci_initialize }, { "open", ob_pci_open }, { "close", ob_pci_close }, + { "decode-unit", ob_pci_decode_unit }, + { "encode-unit", ob_pci_encode_unit }, };
int ide_config_cb2 (const pci_config_t *config) @@ -119,16 +218,19 @@ int status,id; uint16_t vendor_id, device_id; uint8_t rev; + uint32_t class_code;
vendor_id = pci_config_read16(addr, PCI_VENDOR_ID); device_id = pci_config_read16(addr, PCI_DEVICE_ID); rev = pci_config_read8(addr, PCI_REVISION_ID); + class_code = pci_config_read16(addr, PCI_CLASS_DEVICE);
/* create properties as described in 2.5 */
set_int_property(dev, "vendor-id", vendor_id); set_int_property(dev, "device-id", device_id); set_int_property(dev, "revision-id", rev); + set_int_property(dev, "class-code", class_code << 8);
set_int_property(dev, "interrupts", pci_config_read8(addr, PCI_INTERRUPT_LINE)); @@ -173,10 +275,6 @@ if (pci_dev->compat) set_property(dev, "compatible", pci_dev->compat, pci_compat_len(pci_dev)); - push_str(pci_dev->name); - fword("encode-string"); - push_str("class"); - fword("property"); if (pci_dev->config_cb) pci_dev->config_cb(config); } @@ -310,17 +408,17 @@ }
static void ob_scan_pci_bus(int bus, unsigned long *mem_base, - unsigned long *io_base, const char *path) + unsigned long *io_base, char **path) { int devnum, fn, is_multi, vid, did; unsigned int htype; pci_addr addr; - phandle_t dnode, dbus; pci_config_t config; const pci_dev_t *pci_dev; uint32_t ccode; uint8_t class, subclass, iface, rev;
+ activate_device("/"); for (devnum = 0; devnum < 32; devnum++) { is_multi = 0; for (fn = 0; fn==0 || (is_multi && fn<8); fn++) { @@ -341,7 +439,8 @@ iface = pci_config_read8(addr, PCI_CLASS_PROG); rev = pci_config_read8(addr, PCI_REVISION_ID);
- pci_dev = pci_find_device(class, subclass, iface, vid, did); + pci_dev = pci_find_device(class, subclass, iface, + vid, did);
#ifdef CONFIG_DEBUG_PCI printk("%x:%x.%x - %x:%x - ", bus, devnum, fn, @@ -351,43 +450,41 @@ if (fn == 0) is_multi = htype & 0x80;
- activate_device(path); - - dbus=get_cur_dev(); if (pci_dev == NULL || pci_dev->name == NULL) snprintf(config.path, sizeof(config.path), - "%s/pci%x,%x", path, vid, did); + "%s/pci%x,%x", *path, vid, did); else snprintf(config.path, sizeof(config.path), - "%s/%s", path, pci_dev->name); + "%s/%s", *path, pci_dev->name); #ifdef CONFIG_DEBUG_PCI printk("%s - ", config.path); #endif + config.dev = addr & 0x00FFFFFF; + REGISTER_NAMED_NODE(ob_pci_node, config.path); - dnode=find_dev(config.path); - activate_dev( dnode ); + + activate_device(config.path); + ob_pci_configure(addr, &config, mem_base, io_base); -{ - int irq_pin, irq_line; - static const uint8_t heathrow_pci_irqs[4] = { 0x15, 0x16, 0x17, 0x18 }; - irq_pin = pci_config_read8(addr, PCI_INTERRUPT_PIN); - if (irq_pin > 0) { - irq_pin = (devnum + irq_pin - 1) & 3; - irq_line = heathrow_pci_irqs[irq_pin]; - } -} ob_pci_add_properties(addr, pci_dev, &config); ob_pci_add_reg(addr); - device_end();
+ if (ccode == 0x0600 || ccode == 0x0604) { + /* host or bridge */ + free(*path); + *path = strdup(config.path); + } + } } + device_end(); }
int ob_pci_init(void) { int bus; unsigned long mem_base, io_base; + char *path;
#ifdef CONFIG_DEBUG_PCI printk("Initializing PCI devices...\n"); @@ -399,8 +496,10 @@
mem_base = arch->mem_base; io_base = arch->io_base; + path = strdup(""); for (bus = 0; bus<0x100; bus++) { - ob_scan_pci_bus(bus, &mem_base, &io_base, "/pci"); + ob_scan_pci_bus(bus, &mem_base, &io_base, &path); } + free(path); return 0; }
Modified: openbios-devel/drivers/pci.fs =================================================================== --- openbios-devel/drivers/pci.fs 2009-01-06 20:27:01 UTC (rev 361) +++ openbios-devel/drivers/pci.fs 2009-01-07 15:43:10 UTC (rev 362) @@ -1,24 +1,5 @@ [IFDEF] CONFIG_DRIVER_PCI
-dev / - -\ simple pci bus node -new-device - " pci" device-name - 3 encode-int " #address-cells" property - 2 encode-int " #size-cells" property - 0 encode-int 0 encode-int encode+ " bus-range" property - " pci" encode-string " device_type" property - - external - : open ( cr ." opening PCI" cr ) true ; - : close ; - : decode-unit 0 decode-unit-pci-bus ; - : encode-unit encode-unit-pci ; -finish-device - -device-end - : pci-addr-encode ( addr.lo addr.mi addr.hi ) rot >r swap >r encode-int @@ -31,6 +12,4 @@ rot encode-int encode+ ;
- - [THEN]
Modified: openbios-devel/drivers/pci_database.h =================================================================== --- openbios-devel/drivers/pci_database.h 2009-01-06 20:27:01 UTC (rev 361) +++ openbios-devel/drivers/pci_database.h 2009-01-07 15:43:10 UTC (rev 362) @@ -2,6 +2,7 @@
struct pci_config_t { char path[256]; + uint32_t dev; /* bus, dev, fn */ uint32_t regions[7]; uint32_t sizes[7]; };
Modified: openbios-devel/forth/util/pci.fs =================================================================== --- openbios-devel/forth/util/pci.fs 2009-01-06 20:27:01 UTC (rev 361) +++ openbios-devel/forth/util/pci.fs 2009-01-07 15:43:10 UTC (rev 362) @@ -93,27 +93,6 @@
\ only forth
- -\ ------------------------------------------------------------------------- -\ PCI encode/decode unit -\ ------------------------------------------------------------------------- - -\ we only implement DD and DD,F -: encode-unit-pci ( phys.lo phy.mid phys.hi -- str len ) - nip nip ff00 and 8 >> dup 3 >> - swap 7 and - ( ddddd fff ) - - ?dup if - pocket tohexstr - " ," pocket tmpstrcat - else - 0 0 pocket tmpstrcpy - then - >r - rot pocket tohexstr r> tmpstrcat drop -; - : decode-unit-pci-bus ( str len bus -- phys.lo phys.mid phys.hi ) -rot ascii , left-split ( addr-R len-R addr-L len-L )