device_info.sh 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #! /bin/bash
  2. BAR=0
  3. function pci {
  4. PCILIB_PATH=`pwd`/..
  5. LD_LIBRARY_PATH="$PCILIB_PATH/pcilib" $PCILIB_PATH/pcitool/pci $*
  6. }
  7. function read_cfg {
  8. pci -a config -r 0x$1 | awk '{ print $2; }' | sed -e 's/\s*//g' -e '/^\s*$/d'
  9. }
  10. function parse_config {
  11. info=0x`pci -b $BAR -r 0 | awk '{ print $2; }' | sed -e 's/\s*//g' -e '/^\s*$/d'`
  12. model=`printf "%X" $((info>>24))`
  13. if [ $model -eq 14 ]; then
  14. model="Xilinx Virtex-6"
  15. else
  16. model="Xilinx $model"
  17. fi
  18. version=$(((info >> 8) & 0xFF))
  19. data_width=$((16 * (2 ** ((info >> 16) & 0xF))))
  20. echo "$model, build $version, $data_width bits"
  21. next=`read_cfg 34 | cut -c 7-8`
  22. # next=`printf "%u" $next`
  23. while [ $((0x$next)) -ne 0 ]; do
  24. cap=`read_cfg $next`
  25. capid=`echo $cap | cut -c 7-8`
  26. if [ $capid -eq 10 ]; then
  27. addr=`printf "%X" $((0x$next + 4))`
  28. device_capabilities=`read_cfg $addr`
  29. addr=`printf "%X" $((0x$next + 8))`
  30. device_control=`read_cfg $addr`
  31. addr=`printf "%X" $((0x$next + 12))`
  32. pcie_link1=`read_cfg $addr`
  33. addr=`printf "%X" $((0x$next + 16))`
  34. pcie_link2=`read_cfg $addr`
  35. link_speed=$((((0x$pcie_link2 & 0xF0000) >> 16)))
  36. link_width=$((((0x$pcie_link2 & 0x3F00000) >> 20)))
  37. dev_link_speed=$((((0x$pcie_link1 & 0xF))))
  38. dev_link_width=$((((0x$pcie_link1 & 0x3F0) >> 4)))
  39. max_payload=$(((1 << ((0x$device_capabilities & 0x07) + 7))))
  40. dev_payload=$(((1 << (((0x$device_capabilities >> 5) & 0x07) + 7))))
  41. fi
  42. next=`echo $cap | cut -c 5-6`
  43. done
  44. echo "Link: PCIe gen$link_speed x$link_width"
  45. if [ $link_speed -ne $dev_link_speed -o $link_width -ne $dev_link_width ]; then
  46. echo " * But device capable of gen$dev_link_speed x$dev_link_width"
  47. fi
  48. echo "Payload: $dev_payload"
  49. if [ $dev_payload -ne $max_payload ]; then
  50. echo " * But device capable of $max_payload"
  51. fi
  52. info=0x`read_cfg 40`
  53. max_tlp=$((2 ** (5 + ((info & 0xE0) >> 5))))
  54. echo "TLP: 32 dwords (transfering 32 TLP per request)"
  55. if [ $max_tlp -ne 32 ]; then
  56. echo " * But device is able to transfer TLP up to $max_tlp bytes"
  57. fi
  58. # 2500 MT/s, but PCIe gen1 and gen2 uses 10 bit encoding
  59. speed=$((link_width * link_speed * 2500 / 10))
  60. }
  61. parse_config