* [PATCH v4 0/4] add support for platform persistence capabilities
@ 2018-01-31 0:21 Dave Jiang
2018-01-31 0:21 ` [PATCH v4 1/4] acpi: nfit: Add support for detect platform CPU cache flush on power loss Dave Jiang
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Dave Jiang @ 2018-01-31 0:21 UTC (permalink / raw)
To: dan.j.williams-ral2JQCrhuEAvxtiuMwx3w,
ross.zwisler-VuQAYsv1563Yd54FQh9/CA
Cc: linux-acpi-u79uwXL29TY76Z2rM5mHXA,
linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw
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.
v4:
Fixed typos and added Reviewed-by tags from Ross.
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(-)
--
Signature
^ permalink raw reply [flat|nested] 6+ messages in thread* [PATCH v4 1/4] acpi: nfit: Add support for detect platform CPU cache flush on power loss 2018-01-31 0:21 [PATCH v4 0/4] add support for platform persistence capabilities Dave Jiang @ 2018-01-31 0:21 ` Dave Jiang [not found] ` <151735800899.47256.2204307128644539213.stgit-Cxk7aZI4ujnJARH06PadV2t3HXsI98Cx0E9HWUfgJXw@public.gmane.org> 2018-01-31 0:21 ` [PATCH v4 4/4] nfit-test: Add platform cap support from ACPI 6.2a to test Dave Jiang 2 siblings, 0 replies; 6+ messages in thread From: Dave Jiang @ 2018-01-31 0:21 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 NFIT 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> Reviewed-by: Ross Zwisler <ross.zwisler@linux.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, ^ permalink raw reply related [flat|nested] 6+ messages in thread
[parent not found: <151735800899.47256.2204307128644539213.stgit-Cxk7aZI4ujnJARH06PadV2t3HXsI98Cx0E9HWUfgJXw@public.gmane.org>]
* [PATCH v4 2/4] acpi: nfit: add persistent memory control flag for nd_region [not found] ` <151735800899.47256.2204307128644539213.stgit-Cxk7aZI4ujnJARH06PadV2t3HXsI98Cx0E9HWUfgJXw@public.gmane.org> @ 2018-01-31 0:21 ` Dave Jiang 2018-01-31 0:21 ` [PATCH v4 3/4] libnvdimm: expose platform persistence attribute " Dave Jiang 1 sibling, 0 replies; 6+ messages in thread From: Dave Jiang @ 2018-01-31 0:21 UTC (permalink / raw) To: dan.j.williams-ral2JQCrhuEAvxtiuMwx3w, ross.zwisler-VuQAYsv1563Yd54FQh9/CA Cc: linux-acpi-u79uwXL29TY76Z2rM5mHXA, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw Propagate the ADR attribute flag from the NFIT platform capabilities sub-table to nd_region. Signed-off-by: Dave Jiang <dave.jiang-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org> Reviewed-by: Ross Zwisler <ross.zwisler-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> --- 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, ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v4 3/4] libnvdimm: expose platform persistence attribute for nd_region [not found] ` <151735800899.47256.2204307128644539213.stgit-Cxk7aZI4ujnJARH06PadV2t3HXsI98Cx0E9HWUfgJXw@public.gmane.org> 2018-01-31 0:21 ` [PATCH v4 2/4] acpi: nfit: add persistent memory control flag for nd_region Dave Jiang @ 2018-01-31 0:21 ` Dave Jiang 1 sibling, 0 replies; 6+ messages in thread From: Dave Jiang @ 2018-01-31 0:21 UTC (permalink / raw) To: dan.j.williams-ral2JQCrhuEAvxtiuMwx3w, ross.zwisler-VuQAYsv1563Yd54FQh9/CA Cc: linux-acpi-u79uwXL29TY76Z2rM5mHXA, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw Providing a sysfs attribute for nd_region that shows the persistence capabilities for the platform. Signed-off-by: Dave Jiang <dave.jiang-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org> Reviewed-by: Ross Zwisler <ross.zwisler-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> --- 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, }; ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v4 4/4] nfit-test: Add platform cap support from ACPI 6.2a to test 2018-01-31 0:21 [PATCH v4 0/4] add support for platform persistence capabilities Dave Jiang 2018-01-31 0:21 ` [PATCH v4 1/4] acpi: nfit: Add support for detect platform CPU cache flush on power loss Dave Jiang [not found] ` <151735800899.47256.2204307128644539213.stgit-Cxk7aZI4ujnJARH06PadV2t3HXsI98Cx0E9HWUfgJXw@public.gmane.org> @ 2018-01-31 0:21 ` Dave Jiang 2018-01-31 17:32 ` Ross Zwisler 2 siblings, 1 reply; 6+ messages in thread From: Dave Jiang @ 2018-01-31 0:21 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> Reviewed-by: Ross Zwisler <ross.zwisler@linux.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; ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v4 4/4] nfit-test: Add platform cap support from ACPI 6.2a to test 2018-01-31 0:21 ` [PATCH v4 4/4] nfit-test: Add platform cap support from ACPI 6.2a to test Dave Jiang @ 2018-01-31 17:32 ` Ross Zwisler 0 siblings, 0 replies; 6+ messages in thread From: Ross Zwisler @ 2018-01-31 17:32 UTC (permalink / raw) To: Dave Jiang; +Cc: dan.j.williams, ross.zwisler, linux-acpi, linux-nvdimm On Tue, Jan 30, 2018 at 05:21:39PM -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> > Reviewed-by: Ross Zwisler <ross.zwisler@linux.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); One last thing I noticed: I'm pretty sure this needs to be pcap->highest_capability = 1; The way I read the spec, this is the value of the highest bit index which is valid. We define bits 0 and 1, so this should be 1. BIT(2) = 0x4, which gives us a mask of 0x1f for bits 0, 1, 2, 3, and 4. ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2018-01-31 17:32 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-01-31 0:21 [PATCH v4 0/4] add support for platform persistence capabilities Dave Jiang
2018-01-31 0:21 ` [PATCH v4 1/4] acpi: nfit: Add support for detect platform CPU cache flush on power loss Dave Jiang
[not found] ` <151735800899.47256.2204307128644539213.stgit-Cxk7aZI4ujnJARH06PadV2t3HXsI98Cx0E9HWUfgJXw@public.gmane.org>
2018-01-31 0:21 ` [PATCH v4 2/4] acpi: nfit: add persistent memory control flag for nd_region Dave Jiang
2018-01-31 0:21 ` [PATCH v4 3/4] libnvdimm: expose platform persistence attribute " Dave Jiang
2018-01-31 0:21 ` [PATCH v4 4/4] nfit-test: Add platform cap support from ACPI 6.2a to test Dave Jiang
2018-01-31 17:32 ` 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).