Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

cxl/test: Adjust the mock version of devm_cxl_switch_port_decoders_setup()

With devm_cxl_switch_port_decoders_setup() being called within cxl_core
instead of by the port driver probe, adjustments are needed to deal with
circular symbol dependency when this function is being mock'd. Add the
appropriate changes to get around the circular dependency.

Reviewed-by: Alison Schofield <alison.schofield@intel.com>
Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>
Signed-off-by: Dave Jiang <dave.jiang@intel.com>

+25 -7
+3 -3
drivers/cxl/core/hdm.c
··· 1216 1216 } 1217 1217 1218 1218 /** 1219 - * devm_cxl_switch_port_decoders_setup - allocate and setup switch decoders 1219 + * __devm_cxl_switch_port_decoders_setup - allocate and setup switch decoders 1220 1220 * @port: CXL port context 1221 1221 * 1222 1222 * Return 0 or -errno on error 1223 1223 */ 1224 - int devm_cxl_switch_port_decoders_setup(struct cxl_port *port) 1224 + int __devm_cxl_switch_port_decoders_setup(struct cxl_port *port) 1225 1225 { 1226 1226 struct cxl_hdm *cxlhdm; 1227 1227 ··· 1245 1245 dev_err(&port->dev, "HDM decoder capability not found\n"); 1246 1246 return -ENXIO; 1247 1247 } 1248 - EXPORT_SYMBOL_NS_GPL(devm_cxl_switch_port_decoders_setup, "CXL"); 1248 + EXPORT_SYMBOL_NS_GPL(__devm_cxl_switch_port_decoders_setup, "CXL"); 1249 1249 1250 1250 /** 1251 1251 * devm_cxl_endpoint_decoders_setup - allocate and setup endpoint decoders
+2
drivers/cxl/cxl.h
··· 811 811 }; 812 812 813 813 int devm_cxl_switch_port_decoders_setup(struct cxl_port *port); 814 + int __devm_cxl_switch_port_decoders_setup(struct cxl_port *port); 814 815 int devm_cxl_endpoint_decoders_setup(struct cxl_port *port); 815 816 816 817 struct cxl_dev_state; ··· 935 934 #ifndef CXL_TEST_ENABLE 936 935 #define DECLARE_TESTABLE(x) __##x 937 936 #define devm_cxl_add_dport_by_dev DECLARE_TESTABLE(devm_cxl_add_dport_by_dev) 937 + #define devm_cxl_switch_port_decoders_setup DECLARE_TESTABLE(devm_cxl_switch_port_decoders_setup) 938 938 #endif 939 939 940 940 #endif /* __CXL_H__ */
-1
tools/testing/cxl/Kbuild
··· 10 10 ldflags-y += --wrap=cxl_rcd_component_reg_phys 11 11 ldflags-y += --wrap=cxl_endpoint_parse_cdat 12 12 ldflags-y += --wrap=cxl_dport_init_ras_reporting 13 - ldflags-y += --wrap=devm_cxl_switch_port_decoders_setup 14 13 ldflags-y += --wrap=devm_cxl_endpoint_decoders_setup 15 14 16 15 DRIVERS := ../../../drivers
+10
tools/testing/cxl/cxl_core_exports.c
··· 17 17 return _devm_cxl_add_dport_by_dev(port, dport_dev); 18 18 } 19 19 EXPORT_SYMBOL_NS_GPL(devm_cxl_add_dport_by_dev, "CXL"); 20 + 21 + cxl_switch_decoders_setup_fn _devm_cxl_switch_port_decoders_setup = 22 + __devm_cxl_switch_port_decoders_setup; 23 + EXPORT_SYMBOL_NS_GPL(_devm_cxl_switch_port_decoders_setup, "CXL"); 24 + 25 + int devm_cxl_switch_port_decoders_setup(struct cxl_port *port) 26 + { 27 + return _devm_cxl_switch_port_decoders_setup(port); 28 + } 29 + EXPORT_SYMBOL_NS_GPL(devm_cxl_switch_port_decoders_setup, "CXL");
+3
tools/testing/cxl/exports.h
··· 7 7 struct device *dport_dev); 8 8 extern cxl_add_dport_by_dev_fn _devm_cxl_add_dport_by_dev; 9 9 10 + typedef int(*cxl_switch_decoders_setup_fn)(struct cxl_port *port); 11 + extern cxl_switch_decoders_setup_fn _devm_cxl_switch_port_decoders_setup; 12 + 10 13 #endif
+7 -3
tools/testing/cxl/test/mock.c
··· 17 17 static struct cxl_dport * 18 18 redirect_devm_cxl_add_dport_by_dev(struct cxl_port *port, 19 19 struct device *dport_dev); 20 + static int redirect_devm_cxl_switch_port_decoders_setup(struct cxl_port *port); 20 21 21 22 void register_cxl_mock_ops(struct cxl_mock_ops *ops) 22 23 { 23 24 list_add_rcu(&ops->list, &mock); 24 25 _devm_cxl_add_dport_by_dev = redirect_devm_cxl_add_dport_by_dev; 26 + _devm_cxl_switch_port_decoders_setup = 27 + redirect_devm_cxl_switch_port_decoders_setup; 25 28 } 26 29 EXPORT_SYMBOL_GPL(register_cxl_mock_ops); 27 30 ··· 32 29 33 30 void unregister_cxl_mock_ops(struct cxl_mock_ops *ops) 34 31 { 32 + _devm_cxl_switch_port_decoders_setup = 33 + __devm_cxl_switch_port_decoders_setup; 35 34 _devm_cxl_add_dport_by_dev = __devm_cxl_add_dport_by_dev; 36 35 list_del_rcu(&ops->list); 37 36 synchronize_srcu(&cxl_mock_srcu); ··· 143 138 } 144 139 EXPORT_SYMBOL_GPL(__wrap_nvdimm_bus_register); 145 140 146 - int __wrap_devm_cxl_switch_port_decoders_setup(struct cxl_port *port) 141 + int redirect_devm_cxl_switch_port_decoders_setup(struct cxl_port *port) 147 142 { 148 143 int rc, index; 149 144 struct cxl_mock_ops *ops = get_cxl_mock_ops(&index); ··· 151 146 if (ops && ops->is_mock_port(port->uport_dev)) 152 147 rc = ops->devm_cxl_switch_port_decoders_setup(port); 153 148 else 154 - rc = devm_cxl_switch_port_decoders_setup(port); 149 + rc = __devm_cxl_switch_port_decoders_setup(port); 155 150 put_cxl_mock_ops(index); 156 151 157 152 return rc; 158 153 } 159 - EXPORT_SYMBOL_NS_GPL(__wrap_devm_cxl_switch_port_decoders_setup, "CXL"); 160 154 161 155 int __wrap_devm_cxl_endpoint_decoders_setup(struct cxl_port *port) 162 156 {