xref: /linux-6.15/include/linux/nd.h (revision bf9bccc1)
1 /*
2  * Copyright(c) 2013-2015 Intel Corporation. All rights reserved.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of version 2 of the GNU General Public License as
6  * published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11  * General Public License for more details.
12  */
13 #ifndef __LINUX_ND_H__
14 #define __LINUX_ND_H__
15 #include <linux/ndctl.h>
16 #include <linux/device.h>
17 
18 struct nd_device_driver {
19 	struct device_driver drv;
20 	unsigned long type;
21 	int (*probe)(struct device *dev);
22 	int (*remove)(struct device *dev);
23 };
24 
25 static inline struct nd_device_driver *to_nd_device_driver(
26 		struct device_driver *drv)
27 {
28 	return container_of(drv, struct nd_device_driver, drv);
29 };
30 
31 /**
32  * struct nd_namespace_io - infrastructure for loading an nd_pmem instance
33  * @dev: namespace device created by the nd region driver
34  * @res: struct resource conversion of a NFIT SPA table
35  */
36 struct nd_namespace_io {
37 	struct device dev;
38 	struct resource res;
39 };
40 
41 /**
42  * struct nd_namespace_pmem - namespace device for dimm-backed interleaved memory
43  * @nsio: device and system physical address range to drive
44  * @alt_name: namespace name supplied in the dimm label
45  * @uuid: namespace name supplied in the dimm label
46  */
47 struct nd_namespace_pmem {
48 	struct nd_namespace_io nsio;
49 	char *alt_name;
50 	u8 *uuid;
51 };
52 
53 static inline struct nd_namespace_io *to_nd_namespace_io(struct device *dev)
54 {
55 	return container_of(dev, struct nd_namespace_io, dev);
56 }
57 
58 static inline struct nd_namespace_pmem *to_nd_namespace_pmem(struct device *dev)
59 {
60 	struct nd_namespace_io *nsio = to_nd_namespace_io(dev);
61 
62 	return container_of(nsio, struct nd_namespace_pmem, nsio);
63 }
64 
65 #define MODULE_ALIAS_ND_DEVICE(type) \
66 	MODULE_ALIAS("nd:t" __stringify(type) "*")
67 #define ND_DEVICE_MODALIAS_FMT "nd:t%d"
68 
69 int __must_check __nd_driver_register(struct nd_device_driver *nd_drv,
70 		struct module *module, const char *mod_name);
71 #define nd_driver_register(driver) \
72 	__nd_driver_register(driver, THIS_MODULE, KBUILD_MODNAME)
73 #endif /* __LINUX_ND_H__ */
74