ipmi_si_pci.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * ipmi_si_pci.c
  4. *
  5. * Handling for IPMI devices on the PCI bus.
  6. */
  7. #include <linux/module.h>
  8. #include <linux/pci.h>
  9. #include "ipmi_si.h"
  10. #define PFX "ipmi_pci: "
  11. static bool pci_registered;
  12. static bool si_trypci = true;
  13. module_param_named(trypci, si_trypci, bool, 0);
  14. MODULE_PARM_DESC(trypci, "Setting this to zero will disable the"
  15. " default scan of the interfaces identified via pci");
  16. #define PCI_DEVICE_ID_HP_MMC 0x121A
  17. static void ipmi_pci_cleanup(struct si_sm_io *io)
  18. {
  19. struct pci_dev *pdev = io->addr_source_data;
  20. pci_disable_device(pdev);
  21. }
  22. static int ipmi_pci_probe_regspacing(struct si_sm_io *io)
  23. {
  24. if (io->si_type == SI_KCS) {
  25. unsigned char status;
  26. int regspacing;
  27. io->regsize = DEFAULT_REGSIZE;
  28. io->regshift = 0;
  29. /* detect 1, 4, 16byte spacing */
  30. for (regspacing = DEFAULT_REGSPACING; regspacing <= 16;) {
  31. io->regspacing = regspacing;
  32. if (io->io_setup(io)) {
  33. dev_err(io->dev,
  34. "Could not setup I/O space\n");
  35. return DEFAULT_REGSPACING;
  36. }
  37. /* write invalid cmd */
  38. io->outputb(io, 1, 0x10);
  39. /* read status back */
  40. status = io->inputb(io, 1);
  41. io->io_cleanup(io);
  42. if (status)
  43. return regspacing;
  44. regspacing *= 4;
  45. }
  46. }
  47. return DEFAULT_REGSPACING;
  48. }
  49. static struct pci_device_id ipmi_pci_blacklist[] = {
  50. /*
  51. * This is a "Virtual IPMI device", whatever that is. It appears
  52. * as a KCS device by the class, but it is not one.
  53. */
  54. { PCI_VDEVICE(REALTEK, 0x816c) },
  55. { 0, }
  56. };
  57. static int ipmi_pci_probe(struct pci_dev *pdev,
  58. const struct pci_device_id *ent)
  59. {
  60. int rv;
  61. struct si_sm_io io;
  62. if (pci_match_id(ipmi_pci_blacklist, pdev))
  63. return -ENODEV;
  64. memset(&io, 0, sizeof(io));
  65. io.addr_source = SI_PCI;
  66. dev_info(&pdev->dev, "probing via PCI");
  67. switch (pdev->class) {
  68. case PCI_CLASS_SERIAL_IPMI_SMIC:
  69. io.si_type = SI_SMIC;
  70. break;
  71. case PCI_CLASS_SERIAL_IPMI_KCS:
  72. io.si_type = SI_KCS;
  73. break;
  74. case PCI_CLASS_SERIAL_IPMI_BT:
  75. io.si_type = SI_BT;
  76. break;
  77. default:
  78. dev_info(&pdev->dev, "Unknown IPMI class: %x\n", pdev->class);
  79. return -ENOMEM;
  80. }
  81. rv = pci_enable_device(pdev);
  82. if (rv) {
  83. dev_err(&pdev->dev, "couldn't enable PCI device\n");
  84. return rv;
  85. }
  86. io.addr_source_cleanup = ipmi_pci_cleanup;
  87. io.addr_source_data = pdev;
  88. if (pci_resource_flags(pdev, 0) & IORESOURCE_IO) {
  89. io.addr_type = IPMI_IO_ADDR_SPACE;
  90. io.io_setup = ipmi_si_port_setup;
  91. } else {
  92. io.addr_type = IPMI_MEM_ADDR_SPACE;
  93. io.io_setup = ipmi_si_mem_setup;
  94. }
  95. io.addr_data = pci_resource_start(pdev, 0);
  96. io.dev = &pdev->dev;
  97. io.regspacing = ipmi_pci_probe_regspacing(&io);
  98. io.regsize = DEFAULT_REGSIZE;
  99. io.regshift = 0;
  100. io.irq = pdev->irq;
  101. if (io.irq)
  102. io.irq_setup = ipmi_std_irq_setup;
  103. dev_info(&pdev->dev, "%pR regsize %d spacing %d irq %d\n",
  104. &pdev->resource[0], io.regsize, io.regspacing, io.irq);
  105. rv = ipmi_si_add_smi(&io);
  106. if (rv)
  107. pci_disable_device(pdev);
  108. return rv;
  109. }
  110. static void ipmi_pci_remove(struct pci_dev *pdev)
  111. {
  112. ipmi_si_remove_by_dev(&pdev->dev);
  113. }
  114. static const struct pci_device_id ipmi_pci_devices[] = {
  115. { PCI_VDEVICE(HP, PCI_DEVICE_ID_HP_MMC) },
  116. { PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_IPMI_SMIC, ~0) },
  117. { PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_IPMI_KCS, ~0) },
  118. { PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_IPMI_BT, ~0) },
  119. { 0, }
  120. };
  121. MODULE_DEVICE_TABLE(pci, ipmi_pci_devices);
  122. static struct pci_driver ipmi_pci_driver = {
  123. .name = DEVICE_NAME,
  124. .id_table = ipmi_pci_devices,
  125. .probe = ipmi_pci_probe,
  126. .remove = ipmi_pci_remove,
  127. };
  128. void ipmi_si_pci_init(void)
  129. {
  130. if (si_trypci) {
  131. int rv = pci_register_driver(&ipmi_pci_driver);
  132. if (rv)
  133. pr_err(PFX "Unable to register PCI driver: %d\n", rv);
  134. else
  135. pci_registered = true;
  136. }
  137. }
  138. void ipmi_si_pci_shutdown(void)
  139. {
  140. if (pci_registered)
  141. pci_unregister_driver(&ipmi_pci_driver);
  142. }