mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-19 21:21:09 +00:00
The libnvdimm sub-system introduces, in addition to the libnvdimm-core,
4 drivers / enabling modules: NFIT: Instantiates an "nvdimm bus" with the core and registers memory devices (NVDIMMs) enumerated by the ACPI 6.0 NFIT (NVDIMM Firmware Interface table). After registering NVDIMMs the NFIT driver then registers "region" devices. A libnvdimm-region defines an access mode and the boundaries of persistent memory media. A region may span multiple NVDIMMs that are interleaved by the hardware memory controller. In turn, a libnvdimm-region can be carved into a "namespace" device and bound to the PMEM or BLK driver which will attach a Linux block device (disk) interface to the memory. PMEM: Initially merged in v4.1 this driver for contiguous spans of persistent memory address ranges is re-worked to drive PMEM-namespaces emitted by the libnvdimm-core. In this update the PMEM driver, on x86, gains the ability to assert that writes to persistent memory have been flushed all the way through the caches and buffers in the platform to persistent media. See memcpy_to_pmem() and wmb_pmem(). BLK: This new driver enables access to persistent memory media through "Block Data Windows" as defined by the NFIT. The primary difference of this driver to PMEM is that only a small window of persistent memory is mapped into system address space at any given point in time. Per-NVDIMM windows are reprogrammed at run time, per-I/O, to access different portions of the media. BLK-mode, by definition, does not support DAX. BTT: This is a library, optionally consumed by either PMEM or BLK, that converts a byte-accessible namespace into a disk with atomic sector update semantics (prevents sector tearing on crash or power loss). The sinister aspect of sector tearing is that most applications do not know they have a atomic sector dependency. At least today's disk's rarely ever tear sectors and if they do one almost certainly gets a CRC error on access. NVDIMMs will always tear and always silently. Until an application is audited to be robust in the presence of sector-tearing the usage of BTT is recommended. Thanks to: Ross Zwisler, Jeff Moyer, Vishal Verma, Christoph Hellwig, Ingo Molnar, Neil Brown, Boaz Harrosh, Robert Elliott, Matthew Wilcox, Andy Rudoff, Linda Knippers, Toshi Kani, Nicholas Moulin, Rafael Wysocki, and Bob Moore. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJVjZGBAAoJEB7SkWpmfYgC4fkP/j+k6HmSRNU/yRYPyo7CAWvj 3P5P1i6R6nMZZbjQrQArAXaIyLlFk4sEQDYsciR6dmslhhFZAkR2eFwVO5rBOyx3 QN0yxEpyjJbroRFUrV/BLaFK4cq2oyJAFFHs0u7/pLHBJ4MDMqfRKAMtlnBxEkTE LFcqXapSlvWitSbjMdIBWKFEvncaiJ2mdsFqT4aZqclBBTj00eWQvEG9WxleJLdv +tj7qR/vGcwOb12X5UrbQXgwtMYos7A6IzhHbqwQL8IrOcJ6YB8NopJUpLDd7ZVq KAzX6ZYMzNueN4uvv6aDfqDRLyVL7qoxM9XIjGF5R8SV9sF2LMspm1FBpfowo1GT h2QMr0ky1nHVT32yspBCpE9zW/mubRIDtXxEmZZ53DIc4N6Dy9jFaNVmhoWtTAqG b9pndFnjUzzieCjX5pCvo2M5U6N0AQwsnq76/CasiWyhSa9DNKOg8MVDRg0rbxb0 UvK0v8JwOCIRcfO3qiKcx+02nKPtjCtHSPqGkFKPySRvAdb+3g6YR26CxTb3VmnF etowLiKU7HHalLvqGFOlDoQG6viWes9Zl+ZeANBOCVa6rL2O7ZnXJtYgXf1wDQee fzgKB78BcDjXH4jHobbp/WBANQGN/GF34lse8yHa7Ym+28uEihDvSD1wyNLnefmo 7PJBbN5M5qP5tD0aO7SZ =VtWG -----END PGP SIGNATURE----- Merge tag 'libnvdimm-for-4.2' of git://git.kernel.org/pub/scm/linux/kernel/git/djbw/nvdimm Pull libnvdimm subsystem from Dan Williams: "The libnvdimm sub-system introduces, in addition to the libnvdimm-core, 4 drivers / enabling modules: NFIT: Instantiates an "nvdimm bus" with the core and registers memory devices (NVDIMMs) enumerated by the ACPI 6.0 NFIT (NVDIMM Firmware Interface table). After registering NVDIMMs the NFIT driver then registers "region" devices. A libnvdimm-region defines an access mode and the boundaries of persistent memory media. A region may span multiple NVDIMMs that are interleaved by the hardware memory controller. In turn, a libnvdimm-region can be carved into a "namespace" device and bound to the PMEM or BLK driver which will attach a Linux block device (disk) interface to the memory. PMEM: Initially merged in v4.1 this driver for contiguous spans of persistent memory address ranges is re-worked to drive PMEM-namespaces emitted by the libnvdimm-core. In this update the PMEM driver, on x86, gains the ability to assert that writes to persistent memory have been flushed all the way through the caches and buffers in the platform to persistent media. See memcpy_to_pmem() and wmb_pmem(). BLK: This new driver enables access to persistent memory media through "Block Data Windows" as defined by the NFIT. The primary difference of this driver to PMEM is that only a small window of persistent memory is mapped into system address space at any given point in time. Per-NVDIMM windows are reprogrammed at run time, per-I/O, to access different portions of the media. BLK-mode, by definition, does not support DAX. BTT: This is a library, optionally consumed by either PMEM or BLK, that converts a byte-accessible namespace into a disk with atomic sector update semantics (prevents sector tearing on crash or power loss). The sinister aspect of sector tearing is that most applications do not know they have a atomic sector dependency. At least today's disk's rarely ever tear sectors and if they do one almost certainly gets a CRC error on access. NVDIMMs will always tear and always silently. Until an application is audited to be robust in the presence of sector-tearing the usage of BTT is recommended. Thanks to: Ross Zwisler, Jeff Moyer, Vishal Verma, Christoph Hellwig, Ingo Molnar, Neil Brown, Boaz Harrosh, Robert Elliott, Matthew Wilcox, Andy Rudoff, Linda Knippers, Toshi Kani, Nicholas Moulin, Rafael Wysocki, and Bob Moore" * tag 'libnvdimm-for-4.2' of git://git.kernel.org/pub/scm/linux/kernel/git/djbw/nvdimm: (33 commits) arch, x86: pmem api for ensuring durability of persistent memory updates libnvdimm: Add sysfs numa_node to NVDIMM devices libnvdimm: Set numa_node to NVDIMM devices acpi: Add acpi_map_pxm_to_online_node() libnvdimm, nfit: handle unarmed dimms, mark namespaces read-only pmem: flag pmem block devices as non-rotational libnvdimm: enable iostat pmem: make_request cleanups libnvdimm, pmem: fix up max_hw_sectors libnvdimm, blk: add support for blk integrity libnvdimm, btt: add support for blk integrity fs/block_dev.c: skip rw_page if bdev has integrity libnvdimm: Non-Volatile Devices tools/testing/nvdimm: libnvdimm unit test infrastructure libnvdimm, nfit, nd_blk: driver for BLK-mode access persistent memory nd_btt: atomic sector updates libnvdimm: infrastructure for btt devices libnvdimm: write blk label set libnvdimm: write pmem label set libnvdimm: blk labels and namespace instantiation ...
This commit is contained in:
commit
88793e5c77
57 changed files with 13859 additions and 172 deletions
|
@ -272,6 +272,7 @@ header-y += ncp_fs.h
|
|||
header-y += ncp.h
|
||||
header-y += ncp_mount.h
|
||||
header-y += ncp_no.h
|
||||
header-y += ndctl.h
|
||||
header-y += neighbour.h
|
||||
header-y += netconf.h
|
||||
header-y += netdevice.h
|
||||
|
|
197
include/uapi/linux/ndctl.h
Normal file
197
include/uapi/linux/ndctl.h
Normal file
|
@ -0,0 +1,197 @@
|
|||
/*
|
||||
* Copyright (c) 2014-2015, Intel Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU Lesser General Public License,
|
||||
* version 2.1, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT ANY
|
||||
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
|
||||
* more details.
|
||||
*/
|
||||
#ifndef __NDCTL_H__
|
||||
#define __NDCTL_H__
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
struct nd_cmd_smart {
|
||||
__u32 status;
|
||||
__u8 data[128];
|
||||
} __packed;
|
||||
|
||||
struct nd_cmd_smart_threshold {
|
||||
__u32 status;
|
||||
__u8 data[8];
|
||||
} __packed;
|
||||
|
||||
struct nd_cmd_dimm_flags {
|
||||
__u32 status;
|
||||
__u32 flags;
|
||||
} __packed;
|
||||
|
||||
struct nd_cmd_get_config_size {
|
||||
__u32 status;
|
||||
__u32 config_size;
|
||||
__u32 max_xfer;
|
||||
} __packed;
|
||||
|
||||
struct nd_cmd_get_config_data_hdr {
|
||||
__u32 in_offset;
|
||||
__u32 in_length;
|
||||
__u32 status;
|
||||
__u8 out_buf[0];
|
||||
} __packed;
|
||||
|
||||
struct nd_cmd_set_config_hdr {
|
||||
__u32 in_offset;
|
||||
__u32 in_length;
|
||||
__u8 in_buf[0];
|
||||
} __packed;
|
||||
|
||||
struct nd_cmd_vendor_hdr {
|
||||
__u32 opcode;
|
||||
__u32 in_length;
|
||||
__u8 in_buf[0];
|
||||
} __packed;
|
||||
|
||||
struct nd_cmd_vendor_tail {
|
||||
__u32 status;
|
||||
__u32 out_length;
|
||||
__u8 out_buf[0];
|
||||
} __packed;
|
||||
|
||||
struct nd_cmd_ars_cap {
|
||||
__u64 address;
|
||||
__u64 length;
|
||||
__u32 status;
|
||||
__u32 max_ars_out;
|
||||
} __packed;
|
||||
|
||||
struct nd_cmd_ars_start {
|
||||
__u64 address;
|
||||
__u64 length;
|
||||
__u16 type;
|
||||
__u8 reserved[6];
|
||||
__u32 status;
|
||||
} __packed;
|
||||
|
||||
struct nd_cmd_ars_status {
|
||||
__u32 status;
|
||||
__u32 out_length;
|
||||
__u64 address;
|
||||
__u64 length;
|
||||
__u16 type;
|
||||
__u32 num_records;
|
||||
struct nd_ars_record {
|
||||
__u32 handle;
|
||||
__u32 flags;
|
||||
__u64 err_address;
|
||||
__u64 mask;
|
||||
} __packed records[0];
|
||||
} __packed;
|
||||
|
||||
enum {
|
||||
ND_CMD_IMPLEMENTED = 0,
|
||||
|
||||
/* bus commands */
|
||||
ND_CMD_ARS_CAP = 1,
|
||||
ND_CMD_ARS_START = 2,
|
||||
ND_CMD_ARS_STATUS = 3,
|
||||
|
||||
/* per-dimm commands */
|
||||
ND_CMD_SMART = 1,
|
||||
ND_CMD_SMART_THRESHOLD = 2,
|
||||
ND_CMD_DIMM_FLAGS = 3,
|
||||
ND_CMD_GET_CONFIG_SIZE = 4,
|
||||
ND_CMD_GET_CONFIG_DATA = 5,
|
||||
ND_CMD_SET_CONFIG_DATA = 6,
|
||||
ND_CMD_VENDOR_EFFECT_LOG_SIZE = 7,
|
||||
ND_CMD_VENDOR_EFFECT_LOG = 8,
|
||||
ND_CMD_VENDOR = 9,
|
||||
};
|
||||
|
||||
static inline const char *nvdimm_bus_cmd_name(unsigned cmd)
|
||||
{
|
||||
static const char * const names[] = {
|
||||
[ND_CMD_ARS_CAP] = "ars_cap",
|
||||
[ND_CMD_ARS_START] = "ars_start",
|
||||
[ND_CMD_ARS_STATUS] = "ars_status",
|
||||
};
|
||||
|
||||
if (cmd < ARRAY_SIZE(names) && names[cmd])
|
||||
return names[cmd];
|
||||
return "unknown";
|
||||
}
|
||||
|
||||
static inline const char *nvdimm_cmd_name(unsigned cmd)
|
||||
{
|
||||
static const char * const names[] = {
|
||||
[ND_CMD_SMART] = "smart",
|
||||
[ND_CMD_SMART_THRESHOLD] = "smart_thresh",
|
||||
[ND_CMD_DIMM_FLAGS] = "flags",
|
||||
[ND_CMD_GET_CONFIG_SIZE] = "get_size",
|
||||
[ND_CMD_GET_CONFIG_DATA] = "get_data",
|
||||
[ND_CMD_SET_CONFIG_DATA] = "set_data",
|
||||
[ND_CMD_VENDOR_EFFECT_LOG_SIZE] = "effect_size",
|
||||
[ND_CMD_VENDOR_EFFECT_LOG] = "effect_log",
|
||||
[ND_CMD_VENDOR] = "vendor",
|
||||
};
|
||||
|
||||
if (cmd < ARRAY_SIZE(names) && names[cmd])
|
||||
return names[cmd];
|
||||
return "unknown";
|
||||
}
|
||||
|
||||
#define ND_IOCTL 'N'
|
||||
|
||||
#define ND_IOCTL_SMART _IOWR(ND_IOCTL, ND_CMD_SMART,\
|
||||
struct nd_cmd_smart)
|
||||
|
||||
#define ND_IOCTL_SMART_THRESHOLD _IOWR(ND_IOCTL, ND_CMD_SMART_THRESHOLD,\
|
||||
struct nd_cmd_smart_threshold)
|
||||
|
||||
#define ND_IOCTL_DIMM_FLAGS _IOWR(ND_IOCTL, ND_CMD_DIMM_FLAGS,\
|
||||
struct nd_cmd_dimm_flags)
|
||||
|
||||
#define ND_IOCTL_GET_CONFIG_SIZE _IOWR(ND_IOCTL, ND_CMD_GET_CONFIG_SIZE,\
|
||||
struct nd_cmd_get_config_size)
|
||||
|
||||
#define ND_IOCTL_GET_CONFIG_DATA _IOWR(ND_IOCTL, ND_CMD_GET_CONFIG_DATA,\
|
||||
struct nd_cmd_get_config_data_hdr)
|
||||
|
||||
#define ND_IOCTL_SET_CONFIG_DATA _IOWR(ND_IOCTL, ND_CMD_SET_CONFIG_DATA,\
|
||||
struct nd_cmd_set_config_hdr)
|
||||
|
||||
#define ND_IOCTL_VENDOR _IOWR(ND_IOCTL, ND_CMD_VENDOR,\
|
||||
struct nd_cmd_vendor_hdr)
|
||||
|
||||
#define ND_IOCTL_ARS_CAP _IOWR(ND_IOCTL, ND_CMD_ARS_CAP,\
|
||||
struct nd_cmd_ars_cap)
|
||||
|
||||
#define ND_IOCTL_ARS_START _IOWR(ND_IOCTL, ND_CMD_ARS_START,\
|
||||
struct nd_cmd_ars_start)
|
||||
|
||||
#define ND_IOCTL_ARS_STATUS _IOWR(ND_IOCTL, ND_CMD_ARS_STATUS,\
|
||||
struct nd_cmd_ars_status)
|
||||
|
||||
#define ND_DEVICE_DIMM 1 /* nd_dimm: container for "config data" */
|
||||
#define ND_DEVICE_REGION_PMEM 2 /* nd_region: (parent of PMEM namespaces) */
|
||||
#define ND_DEVICE_REGION_BLK 3 /* nd_region: (parent of BLK namespaces) */
|
||||
#define ND_DEVICE_NAMESPACE_IO 4 /* legacy persistent memory */
|
||||
#define ND_DEVICE_NAMESPACE_PMEM 5 /* PMEM namespace (may alias with BLK) */
|
||||
#define ND_DEVICE_NAMESPACE_BLK 6 /* BLK namespace (may alias with PMEM) */
|
||||
|
||||
enum nd_driver_flags {
|
||||
ND_DRIVER_DIMM = 1 << ND_DEVICE_DIMM,
|
||||
ND_DRIVER_REGION_PMEM = 1 << ND_DEVICE_REGION_PMEM,
|
||||
ND_DRIVER_REGION_BLK = 1 << ND_DEVICE_REGION_BLK,
|
||||
ND_DRIVER_NAMESPACE_IO = 1 << ND_DEVICE_NAMESPACE_IO,
|
||||
ND_DRIVER_NAMESPACE_PMEM = 1 << ND_DEVICE_NAMESPACE_PMEM,
|
||||
ND_DRIVER_NAMESPACE_BLK = 1 << ND_DEVICE_NAMESPACE_BLK,
|
||||
};
|
||||
|
||||
enum {
|
||||
ND_MIN_NAMESPACE_SIZE = 0x00400000,
|
||||
};
|
||||
#endif /* __NDCTL_H__ */
|
Loading…
Add table
Add a link
Reference in a new issue