Merge tag 'libnvdimm-for-4.6' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm
Pull libnvdimm updates from Dan Williams:
- Asynchronous address range scrub:
Given the capacities of next generation persistent memory devices a
scrub operation to find all poison may take 10s of seconds. We
want this scrub work to be done asynchronously with the rest of
system initialization, so we move it out of line from the NFIT
probing, i.e. acpi_nfit_add().
- Clear poison:
ACPI 6.1 introduces the ability to send "clear error" commands to
the ACPI0012:00 device representing the root of an "nvdimm bus".
Similar to relocating a bad block on a disk, this support clears
media errors in response to a write.
- Persistent memory resource tracking:
A persistent memory range may be designated as simply "reserved" by
platform firmware in the efi/e820 memory map. Later when the NFIT
driver loads it discovers that the range is "Persistent Memory".
The NFIT bus driver inserts a resource to advertise that
"persistent" attribute in the system resource tree for /proc/iomem
and kernel-internal usages.
- Miscellaneous cleanups and fixes:
Workaround section misaligned pmem ranges when allocating a struct
page memmap, fix handling of the read-only case in the ioctl path,
and clean up block device major number allocation.
* tag 'libnvdimm-for-4.6' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm: (26 commits)
libnvdimm, pmem: clear poison on write
libnvdimm, pmem: fix kmap_atomic() leak in error path
nvdimm/btt: don't allocate unused major device number
nvdimm/blk: don't allocate unused major device number
pmem: don't allocate unused major device number
ACPI: Change NFIT driver to insert new resource
resource: Export insert_resource and remove_resource
resource: Add remove_resource interface
resource: Change __request_region to inherit from immediate parent
libnvdimm, pmem: fix ia64 build, use PHYS_PFN
nfit, libnvdimm: clear poison command support
libnvdimm, pfn: 'resource'-address and 'size' attributes for pfn devices
libnvdimm, pmem: adjust for section collisions with 'System RAM'
libnvdimm, pmem: fix 'pfn' support for section-misaligned namespaces
libnvdimm: Fix security issue with DSM IOCTL.
libnvdimm: Clean-up access mode check.
tools/testing/nvdimm: expand ars unit testing
nfit: disable userspace initiated ars during scrub
nfit: scrub and register regions in a workqueue
nfit, libnvdimm: async region scrub workqueue
...
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -14,6 +14,7 @@
|
||||
*/
|
||||
#ifndef __NFIT_H__
|
||||
#define __NFIT_H__
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/libnvdimm.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/uuid.h>
|
||||
@@ -40,15 +41,32 @@ enum nfit_uuids {
|
||||
NFIT_UUID_MAX,
|
||||
};
|
||||
|
||||
enum nfit_fic {
|
||||
NFIT_FIC_BYTE = 0x101, /* byte-addressable energy backed */
|
||||
NFIT_FIC_BLK = 0x201, /* block-addressable non-energy backed */
|
||||
NFIT_FIC_BYTEN = 0x301, /* byte-addressable non-energy backed */
|
||||
};
|
||||
|
||||
enum {
|
||||
ND_BLK_READ_FLUSH = 1,
|
||||
ND_BLK_DCR_LATCH = 2,
|
||||
NFIT_BLK_READ_FLUSH = 1,
|
||||
NFIT_BLK_DCR_LATCH = 2,
|
||||
NFIT_ARS_STATUS_DONE = 0,
|
||||
NFIT_ARS_STATUS_BUSY = 1 << 16,
|
||||
NFIT_ARS_STATUS_NONE = 2 << 16,
|
||||
NFIT_ARS_STATUS_INTR = 3 << 16,
|
||||
NFIT_ARS_START_BUSY = 6,
|
||||
NFIT_ARS_CAP_NONE = 1,
|
||||
NFIT_ARS_F_OVERFLOW = 1,
|
||||
NFIT_ARS_TIMEOUT = 90,
|
||||
};
|
||||
|
||||
struct nfit_spa {
|
||||
struct acpi_nfit_system_address *spa;
|
||||
struct list_head list;
|
||||
int is_registered;
|
||||
struct nd_region *nd_region;
|
||||
unsigned int ars_done:1;
|
||||
u32 clear_err_unit;
|
||||
u32 max_ars;
|
||||
};
|
||||
|
||||
struct nfit_dcr {
|
||||
@@ -110,6 +128,10 @@ struct acpi_nfit_desc {
|
||||
struct list_head idts;
|
||||
struct nvdimm_bus *nvdimm_bus;
|
||||
struct device *dev;
|
||||
struct nd_cmd_ars_status *ars_status;
|
||||
size_t ars_status_size;
|
||||
struct work_struct work;
|
||||
unsigned int cancel:1;
|
||||
unsigned long dimm_dsm_force_en;
|
||||
unsigned long bus_dsm_force_en;
|
||||
int (*blk_do_io)(struct nd_blk_region *ndbr, resource_size_t dpa,
|
||||
@@ -182,5 +204,5 @@ static inline struct acpi_nfit_desc *to_acpi_desc(
|
||||
|
||||
const u8 *to_nfit_uuid(enum nfit_uuids id);
|
||||
int acpi_nfit_init(struct acpi_nfit_desc *nfit, acpi_size sz);
|
||||
extern const struct attribute_group *acpi_nfit_attribute_groups[];
|
||||
void acpi_nfit_desc_init(struct acpi_nfit_desc *acpi_desc, struct device *dev);
|
||||
#endif /* __NFIT_H__ */
|
||||
|
||||
Reference in New Issue
Block a user