* pci_request_regions() failure @ 2010-09-06 12:52 Ravi Gupta 2010-09-07 5:25 ` tiejun.chen 0 siblings, 1 reply; 10+ messages in thread From: Ravi Gupta @ 2010-09-06 12:52 UTC (permalink / raw) To: linuxppc-dev [-- Attachment #1: Type: text/plain, Size: 4100 bytes --] Hi, I am facing a problem while requesting pci resource. I have some data that I am hopeful will help address the issue. I am currently running on a MPC837xERDB board(powerpc) with a 2.6.35 kernel. The problem is that whenever I insert the card (LatticeECP2M PCI Express Development Kit<http://www.latticesemi.com/products/developmenthardware/developmentkits/pciexpressdevkitecp2m/index.cfm>) in pci-express slot 0 and try to load my driver module, I get a pci_request_regions() failure(error -EBUSY). The interesting thing is the region that it fails for. According to /proc/iomem, slot0 has a8000000-b7ffffff as its memory ranges. However, the memory region requested by my device is a8000000-a803ffff and a8040000-a807ffff which falls in the slot0 range. But after boot up when I look at /proc/iomem, there is a already allocated resource range present there, which overlaps with the range refined in my device, hence the pci_request_regions() fails. Output of lspci 0000:00:00.0 Power PC: Freescale Semiconductor Inc Unknown device 00c6 (rev 21) 0001:01:00.0 PCI bridge: Freescale Semiconductor Inc Unknown device 00c6 (rev 21) 0001:02:00.0 Non-VGA unclassified device: Lattice Semiconductor Corporation Unknown device e250 ---> My device Contents of /pro/iomem file # cat /proc/iomem 80000000-8fffffff : /pci@e0008500 90000000-9fffffff : /pci@e0008500 a8000000-b7ffffff : /pcie@e0009000 a8000000-a80fffff : PCI Bus 0001:02 ---> colprit range c8000000-d7ffffff : /pcie@e000a000 e0004500-e0004507 : serial e0004600-e0004607 : serial e0023000-e0023fff : usb Now my doubt is, who is allocating this range and why? It seem to me a kernel bug as I also tried my device on i386 machine(opensuse, linux 2.6.35 i.e the same kernel version on powerpc board) and there everything works fine. I don't know where to start to fix it. Please suggest. Output of lspci scooby:~ # lspci 00:00.0 Host bridge: Intel Corporation 82G33/G31/P35/P31 Express DRAM Controller (rev 10) 00:01.0 PCI bridge: Intel Corporation 82G33/G31/P35/P31 Express PCI Express Root Port (rev 10) 00:02.0 VGA compatible controller: Intel Corporation 82G33/G31 Express Integrated Graphics Controller (rev 10) 00:1b.0 Audio device: Intel Corporation 82801G (ICH7 Family) High Definition Audio Controller (rev 01) 00:1c.0 PCI bridge: Intel Corporation 82801G (ICH7 Family) PCI Express Port 1 (rev 01) 00:1c.1 PCI bridge: Intel Corporation 82801G (ICH7 Family) PCI Express Port 2 (rev 01) 00:1c.2 PCI bridge: Intel Corporation 82801G (ICH7 Family) PCI Express Port 3 (rev 01) 00:1d.0 USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI Controller #1 (rev 01) 00:1d.1 USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI Controller #2 (rev 01) 00:1d.2 USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI Controller #3 (rev 01) 00:1d.3 USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI Controller #4 (rev 01) 00:1d.7 USB Controller: Intel Corporation 82801G (ICH7 Family) USB2 EHCI Controller (rev 01) 00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev e1) 00:1f.0 ISA bridge: Intel Corporation 82801GB/GR (ICH7 Family) LPC Interface Bridge (rev 01) 00:1f.1 IDE interface: Intel Corporation 82801G (ICH7 Family) IDE Controller (rev 01) 00:1f.2 IDE interface: Intel Corporation 82801GB/GR/GH (ICH7 Family) SATA IDE Controller (rev 01) 00:1f.3 SMBus: Intel Corporation 82801G (ICH7 Family) SMBus Controller (rev 01) 03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 01) 04:00.0 Non-VGA unclassified device: Lattice Semiconductor Corporation Device e250 ----------> My device 05:06.0 Serial controller: Device 4348:3253 (rev 10) Contents of /proc/iomem on i386 machine cat /proc/iomem . . . fe900000-fe9fffff : PCI Bus 0000:04 fe900000-fe93ffff : 0000:04:00.0 ------------->My device fe940000-fe97ffff : 0000:04:00.0 ------------->My device fea00000-feafffff : PCI Bus 0000:03 fea00000-fea1ffff : 0000:03:00.0 fea20000-fea20fff : 0000:03:00.0 fea20000-fea20fff : r8169 . . . Regards, Ravi [-- Attachment #2: Type: text/html, Size: 4529 bytes --] ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: pci_request_regions() failure 2010-09-06 12:52 pci_request_regions() failure Ravi Gupta @ 2010-09-07 5:25 ` tiejun.chen 2010-09-07 7:20 ` Ravi Gupta 0 siblings, 1 reply; 10+ messages in thread From: tiejun.chen @ 2010-09-07 5:25 UTC (permalink / raw) To: Ravi Gupta; +Cc: linuxppc-dev Ravi Gupta wrote: > Hi, > > I am facing a problem while requesting pci resource. I have some data that I > am hopeful will help address the issue. > > I am currently running on a MPC837xERDB board(powerpc) with a 2.6.35 kernel. > The problem is that whenever I insert the card (LatticeECP2M PCI Express > Development Kit<http://www.latticesemi.com/products/developmenthardware/developmentkits/pciexpressdevkitecp2m/index.cfm>) > in pci-express slot 0 and try to load my driver module, I get a > pci_request_regions() failure(error -EBUSY). The interesting thing is the > region that it fails for. According to /proc/iomem, slot0 has > a8000000-b7ffffff as its memory ranges. However, the memory region requested > by my device is a8000000-a803ffff and a8040000-a807ffff which falls in the > slot0 range. But after boot up when I look at /proc/iomem, there is a > already allocated resource range present there, which overlaps with the > range refined in my device, hence the pci_request_regions() fails. > > Output of lspci > 0000:00:00.0 Power PC: Freescale Semiconductor Inc Unknown device 00c6 (rev > 21) > 0001:01:00.0 PCI bridge: Freescale Semiconductor Inc Unknown device 00c6 > (rev 21) > 0001:02:00.0 Non-VGA unclassified device: Lattice Semiconductor Corporation > Unknown device e250 ---> My device > > Contents of /pro/iomem file > # cat /proc/iomem > 80000000-8fffffff : /pci@e0008500 > 90000000-9fffffff : /pci@e0008500 > a8000000-b7ffffff : /pcie@e0009000 > a8000000-a80fffff : PCI Bus 0001:02 ---> colprit range > c8000000-d7ffffff : /pcie@e000a000 > e0004500-e0004507 : serial > e0004600-e0004607 : serial > e0023000-e0023fff : usb > > Now my doubt is, who is allocating this range and why? It seem to me a I think the kernel don't allocate the used PCI range to another PCI device. So you can enable CONFIG_PCI_DEBUG then execute 'dmesg' to get more information. Before you don't load your module the kernel still can probe the plugged PCI device and allocate/reserve appropriate PCI range for your device. Then you can acquire the proper PCI IO/MEM range from there when loading device module. This process should be transparent for the PCI device driver so I think this is correct by '/proc/iomem'. You can refer the following example on one PPC target. Boot without enabling the given PCI device, e1000e. ------ c00000000-c1fffffff : /pcie@ffe200000 c00000000-c1fffffff : PCI Bus 0000:01 c00000000-c0001ffff : 0000:01:00.0 c00020000-c0003ffff : 0000:01:00.0 Boot with enable e1000e PCI device. ------ c00000000-c1fffffff : /pcie@ffe200000 c00000000-c1fffffff : PCI Bus 0000:01 c00000000-c0001ffff : 0000:01:00.0 c00000000-c0001ffff : e1000e c00020000-c0003ffff : 0000:01:00.0 c00020000-c0003ffff : e1000e So I think you can build your driver into the kernel to try again, or maybe you should check your driver codes. Especially I want to know how/where you get these two range, a8000000-a803ffff and a8040000-a807ffff. You wired them firstly on the driver or allocated by the kernel? Best Regards Tiejun > kernel bug as I also tried my device on i386 machine(opensuse, linux 2.6.35 > i.e the same kernel version on powerpc board) and there everything works > fine. I don't know where to start to fix it. Please suggest. > > Output of lspci > > scooby:~ # lspci > 00:00.0 Host bridge: Intel Corporation 82G33/G31/P35/P31 Express DRAM > Controller (rev 10) > 00:01.0 PCI bridge: Intel Corporation 82G33/G31/P35/P31 Express PCI Express > Root Port (rev 10) > 00:02.0 VGA compatible controller: Intel Corporation 82G33/G31 Express > Integrated Graphics Controller (rev 10) > 00:1b.0 Audio device: Intel Corporation 82801G (ICH7 Family) High Definition > Audio Controller (rev 01) > 00:1c.0 PCI bridge: Intel Corporation 82801G (ICH7 Family) PCI Express Port > 1 (rev 01) > 00:1c.1 PCI bridge: Intel Corporation 82801G (ICH7 Family) PCI Express Port > 2 (rev 01) > 00:1c.2 PCI bridge: Intel Corporation 82801G (ICH7 Family) PCI Express Port > 3 (rev 01) > 00:1d.0 USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI > Controller #1 (rev 01) > 00:1d.1 USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI > Controller #2 (rev 01) > 00:1d.2 USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI > Controller #3 (rev 01) > 00:1d.3 USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI > Controller #4 (rev 01) > 00:1d.7 USB Controller: Intel Corporation 82801G (ICH7 Family) USB2 EHCI > Controller (rev 01) > 00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev e1) > 00:1f.0 ISA bridge: Intel Corporation 82801GB/GR (ICH7 Family) LPC Interface > Bridge (rev 01) > 00:1f.1 IDE interface: Intel Corporation 82801G (ICH7 Family) IDE Controller > (rev 01) > 00:1f.2 IDE interface: Intel Corporation 82801GB/GR/GH (ICH7 Family) SATA > IDE Controller (rev 01) > 00:1f.3 SMBus: Intel Corporation 82801G (ICH7 Family) SMBus Controller (rev > 01) > 03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B > PCI Express Gigabit Ethernet controller (rev 01) > 04:00.0 Non-VGA unclassified device: Lattice Semiconductor Corporation > Device e250 ----------> My device > 05:06.0 Serial controller: Device 4348:3253 (rev 10) > > Contents of /proc/iomem on i386 machine > > cat /proc/iomem > . > . > . > fe900000-fe9fffff : PCI Bus 0000:04 > fe900000-fe93ffff : 0000:04:00.0 ------------->My device > fe940000-fe97ffff : 0000:04:00.0 ------------->My device > fea00000-feafffff : PCI Bus 0000:03 > fea00000-fea1ffff : 0000:03:00.0 > fea20000-fea20fff : 0000:03:00.0 > fea20000-fea20fff : r8169 > . > . > . > > Regards, > > Ravi > > > > ------------------------------------------------------------------------ > > _______________________________________________ > Linuxppc-dev mailing list > Linuxppc-dev@lists.ozlabs.org > https://lists.ozlabs.org/listinfo/linuxppc-dev ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: pci_request_regions() failure 2010-09-07 5:25 ` tiejun.chen @ 2010-09-07 7:20 ` Ravi Gupta 2010-09-07 9:24 ` tiejun.chen 0 siblings, 1 reply; 10+ messages in thread From: Ravi Gupta @ 2010-09-07 7:20 UTC (permalink / raw) To: tiejun.chen; +Cc: linuxppc-dev [-- Attachment #1.1: Type: text/plain, Size: 17006 bytes --] Hi Tiejun, Thanks for the reply. I am sending you the updated dmesg O/P(after enabling CONFIG_PCI_DEBUG) as attachment as well as at the end of the mail. As far as driver is concern, I am trying the pci_skel driver available as example with LDD book with slight modifications. Driver Code: ================================================================ #include <linux/kernel.h> #include <linux/module.h> #include <linux/pci.h> /* PCI IDs */ static struct pci_device_id ids[] = { { PCI_DEVICE(0x1204, 0xe250) }, { 0, } }; MODULE_DEVICE_TABLE(pci, ids); static unsigned char skel_get_revision(struct pci_dev *dev) { u8 revision; pci_read_config_byte(dev, PCI_REVISION_ID, &revision); return revision; } static u16 skel_get_vendor_id(struct pci_dev *dev) { u16 vendor_id; pci_read_config_word(dev, PCI_VENDOR_ID, &vendor_id); return vendor_id; } static u16 skel_get_device_id(struct pci_dev *dev) { u16 device_id; pci_read_config_word(dev, PCI_DEVICE_ID, &device_id); return device_id; } static int probe(struct pci_dev *dev, const struct pci_device_id *id) { /* Do probing type stuff here. * Like calling request_region(); */ int err, i; printk(KERN_ALERT "PCI driver: Probe function\n"); /* * Enable the bus-master bit values. * Some PCI BIOSes fail to set the master-enable bit. * Some demos support being an initiator, so need bus master ability. */ err = pci_request_regions(dev, "pci_skell"); if (err) { printk(KERN_ERR "request region failed :%d\n", err); return err; } pci_set_master(dev); if ((err = pci_enable_device(dev)) != 0) { printk(KERN_ERR "Unable to Enable PCI device:%d\n", err); return err; } printk(KERN_ALERT "PCI driver Vendor ID = %x\n", skel_get_vendor_id(dev)); printk(KERN_ALERT "PCI driver Device ID = %x\n", skel_get_device_id(dev)); printk(KERN_ALERT "PCI driver Revision = %d\n", skel_get_revision(dev)); return 0; } static void remove(struct pci_dev *dev) { /* clean up any allocated resources and stuff here. * like call release_region(); */ } static struct pci_driver pci_driver = { .name = "pci_skel", .id_table = ids, .probe = probe, .remove = remove, }; static int __init pci_skel_init(void) { printk(KERN_ALERT "PCI driver: Init function\n"); return pci_register_driver(&pci_driver); } static void __exit pci_skel_exit(void) { printk(KERN_ALERT "PCI driver: Exit function\n"); pci_unregister_driver(&pci_driver); } MODULE_LICENSE("GPL"); module_init(pci_skel_init); module_exit(pci_skel_exit); ================================================================ The above code fails at the pci_request_regions(dev, "pci_skell"); call, with -EBUSY(-16) i.e resource busy error. If I don't request for resources and directly enable the pci device by calling pci_device_enable(), it gives the error message PCI driver: Init function PCI driver: Probe function pci_skel 0001:02:00.0: device not available (can't reserve [mem 0x00000000-0x0003ffff]) Unable to Enable PCI device:-22 pci_skel: probe of 0001:02:00.0 failed with error -22 > Especially I want to know how/where you get > these two range, a8000000-a803ffff and a8040000-a807ffff. You wired them firstly > on the driver or allocated by the kernel? Actually as I said before, I tried my device on i386 machine and there I got two ranges fe900000-fe93ffff and fe940000-fe97ffff, so from there I am guessing that on PowerPC also, it should allocate two ranges a8000000-a803ffff and a8040000-a807ffff resp. lspci output ================================================================ 0000:00:00.0 Power PC: Freescale Semiconductor Inc Unknown device 00c6 (rev 21) 0001:01:00.0 PCI bridge: Freescale Semiconductor Inc Unknown device 00c6 (rev 21) 0001:02:00.0 Non-VGA unclassified device: Lattice Semiconductor Corporation Unknown device e250 ----------> My device ================================================================ Dmesg with CONFIG_PCI_DEBUG enable. ================================================================ Using MPC837x RDB/WLAN machine description Initializing cgroup subsys cpuset Initializing cgroup subsys cpu Linux version 2.6.35 (okapi@okapi) (gcc version 4.2.3 (Sourcery G++ Lite 4.2-171)) #13 Tue Sep 7 11:37:47 IST 2010 Found initrd at 0xcf46d000:0xcf7b15b7 Found legacy serial port 0 for /immr@e0000000/serial@4500 mem=e0004500, taddr=e0004500, irq=0, clk=399999996, speed=0 Found legacy serial port 1 for /immr@e0000000/serial@4600 mem=e0004600, taddr=e0004600, irq=0, clk=399999996, speed=0 bootconsole [udbg0] enabled Found FSL PCI host bridge at 0x00000000e0008500. Firmware bus number: 0->0 PCI host bridge /pci@e0008500 (primary) ranges: MEM 0x0000000090000000..0x000000009fffffff -> 0x0000000090000000 MEM 0x0000000080000000..0x000000008fffffff -> 0x0000000080000000 Prefetch IO 0x00000000e0300000..0x00000000e03fffff -> 0x0000000000000000 No pci config register base in dev tree, using default Found FSL PCI host bridge at 0x00000000e0009000. Firmware bus number: 0->255 PCI host bridge /pcie@e0009000 ranges: MEM 0x00000000a8000000..0x00000000b7ffffff -> 0x00000000a8000000 IO 0x00000000b8000000..0x00000000b87fffff -> 0x0000000000000000 No pci config register base in dev tree, using default Found FSL PCI host bridge at 0x00000000e000a000. Firmware bus number: 0->255 PCI host bridge /pcie@e000a000 ranges: MEM 0x00000000c8000000..0x00000000d7ffffff -> 0x00000000c8000000 IO 0x00000000d8000000..0x00000000d87fffff -> 0x0000000000000000 Top of RAM: 0x10000000, Total RAM: 0x10000000 Memory hole size: 0MB Zone PFN ranges: DMA 0x00000000 -> 0x00010000 Normal empty HighMem empty Movable zone start PFN for each node early_node_map[1] active PFN ranges 0: 0x00000000 -> 0x00010000 On node 0 totalpages: 65536 free_area_init_node: node 0, pgdat c04285e8, node_mem_map c0482000 DMA zone: 512 pages used for memmap DMA zone: 0 pages reserved DMA zone: 65024 pages, LIFO batch:15 Built 1 zonelists in Zone order, mobility grouping on. Total pages: 65024 Kernel command line: root=/dev/ram ramdisk_size=120000 rw ip=10.20.50.230:10 .20.50.70:10.20.50.50:255.255.0.0:PowerQUICC:eth0:off console=ttyS0,115200 mtdparts=nand:4m(kernel),-(jffs2) PID hash table entries: 1024 (order: 0, 4096 bytes) Dentry cache hash table entries: 32768 (order: 5, 131072 bytes) Inode-cache hash table entries: 16384 (order: 4, 65536 bytes) High memory: 0k Memory: 251884k/262144k available (4072k kernel code, 10260k reserved, 244k data, 267k bss, 192k init) Kernel virtual memory layout: * 0xfffcf000..0xfffff000 : fixmap * 0xff800000..0xffc00000 : highmem PTEs * 0xfe6f7000..0xff800000 : early ioremap * 0xd1000000..0xfe6f7000 : vmalloc & ioremap Hierarchical RCU implementation. RCU-based detection of stalled CPUs is disabled. Verbose stalled-CPUs detection is disabled. NR_IRQS:512 IPIC (128 IRQ sources) at d1000700 time_init: decrementer frequency = 99.999999 MHz time_init: processor frequency = 799.999992 MHz clocksource: timebase mult[2800000] shift[22] registered clockevent: decrementer mult[19999995] shift[32] cpu[0] Console: colour dummy device 80x25 pid_max: default: 32768 minimum: 301 Security Framework initialized SELinux: Disabled at boot. Mount-cache hash table entries: 512 Initializing cgroup subsys ns Initializing cgroup subsys cpuacct Initializing cgroup subsys devices NET: Registered protocol family 16 irq: irq 38 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 38 __irq_set_trigger: setting type, irq = 38, flags = 8 ipic_set_irq_type function, with virq = 38, flow = 8 irq: irq 74 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 74 __irq_set_trigger: setting type, irq = 74, flags = 8 ipic_set_irq_type function, with virq = 74, flow = 8 irq: irq 75 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 75 __irq_set_trigger: setting type, irq = 75, flags = 8 ipic_set_irq_type function, with virq = 75, flow = 8 PCI: Probing PCI hardware pci_bus 0000:00: scanning bus pci 0000:00:00.0: found [1957:00c6] class 000b20 header type 00 pci 0000:00:00.0: reg 10: [mem 0x00000000-0x000fffff] pci 0000:00:00.0: reg 18: [mem 0x00000000-0x0fffffff 64bit pref] pci 0000:00:00.0: calling fixup_hide_host_resource_fsl+0x0/0x58 pci 0000:00:00.0: calling pcibios_fixup_resources+0x0/0x238 pci 0000:00:00.0: calling quirk_fsl_pcie_header+0x0/0x48 pci 0000:00:00.0: calling quirk_resource_alignment+0x0/0x1c0 pci 0000:00:00.0: supports D1 D2 pci 0000:00:00.0: PME# supported from D0 D1 D2 D3hot pci 0000:00:00.0: PME# disabled pci_bus 0000:00: fixups for bus pci_bus 0000:00: bus scan returning with max=00 pci_bus 0001:01: scanning bus pci 0001:01:00.0: found [1957:00c6] class 000b20 header type 01 pci 0001:01:00.0: ignoring class b20 (doesn't match header type 01) pci 0001:01:00.0: calling fixup_hide_host_resource_fsl+0x0/0x58 pci 0001:01:00.0: calling pcibios_fixup_resources+0x0/0x238 pci 0001:01:00.0: calling quirk_fsl_pcie_header+0x0/0x48 pci 0001:01:00.0: calling quirk_resource_alignment+0x0/0x1c0 pci 0001:01:00.0: supports D1 D2 pci 0001:01:00.0: PME# supported from D0 D1 D2 D3hot pci 0001:01:00.0: PME# disabled pci_bus 0001:01: fixups for bus pci 0001:01:00.0: scanning [bus 01-ff] behind bridge, pass 0 pci 0001:01:00.0: bus configuration invalid, reconfiguring pci 0001:01:00.0: scanning [bus 00-00] behind bridge, pass 1 pci_bus 0001:02: scanning bus pci 0001:02:00.0: found [1204:e250] class 000000 header type 00 pci 0001:02:00.0: reg 10: [mem 0xfffc0000-0xffffffff] pci 0001:02:00.0: reg 14: [mem 0xfffc0000-0xffffffff] pci 0001:02:00.0: calling pcibios_fixup_resources+0x0/0x238 pci 0001:02:00.0: calling quirk_resource_alignment+0x0/0x1c0 pci_bus 0001:02: fixups for bus pci 0001:01:00.0: PCI bridge to [bus 02-ff] pci 0001:01:00.0: bridge window [io 0x0000-0x0000] (disabled) pci 0001:01:00.0: bridge window [mem 0x00000000-0x000fffff] (disabled) pci 0001:01:00.0: bridge window [mem 0x00000000-0x000fffff pref] (disabled) irq: irq 1 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 16 __irq_set_trigger: setting type, irq = 16, flags = 8 ipic_set_irq_type function, with virq = 16, flow = 8 pci_bus 0001:02: bus scan returning with max=02 pci_bus 0001:01: bus scan returning with max=02 pci_bus 0002:03: scanning bus pci_bus 0002:03: fixups for bus pci_bus 0002:03: bus scan returning with max=03 PCI->OF bus map: 0 -> 0 1 -> 0 3 -> 0 PCI: Cannot allocate resource region 0 of device 0001:02:00.0, will remap PCI: Cannot allocate resource region 1 of device 0001:02:00.0, will remap pci 0001:01:00.0: BAR 8: assigned [mem 0xa8000000-0xa80fffff] pci 0001:01:00.0: PCI bridge to [bus 02-02] pci 0001:01:00.0: bridge window [io disabled] pci 0001:01:00.0: bridge window [mem 0xa8000000-0xa80fffff] pci 0001:01:00.0: bridge window [mem pref disabled] pci_bus 0000:00: resource 0 [io 0x0000-0xfffff] pci_bus 0000:00: resource 1 [mem 0x90000000-0x9fffffff] pci_bus 0000:00: resource 2 [mem 0x80000000-0x8fffffff pref] pci_bus 0001:01: resource 0 [io 0xff7fe000-0xffffdfff] pci_bus 0001:01: resource 1 [mem 0xa8000000-0xb7ffffff] pci_bus 0001:02: resource 1 [mem 0xa8000000-0xa80fffff] pci_bus 0002:03: resource 0 [io 0xfeffc000-0xff7fbfff] pci_bus 0002:03: resource 1 [mem 0xc8000000-0xd7ffffff] Registering qe_ic with sysfs... Registering ipic with sysfs... bio: create slab <bio-0> at 0 vgaarb: loaded SCSI subsystem initialized Switching to clocksource timebase NET: Registered protocol family 2 IP route cache hash table entries: 2048 (order: 1, 8192 bytes) TCP established hash table entries: 8192 (order: 4, 65536 bytes) TCP bind hash table entries: 8192 (order: 3, 32768 bytes) TCP: Hash tables configured (established 8192 bind 8192) TCP reno registered UDP hash table entries: 256 (order: 0, 4096 bytes) UDP-Lite hash table entries: 256 (order: 0, 4096 bytes) NET: Registered protocol family 1 pci 0000:00:00.0: calling quirk_cardbus_legacy+0x0/0x44 pci 0000:00:00.0: calling quirk_usb_early_handoff+0x0/0x740 pci 0001:01:00.0: calling quirk_cardbus_legacy+0x0/0x44 pci 0001:01:00.0: calling quirk_usb_early_handoff+0x0/0x740 pci 0001:02:00.0: calling quirk_cardbus_legacy+0x0/0x44 pci 0001:02:00.0: calling quirk_usb_early_handoff+0x0/0x740 PCI: CLS 32 bytes, default 32 Trying to unpack rootfs image as initramfs... rootfs image is not initramfs (no cpio magic); looks like an initrd Freeing initrd memory: 3345k freed irq: irq 9 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 17 __irq_set_trigger: setting type, irq = 17, flags = 8 ipic_set_irq_type function, with virq = 17, flow = 8 irq: irq 10 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 18 __irq_set_trigger: setting type, irq = 18, flags = 8 ipic_set_irq_type function, with virq = 18, flow = 8 irq: irq 80 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 80 __irq_set_trigger: setting type, irq = 80, flags = 8 ipic_set_irq_type function, with virq = 80, flow = 8 audit: initializing netlink socket (disabled) type=2000 audit(0.212:1): initialized JFFS2 version 2.2. (NAND) © 2001-2006 Red Hat, Inc. SGI XFS with security attributes, large block/inode numbers, no debug enabled msgmni has been set to 498 alg: No test for cipher_null (cipher_null-generic) alg: No test for ecb(cipher_null) (ecb-cipher_null) alg: No test for digest_null (digest_null-generic) alg: No test for compress_null (compress_null-generic) alg: No test for stdrng (krng) Block layer SCSI generic (bsg) driver version 0.4 loaded (major 253) io scheduler noop registered io scheduler deadline registered io scheduler cfq registered (default) Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled serial8250.0: ttyS0 at MMIO 0xe0004500 (irq = 17) is a 16550A console [ttyS0] enabled, bootconsole disabled serial8250.0: ttyS1 at MMIO 0xe0004600 (irq = 18) is a 16550A brd: module loaded of_mpc8xxx_spi_probe function called. irq: irq 16 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 19 __irq_set_trigger: setting type, irq = 19, flags = 8 ipic_set_irq_type function, with virq = 19, flow = 8 mpc8xxx_spi_probe function called. mpc8xxx_spi e0007000.spi: at 0xd1078000 (irq = 19), CPU mode irq: irq 32 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 32 __irq_set_trigger: setting type, irq = 32, flags = 8 ipic_set_irq_type function, with virq = 32, flow = 8 irq: irq 33 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 33 __irq_set_trigger: setting type, irq = 33, flags = 8 ipic_set_irq_type function, with virq = 33, flow = 8 irq: irq 34 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 34 __irq_set_trigger: setting type, irq = 34, flags = 8 ipic_set_irq_type function, with virq = 34, flow = 8 eth0: Gianfar Ethernet Controller Version 1.2, 04:00:00:00:00:0a eth0: Running with NAPI enabled eth0: RX BD ring size for Q[0]: 256 eth0: TX BD ring size for Q[0]: 256 irq: irq 35 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 35 __irq_set_trigger: setting type, irq = 35, flags = 8 ipic_set_irq_type function, with virq = 35, flow = 8 irq: irq 36 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 36 __irq_set_trigger: setting type, irq = 36, flags = 8 ipic_set_irq_type function, with virq = 36, flow = 8 irq: irq 37 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 37 __irq_set_trigger: setting type, irq = 37, flags = 8 ipic_set_irq_type function, with virq = 37, flow = 8 eth1: Gianfar Ethernet Controller Version 1.2, 00:00:00:00:00:00 eth1: Running with NAPI enabled eth1: RX BD ring size for Q[0]: 256 eth1: TX BD ring size for Q[0]: 256 ucc_geth: QE UCC Gigabit Ethernet Controller Freescale PowerQUICC MII Bus: probed irq: irq 17 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 20 __irq_set_trigger: setting type, irq = 20, flags = 8 ipic_set_irq_type function, with virq = 20, flow = 8 Freescale PowerQUICC MII Bus: probed mice: PS/2 mouse device common for all mice Skipping unavailable LED gpio -19 (pwr) Skipping unavailable LED gpio -19 (hdd) TCP cubic registered NET: Registered protocol family 17 registered taskstats version 1 drivers/rtc/hctosys.c: unable to open rtc device (rtc0) RAMDISK: gzip image found at block 0 VFS: Mounted root (ext2 filesystem) on device 1:0. Freeing unused kernel memory: 192k init PHY: mdio@e0024520:02 - Link is Up - 10/Half ================================================================ Regards Ravi Gupta [-- Attachment #1.2: Type: text/html, Size: 18171 bytes --] [-- Attachment #2: dmesg_log --] [-- Type: application/octet-stream, Size: 12441 bytes --] Using MPC837x RDB/WLAN machine description Initializing cgroup subsys cpuset Initializing cgroup subsys cpu Linux version 2.6.35 (okapi@okapi) (gcc version 4.2.3 (Sourcery G++ Lite 4.2-171)) #13 Tue Sep 7 11:37:47 IST 2010 Found initrd at 0xcf46d000:0xcf7b15b7 Found legacy serial port 0 for /immr@e0000000/serial@4500 mem=e0004500, taddr=e0004500, irq=0, clk=399999996, speed=0 Found legacy serial port 1 for /immr@e0000000/serial@4600 mem=e0004600, taddr=e0004600, irq=0, clk=399999996, speed=0 bootconsole [udbg0] enabled Found FSL PCI host bridge at 0x00000000e0008500. Firmware bus number: 0->0 PCI host bridge /pci@e0008500 (primary) ranges: MEM 0x0000000090000000..0x000000009fffffff -> 0x0000000090000000 MEM 0x0000000080000000..0x000000008fffffff -> 0x0000000080000000 Prefetch IO 0x00000000e0300000..0x00000000e03fffff -> 0x0000000000000000 No pci config register base in dev tree, using default Found FSL PCI host bridge at 0x00000000e0009000. Firmware bus number: 0->255 PCI host bridge /pcie@e0009000 ranges: MEM 0x00000000a8000000..0x00000000b7ffffff -> 0x00000000a8000000 IO 0x00000000b8000000..0x00000000b87fffff -> 0x0000000000000000 No pci config register base in dev tree, using default Found FSL PCI host bridge at 0x00000000e000a000. Firmware bus number: 0->255 PCI host bridge /pcie@e000a000 ranges: MEM 0x00000000c8000000..0x00000000d7ffffff -> 0x00000000c8000000 IO 0x00000000d8000000..0x00000000d87fffff -> 0x0000000000000000 Top of RAM: 0x10000000, Total RAM: 0x10000000 Memory hole size: 0MB Zone PFN ranges: DMA 0x00000000 -> 0x00010000 Normal empty HighMem empty Movable zone start PFN for each node early_node_map[1] active PFN ranges 0: 0x00000000 -> 0x00010000 On node 0 totalpages: 65536 free_area_init_node: node 0, pgdat c04285e8, node_mem_map c0482000 DMA zone: 512 pages used for memmap DMA zone: 0 pages reserved DMA zone: 65024 pages, LIFO batch:15 Built 1 zonelists in Zone order, mobility grouping on. Total pages: 65024 Kernel command line: root=/dev/ram ramdisk_size=120000 rw ip=10.20.50.230:10.20.50.70:10.20.50.50:255.255.0.0:PowerQUICC:eth0:off console=ttyS0,115200 mtdparts=nand:4m(kernel),-(jffs2) PID hash table entries: 1024 (order: 0, 4096 bytes) Dentry cache hash table entries: 32768 (order: 5, 131072 bytes) Inode-cache hash table entries: 16384 (order: 4, 65536 bytes) High memory: 0k Memory: 251884k/262144k available (4072k kernel code, 10260k reserved, 244k data, 267k bss, 192k init) Kernel virtual memory layout: * 0xfffcf000..0xfffff000 : fixmap * 0xff800000..0xffc00000 : highmem PTEs * 0xfe6f7000..0xff800000 : early ioremap * 0xd1000000..0xfe6f7000 : vmalloc & ioremap Hierarchical RCU implementation. RCU-based detection of stalled CPUs is disabled. Verbose stalled-CPUs detection is disabled. NR_IRQS:512 IPIC (128 IRQ sources) at d1000700 time_init: decrementer frequency = 99.999999 MHz time_init: processor frequency = 799.999992 MHz clocksource: timebase mult[2800000] shift[22] registered clockevent: decrementer mult[19999995] shift[32] cpu[0] Console: colour dummy device 80x25 pid_max: default: 32768 minimum: 301 Security Framework initialized SELinux: Disabled at boot. Mount-cache hash table entries: 512 Initializing cgroup subsys ns Initializing cgroup subsys cpuacct Initializing cgroup subsys devices NET: Registered protocol family 16 irq: irq 38 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 38 __irq_set_trigger: setting type, irq = 38, flags = 8 ipic_set_irq_type function, with virq = 38, flow = 8 irq: irq 74 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 74 __irq_set_trigger: setting type, irq = 74, flags = 8 ipic_set_irq_type function, with virq = 74, flow = 8 irq: irq 75 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 75 __irq_set_trigger: setting type, irq = 75, flags = 8 ipic_set_irq_type function, with virq = 75, flow = 8 PCI: Probing PCI hardware pci_bus 0000:00: scanning bus pci 0000:00:00.0: found [1957:00c6] class 000b20 header type 00 pci 0000:00:00.0: reg 10: [mem 0x00000000-0x000fffff] pci 0000:00:00.0: reg 18: [mem 0x00000000-0x0fffffff 64bit pref] pci 0000:00:00.0: calling fixup_hide_host_resource_fsl+0x0/0x58 pci 0000:00:00.0: calling pcibios_fixup_resources+0x0/0x238 pci 0000:00:00.0: calling quirk_fsl_pcie_header+0x0/0x48 pci 0000:00:00.0: calling quirk_resource_alignment+0x0/0x1c0 pci 0000:00:00.0: supports D1 D2 pci 0000:00:00.0: PME# supported from D0 D1 D2 D3hot pci 0000:00:00.0: PME# disabled pci_bus 0000:00: fixups for bus pci_bus 0000:00: bus scan returning with max=00 pci_bus 0001:01: scanning bus pci 0001:01:00.0: found [1957:00c6] class 000b20 header type 01 pci 0001:01:00.0: ignoring class b20 (doesn't match header type 01) pci 0001:01:00.0: calling fixup_hide_host_resource_fsl+0x0/0x58 pci 0001:01:00.0: calling pcibios_fixup_resources+0x0/0x238 pci 0001:01:00.0: calling quirk_fsl_pcie_header+0x0/0x48 pci 0001:01:00.0: calling quirk_resource_alignment+0x0/0x1c0 pci 0001:01:00.0: supports D1 D2 pci 0001:01:00.0: PME# supported from D0 D1 D2 D3hot pci 0001:01:00.0: PME# disabled pci_bus 0001:01: fixups for bus pci 0001:01:00.0: scanning [bus 01-ff] behind bridge, pass 0 pci 0001:01:00.0: bus configuration invalid, reconfiguring pci 0001:01:00.0: scanning [bus 00-00] behind bridge, pass 1 pci_bus 0001:02: scanning bus pci 0001:02:00.0: found [1204:e250] class 000000 header type 00 pci 0001:02:00.0: reg 10: [mem 0xfffc0000-0xffffffff] pci 0001:02:00.0: reg 14: [mem 0xfffc0000-0xffffffff] pci 0001:02:00.0: calling pcibios_fixup_resources+0x0/0x238 pci 0001:02:00.0: calling quirk_resource_alignment+0x0/0x1c0 pci_bus 0001:02: fixups for bus pci 0001:01:00.0: PCI bridge to [bus 02-ff] pci 0001:01:00.0: bridge window [io 0x0000-0x0000] (disabled) pci 0001:01:00.0: bridge window [mem 0x00000000-0x000fffff] (disabled) pci 0001:01:00.0: bridge window [mem 0x00000000-0x000fffff pref] (disabled) irq: irq 1 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 16 __irq_set_trigger: setting type, irq = 16, flags = 8 ipic_set_irq_type function, with virq = 16, flow = 8 pci_bus 0001:02: bus scan returning with max=02 pci_bus 0001:01: bus scan returning with max=02 pci_bus 0002:03: scanning bus pci_bus 0002:03: fixups for bus pci_bus 0002:03: bus scan returning with max=03 PCI->OF bus map: 0 -> 0 1 -> 0 3 -> 0 PCI: Cannot allocate resource region 0 of device 0001:02:00.0, will remap PCI: Cannot allocate resource region 1 of device 0001:02:00.0, will remap pci 0001:01:00.0: BAR 8: assigned [mem 0xa8000000-0xa80fffff] pci 0001:01:00.0: PCI bridge to [bus 02-02] pci 0001:01:00.0: bridge window [io disabled] pci 0001:01:00.0: bridge window [mem 0xa8000000-0xa80fffff] pci 0001:01:00.0: bridge window [mem pref disabled] pci_bus 0000:00: resource 0 [io 0x0000-0xfffff] pci_bus 0000:00: resource 1 [mem 0x90000000-0x9fffffff] pci_bus 0000:00: resource 2 [mem 0x80000000-0x8fffffff pref] pci_bus 0001:01: resource 0 [io 0xff7fe000-0xffffdfff] pci_bus 0001:01: resource 1 [mem 0xa8000000-0xb7ffffff] pci_bus 0001:02: resource 1 [mem 0xa8000000-0xa80fffff] pci_bus 0002:03: resource 0 [io 0xfeffc000-0xff7fbfff] pci_bus 0002:03: resource 1 [mem 0xc8000000-0xd7ffffff] Registering qe_ic with sysfs... Registering ipic with sysfs... bio: create slab <bio-0> at 0 vgaarb: loaded SCSI subsystem initialized Switching to clocksource timebase NET: Registered protocol family 2 IP route cache hash table entries: 2048 (order: 1, 8192 bytes) TCP established hash table entries: 8192 (order: 4, 65536 bytes) TCP bind hash table entries: 8192 (order: 3, 32768 bytes) TCP: Hash tables configured (established 8192 bind 8192) TCP reno registered UDP hash table entries: 256 (order: 0, 4096 bytes) UDP-Lite hash table entries: 256 (order: 0, 4096 bytes) NET: Registered protocol family 1 pci 0000:00:00.0: calling quirk_cardbus_legacy+0x0/0x44 pci 0000:00:00.0: calling quirk_usb_early_handoff+0x0/0x740 pci 0001:01:00.0: calling quirk_cardbus_legacy+0x0/0x44 pci 0001:01:00.0: calling quirk_usb_early_handoff+0x0/0x740 pci 0001:02:00.0: calling quirk_cardbus_legacy+0x0/0x44 pci 0001:02:00.0: calling quirk_usb_early_handoff+0x0/0x740 PCI: CLS 32 bytes, default 32 Trying to unpack rootfs image as initramfs... rootfs image is not initramfs (no cpio magic); looks like an initrd Freeing initrd memory: 3345k freed irq: irq 9 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 17 __irq_set_trigger: setting type, irq = 17, flags = 8 ipic_set_irq_type function, with virq = 17, flow = 8 irq: irq 10 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 18 __irq_set_trigger: setting type, irq = 18, flags = 8 ipic_set_irq_type function, with virq = 18, flow = 8 irq: irq 80 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 80 __irq_set_trigger: setting type, irq = 80, flags = 8 ipic_set_irq_type function, with virq = 80, flow = 8 audit: initializing netlink socket (disabled) type=2000 audit(0.212:1): initialized JFFS2 version 2.2. (NAND) © 2001-2006 Red Hat, Inc. SGI XFS with security attributes, large block/inode numbers, no debug enabled msgmni has been set to 498 alg: No test for cipher_null (cipher_null-generic) alg: No test for ecb(cipher_null) (ecb-cipher_null) alg: No test for digest_null (digest_null-generic) alg: No test for compress_null (compress_null-generic) alg: No test for stdrng (krng) Block layer SCSI generic (bsg) driver version 0.4 loaded (major 253) io scheduler noop registered io scheduler deadline registered io scheduler cfq registered (default) Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled serial8250.0: ttyS0 at MMIO 0xe0004500 (irq = 17) is a 16550A console [ttyS0] enabled, bootconsole disabled serial8250.0: ttyS1 at MMIO 0xe0004600 (irq = 18) is a 16550A brd: module loaded of_mpc8xxx_spi_probe function called. irq: irq 16 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 19 __irq_set_trigger: setting type, irq = 19, flags = 8 ipic_set_irq_type function, with virq = 19, flow = 8 mpc8xxx_spi_probe function called. mpc8xxx_spi e0007000.spi: at 0xd1078000 (irq = 19), CPU mode irq: irq 32 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 32 __irq_set_trigger: setting type, irq = 32, flags = 8 ipic_set_irq_type function, with virq = 32, flow = 8 irq: irq 33 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 33 __irq_set_trigger: setting type, irq = 33, flags = 8 ipic_set_irq_type function, with virq = 33, flow = 8 irq: irq 34 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 34 __irq_set_trigger: setting type, irq = 34, flags = 8 ipic_set_irq_type function, with virq = 34, flow = 8 eth0: Gianfar Ethernet Controller Version 1.2, 04:00:00:00:00:0a eth0: Running with NAPI enabled eth0: RX BD ring size for Q[0]: 256 eth0: TX BD ring size for Q[0]: 256 irq: irq 35 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 35 __irq_set_trigger: setting type, irq = 35, flags = 8 ipic_set_irq_type function, with virq = 35, flow = 8 irq: irq 36 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 36 __irq_set_trigger: setting type, irq = 36, flags = 8 ipic_set_irq_type function, with virq = 36, flow = 8 irq: irq 37 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 37 __irq_set_trigger: setting type, irq = 37, flags = 8 ipic_set_irq_type function, with virq = 37, flow = 8 eth1: Gianfar Ethernet Controller Version 1.2, 00:00:00:00:00:00 eth1: Running with NAPI enabled eth1: RX BD ring size for Q[0]: 256 eth1: TX BD ring size for Q[0]: 256 ucc_geth: QE UCC Gigabit Ethernet Controller Freescale PowerQUICC MII Bus: probed irq: irq 17 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 20 __irq_set_trigger: setting type, irq = 20, flags = 8 ipic_set_irq_type function, with virq = 20, flow = 8 Freescale PowerQUICC MII Bus: probed mice: PS/2 mouse device common for all mice Skipping unavailable LED gpio -19 (pwr) Skipping unavailable LED gpio -19 (hdd) TCP cubic registered NET: Registered protocol family 17 registered taskstats version 1 drivers/rtc/hctosys.c: unable to open rtc device (rtc0) RAMDISK: gzip image found at block 0 VFS: Mounted root (ext2 filesystem) on device 1:0. Freeing unused kernel memory: 192k init PHY: mdio@e0024520:02 - Link is Up - 10/Half ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: pci_request_regions() failure 2010-09-07 7:20 ` Ravi Gupta @ 2010-09-07 9:24 ` tiejun.chen 2010-09-08 9:29 ` Ravi Gupta 0 siblings, 1 reply; 10+ messages in thread From: tiejun.chen @ 2010-09-07 9:24 UTC (permalink / raw) To: Ravi Gupta; +Cc: linuxppc-dev Ravi Gupta wrote: > Hi Tiejun, > > Thanks for the reply. I am sending you the updated dmesg O/P(after enabling > CONFIG_PCI_DEBUG) as attachment as well as at the end of the mail. > > As far as driver is concern, I am trying the pci_skel driver available as > example with LDD book with slight modifications. Current LDD 3rd may be old for 2.6.35 on some sections :) > > Driver Code: > ================================================================ > #include <linux/kernel.h> > #include <linux/module.h> > #include <linux/pci.h> > > /* PCI IDs */ > static struct pci_device_id ids[] = { > { PCI_DEVICE(0x1204, 0xe250) }, > { 0, } > }; > MODULE_DEVICE_TABLE(pci, ids); > > static unsigned char skel_get_revision(struct pci_dev *dev) > { > u8 revision; > > pci_read_config_byte(dev, PCI_REVISION_ID, &revision); > return revision; > } > > static u16 skel_get_vendor_id(struct pci_dev *dev) > { > u16 vendor_id; > > pci_read_config_word(dev, PCI_VENDOR_ID, &vendor_id); > return vendor_id; > } > > static u16 skel_get_device_id(struct pci_dev *dev) > { > u16 device_id; > > pci_read_config_word(dev, PCI_DEVICE_ID, &device_id); > return device_id; > } > > static int probe(struct pci_dev *dev, const struct pci_device_id *id) > { > /* Do probing type stuff here. > * Like calling request_region(); > */ > int err, i; > printk(KERN_ALERT "PCI driver: Probe function\n"); > > /* > * Enable the bus-master bit values. > * Some PCI BIOSes fail to set the master-enable bit. > * Some demos support being an initiator, so need bus master ability. > */ > err = pci_request_regions(dev, "pci_skell"); > if (err) { > printk(KERN_ERR "request region failed :%d\n", err); > return err; > } > > pci_set_master(dev); > > if ((err = pci_enable_device(dev)) != 0) { > printk(KERN_ERR "Unable to Enable PCI device:%d\n", err); > return err; > } > > printk(KERN_ALERT "PCI driver Vendor ID = %x\n", skel_get_vendor_id(dev)); > printk(KERN_ALERT "PCI driver Device ID = %x\n", skel_get_device_id(dev)); > printk(KERN_ALERT "PCI driver Revision = %d\n", skel_get_revision(dev)); > return 0; > } > > static void remove(struct pci_dev *dev) > { > /* clean up any allocated resources and stuff here. > * like call release_region(); > */ > } > > static struct pci_driver pci_driver = { > .name = "pci_skel", > .id_table = ids, > .probe = probe, > .remove = remove, > }; > > static int __init pci_skel_init(void) > { > printk(KERN_ALERT "PCI driver: Init function\n"); > return pci_register_driver(&pci_driver); > } > > static void __exit pci_skel_exit(void) > { > printk(KERN_ALERT "PCI driver: Exit function\n"); > pci_unregister_driver(&pci_driver); > } > > MODULE_LICENSE("GPL"); > > module_init(pci_skel_init); > module_exit(pci_skel_exit); > ================================================================ > > The above code fails at the pci_request_regions(dev, "pci_skell"); call, > with -EBUSY(-16) i.e resource busy error. If I don't request for resources > and directly enable the pci device by calling pci_device_enable(), it gives > the error message > > PCI driver: Init function > PCI driver: Probe function > pci_skel 0001:02:00.0: device not available (can't reserve [mem > 0x00000000-0x0003ffff]) > Unable to Enable PCI device:-22 > pci_skel: probe of 0001:02:00.0 failed with error -22 Your PCI device should be one virtual device so I think the above should be as we understood. You know 0x00000000 ~ 0x00003ffff should not be allowed to reserved. > > > >> Especially I want to know how/where you get >> these two range, a8000000-a803ffff and a8040000-a807ffff. You wired them > firstly >> on the driver or allocated by the kernel? > > Actually as I said before, I tried my device on i386 machine and there I got > two ranges fe900000-fe93ffff and fe940000-fe97ffff, so from there I am > guessing that on PowerPC also, it should allocate two ranges > a8000000-a803ffff and a8040000-a807ffff resp. I think you should do the following sequence in the probe function of your PCI driver. 1. pci_enable_device(pdev); 2. pci_request_regions(pdev, DRV_NAME); 3. pci_set_master(pdev); ...... > > > > lspci output > ================================================================ > 0000:00:00.0 Power PC: Freescale Semiconductor Inc Unknown device 00c6 (rev > 21) > 0001:01:00.0 PCI bridge: Freescale Semiconductor Inc Unknown device 00c6 > (rev 21) > 0001:02:00.0 Non-VGA unclassified device: Lattice Semiconductor Corporation > Unknown device e250 ----------> My device > ================================================================ > > Dmesg with CONFIG_PCI_DEBUG enable. > ================================================================ > Using MPC837x RDB/WLAN machine description > Initializing cgroup subsys cpuset > Initializing cgroup subsys cpu > Linux version 2.6.35 (okapi@okapi) (gcc version 4.2.3 (Sourcery G++ Lite > 4.2-171)) #13 Tue Sep 7 11:37:47 IST 2010 > Found initrd at 0xcf46d000:0xcf7b15b7 > Found legacy serial port 0 for /immr@e0000000/serial@4500 > mem=e0004500, taddr=e0004500, irq=0, clk=399999996, speed=0 > Found legacy serial port 1 for /immr@e0000000/serial@4600 > mem=e0004600, taddr=e0004600, irq=0, clk=399999996, speed=0 > bootconsole [udbg0] enabled > Found FSL PCI host bridge at 0x00000000e0008500. Firmware bus number: 0->0 > PCI host bridge /pci@e0008500 (primary) ranges: > MEM 0x0000000090000000..0x000000009fffffff -> 0x0000000090000000 > MEM 0x0000000080000000..0x000000008fffffff -> 0x0000000080000000 Prefetch > IO 0x00000000e0300000..0x00000000e03fffff -> 0x0000000000000000 > No pci config register base in dev tree, using default > Found FSL PCI host bridge at 0x00000000e0009000. Firmware bus number: 0->255 > PCI host bridge /pcie@e0009000 ranges: > MEM 0x00000000a8000000..0x00000000b7ffffff -> 0x00000000a8000000 > IO 0x00000000b8000000..0x00000000b87fffff -> 0x0000000000000000 > No pci config register base in dev tree, using default > Found FSL PCI host bridge at 0x00000000e000a000. Firmware bus number: 0->255 > PCI host bridge /pcie@e000a000 ranges: > MEM 0x00000000c8000000..0x00000000d7ffffff -> 0x00000000c8000000 > IO 0x00000000d8000000..0x00000000d87fffff -> 0x0000000000000000 > Top of RAM: 0x10000000, Total RAM: 0x10000000 > Memory hole size: 0MB > Zone PFN ranges: > DMA 0x00000000 -> 0x00010000 > Normal empty > HighMem empty > Movable zone start PFN for each node > early_node_map[1] active PFN ranges > 0: 0x00000000 -> 0x00010000 > On node 0 totalpages: 65536 > free_area_init_node: node 0, pgdat c04285e8, node_mem_map c0482000 > DMA zone: 512 pages used for memmap > DMA zone: 0 pages reserved > DMA zone: 65024 pages, LIFO batch:15 > Built 1 zonelists in Zone order, mobility grouping on. Total pages: 65024 > Kernel command line: root=/dev/ram ramdisk_size=120000 rw ip=10.20.50.230:10 > .20.50.70:10.20.50.50:255.255.0.0:PowerQUICC:eth0:off console=ttyS0,115200 > mtdparts=nand:4m(kernel),-(jffs2) > PID hash table entries: 1024 (order: 0, 4096 bytes) > Dentry cache hash table entries: 32768 (order: 5, 131072 bytes) > Inode-cache hash table entries: 16384 (order: 4, 65536 bytes) > High memory: 0k > Memory: 251884k/262144k available (4072k kernel code, 10260k reserved, 244k > data, 267k bss, 192k init) > Kernel virtual memory layout: > * 0xfffcf000..0xfffff000 : fixmap > * 0xff800000..0xffc00000 : highmem PTEs > * 0xfe6f7000..0xff800000 : early ioremap > * 0xd1000000..0xfe6f7000 : vmalloc & ioremap > Hierarchical RCU implementation. > RCU-based detection of stalled CPUs is disabled. > Verbose stalled-CPUs detection is disabled. > NR_IRQS:512 > IPIC (128 IRQ sources) at d1000700 > time_init: decrementer frequency = 99.999999 MHz > time_init: processor frequency = 799.999992 MHz > clocksource: timebase mult[2800000] shift[22] registered > clockevent: decrementer mult[19999995] shift[32] cpu[0] > Console: colour dummy device 80x25 > pid_max: default: 32768 minimum: 301 > Security Framework initialized > SELinux: Disabled at boot. > Mount-cache hash table entries: 512 > Initializing cgroup subsys ns > Initializing cgroup subsys cpuacct > Initializing cgroup subsys devices > NET: Registered protocol family 16 > irq: irq 38 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 38 > __irq_set_trigger: setting type, irq = 38, flags = 8 > ipic_set_irq_type function, with virq = 38, flow = 8 > irq: irq 74 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 74 > __irq_set_trigger: setting type, irq = 74, flags = 8 > ipic_set_irq_type function, with virq = 74, flow = 8 > irq: irq 75 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 75 > __irq_set_trigger: setting type, irq = 75, flags = 8 > ipic_set_irq_type function, with virq = 75, flow = 8 > PCI: Probing PCI hardware > pci_bus 0000:00: scanning bus > pci 0000:00:00.0: found [1957:00c6] class 000b20 header type 00 > pci 0000:00:00.0: reg 10: [mem 0x00000000-0x000fffff] > pci 0000:00:00.0: reg 18: [mem 0x00000000-0x0fffffff 64bit pref] > pci 0000:00:00.0: calling fixup_hide_host_resource_fsl+0x0/0x58 > pci 0000:00:00.0: calling pcibios_fixup_resources+0x0/0x238 > pci 0000:00:00.0: calling quirk_fsl_pcie_header+0x0/0x48 > pci 0000:00:00.0: calling quirk_resource_alignment+0x0/0x1c0 > pci 0000:00:00.0: supports D1 D2 > pci 0000:00:00.0: PME# supported from D0 D1 D2 D3hot > pci 0000:00:00.0: PME# disabled > pci_bus 0000:00: fixups for bus > pci_bus 0000:00: bus scan returning with max=00 > pci_bus 0001:01: scanning bus > pci 0001:01:00.0: found [1957:00c6] class 000b20 header type 01 > pci 0001:01:00.0: ignoring class b20 (doesn't match header type 01) > pci 0001:01:00.0: calling fixup_hide_host_resource_fsl+0x0/0x58 > pci 0001:01:00.0: calling pcibios_fixup_resources+0x0/0x238 > pci 0001:01:00.0: calling quirk_fsl_pcie_header+0x0/0x48 > pci 0001:01:00.0: calling quirk_resource_alignment+0x0/0x1c0 > pci 0001:01:00.0: supports D1 D2 > pci 0001:01:00.0: PME# supported from D0 D1 D2 D3hot > pci 0001:01:00.0: PME# disabled > pci_bus 0001:01: fixups for bus > pci 0001:01:00.0: scanning [bus 01-ff] behind bridge, pass 0 > pci 0001:01:00.0: bus configuration invalid, reconfiguring > pci 0001:01:00.0: scanning [bus 00-00] behind bridge, pass 1 > pci_bus 0001:02: scanning bus > pci 0001:02:00.0: found [1204:e250] class 000000 header type 00 > pci 0001:02:00.0: reg 10: [mem 0xfffc0000-0xffffffff] > pci 0001:02:00.0: reg 14: [mem 0xfffc0000-0xffffffff] These infos make me confused. 0xfxxxxxxx should not be original BARs value and also cannot be allocated for resources successfully by the kernel. Often the kernel get them to allocate as PCI bus range. For example, Firstly checking..... ------- pci 0001:02:00.0: reg 10: [mem 0x00000000-0x00003fff 64bit] pci 0001:02:00.0: reg 18: [io 0x0000-0x00ff] pci 0001:02:00.0: reg 30: [mem 0x00000000-0x0001ffff pref] Then allocating as the following: ------- pci 0001:02:00.0: BAR 6: assigned [mem 0xa0000000-0xa001ffff pref] pci 0001:02:00.0: BAR 0: assigned [mem 0xa0020000-0xa0023fff 64bit] pci 0001:02:00.0: BAR 0: set to [mem 0xa0020000-0xa0023fff 64bit] (PCI address [0xa0020000-0xa0023fff] So I think your device BARs should be pre-allocated incorrectly by the bootloader since your device is so special. Maybe this is just why that's different from you saw on x86. As a result we cannot re-allocated into PCI bus range as the kernel expect. Looks we need some pci_fixup to modify them. Firstly I think you'd better 'zero' all BARs of your PCI device on the function, pci_scan_device, on the file, drivers/pci/probe.c. On there you can dedicate that once your device is probed. Please check the each BAR's value again after the above fix. Best Regards Tiejun > pci 0001:02:00.0: calling pcibios_fixup_resources+0x0/0x238 > pci 0001:02:00.0: calling quirk_resource_alignment+0x0/0x1c0 > pci_bus 0001:02: fixups for bus > pci 0001:01:00.0: PCI bridge to [bus 02-ff] > pci 0001:01:00.0: bridge window [io 0x0000-0x0000] (disabled) > pci 0001:01:00.0: bridge window [mem 0x00000000-0x000fffff] (disabled) > pci 0001:01:00.0: bridge window [mem 0x00000000-0x000fffff pref] > (disabled) > irq: irq 1 on host /immr@e0000000/interrupt-controller@700 mapped to virtual > irq 16 > __irq_set_trigger: setting type, irq = 16, flags = 8 > ipic_set_irq_type function, with virq = 16, flow = 8 > pci_bus 0001:02: bus scan returning with max=02 > pci_bus 0001:01: bus scan returning with max=02 > pci_bus 0002:03: scanning bus > pci_bus 0002:03: fixups for bus > pci_bus 0002:03: bus scan returning with max=03 > PCI->OF bus map: > 0 -> 0 > 1 -> 0 > 3 -> 0 > PCI: Cannot allocate resource region 0 of device 0001:02:00.0, will remap > PCI: Cannot allocate resource region 1 of device 0001:02:00.0, will remap > pci 0001:01:00.0: BAR 8: assigned [mem 0xa8000000-0xa80fffff] > pci 0001:01:00.0: PCI bridge to [bus 02-02] > pci 0001:01:00.0: bridge window [io disabled] > pci 0001:01:00.0: bridge window [mem 0xa8000000-0xa80fffff] > pci 0001:01:00.0: bridge window [mem pref disabled] > pci_bus 0000:00: resource 0 [io 0x0000-0xfffff] > pci_bus 0000:00: resource 1 [mem 0x90000000-0x9fffffff] > pci_bus 0000:00: resource 2 [mem 0x80000000-0x8fffffff pref] > pci_bus 0001:01: resource 0 [io 0xff7fe000-0xffffdfff] > pci_bus 0001:01: resource 1 [mem 0xa8000000-0xb7ffffff] > pci_bus 0001:02: resource 1 [mem 0xa8000000-0xa80fffff] > pci_bus 0002:03: resource 0 [io 0xfeffc000-0xff7fbfff] > pci_bus 0002:03: resource 1 [mem 0xc8000000-0xd7ffffff] > Registering qe_ic with sysfs... > Registering ipic with sysfs... > bio: create slab <bio-0> at 0 > vgaarb: loaded > SCSI subsystem initialized > Switching to clocksource timebase > NET: Registered protocol family 2 > IP route cache hash table entries: 2048 (order: 1, 8192 bytes) > TCP established hash table entries: 8192 (order: 4, 65536 bytes) > TCP bind hash table entries: 8192 (order: 3, 32768 bytes) > TCP: Hash tables configured (established 8192 bind 8192) > TCP reno registered > UDP hash table entries: 256 (order: 0, 4096 bytes) > UDP-Lite hash table entries: 256 (order: 0, 4096 bytes) > NET: Registered protocol family 1 > pci 0000:00:00.0: calling quirk_cardbus_legacy+0x0/0x44 > pci 0000:00:00.0: calling quirk_usb_early_handoff+0x0/0x740 > pci 0001:01:00.0: calling quirk_cardbus_legacy+0x0/0x44 > pci 0001:01:00.0: calling quirk_usb_early_handoff+0x0/0x740 > pci 0001:02:00.0: calling quirk_cardbus_legacy+0x0/0x44 > pci 0001:02:00.0: calling quirk_usb_early_handoff+0x0/0x740 > PCI: CLS 32 bytes, default 32 > Trying to unpack rootfs image as initramfs... > rootfs image is not initramfs (no cpio magic); looks like an initrd > Freeing initrd memory: 3345k freed > irq: irq 9 on host /immr@e0000000/interrupt-controller@700 mapped to virtual > irq 17 > __irq_set_trigger: setting type, irq = 17, flags = 8 > ipic_set_irq_type function, with virq = 17, flow = 8 > irq: irq 10 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 18 > __irq_set_trigger: setting type, irq = 18, flags = 8 > ipic_set_irq_type function, with virq = 18, flow = 8 > irq: irq 80 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 80 > __irq_set_trigger: setting type, irq = 80, flags = 8 > ipic_set_irq_type function, with virq = 80, flow = 8 > audit: initializing netlink socket (disabled) > type=2000 audit(0.212:1): initialized > JFFS2 version 2.2. (NAND) � 2001-2006 Red Hat, Inc. > SGI XFS with security attributes, large block/inode numbers, no debug > enabled > msgmni has been set to 498 > alg: No test for cipher_null (cipher_null-generic) > alg: No test for ecb(cipher_null) (ecb-cipher_null) > alg: No test for digest_null (digest_null-generic) > alg: No test for compress_null (compress_null-generic) > alg: No test for stdrng (krng) > Block layer SCSI generic (bsg) driver version 0.4 loaded (major 253) > io scheduler noop registered > io scheduler deadline registered > io scheduler cfq registered (default) > Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled > serial8250.0: ttyS0 at MMIO 0xe0004500 (irq = 17) is a 16550A > console [ttyS0] enabled, bootconsole disabled > serial8250.0: ttyS1 at MMIO 0xe0004600 (irq = 18) is a 16550A > brd: module loaded > of_mpc8xxx_spi_probe function called. > irq: irq 16 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 19 > __irq_set_trigger: setting type, irq = 19, flags = 8 > ipic_set_irq_type function, with virq = 19, flow = 8 > mpc8xxx_spi_probe function called. > mpc8xxx_spi e0007000.spi: at 0xd1078000 (irq = 19), CPU mode > irq: irq 32 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 32 > __irq_set_trigger: setting type, irq = 32, flags = 8 > ipic_set_irq_type function, with virq = 32, flow = 8 > irq: irq 33 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 33 > __irq_set_trigger: setting type, irq = 33, flags = 8 > ipic_set_irq_type function, with virq = 33, flow = 8 > irq: irq 34 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 34 > __irq_set_trigger: setting type, irq = 34, flags = 8 > ipic_set_irq_type function, with virq = 34, flow = 8 > eth0: Gianfar Ethernet Controller Version 1.2, 04:00:00:00:00:0a > eth0: Running with NAPI enabled > eth0: RX BD ring size for Q[0]: 256 > eth0: TX BD ring size for Q[0]: 256 > irq: irq 35 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 35 > __irq_set_trigger: setting type, irq = 35, flags = 8 > ipic_set_irq_type function, with virq = 35, flow = 8 > irq: irq 36 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 36 > __irq_set_trigger: setting type, irq = 36, flags = 8 > ipic_set_irq_type function, with virq = 36, flow = 8 > irq: irq 37 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 37 > __irq_set_trigger: setting type, irq = 37, flags = 8 > ipic_set_irq_type function, with virq = 37, flow = 8 > eth1: Gianfar Ethernet Controller Version 1.2, 00:00:00:00:00:00 > eth1: Running with NAPI enabled > eth1: RX BD ring size for Q[0]: 256 > eth1: TX BD ring size for Q[0]: 256 > ucc_geth: QE UCC Gigabit Ethernet Controller > Freescale PowerQUICC MII Bus: probed > irq: irq 17 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 20 > __irq_set_trigger: setting type, irq = 20, flags = 8 > ipic_set_irq_type function, with virq = 20, flow = 8 > Freescale PowerQUICC MII Bus: probed > mice: PS/2 mouse device common for all mice > Skipping unavailable LED gpio -19 (pwr) > Skipping unavailable LED gpio -19 (hdd) > TCP cubic registered > NET: Registered protocol family 17 > registered taskstats version 1 > drivers/rtc/hctosys.c: unable to open rtc device (rtc0) > RAMDISK: gzip image found at block 0 > VFS: Mounted root (ext2 filesystem) on device 1:0. > Freeing unused kernel memory: 192k init > PHY: mdio@e0024520:02 - Link is Up - 10/Half > ================================================================ > > Regards > Ravi Gupta > ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: pci_request_regions() failure 2010-09-07 9:24 ` tiejun.chen @ 2010-09-08 9:29 ` Ravi Gupta 2010-09-09 9:55 ` tiejun.chen 0 siblings, 1 reply; 10+ messages in thread From: Ravi Gupta @ 2010-09-08 9:29 UTC (permalink / raw) To: tiejun.chen; +Cc: linuxppc-dev [-- Attachment #1: Type: text/plain, Size: 18787 bytes --] Hi Tiejun, Thanks for the reply. Your PCI device should be one virtual device so I think the above should be > as > we understood. You know 0x00000000 ~ 0x00003ffff should not be allowed to > reserved. > Can you explain a little more that what do you mean by "Your PCI device should be one virtual device"? > I think you should do the following sequence in the probe function of your > PCI > driver. > > 1. pci_enable_device(pdev); > 2. pci_request_regions(pdev, DRV_NAME); > 3. pci_set_master(pdev); > ...... > > Okay, I have changed my drive code to follow this sequence, but still no success. It fails with the same errors as before. # insmod ./pci_skel.ko PCI driver: Init function PCI driver: Probe function pci_skel 0001:02:00.0: device not available (can't reserve [mem 0x00000000-0x0003ffff]) Unable to Enable PCI device:-22 pci_skel: probe of 0001:02:00.0 failed with error -22 Looks we need some pci_fixup to modify them. Firstly I think you'd better > 'zero' > all BARs of your PCI device on the function, pci_scan_device, on the file, > drivers/pci/probe.c. On there you can dedicate that once your device is > probed. > Please check the each BAR's value again after the above fix. > > Okay, I have set the BARs with all zeros in the pci_scan_device() function. Below is the diff of the changes done by me. --- /data/sources/linux-2.6.35/drivers/pci/probe.c 2010-08-02 03:41:14.000000000 +0530 +++ probe.c 2010-09-08 14:45:40.000000000 +0530 @@ -1172,6 +1172,45 @@ static struct pci_dev *pci_scan_device(s } } + printk(KERN_WARNING "pci : vendor id = 0x%x\n", l & 0xffff); + if ((l & 0xffff) == 0x1204) { + /* zero's all BAR registers */ + printk(KERN_WARNING "pci %04x:%02x:%02x.%d: trying to set all zeros in " + "BARs\n", pci_domain_nr(bus), + bus->number, PCI_SLOT(devfn), + PCI_FUNC(devfn)); + + if(pci_bus_write_config_dword(bus, devfn, PCI_BASE_ADDRESS_0, 0x0) || + pci_bus_write_config_dword(bus, devfn, PCI_BASE_ADDRESS_1, 0x0) || + pci_bus_write_config_dword(bus, devfn, PCI_BASE_ADDRESS_2, 0x0) || + pci_bus_write_config_dword(bus, devfn, PCI_BASE_ADDRESS_3, 0x0) || + pci_bus_write_config_dword(bus, devfn, PCI_BASE_ADDRESS_4, 0x0) || + pci_bus_write_config_dword(bus, devfn, PCI_BASE_ADDRESS_5, 0x0)) { + + printk(KERN_WARNING "pci %04x:%02x:%02x.%d: failed to reset bits" + "of BARs\n", pci_domain_nr(bus), + bus->number, PCI_SLOT(devfn), + PCI_FUNC(devfn)); + return NULL; + } + } + dev = alloc_pci_dev(); if (!dev) return NULL; The difference I have seen in the dmesg is that the following two messages are not coming now. PCI: Cannot allocate resource region 0 of device 0001:02:00.0, will remap PCI: Cannot allocate resource region 1 of device 0001:02:00.0, will remap But my driver is still fails with the same error as before. I am attaching the new dmesg log. Dmesg with all BARs set to zero ================================================================ Using MPC837x RDB/WLAN machine description Initializing cgroup subsys cpuset Initializing cgroup subsys cpu Linux version 2.6.35 (okapi@okapi) (gcc version 4.2.3 (Sourcery G++ Lite 4.2-171)) #28 Wed Sep 8 13:20:27 IST 2010 Found initrd at 0xcf46c000:0xcf7b05b7 Found legacy serial port 0 for /immr@e0000000/serial@4500 mem=e0004500, taddr=e0004500, irq=0, clk=400000002, speed=0 Found legacy serial port 1 for /immr@e0000000/serial@4600 mem=e0004600, taddr=e0004600, irq=0, clk=400000002, speed=0 bootconsole [udbg0] enabled Found FSL PCI host bridge at 0x00000000e0008500. Firmware bus number: 0->0 PCI host bridge /pci@e0008500 (primary) ranges: MEM 0x0000000090000000..0x000000009fffffff -> 0x0000000090000000 MEM 0x0000000080000000..0x000000008fffffff -> 0x0000000080000000 Prefetch IO 0x00000000e0300000..0x00000000e03fffff -> 0x0000000000000000 No pci config register base in dev tree, using default Found FSL PCI host bridge at 0x00000000e0009000. Firmware bus number: 0->255 PCI host bridge /pcie@e0009000 ranges: MEM 0x00000000a8000000..0x00000000b7ffffff -> 0x00000000a8000000 IO 0x00000000b8000000..0x00000000b87fffff -> 0x0000000000000000 No pci config register base in dev tree, using default Found FSL PCI host bridge at 0x00000000e000a000. Firmware bus number: 0->255 PCI host bridge /pcie@e000a000 ranges: MEM 0x00000000c8000000..0x00000000d7ffffff -> 0x00000000c8000000 IO 0x00000000d8000000..0x00000000d87fffff -> 0x0000000000000000 Top of RAM: 0x10000000, Total RAM: 0x10000000 Memory hole size: 0MB Zone PFN ranges: DMA 0x00000000 -> 0x00010000 Normal empty HighMem empty Movable zone start PFN for each node early_node_map[1] active PFN ranges 0: 0x00000000 -> 0x00010000 On node 0 totalpages: 65536 free_area_init_node: node 0, pgdat c04265e8, node_mem_map c0800000 DMA zone: 512 pages used for memmap DMA zone: 0 pages reserved DMA zone: 65024 pages, LIFO batch:15 Built 1 zonelists in Zone order, mobility grouping on. Total pages: 65024 Kernel command line: root=/dev/ram ramdisk_size=120000 rw ip=10.20.50.230:10 .20.50.70:10.20.50.50:255.255.0.0:PowerQUICC:eth0:off console=ttyS0,115200 mtdparts=nand:4m(kernel),-(jffs2) PID hash table entries: 1024 (order: 0, 4096 bytes) Dentry cache hash table entries: 32768 (order: 5, 131072 bytes) Inode-cache hash table entries: 16384 (order: 4, 65536 bytes) High memory: 0k Memory: 249972k/262144k available (4064k kernel code, 12172k reserved, 244k data, 2187k bss, 188k init) Kernel virtual memory layout: * 0xfffcf000..0xfffff000 : fixmap * 0xff800000..0xffc00000 : highmem PTEs * 0xfe6f7000..0xff800000 : early ioremap * 0xd1000000..0xfe6f7000 : vmalloc & ioremap Hierarchical RCU implementation. RCU-based detection of stalled CPUs is disabled. Verbose stalled-CPUs detection is disabled. NR_IRQS:512 IPIC (128 IRQ sources) at d1000700 time_init: decrementer frequency = 100.000000 MHz time_init: processor frequency = 800.000004 MHz clocksource: timebase mult[2800000] shift[22] registered clockevent: decrementer mult[19999999] shift[32] cpu[0] Console: colour dummy device 80x25 pid_max: default: 32768 minimum: 301 Security Framework initialized SELinux: Disabled at boot. Mount-cache hash table entries: 512 Initializing cgroup subsys ns Initializing cgroup subsys cpuacct Initializing cgroup subsys devices NET: Registered protocol family 16 irq: irq 38 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 38 __irq_set_trigger: setting type, irq = 38, flags = 8 ipic_set_irq_type function, with virq = 38, flow = 8 irq: irq 74 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 74 __irq_set_trigger: setting type, irq = 74, flags = 8 ipic_set_irq_type function, with virq = 74, flow = 8 irq: irq 75 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 75 __irq_set_trigger: setting type, irq = 75, flags = 8 ipic_set_irq_type function, with virq = 75, flow = 8 PCI: Probing PCI hardware PCI: Scanning PHB /pci@e0008500 PCI: PHB IO resource = 0000000000000000-00000000000fffff [100] PCI: PHB MEM resource 0 = 0000000090000000-000000009fffffff [200] PCI: PHB MEM resource 1 = 0000000080000000-000000008fffffff [2200] PCI: PHB MEM offset = 0000000000000000 PCI: PHB IO offset = 00000000 probe mode: 0 pci_bus 0000:00: scanning bus pci : vendor id = 0x1957 pci 0000:00:00.0: found [1957:00c6] class 000b20 header type 00 pci 0000:00:00.0: reg 10: [mem 0x00000000-0x000fffff] pci 0000:00:00.0: reg 18: [mem 0x00000000-0x0fffffff 64bit pref] pci 0000:00:00.0: calling fixup_hide_host_resource_fsl+0x0/0x58 pci 0000:00:00.0: calling pcibios_fixup_resources+0x0/0x180 pci 0000:00:00.0: calling quirk_fsl_pcie_header+0x0/0x48 pci 0000:00:00.0: calling quirk_resource_alignment+0x0/0x1c0 pci 0000:00:00.0: supports D1 D2 pci 0000:00:00.0: PME# supported from D0 D1 D2 D3hot pci 0000:00:00.0: PME# disabled pci_bus 0000:00: fixups for bus PCI: Fixup bus devices 0 (PHB) PCI: Try to map irq for 0000:00:00.0... pci_bus 0000:00: bus scan returning with max=00 PCI: Scanning PHB /pcie@e0009000 PCI: PHB IO resource = 00000000ff7fe000-00000000ffffdfff [100] PCI: PHB MEM resource 0 = 00000000a8000000-00000000b7ffffff [200] PCI: PHB MEM offset = 0000000000000000 PCI: PHB IO offset = ff7fe000 probe mode: 0 pci_bus 0001:01: scanning bus pci : vendor id = 0x1957 pci 0001:01:00.0: found [1957:00c6] class 000b20 header type 01 pci 0001:01:00.0: ignoring class b20 (doesn't match header type 01) pci 0001:01:00.0: calling fixup_hide_host_resource_fsl+0x0/0x58 pci 0001:01:00.0: calling pcibios_fixup_resources+0x0/0x180 pci 0001:01:00.0: calling quirk_fsl_pcie_header+0x0/0x48 pci 0001:01:00.0: calling quirk_resource_alignment+0x0/0x1c0 pci 0001:01:00.0: supports D1 D2 pci 0001:01:00.0: PME# supported from D0 D1 D2 D3hot pci 0001:01:00.0: PME# disabled pci_bus 0001:01: fixups for bus PCI: Fixup bus devices 1 (PHB) PCI: Try to map irq for 0001:01:00.0... pci 0001:01:00.0: scanning [bus 01-ff] behind bridge, pass 0 pci 0001:01:00.0: bus configuration invalid, reconfiguring pci 0001:01:00.0: scanning [bus 00-00] behind bridge, pass 1 pci_bus 0001:02: scanning bus pci : vendor id = 0x1204 pci 0001:02:00.0: trying to set all zeros in BARs pci 0001:02:00.0: found [1204:e250] class 000000 header type 00 pci 0001:02:00.0: reg 10: [mem 0x00000000-0x0003ffff] pci 0001:02:00.0: reg 14: [mem 0x00000000-0x0003ffff] pci 0001:02:00.0: calling pcibios_fixup_resources+0x0/0x180 PCI:0001:02:00.0 Resource 0 0000000000000000-000000000003ffff [40200] is unassigned PCI:0001:02:00.0 Resource 1 0000000000000000-000000000003ffff [40200] is unassigned pci 0001:02:00.0: calling quirk_resource_alignment+0x0/0x1c0 pci_bus 0001:02: fixups for bus pci 0001:01:00.0: PCI bridge to [bus 02-ff] pci 0001:01:00.0: bridge window [io 0x0000-0x0000] (disabled) pci 0001:01:00.0: bridge window [mem 0x00000000-0x000fffff] (disabled) pci 0001:01:00.0: bridge window [mem 0x00000000-0x000fffff pref] (disabled) PCI: Fixup bus devices 2 (0001:01:00.0) PCI: Try to map irq for 0001:02:00.0... Got one, spec 2 cells (0x00000001 0x00000008...) on /immr@e0000000 /interrupt-controller@700 irq: irq 1 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 16 __irq_set_trigger: setting type, irq = 16, flags = 8 ipic_set_irq_type function, with virq = 16, flow = 8 Mapped to linux irq 16 pci_bus 0001:02: bus scan returning with max=02 pci_bus 0001:01: bus scan returning with max=02 PCI: Scanning PHB /pcie@e000a000 PCI: PHB IO resource = 00000000feffc000-00000000ff7fbfff [100] PCI: PHB MEM resource 0 = 00000000c8000000-00000000d7ffffff [200] PCI: PHB MEM offset = 0000000000000000 PCI: PHB IO offset = feffc000 probe mode: 0 pci_bus 0002:03: scanning bus pci_bus 0002:03: fixups for bus PCI: Fixup bus devices 3 (PHB) pci_bus 0002:03: bus scan returning with max=03 PCI->OF bus map: 0 -> 0 1 -> 0 3 -> 0 PCI: Allocating bus resources for 0000:00... PCI: PHB (bus 0) bridge rsrc 0: 0000000000000000-00000000000fffff [0x100], parent c03fe5a0 (PCI IO) PCI: PHB (bus 0) bridge rsrc 1: 0000000090000000-000000009fffffff [0x200], parent c03fe584 (PCI mem) PCI: PHB (bus 0) bridge rsrc 2: 0000000080000000-000000008fffffff [0x2200], parent c03fe584 (PCI mem) PCI: Allocating bus resources for 0001:01... PCI: PHB (bus 1) bridge rsrc 0: 00000000ff7fe000-00000000ffffdfff [0x100], parent c03fe5a0 (PCI IO) PCI: PHB (bus 1) bridge rsrc 1: 00000000a8000000-00000000b7ffffff [0x200], parent c03fe584 (PCI mem) PCI: Allocating bus resources for 0001:02... PCI: Allocating bus resources for 0002:03... PCI: PHB (bus 3) bridge rsrc 0: 00000000feffc000-00000000ff7fbfff [0x100], parent c03fe5a0 (PCI IO) PCI: PHB (bus 3) bridge rsrc 1: 00000000c8000000-00000000d7ffffff [0x200], parent c03fe584 (PCI mem) Reserving legacy ranges for domain 0000 Candidate legacy IO: [io 0x0000-0x0fff] hose mem offset: 0000000000000000 hose mem res: [mem 0x90000000-0x9fffffff] hose mem res: [mem 0x80000000-0x8fffffff pref] Reserving legacy ranges for domain 0001 Candidate legacy IO: [io 0xff7fe000-0xff7fefff] hose mem offset: 0000000000000000 hose mem res: [mem 0xa8000000-0xb7ffffff] Reserving legacy ranges for domain 0002 Candidate legacy IO: [io 0xfeffc000-0xfeffcfff] hose mem offset: 0000000000000000 hose mem res: [mem 0xc8000000-0xd7ffffff] PCI: Assigning unassigned resources... pci 0001:01:00.0: BAR 8: assigned [mem 0xa8000000-0xa80fffff] pci 0001:01:00.0: PCI bridge to [bus 02-02] pci 0001:01:00.0: bridge window [io disabled] pci 0001:01:00.0: bridge window [mem 0xa8000000-0xa80fffff] pci 0001:01:00.0: bridge window [mem pref disabled] pci_bus 0000:00: resource 0 [io 0x0000-0xfffff] pci_bus 0000:00: resource 1 [mem 0x90000000-0x9fffffff] pci_bus 0000:00: resource 2 [mem 0x80000000-0x8fffffff pref] pci_bus 0001:01: resource 0 [io 0xff7fe000-0xffffdfff] pci_bus 0001:01: resource 1 [mem 0xa8000000-0xb7ffffff] pci_bus 0001:02: resource 1 [mem 0xa8000000-0xa80fffff] pci_bus 0002:03: resource 0 [io 0xfeffc000-0xff7fbfff] pci_bus 0002:03: resource 1 [mem 0xc8000000-0xd7ffffff] Registering qe_ic with sysfs... Registering ipic with sysfs... bio: create slab <bio-0> at 0 vgaarb: loaded SCSI subsystem initialized Switching to clocksource timebase NET: Registered protocol family 2 IP route cache hash table entries: 2048 (order: 1, 8192 bytes) TCP established hash table entries: 8192 (order: 4, 65536 bytes) TCP bind hash table entries: 8192 (order: 3, 32768 bytes) TCP: Hash tables configured (established 8192 bind 8192) TCP reno registered UDP hash table entries: 256 (order: 0, 4096 bytes) UDP-Lite hash table entries: 256 (order: 0, 4096 bytes) NET: Registered protocol family 1 pci 0000:00:00.0: calling quirk_cardbus_legacy+0x0/0x44 pci 0000:00:00.0: calling quirk_usb_early_handoff+0x0/0x740 pci 0001:01:00.0: calling quirk_cardbus_legacy+0x0/0x44 pci 0001:01:00.0: calling quirk_usb_early_handoff+0x0/0x740 pci 0001:02:00.0: calling quirk_cardbus_legacy+0x0/0x44 pci 0001:02:00.0: calling quirk_usb_early_handoff+0x0/0x740 PCI: CLS 32 bytes, default 32 Trying to unpack rootfs image as initramfs... rootfs image is not initramfs (no cpio magic); looks like an initrd Freeing initrd memory: 3345k freed irq: irq 9 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 17 __irq_set_trigger: setting type, irq = 17, flags = 8 ipic_set_irq_type function, with virq = 17, flow = 8 irq: irq 10 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 18 __irq_set_trigger: setting type, irq = 18, flags = 8 ipic_set_irq_type function, with virq = 18, flow = 8 irq: irq 80 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 80 __irq_set_trigger: setting type, irq = 80, flags = 8 ipic_set_irq_type function, with virq = 80, flow = 8 audit: initializing netlink socket (disabled) type=2000 audit(0.212:1): initialized JFFS2 version 2.2. (NAND) © 2001-2006 Red Hat, Inc. SGI XFS with security attributes, large block/inode numbers, no debug enabled msgmni has been set to 494 alg: No test for cipher_null (cipher_null-generic) alg: No test for ecb(cipher_null) (ecb-cipher_null) alg: No test for digest_null (digest_null-generic) alg: No test for compress_null (compress_null-generic) alg: No test for stdrng (krng) Block layer SCSI generic (bsg) driver version 0.4 loaded (major 253) io scheduler noop registered io scheduler deadline registered io scheduler cfq registered (default) Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled serial8250.0: ttyS0 at MMIO 0xe0004500 (irq = 17) is a 16550A console [ttyS0] enabled, bootconsole disabled serial8250.0: ttyS1 at MMIO 0xe0004600 (irq = 18) is a 16550A brd: module loaded of_mpc8xxx_spi_probe function called. irq: irq 16 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 19 __irq_set_trigger: setting type, irq = 19, flags = 8 ipic_set_irq_type function, with virq = 19, flow = 8 mpc8xxx_spi_probe function called. mpc8xxx_spi e0007000.spi: at 0xd1078000 (irq = 19), CPU mode irq: irq 32 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 32 __irq_set_trigger: setting type, irq = 32, flags = 8 ipic_set_irq_type function, with virq = 32, flow = 8 irq: irq 33 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 33 __irq_set_trigger: setting type, irq = 33, flags = 8 ipic_set_irq_type function, with virq = 33, flow = 8 irq: irq 34 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 34 __irq_set_trigger: setting type, irq = 34, flags = 8 ipic_set_irq_type function, with virq = 34, flow = 8 eth0: Gianfar Ethernet Controller Version 1.2, 04:00:00:00:00:0a eth0: Running with NAPI enabled eth0: RX BD ring size for Q[0]: 256 eth0: TX BD ring size for Q[0]: 256 irq: irq 35 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 35 __irq_set_trigger: setting type, irq = 35, flags = 8 ipic_set_irq_type function, with virq = 35, flow = 8 irq: irq 36 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 36 __irq_set_trigger: setting type, irq = 36, flags = 8 ipic_set_irq_type function, with virq = 36, flow = 8 irq: irq 37 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 37 __irq_set_trigger: setting type, irq = 37, flags = 8 ipic_set_irq_type function, with virq = 37, flow = 8 eth1: Gianfar Ethernet Controller Version 1.2, 00:00:00:00:00:00 eth1: Running with NAPI enabled eth1: RX BD ring size for Q[0]: 256 eth1: TX BD ring size for Q[0]: 256 ucc_geth: QE UCC Gigabit Ethernet Controller Freescale PowerQUICC MII Bus: probed irq: irq 17 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 20 __irq_set_trigger: setting type, irq = 20, flags = 8 ipic_set_irq_type function, with virq = 20, flow = 8 Freescale PowerQUICC MII Bus: probed mice: PS/2 mouse device common for all mice Skipping unavailable LED gpio -19 (pwr) Skipping unavailable LED gpio -19 (hdd) TCP cubic registered NET: Registered protocol family 17 registered taskstats version 1 drivers/rtc/hctosys.c: unable to open rtc device (rtc0) RAMDISK: gzip image found at block 0 VFS: Mounted root (ext2 filesystem) on device 1:0. Freeing unused kernel memory: 188k init PHY: mdio@e0024520:02 - Link is Up - 10/Half ================================================================ Regards, Ravi [-- Attachment #2: Type: text/html, Size: 20382 bytes --] ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: pci_request_regions() failure 2010-09-08 9:29 ` Ravi Gupta @ 2010-09-09 9:55 ` tiejun.chen 2010-09-09 12:37 ` Ravi Gupta 0 siblings, 1 reply; 10+ messages in thread From: tiejun.chen @ 2010-09-09 9:55 UTC (permalink / raw) To: Ravi Gupta; +Cc: linuxppc-dev Ravi Gupta wrote: > Hi Tiejun, > > Thanks for the reply. > > > Your PCI device should be one virtual device so I think the above should be >> as >> we understood. You know 0x00000000 ~ 0x00003ffff should not be allowed to >> reserved. >> > > Can you explain a little more that what do you mean by "Your PCI device > should be one virtual device"? I means your PCI example from LDD3. That is only emulated for configure space. No BARs, no irq, ...... > > >> I think you should do the following sequence in the probe function of your >> PCI >> driver. >> >> 1. pci_enable_device(pdev); >> 2. pci_request_regions(pdev, DRV_NAME); >> 3. pci_set_master(pdev); >> ...... >> >> Okay, I have changed my drive code to follow this sequence, but still no > success. It fails with the same errors as before. I means you do this on your real PCI device driver. When you fix my comments in below, try to update this on your PCI device e250 again. > > # insmod ./pci_skel.ko > PCI driver: Init function > PCI driver: Probe function > pci_skel 0001:02:00.0: device not available (can't reserve [mem > 0x00000000-0x0003ffff]) > Unable to Enable PCI device:-22 > pci_skel: probe of 0001:02:00.0 failed with error -22 > > Looks we need some pci_fixup to modify them. Firstly I think you'd better >> 'zero' >> all BARs of your PCI device on the function, pci_scan_device, on the file, >> drivers/pci/probe.c. On there you can dedicate that once your device is >> probed. >> Please check the each BAR's value again after the above fix. >> >> > Okay, I have set the BARs with all zeros in the pci_scan_device() function. > Below is the diff of the changes done by me. > > --- /data/sources/linux-2.6.35/drivers/pci/probe.c 2010-08-02 > 03:41:14.000000000 +0530 > +++ probe.c 2010-09-08 14:45:40.000000000 +0530 > @@ -1172,6 +1172,45 @@ static struct pci_dev *pci_scan_device(s > } > } > > + printk(KERN_WARNING "pci : vendor id = 0x%x\n", l & 0xffff); > + if ((l & 0xffff) == 0x1204) { > + /* zero's all BAR registers */ > + printk(KERN_WARNING "pci %04x:%02x:%02x.%d: trying to set all zeros in " > + "BARs\n", pci_domain_nr(bus), > + bus->number, PCI_SLOT(devfn), > + PCI_FUNC(devfn)); > + > + if(pci_bus_write_config_dword(bus, devfn, PCI_BASE_ADDRESS_0, 0x0) || > + pci_bus_write_config_dword(bus, devfn, PCI_BASE_ADDRESS_1, 0x0) || > + pci_bus_write_config_dword(bus, devfn, PCI_BASE_ADDRESS_2, 0x0) || > + pci_bus_write_config_dword(bus, devfn, PCI_BASE_ADDRESS_3, 0x0) || > + pci_bus_write_config_dword(bus, devfn, PCI_BASE_ADDRESS_4, 0x0) || > + pci_bus_write_config_dword(bus, devfn, PCI_BASE_ADDRESS_5, 0x0)) { > + > + printk(KERN_WARNING "pci %04x:%02x:%02x.%d: failed to reset bits" > + "of BARs\n", pci_domain_nr(bus), > + bus->number, PCI_SLOT(devfn), > + PCI_FUNC(devfn)); > + return NULL; > + } > + } > + > dev = alloc_pci_dev(); > if (!dev) > return NULL; > > The difference I have seen in the dmesg is that the following two messages > are not coming now. > > PCI: Cannot allocate resource region 0 of device 0001:02:00.0, will remap > PCI: Cannot allocate resource region 1 of device 0001:02:00.0, will remap Good. > > But my driver is still fails with the same error as before. I am attaching > the new dmesg log. > > Dmesg with all BARs set to zero > ================================================================ > Using MPC837x RDB/WLAN machine description > Initializing cgroup subsys cpuset > Initializing cgroup subsys cpu > Linux version 2.6.35 (okapi@okapi) (gcc version 4.2.3 (Sourcery G++ Lite > 4.2-171)) #28 Wed Sep 8 13:20:27 IST 2010 > Found initrd at 0xcf46c000:0xcf7b05b7 > Found legacy serial port 0 for /immr@e0000000/serial@4500 > mem=e0004500, taddr=e0004500, irq=0, clk=400000002, speed=0 > Found legacy serial port 1 for /immr@e0000000/serial@4600 > mem=e0004600, taddr=e0004600, irq=0, clk=400000002, speed=0 > bootconsole [udbg0] enabled > Found FSL PCI host bridge at 0x00000000e0008500. Firmware bus number: 0->0 > PCI host bridge /pci@e0008500 (primary) ranges: > MEM 0x0000000090000000..0x000000009fffffff -> 0x0000000090000000 > MEM 0x0000000080000000..0x000000008fffffff -> 0x0000000080000000 Prefetch > IO 0x00000000e0300000..0x00000000e03fffff -> 0x0000000000000000 > No pci config register base in dev tree, using default > Found FSL PCI host bridge at 0x00000000e0009000. Firmware bus number: 0->255 > PCI host bridge /pcie@e0009000 ranges: > MEM 0x00000000a8000000..0x00000000b7ffffff -> 0x00000000a8000000 > IO 0x00000000b8000000..0x00000000b87fffff -> 0x0000000000000000 > No pci config register base in dev tree, using default > Found FSL PCI host bridge at 0x00000000e000a000. Firmware bus number: 0->255 > PCI host bridge /pcie@e000a000 ranges: > MEM 0x00000000c8000000..0x00000000d7ffffff -> 0x00000000c8000000 > IO 0x00000000d8000000..0x00000000d87fffff -> 0x0000000000000000 > Top of RAM: 0x10000000, Total RAM: 0x10000000 > Memory hole size: 0MB > Zone PFN ranges: > DMA 0x00000000 -> 0x00010000 > Normal empty > HighMem empty > Movable zone start PFN for each node > early_node_map[1] active PFN ranges > 0: 0x00000000 -> 0x00010000 > On node 0 totalpages: 65536 > free_area_init_node: node 0, pgdat c04265e8, node_mem_map c0800000 > DMA zone: 512 pages used for memmap > DMA zone: 0 pages reserved > DMA zone: 65024 pages, LIFO batch:15 > Built 1 zonelists in Zone order, mobility grouping on. Total pages: 65024 > Kernel command line: root=/dev/ram ramdisk_size=120000 rw ip=10.20.50.230:10 > .20.50.70:10.20.50.50:255.255.0.0:PowerQUICC:eth0:off console=ttyS0,115200 > mtdparts=nand:4m(kernel),-(jffs2) > PID hash table entries: 1024 (order: 0, 4096 bytes) > Dentry cache hash table entries: 32768 (order: 5, 131072 bytes) > Inode-cache hash table entries: 16384 (order: 4, 65536 bytes) > High memory: 0k > Memory: 249972k/262144k available (4064k kernel code, 12172k reserved, 244k > data, 2187k bss, 188k init) > Kernel virtual memory layout: > * 0xfffcf000..0xfffff000 : fixmap > * 0xff800000..0xffc00000 : highmem PTEs > * 0xfe6f7000..0xff800000 : early ioremap > * 0xd1000000..0xfe6f7000 : vmalloc & ioremap > Hierarchical RCU implementation. > RCU-based detection of stalled CPUs is disabled. > Verbose stalled-CPUs detection is disabled. > NR_IRQS:512 > IPIC (128 IRQ sources) at d1000700 > time_init: decrementer frequency = 100.000000 MHz > time_init: processor frequency = 800.000004 MHz > clocksource: timebase mult[2800000] shift[22] registered > clockevent: decrementer mult[19999999] shift[32] cpu[0] > Console: colour dummy device 80x25 > pid_max: default: 32768 minimum: 301 > Security Framework initialized > SELinux: Disabled at boot. > Mount-cache hash table entries: 512 > Initializing cgroup subsys ns > Initializing cgroup subsys cpuacct > Initializing cgroup subsys devices > NET: Registered protocol family 16 > irq: irq 38 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 38 > __irq_set_trigger: setting type, irq = 38, flags = 8 > ipic_set_irq_type function, with virq = 38, flow = 8 > irq: irq 74 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 74 > __irq_set_trigger: setting type, irq = 74, flags = 8 > ipic_set_irq_type function, with virq = 74, flow = 8 > irq: irq 75 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 75 > __irq_set_trigger: setting type, irq = 75, flags = 8 > ipic_set_irq_type function, with virq = 75, flow = 8 > PCI: Probing PCI hardware > PCI: Scanning PHB /pci@e0008500 > PCI: PHB IO resource = 0000000000000000-00000000000fffff [100] > PCI: PHB MEM resource 0 = 0000000090000000-000000009fffffff [200] > PCI: PHB MEM resource 1 = 0000000080000000-000000008fffffff [2200] > PCI: PHB MEM offset = 0000000000000000 > PCI: PHB IO offset = 00000000 > probe mode: 0 > pci_bus 0000:00: scanning bus > pci : vendor id = 0x1957 > pci 0000:00:00.0: found [1957:00c6] class 000b20 header type 00 > pci 0000:00:00.0: reg 10: [mem 0x00000000-0x000fffff] > pci 0000:00:00.0: reg 18: [mem 0x00000000-0x0fffffff 64bit pref] > pci 0000:00:00.0: calling fixup_hide_host_resource_fsl+0x0/0x58 > pci 0000:00:00.0: calling pcibios_fixup_resources+0x0/0x180 > pci 0000:00:00.0: calling quirk_fsl_pcie_header+0x0/0x48 > pci 0000:00:00.0: calling quirk_resource_alignment+0x0/0x1c0 > pci 0000:00:00.0: supports D1 D2 > pci 0000:00:00.0: PME# supported from D0 D1 D2 D3hot > pci 0000:00:00.0: PME# disabled > pci_bus 0000:00: fixups for bus > PCI: Fixup bus devices 0 (PHB) > PCI: Try to map irq for 0000:00:00.0... > pci_bus 0000:00: bus scan returning with max=00 > PCI: Scanning PHB /pcie@e0009000 > PCI: PHB IO resource = 00000000ff7fe000-00000000ffffdfff [100] > PCI: PHB MEM resource 0 = 00000000a8000000-00000000b7ffffff [200] > PCI: PHB MEM offset = 0000000000000000 > PCI: PHB IO offset = ff7fe000 > probe mode: 0 > pci_bus 0001:01: scanning bus > pci : vendor id = 0x1957 > pci 0001:01:00.0: found [1957:00c6] class 000b20 header type 01 > pci 0001:01:00.0: ignoring class b20 (doesn't match header type 01) > pci 0001:01:00.0: calling fixup_hide_host_resource_fsl+0x0/0x58 > pci 0001:01:00.0: calling pcibios_fixup_resources+0x0/0x180 > pci 0001:01:00.0: calling quirk_fsl_pcie_header+0x0/0x48 > pci 0001:01:00.0: calling quirk_resource_alignment+0x0/0x1c0 > pci 0001:01:00.0: supports D1 D2 > pci 0001:01:00.0: PME# supported from D0 D1 D2 D3hot > pci 0001:01:00.0: PME# disabled > pci_bus 0001:01: fixups for bus > PCI: Fixup bus devices 1 (PHB) > PCI: Try to map irq for 0001:01:00.0... > pci 0001:01:00.0: scanning [bus 01-ff] behind bridge, pass 0 > pci 0001:01:00.0: bus configuration invalid, reconfiguring > pci 0001:01:00.0: scanning [bus 00-00] behind bridge, pass 1 > pci_bus 0001:02: scanning bus > pci : vendor id = 0x1204 > pci 0001:02:00.0: trying to set all zeros in BARs > pci 0001:02:00.0: found [1204:e250] class 000000 header type 00 > pci 0001:02:00.0: reg 10: [mem 0x00000000-0x0003ffff] > pci 0001:02:00.0: reg 14: [mem 0x00000000-0x0003ffff] Looks BAR0 and BAR1 are used for your PCI device. So if normal, the memory range of your PCI device will be [mem 0xa8000000-0xa803ffff] and [mem 0xa8040000-0xa807ffff] as we pexpect. You can print this pci_resource_start(pdev, bar), pci_resource_len(pdev, bar) from the function, __pci_request_region, on the file drivers/pci/pci.c. Please check this as well. > pci 0001:02:00.0: calling pcibios_fixup_resources+0x0/0x180 > PCI:0001:02:00.0 Resource 0 0000000000000000-000000000003ffff [40200] is > unassigned > PCI:0001:02:00.0 Resource 1 0000000000000000-000000000003ffff [40200] is > unassigned > pci 0001:02:00.0: calling quirk_resource_alignment+0x0/0x1c0 > pci_bus 0001:02: fixups for bus > pci 0001:01:00.0: PCI bridge to [bus 02-ff] > pci 0001:01:00.0: bridge window [io 0x0000-0x0000] (disabled) > pci 0001:01:00.0: bridge window [mem 0x00000000-0x000fffff] (disabled) > pci 0001:01:00.0: bridge window [mem 0x00000000-0x000fffff pref] Omm. Often we always disable this pref windows so please disable this window. Try use the following ways to clear PCI_PREF_MEMORY_BASE and PCI_PREF_MEMORY_LIMIT. ------ pci_write_config_word(dev, PCI_PREF_MEMORY_BASE, 0); pci_write_config_word(dev, PCI_PREF_MEMORY_LIMIT, 0); > (disabled) > PCI: Fixup bus devices 2 (0001:01:00.0) > PCI: Try to map irq for 0001:02:00.0... > Got one, spec 2 cells (0x00000001 0x00000008...) on /immr@e0000000 > /interrupt-controller@700 > irq: irq 1 on host /immr@e0000000/interrupt-controller@700 mapped to virtual > irq 16 > __irq_set_trigger: setting type, irq = 16, flags = 8 > ipic_set_irq_type function, with virq = 16, flow = 8 > Mapped to linux irq 16 > pci_bus 0001:02: bus scan returning with max=02 > pci_bus 0001:01: bus scan returning with max=02 > PCI: Scanning PHB /pcie@e000a000 > PCI: PHB IO resource = 00000000feffc000-00000000ff7fbfff [100] > PCI: PHB MEM resource 0 = 00000000c8000000-00000000d7ffffff [200] > PCI: PHB MEM offset = 0000000000000000 > PCI: PHB IO offset = feffc000 > probe mode: 0 > pci_bus 0002:03: scanning bus > pci_bus 0002:03: fixups for bus > PCI: Fixup bus devices 3 (PHB) > pci_bus 0002:03: bus scan returning with max=03 > PCI->OF bus map: > 0 -> 0 > 1 -> 0 > 3 -> 0 > PCI: Allocating bus resources for 0000:00... > PCI: PHB (bus 0) bridge rsrc 0: 0000000000000000-00000000000fffff [0x100], > parent c03fe5a0 (PCI IO) > PCI: PHB (bus 0) bridge rsrc 1: 0000000090000000-000000009fffffff [0x200], > parent c03fe584 (PCI mem) > PCI: PHB (bus 0) bridge rsrc 2: 0000000080000000-000000008fffffff [0x2200], > parent c03fe584 (PCI mem) > PCI: Allocating bus resources for 0001:01... > PCI: PHB (bus 1) bridge rsrc 0: 00000000ff7fe000-00000000ffffdfff [0x100], > parent c03fe5a0 (PCI IO) > PCI: PHB (bus 1) bridge rsrc 1: 00000000a8000000-00000000b7ffffff [0x200], > parent c03fe584 (PCI mem) > PCI: Allocating bus resources for 0001:02... > PCI: Allocating bus resources for 0002:03... > PCI: PHB (bus 3) bridge rsrc 0: 00000000feffc000-00000000ff7fbfff [0x100], > parent c03fe5a0 (PCI IO) > PCI: PHB (bus 3) bridge rsrc 1: 00000000c8000000-00000000d7ffffff [0x200], > parent c03fe584 (PCI mem) > Reserving legacy ranges for domain 0000 > Candidate legacy IO: [io 0x0000-0x0fff] > hose mem offset: 0000000000000000 > hose mem res: [mem 0x90000000-0x9fffffff] > hose mem res: [mem 0x80000000-0x8fffffff pref] > Reserving legacy ranges for domain 0001 > Candidate legacy IO: [io 0xff7fe000-0xff7fefff] > hose mem offset: 0000000000000000 > hose mem res: [mem 0xa8000000-0xb7ffffff] > Reserving legacy ranges for domain 0002 > Candidate legacy IO: [io 0xfeffc000-0xfeffcfff] > hose mem offset: 0000000000000000 > hose mem res: [mem 0xc8000000-0xd7ffffff] > PCI: Assigning unassigned resources... > pci 0001:01:00.0: BAR 8: assigned [mem 0xa8000000-0xa80fffff] When you disable that pref window I think everything should be good since it's not allowed to allocate a non-prefetching resource from a pre-fetching area and the kernel can't assign mem pref (size 0x100000). And here your pci devie will be assigned as [mem 0xa8000000-0xa803ffff] and [mem 0xa8040000-0xa807ffff] for BAR0 & BAR1. > pci 0001:01:00.0: PCI bridge to [bus 02-02] > pci 0001:01:00.0: bridge window [io disabled] > pci 0001:01:00.0: bridge window [mem 0xa8000000-0xa80fffff] Now the above window will be allocate as PCI bus resource 0xa8000000 ~ 0xb7ffffff. > pci 0001:01:00.0: bridge window [mem pref disabled] > pci_bus 0000:00: resource 0 [io 0x0000-0xfffff] > pci_bus 0000:00: resource 1 [mem 0x90000000-0x9fffffff] > pci_bus 0000:00: resource 2 [mem 0x80000000-0x8fffffff pref] > pci_bus 0001:01: resource 0 [io 0xff7fe000-0xffffdfff] > pci_bus 0001:01: resource 1 [mem 0xa8000000-0xb7ffffff] > pci_bus 0001:02: resource 1 [mem 0xa8000000-0xa80fffff] If you can do the above assign resource correctly, I think this should be same as 0001:01 [mem 0xa8000000-0xb7ffffff] since they are in same PCI domain 0001. As the secondary bus within the PCI domain 0001, 02 should have full range from its parent bus because there is only one bus/device on the 02 bus level. As a summary your issue should be the bootloader and looks your bootloader don't initial an appropriate state for PCIE controller. Best Reards Tiejun > pci_bus 0002:03: resource 0 [io 0xfeffc000-0xff7fbfff] > pci_bus 0002:03: resource 1 [mem 0xc8000000-0xd7ffffff] > Registering qe_ic with sysfs... > Registering ipic with sysfs... > bio: create slab <bio-0> at 0 > vgaarb: loaded > SCSI subsystem initialized > Switching to clocksource timebase > NET: Registered protocol family 2 > IP route cache hash table entries: 2048 (order: 1, 8192 bytes) > TCP established hash table entries: 8192 (order: 4, 65536 bytes) > TCP bind hash table entries: 8192 (order: 3, 32768 bytes) > TCP: Hash tables configured (established 8192 bind 8192) > TCP reno registered > UDP hash table entries: 256 (order: 0, 4096 bytes) > UDP-Lite hash table entries: 256 (order: 0, 4096 bytes) > NET: Registered protocol family 1 > pci 0000:00:00.0: calling quirk_cardbus_legacy+0x0/0x44 > pci 0000:00:00.0: calling quirk_usb_early_handoff+0x0/0x740 > pci 0001:01:00.0: calling quirk_cardbus_legacy+0x0/0x44 > pci 0001:01:00.0: calling quirk_usb_early_handoff+0x0/0x740 > pci 0001:02:00.0: calling quirk_cardbus_legacy+0x0/0x44 > pci 0001:02:00.0: calling quirk_usb_early_handoff+0x0/0x740 > PCI: CLS 32 bytes, default 32 > Trying to unpack rootfs image as initramfs... > rootfs image is not initramfs (no cpio magic); looks like an initrd > Freeing initrd memory: 3345k freed > irq: irq 9 on host /immr@e0000000/interrupt-controller@700 mapped to virtual > irq 17 > __irq_set_trigger: setting type, irq = 17, flags = 8 > ipic_set_irq_type function, with virq = 17, flow = 8 > irq: irq 10 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 18 > __irq_set_trigger: setting type, irq = 18, flags = 8 > ipic_set_irq_type function, with virq = 18, flow = 8 > irq: irq 80 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 80 > __irq_set_trigger: setting type, irq = 80, flags = 8 > ipic_set_irq_type function, with virq = 80, flow = 8 > audit: initializing netlink socket (disabled) > type=2000 audit(0.212:1): initialized > JFFS2 version 2.2. (NAND) � 2001-2006 Red Hat, Inc. > SGI XFS with security attributes, large block/inode numbers, no debug > enabled > msgmni has been set to 494 > alg: No test for cipher_null (cipher_null-generic) > alg: No test for ecb(cipher_null) (ecb-cipher_null) > alg: No test for digest_null (digest_null-generic) > alg: No test for compress_null (compress_null-generic) > alg: No test for stdrng (krng) > Block layer SCSI generic (bsg) driver version 0.4 loaded (major 253) > io scheduler noop registered > io scheduler deadline registered > io scheduler cfq registered (default) > Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled > serial8250.0: ttyS0 at MMIO 0xe0004500 (irq = 17) is a 16550A > console [ttyS0] enabled, bootconsole disabled > serial8250.0: ttyS1 at MMIO 0xe0004600 (irq = 18) is a 16550A > brd: module loaded > of_mpc8xxx_spi_probe function called. > irq: irq 16 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 19 > __irq_set_trigger: setting type, irq = 19, flags = 8 > ipic_set_irq_type function, with virq = 19, flow = 8 > mpc8xxx_spi_probe function called. > mpc8xxx_spi e0007000.spi: at 0xd1078000 (irq = 19), CPU mode > irq: irq 32 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 32 > __irq_set_trigger: setting type, irq = 32, flags = 8 > ipic_set_irq_type function, with virq = 32, flow = 8 > irq: irq 33 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 33 > __irq_set_trigger: setting type, irq = 33, flags = 8 > ipic_set_irq_type function, with virq = 33, flow = 8 > irq: irq 34 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 34 > __irq_set_trigger: setting type, irq = 34, flags = 8 > ipic_set_irq_type function, with virq = 34, flow = 8 > eth0: Gianfar Ethernet Controller Version 1.2, 04:00:00:00:00:0a > eth0: Running with NAPI enabled > eth0: RX BD ring size for Q[0]: 256 > eth0: TX BD ring size for Q[0]: 256 > irq: irq 35 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 35 > __irq_set_trigger: setting type, irq = 35, flags = 8 > ipic_set_irq_type function, with virq = 35, flow = 8 > irq: irq 36 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 36 > __irq_set_trigger: setting type, irq = 36, flags = 8 > ipic_set_irq_type function, with virq = 36, flow = 8 > irq: irq 37 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 37 > __irq_set_trigger: setting type, irq = 37, flags = 8 > ipic_set_irq_type function, with virq = 37, flow = 8 > eth1: Gianfar Ethernet Controller Version 1.2, 00:00:00:00:00:00 > eth1: Running with NAPI enabled > eth1: RX BD ring size for Q[0]: 256 > eth1: TX BD ring size for Q[0]: 256 > ucc_geth: QE UCC Gigabit Ethernet Controller > Freescale PowerQUICC MII Bus: probed > irq: irq 17 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 20 > __irq_set_trigger: setting type, irq = 20, flags = 8 > ipic_set_irq_type function, with virq = 20, flow = 8 > Freescale PowerQUICC MII Bus: probed > mice: PS/2 mouse device common for all mice > Skipping unavailable LED gpio -19 (pwr) > Skipping unavailable LED gpio -19 (hdd) > TCP cubic registered > NET: Registered protocol family 17 > registered taskstats version 1 > drivers/rtc/hctosys.c: unable to open rtc device (rtc0) > RAMDISK: gzip image found at block 0 > VFS: Mounted root (ext2 filesystem) on device 1:0. > Freeing unused kernel memory: 188k init > PHY: mdio@e0024520:02 - Link is Up - 10/Half > ================================================================ > > Regards, > Ravi > > > > ------------------------------------------------------------------------ > > _______________________________________________ > Linuxppc-dev mailing list > Linuxppc-dev@lists.ozlabs.org > https://lists.ozlabs.org/listinfo/linuxppc-dev ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: pci_request_regions() failure 2010-09-09 9:55 ` tiejun.chen @ 2010-09-09 12:37 ` Ravi Gupta 2010-09-10 5:23 ` tiejun.chen 0 siblings, 1 reply; 10+ messages in thread From: Ravi Gupta @ 2010-09-09 12:37 UTC (permalink / raw) To: tiejun.chen; +Cc: linuxppc-dev [-- Attachment #1: Type: text/plain, Size: 1284 bytes --] Hi Tiejun, Thanks for the reply. Omm. > > Often we always disable this pref windows so please disable this window. > Try use > the following ways to clear PCI_PREF_MEMORY_BASE and PCI_PREF_MEMORY_LIMIT. > ------ > pci_write_config_word(dev, PCI_PREF_MEMORY_BASE, 0); > pci_write_config_word(dev, PCI_PREF_MEMORY_LIMIT, 0); > > I have a little confusion about what you said. You said I should disable prefetched window corresponds to PCI Bridge to [bus 02-ff], the dmesgs shows that it is already disabled. pci 0001:01:00.0: PCI bridge to [bus 02-ff] pci 0001:01:00.0: bridge window [io 0x0000-0x0000] (disabled) pci 0001:01:00.0: bridge window [mem 0x00000000-0x000fffff] (disabled) *pci 0001:01:00.0: bridge window [mem 0x00000000-0x000fffff pref] (disabled)* Is it something that I am not getting right or you have miss read something? If it is problem with me, then what should be the O/P in case when I disable the prefetch window (by issuing pci_write_config_word(dev, PCI_PREF_MEMORY_BASE, 0); and pci_write_config_word(dev, PCI_PREF_MEMORY_LIMIT, 0); function calls)? And also, I will be really thankful to you if you also tell me the function in which I should place there function calls as I am new to linux device driver programming. Regards, Ravi [-- Attachment #2: Type: text/html, Size: 1638 bytes --] ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: pci_request_regions() failure 2010-09-09 12:37 ` Ravi Gupta @ 2010-09-10 5:23 ` tiejun.chen 2010-09-13 9:04 ` Ravi Gupta 0 siblings, 1 reply; 10+ messages in thread From: tiejun.chen @ 2010-09-10 5:23 UTC (permalink / raw) To: Ravi Gupta; +Cc: linuxppc-dev Ravi Gupta wrote: > Hi Tiejun, > > Thanks for the reply. > > Omm. >> Often we always disable this pref windows so please disable this window. >> Try use >> the following ways to clear PCI_PREF_MEMORY_BASE and PCI_PREF_MEMORY_LIMIT. >> ------ >> pci_write_config_word(dev, PCI_PREF_MEMORY_BASE, 0); >> pci_write_config_word(dev, PCI_PREF_MEMORY_LIMIT, 0); >> >> > I have a little confusion about what you said. You said I should disable > prefetched window corresponds to PCI Bridge to [bus 02-ff], the dmesgs shows > that it is already disabled. > > pci 0001:01:00.0: PCI bridge to [bus 02-ff] > pci 0001:01:00.0: bridge window [io 0x0000-0x0000] (disabled) > pci 0001:01:00.0: bridge window [mem 0x00000000-0x000fffff] (disabled) > *pci 0001:01:00.0: bridge window [mem 0x00000000-0x000fffff pref] > (disabled)* Sorry I miss this line. > > Is it something that I am not getting right or you have miss read something? > If it is problem with me, then what should be the O/P in case when I disable > the prefetch window (by issuing pci_write_config_word(dev, > PCI_PREF_MEMORY_BASE, 0); and pci_write_config_word(dev, > PCI_PREF_MEMORY_LIMIT, 0); function calls)? And also, I will be really > thankful to you if you also tell me the function in which I should place > there function calls as I am new to linux device driver programming. Firstly I think we'd better print the BAR0 and BAR1 on the probe function of your device driver because you have to make sure if a8000000-a803ffff is assigned to BAR0 and 0xa8040000-0xa807ffff for BAR1 as we expect. u32 value; pci_read_config_word(pdev, PCI_BASE_ADDRESS_0, &value); printk... pci_read_config_word(pdev, PCI_BASE_ADDRESS_1, &value); printk.... And you can print this pci_resource_start(pdev, bar), pci_resource_len(pdev, bar) from the function, __pci_request_region, on the file drivers/pci/pci.c. Please check this as well. And currently we have to debug this so on the function, __pci_assign_resource, from the file drivers/pci/setup-res.c, we can force skipping temporarily pci_bus_alloc_resource for bus 0001:01 since that will call pci_update_resource for bus 0001:01. static int __pci_assign_resource(struct pci_bus *bus, struct pci_dev *dev, int resno) { struct resource *res = dev->resource + resno; resource_size_t size, min, align; int ret; size = resource_size(res); min = (res->flags & IORESOURCE_IO) ? PCIBIOS_MIN_IO : PCIBIOS_MIN_MEM; align = pci_resource_alignment(dev, res); ------- if (bus->number == 0x01) { ret = -ENOMEM return ret; } ------- I means we don't want to assign resource as the below line on the log. ------ pci 0001:01:00.0: BAR 8: assigned [mem 0xa8000000-0xa80fffff] I expect the following output: ------ pci 0001:01:00.0: BAR 8: can't assign mem pref (size 0x100000) Best Regards Tiejun > > Regards, > Ravi > > > > ------------------------------------------------------------------------ > > _______________________________________________ > Linuxppc-dev mailing list > Linuxppc-dev@lists.ozlabs.org > https://lists.ozlabs.org/listinfo/linuxppc-dev ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: pci_request_regions() failure 2010-09-10 5:23 ` tiejun.chen @ 2010-09-13 9:04 ` Ravi Gupta 2010-09-14 5:38 ` tiejun.chen 0 siblings, 1 reply; 10+ messages in thread From: Ravi Gupta @ 2010-09-13 9:04 UTC (permalink / raw) To: tiejun.chen; +Cc: linuxppc-dev [-- Attachment #1: Type: text/plain, Size: 18210 bytes --] Hi Tiejun, Firstly I think we'd better print the BAR0 and BAR1 on the probe function of > your device driver because you have to make sure if a8000000-a803ffff is > assigned to BAR0 and 0xa8040000-0xa807ffff for BAR1 as we expect. > > u32 value; > pci_read_config_word(pdev, PCI_BASE_ADDRESS_0, &value); printk... > pci_read_config_word(pdev, PCI_BASE_ADDRESS_1, &value); printk.... > > Both the BAR's values are coming out to be zero. > And you can print this pci_resource_start(pdev, bar), > pci_resource_len(pdev, > bar) from the function, __pci_request_region, on the file > drivers/pci/pci.c. > Please check this as well. > I have done the changes in the __pci_request_region. But as you suggested earlier that one should call pci_request_regions() after pci_enable_device() in the driver code. My driver is failing at the pci_enable_device() only. Hence __pci_request_region() is not getting called. If, just for RND, I call pci_request_regions() before pci_enable_device(), it give me the following O/P. __pci_request_region : Base Address = 0 __pci_request_region : Length Address = 1125903130362788 __pci_request_region : Base Address = 0 __pci_request_region : Length Address = 1125903130362788 > And currently we have to debug this so on the function, > __pci_assign_resource, > from the file drivers/pci/setup-res.c, we can force skipping temporarily > pci_bus_alloc_resource for bus 0001:01 since that will call > pci_update_resource > for bus 0001:01. > > static int __pci_assign_resource(struct pci_bus *bus, struct pci_dev *dev, > int resno) > { > struct resource *res = dev->resource + resno; > resource_size_t size, min, align; > int ret; > > size = resource_size(res); > min = (res->flags & IORESOURCE_IO) ? PCIBIOS_MIN_IO : > PCIBIOS_MIN_MEM; > align = pci_resource_alignment(dev, res); > ------- > if (bus->number == 0x01) { > ret = -ENOMEM > return ret; > } > ------- > > I means we don't want to assign resource as the below line on the log. > ------ > pci 0001:01:00.0: BAR 8: assigned [mem 0xa8000000-0xa80fffff] > > I expect the following output: > ------ > pci 0001:01:00.0: BAR 8: can't assign mem pref (size 0x100000) > > This I have done successfully. Dmesg ================================================================ Using MPC837x RDB/WLAN machine description Initializing cgroup subsys cpuset Initializing cgroup subsys cpu Linux version 2.6.35 (okapi@okapi) (gcc version 4.2.3 (Sourcery G++ Lite 4.2-171)) #35 Mon Sep 13 13:43:01 IST 2010 Found initrd at 0xcf46d000:0xcf7b15b7 Found legacy serial port 0 for /immr@e0000000/serial@4500 mem=e0004500, taddr=e0004500, irq=0, clk=400000002, speed=0 Found legacy serial port 1 for /immr@e0000000/serial@4600 mem=e0004600, taddr=e0004600, irq=0, clk=400000002, speed=0 bootconsole [udbg0] enabled Found FSL PCI host bridge at 0x00000000e0008500. Firmware bus number: 0->0 PCI host bridge /pci@e0008500 (primary) ranges: MEM 0x0000000090000000..0x000000009fffffff -> 0x0000000090000000 MEM 0x0000000080000000..0x000000008fffffff -> 0x0000000080000000 Prefetch IO 0x00000000e0300000..0x00000000e03fffff -> 0x0000000000000000 No pci config register base in dev tree, using default Found FSL PCI host bridge at 0x00000000e0009000. Firmware bus number: 0->255 PCI host bridge /pcie@e0009000 ranges: MEM 0x00000000a8000000..0x00000000b7ffffff -> 0x00000000a8000000 IO 0x00000000b8000000..0x00000000b87fffff -> 0x0000000000000000 No pci config register base in dev tree, using default Found FSL PCI host bridge at 0x00000000e000a000. Firmware bus number: 0->255 PCI host bridge /pcie@e000a000 ranges: MEM 0x00000000c8000000..0x00000000d7ffffff -> 0x00000000c8000000 IO 0x00000000d8000000..0x00000000d87fffff -> 0x0000000000000000 Top of RAM: 0x10000000, Total RAM: 0x10000000 Memory hole size: 0MB Zone PFN ranges: DMA 0x00000000 -> 0x00010000 Normal empty HighMem empty Movable zone start PFN for each node early_node_map[1] active PFN ranges 0: 0x00000000 -> 0x00010000 On node 0 totalpages: 65536 free_area_init_node: node 0, pgdat c042d978, node_mem_map c0800000 DMA zone: 512 pages used for memmap DMA zone: 0 pages reserved DMA zone: 65024 pages, LIFO batch:15 Built 1 zonelists in Zone order, mobility grouping on. Total pages: 65024 Kernel command line: root=/dev/ram ramdisk_size=120000 rw ip=10.20.50.230:10 .20.50.70:10.20.50.50:255.255.0.0:PowerQUICC:eth0:off console=ttyS0,115200 mtdparts=nand:4m(kernel),-(jffs2) PID hash table entries: 1024 (order: 0, 4096 bytes) Dentry cache hash table entries: 32768 (order: 5, 131072 bytes) Inode-cache hash table entries: 16384 (order: 4, 65536 bytes) High memory: 0k Memory: 249920k/262144k available (4092k kernel code, 12224k reserved, 248k data, 2207k bss, 192k init) Kernel virtual memory layout: * 0xfffcf000..0xfffff000 : fixmap * 0xff800000..0xffc00000 : highmem PTEs * 0xfe6f7000..0xff800000 : early ioremap * 0xd1000000..0xfe6f7000 : vmalloc & ioremap Hierarchical RCU implementation. RCU-based detection of stalled CPUs is disabled. Verbose stalled-CPUs detection is disabled. NR_IRQS:512 IPIC (128 IRQ sources) at d1000700 time_init: decrementer frequency = 100.000000 MHz time_init: processor frequency = 800.000004 MHz clocksource: timebase mult[2800000] shift[22] registered clockevent: decrementer mult[19999999] shift[32] cpu[0] Console: colour dummy device 80x25 pid_max: default: 32768 minimum: 301 Security Framework initialized SELinux: Disabled at boot. Mount-cache hash table entries: 512 Initializing cgroup subsys ns Initializing cgroup subsys cpuacct Initializing cgroup subsys devices NET: Registered protocol family 16 irq: irq 38 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 38 __irq_set_trigger: setting type, irq = 38, flags = 8 ipic_set_irq_type function, with virq = 38, flow = 8 irq: irq 74 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 74 __irq_set_trigger: setting type, irq = 74, flags = 8 ipic_set_irq_type function, with virq = 74, flow = 8 irq: irq 75 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 75 __irq_set_trigger: setting type, irq = 75, flags = 8 ipic_set_irq_type function, with virq = 75, flow = 8 PCI: Probing PCI hardware PCI: Scanning PHB /pci@e0008500 PCI: PHB IO resource = 0000000000000000-00000000000fffff [100] PCI: PHB MEM resource 0 = 0000000090000000-000000009fffffff [200] PCI: PHB MEM resource 1 = 0000000080000000-000000008fffffff [2200] PCI: PHB MEM offset = 0000000000000000 PCI: PHB IO offset = 00000000 probe mode: 0 pci_bus 0000:00: scanning bus pci : vendor id = 0x1957 pci 0000:00:00.0: found [1957:00c6] class 000b20 header type 00 pci 0000:00:00.0: reg 10: [mem 0x00000000-0x000fffff] pci 0000:00:00.0: reg 18: [mem 0x00000000-0x0fffffff 64bit pref] pci 0000:00:00.0: calling fixup_hide_host_resource_fsl+0x0/0x58 pci 0000:00:00.0: calling pcibios_fixup_resources+0x0/0x180 pci 0000:00:00.0: calling quirk_fsl_pcie_header+0x0/0x48 pci 0000:00:00.0: calling quirk_resource_alignment+0x0/0x1c0 pci 0000:00:00.0: supports D1 D2 pci 0000:00:00.0: PME# supported from D0 D1 D2 D3hot pci 0000:00:00.0: PME# disabled pci_bus 0000:00: fixups for bus PCI: Fixup bus devices 0 (PHB) PCI: Try to map irq for 0000:00:00.0... pci_bus 0000:00: bus scan returning with max=00 PCI: Scanning PHB /pcie@e0009000 PCI: PHB IO resource = 00000000ff7fe000-00000000ffffdfff [100] PCI: PHB MEM resource 0 = 00000000a8000000-00000000b7ffffff [200] PCI: PHB MEM offset = 0000000000000000 PCI: PHB IO offset = ff7fe000 probe mode: 0 pci_bus 0001:01: scanning bus pci : vendor id = 0x1957 pci 0001:01:00.0: found [1957:00c6] class 000b20 header type 01 pci 0001:01:00.0: ignoring class b20 (doesn't match header type 01) pci 0001:01:00.0: calling fixup_hide_host_resource_fsl+0x0/0x58 pci 0001:01:00.0: calling pcibios_fixup_resources+0x0/0x180 pci 0001:01:00.0: calling quirk_fsl_pcie_header+0x0/0x48 pci 0001:01:00.0: calling quirk_resource_alignment+0x0/0x1c0 pci 0001:01:00.0: supports D1 D2 pci 0001:01:00.0: PME# supported from D0 D1 D2 D3hot pci 0001:01:00.0: PME# disabled pci_bus 0001:01: fixups for bus PCI: Fixup bus devices 1 (PHB) PCI: Try to map irq for 0001:01:00.0... pci 0001:01:00.0: scanning [bus 01-ff] behind bridge, pass 0 pci 0001:01:00.0: bus configuration invalid, reconfiguring pci 0001:01:00.0: scanning [bus 00-00] behind bridge, pass 1 pci_bus 0001:02: scanning bus pci : vendor id = 0x1204 pci 0001:02:00.0: trying to set all zeros in BARs pci 0001:02:00.0: found [1204:e250] class 000000 header type 00 pci 0001:02:00.0: reg 10: [mem 0x00000000-0x0003ffff] pci 0001:02:00.0: reg 14: [mem 0x00000000-0x0003ffff] pci 0001:02:00.0: calling pcibios_fixup_resources+0x0/0x180 PCI:0001:02:00.0 Resource 0 0000000000000000-000000000003ffff [40200] is unassigned PCI:0001:02:00.0 Resource 1 0000000000000000-000000000003ffff [40200] is unassigned pci 0001:02:00.0: calling quirk_resource_alignment+0x0/0x1c0 pci_bus 0001:02: fixups for bus pci 0001:01:00.0: PCI bridge to [bus 02-ff] pci 0001:01:00.0: bridge window [io 0x0000-0x0000] (disabled) pci 0001:01:00.0: bridge window [mem 0x00000000-0x000fffff] (disabled) pci 0001:01:00.0: bridge window [mem 0x00000000-0x000fffff pref] (disabled) PCI: Fixup bus devices 2 (0001:01:00.0) PCI: Try to map irq for 0001:02:00.0... Got one, spec 2 cells (0x00000001 0x00000008...) on /immr@e0000000 /interrupt-controller@700 irq: irq 1 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 16 __irq_set_trigger: setting type, irq = 16, flags = 8 ipic_set_irq_type function, with virq = 16, flow = 8 Mapped to linux irq 16 pci_bus 0001:02: bus scan returning with max=02 pci_bus 0001:01: bus scan returning with max=02 PCI: Scanning PHB /pcie@e000a000 PCI: PHB IO resource = 00000000feffc000-00000000ff7fbfff [100] PCI: PHB MEM resource 0 = 00000000c8000000-00000000d7ffffff [200] PCI: PHB MEM offset = 0000000000000000 PCI: PHB IO offset = feffc000 probe mode: 0 pci_bus 0002:03: scanning bus pci_bus 0002:03: fixups for bus PCI: Fixup bus devices 3 (PHB) pci_bus 0002:03: bus scan returning with max=03 PCI->OF bus map: 0 -> 0 1 -> 0 3 -> 0 PCI: Allocating bus resources for 0000:00... PCI: PHB (bus 0) bridge rsrc 0: 0000000000000000-00000000000fffff [0x100], parent c0405660 (PCI IO) PCI: PHB (bus 0) bridge rsrc 1: 0000000090000000-000000009fffffff [0x200], parent c0405644 (PCI mem) PCI: PHB (bus 0) bridge rsrc 2: 0000000080000000-000000008fffffff [0x2200], parent c0405644 (PCI mem) PCI: Allocating bus resources for 0001:01... PCI: PHB (bus 1) bridge rsrc 0: 00000000ff7fe000-00000000ffffdfff [0x100], parent c0405660 (PCI IO) PCI: PHB (bus 1) bridge rsrc 1: 00000000a8000000-00000000b7ffffff [0x200], parent c0405644 (PCI mem) PCI: Allocating bus resources for 0001:02... PCI: Allocating bus resources for 0002:03... PCI: PHB (bus 3) bridge rsrc 0: 00000000feffc000-00000000ff7fbfff [0x100], parent c0405660 (PCI IO) PCI: PHB (bus 3) bridge rsrc 1: 00000000c8000000-00000000d7ffffff [0x200], parent c0405644 (PCI mem) Reserving legacy ranges for domain 0000 Candidate legacy IO: [io 0x0000-0x0fff] hose mem offset: 0000000000000000 hose mem res: [mem 0x90000000-0x9fffffff] hose mem res: [mem 0x80000000-0x8fffffff pref] Reserving legacy ranges for domain 0001 Candidate legacy IO: [io 0xff7fe000-0xff7fefff] hose mem offset: 0000000000000000 hose mem res: [mem 0xa8000000-0xb7ffffff] Reserving legacy ranges for domain 0002 Candidate legacy IO: [io 0xfeffc000-0xfeffcfff] hose mem offset: 0000000000000000 hose mem res: [mem 0xc8000000-0xd7ffffff] PCI: Assigning unassigned resources... pci 0001:01:00.0: BAR 8: can't assign mem (size 0x100000) pci 0001:01:00.0: PCI bridge to [bus 02-02] pci 0001:01:00.0: __pci_setup_bridge: Disabling prefetch window. pci 0001:01:00.0: __pci_setup_bridge: Prefetch window disabled successfully. pci 0001:01:00.0: bridge window [io disabled] pci 0001:01:00.0: bridge window [mem disabled] pci 0001:01:00.0: bridge window [mem pref disabled] pci_bus 0000:00: resource 0 [io 0x0000-0xfffff] pci_bus 0000:00: resource 1 [mem 0x90000000-0x9fffffff] pci_bus 0000:00: resource 2 [mem 0x80000000-0x8fffffff pref] pci_bus 0001:01: resource 0 [io 0xff7fe000-0xffffdfff] pci_bus 0001:01: resource 1 [mem 0xa8000000-0xb7ffffff] pci_bus 0002:03: resource 0 [io 0xfeffc000-0xff7fbfff] pci_bus 0002:03: resource 1 [mem 0xc8000000-0xd7ffffff] Registering qe_ic with sysfs... Registering ipic with sysfs... bio: create slab <bio-0> at 0 vgaarb: loaded SCSI subsystem initialized Switching to clocksource timebase NET: Registered protocol family 2 IP route cache hash table entries: 2048 (order: 1, 8192 bytes) TCP established hash table entries: 8192 (order: 4, 65536 bytes) TCP bind hash table entries: 8192 (order: 3, 32768 bytes) TCP: Hash tables configured (established 8192 bind 8192) TCP reno registered UDP hash table entries: 256 (order: 0, 4096 bytes) UDP-Lite hash table entries: 256 (order: 0, 4096 bytes) NET: Registered protocol family 1 pci 0000:00:00.0: calling quirk_cardbus_legacy+0x0/0x44 pci 0000:00:00.0: calling quirk_usb_early_handoff+0x0/0x740 pci 0001:01:00.0: calling quirk_cardbus_legacy+0x0/0x44 pci 0001:01:00.0: calling quirk_usb_early_handoff+0x0/0x740 pci 0001:02:00.0: calling quirk_cardbus_legacy+0x0/0x44 pci 0001:02:00.0: calling quirk_usb_early_handoff+0x0/0x740 PCI: CLS 32 bytes, default 32 Trying to unpack rootfs image as initramfs... rootfs image is not initramfs (no cpio magic); looks like an initrd Freeing initrd memory: 3345k freed irq: irq 9 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 17 __irq_set_trigger: setting type, irq = 17, flags = 8 ipic_set_irq_type function, with virq = 17, flow = 8 irq: irq 10 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 18 __irq_set_trigger: setting type, irq = 18, flags = 8 ipic_set_irq_type function, with virq = 18, flow = 8 irq: irq 80 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 80 __irq_set_trigger: setting type, irq = 80, flags = 8 ipic_set_irq_type function, with virq = 80, flow = 8 audit: initializing netlink socket (disabled) type=2000 audit(0.220:1): initialized JFFS2 version 2.2. (NAND) © 2001-2006 Red Hat, Inc. SGI XFS with security attributes, large block/inode numbers, no debug enabled msgmni has been set to 494 alg: No test for cipher_null (cipher_null-generic) alg: No test for ecb(cipher_null) (ecb-cipher_null) alg: No test for digest_null (digest_null-generic) alg: No test for compress_null (compress_null-generic) alg: No test for stdrng (krng) Block layer SCSI generic (bsg) driver version 0.4 loaded (major 253) io scheduler noop registered io scheduler deadline registered io scheduler cfq registered (default) Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled serial8250.0: ttyS0 at MMIO 0xe0004500 (irq = 17) is a 16550A console [ttyS0] enabled, bootconsole disabled serial8250.0: ttyS1 at MMIO 0xe0004600 (irq = 18) is a 16550A brd: module loaded of_mpc8xxx_spi_probe function called. irq: irq 16 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 19 __irq_set_trigger: setting type, irq = 19, flags = 8 ipic_set_irq_type function, with virq = 19, flow = 8 mpc8xxx_spi_probe function called. mpc8xxx_spi e0007000.spi: at 0xd1078000 (irq = 19), CPU mode irq: irq 32 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 32 __irq_set_trigger: setting type, irq = 32, flags = 8 ipic_set_irq_type function, with virq = 32, flow = 8 irq: irq 33 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 33 __irq_set_trigger: setting type, irq = 33, flags = 8 ipic_set_irq_type function, with virq = 33, flow = 8 irq: irq 34 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 34 __irq_set_trigger: setting type, irq = 34, flags = 8 ipic_set_irq_type function, with virq = 34, flow = 8 eth0: Gianfar Ethernet Controller Version 1.2, 04:00:00:00:00:0a eth0: Running with NAPI enabled eth0: RX BD ring size for Q[0]: 256 eth0: TX BD ring size for Q[0]: 256 irq: irq 35 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 35 __irq_set_trigger: setting type, irq = 35, flags = 8 ipic_set_irq_type function, with virq = 35, flow = 8 irq: irq 36 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 36 __irq_set_trigger: setting type, irq = 36, flags = 8 ipic_set_irq_type function, with virq = 36, flow = 8 irq: irq 37 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 37 __irq_set_trigger: setting type, irq = 37, flags = 8 ipic_set_irq_type function, with virq = 37, flow = 8 eth1: Gianfar Ethernet Controller Version 1.2, 00:00:00:00:00:00 eth1: Running with NAPI enabled eth1: RX BD ring size for Q[0]: 256 eth1: TX BD ring size for Q[0]: 256 ucc_geth: QE UCC Gigabit Ethernet Controller Freescale PowerQUICC MII Bus: probed irq: irq 17 on host /immr@e0000000/interrupt-controller@700 mapped to virtual irq 20 __irq_set_trigger: setting type, irq = 20, flags = 8 ipic_set_irq_type function, with virq = 20, flow = 8 Freescale PowerQUICC MII Bus: probed mice: PS/2 mouse device common for all mice Skipping unavailable LED gpio -19 (pwr) Skipping unavailable LED gpio -19 (hdd) TCP cubic registered NET: Registered protocol family 17 registered taskstats version 1 drivers/rtc/hctosys.c: unable to open rtc device (rtc0) RAMDISK: gzip image found at block 0 VFS: Mounted root (ext2 filesystem) on device 1:0. Freeing unused kernel memory: 192k init PHY: mdio@e0024520:02 - Link is Up - 10/Half ================================================================ Regards, Ravi [-- Attachment #2: Type: text/html, Size: 19679 bytes --] ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: pci_request_regions() failure 2010-09-13 9:04 ` Ravi Gupta @ 2010-09-14 5:38 ` tiejun.chen 0 siblings, 0 replies; 10+ messages in thread From: tiejun.chen @ 2010-09-14 5:38 UTC (permalink / raw) To: Ravi Gupta; +Cc: linuxppc-dev Ravi Gupta wrote: > Hi Tiejun, > > Firstly I think we'd better print the BAR0 and BAR1 on the probe function of >> your device driver because you have to make sure if a8000000-a803ffff is >> assigned to BAR0 and 0xa8040000-0xa807ffff for BAR1 as we expect. >> >> u32 value; >> pci_read_config_word(pdev, PCI_BASE_ADDRESS_0, &value); printk... >> pci_read_config_word(pdev, PCI_BASE_ADDRESS_1, &value); printk.... >> >> > Both the BAR's values are coming out to be zero. > > >> And you can print this pci_resource_start(pdev, bar), >> pci_resource_len(pdev, >> bar) from the function, __pci_request_region, on the file >> drivers/pci/pci.c. >> Please check this as well. >> > > I have done the changes in the __pci_request_region. But as you suggested > earlier that one should call pci_request_regions() after pci_enable_device() > in the driver code. My driver is failing at the pci_enable_device() only. > Hence __pci_request_region() is not getting called. If, just for RND, I call > pci_request_regions() before pci_enable_device(), it give me the following > O/P. > > __pci_request_region : Base Address = 0 > __pci_request_region : Length Address = 1125903130362788 > __pci_request_region : Base Address = 0 > __pci_request_region : Length Address = 1125903130362788 According to these values I think the kernel don't assign the resources to your PCI device. > > >> And currently we have to debug this so on the function, >> __pci_assign_resource, >> from the file drivers/pci/setup-res.c, we can force skipping temporarily >> pci_bus_alloc_resource for bus 0001:01 since that will call >> pci_update_resource >> for bus 0001:01. >> >> static int __pci_assign_resource(struct pci_bus *bus, struct pci_dev *dev, >> int resno) >> { >> struct resource *res = dev->resource + resno; >> resource_size_t size, min, align; >> int ret; >> >> size = resource_size(res); >> min = (res->flags & IORESOURCE_IO) ? PCIBIOS_MIN_IO : >> PCIBIOS_MIN_MEM; >> align = pci_resource_alignment(dev, res); >> ------- >> if (bus->number == 0x01) { >> ret = -ENOMEM >> return ret; >> } >> ------- >> >> I means we don't want to assign resource as the below line on the log. >> ------ >> pci 0001:01:00.0: BAR 8: assigned [mem 0xa8000000-0xa80fffff] >> >> I expect the following output: >> ------ >> pci 0001:01:00.0: BAR 8: can't assign mem pref (size 0x100000) >> >> > This I have done successfully. Sure. > > Dmesg > ================================================================ > Using MPC837x RDB/WLAN machine description > Initializing cgroup subsys cpuset > Initializing cgroup subsys cpu > Linux version 2.6.35 (okapi@okapi) (gcc version 4.2.3 (Sourcery G++ Lite > 4.2-171)) #35 Mon Sep 13 13:43:01 IST 2010 > Found initrd at 0xcf46d000:0xcf7b15b7 > Found legacy serial port 0 for /immr@e0000000/serial@4500 > mem=e0004500, taddr=e0004500, irq=0, clk=400000002, speed=0 > Found legacy serial port 1 for /immr@e0000000/serial@4600 > mem=e0004600, taddr=e0004600, irq=0, clk=400000002, speed=0 > bootconsole [udbg0] enabled > Found FSL PCI host bridge at 0x00000000e0008500. Firmware bus number: 0->0 > PCI host bridge /pci@e0008500 (primary) ranges: > MEM 0x0000000090000000..0x000000009fffffff -> 0x0000000090000000 > MEM 0x0000000080000000..0x000000008fffffff -> 0x0000000080000000 Prefetch > IO 0x00000000e0300000..0x00000000e03fffff -> 0x0000000000000000 > No pci config register base in dev tree, using default > Found FSL PCI host bridge at 0x00000000e0009000. Firmware bus number: 0->255 > PCI host bridge /pcie@e0009000 ranges: > MEM 0x00000000a8000000..0x00000000b7ffffff -> 0x00000000a8000000 > IO 0x00000000b8000000..0x00000000b87fffff -> 0x0000000000000000 > No pci config register base in dev tree, using default > Found FSL PCI host bridge at 0x00000000e000a000. Firmware bus number: 0->255 > PCI host bridge /pcie@e000a000 ranges: > MEM 0x00000000c8000000..0x00000000d7ffffff -> 0x00000000c8000000 > IO 0x00000000d8000000..0x00000000d87fffff -> 0x0000000000000000 > Top of RAM: 0x10000000, Total RAM: 0x10000000 > Memory hole size: 0MB > Zone PFN ranges: > DMA 0x00000000 -> 0x00010000 > Normal empty > HighMem empty > Movable zone start PFN for each node > early_node_map[1] active PFN ranges > 0: 0x00000000 -> 0x00010000 > On node 0 totalpages: 65536 > free_area_init_node: node 0, pgdat c042d978, node_mem_map c0800000 > DMA zone: 512 pages used for memmap > DMA zone: 0 pages reserved > DMA zone: 65024 pages, LIFO batch:15 > Built 1 zonelists in Zone order, mobility grouping on. Total pages: 65024 > Kernel command line: root=/dev/ram ramdisk_size=120000 rw ip=10.20.50.230:10 > .20.50.70:10.20.50.50:255.255.0.0:PowerQUICC:eth0:off console=ttyS0,115200 > mtdparts=nand:4m(kernel),-(jffs2) > PID hash table entries: 1024 (order: 0, 4096 bytes) > Dentry cache hash table entries: 32768 (order: 5, 131072 bytes) > Inode-cache hash table entries: 16384 (order: 4, 65536 bytes) > High memory: 0k > Memory: 249920k/262144k available (4092k kernel code, 12224k reserved, 248k > data, 2207k bss, 192k init) > Kernel virtual memory layout: > * 0xfffcf000..0xfffff000 : fixmap > * 0xff800000..0xffc00000 : highmem PTEs > * 0xfe6f7000..0xff800000 : early ioremap > * 0xd1000000..0xfe6f7000 : vmalloc & ioremap > Hierarchical RCU implementation. > RCU-based detection of stalled CPUs is disabled. > Verbose stalled-CPUs detection is disabled. > NR_IRQS:512 > IPIC (128 IRQ sources) at d1000700 > time_init: decrementer frequency = 100.000000 MHz > time_init: processor frequency = 800.000004 MHz > clocksource: timebase mult[2800000] shift[22] registered > clockevent: decrementer mult[19999999] shift[32] cpu[0] > Console: colour dummy device 80x25 > pid_max: default: 32768 minimum: 301 > Security Framework initialized > SELinux: Disabled at boot. > Mount-cache hash table entries: 512 > Initializing cgroup subsys ns > Initializing cgroup subsys cpuacct > Initializing cgroup subsys devices > NET: Registered protocol family 16 > irq: irq 38 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 38 > __irq_set_trigger: setting type, irq = 38, flags = 8 > ipic_set_irq_type function, with virq = 38, flow = 8 > irq: irq 74 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 74 > __irq_set_trigger: setting type, irq = 74, flags = 8 > ipic_set_irq_type function, with virq = 74, flow = 8 > irq: irq 75 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 75 > __irq_set_trigger: setting type, irq = 75, flags = 8 > ipic_set_irq_type function, with virq = 75, flow = 8 > PCI: Probing PCI hardware > PCI: Scanning PHB /pci@e0008500 > PCI: PHB IO resource = 0000000000000000-00000000000fffff [100] > PCI: PHB MEM resource 0 = 0000000090000000-000000009fffffff [200] > PCI: PHB MEM resource 1 = 0000000080000000-000000008fffffff [2200] > PCI: PHB MEM offset = 0000000000000000 > PCI: PHB IO offset = 00000000 > probe mode: 0 > pci_bus 0000:00: scanning bus > pci : vendor id = 0x1957 > pci 0000:00:00.0: found [1957:00c6] class 000b20 header type 00 > pci 0000:00:00.0: reg 10: [mem 0x00000000-0x000fffff] > pci 0000:00:00.0: reg 18: [mem 0x00000000-0x0fffffff 64bit pref] > pci 0000:00:00.0: calling fixup_hide_host_resource_fsl+0x0/0x58 > pci 0000:00:00.0: calling pcibios_fixup_resources+0x0/0x180 > pci 0000:00:00.0: calling quirk_fsl_pcie_header+0x0/0x48 > pci 0000:00:00.0: calling quirk_resource_alignment+0x0/0x1c0 > pci 0000:00:00.0: supports D1 D2 > pci 0000:00:00.0: PME# supported from D0 D1 D2 D3hot > pci 0000:00:00.0: PME# disabled > pci_bus 0000:00: fixups for bus > PCI: Fixup bus devices 0 (PHB) > PCI: Try to map irq for 0000:00:00.0... > pci_bus 0000:00: bus scan returning with max=00 > PCI: Scanning PHB /pcie@e0009000 > PCI: PHB IO resource = 00000000ff7fe000-00000000ffffdfff [100] > PCI: PHB MEM resource 0 = 00000000a8000000-00000000b7ffffff [200] > PCI: PHB MEM offset = 0000000000000000 > PCI: PHB IO offset = ff7fe000 > probe mode: 0 > pci_bus 0001:01: scanning bus > pci : vendor id = 0x1957 > pci 0001:01:00.0: found [1957:00c6] class 000b20 header type 01 > pci 0001:01:00.0: ignoring class b20 (doesn't match header type 01) > pci 0001:01:00.0: calling fixup_hide_host_resource_fsl+0x0/0x58 > pci 0001:01:00.0: calling pcibios_fixup_resources+0x0/0x180 > pci 0001:01:00.0: calling quirk_fsl_pcie_header+0x0/0x48 > pci 0001:01:00.0: calling quirk_resource_alignment+0x0/0x1c0 > pci 0001:01:00.0: supports D1 D2 > pci 0001:01:00.0: PME# supported from D0 D1 D2 D3hot > pci 0001:01:00.0: PME# disabled > pci_bus 0001:01: fixups for bus > PCI: Fixup bus devices 1 (PHB) > PCI: Try to map irq for 0001:01:00.0... > pci 0001:01:00.0: scanning [bus 01-ff] behind bridge, pass 0 > pci 0001:01:00.0: bus configuration invalid, reconfiguring > pci 0001:01:00.0: scanning [bus 00-00] behind bridge, pass 1 > pci_bus 0001:02: scanning bus > pci : vendor id = 0x1204 > pci 0001:02:00.0: trying to set all zeros in BARs > pci 0001:02:00.0: found [1204:e250] class 000000 header type 00 > pci 0001:02:00.0: reg 10: [mem 0x00000000-0x0003ffff] > pci 0001:02:00.0: reg 14: [mem 0x00000000-0x0003ffff] > pci 0001:02:00.0: calling pcibios_fixup_resources+0x0/0x180 > PCI:0001:02:00.0 Resource 0 0000000000000000-000000000003ffff [40200] is > unassigned > PCI:0001:02:00.0 Resource 1 0000000000000000-000000000003ffff [40200] is > unassigned > pci 0001:02:00.0: calling quirk_resource_alignment+0x0/0x1c0 > pci_bus 0001:02: fixups for bus > pci 0001:01:00.0: PCI bridge to [bus 02-ff] > pci 0001:01:00.0: bridge window [io 0x0000-0x0000] (disabled) > pci 0001:01:00.0: bridge window [mem 0x00000000-0x000fffff] (disabled) > pci 0001:01:00.0: bridge window [mem 0x00000000-0x000fffff pref] > (disabled) > PCI: Fixup bus devices 2 (0001:01:00.0) > PCI: Try to map irq for 0001:02:00.0... > Got one, spec 2 cells (0x00000001 0x00000008...) on /immr@e0000000 > /interrupt-controller@700 > irq: irq 1 on host /immr@e0000000/interrupt-controller@700 mapped to virtual > irq 16 > __irq_set_trigger: setting type, irq = 16, flags = 8 > ipic_set_irq_type function, with virq = 16, flow = 8 > Mapped to linux irq 16 > pci_bus 0001:02: bus scan returning with max=02 > pci_bus 0001:01: bus scan returning with max=02 > PCI: Scanning PHB /pcie@e000a000 > PCI: PHB IO resource = 00000000feffc000-00000000ff7fbfff [100] > PCI: PHB MEM resource 0 = 00000000c8000000-00000000d7ffffff [200] > PCI: PHB MEM offset = 0000000000000000 > PCI: PHB IO offset = feffc000 > probe mode: 0 > pci_bus 0002:03: scanning bus > pci_bus 0002:03: fixups for bus > PCI: Fixup bus devices 3 (PHB) > pci_bus 0002:03: bus scan returning with max=03 > PCI->OF bus map: > 0 -> 0 > 1 -> 0 > 3 -> 0 > PCI: Allocating bus resources for 0000:00... > PCI: PHB (bus 0) bridge rsrc 0: 0000000000000000-00000000000fffff [0x100], > parent c0405660 (PCI IO) > PCI: PHB (bus 0) bridge rsrc 1: 0000000090000000-000000009fffffff [0x200], > parent c0405644 (PCI mem) > PCI: PHB (bus 0) bridge rsrc 2: 0000000080000000-000000008fffffff [0x2200], > parent c0405644 (PCI mem) > PCI: Allocating bus resources for 0001:01... > PCI: PHB (bus 1) bridge rsrc 0: 00000000ff7fe000-00000000ffffdfff [0x100], > parent c0405660 (PCI IO) > PCI: PHB (bus 1) bridge rsrc 1: 00000000a8000000-00000000b7ffffff [0x200], > parent c0405644 (PCI mem) > PCI: Allocating bus resources for 0001:02... > PCI: Allocating bus resources for 0002:03... > PCI: PHB (bus 3) bridge rsrc 0: 00000000feffc000-00000000ff7fbfff [0x100], > parent c0405660 (PCI IO) > PCI: PHB (bus 3) bridge rsrc 1: 00000000c8000000-00000000d7ffffff [0x200], > parent c0405644 (PCI mem) > Reserving legacy ranges for domain 0000 > Candidate legacy IO: [io 0x0000-0x0fff] > hose mem offset: 0000000000000000 > hose mem res: [mem 0x90000000-0x9fffffff] > hose mem res: [mem 0x80000000-0x8fffffff pref] > Reserving legacy ranges for domain 0001 > Candidate legacy IO: [io 0xff7fe000-0xff7fefff] > hose mem offset: 0000000000000000 > hose mem res: [mem 0xa8000000-0xb7ffffff] > Reserving legacy ranges for domain 0002 > Candidate legacy IO: [io 0xfeffc000-0xfeffcfff] > hose mem offset: 0000000000000000 > hose mem res: [mem 0xc8000000-0xd7ffffff] > PCI: Assigning unassigned resources... > pci 0001:01:00.0: BAR 8: can't assign mem (size 0x100000) > pci 0001:01:00.0: PCI bridge to [bus 02-02] > pci 0001:01:00.0: __pci_setup_bridge: Disabling prefetch window. > pci 0001:01:00.0: __pci_setup_bridge: Prefetch window disabled successfully. > pci 0001:01:00.0: bridge window [io disabled] > pci 0001:01:00.0: bridge window [mem disabled] > pci 0001:01:00.0: bridge window [mem pref disabled] I cannot see 0001:02 is assigned again. I guess the code we modify issue 0001:02 is skipped so please check. I only hope do for 0001:01, not 0001:02. And I think we have to clean all pre-allocated resource from the bootloader. Firstly remove all previous change from your kernel to restore the original state. Add the follows into kernel. (i.e. your target.c) void debug_pci_fixup_resource(struct pci_dev* dev) { pci_write_config_dword(dev, PCI_BASE_ADDRESS_0, 0); pci_write_config_dword(dev, PCI_BASE_ADDRESS_1, 0); if (dev->hdr_type == PCI_HEADER_TYPE_NORMAL) { pci_write_config_dword(dev, PCI_BASE_ADDRESS_2, 0); pci_write_config_dword(dev, PCI_BASE_ADDRESS_3, 0); pci_write_config_dword(dev, PCI_BASE_ADDRESS_4, 0); pci_write_config_dword(dev, PCI_BASE_ADDRESS_5, 0); } } DECLARE_PCI_FIXUP_EARLY(PCI_ANY_ID, PCI_ANY_ID, debug_pci_fixup_resource); Then you try to track why we miss allocating 0001:02. Cheers Tiejun > pci_bus 0000:00: resource 0 [io 0x0000-0xfffff] > pci_bus 0000:00: resource 1 [mem 0x90000000-0x9fffffff] > pci_bus 0000:00: resource 2 [mem 0x80000000-0x8fffffff pref] > pci_bus 0001:01: resource 0 [io 0xff7fe000-0xffffdfff] > pci_bus 0001:01: resource 1 [mem 0xa8000000-0xb7ffffff] > pci_bus 0002:03: resource 0 [io 0xfeffc000-0xff7fbfff] > pci_bus 0002:03: resource 1 [mem 0xc8000000-0xd7ffffff] > Registering qe_ic with sysfs... > Registering ipic with sysfs... > bio: create slab <bio-0> at 0 > vgaarb: loaded > SCSI subsystem initialized > Switching to clocksource timebase > NET: Registered protocol family 2 > IP route cache hash table entries: 2048 (order: 1, 8192 bytes) > TCP established hash table entries: 8192 (order: 4, 65536 bytes) > TCP bind hash table entries: 8192 (order: 3, 32768 bytes) > TCP: Hash tables configured (established 8192 bind 8192) > TCP reno registered > UDP hash table entries: 256 (order: 0, 4096 bytes) > UDP-Lite hash table entries: 256 (order: 0, 4096 bytes) > NET: Registered protocol family 1 > pci 0000:00:00.0: calling quirk_cardbus_legacy+0x0/0x44 > pci 0000:00:00.0: calling quirk_usb_early_handoff+0x0/0x740 > pci 0001:01:00.0: calling quirk_cardbus_legacy+0x0/0x44 > pci 0001:01:00.0: calling quirk_usb_early_handoff+0x0/0x740 > pci 0001:02:00.0: calling quirk_cardbus_legacy+0x0/0x44 > pci 0001:02:00.0: calling quirk_usb_early_handoff+0x0/0x740 > PCI: CLS 32 bytes, default 32 > Trying to unpack rootfs image as initramfs... > rootfs image is not initramfs (no cpio magic); looks like an initrd > Freeing initrd memory: 3345k freed > irq: irq 9 on host /immr@e0000000/interrupt-controller@700 mapped to virtual > irq 17 > __irq_set_trigger: setting type, irq = 17, flags = 8 > ipic_set_irq_type function, with virq = 17, flow = 8 > irq: irq 10 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 18 > __irq_set_trigger: setting type, irq = 18, flags = 8 > ipic_set_irq_type function, with virq = 18, flow = 8 > irq: irq 80 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 80 > __irq_set_trigger: setting type, irq = 80, flags = 8 > ipic_set_irq_type function, with virq = 80, flow = 8 > audit: initializing netlink socket (disabled) > type=2000 audit(0.220:1): initialized > JFFS2 version 2.2. (NAND) © 2001-2006 Red Hat, Inc. > SGI XFS with security attributes, large block/inode numbers, no debug > enabled > msgmni has been set to 494 > alg: No test for cipher_null (cipher_null-generic) > alg: No test for ecb(cipher_null) (ecb-cipher_null) > alg: No test for digest_null (digest_null-generic) > alg: No test for compress_null (compress_null-generic) > alg: No test for stdrng (krng) > Block layer SCSI generic (bsg) driver version 0.4 loaded (major 253) > io scheduler noop registered > io scheduler deadline registered > io scheduler cfq registered (default) > Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled > serial8250.0: ttyS0 at MMIO 0xe0004500 (irq = 17) is a 16550A > console [ttyS0] enabled, bootconsole disabled > serial8250.0: ttyS1 at MMIO 0xe0004600 (irq = 18) is a 16550A > brd: module loaded > of_mpc8xxx_spi_probe function called. > irq: irq 16 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 19 > __irq_set_trigger: setting type, irq = 19, flags = 8 > ipic_set_irq_type function, with virq = 19, flow = 8 > mpc8xxx_spi_probe function called. > mpc8xxx_spi e0007000.spi: at 0xd1078000 (irq = 19), CPU mode > irq: irq 32 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 32 > __irq_set_trigger: setting type, irq = 32, flags = 8 > ipic_set_irq_type function, with virq = 32, flow = 8 > irq: irq 33 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 33 > __irq_set_trigger: setting type, irq = 33, flags = 8 > ipic_set_irq_type function, with virq = 33, flow = 8 > irq: irq 34 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 34 > __irq_set_trigger: setting type, irq = 34, flags = 8 > ipic_set_irq_type function, with virq = 34, flow = 8 > eth0: Gianfar Ethernet Controller Version 1.2, 04:00:00:00:00:0a > eth0: Running with NAPI enabled > eth0: RX BD ring size for Q[0]: 256 > eth0: TX BD ring size for Q[0]: 256 > irq: irq 35 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 35 > __irq_set_trigger: setting type, irq = 35, flags = 8 > ipic_set_irq_type function, with virq = 35, flow = 8 > irq: irq 36 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 36 > __irq_set_trigger: setting type, irq = 36, flags = 8 > ipic_set_irq_type function, with virq = 36, flow = 8 > irq: irq 37 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 37 > __irq_set_trigger: setting type, irq = 37, flags = 8 > ipic_set_irq_type function, with virq = 37, flow = 8 > eth1: Gianfar Ethernet Controller Version 1.2, 00:00:00:00:00:00 > eth1: Running with NAPI enabled > eth1: RX BD ring size for Q[0]: 256 > eth1: TX BD ring size for Q[0]: 256 > ucc_geth: QE UCC Gigabit Ethernet Controller > Freescale PowerQUICC MII Bus: probed > irq: irq 17 on host /immr@e0000000/interrupt-controller@700 mapped to > virtual irq 20 > __irq_set_trigger: setting type, irq = 20, flags = 8 > ipic_set_irq_type function, with virq = 20, flow = 8 > Freescale PowerQUICC MII Bus: probed > mice: PS/2 mouse device common for all mice > Skipping unavailable LED gpio -19 (pwr) > Skipping unavailable LED gpio -19 (hdd) > TCP cubic registered > NET: Registered protocol family 17 > registered taskstats version 1 > drivers/rtc/hctosys.c: unable to open rtc device (rtc0) > RAMDISK: gzip image found at block 0 > VFS: Mounted root (ext2 filesystem) on device 1:0. > Freeing unused kernel memory: 192k init > PHY: mdio@e0024520:02 - Link is Up - 10/Half > ================================================================ > > Regards, > Ravi > ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2010-09-14 5:37 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2010-09-06 12:52 pci_request_regions() failure Ravi Gupta 2010-09-07 5:25 ` tiejun.chen 2010-09-07 7:20 ` Ravi Gupta 2010-09-07 9:24 ` tiejun.chen 2010-09-08 9:29 ` Ravi Gupta 2010-09-09 9:55 ` tiejun.chen 2010-09-09 12:37 ` Ravi Gupta 2010-09-10 5:23 ` tiejun.chen 2010-09-13 9:04 ` Ravi Gupta 2010-09-14 5:38 ` tiejun.chen
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).