Commit 3b87356f authored by Dan Williams's avatar Dan Williams

nfit, tools/testing/nvdimm: test multiple control regions per-dimm

ACPI 6.1 clarifies that "The system shall include an NVDIMM Control
Region Structure for every Function Interface in the NVDIMM."
Implement this clarification in nfit_test.
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent be26f9ae
...@@ -429,6 +429,8 @@ static int nfit_test0_alloc(struct nfit_test *t) ...@@ -429,6 +429,8 @@ static int nfit_test0_alloc(struct nfit_test *t)
size_t nfit_size = sizeof(struct acpi_nfit_system_address) * NUM_SPA size_t nfit_size = sizeof(struct acpi_nfit_system_address) * NUM_SPA
+ sizeof(struct acpi_nfit_memory_map) * NUM_MEM + sizeof(struct acpi_nfit_memory_map) * NUM_MEM
+ sizeof(struct acpi_nfit_control_region) * NUM_DCR + sizeof(struct acpi_nfit_control_region) * NUM_DCR
+ offsetof(struct acpi_nfit_control_region,
window_size) * NUM_DCR
+ sizeof(struct acpi_nfit_data_region) * NUM_BDW + sizeof(struct acpi_nfit_data_region) * NUM_BDW
+ sizeof(struct acpi_nfit_flush_address) * NUM_DCR; + sizeof(struct acpi_nfit_flush_address) * NUM_DCR;
int i; int i;
...@@ -478,7 +480,7 @@ static int nfit_test1_alloc(struct nfit_test *t) ...@@ -478,7 +480,7 @@ static int nfit_test1_alloc(struct nfit_test *t)
{ {
size_t nfit_size = sizeof(struct acpi_nfit_system_address) size_t nfit_size = sizeof(struct acpi_nfit_system_address)
+ sizeof(struct acpi_nfit_memory_map) + sizeof(struct acpi_nfit_memory_map)
+ sizeof(struct acpi_nfit_control_region); + offsetof(struct acpi_nfit_control_region, window_size);
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)
...@@ -611,7 +613,7 @@ static void nfit_test0_setup(struct nfit_test *t) ...@@ -611,7 +613,7 @@ static void nfit_test0_setup(struct nfit_test *t)
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;
memdev->region_index = 0+1; memdev->region_index = 4+1;
memdev->region_size = SPA0_SIZE/2; memdev->region_size = SPA0_SIZE/2;
memdev->region_offset = t->spa_set_dma[0]; memdev->region_offset = t->spa_set_dma[0];
memdev->address = 0; memdev->address = 0;
...@@ -626,7 +628,7 @@ static void nfit_test0_setup(struct nfit_test *t) ...@@ -626,7 +628,7 @@ static void nfit_test0_setup(struct nfit_test *t)
memdev->physical_id = 1; memdev->physical_id = 1;
memdev->region_id = 0; memdev->region_id = 0;
memdev->range_index = 0+1; memdev->range_index = 0+1;
memdev->region_index = 1+1; memdev->region_index = 5+1;
memdev->region_size = SPA0_SIZE/2; memdev->region_size = SPA0_SIZE/2;
memdev->region_offset = t->spa_set_dma[0] + SPA0_SIZE/2; memdev->region_offset = t->spa_set_dma[0] + SPA0_SIZE/2;
memdev->address = 0; memdev->address = 0;
...@@ -641,7 +643,7 @@ static void nfit_test0_setup(struct nfit_test *t) ...@@ -641,7 +643,7 @@ static void nfit_test0_setup(struct nfit_test *t)
memdev->physical_id = 0; memdev->physical_id = 0;
memdev->region_id = 1; memdev->region_id = 1;
memdev->range_index = 1+1; memdev->range_index = 1+1;
memdev->region_index = 0+1; memdev->region_index = 4+1;
memdev->region_size = SPA1_SIZE/4; memdev->region_size = SPA1_SIZE/4;
memdev->region_offset = t->spa_set_dma[1]; memdev->region_offset = t->spa_set_dma[1];
memdev->address = SPA0_SIZE/2; memdev->address = SPA0_SIZE/2;
...@@ -656,7 +658,7 @@ static void nfit_test0_setup(struct nfit_test *t) ...@@ -656,7 +658,7 @@ static void nfit_test0_setup(struct nfit_test *t)
memdev->physical_id = 1; memdev->physical_id = 1;
memdev->region_id = 1; memdev->region_id = 1;
memdev->range_index = 1+1; memdev->range_index = 1+1;
memdev->region_index = 1+1; memdev->region_index = 5+1;
memdev->region_size = SPA1_SIZE/4; memdev->region_size = SPA1_SIZE/4;
memdev->region_offset = t->spa_set_dma[1] + SPA1_SIZE/4; memdev->region_offset = t->spa_set_dma[1] + SPA1_SIZE/4;
memdev->address = SPA0_SIZE/2; memdev->address = SPA0_SIZE/2;
...@@ -671,7 +673,7 @@ static void nfit_test0_setup(struct nfit_test *t) ...@@ -671,7 +673,7 @@ static void nfit_test0_setup(struct nfit_test *t)
memdev->physical_id = 2; memdev->physical_id = 2;
memdev->region_id = 0; memdev->region_id = 0;
memdev->range_index = 1+1; memdev->range_index = 1+1;
memdev->region_index = 2+1; memdev->region_index = 6+1;
memdev->region_size = SPA1_SIZE/4; memdev->region_size = SPA1_SIZE/4;
memdev->region_offset = t->spa_set_dma[1] + 2*SPA1_SIZE/4; memdev->region_offset = t->spa_set_dma[1] + 2*SPA1_SIZE/4;
memdev->address = SPA0_SIZE/2; memdev->address = SPA0_SIZE/2;
...@@ -686,7 +688,7 @@ static void nfit_test0_setup(struct nfit_test *t) ...@@ -686,7 +688,7 @@ static void nfit_test0_setup(struct nfit_test *t)
memdev->physical_id = 3; memdev->physical_id = 3;
memdev->region_id = 0; memdev->region_id = 0;
memdev->range_index = 1+1; memdev->range_index = 1+1;
memdev->region_index = 3+1; memdev->region_index = 7+1;
memdev->region_size = SPA1_SIZE/4; memdev->region_size = SPA1_SIZE/4;
memdev->region_offset = t->spa_set_dma[1] + 3*SPA1_SIZE/4; memdev->region_offset = t->spa_set_dma[1] + 3*SPA1_SIZE/4;
memdev->address = SPA0_SIZE/2; memdev->address = SPA0_SIZE/2;
...@@ -814,7 +816,7 @@ static void nfit_test0_setup(struct nfit_test *t) ...@@ -814,7 +816,7 @@ static void nfit_test0_setup(struct nfit_test *t)
memdev->interleave_ways = 1; memdev->interleave_ways = 1;
offset = offset + sizeof(struct acpi_nfit_memory_map) * 14; offset = offset + sizeof(struct acpi_nfit_memory_map) * 14;
/* dcr-descriptor0 */ /* dcr-descriptor0: blk */
dcr = nfit_buf + offset; dcr = nfit_buf + offset;
dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION; dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
dcr->header.length = sizeof(struct acpi_nfit_control_region); dcr->header.length = sizeof(struct acpi_nfit_control_region);
...@@ -831,7 +833,7 @@ static void nfit_test0_setup(struct nfit_test *t) ...@@ -831,7 +833,7 @@ static void nfit_test0_setup(struct nfit_test *t)
dcr->status_offset = 8; dcr->status_offset = 8;
dcr->status_size = 4; dcr->status_size = 4;
/* dcr-descriptor1 */ /* dcr-descriptor1: blk */
dcr = nfit_buf + offset + sizeof(struct acpi_nfit_control_region); dcr = nfit_buf + offset + sizeof(struct acpi_nfit_control_region);
dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION; dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
dcr->header.length = sizeof(struct acpi_nfit_control_region); dcr->header.length = sizeof(struct acpi_nfit_control_region);
...@@ -848,7 +850,7 @@ static void nfit_test0_setup(struct nfit_test *t) ...@@ -848,7 +850,7 @@ static void nfit_test0_setup(struct nfit_test *t)
dcr->status_offset = 8; dcr->status_offset = 8;
dcr->status_size = 4; dcr->status_size = 4;
/* dcr-descriptor2 */ /* dcr-descriptor2: blk */
dcr = nfit_buf + offset + sizeof(struct acpi_nfit_control_region) * 2; dcr = nfit_buf + offset + sizeof(struct acpi_nfit_control_region) * 2;
dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION; dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
dcr->header.length = sizeof(struct acpi_nfit_control_region); dcr->header.length = sizeof(struct acpi_nfit_control_region);
...@@ -865,7 +867,7 @@ static void nfit_test0_setup(struct nfit_test *t) ...@@ -865,7 +867,7 @@ static void nfit_test0_setup(struct nfit_test *t)
dcr->status_offset = 8; dcr->status_offset = 8;
dcr->status_size = 4; dcr->status_size = 4;
/* dcr-descriptor3 */ /* dcr-descriptor3: blk */
dcr = nfit_buf + offset + sizeof(struct acpi_nfit_control_region) * 3; dcr = nfit_buf + offset + sizeof(struct acpi_nfit_control_region) * 3;
dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION; dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
dcr->header.length = sizeof(struct acpi_nfit_control_region); dcr->header.length = sizeof(struct acpi_nfit_control_region);
...@@ -883,6 +885,63 @@ static void nfit_test0_setup(struct nfit_test *t) ...@@ -883,6 +885,63 @@ static void nfit_test0_setup(struct nfit_test *t)
dcr->status_size = 4; dcr->status_size = 4;
offset = offset + sizeof(struct acpi_nfit_control_region) * 4; offset = offset + sizeof(struct acpi_nfit_control_region) * 4;
/* dcr-descriptor0: pmem */
dcr = nfit_buf + offset;
dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
dcr->header.length = offsetof(struct acpi_nfit_control_region,
window_size);
dcr->region_index = 4+1;
dcr->vendor_id = 0xabcd;
dcr->device_id = 0;
dcr->revision_id = 1;
dcr->serial_number = ~handle[0];
dcr->code = NFIT_FIC_BYTEN;
dcr->windows = 0;
/* dcr-descriptor1: pmem */
dcr = nfit_buf + offset + offsetof(struct acpi_nfit_control_region,
window_size);
dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
dcr->header.length = offsetof(struct acpi_nfit_control_region,
window_size);
dcr->region_index = 5+1;
dcr->vendor_id = 0xabcd;
dcr->device_id = 0;
dcr->revision_id = 1;
dcr->serial_number = ~handle[1];
dcr->code = NFIT_FIC_BYTEN;
dcr->windows = 0;
/* dcr-descriptor2: pmem */
dcr = nfit_buf + offset + offsetof(struct acpi_nfit_control_region,
window_size) * 2;
dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
dcr->header.length = offsetof(struct acpi_nfit_control_region,
window_size);
dcr->region_index = 6+1;
dcr->vendor_id = 0xabcd;
dcr->device_id = 0;
dcr->revision_id = 1;
dcr->serial_number = ~handle[2];
dcr->code = NFIT_FIC_BYTEN;
dcr->windows = 0;
/* dcr-descriptor3: pmem */
dcr = nfit_buf + offset + offsetof(struct acpi_nfit_control_region,
window_size) * 3;
dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
dcr->header.length = offsetof(struct acpi_nfit_control_region,
window_size);
dcr->region_index = 7+1;
dcr->vendor_id = 0xabcd;
dcr->device_id = 0;
dcr->revision_id = 1;
dcr->serial_number = ~handle[3];
dcr->code = NFIT_FIC_BYTEN;
dcr->windows = 0;
offset = offset + offsetof(struct acpi_nfit_control_region,
window_size) * 4;
/* bdw0 (spa/dcr0, dimm0) */ /* bdw0 (spa/dcr0, dimm0) */
bdw = nfit_buf + offset; bdw = nfit_buf + offset;
bdw->header.type = ACPI_NFIT_TYPE_DATA_REGION; bdw->header.type = ACPI_NFIT_TYPE_DATA_REGION;
...@@ -962,11 +1021,11 @@ static void nfit_test0_setup(struct nfit_test *t) ...@@ -962,11 +1021,11 @@ static void nfit_test0_setup(struct nfit_test *t)
if (t->setup_hotplug) { if (t->setup_hotplug) {
offset = offset + sizeof(struct acpi_nfit_flush_address) * 4; offset = offset + sizeof(struct acpi_nfit_flush_address) * 4;
/* dcr-descriptor4 */ /* dcr-descriptor4: blk */
dcr = nfit_buf + offset; dcr = nfit_buf + offset;
dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION; dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
dcr->header.length = sizeof(struct acpi_nfit_control_region); dcr->header.length = sizeof(struct acpi_nfit_control_region);
dcr->region_index = 4+1; dcr->region_index = 8+1;
dcr->vendor_id = 0xabcd; dcr->vendor_id = 0xabcd;
dcr->device_id = 0; dcr->device_id = 0;
dcr->revision_id = 1; dcr->revision_id = 1;
...@@ -980,11 +1039,26 @@ static void nfit_test0_setup(struct nfit_test *t) ...@@ -980,11 +1039,26 @@ static void nfit_test0_setup(struct nfit_test *t)
dcr->status_size = 4; dcr->status_size = 4;
offset = offset + sizeof(struct acpi_nfit_control_region); offset = offset + sizeof(struct acpi_nfit_control_region);
/* dcr-descriptor4: pmem */
dcr = nfit_buf + offset;
dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
dcr->header.length = offsetof(struct acpi_nfit_control_region,
window_size);
dcr->region_index = 9+1;
dcr->vendor_id = 0xabcd;
dcr->device_id = 0;
dcr->revision_id = 1;
dcr->serial_number = ~handle[4];
dcr->code = NFIT_FIC_BYTEN;
dcr->windows = 0;
offset = offset + offsetof(struct acpi_nfit_control_region,
window_size);
/* bdw4 (spa/dcr4, dimm4) */ /* bdw4 (spa/dcr4, dimm4) */
bdw = nfit_buf + offset; bdw = nfit_buf + offset;
bdw->header.type = ACPI_NFIT_TYPE_DATA_REGION; bdw->header.type = ACPI_NFIT_TYPE_DATA_REGION;
bdw->header.length = sizeof(struct acpi_nfit_data_region); bdw->header.length = sizeof(struct acpi_nfit_data_region);
bdw->region_index = 4+1; bdw->region_index = 8+1;
bdw->windows = 1; bdw->windows = 1;
bdw->offset = 0; bdw->offset = 0;
bdw->size = BDW_SIZE; bdw->size = BDW_SIZE;
...@@ -1032,7 +1106,7 @@ static void nfit_test0_setup(struct nfit_test *t) ...@@ -1032,7 +1106,7 @@ static void nfit_test0_setup(struct nfit_test *t)
memdev->physical_id = 4; memdev->physical_id = 4;
memdev->region_id = 0; memdev->region_id = 0;
memdev->range_index = 10+1; memdev->range_index = 10+1;
memdev->region_index = 4+1; memdev->region_index = 8+1;
memdev->region_size = 0; memdev->region_size = 0;
memdev->region_offset = 0; memdev->region_offset = 0;
memdev->address = 0; memdev->address = 0;
...@@ -1048,14 +1122,14 @@ static void nfit_test0_setup(struct nfit_test *t) ...@@ -1048,14 +1122,14 @@ static void nfit_test0_setup(struct nfit_test *t)
memdev->physical_id = 4; memdev->physical_id = 4;
memdev->region_id = 0; memdev->region_id = 0;
memdev->range_index = 11+1; memdev->range_index = 11+1;
memdev->region_index = 4+1; memdev->region_index = 9+1;
memdev->region_size = SPA0_SIZE; memdev->region_size = SPA0_SIZE;
memdev->region_offset = t->spa_set_dma[2]; memdev->region_offset = t->spa_set_dma[2];
memdev->address = 0; memdev->address = 0;
memdev->interleave_index = 0; memdev->interleave_index = 0;
memdev->interleave_ways = 1; memdev->interleave_ways = 1;
/* mem-region16 (spa/dcr4, dimm4) */ /* mem-region16 (spa/bdw4, dimm4) */
memdev = nfit_buf + offset + memdev = nfit_buf + offset +
sizeof(struct acpi_nfit_memory_map) * 2; sizeof(struct acpi_nfit_memory_map) * 2;
memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
...@@ -1064,7 +1138,7 @@ static void nfit_test0_setup(struct nfit_test *t) ...@@ -1064,7 +1138,7 @@ static void nfit_test0_setup(struct nfit_test *t)
memdev->physical_id = 4; memdev->physical_id = 4;
memdev->region_id = 0; memdev->region_id = 0;
memdev->range_index = 12+1; memdev->range_index = 12+1;
memdev->region_index = 4+1; memdev->region_index = 8+1;
memdev->region_size = 0; memdev->region_size = 0;
memdev->region_offset = 0; memdev->region_offset = 0;
memdev->address = 0; memdev->address = 0;
...@@ -1135,7 +1209,8 @@ static void nfit_test1_setup(struct nfit_test *t) ...@@ -1135,7 +1209,8 @@ static void nfit_test1_setup(struct nfit_test *t)
/* dcr-descriptor0 */ /* dcr-descriptor0 */
dcr = nfit_buf + offset; dcr = nfit_buf + offset;
dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION; dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
dcr->header.length = sizeof(struct acpi_nfit_control_region); dcr->header.length = offsetof(struct acpi_nfit_control_region,
window_size);
dcr->region_index = 0+1; dcr->region_index = 0+1;
dcr->vendor_id = 0xabcd; dcr->vendor_id = 0xabcd;
dcr->device_id = 0; dcr->device_id = 0;
...@@ -1143,11 +1218,6 @@ static void nfit_test1_setup(struct nfit_test *t) ...@@ -1143,11 +1218,6 @@ static void nfit_test1_setup(struct nfit_test *t)
dcr->serial_number = ~0; dcr->serial_number = ~0;
dcr->code = NFIT_FIC_BYTE; dcr->code = NFIT_FIC_BYTE;
dcr->windows = 0; dcr->windows = 0;
dcr->window_size = 0;
dcr->command_offset = 0;
dcr->command_size = 0;
dcr->status_offset = 0;
dcr->status_size = 0;
acpi_desc = &t->acpi_desc; acpi_desc = &t->acpi_desc;
set_bit(ND_CMD_ARS_CAP, &acpi_desc->bus_dsm_force_en); set_bit(ND_CMD_ARS_CAP, &acpi_desc->bus_dsm_force_en);
......
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