* [PATCH v3 0/4] add support for platform persistence capabilities
@ 2018-01-31 0:01 Dave Jiang
2018-01-31 0:01 ` [PATCH v3 1/4] acpi: nfit: Add support for detect platform CPU cache flush on power loss Dave Jiang
` (3 more replies)
0 siblings, 4 replies; 7+ messages in thread
From: Dave Jiang @ 2018-01-31 0:01 UTC (permalink / raw)
To: dan.j.williams, ross.zwisler; +Cc: linux-acpi, linux-nvdimm
ACPI 6.2a provides an NFIT sub-table that informs if the platform has
auto CPU flush and memory flush on unexpected power loss events. This series
propogates those attributes to nd_region and add sysfs attribute to show
those capabilities.
v3:
Addressed Ross's comments
- fixed mask calculation for platform cap
- fixed nfit_test nfit_buf size calcuation
- fixed offset for test data structure
v2:
Per Dan's comments
- Added ADR cap flags propogation
- Added sysfs attribute
---
Dave Jiang (4):
acpi: nfit: Add support for detect platform CPU cache flush on power loss
acpi: nfit: add persistent memory control flag for nd_region
libnvdimm: expose platform persistence attribute for nd_region
nfit-test: Add platform cap support from ACPI 6.2a to test
drivers/acpi/nfit/core.c | 23 +++++++++++++++++++++++
drivers/acpi/nfit/nfit.h | 1 +
drivers/nvdimm/pmem.c | 4 +++-
drivers/nvdimm/region_devs.c | 13 +++++++++++++
include/linux/libnvdimm.h | 11 +++++++++++
tools/testing/nvdimm/test/nfit.c | 14 ++++++++++++--
6 files changed, 63 insertions(+), 3 deletions(-)
--
_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v3 1/4] acpi: nfit: Add support for detect platform CPU cache flush on power loss
2018-01-31 0:01 [PATCH v3 0/4] add support for platform persistence capabilities Dave Jiang
@ 2018-01-31 0:01 ` Dave Jiang
2018-01-31 0:13 ` Ross Zwisler
2018-01-31 0:01 ` [PATCH v3 2/4] acpi: nfit: add persistent memory control flag for nd_region Dave Jiang
` (2 subsequent siblings)
3 siblings, 1 reply; 7+ messages in thread
From: Dave Jiang @ 2018-01-31 0:01 UTC (permalink / raw)
To: dan.j.williams, ross.zwisler; +Cc: linux-acpi, linux-nvdimm
In ACPI 6.2a the platform capability structure has been added to the NFIT
tables. That provides software the ability to determine whether a system
supports the auto flushing of CPU caches on power loss. If the capability
is supported, we do not need to do dax_flush(). Plumbing the path to set the
property on per region from the NFTI tables.
This patch depends on the ACPI NFIT 6.2a platform capabilities support code
in include/acpi/actbl1.h.
Signed-off-by: Dave Jiang <dave.jiang@intel.com>
---
drivers/acpi/nfit/core.c | 20 ++++++++++++++++++++
drivers/acpi/nfit/nfit.h | 1 +
drivers/nvdimm/pmem.c | 4 +++-
include/linux/libnvdimm.h | 5 +++++
4 files changed, 29 insertions(+), 1 deletion(-)
diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c
index ff2580e7611d..bcf52bb93b65 100644
--- a/drivers/acpi/nfit/core.c
+++ b/drivers/acpi/nfit/core.c
@@ -838,6 +838,18 @@ static bool add_flush(struct acpi_nfit_desc *acpi_desc,
return true;
}
+static bool add_platform_cap(struct acpi_nfit_desc *acpi_desc,
+ struct acpi_nfit_capabilities *pcap)
+{
+ struct device *dev = acpi_desc->dev;
+ u32 mask;
+
+ mask = (1 << (pcap->highest_capability + 1)) - 1;
+ acpi_desc->platform_cap = pcap->capabilities & mask;
+ dev_dbg(dev, "%s: cap: %#x\n", __func__, acpi_desc->platform_cap);
+ return true;
+}
+
static void *add_table(struct acpi_nfit_desc *acpi_desc,
struct nfit_table_prev *prev, void *table, const void *end)
{
@@ -883,6 +895,10 @@ static void *add_table(struct acpi_nfit_desc *acpi_desc,
case ACPI_NFIT_TYPE_SMBIOS:
dev_dbg(dev, "%s: smbios\n", __func__);
break;
+ case ACPI_NFIT_TYPE_CAPABILITIES:
+ if (!add_platform_cap(acpi_desc, table))
+ return err;
+ break;
default:
dev_err(dev, "unknown table '%d' parsing nfit\n", hdr->type);
break;
@@ -2649,6 +2665,9 @@ static int acpi_nfit_register_region(struct acpi_nfit_desc *acpi_desc,
else
ndr_desc->numa_node = NUMA_NO_NODE;
+ if(acpi_desc->platform_cap & ACPI_NFIT_CAPABILITY_CACHE_FLUSH)
+ set_bit(ND_REGION_PERSIST_CACHE, &ndr_desc->flags);
+
list_for_each_entry(nfit_memdev, &acpi_desc->memdevs, list) {
struct acpi_nfit_memory_map *memdev = nfit_memdev->memdev;
struct nd_mapping_desc *mapping;
@@ -3457,6 +3476,7 @@ static __init int nfit_init(void)
BUILD_BUG_ON(sizeof(struct acpi_nfit_smbios) != 9);
BUILD_BUG_ON(sizeof(struct acpi_nfit_control_region) != 80);
BUILD_BUG_ON(sizeof(struct acpi_nfit_data_region) != 40);
+ BUILD_BUG_ON(sizeof(struct acpi_nfit_capabilities) != 16);
guid_parse(UUID_VOLATILE_MEMORY, &nfit_uuid[NFIT_SPA_VOLATILE]);
guid_parse(UUID_PERSISTENT_MEMORY, &nfit_uuid[NFIT_SPA_PM]);
diff --git a/drivers/acpi/nfit/nfit.h b/drivers/acpi/nfit/nfit.h
index f0cf18b2da8b..50d36e166d70 100644
--- a/drivers/acpi/nfit/nfit.h
+++ b/drivers/acpi/nfit/nfit.h
@@ -202,6 +202,7 @@ struct acpi_nfit_desc {
unsigned long dimm_cmd_force_en;
unsigned long bus_cmd_force_en;
unsigned long bus_nfit_cmd_force_en;
+ unsigned int platform_cap;
int (*blk_do_io)(struct nd_blk_region *ndbr, resource_size_t dpa,
void *iobuf, u64 len, int rw);
};
diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c
index 7fbc5c5dc8e1..8aa542398db4 100644
--- a/drivers/nvdimm/pmem.c
+++ b/drivers/nvdimm/pmem.c
@@ -35,6 +35,7 @@
#include "pmem.h"
#include "pfn.h"
#include "nd.h"
+#include "nd-core.h"
static struct device *to_dev(struct pmem_device *pmem)
{
@@ -334,7 +335,8 @@ static int pmem_attach_disk(struct device *dev,
dev_warn(dev, "unable to guarantee persistence of writes\n");
fua = 0;
}
- wbc = nvdimm_has_cache(nd_region);
+ wbc = nvdimm_has_cache(nd_region) &&
+ !test_bit(ND_REGION_PERSIST_CACHE, &nd_region->flags);
if (!devm_request_mem_region(dev, res->start, resource_size(res),
dev_name(&ndns->dev))) {
diff --git a/include/linux/libnvdimm.h b/include/linux/libnvdimm.h
index f8109ddb5ef1..f2fc0da4da04 100644
--- a/include/linux/libnvdimm.h
+++ b/include/linux/libnvdimm.h
@@ -47,6 +47,11 @@ enum {
/* region flag indicating to direct-map persistent memory by default */
ND_REGION_PAGEMAP = 0,
+ /*
+ * Platform ensures entire CPU store data path is flushed to pmem on
+ * system power loss.
+ */
+ ND_REGION_PERSIST_CACHE = 1,
/* mark newly adjusted resources as requiring a label update */
DPA_RESOURCE_ADJUSTED = 1 << 0,
_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v3 2/4] acpi: nfit: add persistent memory control flag for nd_region
2018-01-31 0:01 [PATCH v3 0/4] add support for platform persistence capabilities Dave Jiang
2018-01-31 0:01 ` [PATCH v3 1/4] acpi: nfit: Add support for detect platform CPU cache flush on power loss Dave Jiang
@ 2018-01-31 0:01 ` Dave Jiang
2018-01-31 0:01 ` [PATCH v3 3/4] libnvdimm: expose platform persistence attribute " Dave Jiang
2018-01-31 0:01 ` [PATCH v3 4/4] nfit-test: Add platform cap support from ACPI 6.2a to test Dave Jiang
3 siblings, 0 replies; 7+ messages in thread
From: Dave Jiang @ 2018-01-31 0:01 UTC (permalink / raw)
To: dan.j.williams, ross.zwisler; +Cc: linux-acpi, linux-nvdimm
Propagate the ADR attribute flag from the NFIT platform capabilities
sub-table to nd_region.
Signed-off-by: Dave Jiang <dave.jiang@intel.com>
---
drivers/acpi/nfit/core.c | 3 +++
include/linux/libnvdimm.h | 6 ++++++
2 files changed, 9 insertions(+)
diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c
index bcf52bb93b65..b1616120ca57 100644
--- a/drivers/acpi/nfit/core.c
+++ b/drivers/acpi/nfit/core.c
@@ -2668,6 +2668,9 @@ static int acpi_nfit_register_region(struct acpi_nfit_desc *acpi_desc,
if(acpi_desc->platform_cap & ACPI_NFIT_CAPABILITY_CACHE_FLUSH)
set_bit(ND_REGION_PERSIST_CACHE, &ndr_desc->flags);
+ if (acpi_desc->platform_cap & ACPI_NFIT_CAPABILITY_MEM_FLUSH)
+ set_bit(ND_REGION_PERSIST_MEMCTRL, &ndr_desc->flags);
+
list_for_each_entry(nfit_memdev, &acpi_desc->memdevs, list) {
struct acpi_nfit_memory_map *memdev = nfit_memdev->memdev;
struct nd_mapping_desc *mapping;
diff --git a/include/linux/libnvdimm.h b/include/linux/libnvdimm.h
index f2fc0da4da04..ff855ed965fb 100644
--- a/include/linux/libnvdimm.h
+++ b/include/linux/libnvdimm.h
@@ -52,6 +52,12 @@ enum {
* system power loss.
*/
ND_REGION_PERSIST_CACHE = 1,
+ /*
+ * Platform provides mechanisms to automatically flush outstanding
+ * write data from memory controler to pmem on system power loss.
+ * (ADR)
+ */
+ ND_REGION_PERSIST_MEMCTRL = 2,
/* mark newly adjusted resources as requiring a label update */
DPA_RESOURCE_ADJUSTED = 1 << 0,
_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v3 3/4] libnvdimm: expose platform persistence attribute for nd_region
2018-01-31 0:01 [PATCH v3 0/4] add support for platform persistence capabilities Dave Jiang
2018-01-31 0:01 ` [PATCH v3 1/4] acpi: nfit: Add support for detect platform CPU cache flush on power loss Dave Jiang
2018-01-31 0:01 ` [PATCH v3 2/4] acpi: nfit: add persistent memory control flag for nd_region Dave Jiang
@ 2018-01-31 0:01 ` Dave Jiang
2018-01-31 0:01 ` [PATCH v3 4/4] nfit-test: Add platform cap support from ACPI 6.2a to test Dave Jiang
3 siblings, 0 replies; 7+ messages in thread
From: Dave Jiang @ 2018-01-31 0:01 UTC (permalink / raw)
To: dan.j.williams, ross.zwisler; +Cc: linux-acpi, linux-nvdimm
Providing a sysfs attribute for nd_region that shows the persistence
capabilities for the platform.
Signed-off-by: Dave Jiang <dave.jiang@intel.com>
---
drivers/nvdimm/region_devs.c | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/drivers/nvdimm/region_devs.c b/drivers/nvdimm/region_devs.c
index abaf38c61220..e6d01911e092 100644
--- a/drivers/nvdimm/region_devs.c
+++ b/drivers/nvdimm/region_devs.c
@@ -528,6 +528,18 @@ static ssize_t resource_show(struct device *dev,
}
static DEVICE_ATTR_RO(resource);
+static ssize_t persistence_domain_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct nd_region *nd_region = to_nd_region(dev);
+ unsigned long flags = nd_region->flags;
+
+ return sprintf(buf, "%s%s\n",
+ flags & BIT(ND_REGION_PERSIST_CACHE) ? "cpu_cache " : "",
+ flags & BIT(ND_REGION_PERSIST_MEMCTRL) ? "memory_controller " : "");
+}
+static DEVICE_ATTR_RO(persistence_domain);
+
static struct attribute *nd_region_attributes[] = {
&dev_attr_size.attr,
&dev_attr_nstype.attr,
@@ -543,6 +555,7 @@ static struct attribute *nd_region_attributes[] = {
&dev_attr_init_namespaces.attr,
&dev_attr_badblocks.attr,
&dev_attr_resource.attr,
+ &dev_attr_persistence_domain.attr,
NULL,
};
_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v3 4/4] nfit-test: Add platform cap support from ACPI 6.2a to test
2018-01-31 0:01 [PATCH v3 0/4] add support for platform persistence capabilities Dave Jiang
` (2 preceding siblings ...)
2018-01-31 0:01 ` [PATCH v3 3/4] libnvdimm: expose platform persistence attribute " Dave Jiang
@ 2018-01-31 0:01 ` Dave Jiang
2018-01-31 0:15 ` Ross Zwisler
3 siblings, 1 reply; 7+ messages in thread
From: Dave Jiang @ 2018-01-31 0:01 UTC (permalink / raw)
To: dan.j.williams, ross.zwisler; +Cc: linux-acpi, linux-nvdimm
Adding NFIT platform capabilities sub table in nfit_test simulated ACPI
NFIT table. Only the first NFIT table is added with the capability
sub-table.
Signed-off-by: Dave Jiang <dave.jiang@intel.com>
---
tools/testing/nvdimm/test/nfit.c | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/tools/testing/nvdimm/test/nfit.c b/tools/testing/nvdimm/test/nfit.c
index 7217b2b953b5..f4791e6e70cf 100644
--- a/tools/testing/nvdimm/test/nfit.c
+++ b/tools/testing/nvdimm/test/nfit.c
@@ -881,7 +881,8 @@ static int nfit_test0_alloc(struct nfit_test *t)
window_size) * NUM_DCR
+ sizeof(struct acpi_nfit_data_region) * NUM_BDW
+ (sizeof(struct acpi_nfit_flush_address)
- + sizeof(u64) * NUM_HINTS) * NUM_DCR;
+ + sizeof(u64) * NUM_HINTS) * NUM_DCR
+ + sizeof(struct acpi_nfit_capabilities);
int i;
t->nfit_buf = test_alloc(t, nfit_size, &t->nfit_dma);
@@ -993,6 +994,7 @@ static void nfit_test0_setup(struct nfit_test *t)
struct acpi_nfit_control_region *dcr;
struct acpi_nfit_data_region *bdw;
struct acpi_nfit_flush_address *flush;
+ struct acpi_nfit_capabilities *pcap;
unsigned int offset, i;
/*
@@ -1500,8 +1502,16 @@ static void nfit_test0_setup(struct nfit_test *t)
for (i = 0; i < NUM_HINTS; i++)
flush->hint_address[i] = t->flush_dma[3] + i * sizeof(u64);
+ /* platform capabilities */
+ pcap = nfit_buf + offset + flush_hint_size * 4;
+ pcap->header.type = ACPI_NFIT_TYPE_CAPABILITIES;
+ pcap->header.length = sizeof(*pcap);
+ pcap->highest_capability = BIT(2);
+ pcap->capabilities = ACPI_NFIT_CAPABILITY_CACHE_FLUSH |
+ ACPI_NFIT_CAPABILITY_MEM_FLUSH;
+
if (t->setup_hotplug) {
- offset = offset + flush_hint_size * 4;
+ offset = offset + flush_hint_size * 4 + sizeof(*pcap);
/* dcr-descriptor4: blk */
dcr = nfit_buf + offset;
dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v3 1/4] acpi: nfit: Add support for detect platform CPU cache flush on power loss
2018-01-31 0:01 ` [PATCH v3 1/4] acpi: nfit: Add support for detect platform CPU cache flush on power loss Dave Jiang
@ 2018-01-31 0:13 ` Ross Zwisler
0 siblings, 0 replies; 7+ messages in thread
From: Ross Zwisler @ 2018-01-31 0:13 UTC (permalink / raw)
To: Dave Jiang; +Cc: linux-acpi, linux-nvdimm
On Tue, Jan 30, 2018 at 05:01:13PM -0700, Dave Jiang wrote:
> In ACPI 6.2a the platform capability structure has been added to the NFIT
> tables. That provides software the ability to determine whether a system
> supports the auto flushing of CPU caches on power loss. If the capability
> is supported, we do not need to do dax_flush(). Plumbing the path to set the
> property on per region from the NFTI tables.
NFIT
>
> This patch depends on the ACPI NFIT 6.2a platform capabilities support code
> in include/acpi/actbl1.h.
>
> Signed-off-by: Dave Jiang <dave.jiang@intel.com>
Looks good aside from the one nit.
Reviewed-by: Ross Zwisler <ross.zwisler@linux.intel.com>
_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 4/4] nfit-test: Add platform cap support from ACPI 6.2a to test
2018-01-31 0:01 ` [PATCH v3 4/4] nfit-test: Add platform cap support from ACPI 6.2a to test Dave Jiang
@ 2018-01-31 0:15 ` Ross Zwisler
0 siblings, 0 replies; 7+ messages in thread
From: Ross Zwisler @ 2018-01-31 0:15 UTC (permalink / raw)
To: Dave Jiang; +Cc: linux-acpi, linux-nvdimm
On Tue, Jan 30, 2018 at 05:01:29PM -0700, Dave Jiang wrote:
> Adding NFIT platform capabilities sub table in nfit_test simulated ACPI
> NFIT table. Only the first NFIT table is added with the capability
> sub-table.
>
> Signed-off-by: Dave Jiang <dave.jiang@intel.com>
This looks good to me. You can add:
Reviewed-by: Ross Zwisler <ross.zwisler@linux.intel.com>
_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2018-01-31 0:10 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-01-31 0:01 [PATCH v3 0/4] add support for platform persistence capabilities Dave Jiang
2018-01-31 0:01 ` [PATCH v3 1/4] acpi: nfit: Add support for detect platform CPU cache flush on power loss Dave Jiang
2018-01-31 0:13 ` Ross Zwisler
2018-01-31 0:01 ` [PATCH v3 2/4] acpi: nfit: add persistent memory control flag for nd_region Dave Jiang
2018-01-31 0:01 ` [PATCH v3 3/4] libnvdimm: expose platform persistence attribute " Dave Jiang
2018-01-31 0:01 ` [PATCH v3 4/4] nfit-test: Add platform cap support from ACPI 6.2a to test Dave Jiang
2018-01-31 0:15 ` Ross Zwisler
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).