2019-05-29 07:18:09 -07:00
/* SPDX-License-Identifier: GPL-2.0-only */
2015-05-19 22:54:31 -04:00
/*
* Copyright ( c ) 2013 - 2015 Intel Corporation . All rights reserved .
*/
# ifndef __ND_CORE_H__
# define __ND_CORE_H__
# include <linux/libnvdimm.h>
# include <linux/device.h>
2015-05-01 13:11:27 -04:00
# include <linux/sizes.h>
# include <linux/mutex.h>
2015-05-01 13:34:01 -04:00
# include <linux/nd.h>
2019-07-17 18:08:26 -07:00
# include "nd.h"
2015-05-19 22:54:31 -04:00
2015-04-25 03:56:17 -04:00
extern struct list_head nvdimm_bus_list ;
extern struct mutex nvdimm_bus_list_mutex ;
2015-06-08 14:27:06 -04:00
extern int nvdimm_major ;
2018-12-13 15:36:18 -07:00
extern struct workqueue_struct * nvdimm_wq ;
2015-04-25 03:56:17 -04:00
2015-05-19 22:54:31 -04:00
struct nvdimm_bus {
struct nvdimm_bus_descriptor * nd_desc ;
2019-07-17 18:08:15 -07:00
wait_queue_head_t wait ;
2015-04-26 19:26:48 -04:00
struct list_head list ;
2015-05-19 22:54:31 -04:00
struct device dev ;
2015-05-01 13:11:27 -04:00
int id , probe_active ;
2019-07-17 18:08:15 -07:00
atomic_t ioctl_active ;
2016-06-06 17:42:38 -07:00
struct list_head mapping_list ;
2015-05-31 15:02:11 -04:00
struct mutex reconfig_mutex ;
2017-08-23 12:48:26 -07:00
struct badrange badrange ;
2015-05-19 22:54:31 -04:00
} ;
2015-04-26 19:26:48 -04:00
2015-04-25 03:56:17 -04:00
struct nvdimm {
unsigned long flags ;
void * provider_data ;
2016-04-28 16:17:07 -07:00
unsigned long cmd_mask ;
2015-04-25 03:56:17 -04:00
struct device dev ;
2015-05-01 13:11:27 -04:00
atomic_t busy ;
2016-06-07 17:00:04 -07:00
int id , num_flush ;
struct resource * flush_wpq ;
2018-12-04 10:31:20 -08:00
const char * dimm_id ;
2018-12-05 23:39:29 -08:00
struct {
const struct nvdimm_security_ops * ops ;
2019-08-26 17:54:54 -07:00
unsigned long flags ;
unsigned long ext_flags ;
2018-12-13 15:36:18 -07:00
unsigned int overwrite_tmo ;
struct kernfs_node * overwrite_state ;
2018-12-05 23:39:29 -08:00
} sec ;
2018-12-13 15:36:18 -07:00
struct delayed_work dwork ;
2020-07-20 15:08:18 -07:00
const struct nvdimm_fw_ops * fw_ops ;
2015-04-25 03:56:17 -04:00
} ;
2019-08-26 17:54:54 -07:00
static inline unsigned long nvdimm_security_flags (
2019-01-15 11:26:21 -07:00
struct nvdimm * nvdimm , enum nvdimm_passphrase_type ptype )
2018-12-05 23:39:29 -08:00
{
2019-08-26 17:54:54 -07:00
u64 flags ;
const u64 state_flags = 1UL < < NVDIMM_SECURITY_DISABLED
| 1UL < < NVDIMM_SECURITY_LOCKED
| 1UL < < NVDIMM_SECURITY_UNLOCKED
| 1UL < < NVDIMM_SECURITY_OVERWRITE ;
2018-12-05 23:39:29 -08:00
if ( ! nvdimm - > sec . ops )
2019-08-26 17:54:54 -07:00
return 0 ;
2018-12-05 23:39:29 -08:00
2019-08-26 17:54:54 -07:00
flags = nvdimm - > sec . ops - > get_flags ( nvdimm , ptype ) ;
/* disabled, locked, unlocked, and overwrite are mutually exclusive */
dev_WARN_ONCE ( & nvdimm - > dev , hweight64 ( flags & state_flags ) > 1 ,
" reported invalid security state: %#llx \n " ,
( unsigned long long ) flags ) ;
return flags ;
2018-12-05 23:39:29 -08:00
}
2018-12-06 09:14:08 -08:00
int nvdimm_security_freeze ( struct nvdimm * nvdimm ) ;
2018-12-07 10:33:30 -07:00
# if IS_ENABLED(CONFIG_NVDIMM_KEYS)
2019-08-26 17:55:05 -07:00
ssize_t nvdimm_security_store ( struct device * dev , const char * buf , size_t len ) ;
2018-12-13 15:36:18 -07:00
void nvdimm_security_overwrite_query ( struct work_struct * work ) ;
2018-12-07 10:33:30 -07:00
# else
2019-08-26 17:55:05 -07:00
static inline ssize_t nvdimm_security_store ( struct device * dev ,
const char * buf , size_t len )
2018-12-13 15:36:18 -07:00
{
return - EOPNOTSUPP ;
}
static inline void nvdimm_security_overwrite_query ( struct work_struct * work )
{
}
2018-12-07 10:33:30 -07:00
# endif
2018-12-05 23:39:29 -08:00
2023-01-11 12:30:17 +01:00
bool is_nvdimm ( const struct device * dev ) ;
bool is_nd_pmem ( const struct device * dev ) ;
bool is_nd_volatile ( const struct device * dev ) ;
static inline bool is_nd_region ( const struct device * dev )
2017-05-29 23:12:19 -07:00
{
2022-03-09 19:49:48 -08:00
return is_nd_pmem ( dev ) | | is_nd_volatile ( dev ) ;
2017-05-29 23:12:19 -07:00
}
2023-01-11 12:30:17 +01:00
static inline bool is_memory ( const struct device * dev )
2017-05-29 23:12:19 -07:00
{
return is_nd_pmem ( dev ) | | is_nd_volatile ( dev ) ;
}
2015-04-25 03:56:17 -04:00
struct nvdimm_bus * walk_to_nvdimm_bus ( struct device * nd_dev ) ;
2015-04-26 19:26:48 -04:00
int __init nvdimm_bus_init ( void ) ;
2015-05-31 14:41:48 -04:00
void nvdimm_bus_exit ( void ) ;
2016-05-17 20:24:16 -07:00
void nvdimm_devs_exit ( void ) ;
2015-05-01 13:34:01 -04:00
struct nd_region ;
2019-09-05 21:15:57 +05:30
void nd_region_advance_seeds ( struct nd_region * nd_region , struct device * dev ) ;
2016-09-30 15:28:27 -07:00
void nd_region_create_ns_seed ( struct nd_region * nd_region ) ;
2015-06-25 04:20:04 -04:00
void nd_region_create_btt_seed ( struct nd_region * nd_region ) ;
2015-12-13 11:41:36 -08:00
void nd_region_create_pfn_seed ( struct nd_region * nd_region ) ;
2016-03-11 10:15:36 -08:00
void nd_region_create_dax_seed ( struct nd_region * nd_region ) ;
2015-04-26 19:26:48 -04:00
int nvdimm_bus_create_ndctl ( struct nvdimm_bus * nvdimm_bus ) ;
void nvdimm_bus_destroy_ndctl ( struct nvdimm_bus * nvdimm_bus ) ;
2015-05-31 14:41:48 -04:00
void nd_synchronize ( void ) ;
2022-04-21 08:33:29 -07:00
void nd_device_register ( struct device * dev ) ;
2023-02-13 17:01:05 -08:00
void nd_device_register_sync ( struct device * dev ) ;
2015-06-17 17:14:46 -04:00
struct nd_label_id ;
2021-09-08 22:11:37 -07:00
char * nd_label_gen_id ( struct nd_label_id * label_id , const uuid_t * uuid ,
u32 flags ) ;
bool nd_is_uuid_unique ( struct device * dev , uuid_t * uuid ) ;
2015-06-17 17:14:46 -04:00
struct nd_region ;
struct nvdimm_drvdata ;
struct nd_mapping ;
2016-09-19 16:04:21 -07:00
void nd_mapping_free_labels ( struct nd_mapping * nd_mapping ) ;
2018-07-24 15:07:57 -06:00
int __reserve_free_pmem ( struct device * dev , void * data ) ;
void release_free_pmem ( struct nvdimm_bus * nvdimm_bus ,
struct nd_mapping * nd_mapping ) ;
resource_size_t nd_pmem_max_contiguous_dpa ( struct nd_region * nd_region ,
struct nd_mapping * nd_mapping ) ;
resource_size_t nd_region_allocatable_dpa ( struct nd_region * nd_region ) ;
2015-06-17 17:14:46 -04:00
resource_size_t nd_pmem_available_dpa ( struct nd_region * nd_region ,
2022-03-09 19:49:48 -08:00
struct nd_mapping * nd_mapping ) ;
2015-06-17 17:14:46 -04:00
resource_size_t nd_region_available_dpa ( struct nd_region * nd_region ) ;
2018-11-24 10:47:04 -08:00
int nd_region_conflict ( struct nd_region * nd_region , resource_size_t start ,
resource_size_t size ) ;
2015-06-17 17:14:46 -04:00
resource_size_t nvdimm_allocated_dpa ( struct nvdimm_drvdata * ndd ,
struct nd_label_id * label_id ) ;
2015-05-30 12:35:36 -04:00
int nvdimm_num_label_slots ( struct nvdimm_drvdata * ndd ) ;
2015-06-17 17:14:46 -04:00
void get_ndd ( struct nvdimm_drvdata * ndd ) ;
2015-06-25 04:20:04 -04:00
resource_size_t __nvdimm_namespace_capacity ( struct nd_namespace_common * ndns ) ;
2015-07-30 17:57:47 -04:00
void nd_detach_ndns ( struct device * dev , struct nd_namespace_common * * _ndns ) ;
void __nd_detach_ndns ( struct device * dev , struct nd_namespace_common * * _ndns ) ;
bool nd_attach_ndns ( struct device * dev , struct nd_namespace_common * attach ,
struct nd_namespace_common * * _ndns ) ;
bool __nd_attach_ndns ( struct device * dev , struct nd_namespace_common * attach ,
struct nd_namespace_common * * _ndns ) ;
ssize_t nd_namespace_store ( struct device * dev ,
struct nd_namespace_common * * _ndns , const char * buf ,
size_t len ) ;
2016-05-21 12:22:41 -07:00
struct nd_pfn * to_nd_pfn_safe ( struct device * dev ) ;
2019-07-17 18:08:26 -07:00
bool is_nvdimm_bus ( struct device * dev ) ;
2019-10-31 16:27:41 +05:30
# if IS_ENABLED(CONFIG_ND_CLAIM)
int devm_nsio_enable ( struct device * dev , struct nd_namespace_io * nsio ,
resource_size_t size ) ;
void devm_nsio_disable ( struct device * dev , struct nd_namespace_io * nsio ) ;
# else
static inline int devm_nsio_enable ( struct device * dev ,
struct nd_namespace_io * nsio , resource_size_t size )
{
return - ENXIO ;
}
static inline void devm_nsio_disable ( struct device * dev ,
struct nd_namespace_io * nsio )
{
}
# endif
2015-05-19 22:54:31 -04:00
# endif /* __ND_CORE_H__ */