pci_event.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. /*
  2. * Copyright IBM Corp. 2012
  3. *
  4. * Author(s):
  5. * Jan Glauber <jang@linux.vnet.ibm.com>
  6. */
  7. #define COMPONENT "zPCI"
  8. #define pr_fmt(fmt) COMPONENT ": " fmt
  9. #include <linux/kernel.h>
  10. #include <linux/pci.h>
  11. #include <asm/pci_debug.h>
  12. #include <asm/sclp.h>
  13. /* Content Code Description for PCI Function Error */
  14. struct zpci_ccdf_err {
  15. u32 reserved1;
  16. u32 fh; /* function handle */
  17. u32 fid; /* function id */
  18. u32 ett : 4; /* expected table type */
  19. u32 mvn : 12; /* MSI vector number */
  20. u32 dmaas : 8; /* DMA address space */
  21. u32 : 6;
  22. u32 q : 1; /* event qualifier */
  23. u32 rw : 1; /* read/write */
  24. u64 faddr; /* failing address */
  25. u32 reserved3;
  26. u16 reserved4;
  27. u16 pec; /* PCI event code */
  28. } __packed;
  29. /* Content Code Description for PCI Function Availability */
  30. struct zpci_ccdf_avail {
  31. u32 reserved1;
  32. u32 fh; /* function handle */
  33. u32 fid; /* function id */
  34. u32 reserved2;
  35. u32 reserved3;
  36. u32 reserved4;
  37. u32 reserved5;
  38. u16 reserved6;
  39. u16 pec; /* PCI event code */
  40. } __packed;
  41. void zpci_event_error(void *data)
  42. {
  43. struct zpci_ccdf_err *ccdf = data;
  44. struct zpci_dev *zdev = get_zdev_by_fid(ccdf->fid);
  45. zpci_err("error CCDF:\n");
  46. zpci_err_hex(ccdf, sizeof(*ccdf));
  47. if (!zdev)
  48. return;
  49. pr_err("%s: Event 0x%x reports an error for PCI function 0x%x\n",
  50. pci_name(zdev->pdev), ccdf->pec, ccdf->fid);
  51. }
  52. void zpci_event_availability(void *data)
  53. {
  54. struct zpci_ccdf_avail *ccdf = data;
  55. struct zpci_dev *zdev = get_zdev_by_fid(ccdf->fid);
  56. struct pci_dev *pdev = zdev ? zdev->pdev : NULL;
  57. int ret;
  58. pr_info("%s: Event 0x%x reconfigured PCI function 0x%x\n",
  59. pdev ? pci_name(pdev) : "n/a", ccdf->pec, ccdf->fid);
  60. zpci_err("avail CCDF:\n");
  61. zpci_err_hex(ccdf, sizeof(*ccdf));
  62. switch (ccdf->pec) {
  63. case 0x0301: /* Standby -> Configured */
  64. if (!zdev || zdev->state == ZPCI_FN_STATE_CONFIGURED)
  65. break;
  66. zdev->state = ZPCI_FN_STATE_CONFIGURED;
  67. ret = zpci_enable_device(zdev);
  68. if (ret)
  69. break;
  70. pci_rescan_bus(zdev->bus);
  71. break;
  72. case 0x0302: /* Reserved -> Standby */
  73. clp_add_pci_device(ccdf->fid, ccdf->fh, 0);
  74. break;
  75. case 0x0303: /* Deconfiguration requested */
  76. if (pdev)
  77. pci_stop_and_remove_bus_device(pdev);
  78. ret = zpci_disable_device(zdev);
  79. if (ret)
  80. break;
  81. ret = sclp_pci_deconfigure(zdev->fid);
  82. zpci_dbg(3, "deconf fid:%x, rc:%d\n", zdev->fid, ret);
  83. if (!ret)
  84. zdev->state = ZPCI_FN_STATE_STANDBY;
  85. break;
  86. case 0x0304: /* Configured -> Standby */
  87. if (pdev)
  88. pci_stop_and_remove_bus_device(pdev);
  89. zpci_disable_device(zdev);
  90. zdev->state = ZPCI_FN_STATE_STANDBY;
  91. break;
  92. case 0x0306: /* 0x308 or 0x302 for multiple devices */
  93. clp_rescan_pci_devices();
  94. break;
  95. case 0x0308: /* Standby -> Reserved */
  96. pci_stop_root_bus(zdev->bus);
  97. pci_remove_root_bus(zdev->bus);
  98. break;
  99. default:
  100. break;
  101. }
  102. }