2424#include <linux/io.h>
2525#include <linux/io-64-nonatomic-hi-lo.h>
2626#include <linux/kernel.h>
27+ #include <linux/kmod.h>
2728#include <linux/ktime.h>
2829#include <linux/hashtable.h>
2930#include <linux/list.h>
4344#define CREATE_TRACE_POINTS
4445#include <trace/events/scmi.h>
4546
47+ #define SCMI_VENDOR_MODULE_ALIAS_FMT "scmi-protocol-0x%02x-%s"
48+
4649static DEFINE_IDA (scmi_id );
4750
4851static DEFINE_XARRAY (scmi_protocols );
@@ -275,6 +278,44 @@ scmi_vendor_protocol_lookup(int protocol_id, char *vendor_id,
275278 return proto ;
276279}
277280
281+ static const struct scmi_protocol *
282+ scmi_vendor_protocol_get (int protocol_id , struct scmi_revision_info * version )
283+ {
284+ const struct scmi_protocol * proto ;
285+
286+ proto = scmi_vendor_protocol_lookup (protocol_id , version -> vendor_id ,
287+ version -> sub_vendor_id ,
288+ version -> impl_ver );
289+ if (!proto ) {
290+ int ret ;
291+
292+ pr_debug ("Looking for '" SCMI_VENDOR_MODULE_ALIAS_FMT "'\n" ,
293+ protocol_id , version -> vendor_id );
294+
295+ /* Note that vendor_id is mandatory for vendor protocols */
296+ ret = request_module (SCMI_VENDOR_MODULE_ALIAS_FMT ,
297+ protocol_id , version -> vendor_id );
298+ if (ret ) {
299+ pr_warn ("Problem loading module for protocol 0x%x\n" ,
300+ protocol_id );
301+ return NULL ;
302+ }
303+
304+ /* Lookup again, once modules loaded */
305+ proto = scmi_vendor_protocol_lookup (protocol_id ,
306+ version -> vendor_id ,
307+ version -> sub_vendor_id ,
308+ version -> impl_ver );
309+ }
310+
311+ if (proto )
312+ pr_info ("Loaded SCMI Vendor Protocol 0x%x - %s %s %X\n" ,
313+ protocol_id , proto -> vendor_id ?: "" ,
314+ proto -> sub_vendor_id ?: "" , proto -> impl_ver );
315+
316+ return proto ;
317+ }
318+
278319static const struct scmi_protocol *
279320scmi_protocol_get (int protocol_id , struct scmi_revision_info * version )
280321{
@@ -283,22 +324,15 @@ scmi_protocol_get(int protocol_id, struct scmi_revision_info *version)
283324 if (protocol_id < SCMI_PROTOCOL_VENDOR_BASE )
284325 proto = xa_load (& scmi_protocols , protocol_id );
285326 else
286- proto = scmi_vendor_protocol_lookup (protocol_id ,
287- version -> vendor_id ,
288- version -> sub_vendor_id ,
289- version -> impl_ver );
327+ proto = scmi_vendor_protocol_get (protocol_id , version );
328+
290329 if (!proto || !try_module_get (proto -> owner )) {
291330 pr_warn ("SCMI Protocol 0x%x not found!\n" , protocol_id );
292331 return NULL ;
293332 }
294333
295334 pr_debug ("Found SCMI Protocol 0x%x\n" , protocol_id );
296335
297- if (protocol_id >= SCMI_PROTOCOL_VENDOR_BASE )
298- pr_info ("Loaded SCMI Vendor Protocol 0x%x - %s %s %X\n" ,
299- protocol_id , proto -> vendor_id ?: "" ,
300- proto -> sub_vendor_id ?: "" , proto -> impl_ver );
301-
302336 return proto ;
303337}
304338
@@ -366,7 +400,9 @@ int scmi_protocol_register(const struct scmi_protocol *proto)
366400 return ret ;
367401 }
368402
369- pr_debug ("Registered SCMI Protocol 0x%x\n" , proto -> id );
403+ pr_debug ("Registered SCMI Protocol 0x%x - %s %s 0x%08X\n" ,
404+ proto -> id , proto -> vendor_id , proto -> sub_vendor_id ,
405+ proto -> impl_ver );
370406
371407 return 0 ;
372408}
@@ -3028,7 +3064,7 @@ static const struct scmi_desc *scmi_transport_setup(struct device *dev)
30283064 int ret ;
30293065
30303066 trans = dev_get_platdata (dev );
3031- if (!trans || !trans -> desc || ! trans -> supplier || !trans -> core_ops )
3067+ if (!trans || !trans -> supplier || !trans -> core_ops )
30323068 return NULL ;
30333069
30343070 if (!device_link_add (dev , trans -> supplier , DL_FLAG_AUTOREMOVE_CONSUMER )) {
@@ -3043,33 +3079,33 @@ static const struct scmi_desc *scmi_transport_setup(struct device *dev)
30433079 dev_info (dev , "Using %s\n" , dev_driver_string (trans -> supplier ));
30443080
30453081 ret = of_property_read_u32 (dev -> of_node , "arm,max-rx-timeout-ms" ,
3046- & trans -> desc -> max_rx_timeout_ms );
3082+ & trans -> desc . max_rx_timeout_ms );
30473083 if (ret && ret != - EINVAL )
30483084 dev_err (dev , "Malformed arm,max-rx-timeout-ms DT property.\n" );
30493085
30503086 ret = of_property_read_u32 (dev -> of_node , "arm,max-msg-size" ,
3051- & trans -> desc -> max_msg_size );
3087+ & trans -> desc . max_msg_size );
30523088 if (ret && ret != - EINVAL )
30533089 dev_err (dev , "Malformed arm,max-msg-size DT property.\n" );
30543090
30553091 ret = of_property_read_u32 (dev -> of_node , "arm,max-msg" ,
3056- & trans -> desc -> max_msg );
3092+ & trans -> desc . max_msg );
30573093 if (ret && ret != - EINVAL )
30583094 dev_err (dev , "Malformed arm,max-msg DT property.\n" );
30593095
30603096 dev_info (dev ,
30613097 "SCMI max-rx-timeout: %dms / max-msg-size: %dbytes / max-msg: %d\n" ,
3062- trans -> desc -> max_rx_timeout_ms , trans -> desc -> max_msg_size ,
3063- trans -> desc -> max_msg );
3098+ trans -> desc . max_rx_timeout_ms , trans -> desc . max_msg_size ,
3099+ trans -> desc . max_msg );
30643100
30653101 /* System wide atomic threshold for atomic ops .. if any */
30663102 if (!of_property_read_u32 (dev -> of_node , "atomic-threshold-us" ,
3067- & trans -> desc -> atomic_threshold ))
3103+ & trans -> desc . atomic_threshold ))
30683104 dev_info (dev ,
30693105 "SCMI System wide atomic threshold set to %u us\n" ,
3070- trans -> desc -> atomic_threshold );
3106+ trans -> desc . atomic_threshold );
30713107
3072- return trans -> desc ;
3108+ return & trans -> desc ;
30733109}
30743110
30753111static int scmi_probe (struct platform_device * pdev )
0 commit comments