pci_event.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright IBM Corp. 2012
  4. *
  5. * Author(s):
  6. * Jan Glauber <jang@linux.vnet.ibm.com>
  7. */
  8. #define KMSG_COMPONENT "zpci"
  9. #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
  10. #include <linux/kernel.h>
  11. #include <linux/pci.h>
  12. #include <asm/pci_debug.h>
  13. #include <asm/sclp.h>
  14. /* Content Code Description for PCI Function Error */
  15. struct zpci_ccdf_err {
  16. u32 reserved1;
  17. u32 fh; /* function handle */
  18. u32 fid; /* function id */
  19. u32 ett : 4; /* expected table type */
  20. u32 mvn : 12; /* MSI vector number */
  21. u32 dmaas : 8; /* DMA address space */
  22. u32 : 6;
  23. u32 q : 1; /* event qualifier */
  24. u32 rw : 1; /* read/write */
  25. u64 faddr; /* failing address */
  26. u32 reserved3;
  27. u16 reserved4;
  28. u16 pec; /* PCI event code */
  29. } __packed;
  30. /* Content Code Description for PCI Function Availability */
  31. struct zpci_ccdf_avail {
  32. u32 reserved1;
  33. u32 fh; /* function handle */
  34. u32 fid; /* function id */
  35. u32 reserved2;
  36. u32 reserved3;
  37. u32 reserved4;
  38. u32 reserved5;
  39. u16 reserved6;
  40. u16 pec; /* PCI event code */
  41. } __packed;
  42. static void __zpci_event_error(struct zpci_ccdf_err *ccdf)
  43. {
  44. struct zpci_dev *zdev = get_zdev_by_fid(ccdf->fid);
  45. struct pci_dev *pdev = NULL;
  46. zpci_err("error CCDF:\n");
  47. zpci_err_hex(ccdf, sizeof(*ccdf));
  48. if (zdev)
  49. pdev = pci_get_slot(zdev->bus, ZPCI_DEVFN);
  50. pr_err("%s: Event 0x%x reports an error for PCI function 0x%x\n",
  51. pdev ? pci_name(pdev) : "n/a", ccdf->pec, ccdf->fid);
  52. if (!pdev)
  53. return;
  54. pdev->error_state = pci_channel_io_perm_failure;
  55. pci_dev_put(pdev);
  56. }
  57. void zpci_event_error(void *data)
  58. {
  59. if (zpci_is_enabled())
  60. __zpci_event_error(data);
  61. }
  62. static void __zpci_event_availability(struct zpci_ccdf_avail *ccdf)
  63. {
  64. struct zpci_dev *zdev = get_zdev_by_fid(ccdf->fid);
  65. struct pci_dev *pdev = NULL;
  66. enum zpci_state state;
  67. int ret;
  68. if (zdev)
  69. pdev = pci_get_slot(zdev->bus, ZPCI_DEVFN);
  70. pr_info("%s: Event 0x%x reconfigured PCI function 0x%x\n",
  71. pdev ? pci_name(pdev) : "n/a", ccdf->pec, ccdf->fid);
  72. zpci_err("avail CCDF:\n");
  73. zpci_err_hex(ccdf, sizeof(*ccdf));
  74. switch (ccdf->pec) {
  75. case 0x0301: /* Reserved|Standby -> Configured */
  76. if (!zdev) {
  77. ret = clp_add_pci_device(ccdf->fid, ccdf->fh, 0);
  78. if (ret)
  79. break;
  80. zdev = get_zdev_by_fid(ccdf->fid);
  81. }
  82. if (!zdev || zdev->state != ZPCI_FN_STATE_STANDBY)
  83. break;
  84. zdev->state = ZPCI_FN_STATE_CONFIGURED;
  85. zdev->fh = ccdf->fh;
  86. ret = zpci_enable_device(zdev);
  87. if (ret)
  88. break;
  89. pci_lock_rescan_remove();
  90. pci_rescan_bus(zdev->bus);
  91. pci_unlock_rescan_remove();
  92. break;
  93. case 0x0302: /* Reserved -> Standby */
  94. if (!zdev)
  95. clp_add_pci_device(ccdf->fid, ccdf->fh, 0);
  96. break;
  97. case 0x0303: /* Deconfiguration requested */
  98. if (!zdev)
  99. break;
  100. if (pdev)
  101. pci_stop_and_remove_bus_device_locked(pdev);
  102. ret = zpci_disable_device(zdev);
  103. if (ret)
  104. break;
  105. ret = sclp_pci_deconfigure(zdev->fid);
  106. zpci_dbg(3, "deconf fid:%x, rc:%d\n", zdev->fid, ret);
  107. if (!ret)
  108. zdev->state = ZPCI_FN_STATE_STANDBY;
  109. break;
  110. case 0x0304: /* Configured -> Standby|Reserved */
  111. if (!zdev)
  112. break;
  113. if (pdev) {
  114. /* Give the driver a hint that the function is
  115. * already unusable. */
  116. pdev->error_state = pci_channel_io_perm_failure;
  117. pci_stop_and_remove_bus_device_locked(pdev);
  118. }
  119. zdev->fh = ccdf->fh;
  120. zpci_disable_device(zdev);
  121. zdev->state = ZPCI_FN_STATE_STANDBY;
  122. if (!clp_get_state(ccdf->fid, &state) &&
  123. state == ZPCI_FN_STATE_RESERVED) {
  124. zpci_remove_device(zdev);
  125. }
  126. break;
  127. case 0x0306: /* 0x308 or 0x302 for multiple devices */
  128. clp_rescan_pci_devices();
  129. break;
  130. case 0x0308: /* Standby -> Reserved */
  131. if (!zdev)
  132. break;
  133. zpci_remove_device(zdev);
  134. break;
  135. default:
  136. break;
  137. }
  138. pci_dev_put(pdev);
  139. }
  140. void zpci_event_availability(void *data)
  141. {
  142. if (zpci_is_enabled())
  143. __zpci_event_availability(data);
  144. }