aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2018-04-09 13:50:08 -0400
committerDan Williams <dan.j.williams@intel.com>2018-04-09 13:50:08 -0400
commit1ed41b5696ccc3ff40a1dee39fe14eff273faf82 (patch)
tree1202df08129d350a65cf220406eb7ce87185d813 /tools
parent3eb2ce825ea1ad89d20f7a3b5780df850e4be274 (diff)
parent291717b6fbdb175da88ae2144fc58d63a490128d (diff)
Merge branch 'for-4.17/libnvdimm' into libnvdimm-for-next
Diffstat (limited to 'tools')
-rw-r--r--tools/testing/nvdimm/test/nfit.c239
-rw-r--r--tools/testing/nvdimm/test/nfit_test.h16
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
742static 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
738static void uc_error_notify(struct work_struct *work) 768static 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
115struct nd_intel_smart { 120struct 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
166struct 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