Commit dafb1048 authored by Dan Williams's avatar Dan Williams

tools/testing/nvdimm: dynamic label support

Update nfit_test infrastructure to enable labels for the dimm on the
nfit_test.1 bus.  This bus has a pmem region without aliased blk space,
so it is a candidate for dynamically enabling label support by writing
a namespace index block.
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent 42237e39
...@@ -124,12 +124,13 @@ struct nfit_test_dcr { ...@@ -124,12 +124,13 @@ struct nfit_test_dcr {
(((node & 0xfff) << 16) | ((socket & 0xf) << 12) \ (((node & 0xfff) << 16) | ((socket & 0xf) << 12) \
| ((imc & 0xf) << 8) | ((chan & 0xf) << 4) | (dimm & 0xf)) | ((imc & 0xf) << 8) | ((chan & 0xf) << 4) | (dimm & 0xf))
static u32 handle[NUM_DCR] = { static u32 handle[] = {
[0] = NFIT_DIMM_HANDLE(0, 0, 0, 0, 0), [0] = NFIT_DIMM_HANDLE(0, 0, 0, 0, 0),
[1] = NFIT_DIMM_HANDLE(0, 0, 0, 0, 1), [1] = NFIT_DIMM_HANDLE(0, 0, 0, 0, 1),
[2] = NFIT_DIMM_HANDLE(0, 0, 1, 0, 0), [2] = NFIT_DIMM_HANDLE(0, 0, 1, 0, 0),
[3] = NFIT_DIMM_HANDLE(0, 0, 1, 0, 1), [3] = NFIT_DIMM_HANDLE(0, 0, 1, 0, 1),
[4] = NFIT_DIMM_HANDLE(0, 1, 0, 0, 0), [4] = NFIT_DIMM_HANDLE(0, 1, 0, 0, 0),
[5] = NFIT_DIMM_HANDLE(1, 0, 0, 0, 0),
}; };
static unsigned long dimm_fail_cmd_flags[NUM_DCR]; static unsigned long dimm_fail_cmd_flags[NUM_DCR];
...@@ -141,6 +142,7 @@ struct nfit_test { ...@@ -141,6 +142,7 @@ struct nfit_test {
void *nfit_buf; void *nfit_buf;
dma_addr_t nfit_dma; dma_addr_t nfit_dma;
size_t nfit_size; size_t nfit_size;
int dcr_idx;
int num_dcr; int num_dcr;
int num_pm; int num_pm;
void **dimm; void **dimm;
...@@ -425,11 +427,11 @@ static int nfit_test_ctl(struct nvdimm_bus_descriptor *nd_desc, ...@@ -425,11 +427,11 @@ static int nfit_test_ctl(struct nvdimm_bus_descriptor *nd_desc,
break; break;
case ND_CMD_GET_CONFIG_DATA: case ND_CMD_GET_CONFIG_DATA:
rc = nfit_test_cmd_get_config_data(buf, buf_len, rc = nfit_test_cmd_get_config_data(buf, buf_len,
t->label[i]); t->label[i - t->dcr_idx]);
break; break;
case ND_CMD_SET_CONFIG_DATA: case ND_CMD_SET_CONFIG_DATA:
rc = nfit_test_cmd_set_config_data(buf, buf_len, rc = nfit_test_cmd_set_config_data(buf, buf_len,
t->label[i]); t->label[i - t->dcr_idx]);
break; break;
case ND_CMD_SMART: case ND_CMD_SMART:
rc = nfit_test_cmd_smart(buf, buf_len); rc = nfit_test_cmd_smart(buf, buf_len);
...@@ -681,7 +683,7 @@ static int nfit_test0_alloc(struct nfit_test *t) ...@@ -681,7 +683,7 @@ static int nfit_test0_alloc(struct nfit_test *t)
if (!t->spa_set[2]) if (!t->spa_set[2])
return -ENOMEM; return -ENOMEM;
for (i = 0; i < NUM_DCR; i++) { for (i = 0; i < t->num_dcr; i++) {
t->dimm[i] = test_alloc(t, DIMM_SIZE, &t->dimm_dma[i]); t->dimm[i] = test_alloc(t, DIMM_SIZE, &t->dimm_dma[i]);
if (!t->dimm[i]) if (!t->dimm[i])
return -ENOMEM; return -ENOMEM;
...@@ -698,7 +700,7 @@ static int nfit_test0_alloc(struct nfit_test *t) ...@@ -698,7 +700,7 @@ static int nfit_test0_alloc(struct nfit_test *t)
return -ENOMEM; return -ENOMEM;
} }
for (i = 0; i < NUM_DCR; i++) { for (i = 0; i < t->num_dcr; i++) {
t->dcr[i] = test_alloc(t, LABEL_SIZE, &t->dcr_dma[i]); t->dcr[i] = test_alloc(t, LABEL_SIZE, &t->dcr_dma[i]);
if (!t->dcr[i]) if (!t->dcr[i])
return -ENOMEM; return -ENOMEM;
...@@ -727,6 +729,7 @@ static int nfit_test1_alloc(struct nfit_test *t) ...@@ -727,6 +729,7 @@ static int nfit_test1_alloc(struct nfit_test *t)
size_t nfit_size = sizeof(struct acpi_nfit_system_address) * 2 size_t nfit_size = sizeof(struct acpi_nfit_system_address) * 2
+ sizeof(struct acpi_nfit_memory_map) + sizeof(struct acpi_nfit_memory_map)
+ offsetof(struct acpi_nfit_control_region, window_size); + offsetof(struct acpi_nfit_control_region, window_size);
int i;
t->nfit_buf = test_alloc(t, nfit_size, &t->nfit_dma); t->nfit_buf = test_alloc(t, nfit_size, &t->nfit_dma);
if (!t->nfit_buf) if (!t->nfit_buf)
...@@ -737,6 +740,13 @@ static int nfit_test1_alloc(struct nfit_test *t) ...@@ -737,6 +740,13 @@ static int nfit_test1_alloc(struct nfit_test *t)
if (!t->spa_set[0]) if (!t->spa_set[0])
return -ENOMEM; return -ENOMEM;
for (i = 0; i < t->num_dcr; i++) {
t->label[i] = test_alloc(t, LABEL_SIZE, &t->label_dma[i]);
if (!t->label[i])
return -ENOMEM;
sprintf(t->label[i], "label%d", i);
}
t->spa_set[1] = test_alloc(t, SPA_VCD_SIZE, &t->spa_set_dma[1]); t->spa_set[1] = test_alloc(t, SPA_VCD_SIZE, &t->spa_set_dma[1]);
if (!t->spa_set[1]) if (!t->spa_set[1])
return -ENOMEM; return -ENOMEM;
...@@ -1449,7 +1459,7 @@ static void nfit_test1_setup(struct nfit_test *t) ...@@ -1449,7 +1459,7 @@ static void nfit_test1_setup(struct nfit_test *t)
memdev = nfit_buf + offset; memdev = nfit_buf + offset;
memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
memdev->header.length = sizeof(*memdev); memdev->header.length = sizeof(*memdev);
memdev->device_handle = 0; memdev->device_handle = handle[5];
memdev->physical_id = 0; memdev->physical_id = 0;
memdev->region_id = 0; memdev->region_id = 0;
memdev->range_index = 0+1; memdev->range_index = 0+1;
...@@ -1471,7 +1481,7 @@ static void nfit_test1_setup(struct nfit_test *t) ...@@ -1471,7 +1481,7 @@ static void nfit_test1_setup(struct nfit_test *t)
window_size); window_size);
dcr->region_index = 0+1; dcr->region_index = 0+1;
dcr_common_init(dcr); dcr_common_init(dcr);
dcr->serial_number = ~0; dcr->serial_number = ~handle[5];
dcr->code = NFIT_FIC_BYTE; dcr->code = NFIT_FIC_BYTE;
dcr->windows = 0; dcr->windows = 0;
...@@ -1482,6 +1492,9 @@ static void nfit_test1_setup(struct nfit_test *t) ...@@ -1482,6 +1492,9 @@ static void nfit_test1_setup(struct nfit_test *t)
set_bit(ND_CMD_ARS_START, &acpi_desc->bus_cmd_force_en); set_bit(ND_CMD_ARS_START, &acpi_desc->bus_cmd_force_en);
set_bit(ND_CMD_ARS_STATUS, &acpi_desc->bus_cmd_force_en); set_bit(ND_CMD_ARS_STATUS, &acpi_desc->bus_cmd_force_en);
set_bit(ND_CMD_CLEAR_ERROR, &acpi_desc->bus_cmd_force_en); set_bit(ND_CMD_CLEAR_ERROR, &acpi_desc->bus_cmd_force_en);
set_bit(ND_CMD_GET_CONFIG_SIZE, &acpi_desc->dimm_cmd_force_en);
set_bit(ND_CMD_GET_CONFIG_DATA, &acpi_desc->dimm_cmd_force_en);
set_bit(ND_CMD_SET_CONFIG_DATA, &acpi_desc->dimm_cmd_force_en);
} }
static int nfit_test_blk_do_io(struct nd_blk_region *ndbr, resource_size_t dpa, static int nfit_test_blk_do_io(struct nd_blk_region *ndbr, resource_size_t dpa,
...@@ -1658,12 +1671,15 @@ static __init int nfit_test_init(void) ...@@ -1658,12 +1671,15 @@ static __init int nfit_test_init(void)
switch (i) { switch (i) {
case 0: case 0:
nfit_test->num_pm = NUM_PM; nfit_test->num_pm = NUM_PM;
nfit_test->dcr_idx = 0;
nfit_test->num_dcr = NUM_DCR; nfit_test->num_dcr = NUM_DCR;
nfit_test->alloc = nfit_test0_alloc; nfit_test->alloc = nfit_test0_alloc;
nfit_test->setup = nfit_test0_setup; nfit_test->setup = nfit_test0_setup;
break; break;
case 1: case 1:
nfit_test->num_pm = 1; nfit_test->num_pm = 1;
nfit_test->dcr_idx = NUM_DCR;
nfit_test->num_dcr = 1;
nfit_test->alloc = nfit_test1_alloc; nfit_test->alloc = nfit_test1_alloc;
nfit_test->setup = nfit_test1_setup; nfit_test->setup = nfit_test1_setup;
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment