1 // SPDX-License-Identifier: GPL-2.0
3 * System Control and Management Interface (SCMI) Message Protocol bus layer
5 * Copyright (C) 2018-2021 ARM Ltd.
8 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
10 #include <linux/atomic.h>
11 #include <linux/types.h>
12 #include <linux/module.h>
14 #include <linux/kernel.h>
15 #include <linux/slab.h>
16 #include <linux/device.h>
20 BLOCKING_NOTIFIER_HEAD(scmi_requested_devices_nh
);
21 EXPORT_SYMBOL_GPL(scmi_requested_devices_nh
);
23 static DEFINE_IDA(scmi_bus_id
);
25 static DEFINE_IDR(scmi_requested_devices
);
26 /* Protect access to scmi_requested_devices */
27 static DEFINE_MUTEX(scmi_requested_devices_mtx
);
29 struct scmi_requested_dev
{
30 const struct scmi_device_id
*id_table
;
31 struct list_head node
;
34 /* Track globally the creation of SCMI SystemPower related devices */
35 static atomic_t scmi_syspower_registered
= ATOMIC_INIT(0);
38 * scmi_protocol_device_request - Helper to request a device
40 * @id_table: A protocol/name pair descriptor for the device to be created.
42 * This helper let an SCMI driver request specific devices identified by the
43 * @id_table to be created for each active SCMI instance.
45 * The requested device name MUST NOT be already existent for any protocol;
46 * at first the freshly requested @id_table is annotated in the IDR table
47 * @scmi_requested_devices and then the requested device is advertised to any
48 * registered party via the @scmi_requested_devices_nh notification chain.
50 * Return: 0 on Success
52 static int scmi_protocol_device_request(const struct scmi_device_id
*id_table
)
56 struct list_head
*head
, *phead
= NULL
;
57 struct scmi_requested_dev
*rdev
;
59 pr_debug("Requesting SCMI device (%s) for protocol %x\n",
60 id_table
->name
, id_table
->protocol_id
);
62 if (IS_ENABLED(CONFIG_ARM_SCMI_RAW_MODE_SUPPORT
) &&
63 !IS_ENABLED(CONFIG_ARM_SCMI_RAW_MODE_SUPPORT_COEX
)) {
64 pr_warn("SCMI Raw mode active. Rejecting '%s'/0x%02X\n",
65 id_table
->name
, id_table
->protocol_id
);
70 * Search for the matching protocol rdev list and then search
71 * of any existent equally named device...fails if any duplicate found.
73 mutex_lock(&scmi_requested_devices_mtx
);
74 idr_for_each_entry(&scmi_requested_devices
, head
, id
) {
76 /* A list found registered in the IDR is never empty */
77 rdev
= list_first_entry(head
, struct scmi_requested_dev
,
79 if (rdev
->id_table
->protocol_id
==
80 id_table
->protocol_id
)
83 list_for_each_entry(rdev
, head
, node
) {
84 if (!strcmp(rdev
->id_table
->name
, id_table
->name
)) {
85 pr_err("Ignoring duplicate request [%d] %s\n",
86 rdev
->id_table
->protocol_id
,
87 rdev
->id_table
->name
);
95 * No duplicate found for requested id_table, so let's create a new
96 * requested device entry for this new valid request.
98 rdev
= kzalloc(sizeof(*rdev
), GFP_KERNEL
);
103 rdev
->id_table
= id_table
;
106 * Append the new requested device table descriptor to the head of the
107 * related protocol list, eventually creating such head if not already
111 phead
= kzalloc(sizeof(*phead
), GFP_KERNEL
);
117 INIT_LIST_HEAD(phead
);
119 ret
= idr_alloc(&scmi_requested_devices
, (void *)phead
,
120 id_table
->protocol_id
,
121 id_table
->protocol_id
+ 1, GFP_KERNEL
);
122 if (ret
!= id_table
->protocol_id
) {
123 pr_err("Failed to save SCMI device - ret:%d\n", ret
);
131 list_add(&rdev
->node
, phead
);
134 mutex_unlock(&scmi_requested_devices_mtx
);
137 blocking_notifier_call_chain(&scmi_requested_devices_nh
,
138 SCMI_BUS_NOTIFY_DEVICE_REQUEST
,
139 (void *)rdev
->id_table
);
144 static int scmi_protocol_table_register(const struct scmi_device_id
*id_table
)
147 const struct scmi_device_id
*entry
;
149 for (entry
= id_table
; entry
->name
&& ret
== 0; entry
++)
150 ret
= scmi_protocol_device_request(entry
);
156 * scmi_protocol_device_unrequest - Helper to unrequest a device
158 * @id_table: A protocol/name pair descriptor for the device to be unrequested.
160 * The unrequested device, described by the provided id_table, is at first
161 * removed from the IDR @scmi_requested_devices and then the removal is
162 * advertised to any registered party via the @scmi_requested_devices_nh
163 * notification chain.
165 static void scmi_protocol_device_unrequest(const struct scmi_device_id
*id_table
)
167 struct list_head
*phead
;
169 pr_debug("Unrequesting SCMI device (%s) for protocol %x\n",
170 id_table
->name
, id_table
->protocol_id
);
172 mutex_lock(&scmi_requested_devices_mtx
);
173 phead
= idr_find(&scmi_requested_devices
, id_table
->protocol_id
);
175 struct scmi_requested_dev
*victim
, *tmp
;
177 list_for_each_entry_safe(victim
, tmp
, phead
, node
) {
178 if (!strcmp(victim
->id_table
->name
, id_table
->name
)) {
179 list_del(&victim
->node
);
181 mutex_unlock(&scmi_requested_devices_mtx
);
182 blocking_notifier_call_chain(&scmi_requested_devices_nh
,
183 SCMI_BUS_NOTIFY_DEVICE_UNREQUEST
,
184 (void *)victim
->id_table
);
186 mutex_lock(&scmi_requested_devices_mtx
);
191 if (list_empty(phead
)) {
192 idr_remove(&scmi_requested_devices
,
193 id_table
->protocol_id
);
197 mutex_unlock(&scmi_requested_devices_mtx
);
201 scmi_protocol_table_unregister(const struct scmi_device_id
*id_table
)
203 const struct scmi_device_id
*entry
;
205 for (entry
= id_table
; entry
->name
; entry
++)
206 scmi_protocol_device_unrequest(entry
);
209 static const struct scmi_device_id
*
210 scmi_dev_match_id(struct scmi_device
*scmi_dev
, const struct scmi_driver
*scmi_drv
)
212 const struct scmi_device_id
*id
= scmi_drv
->id_table
;
217 for (; id
->protocol_id
; id
++)
218 if (id
->protocol_id
== scmi_dev
->protocol_id
) {
221 else if (!strcmp(id
->name
, scmi_dev
->name
))
228 static int scmi_dev_match(struct device
*dev
, const struct device_driver
*drv
)
230 const struct scmi_driver
*scmi_drv
= to_scmi_driver(drv
);
231 struct scmi_device
*scmi_dev
= to_scmi_dev(dev
);
232 const struct scmi_device_id
*id
;
234 id
= scmi_dev_match_id(scmi_dev
, scmi_drv
);
241 static int scmi_match_by_id_table(struct device
*dev
, void *data
)
243 struct scmi_device
*sdev
= to_scmi_dev(dev
);
244 struct scmi_device_id
*id_table
= data
;
246 return sdev
->protocol_id
== id_table
->protocol_id
&&
247 (id_table
->name
&& !strcmp(sdev
->name
, id_table
->name
));
250 static struct scmi_device
*scmi_child_dev_find(struct device
*parent
,
251 int prot_id
, const char *name
)
253 struct scmi_device_id id_table
;
256 id_table
.protocol_id
= prot_id
;
257 id_table
.name
= name
;
259 dev
= device_find_child(parent
, &id_table
, scmi_match_by_id_table
);
263 return to_scmi_dev(dev
);
266 static int scmi_dev_probe(struct device
*dev
)
268 struct scmi_driver
*scmi_drv
= to_scmi_driver(dev
->driver
);
269 struct scmi_device
*scmi_dev
= to_scmi_dev(dev
);
271 if (!scmi_dev
->handle
)
272 return -EPROBE_DEFER
;
274 return scmi_drv
->probe(scmi_dev
);
277 static void scmi_dev_remove(struct device
*dev
)
279 struct scmi_driver
*scmi_drv
= to_scmi_driver(dev
->driver
);
280 struct scmi_device
*scmi_dev
= to_scmi_dev(dev
);
282 if (scmi_drv
->remove
)
283 scmi_drv
->remove(scmi_dev
);
286 const struct bus_type scmi_bus_type
= {
287 .name
= "scmi_protocol",
288 .match
= scmi_dev_match
,
289 .probe
= scmi_dev_probe
,
290 .remove
= scmi_dev_remove
,
292 EXPORT_SYMBOL_GPL(scmi_bus_type
);
294 int scmi_driver_register(struct scmi_driver
*driver
, struct module
*owner
,
295 const char *mod_name
)
302 retval
= scmi_protocol_table_register(driver
->id_table
);
306 driver
->driver
.bus
= &scmi_bus_type
;
307 driver
->driver
.name
= driver
->name
;
308 driver
->driver
.owner
= owner
;
309 driver
->driver
.mod_name
= mod_name
;
311 retval
= driver_register(&driver
->driver
);
313 pr_debug("Registered new scmi driver %s\n", driver
->name
);
317 EXPORT_SYMBOL_GPL(scmi_driver_register
);
319 void scmi_driver_unregister(struct scmi_driver
*driver
)
321 driver_unregister(&driver
->driver
);
322 scmi_protocol_table_unregister(driver
->id_table
);
324 EXPORT_SYMBOL_GPL(scmi_driver_unregister
);
326 static void scmi_device_release(struct device
*dev
)
328 struct scmi_device
*scmi_dev
= to_scmi_dev(dev
);
330 kfree_const(scmi_dev
->name
);
334 static void __scmi_device_destroy(struct scmi_device
*scmi_dev
)
336 pr_debug("(%s) Destroying SCMI device '%s' for protocol 0x%x (%s)\n",
337 of_node_full_name(scmi_dev
->dev
.parent
->of_node
),
338 dev_name(&scmi_dev
->dev
), scmi_dev
->protocol_id
,
341 if (scmi_dev
->protocol_id
== SCMI_PROTOCOL_SYSTEM
)
342 atomic_set(&scmi_syspower_registered
, 0);
344 ida_free(&scmi_bus_id
, scmi_dev
->id
);
345 device_unregister(&scmi_dev
->dev
);
348 static struct scmi_device
*
349 __scmi_device_create(struct device_node
*np
, struct device
*parent
,
350 int protocol
, const char *name
)
353 struct scmi_device
*scmi_dev
;
356 * If the same protocol/name device already exist under the same parent
357 * (i.e. SCMI instance) just return the existent device.
358 * This avoids any race between the SCMI driver, creating devices for
359 * each DT defined protocol at probe time, and the concurrent
360 * registration of SCMI drivers.
362 scmi_dev
= scmi_child_dev_find(parent
, protocol
, name
);
367 * Ignore any possible subsequent failures while creating the device
368 * since we are doomed anyway at that point; not using a mutex which
369 * spans across this whole function to keep things simple and to avoid
370 * to serialize all the __scmi_device_create calls across possibly
371 * different SCMI server instances (parent)
373 if (protocol
== SCMI_PROTOCOL_SYSTEM
&&
374 atomic_cmpxchg(&scmi_syspower_registered
, 0, 1)) {
376 "SCMI SystemPower protocol device must be unique !\n");
380 scmi_dev
= kzalloc(sizeof(*scmi_dev
), GFP_KERNEL
);
384 scmi_dev
->name
= kstrdup_const(name
?: "unknown", GFP_KERNEL
);
385 if (!scmi_dev
->name
) {
390 id
= ida_alloc_min(&scmi_bus_id
, 1, GFP_KERNEL
);
392 kfree_const(scmi_dev
->name
);
398 scmi_dev
->protocol_id
= protocol
;
399 scmi_dev
->dev
.parent
= parent
;
400 device_set_node(&scmi_dev
->dev
, of_fwnode_handle(np
));
401 scmi_dev
->dev
.bus
= &scmi_bus_type
;
402 scmi_dev
->dev
.release
= scmi_device_release
;
403 dev_set_name(&scmi_dev
->dev
, "scmi_dev.%d", id
);
405 retval
= device_register(&scmi_dev
->dev
);
409 pr_debug("(%s) Created SCMI device '%s' for protocol 0x%x (%s)\n",
410 of_node_full_name(parent
->of_node
),
411 dev_name(&scmi_dev
->dev
), protocol
, name
);
415 put_device(&scmi_dev
->dev
);
416 ida_free(&scmi_bus_id
, id
);
421 * scmi_device_create - A method to create one or more SCMI devices
423 * @np: A reference to the device node to use for the new device(s)
424 * @parent: The parent device to use identifying a specific SCMI instance
425 * @protocol: The SCMI protocol to be associated with this device
426 * @name: The requested-name of the device to be created; this is optional
427 * and if no @name is provided, all the devices currently known to
428 * be requested on the SCMI bus for @protocol will be created.
430 * This method can be invoked to create a single well-defined device (like
431 * a transport device or a device requested by an SCMI driver loaded after
432 * the core SCMI stack has been probed), or to create all the devices currently
433 * known to have been requested by the loaded SCMI drivers for a specific
434 * protocol (typically during SCMI core protocol enumeration at probe time).
436 * Return: The created device (or one of them if @name was NOT provided and
437 * multiple devices were created) or NULL if no device was created;
438 * note that NULL indicates an error ONLY in case a specific @name
439 * was provided: when @name param was not provided, a number of devices
440 * could have been potentially created for a whole protocol, unless no
441 * device was found to have been requested for that specific protocol.
443 struct scmi_device
*scmi_device_create(struct device_node
*np
,
444 struct device
*parent
, int protocol
,
447 struct list_head
*phead
;
448 struct scmi_requested_dev
*rdev
;
449 struct scmi_device
*scmi_dev
= NULL
;
452 return __scmi_device_create(np
, parent
, protocol
, name
);
454 mutex_lock(&scmi_requested_devices_mtx
);
455 phead
= idr_find(&scmi_requested_devices
, protocol
);
458 mutex_unlock(&scmi_requested_devices_mtx
);
462 /* Walk the list of requested devices for protocol and create them */
463 list_for_each_entry(rdev
, phead
, node
) {
464 struct scmi_device
*sdev
;
466 sdev
= __scmi_device_create(np
, parent
,
467 rdev
->id_table
->protocol_id
,
468 rdev
->id_table
->name
);
469 /* Report errors and carry on... */
473 pr_err("(%s) Failed to create device for protocol 0x%x (%s)\n",
474 of_node_full_name(parent
->of_node
),
475 rdev
->id_table
->protocol_id
,
476 rdev
->id_table
->name
);
478 mutex_unlock(&scmi_requested_devices_mtx
);
482 EXPORT_SYMBOL_GPL(scmi_device_create
);
484 void scmi_device_destroy(struct device
*parent
, int protocol
, const char *name
)
486 struct scmi_device
*scmi_dev
;
488 scmi_dev
= scmi_child_dev_find(parent
, protocol
, name
);
490 __scmi_device_destroy(scmi_dev
);
492 EXPORT_SYMBOL_GPL(scmi_device_destroy
);
494 static int __scmi_devices_unregister(struct device
*dev
, void *data
)
496 struct scmi_device
*scmi_dev
= to_scmi_dev(dev
);
498 __scmi_device_destroy(scmi_dev
);
502 static void scmi_devices_unregister(void)
504 bus_for_each_dev(&scmi_bus_type
, NULL
, NULL
, __scmi_devices_unregister
);
507 static int __init
scmi_bus_init(void)
511 retval
= bus_register(&scmi_bus_type
);
513 pr_err("SCMI protocol bus register failed (%d)\n", retval
);
515 pr_info("SCMI protocol bus registered\n");
519 subsys_initcall(scmi_bus_init
);
521 static void __exit
scmi_bus_exit(void)
524 * Destroy all remaining devices: just in case the drivers were
525 * manually unbound and at first and then the modules unloaded.
527 scmi_devices_unregister();
528 bus_unregister(&scmi_bus_type
);
529 ida_destroy(&scmi_bus_id
);
531 module_exit(scmi_bus_exit
);
533 MODULE_ALIAS("scmi-core");
534 MODULE_AUTHOR("Sudeep Holla <sudeep.holla@arm.com>");
535 MODULE_DESCRIPTION("ARM SCMI protocol bus");
536 MODULE_LICENSE("GPL");