mirror of
https://github.com/torvalds/linux.git
synced 2026-09-24 06:24:02 +02:00
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:
parent
fc8fc576d9
commit
a6d37152d2
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user