Re: [PATCH] Add support for reading SMBIOS Slot number for PCI devices

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

 



On Tue, Jul 21, 2015 at 8:09 PM, Bjorn Helgaas <bhelgaas@xxxxxxxxxx> wrote:
> On Tue, Jul 21, 2015 at 12:31:35PM -0500, Jordan Hargrave wrote:
>> On Tue, Jul 21, 2015 at 11:57 AM, Bjorn Helgaas <bhelgaas@xxxxxxxxxx> wrote:
>> > On Mon, Jul 13, 2015 at 09:57:32AM -0500, Jordan Hargrave wrote:
>> >> On Mon, Jul 13, 2015 at 2:35 AM, Jean Delvare <jdelvare@xxxxxxx> wrote:
>> >>
>> >> > Hi Jordan,
>> >> >
>> >> > On Fri, 10 Jul 2015 17:02:46 -0500, Jordan Hargrave wrote:
>> >> > > From: Jordan Hargrave <Jordan_Hargrave@xxxxxxxx>
>> >> > >
>> >> > > There currently isn't an easy way to determine which PCI devices belong
>> >> > to
>> >> > > system slots.  This patch adds support to read SMBIOS Type 9 (System
>> >> > Slots).
>> >> >
>> >> > I'm wondering, can't you use dmidecode or libsmbios to retrieve the
>> >> > same information?
>> >> >
>> >> > --
>> >> > Jean Delvare
>> >> > SUSE L3 Support
>> >> >
>> >>
>> >> You can but it's as not easy to determine the slot number for leaf devices
>> >> on bridges.  Eventually planning on using this for pulling slot number for
>> >> identifying network cards and disk numbering for systemd
>> >
>> > Can you outline the problems with using dmidecode or libsmbios?
>>
>> Neither dmidecode nor libsmbios report the slot number for devices
>> behind bridges in a slot.
>
> True, but it's straightforward to walk up the PCI tree in sysfs, e.g.,
> given a path like /sys/devices/pci0000:00/0000:00:1c.5/0000:03:00.0/, it's
> easy to see what the upstream bridges are.
>
It makes it more complicated I think. You have to check all functions
on all devices as well on the walk to the root.

Would it look something like this?
while (pdev) {
  if (pdev->bus->number == dslot->bus && PCI_SLOT(pdev->devfn) ==
PCI_SLOT(dslot->devfn) &&
     (pci_pcie_type(pdev) != PCI_ROOT_PORT || PCI_FUNC(pdev->devfn) ==
PCI_FUNC(dslot->devfn))
    return dslot->instance;
  if (!pdev->bus->parent)
    break;
  pdev = pdev->bus->parent->self;
}

>> I'm wanting to use this sysfs variable to
>> get slot numbers for systemd, so using libsmbios and dmidecode aren't
>> very useful.
>
> If you want this in systemd, I see why you wouldn't want a command like
> dmidecode.  Help me understand the problem with libsmbios.  Is it not
> useful because (a) systemd doesn't want to link with it, or (b) libsmbios
> doesn't have the right information, or (c) something else?
>
Linking with libsmbios would be a problem, and libsmbios doesn't have
this info anyway.

> It doesn't *look* like this is using any information that is only available
> in the kernel, so in principle it seems like this could be done in
> user-space.
>

I actually just got an email from someone who needs to determine the
card slot number in their driver... so I've added an external callable
'pci_get_smbios_slot' function to enable this.

>> We already report the index for embedded devices in
>> pci-label.c, this code should have gone in at the same time.
>>
>> For example.  The SMBIOS entry for slot 3 is 40:00.0 There is a
>> quad-port NIC in the slot with a bridge at 40:00.0
>>
>> 42:00.0 Bridge (sec=43, sub=45)
>> 43:02.0 Bridge (sec=44, sub=44)
>> 43:04.0 Bridge (sec=45, sub=45)
>> 44:00.0 Ethernet
>> 44:00.1 Ethernet
>> 45:00.0 Ethernet
>> 45:00.1 Ethernet
>>
>> So dmidecode only returns the slot number for 42:00.0 but not any
>> child devices.  This code will provide a 'slot' sysfs variable that
>> reports '3' for all devices under and including the bridge.
>
> What if the card in slot 3 is an adapter leading to an external PCI
> chassis?  Wouldn't we then have a 'slot' file for every card in that
> chassis, all containing '3'?  This sounds confusing, although it is true
> that they all would be connected via the system board slot 3.
>
Yes that is correct.  Unless SMBIOS had a table of the second chassis.

> Also, we do have the /sys/bus/pci/slots/ hierarchy already.  If we do put
> something like this in the kernel, how would it relate to that hierarchy?
> Could this SMBIOS stuff be integrated into that somehow?
>

/sys/bus/pci/slots only map a slot to a single PCI device.  systemd
does use /sys/bus/pci/slots but it can't see the slot number on cards
with bridges as the actual slot number is a parent.  And that's not
easily to determine a parent device from the slots interface.  I'd
really like something generic here. I'm also looking for some method
for reporting bay/enclosure ID for PCIe-SSD devices.

> We have a bit of a hodge-podge of slot names already, and I'd like to
> simplify things if we can.
>
> Bjorn
--
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