diff options
Diffstat (limited to 'include/linux/libnvdimm.h')
| -rw-r--r-- | include/linux/libnvdimm.h | 76 | 
1 files changed, 71 insertions, 5 deletions
| diff --git a/include/linux/libnvdimm.h b/include/linux/libnvdimm.h index 097072c5a852..5440f11b0907 100644 --- a/include/linux/libnvdimm.h +++ b/include/linux/libnvdimm.h @@ -38,6 +38,10 @@ enum {  	NDD_UNARMED = 1,  	/* locked memory devices should not be accessed */  	NDD_LOCKED = 2, +	/* memory under security wipes should not be accessed */ +	NDD_SECURITY_OVERWRITE = 3, +	/*  tracking whether or not there is a pending device reference */ +	NDD_WORK_PENDING = 4,  	/* need to set a limit somewhere, but yes, this is likely overkill */  	ND_IOCTL_MAX_BUFLEN = SZ_4M, @@ -87,7 +91,7 @@ struct nvdimm_bus_descriptor {  	ndctl_fn ndctl;  	int (*flush_probe)(struct nvdimm_bus_descriptor *nd_desc);  	int (*clear_to_send)(struct nvdimm_bus_descriptor *nd_desc, -			struct nvdimm *nvdimm, unsigned int cmd); +			struct nvdimm *nvdimm, unsigned int cmd, void *data);  };  struct nd_cmd_desc { @@ -155,6 +159,46 @@ static inline struct nd_blk_region_desc *to_blk_region_desc(  } +enum nvdimm_security_state { +	NVDIMM_SECURITY_DISABLED, +	NVDIMM_SECURITY_UNLOCKED, +	NVDIMM_SECURITY_LOCKED, +	NVDIMM_SECURITY_FROZEN, +	NVDIMM_SECURITY_OVERWRITE, +}; + +#define NVDIMM_PASSPHRASE_LEN		32 +#define NVDIMM_KEY_DESC_LEN		22 + +struct nvdimm_key_data { +	u8 data[NVDIMM_PASSPHRASE_LEN]; +}; + +enum nvdimm_passphrase_type { +	NVDIMM_USER, +	NVDIMM_MASTER, +}; + +struct nvdimm_security_ops { +	enum nvdimm_security_state (*state)(struct nvdimm *nvdimm, +			enum nvdimm_passphrase_type pass_type); +	int (*freeze)(struct nvdimm *nvdimm); +	int (*change_key)(struct nvdimm *nvdimm, +			const struct nvdimm_key_data *old_data, +			const struct nvdimm_key_data *new_data, +			enum nvdimm_passphrase_type pass_type); +	int (*unlock)(struct nvdimm *nvdimm, +			const struct nvdimm_key_data *key_data); +	int (*disable)(struct nvdimm *nvdimm, +			const struct nvdimm_key_data *key_data); +	int (*erase)(struct nvdimm *nvdimm, +			const struct nvdimm_key_data *key_data, +			enum nvdimm_passphrase_type pass_type); +	int (*overwrite)(struct nvdimm *nvdimm, +			const struct nvdimm_key_data *key_data); +	int (*query_overwrite)(struct nvdimm *nvdimm); +}; +  void badrange_init(struct badrange *badrange);  int badrange_add(struct badrange *badrange, u64 addr, u64 length);  void badrange_forget(struct badrange *badrange, phys_addr_t start, @@ -165,6 +209,7 @@ struct nvdimm_bus *nvdimm_bus_register(struct device *parent,  		struct nvdimm_bus_descriptor *nfit_desc);  void nvdimm_bus_unregister(struct nvdimm_bus *nvdimm_bus);  struct nvdimm_bus *to_nvdimm_bus(struct device *dev); +struct nvdimm_bus *nvdimm_to_bus(struct nvdimm *nvdimm);  struct nvdimm *to_nvdimm(struct device *dev);  struct nd_region *to_nd_region(struct device *dev);  struct device *nd_region_dev(struct nd_region *nd_region); @@ -175,10 +220,21 @@ const char *nvdimm_name(struct nvdimm *nvdimm);  struct kobject *nvdimm_kobj(struct nvdimm *nvdimm);  unsigned long nvdimm_cmd_mask(struct nvdimm *nvdimm);  void *nvdimm_provider_data(struct nvdimm *nvdimm); -struct nvdimm *nvdimm_create(struct nvdimm_bus *nvdimm_bus, void *provider_data, -		const struct attribute_group **groups, unsigned long flags, -		unsigned long cmd_mask, int num_flush, -		struct resource *flush_wpq); +struct nvdimm *__nvdimm_create(struct nvdimm_bus *nvdimm_bus, +		void *provider_data, const struct attribute_group **groups, +		unsigned long flags, unsigned long cmd_mask, int num_flush, +		struct resource *flush_wpq, const char *dimm_id, +		const struct nvdimm_security_ops *sec_ops); +static inline struct nvdimm *nvdimm_create(struct nvdimm_bus *nvdimm_bus, +		void *provider_data, const struct attribute_group **groups, +		unsigned long flags, unsigned long cmd_mask, int num_flush, +		struct resource *flush_wpq) +{ +	return __nvdimm_create(nvdimm_bus, provider_data, groups, flags, +			cmd_mask, num_flush, flush_wpq, NULL, NULL); +} + +int nvdimm_security_setup_events(struct nvdimm *nvdimm);  const struct nd_cmd_desc *nd_cmd_dimm_desc(int cmd);  const struct nd_cmd_desc *nd_cmd_bus_desc(int cmd);  u32 nd_cmd_in_size(struct nvdimm *nvdimm, int cmd, @@ -204,6 +260,16 @@ u64 nd_fletcher64(void *addr, size_t len, bool le);  void nvdimm_flush(struct nd_region *nd_region);  int nvdimm_has_flush(struct nd_region *nd_region);  int nvdimm_has_cache(struct nd_region *nd_region); +int nvdimm_in_overwrite(struct nvdimm *nvdimm); + +static inline int nvdimm_ctl(struct nvdimm *nvdimm, unsigned int cmd, void *buf, +		unsigned int buf_len, int *cmd_rc) +{ +	struct nvdimm_bus *nvdimm_bus = nvdimm_to_bus(nvdimm); +	struct nvdimm_bus_descriptor *nd_desc = to_nd_desc(nvdimm_bus); + +	return nd_desc->ndctl(nd_desc, nvdimm, cmd, buf, buf_len, cmd_rc); +}  #ifdef CONFIG_ARCH_HAS_PMEM_API  #define ARCH_MEMREMAP_PMEM MEMREMAP_WB | 
