PCI hotplug problems: how to debug?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello linux-pci,

I've been testing PCI hotplugging on two computers, a Trenton CPLE and a
Force CPCI-735. They're both regular x86 PC's in a compact PCI
formfactor.

The hardware on both boards is nearly identical. The major difference is
the PCI bridge used. The Trenton uses a Broadcom bridge, while the Force
uses a Force Sentinel PCI-to-PCI bridge.

I'd like to be able to tell Linux "I want to remove this PCI card", swap
the card, then tell the system "rescan the bus" and have the new card be
initialized. Running the hotplug manually is fine, I don't really care
about using the front-panel switch to trigger hotplug.

The card which I have plugged into the PCI backplane is cPCI hotplug
capable. It also has a reset switch, which causes it to reset the
onboard processor, clear the PCI interface, etc. The BAR addresses are
all zeroed, as if the board just powered on, before the BIOS assigned
addresses.

I've tested six scenarios, all using a v2.6.31.2 kernel.
1) CONFIG_HOTPLUG_PCI=n, pci-core method, no reset
2) CONFIG_HOTPLUG_PCI=n, pci-core method, hard reset
3) CONFIG_HOTPLUG_PCI=y, pci-core method, no reset
4) CONFIG_HOTPLUG_PCI=y, pci-core method, hard reset
5) CONFIG_HOTPLUG_PCI=y, fakephp method, no reset
6) CONFIG_HOTPLUG_PCI=y, fakephp method, hard reset

I used the following definitions in the table.
1) hard reset:
	After running the software hot-unplug, I pressed the reset
	switch on the card, zeroing the PCI BAR addresses.

2) no reset:
	The card was left in the slot, powered on. The PCI interface was
	not physically reset, so the PCI BAR addresses assigned by the
	BIOS (before the hot-unplug) are still in the PCI configuration
	space.

I've tried doing a software hotplug via the following two methods. When
possible, I tried both on the same kernel configuration.

1) the fakephp method:
	echo 0 > /sys/bus/pci/slots/.../power
	echo 1 > /sys/bus/pci/rescan

2) the pci-core method:
	echo 1 > /sys/bus/pci/devices/.../remove
	echo 1 > /sys/bus/pci/rescan

All six scenarios work on the Force computer. It seems to re-assign the
same PCI BAR addresses each time.

All six scenarios fail on the Trenton computer. It always re-assigns the
PCI BAR addresses starting at 0x40000000, which is just above the top of
physical memory. There is 1GB of RAM in the system.

On both the Trenton and Force computers, the BIOS assigns the PCI BAR
addresses towards the top of memory. Both assign addresses above
0xF0000000.

After running a hotplug on the Trenton computer, I have used a PCI logic
analyzer to confirm that no transactions accessing the PCI BAR's of the
hotplugged card make it onto the PCI bus. PCI configuration space still
works.

I have tried using the "memmap=" kernel parameter to force the Trenton
computer to re-assign the PCI BAR addresses above 0xF0000000. This did
not help.

My question is: how can I debug this? Is it a Linux problem, or is it a
BIOS problem?

I'm happy to provide any more information, including logic analyzer
traces if necessary.

Thanks,
Ira
--
To unsubscribe from this list: send the line "unsubscribe linux-pci" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux