[systemd-devel] Network/Block device PCI Slot map utility

jharg93 at gmail.com jharg93 at gmail.com
Thu Nov 12 10:04:31 PST 2015


I've developed a script that will display useful information for all block
and network devices.  It displays the PCI slot number, SR-IOV physical device,
model/vendor, driver, and NIC port number. The script will also display the 
bay and slot number for installed Dell PCIe-SSDs.

The script requires ipmitool and biosdecode utilities.

Examples:
===== sda
  Device: /sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0
  Vendor: ATA    
  Model: ST3500630NS    
  Driver: ata_piix
===== sdb
  Device: /sys/devices/pci0000:00/0000:00:1a.7/usb1/1-4/1-4:1.0/host14/target14:0:0/14:0:0:0
  Vendor: Verbatim
  Model: STORE N GO     
  Driver: usb_storage
===== sr0
  Device: /sys/devices/pci0000:00/0000:00:1f.2/host1/target1:0:0/1:0:0:0
  Vendor: Optiarc
  Model: DVD+-RW AD-5560A
  Driver: ata_piix
===== eth0
  Device: /sys/devices/pci0000:00/0000:00:19.0
  Driver: e1000e
===== eth1
  Device: /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0
  Driver: e1000e
  Slot Entry 9: ID 01:00, slot number 10
  PORT: 1
===== eth2
  Device: /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.1
  Driver: e1000e
  Slot Entry 9: ID 01:00, slot number 10
  PORT: 2


another system:
===== sda
  Device: /sys/devices/pci0000:00/0000:00:02.2/0000:02:00.0/host0/target0:2:0/0:2:0:0
  Vendor: DELL   
  Model: PERC H710P     
  Driver: megaraid_sas
  0000:02:00.0 Label: Integrated RAID                        
  0000:02:00.0 SMBIOS Index: 4
===== eno1
  Device: /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0
  DevPort: 0
  Driver: bnx2x
  DCM: 1001009d7F1402009d7F2101009d7F2502009d7F32010089154301008915
    p1_1
  0000:01:00.0 Label: NIC1
  0000:01:00.0 ACPI Index: 1
===== eno2
  Device: /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.1
  DevPort: 0
  Driver: bnx2x
  DCM: 1001009d7F1402009d7F2101009d7F2502009d7F32010089154301008915
    p2_1
  0000:01:00.1 Label: NIC2
  0000:01:00.1 ACPI Index: 2
===== eno3
  Device: /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.2
  DevPort: 0
  Driver: bnx2x
  DCM: 1001009d7F1402009d7F2101009d7F2502009d7F32010089154301008915
    p3_1
  0000:01:00.2 Label: NIC3
  0000:01:00.2 ACPI Index: 3
===== eno4
  Device: /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.3
  DevPort: 0
  Driver: bnx2x
  DCM: 1001009d7F1402009d7F2101009d7F2502009d7F32010089154301008915
    p4_1
  0000:01:00.3 Label: NIC4
  0000:01:00.3 ACPI Index: 4
===== eno5
  Device: /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.4
  DevPort: 0
  Driver: bnx2x
  DCM: 1001009d7F1402009d7F2101009d7F2502009d7F32010089154301008915
    p1_2
  0000:01:00.4 Label: NIC5
  0000:01:00.4 ACPI Index: 5
===== eno6
  Device: /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.5
  DevPort: 0
  Driver: bnx2x
  DCM: 1001009d7F1402009d7F2101009d7F2502009d7F32010089154301008915
    p2_2
  0000:01:00.5 Label: NIC6
  0000:01:00.5 ACPI Index: 6
===== enp4s0
  Device: /sys/devices/pci0000:00/0000:00:03.0/0000:04:00.0
  DevPort: 0
  Driver: mlx4_core
  Level: 1   Slot Entry 15: ID 04:00, slot number 3
  PORT: 1
  DCM: 10010000C520010000C5
    p1_1
    p2_1
  0000:00:03.0 Label: SLOT 3
  0000:00:03.0 ACPI Index: 17
===== enp4s0d1
  Device: /sys/devices/pci0000:00/0000:00:03.0/0000:04:00.0
  DevPort: 1
  Driver: mlx4_core
  Level: 1   Slot Entry 15: ID 04:00, slot number 3
  PORT: 2
  DCM: 10010000C520010000C5
    p1_1
    p2_1
  0000:00:03.0 Label: SLOT 3
  0000:00:03.0 ACPI Index: 17
===== enp4s0f1
  Device: /sys/devices/pci0000:00/0000:00:03.0/0000:04:00.1
  PhysFn: /sys/devices/pci0000:00/0000:00:03.0/0000:04:00.0
  DevPort: 0
  Driver: mlx4_core
  Level: 1   Slot Entry 15: ID 04:00, slot number 3
  PORT: 1
  DCM: 10010000C520010000C5
    p1_1
    p2_1
  0000:00:03.0 Label: SLOT 3
  0000:00:03.0 ACPI Index: 17
===== enp4s0f1d1
  Device: /sys/devices/pci0000:00/0000:00:03.0/0000:04:00.1
  PhysFn: /sys/devices/pci0000:00/0000:00:03.0/0000:04:00.0
  DevPort: 1
  Driver: mlx4_core
  Level: 1   Slot Entry 15: ID 04:00, slot number 3
  PORT: 2
  DCM: 10010000C520010000C5
    p1_1
    p2_1
  0000:00:03.0 Label: SLOT 3
  0000:00:03.0 ACPI Index: 17
===== enp4s0f2
  Device: /sys/devices/pci0000:00/0000:00:03.0/0000:04:00.2
  PhysFn: /sys/devices/pci0000:00/0000:00:03.0/0000:04:00.0
  DevPort: 0
  Driver: mlx4_core
  Level: 1   Slot Entry 15: ID 04:00, slot number 3
  PORT: 1
  DCM: 10010000C520010000C5
    p1_1
    p2_1
  0000:00:03.0 Label: SLOT 3
  0000:00:03.0 ACPI Index: 17
===== enp4s0f2d1
  Device: /sys/devices/pci0000:00/0000:00:03.0/0000:04:00.2
  PhysFn: /sys/devices/pci0000:00/0000:00:03.0/0000:04:00.0
  DevPort: 1
  Driver: mlx4_core
  Level: 1   Slot Entry 15: ID 04:00, slot number 3
  PORT: 2
  DCM: 10010000C520010000C5
    p1_1
    p2_1
  0000:00:03.0 Label: SLOT 3
  0000:00:03.0 ACPI Index: 17
===== enp4s0f3
  Device: /sys/devices/pci0000:00/0000:00:03.0/0000:04:00.3
  PhysFn: /sys/devices/pci0000:00/0000:00:03.0/0000:04:00.0
  DevPort: 0
  Driver: mlx4_core
  Level: 1   Slot Entry 15: ID 04:00, slot number 3
  PORT: 1
  DCM: 10010000C520010000C5
    p1_1
    p2_1
  0000:00:03.0 Label: SLOT 3
  0000:00:03.0 ACPI Index: 17
===== enp4s0f3d1
  Device: /sys/devices/pci0000:00/0000:00:03.0/0000:04:00.3
  PhysFn: /sys/devices/pci0000:00/0000:00:03.0/0000:04:00.0
  DevPort: 1
  Driver: mlx4_core
  Level: 1   Slot Entry 15: ID 04:00, slot number 3
  PORT: 2
  DCM: 10010000C520010000C5
    p1_1
    p2_1
  0000:00:03.0 Label: SLOT 3
  0000:00:03.0 ACPI Index: 17
===== enp4s0f4
  Device: /sys/devices/pci0000:00/0000:00:03.0/0000:04:00.4
  PhysFn: /sys/devices/pci0000:00/0000:00:03.0/0000:04:00.0
  DevPort: 0
  Driver: mlx4_core
  Level: 1   Slot Entry 15: ID 04:00, slot number 3
  PORT: 1
  DCM: 10010000C520010000C5
    p1_1
    p2_1
  0000:00:03.0 Label: SLOT 3
  0000:00:03.0 ACPI Index: 17
===== enp4s0f4d1
  Device: /sys/devices/pci0000:00/0000:00:03.0/0000:04:00.4
  PhysFn: /sys/devices/pci0000:00/0000:00:03.0/0000:04:00.0
  DevPort: 1
  Driver: mlx4_core
  Level: 1   Slot Entry 15: ID 04:00, slot number 3
  PORT: 2
  DCM: 10010000C520010000C5
    p1_1
    p2_1
  0000:00:03.0 Label: SLOT 3
  0000:00:03.0 ACPI Index: 17
===== enp4s0f5
  Device: /sys/devices/pci0000:00/0000:00:03.0/0000:04:00.5
  PhysFn: /sys/devices/pci0000:00/0000:00:03.0/0000:04:00.0
  DevPort: 0
  Driver: mlx4_core
  Level: 1   Slot Entry 15: ID 04:00, slot number 3
  PORT: 1
  DCM: 10010000C520010000C5
    p1_1
    p2_1
  0000:00:03.0 Label: SLOT 3
  0000:00:03.0 ACPI Index: 17
===== enp4s0f5d1
  Device: /sys/devices/pci0000:00/0000:00:03.0/0000:04:00.5
  PhysFn: /sys/devices/pci0000:00/0000:00:03.0/0000:04:00.0
  DevPort: 1
  Driver: mlx4_core
  Level: 1   Slot Entry 15: ID 04:00, slot number 3
  PORT: 2
  DCM: 10010000C520010000C5
    p1_1
    p2_1
  0000:00:03.0 Label: SLOT 3
  0000:00:03.0 ACPI Index: 17
===== enp4s0f6
  Device: /sys/devices/pci0000:00/0000:00:03.0/0000:04:00.6
  PhysFn: /sys/devices/pci0000:00/0000:00:03.0/0000:04:00.0
  DevPort: 0
  Driver: mlx4_core
  Level: 1   Slot Entry 15: ID 04:00, slot number 3
  PORT: 1
  DCM: 10010000C520010000C5
    p1_1
    p2_1
  0000:00:03.0 Label: SLOT 3
  0000:00:03.0 ACPI Index: 17
===== enp4s0f6d1
  Device: /sys/devices/pci0000:00/0000:00:03.0/0000:04:00.6
  PhysFn: /sys/devices/pci0000:00/0000:00:03.0/0000:04:00.0
  DevPort: 1
  Driver: mlx4_core
  Level: 1   Slot Entry 15: ID 04:00, slot number 3
  PORT: 2
  DCM: 10010000C520010000C5
    p1_1
    p2_1
  0000:00:03.0 Label: SLOT 3
  0000:00:03.0 ACPI Index: 17
===== enp4s0f7
  Device: /sys/devices/pci0000:00/0000:00:03.0/0000:04:00.7
  PhysFn: /sys/devices/pci0000:00/0000:00:03.0/0000:04:00.0
  DevPort: 0
  Driver: mlx4_core
  Level: 1   Slot Entry 15: ID 04:00, slot number 3
  PORT: 1
  DCM: 10010000C520010000C5
    p1_1
    p2_1
  0000:00:03.0 Label: SLOT 3
  0000:00:03.0 ACPI Index: 17
===== enp4s0f7d1
  Device: /sys/devices/pci0000:00/0000:00:03.0/0000:04:00.7
  PhysFn: /sys/devices/pci0000:00/0000:00:03.0/0000:04:00.0
  DevPort: 1
  Driver: mlx4_core
  Level: 1   Slot Entry 15: ID 04:00, slot number 3
  PORT: 2
  DCM: 10010000C520010000C5
    p1_1
    p2_1
  0000:00:03.0 Label: SLOT 3
  0000:00:03.0 ACPI Index: 17
===== enp4s1
  Device: /sys/devices/pci0000:00/0000:00:03.0/0000:04:01.0
  PhysFn: /sys/devices/pci0000:00/0000:00:03.0/0000:04:00.0
  DevPort: 0
  Driver: mlx4_core
  Level: 1   Slot Entry 15: ID 04:00, slot number 3
  PORT: 1
  DCM: 10010000C520010000C5
    p1_1
    p2_1
  0000:00:03.0 Label: SLOT 3
  0000:00:03.0 ACPI Index: 17
