mirror of
https://github.com/torvalds/linux.git
synced 2026-09-24 06:24:02 +02:00
cxl/test: Add hierarchy enumeration support for type2 device
Add enumeration of type2 device hierarchy in cxl-test. The type2 device is setup to be directly attached to a root port instead of rp -> switch -> device that type3 hierarchy is setup.. Tested-by: Alison Schofield <alison.schofield@intel.com> Reviewed-by: Alison Schofield <alison.schofield@intel.com> Link: https://patch.msgid.link/20260629221104.3891733-5-dave.jiang@intel.com Signed-off-by: Dave Jiang <dave.jiang@intel.com>
This commit is contained in:
parent
a6d37152d2
commit
6b2e585142
|
|
@ -28,6 +28,7 @@ static bool type2_test;
|
||||||
#define NR_CXL_SWITCH_PORTS 2
|
#define NR_CXL_SWITCH_PORTS 2
|
||||||
#define NR_CXL_PORT_DECODERS 8
|
#define NR_CXL_PORT_DECODERS 8
|
||||||
#define NR_BRIDGES (NR_CXL_HOST_BRIDGES + NR_CXL_SINGLE_HOST + NR_CXL_RCH)
|
#define NR_BRIDGES (NR_CXL_HOST_BRIDGES + NR_CXL_SINGLE_HOST + NR_CXL_RCH)
|
||||||
|
#define NR_CXL_TYPE2_ACCEL 1
|
||||||
|
|
||||||
#define MOCK_AUTO_REGION_SIZE_DEFAULT SZ_512M
|
#define MOCK_AUTO_REGION_SIZE_DEFAULT SZ_512M
|
||||||
static int mock_auto_region_size = MOCK_AUTO_REGION_SIZE_DEFAULT;
|
static int mock_auto_region_size = MOCK_AUTO_REGION_SIZE_DEFAULT;
|
||||||
|
|
@ -1747,19 +1748,93 @@ static void cxl_single_topo_exit(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cxl_mem_exit(void)
|
static void cxl_type3_mem_exit(void)
|
||||||
{
|
{
|
||||||
|
struct platform_device *pdev;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = ARRAY_SIZE(cxl_rcd) - 1; i >= 0; i--)
|
for (i = ARRAY_SIZE(cxl_rcd) - 1; i >= 0; i--) {
|
||||||
|
pdev = cxl_rcd[i];
|
||||||
|
if (!pdev)
|
||||||
|
continue;
|
||||||
platform_device_unregister(cxl_rcd[i]);
|
platform_device_unregister(cxl_rcd[i]);
|
||||||
for (i = ARRAY_SIZE(cxl_mem_single) - 1; i >= 0; i--)
|
}
|
||||||
|
|
||||||
|
for (i = ARRAY_SIZE(cxl_mem_single) - 1; i >= 0; i--) {
|
||||||
|
pdev = cxl_mem_single[i];
|
||||||
|
if (!pdev)
|
||||||
|
continue;
|
||||||
platform_device_unregister(cxl_mem_single[i]);
|
platform_device_unregister(cxl_mem_single[i]);
|
||||||
for (i = ARRAY_SIZE(cxl_mem) - 1; i >= 0; i--)
|
}
|
||||||
platform_device_unregister(cxl_mem[i]);
|
|
||||||
|
for (i = ARRAY_SIZE(cxl_mem) - 1; i >= 0; i--) {
|
||||||
|
pdev = cxl_mem[i];
|
||||||
|
if (!pdev)
|
||||||
|
continue;
|
||||||
|
platform_device_unregister(pdev);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cxl_mem_init(void)
|
static void cxl_type2_mem_exit(void)
|
||||||
|
{
|
||||||
|
for (int i = NR_CXL_TYPE2_ACCEL - 1; i >= 0; i--) {
|
||||||
|
struct platform_device *pdev = cxl_mem[i];
|
||||||
|
|
||||||
|
if (!pdev)
|
||||||
|
continue;
|
||||||
|
platform_device_unregister(pdev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cxl_mem_exit(void)
|
||||||
|
{
|
||||||
|
if (type2_test) {
|
||||||
|
cxl_type2_mem_exit();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
cxl_type3_mem_exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
static int cxl_type2_mem_init(void)
|
||||||
|
{
|
||||||
|
int i, rc;
|
||||||
|
|
||||||
|
for (i = 0; i < NR_CXL_TYPE2_ACCEL; i++) {
|
||||||
|
struct platform_device *dport = cxl_root_port[i];
|
||||||
|
struct platform_device *pdev;
|
||||||
|
|
||||||
|
pdev = platform_device_alloc("cxl_type2_accel", i);
|
||||||
|
if (!pdev) {
|
||||||
|
rc = -ENOMEM;
|
||||||
|
goto err_mem;
|
||||||
|
}
|
||||||
|
pdev->dev.parent = &dport->dev;
|
||||||
|
set_dev_node(&pdev->dev, i % 2);
|
||||||
|
|
||||||
|
rc = platform_device_add(pdev);
|
||||||
|
if (rc) {
|
||||||
|
rc = -ENOMEM;
|
||||||
|
platform_device_put(pdev);
|
||||||
|
goto err_mem;
|
||||||
|
}
|
||||||
|
cxl_mem[i] = pdev;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
err_mem:
|
||||||
|
for (i = NR_CXL_TYPE2_ACCEL - 1; i >= 0; i--) {
|
||||||
|
struct platform_device *pdev = cxl_mem[i];
|
||||||
|
|
||||||
|
if (!pdev)
|
||||||
|
continue;
|
||||||
|
platform_device_unregister(pdev);
|
||||||
|
}
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int cxl_type3_mem_init(void)
|
||||||
{
|
{
|
||||||
int i, rc;
|
int i, rc;
|
||||||
|
|
||||||
|
|
@ -1768,8 +1843,10 @@ static int cxl_mem_init(void)
|
||||||
struct platform_device *pdev;
|
struct platform_device *pdev;
|
||||||
|
|
||||||
pdev = platform_device_alloc("cxl_mem", i);
|
pdev = platform_device_alloc("cxl_mem", i);
|
||||||
if (!pdev)
|
if (!pdev) {
|
||||||
|
rc = -ENOMEM;
|
||||||
goto err_mem;
|
goto err_mem;
|
||||||
|
}
|
||||||
pdev->dev.parent = &dport->dev;
|
pdev->dev.parent = &dport->dev;
|
||||||
set_dev_node(&pdev->dev, i % 2);
|
set_dev_node(&pdev->dev, i % 2);
|
||||||
|
|
||||||
|
|
@ -1783,8 +1860,10 @@ static int cxl_mem_init(void)
|
||||||
struct platform_device *pdev;
|
struct platform_device *pdev;
|
||||||
|
|
||||||
pdev = platform_device_alloc("cxl_mem", NR_MEM_MULTI + i);
|
pdev = platform_device_alloc("cxl_mem", NR_MEM_MULTI + i);
|
||||||
if (!pdev)
|
if (!pdev) {
|
||||||
|
rc = -ENOMEM;
|
||||||
goto err_single;
|
goto err_single;
|
||||||
|
}
|
||||||
pdev->dev.parent = &dport->dev;
|
pdev->dev.parent = &dport->dev;
|
||||||
set_dev_node(&pdev->dev, i % 2);
|
set_dev_node(&pdev->dev, i % 2);
|
||||||
|
|
||||||
|
|
@ -1799,8 +1878,10 @@ static int cxl_mem_init(void)
|
||||||
struct platform_device *pdev;
|
struct platform_device *pdev;
|
||||||
|
|
||||||
pdev = platform_device_alloc("cxl_rcd", idx);
|
pdev = platform_device_alloc("cxl_rcd", idx);
|
||||||
if (!pdev)
|
if (!pdev) {
|
||||||
|
rc = -ENOMEM;
|
||||||
goto err_rcd;
|
goto err_rcd;
|
||||||
|
}
|
||||||
pdev->dev.parent = &rch->dev;
|
pdev->dev.parent = &rch->dev;
|
||||||
set_dev_node(&pdev->dev, i % 2);
|
set_dev_node(&pdev->dev, i % 2);
|
||||||
|
|
||||||
|
|
@ -1823,6 +1904,13 @@ static int cxl_mem_init(void)
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int cxl_mem_init(void)
|
||||||
|
{
|
||||||
|
if (type2_test)
|
||||||
|
return cxl_type2_mem_init();
|
||||||
|
return cxl_type3_mem_init();
|
||||||
|
}
|
||||||
|
|
||||||
static ssize_t
|
static ssize_t
|
||||||
decoder_reset_preserve_registry_show(struct device *dev,
|
decoder_reset_preserve_registry_show(struct device *dev,
|
||||||
struct device_attribute *attr, char *buf)
|
struct device_attribute *attr, char *buf)
|
||||||
|
|
@ -2060,6 +2148,92 @@ static int cxl_switches_populate(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void cxl_type2_topo_exit(void)
|
||||||
|
{
|
||||||
|
cxl_rootports_remove();
|
||||||
|
host_bridges_remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
static int cxl_type2_topo_init(void)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
rc = host_bridges_populate();
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
rc = cxl_rootports_populate();
|
||||||
|
if (rc) {
|
||||||
|
host_bridges_remove();
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cxl_type3_topo_exit(void)
|
||||||
|
{
|
||||||
|
cxl_rch_topo_exit();
|
||||||
|
cxl_single_topo_exit();
|
||||||
|
cxl_switches_remove();
|
||||||
|
cxl_rootports_remove();
|
||||||
|
host_bridges_remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
static int cxl_type3_topo_init(void)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
rc = host_bridges_populate();
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
rc = cxl_rootports_populate();
|
||||||
|
if (rc)
|
||||||
|
goto err_host_bridges;
|
||||||
|
|
||||||
|
rc = cxl_switches_populate();
|
||||||
|
if (rc)
|
||||||
|
goto err_root_ports;
|
||||||
|
|
||||||
|
rc = cxl_single_topo_init();
|
||||||
|
if (rc)
|
||||||
|
goto err_switches;
|
||||||
|
|
||||||
|
rc = cxl_rch_topo_init();
|
||||||
|
if (rc)
|
||||||
|
goto err_single;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
err_single:
|
||||||
|
cxl_single_topo_exit();
|
||||||
|
err_switches:
|
||||||
|
cxl_switches_remove();
|
||||||
|
err_root_ports:
|
||||||
|
cxl_rootports_remove();
|
||||||
|
err_host_bridges:
|
||||||
|
host_bridges_remove();
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cxl_topo_exit(void)
|
||||||
|
{
|
||||||
|
if (type2_test) {
|
||||||
|
cxl_type2_topo_exit();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
cxl_type3_topo_exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
static int cxl_topo_init(void)
|
||||||
|
{
|
||||||
|
if (type2_test)
|
||||||
|
return cxl_type2_topo_init();
|
||||||
|
return cxl_type3_topo_init();
|
||||||
|
}
|
||||||
|
|
||||||
static __init int cxl_test_init(void)
|
static __init int cxl_test_init(void)
|
||||||
{
|
{
|
||||||
struct range mappable;
|
struct range mappable;
|
||||||
|
|
@ -2109,29 +2283,13 @@ static __init int cxl_test_init(void)
|
||||||
if (rc)
|
if (rc)
|
||||||
goto err_populate;
|
goto err_populate;
|
||||||
|
|
||||||
rc = host_bridges_populate();
|
rc = cxl_topo_init();
|
||||||
if (rc)
|
if (rc)
|
||||||
goto err_populate;
|
goto err_populate;
|
||||||
|
|
||||||
rc = cxl_rootports_populate();
|
|
||||||
if (rc)
|
|
||||||
goto err_host_bridges;
|
|
||||||
|
|
||||||
rc = cxl_switches_populate();
|
|
||||||
if (rc)
|
|
||||||
goto err_root_ports;
|
|
||||||
|
|
||||||
rc = cxl_single_topo_init();
|
|
||||||
if (rc)
|
|
||||||
goto err_switches;
|
|
||||||
|
|
||||||
rc = cxl_rch_topo_init();
|
|
||||||
if (rc)
|
|
||||||
goto err_single;
|
|
||||||
|
|
||||||
cxl_acpi = platform_device_alloc("cxl_acpi", 0);
|
cxl_acpi = platform_device_alloc("cxl_acpi", 0);
|
||||||
if (!cxl_acpi)
|
if (!cxl_acpi)
|
||||||
goto err_rch;
|
goto err_topo;
|
||||||
|
|
||||||
mock_companion(&acpi0017_mock, &cxl_acpi->dev);
|
mock_companion(&acpi0017_mock, &cxl_acpi->dev);
|
||||||
acpi0017_mock.dev.bus = &platform_bus_type;
|
acpi0017_mock.dev.bus = &platform_bus_type;
|
||||||
|
|
@ -2139,7 +2297,7 @@ static __init int cxl_test_init(void)
|
||||||
|
|
||||||
rc = cxl_mock_platform_device_add(cxl_acpi, NULL);
|
rc = cxl_mock_platform_device_add(cxl_acpi, NULL);
|
||||||
if (rc)
|
if (rc)
|
||||||
goto err_rch;
|
goto err_topo;
|
||||||
|
|
||||||
rc = cxl_mem_init();
|
rc = cxl_mem_init();
|
||||||
if (rc)
|
if (rc)
|
||||||
|
|
@ -2155,16 +2313,8 @@ static __init int cxl_test_init(void)
|
||||||
cxl_mem_exit();
|
cxl_mem_exit();
|
||||||
err_root:
|
err_root:
|
||||||
platform_device_unregister(cxl_acpi);
|
platform_device_unregister(cxl_acpi);
|
||||||
err_rch:
|
err_topo:
|
||||||
cxl_rch_topo_exit();
|
cxl_topo_exit();
|
||||||
err_single:
|
|
||||||
cxl_single_topo_exit();
|
|
||||||
err_switches:
|
|
||||||
cxl_switches_remove();
|
|
||||||
err_root_ports:
|
|
||||||
cxl_rootports_remove();
|
|
||||||
err_host_bridges:
|
|
||||||
host_bridges_remove();
|
|
||||||
err_populate:
|
err_populate:
|
||||||
depopulate_all_mock_resources();
|
depopulate_all_mock_resources();
|
||||||
err_gen_pool_add:
|
err_gen_pool_add:
|
||||||
|
|
@ -2190,11 +2340,7 @@ static __exit void cxl_test_exit(void)
|
||||||
hmem_test_exit();
|
hmem_test_exit();
|
||||||
cxl_mem_exit();
|
cxl_mem_exit();
|
||||||
platform_device_unregister(cxl_acpi);
|
platform_device_unregister(cxl_acpi);
|
||||||
cxl_rch_topo_exit();
|
cxl_topo_exit();
|
||||||
cxl_single_topo_exit();
|
|
||||||
cxl_switches_remove();
|
|
||||||
cxl_rootports_remove();
|
|
||||||
host_bridges_remove();
|
|
||||||
depopulate_all_mock_resources();
|
depopulate_all_mock_resources();
|
||||||
gen_pool_destroy(cxl_mock_pool);
|
gen_pool_destroy(cxl_mock_pool);
|
||||||
unregister_cxl_mock_ops(&cxl_mock_ops);
|
unregister_cxl_mock_ops(&cxl_mock_ops);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user