Index: arch/parisc/kernel/drivers.c =================================================================== RCS file: /var/cvs/linux/arch/parisc/kernel/drivers.c,v retrieving revision 1.37 diff -u -p -r1.37 drivers.c --- arch/parisc/kernel/drivers.c 2002/01/26 21:17:09 1.37 +++ arch/parisc/kernel/drivers.c 2002/01/28 04:50:43 @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -193,10 +194,22 @@ static struct parisc_device *find_device return NULL; } +struct parisc_device *find_pa_parent_type(struct parisc_device *dev, int type) +{ + do { + dev = dev->parent; + if (dev->id.hw_type == type) + return dev; + } while (dev != &root); + + return NULL; +} + static void get_node_path(struct parisc_device *dev, struct hardware_path *path) { int i = 5; + path->mod = dev->hw_path; memset(&path->bc, -1, 6); while (dev != &root) { path->bc[i--] = dev->hw_path; @@ -204,23 +217,80 @@ get_node_path(struct parisc_device *dev, } } -/* print_hwpath - Returns hardware path for PA devices +static char *print_hwpath(struct hardware_path *path, char *output) +{ + int i; + for (i = 0; i < 6; i++) { + if (path->bc[i] == -1) + continue; + output += sprintf(output, "%d/", path->bc[i]); + } + output += sprintf(output, "%d", path->mod); + return output; +} + +/** + * print_pa_hwpath - Returns hardware path for PA devices * dev: The device to return the path for * output: Pointer to a previously-allocated array to place the path in. + * + * This function fills in the output array with a human-readable path + * to a PA device. This string is compatible with that used by PDC, and + * may be printed on the outside of the box. */ -char *print_hwpath(struct parisc_device *dev, char *output) +char *print_pa_hwpath(struct parisc_device *dev, char *output) { - int i; struct hardware_path path; - get_node_path(dev->parent, &path); - for (i = 0; i < 6; i++) { - if (path.bc[i] == -1) - continue; - output += sprintf(output, "%d/", path.bc[i]); + get_node_path(dev, &path); + return print_hwpath(&path, output); +} + +/** + * get_pci_node_path - Returns hardware path for PCI devices + * dev: The device to return the path for + * output: Pointer to a previously-allocated array to place the path in. + * + * This function fills in the hardware_path structure with the route to + * the specified PCI device. This structure is suitable for passing to + * PDC calls. + */ +void get_pci_node_path(struct pci_dev *dev, struct hardware_path *path) +{ + struct pci_bus *bus; + const struct parisc_device *padev; + int i = 5; + + memset(&path->bc, -1, 6); + path->mod = PCI_FUNC(dev->devfn); + path->bc[i--] = PCI_SLOT(dev->devfn); + for (bus = dev->bus; bus->parent; bus = bus->parent) { + unsigned int devfn = bus->self->devfn; + path->bc[i--] = PCI_SLOT(devfn) | (PCI_FUNC(devfn) << 5); } - output += sprintf(output, "%d", dev->hw_path); - return output; + + padev = HBA_DATA(bus->sysdata)->dev; + while (padev != &root) { + path->bc[i--] = padev->hw_path; + padev = padev->parent; + } +} + +/** + * print_pci_hwpath - Returns hardware path for PCI devices + * dev: The device to return the path for + * output: Pointer to a previously-allocated array to place the path in. + * + * This function fills in the output array with a human-readable path + * to a PCI device. This string is compatible with that used by PDC, and + * may be printed on the outside of the box. + */ +char *print_pci_hwpath(struct pci_dev *dev, char *output) +{ + struct hardware_path path; + + get_pci_node_path(dev, &path); + return print_hwpath(&path, output); } struct parisc_device * create_tree_node(char id, struct parisc_device *parent, @@ -300,7 +370,7 @@ alloc_pa_dev(unsigned long hpa, struct h dev = find_parisc_device(mod_path); if (dev->id.hw_type != HPHW_FAULTY) { char p[64]; - print_hwpath(dev, p); + print_pa_hwpath(dev, p); printk("Two devices have hardware path %s. Please file a bug with HP.\n" "In the meantime, you could try rearranging your cards.\n", p); return NULL; @@ -450,7 +520,7 @@ static void print_parisc_device(struct p char hw_path[64]; static int count; - print_hwpath(dev, hw_path); + print_pa_hwpath(dev, hw_path); printk(KERN_INFO "%d. %s (%d) at 0x%lx [%s], versions 0x%x, 0x%x, 0x%x", ++count, dev->name, dev->id.hw_type, dev->hpa, hw_path, dev->id.hversion, dev->id.hversion_rev, dev->id.sversion); Index: arch/parisc/kernel/pci.c =================================================================== RCS file: /var/cvs/linux/arch/parisc/kernel/pci.c,v retrieving revision 1.33 diff -u -p -r1.33 pci.c --- arch/parisc/kernel/pci.c 2002/01/26 21:18:05 1.33 +++ arch/parisc/kernel/pci.c 2002/01/28 04:50:43 @@ -14,14 +14,11 @@ #include #include /* for __init and __devinit */ #include -#include -#include /* for memcpy() */ #include #include #include #include /* for L1_CACHE_BYTES */ -#include /* for is_pdc_pat() macro */ #define DEBUG_RESOURCES 0 #define DEBUG_CONFIG 0 @@ -509,27 +495,4 @@ void pcibios_register_hba(struct pci_hba /* pci_port->in/out() uses parisc_pci_hba to lookup parameter. */ parisc_pci_hba[pci_hba_count] = hba; hba->hba_num = pci_hba_count++; -} - -/* pci_hwpath - Returns hardware path for PCI devices - * - */ -void pci_hwpath(struct pci_dev *dev, char *path) -{ - int i = 0; - unsigned char pci_path[6]; - struct pci_bus *root; - - pci_path[i++] = PCI_FUNC(dev->devfn); - pci_path[i++] = PCI_SLOT(dev->devfn); - for (root = dev->bus; root->parent; root = root->parent) { - pci_path[i++] = root->number; - if (i == 6) - break; - } - - path = print_hwpath(HBA_DATA(root->sysdata)->dev, path); - while (i > 0) { - path += sprintf (path, "/%d", pci_path[--i]); - } } Index: drivers/video/sti/sticore.c =================================================================== RCS file: /var/cvs/linux/drivers/video/sti/sticore.c,v retrieving revision 1.32 diff -u -p -r1.32 sticore.c --- drivers/video/sti/sticore.c 2002/01/26 21:19:55 1.32 +++ drivers/video/sti/sticore.c 2002/01/28 04:50:47 @@ -792,7 +802,7 @@ test_rom: i = __raw_readl(address+0x04); if (i != 1) { /* FIXME: The ROM could have multiple architecture - * dependend images (e.g. iA32, parisc,...) */ + * dependent images (e.g. i386, parisc,...) */ printk(KERN_WARNING "%s: PCI ROM is not a STI ROM type image (0x%8x)\n", __FILE__, i); @@ -896,7 +906,7 @@ static int __init sticore_pa_init(struct if (!sti) return 1; - print_hwpath (dev, pa_path); + print_pa_hwpath(dev, pa_path); sticore_check_for_default_sti (sti, pa_path); return 0; } @@ -951,7 +960,7 @@ static int __devinit sticore_pci_init(st sti = sti_try_rom_generic(rom_base, fb_base, pd); if (sti) { char pa_path[30]; - pci_hwpath(pd, pa_path); + print_pci_hwpath(pd, pa_path); sticore_check_for_default_sti(sti, pa_path); } break; Index: include/asm-parisc/hardware.h =================================================================== RCS file: /var/cvs/linux/include/asm-parisc/hardware.h,v retrieving revision 1.32 diff -u -p -r1.32 hardware.h --- include/asm-parisc/hardware.h 2002/01/26 21:16:06 1.32 +++ include/asm-parisc/hardware.h 2002/01/28 04:50:48 @@ -132,6 +132,7 @@ struct bc_module { extern const char *parisc_hardware_description(struct parisc_device_id *id); extern enum cpu_type parisc_get_cpu_type(unsigned long hversion); +struct pci_dev; /* drivers.c: */ extern struct parisc_device *alloc_pa_dev(unsigned long hpa, @@ -144,7 +145,8 @@ extern void fixup_child_irqs(struct pari int (*choose)(struct parisc_device *parent)); extern void print_subdevices(struct parisc_device *dev); extern void print_parisc_devices(void); -extern char *print_hwpath(struct parisc_device *dev, char *path); +extern char *print_pa_hwpath(struct parisc_device *dev, char *path); +extern char *print_pci_hwpath(struct pci_dev *dev, char *path); /* inventory.c: */ extern void do_memory_inventory(void); Index: include/asm-parisc/pci.h =================================================================== RCS file: /var/cvs/linux/include/asm-parisc/pci.h,v retrieving revision 1.42 diff -u -p -r1.42 pci.h --- include/asm-parisc/pci.h 2002/01/26 21:15:27 1.42 +++ include/asm-parisc/pci.h 2002/01/28 04:50:48 @@ -243,8 +243,6 @@ extern inline void pcibios_register_hba( /* Return the index of the PCI controller for device PDEV. */ #define pci_controller_num(PDEV) (0) -void pci_hwpath(struct pci_dev *dev, char *path); - #define GET_IOC(dev) ((struct ioc *)(HBA_DATA(dev->sysdata)->iommu)) #ifdef CONFIG_IOMMU_CCIO