===== enp4s1d1
  Device: /sys/devices/pci0000:00/0000:00:03.0/0000:04:01.0
  PhysFn: /sys/devices/pci0000:00/0000:00:03.0/0000:04:00.0
  DevPort: 1
  Driver: mlx4_core
  Level: 1   Slot Entry 15: ID 04:00, slot number 3
  PORT: 2
  DCM: 10010000C520010000C5
    p1_1
    p2_1
  0000:00:03.0 Label: SLOT 3
  0000:00:03.0 ACPI Index: 17
===== enp68s0f0
  Device: /sys/devices/pci0000:40/0000:40:03.0/0000:42:00.0/0000:43:02.0/0000:44:00.0
  DevPort: 0
  Driver: igb
  Level: 3   Slot Entry 17: ID 42:00, slot number 2
  PORT: 1
  0000:40:03.0 Label: SLOT 2
  0000:40:03.0 ACPI Index: 21
===== enp68s0f1
  Device: /sys/devices/pci0000:40/0000:40:03.0/0000:42:00.0/0000:43:02.0/0000:44:00.1
  DevPort: 0
  Driver: igb
  Level: 3   Slot Entry 17: ID 42:00, slot number 2
  PORT: 2
  0000:40:03.0 Label: SLOT 2
  0000:40:03.0 ACPI Index: 21
===== enp69s0f0
  Device: /sys/devices/pci0000:40/0000:40:03.0/0000:42:00.0/0000:43:04.0/0000:45:00.0
  DevPort: 0
  Driver: igb
  Level: 3   Slot Entry 17: ID 42:00, slot number 2
  PORT: 3
  0000:40:03.0 Label: SLOT 2
  0000:40:03.0 ACPI Index: 21
===== enp69s0f1
  Device: /sys/devices/pci0000:40/0000:40:03.0/0000:42:00.0/0000:43:04.0/0000:45:00.1
  DevPort: 0
  Driver: igb
  Level: 3   Slot Entry 17: ID 42:00, slot number 2
  PORT: 4
  0000:40:03.0 Label: SLOT 2
  0000:40:03.0 ACPI Index: 21

