Commit | Line | Data |
---|---|---|
4d88a97a DW |
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 __ND_H__ | |
14 | #define __ND_H__ | |
1f7df6f8 | 15 | #include <linux/libnvdimm.h> |
4d88a97a DW |
16 | #include <linux/device.h> |
17 | #include <linux/mutex.h> | |
18 | #include <linux/ndctl.h> | |
4a826c83 | 19 | #include "label.h" |
4d88a97a DW |
20 | |
21 | struct nvdimm_drvdata { | |
22 | struct device *dev; | |
4a826c83 | 23 | int nsindex_size; |
4d88a97a DW |
24 | struct nd_cmd_get_config_size nsarea; |
25 | void *data; | |
4a826c83 DW |
26 | int ns_current, ns_next; |
27 | struct resource dpa; | |
4d88a97a DW |
28 | }; |
29 | ||
3d88002e DW |
30 | struct nd_region_namespaces { |
31 | int count; | |
32 | int active; | |
33 | }; | |
34 | ||
4a826c83 DW |
35 | static inline struct nd_namespace_index *to_namespace_index( |
36 | struct nvdimm_drvdata *ndd, int i) | |
37 | { | |
38 | if (i < 0) | |
39 | return NULL; | |
40 | ||
41 | return ndd->data + sizeof_namespace_index(ndd) * i; | |
42 | } | |
43 | ||
44 | static inline struct nd_namespace_index *to_current_namespace_index( | |
45 | struct nvdimm_drvdata *ndd) | |
46 | { | |
47 | return to_namespace_index(ndd, ndd->ns_current); | |
48 | } | |
49 | ||
50 | static inline struct nd_namespace_index *to_next_namespace_index( | |
51 | struct nvdimm_drvdata *ndd) | |
52 | { | |
53 | return to_namespace_index(ndd, ndd->ns_next); | |
54 | } | |
55 | ||
56 | #define nd_dbg_dpa(r, d, res, fmt, arg...) \ | |
57 | dev_dbg((r) ? &(r)->dev : (d)->dev, "%s: %.13s: %#llx @ %#llx " fmt, \ | |
58 | (r) ? dev_name((d)->dev) : "", res ? res->name : "null", \ | |
59 | (unsigned long long) (res ? resource_size(res) : 0), \ | |
60 | (unsigned long long) (res ? res->start : 0), ##arg) | |
61 | ||
62 | #define for_each_dpa_resource_safe(ndd, res, next) \ | |
63 | for (res = (ndd)->dpa.child, next = res ? res->sibling : NULL; \ | |
64 | res; res = next, next = next ? next->sibling : NULL) | |
65 | ||
1f7df6f8 DW |
66 | struct nd_region { |
67 | struct device dev; | |
68 | u16 ndr_mappings; | |
69 | u64 ndr_size; | |
70 | u64 ndr_start; | |
71 | int id; | |
72 | void *provider_data; | |
eaf96153 | 73 | struct nd_interleave_set *nd_set; |
1f7df6f8 DW |
74 | struct nd_mapping mapping[0]; |
75 | }; | |
76 | ||
4a826c83 DW |
77 | /* |
78 | * Lookup next in the repeating sequence of 01, 10, and 11. | |
79 | */ | |
80 | static inline unsigned nd_inc_seq(unsigned seq) | |
81 | { | |
82 | static const unsigned next[] = { 0, 2, 3, 1 }; | |
83 | ||
84 | return next[seq & 3]; | |
85 | } | |
4d88a97a DW |
86 | enum nd_async_mode { |
87 | ND_SYNC, | |
88 | ND_ASYNC, | |
89 | }; | |
90 | ||
91 | void nd_device_register(struct device *dev); | |
92 | void nd_device_unregister(struct device *dev, enum nd_async_mode mode); | |
93 | int __init nvdimm_init(void); | |
3d88002e | 94 | int __init nd_region_init(void); |
4d88a97a | 95 | void nvdimm_exit(void); |
3d88002e | 96 | void nd_region_exit(void); |
4d88a97a DW |
97 | int nvdimm_init_nsarea(struct nvdimm_drvdata *ndd); |
98 | int nvdimm_init_config_data(struct nvdimm_drvdata *ndd); | |
3d88002e DW |
99 | struct nd_region *to_nd_region(struct device *dev); |
100 | int nd_region_to_nstype(struct nd_region *nd_region); | |
101 | int nd_region_register_namespaces(struct nd_region *nd_region, int *err); | |
102 | void nvdimm_bus_lock(struct device *dev); | |
103 | void nvdimm_bus_unlock(struct device *dev); | |
104 | bool is_nvdimm_bus_locked(struct device *dev); | |
4a826c83 DW |
105 | int nd_label_reserve_dpa(struct nvdimm_drvdata *ndd); |
106 | void nvdimm_free_dpa(struct nvdimm_drvdata *ndd, struct resource *res); | |
107 | struct resource *nvdimm_allocate_dpa(struct nvdimm_drvdata *ndd, | |
108 | struct nd_label_id *label_id, resource_size_t start, | |
109 | resource_size_t n); | |
4d88a97a | 110 | #endif /* __ND_H__ */ |