1 // SPDX-License-Identifier: GPL-2.0
3 * Recognize and maintain s390 storage class memory.
5 * Copyright IBM Corp. 2012
6 * Author(s): Sebastian Ott <sebott@linux.vnet.ibm.com>
9 #include <linux/device.h>
10 #include <linux/module.h>
11 #include <linux/mutex.h>
12 #include <linux/slab.h>
13 #include <linux/init.h>
14 #include <linux/err.h>
18 static struct device
*scm_root
;
20 #define to_scm_dev(n) container_of(n, struct scm_device, dev)
21 #define to_scm_drv(d) container_of(d, struct scm_driver, drv)
23 static int scmdev_probe(struct device
*dev
)
25 struct scm_device
*scmdev
= to_scm_dev(dev
);
26 struct scm_driver
*scmdrv
= to_scm_drv(dev
->driver
);
28 return scmdrv
->probe
? scmdrv
->probe(scmdev
) : -ENODEV
;
31 static int scmdev_remove(struct device
*dev
)
33 struct scm_device
*scmdev
= to_scm_dev(dev
);
34 struct scm_driver
*scmdrv
= to_scm_drv(dev
->driver
);
36 return scmdrv
->remove
? scmdrv
->remove(scmdev
) : -ENODEV
;
39 static int scmdev_uevent(struct device
*dev
, struct kobj_uevent_env
*env
)
41 return add_uevent_var(env
, "MODALIAS=scm:scmdev");
44 static struct bus_type scm_bus_type
= {
46 .probe
= scmdev_probe
,
47 .remove
= scmdev_remove
,
48 .uevent
= scmdev_uevent
,
52 * scm_driver_register() - register a scm driver
53 * @scmdrv: driver to be registered
55 int scm_driver_register(struct scm_driver
*scmdrv
)
57 struct device_driver
*drv
= &scmdrv
->drv
;
59 drv
->bus
= &scm_bus_type
;
61 return driver_register(drv
);
63 EXPORT_SYMBOL_GPL(scm_driver_register
);
66 * scm_driver_unregister() - deregister a scm driver
67 * @scmdrv: driver to be deregistered
69 void scm_driver_unregister(struct scm_driver
*scmdrv
)
71 driver_unregister(&scmdrv
->drv
);
73 EXPORT_SYMBOL_GPL(scm_driver_unregister
);
75 void scm_irq_handler(struct aob
*aob
, blk_status_t error
)
77 struct aob_rq_header
*aobrq
= (void *) aob
->request
.data
;
78 struct scm_device
*scmdev
= aobrq
->scmdev
;
79 struct scm_driver
*scmdrv
= to_scm_drv(scmdev
->dev
.driver
);
81 scmdrv
->handler(scmdev
, aobrq
->data
, error
);
83 EXPORT_SYMBOL_GPL(scm_irq_handler
);
85 #define scm_attr(name) \
86 static ssize_t show_##name(struct device *dev, \
87 struct device_attribute *attr, char *buf) \
89 struct scm_device *scmdev = to_scm_dev(dev); \
93 ret = sprintf(buf, "%u\n", scmdev->attrs.name); \
98 static DEVICE_ATTR(name, S_IRUGO, show_##name, NULL);
100 scm_attr(persistence
);
101 scm_attr(oper_state
);
102 scm_attr(data_state
);
107 static struct attribute
*scmdev_attrs
[] = {
108 &dev_attr_persistence
.attr
,
109 &dev_attr_oper_state
.attr
,
110 &dev_attr_data_state
.attr
,
112 &dev_attr_release
.attr
,
113 &dev_attr_res_id
.attr
,
117 static struct attribute_group scmdev_attr_group
= {
118 .attrs
= scmdev_attrs
,
121 static const struct attribute_group
*scmdev_attr_groups
[] = {
126 static void scmdev_release(struct device
*dev
)
128 struct scm_device
*scmdev
= to_scm_dev(dev
);
133 static void scmdev_setup(struct scm_device
*scmdev
, struct sale
*sale
,
134 unsigned int size
, unsigned int max_blk_count
)
136 dev_set_name(&scmdev
->dev
, "%016llx", (unsigned long long) sale
->sa
);
137 scmdev
->nr_max_block
= max_blk_count
;
138 scmdev
->address
= sale
->sa
;
139 scmdev
->size
= 1UL << size
;
140 scmdev
->attrs
.rank
= sale
->rank
;
141 scmdev
->attrs
.persistence
= sale
->p
;
142 scmdev
->attrs
.oper_state
= sale
->op_state
;
143 scmdev
->attrs
.data_state
= sale
->data_state
;
144 scmdev
->attrs
.rank
= sale
->rank
;
145 scmdev
->attrs
.release
= sale
->r
;
146 scmdev
->attrs
.res_id
= sale
->rid
;
147 scmdev
->dev
.parent
= scm_root
;
148 scmdev
->dev
.bus
= &scm_bus_type
;
149 scmdev
->dev
.release
= scmdev_release
;
150 scmdev
->dev
.groups
= scmdev_attr_groups
;
154 * Check for state-changes, notify the driver and userspace.
156 static void scmdev_update(struct scm_device
*scmdev
, struct sale
*sale
)
158 struct scm_driver
*scmdrv
;
161 device_lock(&scmdev
->dev
);
162 changed
= scmdev
->attrs
.rank
!= sale
->rank
||
163 scmdev
->attrs
.oper_state
!= sale
->op_state
;
164 scmdev
->attrs
.rank
= sale
->rank
;
165 scmdev
->attrs
.oper_state
= sale
->op_state
;
166 if (!scmdev
->dev
.driver
)
168 scmdrv
= to_scm_drv(scmdev
->dev
.driver
);
169 if (changed
&& scmdrv
->notify
)
170 scmdrv
->notify(scmdev
, SCM_CHANGE
);
172 device_unlock(&scmdev
->dev
);
174 kobject_uevent(&scmdev
->dev
.kobj
, KOBJ_CHANGE
);
177 static int check_address(struct device
*dev
, const void *data
)
179 struct scm_device
*scmdev
= to_scm_dev(dev
);
180 const struct sale
*sale
= data
;
182 return scmdev
->address
== sale
->sa
;
185 static struct scm_device
*scmdev_find(struct sale
*sale
)
189 dev
= bus_find_device(&scm_bus_type
, NULL
, sale
, check_address
);
191 return dev
? to_scm_dev(dev
) : NULL
;
194 static int scm_add(struct chsc_scm_info
*scm_info
, size_t num
)
196 struct sale
*sale
, *scmal
= scm_info
->scmal
;
197 struct scm_device
*scmdev
;
200 for (sale
= scmal
; sale
< scmal
+ num
; sale
++) {
201 scmdev
= scmdev_find(sale
);
203 scmdev_update(scmdev
, sale
);
204 /* Release reference from scm_find(). */
205 put_device(&scmdev
->dev
);
208 scmdev
= kzalloc(sizeof(*scmdev
), GFP_KERNEL
);
211 scmdev_setup(scmdev
, sale
, scm_info
->is
, scm_info
->mbc
);
212 ret
= device_register(&scmdev
->dev
);
214 /* Release reference from device_initialize(). */
215 put_device(&scmdev
->dev
);
223 int scm_update_information(void)
225 struct chsc_scm_info
*scm_info
;
230 scm_info
= (void *)__get_free_page(GFP_KERNEL
| GFP_DMA
);
235 ret
= chsc_scm_info(scm_info
, token
);
239 num
= (scm_info
->response
.length
-
240 (offsetof(struct chsc_scm_info
, scmal
) -
241 offsetof(struct chsc_scm_info
, response
))
242 ) / sizeof(struct sale
);
244 ret
= scm_add(scm_info
, num
);
248 token
= scm_info
->restok
;
251 free_page((unsigned long)scm_info
);
256 static int scm_dev_avail(struct device
*dev
, void *unused
)
258 struct scm_driver
*scmdrv
= to_scm_drv(dev
->driver
);
259 struct scm_device
*scmdev
= to_scm_dev(dev
);
261 if (dev
->driver
&& scmdrv
->notify
)
262 scmdrv
->notify(scmdev
, SCM_AVAIL
);
267 int scm_process_availability_information(void)
269 return bus_for_each_dev(&scm_bus_type
, NULL
, NULL
, scm_dev_avail
);
272 static int __init
scm_init(void)
276 ret
= bus_register(&scm_bus_type
);
280 scm_root
= root_device_register("scm");
281 if (IS_ERR(scm_root
)) {
282 bus_unregister(&scm_bus_type
);
283 return PTR_ERR(scm_root
);
286 scm_update_information();
289 subsys_initcall_sync(scm_init
);