fa2344
Upstream commit a42a086b8d682ab8dfbc4666cf6b9c8a5ee23a77
fa2344
Author: Robert Moore <Robert.Moore@intel.com>
fa2344
Date: Mon, 16 Oct 2017 10:42:49 -0700
fa2344
Subject: [PATCH] ACPI 6.0A: Changes to the NFIT ACPI table
fa2344
fa2344
Adds a new subtable.
fa2344
---
fa2344
 source/common/dmtable.c        |  1 +
fa2344
 source/common/dmtbdump.c       |  5 +++
fa2344
 source/common/dmtbinfo.c       | 14 +++++++
fa2344
 source/compiler/dttable2.c     |  7 +++-
fa2344
 source/compiler/dttemplate.h   | 10 +++--
fa2344
 source/include/acdisasm.h      |  1 +
fa2344
 source/include/actbl1.h        | 72 +++++++++++++++++++++++++++++++++-
fa2344
 source/tools/acpisrc/astable.c |  2 +
fa2344
 8 files changed, 105 insertions(+), 7 deletions(-)
fa2344
fa2344
diff --git a/source/common/dmtable.c b/source/common/dmtable.c
fa2344
index 07d27faf7..60951732b 100644
fa2344
--- a/source/common/dmtable.c
fa2344
+++ b/source/common/dmtable.c
fa2344
@@ -239,6 +239,7 @@ static const char           *AcpiDmNfitSubnames[] =
fa2344
     "NVDIMM Control Region",            /* ACPI_NFIT_TYPE_CONTROL_REGION */
fa2344
     "NVDIMM Block Data Window Region",  /* ACPI_NFIT_TYPE_DATA_REGION */
fa2344
     "Flush Hint Address",               /* ACPI_NFIT_TYPE_FLUSH_ADDRESS */
fa2344
+    "Platform Capabilities",            /* ACPI_NFIT_TYPE_CAPABILITIES */
fa2344
     "Unknown Subtable Type"             /* Reserved */
fa2344
 };
fa2344
 
fa2344
diff --git a/source/common/dmtbdump.c b/source/common/dmtbdump.c
fa2344
index 0f0697e3d..1ef91c2df 100644
fa2344
--- a/source/common/dmtbdump.c
fa2344
+++ b/source/common/dmtbdump.c
fa2344
@@ -2748,6 +2748,11 @@ AcpiDmDumpNfit (
fa2344
             FieldOffset = sizeof (ACPI_NFIT_FLUSH_ADDRESS) - sizeof (UINT64);
fa2344
             break;
fa2344
 
fa2344
+        case ACPI_NFIT_TYPE_CAPABILITIES:    /* ACPI 6.0A */
fa2344
+
fa2344
+            InfoTable = AcpiDmTableInfoNfit7;
fa2344
+            break;
fa2344
+
fa2344
         default:
fa2344
             AcpiOsPrintf ("\n**** Unknown NFIT subtable type 0x%X\n",
fa2344
                 SubTable->Type);
fa2344
diff --git a/source/common/dmtbinfo.c b/source/common/dmtbinfo.c
fa2344
index 97de36067..bccb986fb 100644
fa2344
--- a/source/common/dmtbinfo.c
fa2344
+++ b/source/common/dmtbinfo.c
fa2344
@@ -216,6 +216,7 @@
fa2344
 #define ACPI_NFIT4_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_NFIT_CONTROL_REGION,f)
fa2344
 #define ACPI_NFIT5_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_NFIT_DATA_REGION,f)
fa2344
 #define ACPI_NFIT6_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_NFIT_FLUSH_ADDRESS,f)
fa2344
+#define ACPI_NFIT7_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_NFIT_CAPABILITIES,f)
fa2344
 #define ACPI_PCCT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PCCT_SUBSPACE,f)
fa2344
 #define ACPI_PCCT1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PCCT_HW_REDUCED,f)
fa2344
 #define ACPI_PCCT2_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PCCT_HW_REDUCED_TYPE2,f)
fa2344
@@ -278,6 +279,7 @@
fa2344
 #define ACPI_NFIT0_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_NFIT_SYSTEM_ADDRESS,f,o)
fa2344
 #define ACPI_NFIT1_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_NFIT_MEMORY_MAP,f,o)
fa2344
 #define ACPI_NFIT4_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_NFIT_CONTROL_REGION,f,o)
fa2344
+#define ACPI_NFIT7_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_NFIT_CAPABILITIES,f,o)
fa2344
 #define ACPI_PCCT_FLAG_OFFSET(f,o)      ACPI_FLAG_OFFSET (ACPI_TABLE_PCCT,f,o)
fa2344
 #define ACPI_PCCT1_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_PCCT_HW_REDUCED,f,o)
fa2344
 #define ACPI_PCCT2_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_PCCT_HW_REDUCED_TYPE2,f,o)
fa2344
@@ -2281,6 +2283,18 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoNfit6a[] =
fa2344
     ACPI_DMT_TERMINATOR
fa2344
 };
fa2344
 
fa2344
+ACPI_DMTABLE_INFO           AcpiDmTableInfoNfit7[] =
fa2344
+{
fa2344
+    {ACPI_DMT_UINT8,    ACPI_NFIT7_OFFSET (HighestCapability),      "Highest Capability", 0},
fa2344
+    {ACPI_DMT_UINT24,   ACPI_NFIT7_OFFSET (Reserved[0]),            "Reserved", 0},
fa2344
+    {ACPI_DMT_UINT32,   ACPI_NFIT7_OFFSET (Capabilities),           "Capabilities (decoded below)", DT_FLAG},
fa2344
+    {ACPI_DMT_FLAG0,    ACPI_NFIT7_FLAG_OFFSET (Capabilities,0),    "Cache Flush to NVDIMM", 0},
fa2344
+    {ACPI_DMT_FLAG1,    ACPI_NFIT7_FLAG_OFFSET (Capabilities,0),    "Memory Flush to MVDIMM", 0},
fa2344
+    {ACPI_DMT_FLAG2,    ACPI_NFIT7_FLAG_OFFSET (Capabilities,0),    "Memory Mirroring", 0},
fa2344
+    {ACPI_DMT_UINT32,   ACPI_NFIT7_OFFSET (Reserved2),              "Reserved", 0},
fa2344
+    ACPI_DMT_TERMINATOR
fa2344
+};
fa2344
+
fa2344
 
fa2344
 /*******************************************************************************
fa2344
  *
fa2344
diff --git a/source/compiler/dttable2.c b/source/compiler/dttable2.c
fa2344
index 172354cde..db79bac7a 100644
fa2344
--- a/source/compiler/dttable2.c
fa2344
+++ b/source/compiler/dttable2.c
fa2344
@@ -590,6 +590,11 @@ DtCompileNfit (
fa2344
             InfoTable = AcpiDmTableInfoNfit6;
fa2344
             break;
fa2344
 
fa2344
+        case ACPI_NFIT_TYPE_CAPABILITIES:
fa2344
+
fa2344
+            InfoTable = AcpiDmTableInfoNfit7;
fa2344
+            break;
fa2344
+
fa2344
         default:
fa2344
 
fa2344
             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "NFIT");
fa2344
@@ -633,7 +638,6 @@ DtCompileNfit (
fa2344
             }
fa2344
 
fa2344
             Interleave->LineCount = Count;
fa2344
-            DtPopSubtable ();
fa2344
             break;
fa2344
 
fa2344
         case ACPI_NFIT_TYPE_SMBIOS:
fa2344
@@ -679,7 +684,6 @@ DtCompileNfit (
fa2344
             }
fa2344
 
fa2344
             Hint->HintCount = (UINT16) Count;
fa2344
-            DtPopSubtable ();
fa2344
             break;
fa2344
 
fa2344
         default:
fa2344
diff --git a/source/compiler/dttemplate.h b/source/compiler/dttemplate.h
fa2344
index d541154bb..4c77afc16 100644
fa2344
--- a/source/compiler/dttemplate.h
fa2344
+++ b/source/compiler/dttemplate.h
fa2344
@@ -780,11 +780,11 @@ const unsigned char TemplateMsct[] =
fa2344
 
fa2344
 const unsigned char TemplateNfit[] =
fa2344
 {
fa2344
-    0x4E,0x46,0x49,0x54,0x70,0x01,0x00,0x00,  /* 00000000    "NFITp..." */
fa2344
-    0x01,0x53,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    ".SINTEL " */
fa2344
+    0x4E,0x46,0x49,0x54,0x80,0x01,0x00,0x00,  /* 00000000    "NFIT...." */
fa2344
+    0x01,0x07,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    "..INTEL " */
fa2344
     0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65,  /* 00000010    "Template" */
fa2344
     0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
fa2344
-    0x10,0x04,0x15,0x20,0x00,0x00,0x00,0x00,  /* 00000020    "... ...." */
fa2344
+    0x29,0x09,0x17,0x20,0x00,0x00,0x00,0x00,  /* 00000020    ").. ...." */
fa2344
     0x00,0x00,0x38,0x00,0x01,0x00,0x00,0x00,  /* 00000028    "..8....." */
