cxl/test: Refactor platform device enumerations

Split all the host bridges, rootports, upstream and downstream ports
enumerations to separate helper functions. This should make adding
type2 hierarchy easier later on.

Tested-by: Alison Schofield <alison.schofield@intel.com>
Reviewed-by: Alison Schofield <alison.schofield@intel.com>
Link: https://patch.msgid.link/20260629221104.3891733-4-dave.jiang@intel.com
Signed-off-by: Dave Jiang <dave.jiang@intel.com>
This commit is contained in:
Dave Jiang 2026-06-29 15:11:00 -07:00
parent fc8fc576d9
commit a6d37152d2

View File

@ -1866,10 +1866,204 @@ static bool __init have_multiple_modparms(void)
return count > 1;
}
static void host_bridges_remove(void)
{
int i;
for (i = ARRAY_SIZE(cxl_host_bridge) - 1; i >= 0; i--) {
struct platform_device *pdev = cxl_host_bridge[i];
if (!pdev)
continue;
sysfs_remove_link(&pdev->dev.kobj, "physical_node");
platform_device_unregister(cxl_host_bridge[i]);
}
}
static int host_bridges_populate(void)
{
int rc = 0;
for (int i = 0; i < ARRAY_SIZE(cxl_host_bridge); i++) {
struct acpi_device *adev = &host_bridge[i];
struct platform_device *pdev;
pdev = platform_device_alloc("cxl_host_bridge", i);
if (!pdev) {
rc = -ENOMEM;
goto err_bridge;
}
mock_companion(adev, &pdev->dev);
rc = cxl_mock_platform_device_add(pdev, &cxl_host_bridge[i]);
if (rc)
goto err_bridge;
mock_pci_bus[i].bridge = &pdev->dev;
rc = sysfs_create_link(&pdev->dev.kobj, &pdev->dev.kobj,
"physical_node");
if (rc)
goto err_bridge;
}
return 0;
err_bridge:
host_bridges_remove();
return rc;
}
static void cxl_rootports_remove(void)
{
for (int i = ARRAY_SIZE(cxl_root_port) - 1; i >= 0; i--) {
struct platform_device *pdev = cxl_root_port[i];
if (!pdev)
continue;
platform_device_unregister(pdev);
}
}
static int cxl_rootports_populate(void)
{
int rc = 0;
for (int i = 0; i < ARRAY_SIZE(cxl_root_port); i++) {
struct platform_device *bridge =
cxl_host_bridge[i % ARRAY_SIZE(cxl_host_bridge)];
struct platform_device *pdev;
pdev = platform_device_alloc("cxl_root_port", i);
if (!pdev) {
rc = -ENOMEM;
goto err_port;
}
pdev->dev.parent = &bridge->dev;
rc = cxl_mock_platform_device_add(pdev, &cxl_root_port[i]);
if (rc)
goto err_port;
}
return 0;
err_port:
cxl_rootports_remove();
return rc;
}
static void cxl_usps_remove(void)
{
for (int i = ARRAY_SIZE(cxl_switch_uport) - 1; i >= 0; i--) {
struct platform_device *pdev = cxl_switch_uport[i];
if (!pdev)
continue;
platform_device_unregister(cxl_switch_uport[i]);
}
}
static int cxl_usps_populate(void)
{
int rc = 0;
for (int i = 0; i < ARRAY_SIZE(cxl_switch_uport); i++) {
struct platform_device *root_port = cxl_root_port[i];
struct platform_device *pdev;
pdev = platform_device_alloc("cxl_switch_uport", i);
if (!pdev) {
rc = -ENOMEM;
goto err_uport;
}
pdev->dev.parent = &root_port->dev;
rc = cxl_mock_platform_device_add(pdev, &cxl_switch_uport[i]);
if (rc)
goto err_uport;
}
return 0;
err_uport:
cxl_usps_remove();
return rc;
}
static void cxl_dsps_remove(void)
{
for (int i = ARRAY_SIZE(cxl_switch_dport) - 1; i >= 0; i--) {
struct platform_device *pdev = cxl_switch_dport[i];
if (!pdev)
continue;
platform_device_unregister(cxl_switch_dport[i]);
}
}
static int cxl_dsps_populate(void)
{
int rc = 0;
for (int i = 0; i < ARRAY_SIZE(cxl_switch_dport); i++) {
struct platform_device *uport =
cxl_switch_uport[i % ARRAY_SIZE(cxl_switch_uport)];
struct platform_device *pdev;
pdev = platform_device_alloc("cxl_switch_dport", i);
if (!pdev) {
rc = -ENOMEM;
goto err_dport;
}
pdev->dev.parent = &uport->dev;
rc = cxl_mock_platform_device_add(pdev, &cxl_switch_dport[i]);
if (rc)
goto err_dport;
}
return 0;
err_dport:
cxl_dsps_remove();
return rc;
}
static void cxl_switches_remove(void)
{
cxl_dsps_remove();
cxl_usps_remove();
}
static int cxl_switches_populate(void)
{
int rc;
BUILD_BUG_ON(ARRAY_SIZE(cxl_switch_uport) != ARRAY_SIZE(cxl_root_port));
rc = cxl_usps_populate();
if (rc)
return rc;
rc = cxl_dsps_populate();
if (rc) {
cxl_usps_remove();
return rc;
}
return 0;
}
static __init int cxl_test_init(void)
{
int rc, i;
struct range mappable;
int rc;
/* Enforce a single module param active at a time */
if (have_multiple_modparms())
@ -1915,74 +2109,21 @@ static __init int cxl_test_init(void)
if (rc)
goto err_populate;
for (i = 0; i < ARRAY_SIZE(cxl_host_bridge); i++) {
struct acpi_device *adev = &host_bridge[i];
struct platform_device *pdev;
rc = host_bridges_populate();
if (rc)
goto err_populate;
pdev = platform_device_alloc("cxl_host_bridge", i);
if (!pdev)
goto err_bridge;
rc = cxl_rootports_populate();
if (rc)
goto err_host_bridges;
mock_companion(adev, &pdev->dev);
rc = cxl_mock_platform_device_add(pdev, &cxl_host_bridge[i]);
if (rc)
goto err_bridge;
mock_pci_bus[i].bridge = &pdev->dev;
rc = sysfs_create_link(&pdev->dev.kobj, &pdev->dev.kobj,
"physical_node");
if (rc)
goto err_bridge;
}
for (i = 0; i < ARRAY_SIZE(cxl_root_port); i++) {
struct platform_device *bridge =
cxl_host_bridge[i % ARRAY_SIZE(cxl_host_bridge)];
struct platform_device *pdev;
pdev = platform_device_alloc("cxl_root_port", i);
if (!pdev)
goto err_port;
pdev->dev.parent = &bridge->dev;
rc = cxl_mock_platform_device_add(pdev, &cxl_root_port[i]);
if (rc)
goto err_port;
}
BUILD_BUG_ON(ARRAY_SIZE(cxl_switch_uport) != ARRAY_SIZE(cxl_root_port));
for (i = 0; i < ARRAY_SIZE(cxl_switch_uport); i++) {
struct platform_device *root_port = cxl_root_port[i];
struct platform_device *pdev;
pdev = platform_device_alloc("cxl_switch_uport", i);
if (!pdev)
goto err_uport;
pdev->dev.parent = &root_port->dev;
rc = cxl_mock_platform_device_add(pdev, &cxl_switch_uport[i]);
if (rc)
goto err_uport;
}
for (i = 0; i < ARRAY_SIZE(cxl_switch_dport); i++) {
struct platform_device *uport =
cxl_switch_uport[i % ARRAY_SIZE(cxl_switch_uport)];
struct platform_device *pdev;
pdev = platform_device_alloc("cxl_switch_dport", i);
if (!pdev)
goto err_dport;
pdev->dev.parent = &uport->dev;
rc = cxl_mock_platform_device_add(pdev, &cxl_switch_dport[i]);
if (rc)
goto err_dport;
}
rc = cxl_switches_populate();
if (rc)
goto err_root_ports;
rc = cxl_single_topo_init();
if (rc)
goto err_dport;
goto err_switches;
rc = cxl_rch_topo_init();
if (rc)
@ -2018,24 +2159,12 @@ static __init int cxl_test_init(void)
cxl_rch_topo_exit();
err_single:
cxl_single_topo_exit();
err_dport:
for (i = ARRAY_SIZE(cxl_switch_dport) - 1; i >= 0; i--)
platform_device_unregister(cxl_switch_dport[i]);
err_uport:
for (i = ARRAY_SIZE(cxl_switch_uport) - 1; i >= 0; i--)
platform_device_unregister(cxl_switch_uport[i]);
err_port:
for (i = ARRAY_SIZE(cxl_root_port) - 1; i >= 0; i--)
platform_device_unregister(cxl_root_port[i]);
err_bridge:
for (i = ARRAY_SIZE(cxl_host_bridge) - 1; i >= 0; i--) {
struct platform_device *pdev = cxl_host_bridge[i];
if (!pdev)
continue;
sysfs_remove_link(&pdev->dev.kobj, "physical_node");
platform_device_unregister(cxl_host_bridge[i]);
}
err_switches:
cxl_switches_remove();
err_root_ports:
cxl_rootports_remove();
err_host_bridges:
host_bridges_remove();
err_populate:
depopulate_all_mock_resources();
err_gen_pool_add:
@ -2058,27 +2187,14 @@ static void free_decoder_registry(void)
static __exit void cxl_test_exit(void)
{
int i;
hmem_test_exit();
cxl_mem_exit();
platform_device_unregister(cxl_acpi);
cxl_rch_topo_exit();
cxl_single_topo_exit();
for (i = ARRAY_SIZE(cxl_switch_dport) - 1; i >= 0; i--)
platform_device_unregister(cxl_switch_dport[i]);
for (i = ARRAY_SIZE(cxl_switch_uport) - 1; i >= 0; i--)
platform_device_unregister(cxl_switch_uport[i]);
for (i = ARRAY_SIZE(cxl_root_port) - 1; i >= 0; i--)
platform_device_unregister(cxl_root_port[i]);
for (i = ARRAY_SIZE(cxl_host_bridge) - 1; i >= 0; i--) {
struct platform_device *pdev = cxl_host_bridge[i];
if (!pdev)
continue;
sysfs_remove_link(&pdev->dev.kobj, "physical_node");
platform_device_unregister(cxl_host_bridge[i]);
}
cxl_switches_remove();
cxl_rootports_remove();
host_bridges_remove();
depopulate_all_mock_resources();
gen_pool_destroy(cxl_mock_pool);
unregister_cxl_mock_ops(&cxl_mock_ops);