18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright(c) 2013-2015 Intel Corporation. All rights reserved. 48c2ecf20Sopenharmony_ci */ 58c2ecf20Sopenharmony_ci#ifndef __ND_H__ 68c2ecf20Sopenharmony_ci#define __ND_H__ 78c2ecf20Sopenharmony_ci#include <linux/libnvdimm.h> 88c2ecf20Sopenharmony_ci#include <linux/badblocks.h> 98c2ecf20Sopenharmony_ci#include <linux/blkdev.h> 108c2ecf20Sopenharmony_ci#include <linux/device.h> 118c2ecf20Sopenharmony_ci#include <linux/mutex.h> 128c2ecf20Sopenharmony_ci#include <linux/ndctl.h> 138c2ecf20Sopenharmony_ci#include <linux/types.h> 148c2ecf20Sopenharmony_ci#include <linux/nd.h> 158c2ecf20Sopenharmony_ci#include "label.h" 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_cienum { 188c2ecf20Sopenharmony_ci /* 198c2ecf20Sopenharmony_ci * Limits the maximum number of block apertures a dimm can 208c2ecf20Sopenharmony_ci * support and is an input to the geometry/on-disk-format of a 218c2ecf20Sopenharmony_ci * BTT instance 228c2ecf20Sopenharmony_ci */ 238c2ecf20Sopenharmony_ci ND_MAX_LANES = 256, 248c2ecf20Sopenharmony_ci INT_LBASIZE_ALIGNMENT = 64, 258c2ecf20Sopenharmony_ci NVDIMM_IO_ATOMIC = 1, 268c2ecf20Sopenharmony_ci}; 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_cistruct nvdimm_drvdata { 298c2ecf20Sopenharmony_ci struct device *dev; 308c2ecf20Sopenharmony_ci int nslabel_size; 318c2ecf20Sopenharmony_ci struct nd_cmd_get_config_size nsarea; 328c2ecf20Sopenharmony_ci void *data; 338c2ecf20Sopenharmony_ci int ns_current, ns_next; 348c2ecf20Sopenharmony_ci struct resource dpa; 358c2ecf20Sopenharmony_ci struct kref kref; 368c2ecf20Sopenharmony_ci}; 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_cistruct nd_region_data { 398c2ecf20Sopenharmony_ci int ns_count; 408c2ecf20Sopenharmony_ci int ns_active; 418c2ecf20Sopenharmony_ci unsigned int hints_shift; 428c2ecf20Sopenharmony_ci void __iomem *flush_wpq[]; 438c2ecf20Sopenharmony_ci}; 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_cistatic inline void __iomem *ndrd_get_flush_wpq(struct nd_region_data *ndrd, 468c2ecf20Sopenharmony_ci int dimm, int hint) 478c2ecf20Sopenharmony_ci{ 488c2ecf20Sopenharmony_ci unsigned int num = 1 << ndrd->hints_shift; 498c2ecf20Sopenharmony_ci unsigned int mask = num - 1; 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci return ndrd->flush_wpq[dimm * num + (hint & mask)]; 528c2ecf20Sopenharmony_ci} 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_cistatic inline void ndrd_set_flush_wpq(struct nd_region_data *ndrd, int dimm, 558c2ecf20Sopenharmony_ci int hint, void __iomem *flush) 568c2ecf20Sopenharmony_ci{ 578c2ecf20Sopenharmony_ci unsigned int num = 1 << ndrd->hints_shift; 588c2ecf20Sopenharmony_ci unsigned int mask = num - 1; 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_ci ndrd->flush_wpq[dimm * num + (hint & mask)] = flush; 618c2ecf20Sopenharmony_ci} 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_cistatic inline struct nd_namespace_index *to_namespace_index( 648c2ecf20Sopenharmony_ci struct nvdimm_drvdata *ndd, int i) 658c2ecf20Sopenharmony_ci{ 668c2ecf20Sopenharmony_ci if (i < 0) 678c2ecf20Sopenharmony_ci return NULL; 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ci return ndd->data + sizeof_namespace_index(ndd) * i; 708c2ecf20Sopenharmony_ci} 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_cistatic inline struct nd_namespace_index *to_current_namespace_index( 738c2ecf20Sopenharmony_ci struct nvdimm_drvdata *ndd) 748c2ecf20Sopenharmony_ci{ 758c2ecf20Sopenharmony_ci return to_namespace_index(ndd, ndd->ns_current); 768c2ecf20Sopenharmony_ci} 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_cistatic inline struct nd_namespace_index *to_next_namespace_index( 798c2ecf20Sopenharmony_ci struct nvdimm_drvdata *ndd) 808c2ecf20Sopenharmony_ci{ 818c2ecf20Sopenharmony_ci return to_namespace_index(ndd, ndd->ns_next); 828c2ecf20Sopenharmony_ci} 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_ciunsigned sizeof_namespace_label(struct nvdimm_drvdata *ndd); 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_ci#define namespace_label_has(ndd, field) \ 878c2ecf20Sopenharmony_ci (offsetof(struct nd_namespace_label, field) \ 888c2ecf20Sopenharmony_ci < sizeof_namespace_label(ndd)) 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci#define nd_dbg_dpa(r, d, res, fmt, arg...) \ 918c2ecf20Sopenharmony_ci dev_dbg((r) ? &(r)->dev : (d)->dev, "%s: %.13s: %#llx @ %#llx " fmt, \ 928c2ecf20Sopenharmony_ci (r) ? dev_name((d)->dev) : "", res ? res->name : "null", \ 938c2ecf20Sopenharmony_ci (unsigned long long) (res ? resource_size(res) : 0), \ 948c2ecf20Sopenharmony_ci (unsigned long long) (res ? res->start : 0), ##arg) 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_ci#define for_each_dpa_resource(ndd, res) \ 978c2ecf20Sopenharmony_ci for (res = (ndd)->dpa.child; res; res = res->sibling) 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_ci#define for_each_dpa_resource_safe(ndd, res, next) \ 1008c2ecf20Sopenharmony_ci for (res = (ndd)->dpa.child, next = res ? res->sibling : NULL; \ 1018c2ecf20Sopenharmony_ci res; res = next, next = next ? next->sibling : NULL) 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_cistruct nd_percpu_lane { 1048c2ecf20Sopenharmony_ci int count; 1058c2ecf20Sopenharmony_ci spinlock_t lock; 1068c2ecf20Sopenharmony_ci}; 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_cienum nd_label_flags { 1098c2ecf20Sopenharmony_ci ND_LABEL_REAP, 1108c2ecf20Sopenharmony_ci}; 1118c2ecf20Sopenharmony_cistruct nd_label_ent { 1128c2ecf20Sopenharmony_ci struct list_head list; 1138c2ecf20Sopenharmony_ci unsigned long flags; 1148c2ecf20Sopenharmony_ci struct nd_namespace_label *label; 1158c2ecf20Sopenharmony_ci}; 1168c2ecf20Sopenharmony_ci 1178c2ecf20Sopenharmony_cienum nd_mapping_lock_class { 1188c2ecf20Sopenharmony_ci ND_MAPPING_CLASS0, 1198c2ecf20Sopenharmony_ci ND_MAPPING_UUID_SCAN, 1208c2ecf20Sopenharmony_ci}; 1218c2ecf20Sopenharmony_ci 1228c2ecf20Sopenharmony_cistruct nd_mapping { 1238c2ecf20Sopenharmony_ci struct nvdimm *nvdimm; 1248c2ecf20Sopenharmony_ci u64 start; 1258c2ecf20Sopenharmony_ci u64 size; 1268c2ecf20Sopenharmony_ci int position; 1278c2ecf20Sopenharmony_ci struct list_head labels; 1288c2ecf20Sopenharmony_ci struct mutex lock; 1298c2ecf20Sopenharmony_ci /* 1308c2ecf20Sopenharmony_ci * @ndd is for private use at region enable / disable time for 1318c2ecf20Sopenharmony_ci * get_ndd() + put_ndd(), all other nd_mapping to ndd 1328c2ecf20Sopenharmony_ci * conversions use to_ndd() which respects enabled state of the 1338c2ecf20Sopenharmony_ci * nvdimm. 1348c2ecf20Sopenharmony_ci */ 1358c2ecf20Sopenharmony_ci struct nvdimm_drvdata *ndd; 1368c2ecf20Sopenharmony_ci}; 1378c2ecf20Sopenharmony_ci 1388c2ecf20Sopenharmony_cistruct nd_region { 1398c2ecf20Sopenharmony_ci struct device dev; 1408c2ecf20Sopenharmony_ci struct ida ns_ida; 1418c2ecf20Sopenharmony_ci struct ida btt_ida; 1428c2ecf20Sopenharmony_ci struct ida pfn_ida; 1438c2ecf20Sopenharmony_ci struct ida dax_ida; 1448c2ecf20Sopenharmony_ci unsigned long flags; 1458c2ecf20Sopenharmony_ci struct device *ns_seed; 1468c2ecf20Sopenharmony_ci struct device *btt_seed; 1478c2ecf20Sopenharmony_ci struct device *pfn_seed; 1488c2ecf20Sopenharmony_ci struct device *dax_seed; 1498c2ecf20Sopenharmony_ci unsigned long align; 1508c2ecf20Sopenharmony_ci u16 ndr_mappings; 1518c2ecf20Sopenharmony_ci u64 ndr_size; 1528c2ecf20Sopenharmony_ci u64 ndr_start; 1538c2ecf20Sopenharmony_ci int id, num_lanes, ro, numa_node, target_node; 1548c2ecf20Sopenharmony_ci void *provider_data; 1558c2ecf20Sopenharmony_ci struct kernfs_node *bb_state; 1568c2ecf20Sopenharmony_ci struct badblocks bb; 1578c2ecf20Sopenharmony_ci struct nd_interleave_set *nd_set; 1588c2ecf20Sopenharmony_ci struct nd_percpu_lane __percpu *lane; 1598c2ecf20Sopenharmony_ci int (*flush)(struct nd_region *nd_region, struct bio *bio); 1608c2ecf20Sopenharmony_ci struct nd_mapping mapping[]; 1618c2ecf20Sopenharmony_ci}; 1628c2ecf20Sopenharmony_ci 1638c2ecf20Sopenharmony_cistruct nd_blk_region { 1648c2ecf20Sopenharmony_ci int (*enable)(struct nvdimm_bus *nvdimm_bus, struct device *dev); 1658c2ecf20Sopenharmony_ci int (*do_io)(struct nd_blk_region *ndbr, resource_size_t dpa, 1668c2ecf20Sopenharmony_ci void *iobuf, u64 len, int rw); 1678c2ecf20Sopenharmony_ci void *blk_provider_data; 1688c2ecf20Sopenharmony_ci struct nd_region nd_region; 1698c2ecf20Sopenharmony_ci}; 1708c2ecf20Sopenharmony_ci 1718c2ecf20Sopenharmony_ci/* 1728c2ecf20Sopenharmony_ci * Lookup next in the repeating sequence of 01, 10, and 11. 1738c2ecf20Sopenharmony_ci */ 1748c2ecf20Sopenharmony_cistatic inline unsigned nd_inc_seq(unsigned seq) 1758c2ecf20Sopenharmony_ci{ 1768c2ecf20Sopenharmony_ci static const unsigned next[] = { 0, 2, 3, 1 }; 1778c2ecf20Sopenharmony_ci 1788c2ecf20Sopenharmony_ci return next[seq & 3]; 1798c2ecf20Sopenharmony_ci} 1808c2ecf20Sopenharmony_ci 1818c2ecf20Sopenharmony_cistruct btt; 1828c2ecf20Sopenharmony_cistruct nd_btt { 1838c2ecf20Sopenharmony_ci struct device dev; 1848c2ecf20Sopenharmony_ci struct nd_namespace_common *ndns; 1858c2ecf20Sopenharmony_ci struct btt *btt; 1868c2ecf20Sopenharmony_ci unsigned long lbasize; 1878c2ecf20Sopenharmony_ci u64 size; 1888c2ecf20Sopenharmony_ci u8 *uuid; 1898c2ecf20Sopenharmony_ci int id; 1908c2ecf20Sopenharmony_ci int initial_offset; 1918c2ecf20Sopenharmony_ci u16 version_major; 1928c2ecf20Sopenharmony_ci u16 version_minor; 1938c2ecf20Sopenharmony_ci}; 1948c2ecf20Sopenharmony_ci 1958c2ecf20Sopenharmony_cienum nd_pfn_mode { 1968c2ecf20Sopenharmony_ci PFN_MODE_NONE, 1978c2ecf20Sopenharmony_ci PFN_MODE_RAM, 1988c2ecf20Sopenharmony_ci PFN_MODE_PMEM, 1998c2ecf20Sopenharmony_ci}; 2008c2ecf20Sopenharmony_ci 2018c2ecf20Sopenharmony_cistruct nd_pfn { 2028c2ecf20Sopenharmony_ci int id; 2038c2ecf20Sopenharmony_ci u8 *uuid; 2048c2ecf20Sopenharmony_ci struct device dev; 2058c2ecf20Sopenharmony_ci unsigned long align; 2068c2ecf20Sopenharmony_ci unsigned long npfns; 2078c2ecf20Sopenharmony_ci enum nd_pfn_mode mode; 2088c2ecf20Sopenharmony_ci struct nd_pfn_sb *pfn_sb; 2098c2ecf20Sopenharmony_ci struct nd_namespace_common *ndns; 2108c2ecf20Sopenharmony_ci}; 2118c2ecf20Sopenharmony_ci 2128c2ecf20Sopenharmony_cistruct nd_dax { 2138c2ecf20Sopenharmony_ci struct nd_pfn nd_pfn; 2148c2ecf20Sopenharmony_ci}; 2158c2ecf20Sopenharmony_ci 2168c2ecf20Sopenharmony_cistatic inline u32 nd_info_block_reserve(void) 2178c2ecf20Sopenharmony_ci{ 2188c2ecf20Sopenharmony_ci return ALIGN(SZ_8K, PAGE_SIZE); 2198c2ecf20Sopenharmony_ci} 2208c2ecf20Sopenharmony_ci 2218c2ecf20Sopenharmony_cienum nd_async_mode { 2228c2ecf20Sopenharmony_ci ND_SYNC, 2238c2ecf20Sopenharmony_ci ND_ASYNC, 2248c2ecf20Sopenharmony_ci}; 2258c2ecf20Sopenharmony_ci 2268c2ecf20Sopenharmony_ciint nd_integrity_init(struct gendisk *disk, unsigned long meta_size); 2278c2ecf20Sopenharmony_civoid wait_nvdimm_bus_probe_idle(struct device *dev); 2288c2ecf20Sopenharmony_civoid nd_device_register(struct device *dev); 2298c2ecf20Sopenharmony_civoid nd_device_unregister(struct device *dev, enum nd_async_mode mode); 2308c2ecf20Sopenharmony_civoid nd_device_notify(struct device *dev, enum nvdimm_event event); 2318c2ecf20Sopenharmony_ciint nd_uuid_store(struct device *dev, u8 **uuid_out, const char *buf, 2328c2ecf20Sopenharmony_ci size_t len); 2338c2ecf20Sopenharmony_cissize_t nd_size_select_show(unsigned long current_size, 2348c2ecf20Sopenharmony_ci const unsigned long *supported, char *buf); 2358c2ecf20Sopenharmony_cissize_t nd_size_select_store(struct device *dev, const char *buf, 2368c2ecf20Sopenharmony_ci unsigned long *current_size, const unsigned long *supported); 2378c2ecf20Sopenharmony_ciint __init nvdimm_init(void); 2388c2ecf20Sopenharmony_ciint __init nd_region_init(void); 2398c2ecf20Sopenharmony_ciint __init nd_label_init(void); 2408c2ecf20Sopenharmony_civoid nvdimm_exit(void); 2418c2ecf20Sopenharmony_civoid nd_region_exit(void); 2428c2ecf20Sopenharmony_cistruct nvdimm; 2438c2ecf20Sopenharmony_ciextern const struct attribute_group nd_device_attribute_group; 2448c2ecf20Sopenharmony_ciextern const struct attribute_group nd_numa_attribute_group; 2458c2ecf20Sopenharmony_ciextern const struct attribute_group *nvdimm_bus_attribute_groups[]; 2468c2ecf20Sopenharmony_cistruct nvdimm_drvdata *to_ndd(struct nd_mapping *nd_mapping); 2478c2ecf20Sopenharmony_ciint nvdimm_check_config_data(struct device *dev); 2488c2ecf20Sopenharmony_ciint nvdimm_init_nsarea(struct nvdimm_drvdata *ndd); 2498c2ecf20Sopenharmony_ciint nvdimm_init_config_data(struct nvdimm_drvdata *ndd); 2508c2ecf20Sopenharmony_ciint nvdimm_get_config_data(struct nvdimm_drvdata *ndd, void *buf, 2518c2ecf20Sopenharmony_ci size_t offset, size_t len); 2528c2ecf20Sopenharmony_ciint nvdimm_set_config_data(struct nvdimm_drvdata *ndd, size_t offset, 2538c2ecf20Sopenharmony_ci void *buf, size_t len); 2548c2ecf20Sopenharmony_cilong nvdimm_clear_poison(struct device *dev, phys_addr_t phys, 2558c2ecf20Sopenharmony_ci unsigned int len); 2568c2ecf20Sopenharmony_civoid nvdimm_set_labeling(struct device *dev); 2578c2ecf20Sopenharmony_civoid nvdimm_set_locked(struct device *dev); 2588c2ecf20Sopenharmony_civoid nvdimm_clear_locked(struct device *dev); 2598c2ecf20Sopenharmony_ciint nvdimm_security_setup_events(struct device *dev); 2608c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_NVDIMM_KEYS) 2618c2ecf20Sopenharmony_ciint nvdimm_security_unlock(struct device *dev); 2628c2ecf20Sopenharmony_ci#else 2638c2ecf20Sopenharmony_cistatic inline int nvdimm_security_unlock(struct device *dev) 2648c2ecf20Sopenharmony_ci{ 2658c2ecf20Sopenharmony_ci return 0; 2668c2ecf20Sopenharmony_ci} 2678c2ecf20Sopenharmony_ci#endif 2688c2ecf20Sopenharmony_cistruct nd_btt *to_nd_btt(struct device *dev); 2698c2ecf20Sopenharmony_ci 2708c2ecf20Sopenharmony_cistruct nd_gen_sb { 2718c2ecf20Sopenharmony_ci char reserved[SZ_4K - 8]; 2728c2ecf20Sopenharmony_ci __le64 checksum; 2738c2ecf20Sopenharmony_ci}; 2748c2ecf20Sopenharmony_ci 2758c2ecf20Sopenharmony_ciu64 nd_sb_checksum(struct nd_gen_sb *sb); 2768c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_BTT) 2778c2ecf20Sopenharmony_ciint nd_btt_probe(struct device *dev, struct nd_namespace_common *ndns); 2788c2ecf20Sopenharmony_cibool is_nd_btt(struct device *dev); 2798c2ecf20Sopenharmony_cistruct device *nd_btt_create(struct nd_region *nd_region); 2808c2ecf20Sopenharmony_ci#else 2818c2ecf20Sopenharmony_cistatic inline int nd_btt_probe(struct device *dev, 2828c2ecf20Sopenharmony_ci struct nd_namespace_common *ndns) 2838c2ecf20Sopenharmony_ci{ 2848c2ecf20Sopenharmony_ci return -ENODEV; 2858c2ecf20Sopenharmony_ci} 2868c2ecf20Sopenharmony_ci 2878c2ecf20Sopenharmony_cistatic inline bool is_nd_btt(struct device *dev) 2888c2ecf20Sopenharmony_ci{ 2898c2ecf20Sopenharmony_ci return false; 2908c2ecf20Sopenharmony_ci} 2918c2ecf20Sopenharmony_ci 2928c2ecf20Sopenharmony_cistatic inline struct device *nd_btt_create(struct nd_region *nd_region) 2938c2ecf20Sopenharmony_ci{ 2948c2ecf20Sopenharmony_ci return NULL; 2958c2ecf20Sopenharmony_ci} 2968c2ecf20Sopenharmony_ci#endif 2978c2ecf20Sopenharmony_ci 2988c2ecf20Sopenharmony_cistruct nd_pfn *to_nd_pfn(struct device *dev); 2998c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_NVDIMM_PFN) 3008c2ecf20Sopenharmony_ci 3018c2ecf20Sopenharmony_ci#define MAX_NVDIMM_ALIGN 4 3028c2ecf20Sopenharmony_ci 3038c2ecf20Sopenharmony_ciint nd_pfn_probe(struct device *dev, struct nd_namespace_common *ndns); 3048c2ecf20Sopenharmony_cibool is_nd_pfn(struct device *dev); 3058c2ecf20Sopenharmony_cistruct device *nd_pfn_create(struct nd_region *nd_region); 3068c2ecf20Sopenharmony_cistruct device *nd_pfn_devinit(struct nd_pfn *nd_pfn, 3078c2ecf20Sopenharmony_ci struct nd_namespace_common *ndns); 3088c2ecf20Sopenharmony_ciint nd_pfn_validate(struct nd_pfn *nd_pfn, const char *sig); 3098c2ecf20Sopenharmony_ciextern const struct attribute_group *nd_pfn_attribute_groups[]; 3108c2ecf20Sopenharmony_ci#else 3118c2ecf20Sopenharmony_cistatic inline int nd_pfn_probe(struct device *dev, 3128c2ecf20Sopenharmony_ci struct nd_namespace_common *ndns) 3138c2ecf20Sopenharmony_ci{ 3148c2ecf20Sopenharmony_ci return -ENODEV; 3158c2ecf20Sopenharmony_ci} 3168c2ecf20Sopenharmony_ci 3178c2ecf20Sopenharmony_cistatic inline bool is_nd_pfn(struct device *dev) 3188c2ecf20Sopenharmony_ci{ 3198c2ecf20Sopenharmony_ci return false; 3208c2ecf20Sopenharmony_ci} 3218c2ecf20Sopenharmony_ci 3228c2ecf20Sopenharmony_cistatic inline struct device *nd_pfn_create(struct nd_region *nd_region) 3238c2ecf20Sopenharmony_ci{ 3248c2ecf20Sopenharmony_ci return NULL; 3258c2ecf20Sopenharmony_ci} 3268c2ecf20Sopenharmony_ci 3278c2ecf20Sopenharmony_cistatic inline int nd_pfn_validate(struct nd_pfn *nd_pfn, const char *sig) 3288c2ecf20Sopenharmony_ci{ 3298c2ecf20Sopenharmony_ci return -ENODEV; 3308c2ecf20Sopenharmony_ci} 3318c2ecf20Sopenharmony_ci#endif 3328c2ecf20Sopenharmony_ci 3338c2ecf20Sopenharmony_cistruct nd_dax *to_nd_dax(struct device *dev); 3348c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_NVDIMM_DAX) 3358c2ecf20Sopenharmony_ciint nd_dax_probe(struct device *dev, struct nd_namespace_common *ndns); 3368c2ecf20Sopenharmony_cibool is_nd_dax(struct device *dev); 3378c2ecf20Sopenharmony_cistruct device *nd_dax_create(struct nd_region *nd_region); 3388c2ecf20Sopenharmony_ci#else 3398c2ecf20Sopenharmony_cistatic inline int nd_dax_probe(struct device *dev, 3408c2ecf20Sopenharmony_ci struct nd_namespace_common *ndns) 3418c2ecf20Sopenharmony_ci{ 3428c2ecf20Sopenharmony_ci return -ENODEV; 3438c2ecf20Sopenharmony_ci} 3448c2ecf20Sopenharmony_ci 3458c2ecf20Sopenharmony_cistatic inline bool is_nd_dax(struct device *dev) 3468c2ecf20Sopenharmony_ci{ 3478c2ecf20Sopenharmony_ci return false; 3488c2ecf20Sopenharmony_ci} 3498c2ecf20Sopenharmony_ci 3508c2ecf20Sopenharmony_cistatic inline struct device *nd_dax_create(struct nd_region *nd_region) 3518c2ecf20Sopenharmony_ci{ 3528c2ecf20Sopenharmony_ci return NULL; 3538c2ecf20Sopenharmony_ci} 3548c2ecf20Sopenharmony_ci#endif 3558c2ecf20Sopenharmony_ci 3568c2ecf20Sopenharmony_ciint nd_region_to_nstype(struct nd_region *nd_region); 3578c2ecf20Sopenharmony_ciint nd_region_register_namespaces(struct nd_region *nd_region, int *err); 3588c2ecf20Sopenharmony_ciu64 nd_region_interleave_set_cookie(struct nd_region *nd_region, 3598c2ecf20Sopenharmony_ci struct nd_namespace_index *nsindex); 3608c2ecf20Sopenharmony_ciu64 nd_region_interleave_set_altcookie(struct nd_region *nd_region); 3618c2ecf20Sopenharmony_civoid nvdimm_bus_lock(struct device *dev); 3628c2ecf20Sopenharmony_civoid nvdimm_bus_unlock(struct device *dev); 3638c2ecf20Sopenharmony_cibool is_nvdimm_bus_locked(struct device *dev); 3648c2ecf20Sopenharmony_civoid nvdimm_check_and_set_ro(struct gendisk *disk); 3658c2ecf20Sopenharmony_civoid nvdimm_drvdata_release(struct kref *kref); 3668c2ecf20Sopenharmony_civoid put_ndd(struct nvdimm_drvdata *ndd); 3678c2ecf20Sopenharmony_ciint nd_label_reserve_dpa(struct nvdimm_drvdata *ndd); 3688c2ecf20Sopenharmony_civoid nvdimm_free_dpa(struct nvdimm_drvdata *ndd, struct resource *res); 3698c2ecf20Sopenharmony_cistruct resource *nvdimm_allocate_dpa(struct nvdimm_drvdata *ndd, 3708c2ecf20Sopenharmony_ci struct nd_label_id *label_id, resource_size_t start, 3718c2ecf20Sopenharmony_ci resource_size_t n); 3728c2ecf20Sopenharmony_ciresource_size_t nvdimm_namespace_capacity(struct nd_namespace_common *ndns); 3738c2ecf20Sopenharmony_cibool nvdimm_namespace_locked(struct nd_namespace_common *ndns); 3748c2ecf20Sopenharmony_cistruct nd_namespace_common *nvdimm_namespace_common_probe(struct device *dev); 3758c2ecf20Sopenharmony_ciint nvdimm_namespace_attach_btt(struct nd_namespace_common *ndns); 3768c2ecf20Sopenharmony_ciint nvdimm_namespace_detach_btt(struct nd_btt *nd_btt); 3778c2ecf20Sopenharmony_ciconst char *nvdimm_namespace_disk_name(struct nd_namespace_common *ndns, 3788c2ecf20Sopenharmony_ci char *name); 3798c2ecf20Sopenharmony_ciunsigned int pmem_sector_size(struct nd_namespace_common *ndns); 3808c2ecf20Sopenharmony_cistruct range; 3818c2ecf20Sopenharmony_civoid nvdimm_badblocks_populate(struct nd_region *nd_region, 3828c2ecf20Sopenharmony_ci struct badblocks *bb, const struct range *range); 3838c2ecf20Sopenharmony_ciint devm_namespace_enable(struct device *dev, struct nd_namespace_common *ndns, 3848c2ecf20Sopenharmony_ci resource_size_t size); 3858c2ecf20Sopenharmony_civoid devm_namespace_disable(struct device *dev, 3868c2ecf20Sopenharmony_ci struct nd_namespace_common *ndns); 3878c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_ND_CLAIM) 3888c2ecf20Sopenharmony_ci/* max struct page size independent of kernel config */ 3898c2ecf20Sopenharmony_ci#define MAX_STRUCT_PAGE_SIZE 64 3908c2ecf20Sopenharmony_ciint nvdimm_setup_pfn(struct nd_pfn *nd_pfn, struct dev_pagemap *pgmap); 3918c2ecf20Sopenharmony_ci#else 3928c2ecf20Sopenharmony_cistatic inline int nvdimm_setup_pfn(struct nd_pfn *nd_pfn, 3938c2ecf20Sopenharmony_ci struct dev_pagemap *pgmap) 3948c2ecf20Sopenharmony_ci{ 3958c2ecf20Sopenharmony_ci return -ENXIO; 3968c2ecf20Sopenharmony_ci} 3978c2ecf20Sopenharmony_ci#endif 3988c2ecf20Sopenharmony_ciint nd_blk_region_init(struct nd_region *nd_region); 3998c2ecf20Sopenharmony_ciint nd_region_activate(struct nd_region *nd_region); 4008c2ecf20Sopenharmony_cistatic inline bool is_bad_pmem(struct badblocks *bb, sector_t sector, 4018c2ecf20Sopenharmony_ci unsigned int len) 4028c2ecf20Sopenharmony_ci{ 4038c2ecf20Sopenharmony_ci if (bb->count) { 4048c2ecf20Sopenharmony_ci sector_t first_bad; 4058c2ecf20Sopenharmony_ci int num_bad; 4068c2ecf20Sopenharmony_ci 4078c2ecf20Sopenharmony_ci return !!badblocks_check(bb, sector, len / 512, &first_bad, 4088c2ecf20Sopenharmony_ci &num_bad); 4098c2ecf20Sopenharmony_ci } 4108c2ecf20Sopenharmony_ci 4118c2ecf20Sopenharmony_ci return false; 4128c2ecf20Sopenharmony_ci} 4138c2ecf20Sopenharmony_ciresource_size_t nd_namespace_blk_validate(struct nd_namespace_blk *nsblk); 4148c2ecf20Sopenharmony_ciconst u8 *nd_dev_to_uuid(struct device *dev); 4158c2ecf20Sopenharmony_cibool pmem_should_map_pages(struct device *dev); 4168c2ecf20Sopenharmony_ci#endif /* __ND_H__ */ 417