fa2344
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000030    "........" */
fa2344
     0x30,0x05,0xAF,0x91,0x86,0x5D,0x0E,0x47,  /* 00000038    "0....].G" */
fa2344
@@ -825,7 +825,9 @@ const unsigned char TemplateNfit[] =
fa2344
     0x06,0x00,0x20,0x00,0x01,0x00,0x00,0x00,  /* 00000150    ".. ....." */
fa2344
     0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000158    "........" */
fa2344
     0x00,0x00,0x00,0x18,0x04,0x00,0x00,0x00,  /* 00000160    "........" */
fa2344
-    0x00,0x00,0x00,0x18,0x06,0x00,0x00,0x00   /* 00000168    "........" */
fa2344
+    0x00,0x00,0x00,0x18,0x06,0x00,0x00,0x00,  /* 00000168    "........" */
fa2344
+    0x07,0x00,0x10,0x00,0x00,0x00,0x00,0x00,  /* 00000170    "........" */
fa2344
+    0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00   /* 00000178    "........" */
fa2344
 };
fa2344
 
fa2344
 const unsigned char TemplateMtmr[] =
fa2344
diff --git a/source/include/acdisasm.h b/source/include/acdisasm.h
fa2344
index 0c465602d..d8ed7168d 100644
fa2344
--- a/source/include/acdisasm.h
fa2344
+++ b/source/include/acdisasm.h
fa2344
@@ -375,6 +375,7 @@ extern ACPI_DMTABLE_INFO        AcpiDmTableInfoNfit4[];
fa2344
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoNfit5[];
fa2344
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoNfit6[];
fa2344
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoNfit6a[];
fa2344
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoNfit7[];
fa2344
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPmtt[];
fa2344
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPmtt0[];
fa2344
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPmtt1[];
fa2344
diff --git a/source/include/actbl1.h b/source/include/actbl1.h
fa2344
index db409bb79..0ca869909 100644
fa2344
--- a/source/include/actbl1.h
fa2344
+++ b/source/include/actbl1.h
fa2344
@@ -1185,7 +1185,8 @@ enum AcpiNfitType
fa2344
     ACPI_NFIT_TYPE_CONTROL_REGION       = 4,
fa2344
     ACPI_NFIT_TYPE_DATA_REGION          = 5,
fa2344
     ACPI_NFIT_TYPE_FLUSH_ADDRESS        = 6,
fa2344
-    ACPI_NFIT_TYPE_RESERVED             = 7     /* 7 and greater are reserved */
fa2344
+    ACPI_NFIT_TYPE_CAPABILITIES         = 7,
fa2344
+    ACPI_NFIT_TYPE_RESERVED             = 8     /* 8 and greater are reserved */
fa2344
 };
fa2344
 
