diff options
author | Dan Williams <dan.j.williams@intel.com> | 2018-04-09 13:50:08 -0400 |
---|---|---|
committer | Dan Williams <dan.j.williams@intel.com> | 2018-04-09 13:50:08 -0400 |
commit | 1ed41b5696ccc3ff40a1dee39fe14eff273faf82 (patch) | |
tree | 1202df08129d350a65cf220406eb7ce87185d813 /tools | |
parent | 3eb2ce825ea1ad89d20f7a3b5780df850e4be274 (diff) | |
parent | 291717b6fbdb175da88ae2144fc58d63a490128d (diff) |
Merge branch 'for-4.17/libnvdimm' into libnvdimm-for-next
Diffstat (limited to 'tools')
-rw-r--r-- | tools/testing/nvdimm/test/nfit.c | 239 | ||||
-rw-r--r-- | tools/testing/nvdimm/test/nfit_test.h | 16 |
2 files changed, 177 insertions, 78 deletions
diff --git a/tools/testing/nvdimm/test/nfit.c b/tools/testing/nvdimm/test/nfit.c index 620fa78b3b1b..cb166be4918d 100644 --- a/tools/testing/nvdimm/test/nfit.c +++ b/tools/testing/nvdimm/test/nfit.c | |||
@@ -104,7 +104,8 @@ enum { | |||
104 | NUM_HINTS = 8, | 104 | NUM_HINTS = 8, |
105 | NUM_BDW = NUM_DCR, | 105 | NUM_BDW = NUM_DCR, |
106 | NUM_SPA = NUM_PM + NUM_DCR + NUM_BDW, | 106 | NUM_SPA = NUM_PM + NUM_DCR + NUM_BDW, |
107 | NUM_MEM = NUM_DCR + NUM_BDW + 2 /* spa0 iset */ + 4 /* spa1 iset */, | 107 | NUM_MEM = NUM_DCR + NUM_BDW + 2 /* spa0 iset */ |
108 | + 4 /* spa1 iset */ + 1 /* spa11 iset */, | ||
108 | DIMM_SIZE = SZ_32M, | 109 | DIMM_SIZE = SZ_32M, |
109 | LABEL_SIZE = SZ_128K, | 110 | LABEL_SIZE = SZ_128K, |
110 | SPA_VCD_SIZE = SZ_4M, | 111 | SPA_VCD_SIZE = SZ_4M, |
@@ -153,6 +154,7 @@ struct nfit_test { | |||
153 | void *nfit_buf; | 154 | void *nfit_buf; |
154 | dma_addr_t nfit_dma; | 155 | dma_addr_t nfit_dma; |
155 | size_t nfit_size; | 156 | size_t nfit_size; |
157 | size_t nfit_filled; | ||
156 | int dcr_idx; | 158 | int dcr_idx; |
157 | int num_dcr; | 159 | int num_dcr; |
158 | int num_pm; | 160 | int num_pm; |
@@ -709,7 +711,9 @@ static void smart_notify(struct device *bus_dev, | |||
709 | >= thresh->media_temperature) | 711 | >= thresh->media_temperature) |
710 | || ((thresh->alarm_control & ND_INTEL_SMART_CTEMP_TRIP) | 712 | || ((thresh->alarm_control & ND_INTEL_SMART_CTEMP_TRIP) |
711 | && smart->ctrl_temperature | 713 | && smart->ctrl_temperature |
712 | >= thresh->ctrl_temperature)) { | 714 | >= thresh->ctrl_temperature) |
715 | || (smart->health != ND_INTEL_SMART_NON_CRITICAL_HEALTH) | ||
716 | || (smart->shutdown_state != 0)) { | ||
713 | device_lock(bus_dev); | 717 | device_lock(bus_dev); |
714 | __acpi_nvdimm_notify(dimm_dev, 0x81); | 718 | __acpi_nvdimm_notify(dimm_dev, 0x81); |
715 | device_unlock(bus_dev); | 719 | device_unlock(bus_dev); |
@@ -735,6 +739,32 @@ static int nfit_test_cmd_smart_set_threshold( | |||
735 | return 0; | 739 | return 0; |
736 | } | 740 | } |
737 | 741 | ||
742 | static int nfit_test_cmd_smart_inject( | ||
743 | struct nd_intel_smart_inject *inj, | ||
744 | unsigned int buf_len, | ||
745 | struct nd_intel_smart_threshold *thresh, | ||
746 | struct nd_intel_smart *smart, | ||
747 | struct device *bus_dev, struct device *dimm_dev) | ||
748 | { | ||
749 | if (buf_len != sizeof(*inj)) | ||
750 | return -EINVAL; | ||
751 | |||
752 | if (inj->mtemp_enable) | ||
753 | smart->media_temperature = inj->media_temperature; | ||
754 | if (inj->spare_enable) | ||
755 | smart->spares = inj->spares; | ||
756 | if (inj->fatal_enable) | ||
757 | smart->health = ND_INTEL_SMART_FATAL_HEALTH; | ||
758 | if (inj->unsafe_shutdown_enable) { | ||
759 | smart->shutdown_state = 1; | ||
760 | smart->shutdown_count++; | ||
761 | } | ||
762 | inj->status = 0; | ||
763 | smart_notify(bus_dev, dimm_dev, smart, thresh); | ||
764 | |||
765 | return 0; | ||
766 | } | ||
767 | |||
738 | static void uc_error_notify(struct work_struct *work) | 768 | static void uc_error_notify(struct work_struct *work) |
739 | { | 769 | { |
740 | struct nfit_test *t = container_of(work, typeof(*t), work); | 770 | struct nfit_test *t = container_of(work, typeof(*t), work); |
@@ -935,6 +965,13 @@ static int nfit_test_ctl(struct nvdimm_bus_descriptor *nd_desc, | |||
935 | t->dcr_idx], | 965 | t->dcr_idx], |
936 | &t->smart[i - t->dcr_idx], | 966 | &t->smart[i - t->dcr_idx], |
937 | &t->pdev.dev, t->dimm_dev[i]); | 967 | &t->pdev.dev, t->dimm_dev[i]); |
968 | case ND_INTEL_SMART_INJECT: | ||
969 | return nfit_test_cmd_smart_inject(buf, | ||
970 | buf_len, | ||
971 | &t->smart_threshold[i - | ||
972 | t->dcr_idx], | ||
973 | &t->smart[i - t->dcr_idx], | ||
974 | &t->pdev.dev, t->dimm_dev[i]); | ||
938 | default: | 975 | default: |
939 | return -ENOTTY; | 976 | return -ENOTTY; |
940 | } | 977 | } |
@@ -1222,7 +1259,7 @@ static void smart_init(struct nfit_test *t) | |||
1222 | | ND_INTEL_SMART_MTEMP_VALID, | 1259 | | ND_INTEL_SMART_MTEMP_VALID, |
1223 | .health = ND_INTEL_SMART_NON_CRITICAL_HEALTH, | 1260 | .health = ND_INTEL_SMART_NON_CRITICAL_HEALTH, |
1224 | .media_temperature = 23 * 16, | 1261 | .media_temperature = 23 * 16, |
1225 | .ctrl_temperature = 30 * 16, | 1262 | .ctrl_temperature = 25 * 16, |
1226 | .pmic_temperature = 40 * 16, | 1263 | .pmic_temperature = 40 * 16, |
1227 | .spares = 75, | 1264 | .spares = 75, |
1228 | .alarm_flags = ND_INTEL_SMART_SPARE_TRIP | 1265 | .alarm_flags = ND_INTEL_SMART_SPARE_TRIP |
@@ -1366,7 +1403,7 @@ static void nfit_test0_setup(struct nfit_test *t) | |||
1366 | struct acpi_nfit_data_region *bdw; | 1403 | struct acpi_nfit_data_region *bdw; |
1367 | struct acpi_nfit_flush_address *flush; | 1404 | struct acpi_nfit_flush_address *flush; |
1368 | struct acpi_nfit_capabilities *pcap; | 1405 | struct acpi_nfit_capabilities *pcap; |
1369 | unsigned int offset, i; | 1406 | unsigned int offset = 0, i; |
1370 | 1407 | ||
1371 | /* | 1408 | /* |
1372 | * spa0 (interleave first half of dimm0 and dimm1, note storage | 1409 | * spa0 (interleave first half of dimm0 and dimm1, note storage |
@@ -1380,93 +1417,102 @@ static void nfit_test0_setup(struct nfit_test *t) | |||
1380 | spa->range_index = 0+1; | 1417 | spa->range_index = 0+1; |
1381 | spa->address = t->spa_set_dma[0]; | 1418 | spa->address = t->spa_set_dma[0]; |
1382 | spa->length = SPA0_SIZE; | 1419 | spa->length = SPA0_SIZE; |
1420 | offset += spa->header.length; | ||
1383 | 1421 | ||
1384 | /* | 1422 | /* |
1385 | * spa1 (interleave last half of the 4 DIMMS, note storage | 1423 | * spa1 (interleave last half of the 4 DIMMS, note storage |
1386 | * does not actually alias the related block-data-window | 1424 | * does not actually alias the related block-data-window |
1387 | * regions) | 1425 | * regions) |
1388 | */ | 1426 | */ |
1389 | spa = nfit_buf + sizeof(*spa); | 1427 | spa = nfit_buf + offset; |
1390 | spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS; | 1428 | spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS; |
1391 | spa->header.length = sizeof(*spa); | 1429 | spa->header.length = sizeof(*spa); |
1392 | memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_PM), 16); | 1430 | memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_PM), 16); |
1393 | spa->range_index = 1+1; | 1431 | spa->range_index = 1+1; |
1394 | spa->address = t->spa_set_dma[1]; | 1432 | spa->address = t->spa_set_dma[1]; |
1395 | spa->length = SPA1_SIZE; | 1433 | spa->length = SPA1_SIZE; |
1434 | offset += spa->header.length; | ||
1396 | 1435 | ||
1397 | /* spa2 (dcr0) dimm0 */ | 1436 | /* spa2 (dcr0) dimm0 */ |
1398 | spa = nfit_buf + sizeof(*spa) * 2; | 1437 | spa = nfit_buf + offset; |
1399 | spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS; | 1438 | spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS; |
1400 | spa->header.length = sizeof(*spa); | 1439 | spa->header.length = sizeof(*spa); |
1401 | memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_DCR), 16); | 1440 | memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_DCR), 16); |
1402 | spa->range_index = 2+1; | 1441 | spa->range_index = 2+1; |
1403 | spa->address = t->dcr_dma[0]; | 1442 | spa->address = t->dcr_dma[0]; |
1404 | spa->length = DCR_SIZE; | 1443 | spa->length = DCR_SIZE; |
1444 | offset += spa->header.length; | ||
1405 | 1445 | ||
1406 | /* spa3 (dcr1) dimm1 */ | 1446 | /* spa3 (dcr1) dimm1 */ |
1407 | spa = nfit_buf + sizeof(*spa) * 3; | 1447 | spa = nfit_buf + offset; |
1408 | spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS; | 1448 | spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS; |
1409 | spa->header.length = sizeof(*spa); | 1449 | spa->header.length = sizeof(*spa); |
1410 | memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_DCR), 16); | 1450 | memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_DCR), 16); |
1411 | spa->range_index = 3+1; | 1451 | spa->range_index = 3+1; |
1412 | spa->address = t->dcr_dma[1]; | 1452 | spa->address = t->dcr_dma[1]; |
1413 | spa->length = DCR_SIZE; | 1453 | spa->length = DCR_SIZE; |
1454 | offset += spa->header.length; | ||
1414 | 1455 | ||
1415 | /* spa4 (dcr2) dimm2 */ | 1456 | /* spa4 (dcr2) dimm2 */ |
1416 | spa = nfit_buf + sizeof(*spa) * 4; | 1457 | spa = nfit_buf + offset; |
1417 | spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS; | 1458 | spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS; |
1418 | spa->header.length = sizeof(*spa); | 1459 | spa->header.length = sizeof(*spa); |
1419 | memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_DCR), 16); | 1460 | memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_DCR), 16); |
1420 | spa->range_index = 4+1; | 1461 | spa->range_index = 4+1; |
1421 | spa->address = t->dcr_dma[2]; | 1462 | spa->address = t->dcr_dma[2]; |
1422 | spa->length = DCR_SIZE; | 1463 | spa->length = DCR_SIZE; |
1464 | offset += spa->header.length; | ||
1423 | 1465 | ||
1424 | /* spa5 (dcr3) dimm3 */ | 1466 | /* spa5 (dcr3) dimm3 */ |
1425 | spa = nfit_buf + sizeof(*spa) * 5; | 1467 | spa = nfit_buf + offset; |
1426 | spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS; | 1468 | spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS; |
1427 | spa->header.length = sizeof(*spa); | 1469 | spa->header.length = sizeof(*spa); |
1428 | memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_DCR), 16); | 1470 | memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_DCR), 16); |
1429 | spa->range_index = 5+1; | 1471 | spa->range_index = 5+1; |
1430 | spa->address = t->dcr_dma[3]; | 1472 | spa->address = t->dcr_dma[3]; |
1431 | spa->length = DCR_SIZE; | 1473 | spa->length = DCR_SIZE; |
1474 | offset += spa->header.length; | ||
1432 | 1475 | ||
1433 | /* spa6 (bdw for dcr0) dimm0 */ | 1476 | /* spa6 (bdw for dcr0) dimm0 */ |
1434 | spa = nfit_buf + sizeof(*spa) * 6; | 1477 | spa = nfit_buf + offset; |
1435 | spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS; | 1478 | spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS; |
1436 | spa->header.length = sizeof(*spa); | 1479 | spa->header.length = sizeof(*spa); |
1437 | memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_BDW), 16); | 1480 | memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_BDW), 16); |
1438 | spa->range_index = 6+1; | 1481 | spa->range_index = 6+1; |
1439 | spa->address = t->dimm_dma[0]; | 1482 | spa->address = t->dimm_dma[0]; |
1440 | spa->length = DIMM_SIZE; | 1483 | spa->length = DIMM_SIZE; |
1484 | offset += spa->header.length; | ||
1441 | 1485 | ||
1442 | /* spa7 (bdw for dcr1) dimm1 */ | 1486 | /* spa7 (bdw for dcr1) dimm1 */ |
1443 | spa = nfit_buf + sizeof(*spa) * 7; | 1487 | spa = nfit_buf + offset; |
1444 | spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS; | 1488 | spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS; |
1445 | spa->header.length = sizeof(*spa); | 1489 | spa->header.length = sizeof(*spa); |
1446 | memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_BDW), 16); | 1490 | memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_BDW), 16); |
1447 | spa->range_index = 7+1; | 1491 | spa->range_index = 7+1; |
1448 | spa->address = t->dimm_dma[1]; | 1492 | spa->address = t->dimm_dma[1]; |
1449 | spa->length = DIMM_SIZE; | 1493 | spa->length = DIMM_SIZE; |
1494 | offset += spa->header.length; | ||
1450 | 1495 | ||
1451 | /* spa8 (bdw for dcr2) dimm2 */ | 1496 | /* spa8 (bdw for dcr2) dimm2 */ |
1452 | spa = nfit_buf + sizeof(*spa) * 8; | 1497 | spa = nfit_buf + offset; |
1453 | spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS; | 1498 | spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS; |
1454 | spa->header.length = sizeof(*spa); | 1499 | spa->header.length = sizeof(*spa); |
1455 | memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_BDW), 16); | 1500 | memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_BDW), 16); |
1456 | spa->range_index = 8+1; | 1501 | spa->range_index = 8+1; |
1457 | spa->address = t->dimm_dma[2]; | 1502 | spa->address = t->dimm_dma[2]; |
1458 | spa->length = DIMM_SIZE; | 1503 | spa->length = DIMM_SIZE; |
1504 | offset += spa->header.length; | ||
1459 | 1505 | ||
1460 | /* spa9 (bdw for dcr3) dimm3 */ | 1506 | /* spa9 (bdw for dcr3) dimm3 */ |
1461 | spa = nfit_buf + sizeof(*spa) * 9; | 1507 | spa = nfit_buf + offset; |
1462 | spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS; | 1508 | spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS; |
1463 | spa->header.length = sizeof(*spa); | 1509 | spa->header.length = sizeof(*spa); |
1464 | memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_BDW), 16); | 1510 | memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_BDW), 16); |
1465 | spa->range_index = 9+1; | 1511 | spa->range_index = 9+1; |
1466 | spa->address = t->dimm_dma[3]; | 1512 | spa->address = t->dimm_dma[3]; |
1467 | spa->length = DIMM_SIZE; | 1513 | spa->length = DIMM_SIZE; |
1514 | offset += spa->header.length; | ||
1468 | 1515 | ||
1469 | offset = sizeof(*spa) * 10; | ||
1470 | /* mem-region0 (spa0, dimm0) */ | 1516 | /* mem-region0 (spa0, dimm0) */ |
1471 | memdev = nfit_buf + offset; | 1517 | memdev = nfit_buf + offset; |
1472 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; | 1518 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; |
@@ -1481,9 +1527,10 @@ static void nfit_test0_setup(struct nfit_test *t) | |||
1481 | memdev->address = 0; | 1527 | memdev->address = 0; |
1482 | memdev->interleave_index = 0; | 1528 | memdev->interleave_index = 0; |
1483 | memdev->interleave_ways = 2; | 1529 | memdev->interleave_ways = 2; |
1530 | offset += memdev->header.length; | ||
1484 | 1531 | ||
1485 | /* mem-region1 (spa0, dimm1) */ | 1532 | /* mem-region1 (spa0, dimm1) */ |
1486 | memdev = nfit_buf + offset + sizeof(struct acpi_nfit_memory_map); | 1533 | memdev = nfit_buf + offset; |
1487 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; | 1534 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; |
1488 | memdev->header.length = sizeof(*memdev); | 1535 | memdev->header.length = sizeof(*memdev); |
1489 | memdev->device_handle = handle[1]; | 1536 | memdev->device_handle = handle[1]; |
@@ -1497,9 +1544,10 @@ static void nfit_test0_setup(struct nfit_test *t) | |||
1497 | memdev->interleave_index = 0; | 1544 | memdev->interleave_index = 0; |
1498 | memdev->interleave_ways = 2; | 1545 | memdev->interleave_ways = 2; |
1499 | memdev->flags = ACPI_NFIT_MEM_HEALTH_ENABLED; | 1546 | memdev->flags = ACPI_NFIT_MEM_HEALTH_ENABLED; |
1547 | offset += memdev->header.length; | ||
1500 | 1548 | ||
1501 | /* mem-region2 (spa1, dimm0) */ | 1549 | /* mem-region2 (spa1, dimm0) */ |
1502 | memdev = nfit_buf + offset + sizeof(struct acpi_nfit_memory_map) * 2; | 1550 | memdev = nfit_buf + offset; |
1503 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; | 1551 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; |
1504 | memdev->header.length = sizeof(*memdev); | 1552 | memdev->header.length = sizeof(*memdev); |
1505 | memdev->device_handle = handle[0]; | 1553 | memdev->device_handle = handle[0]; |
@@ -1513,9 +1561,10 @@ static void nfit_test0_setup(struct nfit_test *t) | |||
1513 | memdev->interleave_index = 0; | 1561 | memdev->interleave_index = 0; |
1514 | memdev->interleave_ways = 4; | 1562 | memdev->interleave_ways = 4; |
1515 | memdev->flags = ACPI_NFIT_MEM_HEALTH_ENABLED; | 1563 | memdev->flags = ACPI_NFIT_MEM_HEALTH_ENABLED; |
1564 | offset += memdev->header.length; | ||
1516 | 1565 | ||
1517 | /* mem-region3 (spa1, dimm1) */ | 1566 | /* mem-region3 (spa1, dimm1) */ |
1518 | memdev = nfit_buf + offset + sizeof(struct acpi_nfit_memory_map) * 3; | 1567 | memdev = nfit_buf + offset; |
1519 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; | 1568 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; |
1520 | memdev->header.length = sizeof(*memdev); | 1569 | memdev->header.length = sizeof(*memdev); |
1521 | memdev->device_handle = handle[1]; | 1570 | memdev->device_handle = handle[1]; |
@@ -1528,9 +1577,10 @@ static void nfit_test0_setup(struct nfit_test *t) | |||
1528 | memdev->address = SPA0_SIZE/2; | 1577 | memdev->address = SPA0_SIZE/2; |
1529 | memdev->interleave_index = 0; | 1578 | memdev->interleave_index = 0; |
1530 | memdev->interleave_ways = 4; | 1579 | memdev->interleave_ways = 4; |
1580 | offset += memdev->header.length; | ||
1531 | 1581 | ||
1532 | /* mem-region4 (spa1, dimm2) */ | 1582 | /* mem-region4 (spa1, dimm2) */ |
1533 | memdev = nfit_buf + offset + sizeof(struct acpi_nfit_memory_map) * 4; | 1583 | memdev = nfit_buf + offset; |
1534 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; | 1584 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; |
1535 | memdev->header.length = sizeof(*memdev); | 1585 | memdev->header.length = sizeof(*memdev); |
1536 | memdev->device_handle = handle[2]; | 1586 | memdev->device_handle = handle[2]; |
@@ -1544,9 +1594,10 @@ static void nfit_test0_setup(struct nfit_test *t) | |||
1544 | memdev->interleave_index = 0; | 1594 | memdev->interleave_index = 0; |
1545 | memdev->interleave_ways = 4; | 1595 | memdev->interleave_ways = 4; |
1546 | memdev->flags = ACPI_NFIT_MEM_HEALTH_ENABLED; | 1596 | memdev->flags = ACPI_NFIT_MEM_HEALTH_ENABLED; |
1597 | offset += memdev->header.length; | ||
1547 | 1598 | ||
1548 | /* mem-region5 (spa1, dimm3) */ | 1599 | /* mem-region5 (spa1, dimm3) */ |
1549 | memdev = nfit_buf + offset + sizeof(struct acpi_nfit_memory_map) * 5; | 1600 | memdev = nfit_buf + offset; |
1550 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; | 1601 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; |
1551 | memdev->header.length = sizeof(*memdev); | 1602 | memdev->header.length = sizeof(*memdev); |
1552 | memdev->device_handle = handle[3]; | 1603 | memdev->device_handle = handle[3]; |
@@ -1559,9 +1610,10 @@ static void nfit_test0_setup(struct nfit_test *t) | |||
1559 | memdev->address = SPA0_SIZE/2; | 1610 | memdev->address = SPA0_SIZE/2; |
1560 | memdev->interleave_index = 0; | 1611 | memdev->interleave_index = 0; |
1561 | memdev->interleave_ways = 4; | 1612 | memdev->interleave_ways = 4; |
1613 | offset += memdev->header.length; | ||
1562 | 1614 | ||
1563 | /* mem-region6 (spa/dcr0, dimm0) */ | 1615 | /* mem-region6 (spa/dcr0, dimm0) */ |
1564 | memdev = nfit_buf + offset + sizeof(struct acpi_nfit_memory_map) * 6; | 1616 | memdev = nfit_buf + offset; |
1565 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; | 1617 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; |
1566 | memdev->header.length = sizeof(*memdev); | 1618 | memdev->header.length = sizeof(*memdev); |
1567 | memdev->device_handle = handle[0]; | 1619 | memdev->device_handle = handle[0]; |
@@ -1574,9 +1626,10 @@ static void nfit_test0_setup(struct nfit_test *t) | |||
1574 | memdev->address = 0; | 1626 | memdev->address = 0; |
1575 | memdev->interleave_index = 0; | 1627 | memdev->interleave_index = 0; |
1576 | memdev->interleave_ways = 1; | 1628 | memdev->interleave_ways = 1; |
1629 | offset += memdev->header.length; | ||
1577 | 1630 | ||
1578 | /* mem-region7 (spa/dcr1, dimm1) */ | 1631 | /* mem-region7 (spa/dcr1, dimm1) */ |
1579 | memdev = nfit_buf + offset + sizeof(struct acpi_nfit_memory_map) * 7; | 1632 | memdev = nfit_buf + offset; |
1580 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; | 1633 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; |
1581 | memdev->header.length = sizeof(*memdev); | 1634 | memdev->header.length = sizeof(*memdev); |
1582 | memdev->device_handle = handle[1]; | 1635 | memdev->device_handle = handle[1]; |
@@ -1589,9 +1642,10 @@ static void nfit_test0_setup(struct nfit_test *t) | |||
1589 | memdev->address = 0; | 1642 | memdev->address = 0; |
1590 | memdev->interleave_index = 0; | 1643 | memdev->interleave_index = 0; |
1591 | memdev->interleave_ways = 1; | 1644 | memdev->interleave_ways = 1; |
1645 | offset += memdev->header.length; | ||
1592 | 1646 | ||
1593 | /* mem-region8 (spa/dcr2, dimm2) */ | 1647 | /* mem-region8 (spa/dcr2, dimm2) */ |
1594 | memdev = nfit_buf + offset + sizeof(struct acpi_nfit_memory_map) * 8; | 1648 | memdev = nfit_buf + offset; |
1595 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; | 1649 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; |
1596 | memdev->header.length = sizeof(*memdev); | 1650 | memdev->header.length = sizeof(*memdev); |
1597 | memdev->device_handle = handle[2]; | 1651 | memdev->device_handle = handle[2]; |
@@ -1604,9 +1658,10 @@ static void nfit_test0_setup(struct nfit_test *t) | |||
1604 | memdev->address = 0; | 1658 | memdev->address = 0; |
1605 | memdev->interleave_index = 0; | 1659 | memdev->interleave_index = 0; |
1606 | memdev->interleave_ways = 1; | 1660 | memdev->interleave_ways = 1; |
1661 | offset += memdev->header.length; | ||
1607 | 1662 | ||
1608 | /* mem-region9 (spa/dcr3, dimm3) */ | 1663 | /* mem-region9 (spa/dcr3, dimm3) */ |
1609 | memdev = nfit_buf + offset + sizeof(struct acpi_nfit_memory_map) * 9; | 1664 | memdev = nfit_buf + offset; |
1610 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; | 1665 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; |
1611 | memdev->header.length = sizeof(*memdev); | 1666 | memdev->header.length = sizeof(*memdev); |
1612 | memdev->device_handle = handle[3]; | 1667 | memdev->device_handle = handle[3]; |
@@ -1619,9 +1674,10 @@ static void nfit_test0_setup(struct nfit_test *t) | |||
1619 | memdev->address = 0; | 1674 | memdev->address = 0; |
1620 | memdev->interleave_index = 0; | 1675 | memdev->interleave_index = 0; |
1621 | memdev->interleave_ways = 1; | 1676 | memdev->interleave_ways = 1; |
1677 | offset += memdev->header.length; | ||
1622 | 1678 | ||
1623 | /* mem-region10 (spa/bdw0, dimm0) */ | 1679 | /* mem-region10 (spa/bdw0, dimm0) */ |
1624 | memdev = nfit_buf + offset + sizeof(struct acpi_nfit_memory_map) * 10; | 1680 | memdev = nfit_buf + offset; |
1625 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; | 1681 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; |
1626 | memdev->header.length = sizeof(*memdev); | 1682 | memdev->header.length = sizeof(*memdev); |
1627 | memdev->device_handle = handle[0]; | 1683 | memdev->device_handle = handle[0]; |
@@ -1634,9 +1690,10 @@ static void nfit_test0_setup(struct nfit_test *t) | |||
1634 | memdev->address = 0; | 1690 | memdev->address = 0; |
1635 | memdev->interleave_index = 0; | 1691 | memdev->interleave_index = 0; |
1636 | memdev->interleave_ways = 1; | 1692 | memdev->interleave_ways = 1; |
1693 | offset += memdev->header.length; | ||
1637 | 1694 | ||
1638 | /* mem-region11 (spa/bdw1, dimm1) */ | 1695 | /* mem-region11 (spa/bdw1, dimm1) */ |
1639 | memdev = nfit_buf + offset + sizeof(struct acpi_nfit_memory_map) * 11; | 1696 | memdev = nfit_buf + offset; |
1640 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; | 1697 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; |
1641 | memdev->header.length = sizeof(*memdev); | 1698 | memdev->header.length = sizeof(*memdev); |
1642 | memdev->device_handle = handle[1]; | 1699 | memdev->device_handle = handle[1]; |
@@ -1649,9 +1706,10 @@ static void nfit_test0_setup(struct nfit_test *t) | |||
1649 | memdev->address = 0; | 1706 | memdev->address = 0; |
1650 | memdev->interleave_index = 0; | 1707 | memdev->interleave_index = 0; |
1651 | memdev->interleave_ways = 1; | 1708 | memdev->interleave_ways = 1; |
1709 | offset += memdev->header.length; | ||
1652 | 1710 | ||
1653 | /* mem-region12 (spa/bdw2, dimm2) */ | 1711 | /* mem-region12 (spa/bdw2, dimm2) */ |
1654 | memdev = nfit_buf + offset + sizeof(struct acpi_nfit_memory_map) * 12; | 1712 | memdev = nfit_buf + offset; |
1655 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; | 1713 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; |
1656 | memdev->header.length = sizeof(*memdev); | 1714 | memdev->header.length = sizeof(*memdev); |
1657 | memdev->device_handle = handle[2]; | 1715 | memdev->device_handle = handle[2]; |
@@ -1664,9 +1722,10 @@ static void nfit_test0_setup(struct nfit_test *t) | |||
1664 | memdev->address = 0; | 1722 | memdev->address = 0; |
1665 | memdev->interleave_index = 0; | 1723 | memdev->interleave_index = 0; |
1666 | memdev->interleave_ways = 1; | 1724 | memdev->interleave_ways = 1; |
1725 | offset += memdev->header.length; | ||
1667 | 1726 | ||
1668 | /* mem-region13 (spa/dcr3, dimm3) */ | 1727 | /* mem-region13 (spa/dcr3, dimm3) */ |
1669 | memdev = nfit_buf + offset + sizeof(struct acpi_nfit_memory_map) * 13; | 1728 | memdev = nfit_buf + offset; |
1670 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; | 1729 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; |
1671 | memdev->header.length = sizeof(*memdev); | 1730 | memdev->header.length = sizeof(*memdev); |
1672 | memdev->device_handle = handle[3]; | 1731 | memdev->device_handle = handle[3]; |
@@ -1680,12 +1739,12 @@ static void nfit_test0_setup(struct nfit_test *t) | |||
1680 | memdev->interleave_index = 0; | 1739 | memdev->interleave_index = 0; |
1681 | memdev->interleave_ways = 1; | 1740 | memdev->interleave_ways = 1; |
1682 | memdev->flags = ACPI_NFIT_MEM_HEALTH_ENABLED; | 1741 | memdev->flags = ACPI_NFIT_MEM_HEALTH_ENABLED; |
1742 | offset += memdev->header.length; | ||
1683 | 1743 | ||
1684 | offset = offset + sizeof(struct acpi_nfit_memory_map) * 14; | ||
1685 | /* dcr-descriptor0: blk */ | 1744 | /* dcr-descriptor0: blk */ |
1686 | dcr = nfit_buf + offset; | 1745 | dcr = nfit_buf + offset; |
1687 | dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION; | 1746 | dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION; |
1688 | dcr->header.length = sizeof(struct acpi_nfit_control_region); | 1747 | dcr->header.length = sizeof(*dcr); |
1689 | dcr->region_index = 0+1; | 1748 | dcr->region_index = 0+1; |
1690 | dcr_common_init(dcr); | 1749 | dcr_common_init(dcr); |
1691 | dcr->serial_number = ~handle[0]; | 1750 | dcr->serial_number = ~handle[0]; |
@@ -1696,11 +1755,12 @@ static void nfit_test0_setup(struct nfit_test *t) | |||
1696 | dcr->command_size = 8; | 1755 | dcr->command_size = 8; |
1697 | dcr->status_offset = 8; | 1756 | dcr->status_offset = 8; |
1698 | dcr->status_size = 4; | 1757 | dcr->status_size = 4; |
1758 | offset += dcr->header.length; | ||
1699 | 1759 | ||
1700 | /* dcr-descriptor1: blk */ | 1760 | /* dcr-descriptor1: blk */ |
1701 | dcr = nfit_buf + offset + sizeof(struct acpi_nfit_control_region); | 1761 | dcr = nfit_buf + offset; |
1702 | dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION; | 1762 | dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION; |
1703 | dcr->header.length = sizeof(struct acpi_nfit_control_region); | 1763 | dcr->header.length = sizeof(*dcr); |
1704 | dcr->region_index = 1+1; | 1764 | dcr->region_index = 1+1; |
1705 | dcr_common_init(dcr); | 1765 | dcr_common_init(dcr); |
1706 | dcr->serial_number = ~handle[1]; | 1766 | dcr->serial_number = ~handle[1]; |
@@ -1711,11 +1771,12 @@ static void nfit_test0_setup(struct nfit_test *t) | |||
1711 | dcr->command_size = 8; | 1771 | dcr->command_size = 8; |
1712 | dcr->status_offset = 8; | 1772 | dcr->status_offset = 8; |
1713 | dcr->status_size = 4; | 1773 | dcr->status_size = 4; |
1774 | offset += dcr->header.length; | ||
1714 | 1775 | ||
1715 | /* dcr-descriptor2: blk */ | 1776 | /* dcr-descriptor2: blk */ |
1716 | dcr = nfit_buf + offset + sizeof(struct acpi_nfit_control_region) * 2; | 1777 | dcr = nfit_buf + offset; |
1717 | dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION; | 1778 | dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION; |
1718 | dcr->header.length = sizeof(struct acpi_nfit_control_region); | 1779 | dcr->header.length = sizeof(*dcr); |
1719 | dcr->region_index = 2+1; | 1780 | dcr->region_index = 2+1; |
1720 | dcr_common_init(dcr); | 1781 | dcr_common_init(dcr); |
1721 | dcr->serial_number = ~handle[2]; | 1782 | dcr->serial_number = ~handle[2]; |
@@ -1726,11 +1787,12 @@ static void nfit_test0_setup(struct nfit_test *t) | |||
1726 | dcr->command_size = 8; | 1787 | dcr->command_size = 8; |
1727 | dcr->status_offset = 8; | 1788 | dcr->status_offset = 8; |
1728 | dcr->status_size = 4; | 1789 | dcr->status_size = 4; |
1790 | offset += dcr->header.length; | ||
1729 | 1791 | ||
1730 | /* dcr-descriptor3: blk */ | 1792 | /* dcr-descriptor3: blk */ |
1731 | dcr = nfit_buf + offset + sizeof(struct acpi_nfit_control_region) * 3; | 1793 | dcr = nfit_buf + offset; |
1732 | dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION; | 1794 | dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION; |
1733 | dcr->header.length = sizeof(struct acpi_nfit_control_region); | 1795 | dcr->header.length = sizeof(*dcr); |
1734 | dcr->region_index = 3+1; | 1796 | dcr->region_index = 3+1; |
1735 | dcr_common_init(dcr); | 1797 | dcr_common_init(dcr); |
1736 | dcr->serial_number = ~handle[3]; | 1798 | dcr->serial_number = ~handle[3]; |
@@ -1741,8 +1803,8 @@ static void nfit_test0_setup(struct nfit_test *t) | |||
1741 | dcr->command_size = 8; | 1803 | dcr->command_size = 8; |
1742 | dcr->status_offset = 8; | 1804 | dcr->status_offset = 8; |
1743 | dcr->status_size = 4; | 1805 | dcr->status_size = 4; |
1806 | offset += dcr->header.length; | ||
1744 | 1807 | ||
1745 | offset = offset + sizeof(struct acpi_nfit_control_region) * 4; | ||
1746 | /* dcr-descriptor0: pmem */ | 1808 | /* dcr-descriptor0: pmem */ |
1747 | dcr = nfit_buf + offset; | 1809 | dcr = nfit_buf + offset; |
1748 | dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION; | 1810 | dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION; |
@@ -1753,10 +1815,10 @@ static void nfit_test0_setup(struct nfit_test *t) | |||
1753 | dcr->serial_number = ~handle[0]; | 1815 | dcr->serial_number = ~handle[0]; |
1754 | dcr->code = NFIT_FIC_BYTEN; | 1816 | dcr->code = NFIT_FIC_BYTEN; |
1755 | dcr->windows = 0; | 1817 | dcr->windows = 0; |
1818 | offset += dcr->header.length; | ||
1756 | 1819 | ||
1757 | /* dcr-descriptor1: pmem */ | 1820 | /* dcr-descriptor1: pmem */ |
1758 | dcr = nfit_buf + offset + offsetof(struct acpi_nfit_control_region, | 1821 | dcr = nfit_buf + offset; |
1759 | window_size); | ||
1760 | dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION; | 1822 | dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION; |
1761 | dcr->header.length = offsetof(struct acpi_nfit_control_region, | 1823 | dcr->header.length = offsetof(struct acpi_nfit_control_region, |
1762 | window_size); | 1824 | window_size); |
@@ -1765,10 +1827,10 @@ static void nfit_test0_setup(struct nfit_test *t) | |||
1765 | dcr->serial_number = ~handle[1]; | 1827 | dcr->serial_number = ~handle[1]; |
1766 | dcr->code = NFIT_FIC_BYTEN; | 1828 | dcr->code = NFIT_FIC_BYTEN; |
1767 | dcr->windows = 0; | 1829 | dcr->windows = 0; |
1830 | offset += dcr->header.length; | ||
1768 | 1831 | ||
1769 | /* dcr-descriptor2: pmem */ | 1832 | /* dcr-descriptor2: pmem */ |
1770 | dcr = nfit_buf + offset + offsetof(struct acpi_nfit_control_region, | 1833 | dcr = nfit_buf + offset; |
1771 | window_size) * 2; | ||
1772 | dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION; | 1834 | dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION; |
1773 | dcr->header.length = offsetof(struct acpi_nfit_control_region, | 1835 | dcr->header.length = offsetof(struct acpi_nfit_control_region, |
1774 | window_size); | 1836 | window_size); |
@@ -1777,10 +1839,10 @@ static void nfit_test0_setup(struct nfit_test *t) | |||
1777 | dcr->serial_number = ~handle[2]; | 1839 | dcr->serial_number = ~handle[2]; |
1778 | dcr->code = NFIT_FIC_BYTEN; | 1840 | dcr->code = NFIT_FIC_BYTEN; |
1779 | dcr->windows = 0; | 1841 | dcr->windows = 0; |
1842 | offset += dcr->header.length; | ||
1780 | 1843 | ||
1781 | /* dcr-descriptor3: pmem */ | 1844 | /* dcr-descriptor3: pmem */ |
1782 | dcr = nfit_buf + offset + offsetof(struct acpi_nfit_control_region, | 1845 | dcr = nfit_buf + offset; |
1783 | window_size) * 3; | ||
1784 | dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION; | 1846 | dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION; |
1785 | dcr->header.length = offsetof(struct acpi_nfit_control_region, | 1847 | dcr->header.length = offsetof(struct acpi_nfit_control_region, |
1786 | window_size); | 1848 | window_size); |
@@ -1789,54 +1851,56 @@ static void nfit_test0_setup(struct nfit_test *t) | |||
1789 | dcr->serial_number = ~handle[3]; | 1851 | dcr->serial_number = ~handle[3]; |
1790 | dcr->code = NFIT_FIC_BYTEN; | 1852 | dcr->code = NFIT_FIC_BYTEN; |
1791 | dcr->windows = 0; | 1853 | dcr->windows = 0; |
1854 | offset += dcr->header.length; | ||
1792 | 1855 | ||
1793 | offset = offset + offsetof(struct acpi_nfit_control_region, | ||
1794 | window_size) * 4; | ||
1795 | /* bdw0 (spa/dcr0, dimm0) */ | 1856 | /* bdw0 (spa/dcr0, dimm0) */ |
1796 | bdw = nfit_buf + offset; | 1857 | bdw = nfit_buf + offset; |
1797 | bdw->header.type = ACPI_NFIT_TYPE_DATA_REGION; | 1858 | bdw->header.type = ACPI_NFIT_TYPE_DATA_REGION; |
1798 | bdw->header.length = sizeof(struct acpi_nfit_data_region); | 1859 | bdw->header.length = sizeof(*bdw); |
1799 | bdw->region_index = 0+1; | 1860 | bdw->region_index = 0+1; |
1800 | bdw->windows = 1; | 1861 | bdw->windows = 1; |
1801 | bdw->offset = 0; | 1862 | bdw->offset = 0; |
1802 | bdw->size = BDW_SIZE; | 1863 | bdw->size = BDW_SIZE; |
1803 | bdw->capacity = DIMM_SIZE; | 1864 | bdw->capacity = DIMM_SIZE; |
1804 | bdw->start_address = 0; | 1865 | bdw->start_address = 0; |
1866 | offset += bdw->header.length; | ||
1805 | 1867 | ||
1806 | /* bdw1 (spa/dcr1, dimm1) */ | 1868 | /* bdw1 (spa/dcr1, dimm1) */ |
1807 | bdw = nfit_buf + offset + sizeof(struct acpi_nfit_data_region); | 1869 | bdw = nfit_buf + offset; |
1808 | bdw->header.type = ACPI_NFIT_TYPE_DATA_REGION; | 1870 | bdw->header.type = ACPI_NFIT_TYPE_DATA_REGION; |
1809 | bdw->header.length = sizeof(struct acpi_nfit_data_region); | 1871 | bdw->header.length = sizeof(*bdw); |
1810 | bdw->region_index = 1+1; | 1872 | bdw->region_index = 1+1; |
1811 | bdw->windows = 1; | 1873 | bdw->windows = 1; |
1812 | bdw->offset = 0; | 1874 | bdw->offset = 0; |
1813 | bdw->size = BDW_SIZE; | 1875 | bdw->size = BDW_SIZE; |
1814 | bdw->capacity = DIMM_SIZE; | 1876 | bdw->capacity = DIMM_SIZE; |
1815 | bdw->start_address = 0; | 1877 | bdw->start_address = 0; |
1878 | offset += bdw->header.length; | ||
1816 | 1879 | ||
1817 | /* bdw2 (spa/dcr2, dimm2) */ | 1880 | /* bdw2 (spa/dcr2, dimm2) */ |
1818 | bdw = nfit_buf + offset + sizeof(struct acpi_nfit_data_region) * 2; | 1881 | bdw = nfit_buf + offset; |
1819 | bdw->header.type = ACPI_NFIT_TYPE_DATA_REGION; | 1882 | bdw->header.type = ACPI_NFIT_TYPE_DATA_REGION; |
1820 | bdw->header.length = sizeof(struct acpi_nfit_data_region); | 1883 | bdw->header.length = sizeof(*bdw); |
1821 | bdw->region_index = 2+1; | 1884 | bdw->region_index = 2+1; |
1822 | bdw->windows = 1; | 1885 | bdw->windows = 1; |
1823 | bdw->offset = 0; | 1886 | bdw->offset = 0; |
1824 | bdw->size = BDW_SIZE; | 1887 | bdw->size = BDW_SIZE; |
1825 | bdw->capacity = DIMM_SIZE; | 1888 | bdw->capacity = DIMM_SIZE; |
1826 | bdw->start_address = 0; | 1889 | bdw->start_address = 0; |
1890 | offset += bdw->header.length; | ||
1827 | 1891 | ||
1828 | /* bdw3 (spa/dcr3, dimm3) */ | 1892 | /* bdw3 (spa/dcr3, dimm3) */ |
1829 | bdw = nfit_buf + offset + sizeof(struct acpi_nfit_data_region) * 3; | 1893 | bdw = nfit_buf + offset; |
1830 | bdw->header.type = ACPI_NFIT_TYPE_DATA_REGION; | 1894 | bdw->header.type = ACPI_NFIT_TYPE_DATA_REGION; |
1831 | bdw->header.length = sizeof(struct acpi_nfit_data_region); | 1895 | bdw->header.length = sizeof(*bdw); |
1832 | bdw->region_index = 3+1; | 1896 | bdw->region_index = 3+1; |
1833 | bdw->windows = 1; | 1897 | bdw->windows = 1; |
1834 | bdw->offset = 0; | 1898 | bdw->offset = 0; |
1835 | bdw->size = BDW_SIZE; | 1899 | bdw->size = BDW_SIZE; |
1836 | bdw->capacity = DIMM_SIZE; | 1900 | bdw->capacity = DIMM_SIZE; |
1837 | bdw->start_address = 0; | 1901 | bdw->start_address = 0; |
1902 | offset += bdw->header.length; | ||
1838 | 1903 | ||
1839 | offset = offset + sizeof(struct acpi_nfit_data_region) * 4; | ||
1840 | /* flush0 (dimm0) */ | 1904 | /* flush0 (dimm0) */ |
1841 | flush = nfit_buf + offset; | 1905 | flush = nfit_buf + offset; |
1842 | flush->header.type = ACPI_NFIT_TYPE_FLUSH_ADDRESS; | 1906 | flush->header.type = ACPI_NFIT_TYPE_FLUSH_ADDRESS; |
@@ -1845,48 +1909,52 @@ static void nfit_test0_setup(struct nfit_test *t) | |||
1845 | flush->hint_count = NUM_HINTS; | 1909 | flush->hint_count = NUM_HINTS; |
1846 | for (i = 0; i < NUM_HINTS; i++) | 1910 | for (i = 0; i < NUM_HINTS; i++) |
1847 | flush->hint_address[i] = t->flush_dma[0] + i * sizeof(u64); | 1911 | flush->hint_address[i] = t->flush_dma[0] + i * sizeof(u64); |
1912 | offset += flush->header.length; | ||
1848 | 1913 | ||
1849 | /* flush1 (dimm1) */ | 1914 | /* flush1 (dimm1) */ |
1850 | flush = nfit_buf + offset + flush_hint_size * 1; | 1915 | flush = nfit_buf + offset; |
1851 | flush->header.type = ACPI_NFIT_TYPE_FLUSH_ADDRESS; | 1916 | flush->header.type = ACPI_NFIT_TYPE_FLUSH_ADDRESS; |
1852 | flush->header.length = flush_hint_size; | 1917 | flush->header.length = flush_hint_size; |
1853 | flush->device_handle = handle[1]; | 1918 | flush->device_handle = handle[1]; |
1854 | flush->hint_count = NUM_HINTS; | 1919 | flush->hint_count = NUM_HINTS; |
1855 | for (i = 0; i < NUM_HINTS; i++) | 1920 | for (i = 0; i < NUM_HINTS; i++) |
1856 | flush->hint_address[i] = t->flush_dma[1] + i * sizeof(u64); | 1921 | flush->hint_address[i] = t->flush_dma[1] + i * sizeof(u64); |
1922 | offset += flush->header.length; | ||
1857 | 1923 | ||
1858 | /* flush2 (dimm2) */ | 1924 | /* flush2 (dimm2) */ |
1859 | flush = nfit_buf + offset + flush_hint_size * 2; | 1925 | flush = nfit_buf + offset; |
1860 | flush->header.type = ACPI_NFIT_TYPE_FLUSH_ADDRESS; | 1926 | flush->header.type = ACPI_NFIT_TYPE_FLUSH_ADDRESS; |
1861 | flush->header.length = flush_hint_size; | 1927 | flush->header.length = flush_hint_size; |
1862 | flush->device_handle = handle[2]; | 1928 | flush->device_handle = handle[2]; |
1863 | flush->hint_count = NUM_HINTS; | 1929 | flush->hint_count = NUM_HINTS; |
1864 | for (i = 0; i < NUM_HINTS; i++) | 1930 | for (i = 0; i < NUM_HINTS; i++) |
1865 | flush->hint_address[i] = t->flush_dma[2] + i * sizeof(u64); | 1931 | flush->hint_address[i] = t->flush_dma[2] + i * sizeof(u64); |
1932 | offset += flush->header.length; | ||
1866 | 1933 | ||
1867 | /* flush3 (dimm3) */ | 1934 | /* flush3 (dimm3) */ |
1868 | flush = nfit_buf + offset + flush_hint_size * 3; | 1935 | flush = nfit_buf + offset; |
1869 | flush->header.type = ACPI_NFIT_TYPE_FLUSH_ADDRESS; | 1936 | flush->header.type = ACPI_NFIT_TYPE_FLUSH_ADDRESS; |
1870 | flush->header.length = flush_hint_size; | 1937 | flush->header.length = flush_hint_size; |
1871 | flush->device_handle = handle[3]; | 1938 | flush->device_handle = handle[3]; |
1872 | flush->hint_count = NUM_HINTS; | 1939 | flush->hint_count = NUM_HINTS; |
1873 | for (i = 0; i < NUM_HINTS; i++) | 1940 | for (i = 0; i < NUM_HINTS; i++) |
1874 | flush->hint_address[i] = t->flush_dma[3] + i * sizeof(u64); | 1941 | flush->hint_address[i] = t->flush_dma[3] + i * sizeof(u64); |
1942 | offset += flush->header.length; | ||
1875 | 1943 | ||
1876 | /* platform capabilities */ | 1944 | /* platform capabilities */ |
1877 | pcap = nfit_buf + offset + flush_hint_size * 4; | 1945 | pcap = nfit_buf + offset; |
1878 | pcap->header.type = ACPI_NFIT_TYPE_CAPABILITIES; | 1946 | pcap->header.type = ACPI_NFIT_TYPE_CAPABILITIES; |
1879 | pcap->header.length = sizeof(*pcap); | 1947 | pcap->header.length = sizeof(*pcap); |
1880 | pcap->highest_capability = 1; | 1948 | pcap->highest_capability = 1; |
1881 | pcap->capabilities = ACPI_NFIT_CAPABILITY_CACHE_FLUSH | | 1949 | pcap->capabilities = ACPI_NFIT_CAPABILITY_CACHE_FLUSH | |
1882 | ACPI_NFIT_CAPABILITY_MEM_FLUSH; | 1950 | ACPI_NFIT_CAPABILITY_MEM_FLUSH; |
1951 | offset += pcap->header.length; | ||
1883 | 1952 | ||
1884 | if (t->setup_hotplug) { | 1953 | if (t->setup_hotplug) { |
1885 | offset = offset + flush_hint_size * 4 + sizeof(*pcap); | ||
1886 | /* dcr-descriptor4: blk */ | 1954 | /* dcr-descriptor4: blk */ |
1887 | dcr = nfit_buf + offset; | 1955 | dcr = nfit_buf + offset; |
1888 | dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION; | 1956 | dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION; |
1889 | dcr->header.length = sizeof(struct acpi_nfit_control_region); | 1957 | dcr->header.length = sizeof(*dcr); |
1890 | dcr->region_index = 8+1; | 1958 | dcr->region_index = 8+1; |
1891 | dcr_common_init(dcr); | 1959 | dcr_common_init(dcr); |
1892 | dcr->serial_number = ~handle[4]; | 1960 | dcr->serial_number = ~handle[4]; |
@@ -1897,8 +1965,8 @@ static void nfit_test0_setup(struct nfit_test *t) | |||
1897 | dcr->command_size = 8; | 1965 | dcr->command_size = 8; |
1898 | dcr->status_offset = 8; | 1966 | dcr->status_offset = 8; |
1899 | dcr->status_size = 4; | 1967 | dcr->status_size = 4; |
1968 | offset += dcr->header.length; | ||
1900 | 1969 | ||
1901 | offset = offset + sizeof(struct acpi_nfit_control_region); | ||
1902 | /* dcr-descriptor4: pmem */ | 1970 | /* dcr-descriptor4: pmem */ |
1903 | dcr = nfit_buf + offset; | 1971 | dcr = nfit_buf + offset; |
1904 | dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION; | 1972 | dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION; |
@@ -1909,21 +1977,20 @@ static void nfit_test0_setup(struct nfit_test *t) | |||
1909 | dcr->serial_number = ~handle[4]; | 1977 | dcr->serial_number = ~handle[4]; |
1910 | dcr->code = NFIT_FIC_BYTEN; | 1978 | dcr->code = NFIT_FIC_BYTEN; |
1911 | dcr->windows = 0; | 1979 | dcr->windows = 0; |
1980 | offset += dcr->header.length; | ||
1912 | 1981 | ||
1913 | offset = offset + offsetof(struct acpi_nfit_control_region, | ||
1914 | window_size); | ||
1915 | /* bdw4 (spa/dcr4, dimm4) */ | 1982 | /* bdw4 (spa/dcr4, dimm4) */ |
1916 | bdw = nfit_buf + offset; | 1983 | bdw = nfit_buf + offset; |
1917 | bdw->header.type = ACPI_NFIT_TYPE_DATA_REGION; | 1984 | bdw->header.type = ACPI_NFIT_TYPE_DATA_REGION; |
1918 | bdw->header.length = sizeof(struct acpi_nfit_data_region); | 1985 | bdw->header.length = sizeof(*bdw); |
1919 | bdw->region_index = 8+1; | 1986 | bdw->region_index = 8+1; |
1920 | bdw->windows = 1; | 1987 | bdw->windows = 1; |
1921 | bdw->offset = 0; | 1988 | bdw->offset = 0; |
1922 | bdw->size = BDW_SIZE; | 1989 | bdw->size = BDW_SIZE; |
1923 | bdw->capacity = DIMM_SIZE; | 1990 | bdw->capacity = DIMM_SIZE; |
1924 | bdw->start_address = 0; | 1991 | bdw->start_address = 0; |
1992 | offset += bdw->header.length; | ||
1925 | 1993 | ||
1926 | offset = offset + sizeof(struct acpi_nfit_data_region); | ||
1927 | /* spa10 (dcr4) dimm4 */ | 1994 | /* spa10 (dcr4) dimm4 */ |
1928 | spa = nfit_buf + offset; | 1995 | spa = nfit_buf + offset; |
1929 | spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS; | 1996 | spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS; |
@@ -1932,30 +1999,32 @@ static void nfit_test0_setup(struct nfit_test *t) | |||
1932 | spa->range_index = 10+1; | 1999 | spa->range_index = 10+1; |
1933 | spa->address = t->dcr_dma[4]; | 2000 | spa->address = t->dcr_dma[4]; |
1934 | spa->length = DCR_SIZE; | 2001 | spa->length = DCR_SIZE; |
2002 | offset += spa->header.length; | ||
1935 | 2003 | ||
1936 | /* | 2004 | /* |
1937 | * spa11 (single-dimm interleave for hotplug, note storage | 2005 | * spa11 (single-dimm interleave for hotplug, note storage |
1938 | * does not actually alias the related block-data-window | 2006 | * does not actually alias the related block-data-window |
1939 | * regions) | 2007 | * regions) |
1940 | */ | 2008 | */ |
1941 | spa = nfit_buf + offset + sizeof(*spa); | 2009 | spa = nfit_buf + offset; |
1942 | spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS; | 2010 | spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS; |
1943 | spa->header.length = sizeof(*spa); | 2011 | spa->header.length = sizeof(*spa); |
1944 | memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_PM), 16); | 2012 | memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_PM), 16); |
1945 | spa->range_index = 11+1; | 2013 | spa->range_index = 11+1; |
1946 | spa->address = t->spa_set_dma[2]; | 2014 | spa->address = t->spa_set_dma[2]; |
1947 | spa->length = SPA0_SIZE; | 2015 | spa->length = SPA0_SIZE; |
2016 | offset += spa->header.length; | ||
1948 | 2017 | ||
1949 | /* spa12 (bdw for dcr4) dimm4 */ | 2018 | /* spa12 (bdw for dcr4) dimm4 */ |
1950 | spa = nfit_buf + offset + sizeof(*spa) * 2; | 2019 | spa = nfit_buf + offset; |
1951 | spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS; | 2020 | spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS; |
1952 | spa->header.length = sizeof(*spa); | 2021 | spa->header.length = sizeof(*spa); |
1953 | memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_BDW), 16); | 2022 | memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_BDW), 16); |
1954 | spa->range_index = 12+1; | 2023 | spa->range_index = 12+1; |
1955 | spa->address = t->dimm_dma[4]; | 2024 | spa->address = t->dimm_dma[4]; |
1956 | spa->length = DIMM_SIZE; | 2025 | spa->length = DIMM_SIZE; |
2026 | offset += spa->header.length; | ||
1957 | 2027 | ||
1958 | offset = offset + sizeof(*spa) * 3; | ||
1959 | /* mem-region14 (spa/dcr4, dimm4) */ | 2028 | /* mem-region14 (spa/dcr4, dimm4) */ |
1960 | memdev = nfit_buf + offset; | 2029 | memdev = nfit_buf + offset; |
1961 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; | 2030 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; |
@@ -1970,10 +2039,10 @@ static void nfit_test0_setup(struct nfit_test *t) | |||
1970 | memdev->address = 0; | 2039 | memdev->address = 0; |
1971 | memdev->interleave_index = 0; | 2040 | memdev->interleave_index = 0; |
1972 | memdev->interleave_ways = 1; | 2041 | memdev->interleave_ways = 1; |
2042 | offset += memdev->header.length; | ||
1973 | 2043 | ||
1974 | /* mem-region15 (spa0, dimm4) */ | 2044 | /* mem-region15 (spa11, dimm4) */ |
1975 | memdev = nfit_buf + offset + | 2045 | memdev = nfit_buf + offset; |
1976 | sizeof(struct acpi_nfit_memory_map); | ||
1977 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; | 2046 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; |
1978 | memdev->header.length = sizeof(*memdev); | 2047 | memdev->header.length = sizeof(*memdev); |
1979 | memdev->device_handle = handle[4]; | 2048 | memdev->device_handle = handle[4]; |
@@ -1987,10 +2056,10 @@ static void nfit_test0_setup(struct nfit_test *t) | |||
1987 | memdev->interleave_index = 0; | 2056 | memdev->interleave_index = 0; |
1988 | memdev->interleave_ways = 1; | 2057 | memdev->interleave_ways = 1; |
1989 | memdev->flags = ACPI_NFIT_MEM_HEALTH_ENABLED; | 2058 | memdev->flags = ACPI_NFIT_MEM_HEALTH_ENABLED; |
2059 | offset += memdev->header.length; | ||
1990 | 2060 | ||
1991 | /* mem-region16 (spa/bdw4, dimm4) */ | 2061 | /* mem-region16 (spa/bdw4, dimm4) */ |
1992 | memdev = nfit_buf + offset + | 2062 | memdev = nfit_buf + offset; |
1993 | sizeof(struct acpi_nfit_memory_map) * 2; | ||
1994 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; | 2063 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; |
1995 | memdev->header.length = sizeof(*memdev); | 2064 | memdev->header.length = sizeof(*memdev); |
1996 | memdev->device_handle = handle[4]; | 2065 | memdev->device_handle = handle[4]; |
@@ -2003,8 +2072,8 @@ static void nfit_test0_setup(struct nfit_test *t) | |||
2003 | memdev->address = 0; | 2072 | memdev->address = 0; |
2004 | memdev->interleave_index = 0; | 2073 | memdev->interleave_index = 0; |
2005 | memdev->interleave_ways = 1; | 2074 | memdev->interleave_ways = 1; |
2075 | offset += memdev->header.length; | ||
2006 | 2076 | ||
2007 | offset = offset + sizeof(struct acpi_nfit_memory_map) * 3; | ||
2008 | /* flush3 (dimm4) */ | 2077 | /* flush3 (dimm4) */ |
2009 | flush = nfit_buf + offset; | 2078 | flush = nfit_buf + offset; |
2010 | flush->header.type = ACPI_NFIT_TYPE_FLUSH_ADDRESS; | 2079 | flush->header.type = ACPI_NFIT_TYPE_FLUSH_ADDRESS; |
@@ -2014,8 +2083,14 @@ static void nfit_test0_setup(struct nfit_test *t) | |||
2014 | for (i = 0; i < NUM_HINTS; i++) | 2083 | for (i = 0; i < NUM_HINTS; i++) |
2015 | flush->hint_address[i] = t->flush_dma[4] | 2084 | flush->hint_address[i] = t->flush_dma[4] |
2016 | + i * sizeof(u64); | 2085 | + i * sizeof(u64); |
2086 | offset += flush->header.length; | ||
2087 | |||
2088 | /* sanity check to make sure we've filled the buffer */ | ||
2089 | WARN_ON(offset != t->nfit_size); | ||
2017 | } | 2090 | } |
2018 | 2091 | ||
2092 | t->nfit_filled = offset; | ||
2093 | |||
2019 | post_ars_status(&t->ars_state, &t->badrange, t->spa_set_dma[0], | 2094 | post_ars_status(&t->ars_state, &t->badrange, t->spa_set_dma[0], |
2020 | SPA0_SIZE); | 2095 | SPA0_SIZE); |
2021 | 2096 | ||
@@ -2026,6 +2101,7 @@ static void nfit_test0_setup(struct nfit_test *t) | |||
2026 | set_bit(ND_INTEL_SMART, &acpi_desc->dimm_cmd_force_en); | 2101 | set_bit(ND_INTEL_SMART, &acpi_desc->dimm_cmd_force_en); |
2027 | set_bit(ND_INTEL_SMART_THRESHOLD, &acpi_desc->dimm_cmd_force_en); | 2102 | set_bit(ND_INTEL_SMART_THRESHOLD, &acpi_desc->dimm_cmd_force_en); |
2028 | set_bit(ND_INTEL_SMART_SET_THRESHOLD, &acpi_desc->dimm_cmd_force_en); | 2103 | set_bit(ND_INTEL_SMART_SET_THRESHOLD, &acpi_desc->dimm_cmd_force_en); |
2104 | set_bit(ND_INTEL_SMART_INJECT, &acpi_desc->dimm_cmd_force_en); | ||
2029 | set_bit(ND_CMD_ARS_CAP, &acpi_desc->bus_cmd_force_en); | 2105 | set_bit(ND_CMD_ARS_CAP, &acpi_desc->bus_cmd_force_en); |
2030 | set_bit(ND_CMD_ARS_START, &acpi_desc->bus_cmd_force_en); | 2106 | set_bit(ND_CMD_ARS_START, &acpi_desc->bus_cmd_force_en); |
2031 | set_bit(ND_CMD_ARS_STATUS, &acpi_desc->bus_cmd_force_en); | 2107 | set_bit(ND_CMD_ARS_STATUS, &acpi_desc->bus_cmd_force_en); |
@@ -2061,17 +2137,18 @@ static void nfit_test1_setup(struct nfit_test *t) | |||
2061 | spa->range_index = 0+1; | 2137 | spa->range_index = 0+1; |
2062 | spa->address = t->spa_set_dma[0]; | 2138 | spa->address = t->spa_set_dma[0]; |
2063 | spa->length = SPA2_SIZE; | 2139 | spa->length = SPA2_SIZE; |
2140 | offset += spa->header.length; | ||
2064 | 2141 | ||
2065 | /* virtual cd region */ | 2142 | /* virtual cd region */ |
2066 | spa = nfit_buf + sizeof(*spa); | 2143 | spa = nfit_buf + offset; |
2067 | spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS; | 2144 | spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS; |
2068 | spa->header.length = sizeof(*spa); | 2145 | spa->header.length = sizeof(*spa); |
2069 | memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_VCD), 16); | 2146 | memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_VCD), 16); |
2070 | spa->range_index = 0; | 2147 | spa->range_index = 0; |
2071 | spa->address = t->spa_set_dma[1]; | 2148 | spa->address = t->spa_set_dma[1]; |
2072 | spa->length = SPA_VCD_SIZE; | 2149 | spa->length = SPA_VCD_SIZE; |
2150 | offset += spa->header.length; | ||
2073 | 2151 | ||
2074 | offset += sizeof(*spa) * 2; | ||
2075 | /* mem-region0 (spa0, dimm0) */ | 2152 | /* mem-region0 (spa0, dimm0) */ |
2076 | memdev = nfit_buf + offset; | 2153 | memdev = nfit_buf + offset; |
2077 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; | 2154 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; |
@@ -2089,8 +2166,8 @@ static void nfit_test1_setup(struct nfit_test *t) | |||
2089 | memdev->flags = ACPI_NFIT_MEM_SAVE_FAILED | ACPI_NFIT_MEM_RESTORE_FAILED | 2166 | memdev->flags = ACPI_NFIT_MEM_SAVE_FAILED | ACPI_NFIT_MEM_RESTORE_FAILED |
2090 | | ACPI_NFIT_MEM_FLUSH_FAILED | ACPI_NFIT_MEM_HEALTH_OBSERVED | 2167 | | ACPI_NFIT_MEM_FLUSH_FAILED | ACPI_NFIT_MEM_HEALTH_OBSERVED |
2091 | | ACPI_NFIT_MEM_NOT_ARMED; | 2168 | | ACPI_NFIT_MEM_NOT_ARMED; |
2169 | offset += memdev->header.length; | ||
2092 | 2170 | ||
2093 | offset += sizeof(*memdev); | ||
2094 | /* dcr-descriptor0 */ | 2171 | /* dcr-descriptor0 */ |
2095 | dcr = nfit_buf + offset; | 2172 | dcr = nfit_buf + offset; |
2096 | dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION; | 2173 | dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION; |
@@ -2101,8 +2178,8 @@ static void nfit_test1_setup(struct nfit_test *t) | |||
2101 | dcr->serial_number = ~handle[5]; | 2178 | dcr->serial_number = ~handle[5]; |
2102 | dcr->code = NFIT_FIC_BYTE; | 2179 | dcr->code = NFIT_FIC_BYTE; |
2103 | dcr->windows = 0; | 2180 | dcr->windows = 0; |
2104 | |||
2105 | offset += dcr->header.length; | 2181 | offset += dcr->header.length; |
2182 | |||
2106 | memdev = nfit_buf + offset; | 2183 | memdev = nfit_buf + offset; |
2107 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; | 2184 | memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP; |
2108 | memdev->header.length = sizeof(*memdev); | 2185 | memdev->header.length = sizeof(*memdev); |
@@ -2117,9 +2194,9 @@ static void nfit_test1_setup(struct nfit_test *t) | |||
2117 | memdev->interleave_index = 0; | 2194 | memdev->interleave_index = 0; |
2118 | memdev->interleave_ways = 1; | 2195 | memdev->interleave_ways = 1; |
2119 | memdev->flags = ACPI_NFIT_MEM_MAP_FAILED; | 2196 | memdev->flags = ACPI_NFIT_MEM_MAP_FAILED; |
2197 | offset += memdev->header.length; | ||
2120 | 2198 | ||
2121 | /* dcr-descriptor1 */ | 2199 | /* dcr-descriptor1 */ |
2122 | offset += sizeof(*memdev); | ||
2123 | dcr = nfit_buf + offset; | 2200 | dcr = nfit_buf + offset; |
2124 | dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION; | 2201 | dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION; |
2125 | dcr->header.length = offsetof(struct acpi_nfit_control_region, | 2202 | dcr->header.length = offsetof(struct acpi_nfit_control_region, |
@@ -2129,6 +2206,12 @@ static void nfit_test1_setup(struct nfit_test *t) | |||
2129 | dcr->serial_number = ~handle[6]; | 2206 | dcr->serial_number = ~handle[6]; |
2130 | dcr->code = NFIT_FIC_BYTE; | 2207 | dcr->code = NFIT_FIC_BYTE; |
2131 | dcr->windows = 0; | 2208 | dcr->windows = 0; |
2209 | offset += dcr->header.length; | ||
2210 | |||
2211 | /* sanity check to make sure we've filled the buffer */ | ||
2212 | WARN_ON(offset != t->nfit_size); | ||
2213 | |||
2214 | t->nfit_filled = offset; | ||
2132 | 2215 | ||
2133 | post_ars_status(&t->ars_state, &t->badrange, t->spa_set_dma[0], | 2216 | post_ars_status(&t->ars_state, &t->badrange, t->spa_set_dma[0], |
2134 | SPA2_SIZE); | 2217 | SPA2_SIZE); |
@@ -2487,7 +2570,7 @@ static int nfit_test_probe(struct platform_device *pdev) | |||
2487 | nd_desc->ndctl = nfit_test_ctl; | 2570 | nd_desc->ndctl = nfit_test_ctl; |
2488 | 2571 | ||
2489 | rc = acpi_nfit_init(acpi_desc, nfit_test->nfit_buf, | 2572 | rc = acpi_nfit_init(acpi_desc, nfit_test->nfit_buf, |
2490 | nfit_test->nfit_size); | 2573 | nfit_test->nfit_filled); |
2491 | if (rc) | 2574 | if (rc) |
2492 | return rc; | 2575 | return rc; |
2493 | 2576 | ||
diff --git a/tools/testing/nvdimm/test/nfit_test.h b/tools/testing/nvdimm/test/nfit_test.h index 428344519cdf..33752e06ff8d 100644 --- a/tools/testing/nvdimm/test/nfit_test.h +++ b/tools/testing/nvdimm/test/nfit_test.h | |||
@@ -93,6 +93,7 @@ struct nd_cmd_ars_err_inj_stat { | |||
93 | #define ND_INTEL_FW_FINISH_UPDATE 15 | 93 | #define ND_INTEL_FW_FINISH_UPDATE 15 |
94 | #define ND_INTEL_FW_FINISH_QUERY 16 | 94 | #define ND_INTEL_FW_FINISH_QUERY 16 |
95 | #define ND_INTEL_SMART_SET_THRESHOLD 17 | 95 | #define ND_INTEL_SMART_SET_THRESHOLD 17 |
96 | #define ND_INTEL_SMART_INJECT 18 | ||
96 | 97 | ||
97 | #define ND_INTEL_SMART_HEALTH_VALID (1 << 0) | 98 | #define ND_INTEL_SMART_HEALTH_VALID (1 << 0) |
98 | #define ND_INTEL_SMART_SPARES_VALID (1 << 1) | 99 | #define ND_INTEL_SMART_SPARES_VALID (1 << 1) |
@@ -111,6 +112,10 @@ struct nd_cmd_ars_err_inj_stat { | |||
111 | #define ND_INTEL_SMART_NON_CRITICAL_HEALTH (1 << 0) | 112 | #define ND_INTEL_SMART_NON_CRITICAL_HEALTH (1 << 0) |
112 | #define ND_INTEL_SMART_CRITICAL_HEALTH (1 << 1) | 113 | #define ND_INTEL_SMART_CRITICAL_HEALTH (1 << 1) |
113 | #define ND_INTEL_SMART_FATAL_HEALTH (1 << 2) | 114 | #define ND_INTEL_SMART_FATAL_HEALTH (1 << 2) |
115 | #define ND_INTEL_SMART_INJECT_MTEMP (1 << 0) | ||
116 | #define ND_INTEL_SMART_INJECT_SPARE (1 << 1) | ||
117 | #define ND_INTEL_SMART_INJECT_FATAL (1 << 2) | ||
118 | #define ND_INTEL_SMART_INJECT_SHUTDOWN (1 << 3) | ||
114 | 119 | ||
115 | struct nd_intel_smart { | 120 | struct nd_intel_smart { |
116 | __u32 status; | 121 | __u32 status; |
@@ -158,6 +163,17 @@ struct nd_intel_smart_set_threshold { | |||
158 | __u32 status; | 163 | __u32 status; |
159 | } __packed; | 164 | } __packed; |
160 | 165 | ||
166 | struct nd_intel_smart_inject { | ||
167 | __u64 flags; | ||
168 | __u8 mtemp_enable; | ||
169 | __u16 media_temperature; | ||
170 | __u8 spare_enable; | ||
171 | __u8 spares; | ||
172 | __u8 fatal_enable; | ||
173 | __u8 unsafe_shutdown_enable; | ||
174 | __u32 status; | ||
175 | } __packed; | ||
176 | |||
161 | #define INTEL_FW_STORAGE_SIZE 0x100000 | 177 | #define INTEL_FW_STORAGE_SIZE 0x100000 |
162 | #define INTEL_FW_MAX_SEND_LEN 0xFFEC | 178 | #define INTEL_FW_MAX_SEND_LEN 0xFFEC |
163 | #define INTEL_FW_QUERY_INTERVAL 250000 | 179 | #define INTEL_FW_QUERY_INTERVAL 250000 |