diff --git a/pslots.sh b/pslots.sh
new file mode 100755
index 0000000..2b383c7
--- /dev/null
+++ b/pslots.sh
@@ -0,0 +1,140 @@
+#!/bin/bash
+# Copyright (c) 2015 Dell Inc.  All Rights Reserved
+#
+# This code is released under LGPL license
+#
+# Display PCI slots for block and network devices
+# Display bay/ID for SSD devices
+declare -A dcmap
+
+function dcm()
+{
+    p=$1
+    dcm=$2
+    odcm=$2
+    dev=0x${p:8:2}
+    fun=0x${p:11:2}
+    sbd=${p:0:11}
+    pfunc=$((dev * 8 + fun))
+    
+    while [ ! -z $dcm ] ;do
+	port=${dcm:0:1}
+	func=0x${dcm:1:1}
+	pfi=0x${dcm:2:2}
+	flag=0x${dcm:4:6}
+	dcmap[$sbd${dcm:1:1}]=$odcm
+	if [ $((func)) = $((pfunc)) ] ; then
+	    echo "    p${port}_$((pfi))"
+	fi
+	dcm=${dcm:10}
+    done
+}
+for Y in /sys/block/* /sys/class/net/* ; do
+    RN=$(basename $Y)
+    if [ ! -e $Y/device ] ; then
+	continue
+    fi
+    RY=$(readlink -f $Y/device)
+    echo ===== $RN
+    echo "  Device: $RY"
+    if [ -e $RY/physfn ] ; then
+	RY=$(readlink -f $RY/physfn)
+	echo "  PhysFn: $RY"
+    fi
+    if [ -e $Y/dev_port ] ; then
+	DEVPORT=$(cat $Y/dev_port)
+	echo "  DevPort: $DEVPORT"
+    fi
+    FLAG=""
+    if [ -e $RY/vendor -a -e $RY/model ]; then
+	echo -n "  Vendor: "
+	cat $RY/vendor
+	echo -n "  Model: "
+	cat $RY/model
+    fi
+    BP=""
+    while [ "x$RY" != "x/" ]; do
+	P=$(basename $RY)
+	if [ -e $RY/driver/module -a $((FLAG & 0x100)) == $((0x00)) ] ; then
+	    RM=$(readlink -f $RY/driver/module)
+	    MOD=$(basename $RM)
+	    echo "  Driver: $MOD"
+	    FLAG=$((FLAG | 0x100))
+	fi
+	# Only handle PCI devices
+	if [ ! -e $RY/config ] ; then
+	    RY=$(dirname $RY)
+	    continue
+	fi
+	SEG=${P:0:4}
+	BUS=0x${P:5:2}
+	DEV=0x${P:8:2}
+	FUN=0x${P:11:1}
+	if [ -z "$BP" ] ; then
+	    BP="$((SEG)):$((BUS)):$((DEV)).$((FUN))"
+	fi
+	BUSDEV=${P:5:5}
+	if [ -e /usr/sbin/biosdecode ] ; then
+	    BDSLOT=$(biosdecode | grep "$BUSDEV.*slot" | sed -n "s/^\s*/  /p")
+	    if [ ! -z "$BDSLOT"  ] ; then
+		echo "$BDSLOT"
+		PORT=""
+		case "$BP" in
+		    "$((SEG)):$((BUS+2)):0.0"|"$((SEG)):$((BUS)):0.0")
+			PORT=$((1+DEVPORT))
+			;;
+		    "$((SEG)):$((BUS+2)):0.1"|"$((SEG)):$((BUS)):0.1")
+			PORT=2
+			;;
+		    "$((SEG)):$((BUS+3)):0.0"|"$((SEG)):$((BUS)):0.2")
+			PORT=3
+			;;
+		    "$((SEG)):$((BUS+3)):0.1"|"$((SEG)):$((BUS)):0.3")
+			PORT=4
+			;;
+		esac
+		echo "  PORT: $PORT"
+	    fi
+	fi
+	CLS=$(cat $RY/class)
+	if [ $((CLS & 0xF0000)) == $((0x20000)) -a -e $RY/vpd ] ; then
+	    DCM=${dcmap[$P]}
+	    if [ -z $DCM ] ; then
+		DCM=$(lspci -vvvv -s $P | sed -n "s/.*DCM//p")
+		dcmap[$P]=$DCM;
+	    fi
+	    echo "  DCM: $DCM"
+	    dcm $P $DCM
+	fi
+	if [ $((CLS & 0xF0000)) == $((0x10000)) ] ; then
+	    # Storage device, get bay mapping
+	    if [ -e /dev/ipmi -o -e /dev/ipmi0 ] ; then
+                MAP=$(ipmitool raw 0x30 0xd5 0x01 0x07 0x06 0x00 0x00 0x00 $BUS 0x00 2> /dev/null)
+                if [ "$MAP" != "" ] ; then
+                    BAY=$(echo $MAP | cut -f8 -d' ')
+                    SLOT=$(echo $MAP | cut -f9 -d' ')
+                    if [ $BAY != "fe" ] ; then  
+                        echo "  $P SSD bay:$BAY slot:$SLOT"
+                    fi
+                fi
+	    fi
+	fi
+	if [ -e $RY/label -a $((FLAG & 0x1)) == $((0x00)) ] ; then
+	    echo -n "  $P Label: "
+	    cat $RY/label
+	    FLAG=$((FLAG | 0x1))
+	fi
+	if [ -e $RY/acpi_index -a $((FLAG & 0x2)) == $((0x00)) ] ; then
+	    echo -n "  $P ACPI Index: "
+	    cat $RY/acpi_index
+	    FLAG=$((FLAG | 0x2))
+	fi
+	if [ -e $RY/index -a $((FLAG & 0x4)) == $((0x00)) ] ; then
+	    echo -n "  $P SMBIOS Index: "
+	    cat $RY/index
+	    FLAG=$((FLAG | 0x4))
+	fi
+	RY=$(dirname $RY)
+    done
+done
+


More information about the systemd-devel mailing list