fa2344
 /*
fa2344
@@ -1338,6 +1339,75 @@ typedef struct acpi_nfit_flush_address
fa2344
 } ACPI_NFIT_FLUSH_ADDRESS;
fa2344
 
fa2344
 
fa2344
+/* 7: Platform Capabilities Structure */
fa2344
+
fa2344
+typedef struct acpi_nfit_capabilities
fa2344
+{
fa2344
+    ACPI_NFIT_HEADER        Header;
fa2344
+    UINT8                   HighestCapability;
fa2344
+    UINT8                   Reserved[3];       /* Reserved, must be zero */
fa2344
+    UINT32                  Capabilities;
fa2344
+    UINT32                  Reserved2;
fa2344
+
fa2344
+} ACPI_NFIT_CAPABILITIES;
fa2344
+
fa2344
+/* Capabilities Flags */
fa2344
+
fa2344
+#define ACPI_NFIT_CAPABILITY_CACHE_FLUSH       (1)     /* 00: Cache Flush to NVDIMM capable */
fa2344
+#define ACPI_NFIT_CAPABILITY_MEM_FLUSH         (1<<1)  /* 01: Memory Flush to NVDIMM capable */
fa2344
+#define ACPI_NFIT_CAPABILITY_MEM_MIRRORING     (1<<2)  /* 02: Memory Mirroring capable */
fa2344
+
fa2344
+
fa2344
+/*
fa2344
+ * NFIT/DVDIMM device handle support - used as the _ADR for each NVDIMM
fa2344
+ */
fa2344
+typedef struct nfit_device_handle
fa2344
+{
fa2344
+    UINT32                  Handle;
fa2344
+
fa2344
+} NFIT_DEVICE_HANDLE;
fa2344
+
fa2344
+/* Device handle construction and extraction macros */
fa2344
+
fa2344
+#define ACPI_NFIT_DIMM_NUMBER_MASK              0x0000000F
fa2344
+#define ACPI_NFIT_CHANNEL_NUMBER_MASK           0x000000F0
fa2344
+#define ACPI_NFIT_MEMORY_ID_MASK                0x00000F00
fa2344
+#define ACPI_NFIT_SOCKET_ID_MASK                0x0000F000
fa2344
+#define ACPI_NFIT_NODE_ID_MASK                  0x0FFF0000
fa2344
+
fa2344
+#define ACPI_NFIT_DIMM_NUMBER_OFFSET            0
fa2344
+#define ACPI_NFIT_CHANNEL_NUMBER_OFFSET         4
fa2344
+#define ACPI_NFIT_MEMORY_ID_OFFSET              8
fa2344
+#define ACPI_NFIT_SOCKET_ID_OFFSET              12
fa2344
+#define ACPI_NFIT_NODE_ID_OFFSET                16
fa2344
+
fa2344
+/* Macro to construct a NFIT/NVDIMM device handle */
fa2344
+
fa2344
+#define ACPI_NFIT_BUILD_DEVICE_HANDLE(dimm, channel, memory, socket, node) \
fa2344
+    ((dimm)                                         | \
fa2344
+    ((channel) << ACPI_NFIT_CHANNEL_NUMBER_OFFSET)  | \
fa2344
+    ((memory)  << ACPI_NFIT_MEMORY_ID_OFFSET)       | \
fa2344
+    ((socket)  << ACPI_NFIT_SOCKET_ID_OFFSET)       | \
fa2344
+    ((node)    << ACPI_NFIT_NODE_ID_OFFSET))
fa2344
+
fa2344
+/* Macros to extract individual fields from a NFIT/NVDIMM device handle */
fa2344
+
fa2344
+#define ACPI_NFIT_GET_DIMM_NUMBER(handle) \
fa2344
+    ((handle) & ACPI_NFIT_DIMM_NUMBER_MASK)
fa2344
+
fa2344
+#define ACPI_NFIT_GET_CHANNEL_NUMBER(handle) \
fa2344
+    (((handle) & ACPI_NFIT_CHANNEL_NUMBER_MASK) >> ACPI_NFIT_CHANNEL_NUMBER_OFFSET)
fa2344
+
fa2344
+#define ACPI_NFIT_GET_MEMORY_ID(handle) \
fa2344
+    (((handle) & ACPI_NFIT_MEMORY_ID_MASK)      >> ACPI_NFIT_MEMORY_ID_OFFSET)
fa2344
+
fa2344
+#define ACPI_NFIT_GET_SOCKET_ID(handle) \
fa2344
+    (((handle) & ACPI_NFIT_SOCKET_ID_MASK)      >> ACPI_NFIT_SOCKET_ID_OFFSET)
fa2344
+
fa2344
+#define ACPI_NFIT_GET_NODE_ID(handle) \
fa2344
+    (((handle) & ACPI_NFIT_NODE_ID_MASK)        >> ACPI_NFIT_NODE_ID_OFFSET)
fa2344
+
fa2344
+
fa2344
 /*******************************************************************************
fa2344
  *
fa2344
  * SBST - Smart Battery Specification Table
fa2344
diff --git a/source/tools/acpisrc/astable.c b/source/tools/acpisrc/astable.c
fa2344
index c4b023d81..51840dd90 100644
fa2344
--- a/source/tools/acpisrc/astable.c
fa2344
+++ b/source/tools/acpisrc/astable.c
fa2344
@@ -658,6 +658,8 @@ ACPI_TYPED_IDENTIFIER_TABLE           AcpiIdentifiers[] = {
fa2344
     {"ACPI_MPST_POWER_STATE",               SRC_TYPE_STRUCT},
fa2344
     {"ACPI_MCFG_ALLOCATION",                SRC_TYPE_STRUCT},
fa2344
     {"ACPI_MSCT_PROXIMITY",                 SRC_TYPE_STRUCT},
fa2344
+    {"ACPI_NFIT_CAPABILITIES",              SRC_TYPE_STRUCT},
fa2344
+    {"ACPI_NFIT_DEVICE_HANDLE",             SRC_TYPE_STRUCT},
fa2344
     {"ACPI_NFIT_HEADER",                    SRC_TYPE_STRUCT},
fa2344
     {"ACPI_NFIT_SYSTEM_ADDRESS",            SRC_TYPE_STRUCT},
fa2344
     {"ACPI_NFIT_MEMORY_MAP",                SRC_TYPE_STRUCT},
fa2344
-- 
fa2344
2.17.1
fa2344