mock.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. //Copyright(c) 2021 Intel Corporation. All rights reserved.
  3. #include <linux/libnvdimm.h>
  4. #include <linux/rculist.h>
  5. #include <linux/device.h>
  6. #include <linux/export.h>
  7. #include <linux/acpi.h>
  8. #include <linux/pci.h>
  9. #include <cxlmem.h>
  10. #include <cxlpci.h>
  11. #include "mock.h"
  12. static LIST_HEAD(mock);
  13. void register_cxl_mock_ops(struct cxl_mock_ops *ops)
  14. {
  15. list_add_rcu(&ops->list, &mock);
  16. }
  17. EXPORT_SYMBOL_GPL(register_cxl_mock_ops);
  18. static DEFINE_SRCU(cxl_mock_srcu);
  19. void unregister_cxl_mock_ops(struct cxl_mock_ops *ops)
  20. {
  21. list_del_rcu(&ops->list);
  22. synchronize_srcu(&cxl_mock_srcu);
  23. }
  24. EXPORT_SYMBOL_GPL(unregister_cxl_mock_ops);
  25. struct cxl_mock_ops *get_cxl_mock_ops(int *index)
  26. {
  27. *index = srcu_read_lock(&cxl_mock_srcu);
  28. return list_first_or_null_rcu(&mock, struct cxl_mock_ops, list);
  29. }
  30. EXPORT_SYMBOL_GPL(get_cxl_mock_ops);
  31. void put_cxl_mock_ops(int index)
  32. {
  33. srcu_read_unlock(&cxl_mock_srcu, index);
  34. }
  35. EXPORT_SYMBOL_GPL(put_cxl_mock_ops);
  36. bool __wrap_is_acpi_device_node(const struct fwnode_handle *fwnode)
  37. {
  38. struct acpi_device *adev =
  39. container_of(fwnode, struct acpi_device, fwnode);
  40. int index;
  41. struct cxl_mock_ops *ops = get_cxl_mock_ops(&index);
  42. bool retval = false;
  43. if (ops)
  44. retval = ops->is_mock_adev(adev);
  45. if (!retval)
  46. retval = is_acpi_device_node(fwnode);
  47. put_cxl_mock_ops(index);
  48. return retval;
  49. }
  50. EXPORT_SYMBOL(__wrap_is_acpi_device_node);
  51. int __wrap_acpi_table_parse_cedt(enum acpi_cedt_type id,
  52. acpi_tbl_entry_handler_arg handler_arg,
  53. void *arg)
  54. {
  55. int index, rc;
  56. struct cxl_mock_ops *ops = get_cxl_mock_ops(&index);
  57. if (ops)
  58. rc = ops->acpi_table_parse_cedt(id, handler_arg, arg);
  59. else
  60. rc = acpi_table_parse_cedt(id, handler_arg, arg);
  61. put_cxl_mock_ops(index);
  62. return rc;
  63. }
  64. EXPORT_SYMBOL_NS_GPL(__wrap_acpi_table_parse_cedt, ACPI);
  65. acpi_status __wrap_acpi_evaluate_integer(acpi_handle handle,
  66. acpi_string pathname,
  67. struct acpi_object_list *arguments,
  68. unsigned long long *data)
  69. {
  70. int index;
  71. struct cxl_mock_ops *ops = get_cxl_mock_ops(&index);
  72. acpi_status status;
  73. if (ops)
  74. status = ops->acpi_evaluate_integer(handle, pathname, arguments,
  75. data);
  76. else
  77. status = acpi_evaluate_integer(handle, pathname, arguments,
  78. data);
  79. put_cxl_mock_ops(index);
  80. return status;
  81. }
  82. EXPORT_SYMBOL(__wrap_acpi_evaluate_integer);
  83. struct acpi_pci_root *__wrap_acpi_pci_find_root(acpi_handle handle)
  84. {
  85. int index;
  86. struct acpi_pci_root *root;
  87. struct cxl_mock_ops *ops = get_cxl_mock_ops(&index);
  88. if (ops)
  89. root = ops->acpi_pci_find_root(handle);
  90. else
  91. root = acpi_pci_find_root(handle);
  92. put_cxl_mock_ops(index);
  93. return root;
  94. }
  95. EXPORT_SYMBOL_GPL(__wrap_acpi_pci_find_root);
  96. struct nvdimm_bus *
  97. __wrap_nvdimm_bus_register(struct device *dev,
  98. struct nvdimm_bus_descriptor *nd_desc)
  99. {
  100. int index;
  101. struct cxl_mock_ops *ops = get_cxl_mock_ops(&index);
  102. if (ops && ops->is_mock_dev(dev->parent->parent))
  103. nd_desc->provider_name = "cxl_test";
  104. put_cxl_mock_ops(index);
  105. return nvdimm_bus_register(dev, nd_desc);
  106. }
  107. EXPORT_SYMBOL_GPL(__wrap_nvdimm_bus_register);
  108. struct cxl_hdm *__wrap_devm_cxl_setup_hdm(struct cxl_port *port)
  109. {
  110. int index;
  111. struct cxl_hdm *cxlhdm;
  112. struct cxl_mock_ops *ops = get_cxl_mock_ops(&index);
  113. if (ops && ops->is_mock_port(port->uport))
  114. cxlhdm = ops->devm_cxl_setup_hdm(port);
  115. else
  116. cxlhdm = devm_cxl_setup_hdm(port);
  117. put_cxl_mock_ops(index);
  118. return cxlhdm;
  119. }
  120. EXPORT_SYMBOL_NS_GPL(__wrap_devm_cxl_setup_hdm, CXL);
  121. int __wrap_devm_cxl_add_passthrough_decoder(struct cxl_port *port)
  122. {
  123. int rc, index;
  124. struct cxl_mock_ops *ops = get_cxl_mock_ops(&index);
  125. if (ops && ops->is_mock_port(port->uport))
  126. rc = ops->devm_cxl_add_passthrough_decoder(port);
  127. else
  128. rc = devm_cxl_add_passthrough_decoder(port);
  129. put_cxl_mock_ops(index);
  130. return rc;
  131. }
  132. EXPORT_SYMBOL_NS_GPL(__wrap_devm_cxl_add_passthrough_decoder, CXL);
  133. int __wrap_devm_cxl_enumerate_decoders(struct cxl_hdm *cxlhdm)
  134. {
  135. int rc, index;
  136. struct cxl_port *port = cxlhdm->port;
  137. struct cxl_mock_ops *ops = get_cxl_mock_ops(&index);
  138. if (ops && ops->is_mock_port(port->uport))
  139. rc = ops->devm_cxl_enumerate_decoders(cxlhdm);
  140. else
  141. rc = devm_cxl_enumerate_decoders(cxlhdm);
  142. put_cxl_mock_ops(index);
  143. return rc;
  144. }
  145. EXPORT_SYMBOL_NS_GPL(__wrap_devm_cxl_enumerate_decoders, CXL);
  146. int __wrap_devm_cxl_port_enumerate_dports(struct cxl_port *port)
  147. {
  148. int rc, index;
  149. struct cxl_mock_ops *ops = get_cxl_mock_ops(&index);
  150. if (ops && ops->is_mock_port(port->uport))
  151. rc = ops->devm_cxl_port_enumerate_dports(port);
  152. else
  153. rc = devm_cxl_port_enumerate_dports(port);
  154. put_cxl_mock_ops(index);
  155. return rc;
  156. }
  157. EXPORT_SYMBOL_NS_GPL(__wrap_devm_cxl_port_enumerate_dports, CXL);
  158. int __wrap_cxl_await_media_ready(struct cxl_dev_state *cxlds)
  159. {
  160. int rc, index;
  161. struct cxl_mock_ops *ops = get_cxl_mock_ops(&index);
  162. if (ops && ops->is_mock_dev(cxlds->dev))
  163. rc = 0;
  164. else
  165. rc = cxl_await_media_ready(cxlds);
  166. put_cxl_mock_ops(index);
  167. return rc;
  168. }
  169. EXPORT_SYMBOL_NS_GPL(__wrap_cxl_await_media_ready, CXL);
  170. int __wrap_cxl_hdm_decode_init(struct cxl_dev_state *cxlds,
  171. struct cxl_hdm *cxlhdm)
  172. {
  173. int rc = 0, index;
  174. struct cxl_mock_ops *ops = get_cxl_mock_ops(&index);
  175. if (ops && ops->is_mock_dev(cxlds->dev))
  176. rc = 0;
  177. else
  178. rc = cxl_hdm_decode_init(cxlds, cxlhdm);
  179. put_cxl_mock_ops(index);
  180. return rc;
  181. }
  182. EXPORT_SYMBOL_NS_GPL(__wrap_cxl_hdm_decode_init, CXL);
  183. MODULE_LICENSE("GPL v2");
  184. MODULE_IMPORT_NS(ACPI);
  185. MODULE_IMPORT_NS(CXL);