195a15d80SSudeep Holla // SPDX-License-Identifier: GPL-2.0 295a15d80SSudeep Holla /* 395a15d80SSudeep Holla * System Control and Management Interface (SCMI) Reset Protocol 495a15d80SSudeep Holla * 523136bffSCristian Marussi * Copyright (C) 2019-2022 ARM Ltd. 695a15d80SSudeep Holla */ 795a15d80SSudeep Holla 8469ca182SCristian Marussi #define pr_fmt(fmt) "SCMI Notifications RESET - " fmt 9469ca182SCristian Marussi 10f5800e0bSCristian Marussi #include <linux/module.h> 11469ca182SCristian Marussi #include <linux/scmi_protocol.h> 12469ca182SCristian Marussi 1323136bffSCristian Marussi #include "protocols.h" 14469ca182SCristian Marussi #include "notify.h" 1595a15d80SSudeep Holla 16b5efc28aSCristian Marussi /* Updated only after ALL the mandatory features for that version are merged */ 17*be9f0865SCristian Marussi #define SCMI_PROTOCOL_SUPPORTED_VERSION 0x30001 18b5efc28aSCristian Marussi 1995a15d80SSudeep Holla enum scmi_reset_protocol_cmd { 2095a15d80SSudeep Holla RESET_DOMAIN_ATTRIBUTES = 0x3, 2195a15d80SSudeep Holla RESET = 0x4, 2295a15d80SSudeep Holla RESET_NOTIFY = 0x5, 23b260fccaSCristian Marussi RESET_DOMAIN_NAME_GET = 0x6, 2495a15d80SSudeep Holla }; 2595a15d80SSudeep Holla 2695a15d80SSudeep Holla #define NUM_RESET_DOMAIN_MASK 0xffff 2795a15d80SSudeep Holla #define RESET_NOTIFY_ENABLE BIT(0) 2895a15d80SSudeep Holla 2995a15d80SSudeep Holla struct scmi_msg_resp_reset_domain_attributes { 3095a15d80SSudeep Holla __le32 attributes; 3195a15d80SSudeep Holla #define SUPPORTS_ASYNC_RESET(x) ((x) & BIT(31)) 3295a15d80SSudeep Holla #define SUPPORTS_NOTIFY_RESET(x) ((x) & BIT(30)) 33b260fccaSCristian Marussi #define SUPPORTS_EXTENDED_NAMES(x) ((x) & BIT(29)) 3495a15d80SSudeep Holla __le32 latency; 35b260fccaSCristian Marussi u8 name[SCMI_SHORT_NAME_MAX_SIZE]; 3695a15d80SSudeep Holla }; 3795a15d80SSudeep Holla 3895a15d80SSudeep Holla struct scmi_msg_reset_domain_reset { 3995a15d80SSudeep Holla __le32 domain_id; 4095a15d80SSudeep Holla __le32 flags; 4195a15d80SSudeep Holla #define AUTONOMOUS_RESET BIT(0) 4295a15d80SSudeep Holla #define EXPLICIT_RESET_ASSERT BIT(1) 4395a15d80SSudeep Holla #define ASYNCHRONOUS_RESET BIT(2) 4495a15d80SSudeep Holla __le32 reset_state; 4545b9e04dSEtienne Carriere #define ARCH_COLD_RESET 0 4695a15d80SSudeep Holla }; 4795a15d80SSudeep Holla 48469ca182SCristian Marussi struct scmi_msg_reset_notify { 49469ca182SCristian Marussi __le32 id; 50469ca182SCristian Marussi __le32 event_control; 51469ca182SCristian Marussi #define RESET_TP_NOTIFY_ALL BIT(0) 52469ca182SCristian Marussi }; 53469ca182SCristian Marussi 54469ca182SCristian Marussi struct scmi_reset_issued_notify_payld { 55469ca182SCristian Marussi __le32 agent_id; 56469ca182SCristian Marussi __le32 domain_id; 57469ca182SCristian Marussi __le32 reset_state; 58469ca182SCristian Marussi }; 59469ca182SCristian Marussi 6095a15d80SSudeep Holla struct reset_dom_info { 6195a15d80SSudeep Holla bool async_reset; 6295a15d80SSudeep Holla bool reset_notify; 6395a15d80SSudeep Holla u32 latency_us; 6495a15d80SSudeep Holla char name[SCMI_MAX_STR_SIZE]; 6595a15d80SSudeep Holla }; 6695a15d80SSudeep Holla 6795a15d80SSudeep Holla struct scmi_reset_info { 68b55b06b7SSudeep Holla u32 version; 6995a15d80SSudeep Holla int num_domains; 7012d6a03fSCristian Marussi bool notify_reset_cmd; 7195a15d80SSudeep Holla struct reset_dom_info *dom_info; 7295a15d80SSudeep Holla }; 7395a15d80SSudeep Holla 747e029344SCristian Marussi static int scmi_reset_attributes_get(const struct scmi_protocol_handle *ph, 7595a15d80SSudeep Holla struct scmi_reset_info *pi) 7695a15d80SSudeep Holla { 7795a15d80SSudeep Holla int ret; 7895a15d80SSudeep Holla struct scmi_xfer *t; 7995a15d80SSudeep Holla u32 attr; 8095a15d80SSudeep Holla 817e029344SCristian Marussi ret = ph->xops->xfer_get_init(ph, PROTOCOL_ATTRIBUTES, 827e029344SCristian Marussi 0, sizeof(attr), &t); 8395a15d80SSudeep Holla if (ret) 8495a15d80SSudeep Holla return ret; 8595a15d80SSudeep Holla 867e029344SCristian Marussi ret = ph->xops->do_xfer(ph, t); 8795a15d80SSudeep Holla if (!ret) { 8895a15d80SSudeep Holla attr = get_unaligned_le32(t->rx.buf); 8995a15d80SSudeep Holla pi->num_domains = attr & NUM_RESET_DOMAIN_MASK; 9095a15d80SSudeep Holla } 9195a15d80SSudeep Holla 927e029344SCristian Marussi ph->xops->xfer_put(ph, t); 9312d6a03fSCristian Marussi 9412d6a03fSCristian Marussi if (!ret) 9512d6a03fSCristian Marussi if (!ph->hops->protocol_msg_check(ph, RESET_NOTIFY, NULL)) 9612d6a03fSCristian Marussi pi->notify_reset_cmd = true; 9712d6a03fSCristian Marussi 9895a15d80SSudeep Holla return ret; 9995a15d80SSudeep Holla } 10095a15d80SSudeep Holla 10195a15d80SSudeep Holla static int 1027e029344SCristian Marussi scmi_reset_domain_attributes_get(const struct scmi_protocol_handle *ph, 10312d6a03fSCristian Marussi struct scmi_reset_info *pinfo, 10412d6a03fSCristian Marussi u32 domain, u32 version) 10595a15d80SSudeep Holla { 10695a15d80SSudeep Holla int ret; 107b260fccaSCristian Marussi u32 attributes; 10895a15d80SSudeep Holla struct scmi_xfer *t; 10995a15d80SSudeep Holla struct scmi_msg_resp_reset_domain_attributes *attr; 11012d6a03fSCristian Marussi struct reset_dom_info *dom_info = pinfo->dom_info + domain; 11195a15d80SSudeep Holla 1127e029344SCristian Marussi ret = ph->xops->xfer_get_init(ph, RESET_DOMAIN_ATTRIBUTES, 1137e029344SCristian Marussi sizeof(domain), sizeof(*attr), &t); 11495a15d80SSudeep Holla if (ret) 11595a15d80SSudeep Holla return ret; 11695a15d80SSudeep Holla 11795a15d80SSudeep Holla put_unaligned_le32(domain, t->tx.buf); 11895a15d80SSudeep Holla attr = t->rx.buf; 11995a15d80SSudeep Holla 1207e029344SCristian Marussi ret = ph->xops->do_xfer(ph, t); 12195a15d80SSudeep Holla if (!ret) { 122b260fccaSCristian Marussi attributes = le32_to_cpu(attr->attributes); 12395a15d80SSudeep Holla 12495a15d80SSudeep Holla dom_info->async_reset = SUPPORTS_ASYNC_RESET(attributes); 12512d6a03fSCristian Marussi if (pinfo->notify_reset_cmd) 12612d6a03fSCristian Marussi dom_info->reset_notify = 12712d6a03fSCristian Marussi SUPPORTS_NOTIFY_RESET(attributes); 12895a15d80SSudeep Holla dom_info->latency_us = le32_to_cpu(attr->latency); 12995a15d80SSudeep Holla if (dom_info->latency_us == U32_MAX) 13095a15d80SSudeep Holla dom_info->latency_us = 0; 1314314f9f4SCristian Marussi strscpy(dom_info->name, attr->name, SCMI_SHORT_NAME_MAX_SIZE); 13295a15d80SSudeep Holla } 13395a15d80SSudeep Holla 1347e029344SCristian Marussi ph->xops->xfer_put(ph, t); 135b260fccaSCristian Marussi 136b260fccaSCristian Marussi /* 137b260fccaSCristian Marussi * If supported overwrite short name with the extended one; 138b260fccaSCristian Marussi * on error just carry on and use already provided short name. 139b260fccaSCristian Marussi */ 140b260fccaSCristian Marussi if (!ret && PROTOCOL_REV_MAJOR(version) >= 0x3 && 141b260fccaSCristian Marussi SUPPORTS_EXTENDED_NAMES(attributes)) 142b260fccaSCristian Marussi ph->hops->extended_name_get(ph, RESET_DOMAIN_NAME_GET, domain, 143e4e6e8f1SCristian Marussi NULL, dom_info->name, 144e4e6e8f1SCristian Marussi SCMI_MAX_STR_SIZE); 145b260fccaSCristian Marussi 14695a15d80SSudeep Holla return ret; 14795a15d80SSudeep Holla } 14895a15d80SSudeep Holla 1497e029344SCristian Marussi static int scmi_reset_num_domains_get(const struct scmi_protocol_handle *ph) 15095a15d80SSudeep Holla { 1517e029344SCristian Marussi struct scmi_reset_info *pi = ph->get_priv(ph); 15295a15d80SSudeep Holla 15395a15d80SSudeep Holla return pi->num_domains; 15495a15d80SSudeep Holla } 15595a15d80SSudeep Holla 156992be5d3SCristian Marussi static const char * 157992be5d3SCristian Marussi scmi_reset_name_get(const struct scmi_protocol_handle *ph, u32 domain) 1587e029344SCristian Marussi { 1597e029344SCristian Marussi struct scmi_reset_info *pi = ph->get_priv(ph); 1607e029344SCristian Marussi 16195a15d80SSudeep Holla struct reset_dom_info *dom = pi->dom_info + domain; 16295a15d80SSudeep Holla 16395a15d80SSudeep Holla return dom->name; 16495a15d80SSudeep Holla } 16595a15d80SSudeep Holla 1667e029344SCristian Marussi static int scmi_reset_latency_get(const struct scmi_protocol_handle *ph, 1677e029344SCristian Marussi u32 domain) 1687e029344SCristian Marussi { 1697e029344SCristian Marussi struct scmi_reset_info *pi = ph->get_priv(ph); 17095a15d80SSudeep Holla struct reset_dom_info *dom = pi->dom_info + domain; 17195a15d80SSudeep Holla 17295a15d80SSudeep Holla return dom->latency_us; 17395a15d80SSudeep Holla } 17495a15d80SSudeep Holla 1757e029344SCristian Marussi static int scmi_domain_reset(const struct scmi_protocol_handle *ph, u32 domain, 17695a15d80SSudeep Holla u32 flags, u32 state) 17795a15d80SSudeep Holla { 17895a15d80SSudeep Holla int ret; 17995a15d80SSudeep Holla struct scmi_xfer *t; 18095a15d80SSudeep Holla struct scmi_msg_reset_domain_reset *dom; 1817e029344SCristian Marussi struct scmi_reset_info *pi = ph->get_priv(ph); 182e9076ffbSCristian Marussi struct reset_dom_info *rdom; 18395a15d80SSudeep Holla 184e9076ffbSCristian Marussi if (domain >= pi->num_domains) 185e9076ffbSCristian Marussi return -EINVAL; 186e9076ffbSCristian Marussi 187e9076ffbSCristian Marussi rdom = pi->dom_info + domain; 188b75c83d9SCristian Marussi if (rdom->async_reset && flags & AUTONOMOUS_RESET) 18995a15d80SSudeep Holla flags |= ASYNCHRONOUS_RESET; 19095a15d80SSudeep Holla 1917e029344SCristian Marussi ret = ph->xops->xfer_get_init(ph, RESET, sizeof(*dom), 0, &t); 19295a15d80SSudeep Holla if (ret) 19395a15d80SSudeep Holla return ret; 19495a15d80SSudeep Holla 19595a15d80SSudeep Holla dom = t->tx.buf; 19695a15d80SSudeep Holla dom->domain_id = cpu_to_le32(domain); 19795a15d80SSudeep Holla dom->flags = cpu_to_le32(flags); 19811ed5cf0SSudeep Holla dom->reset_state = cpu_to_le32(state); 19995a15d80SSudeep Holla 200b75c83d9SCristian Marussi if (flags & ASYNCHRONOUS_RESET) 2017e029344SCristian Marussi ret = ph->xops->do_xfer_with_response(ph, t); 20295a15d80SSudeep Holla else 2037e029344SCristian Marussi ret = ph->xops->do_xfer(ph, t); 20495a15d80SSudeep Holla 2057e029344SCristian Marussi ph->xops->xfer_put(ph, t); 20695a15d80SSudeep Holla return ret; 20795a15d80SSudeep Holla } 20895a15d80SSudeep Holla 2097e029344SCristian Marussi static int scmi_reset_domain_reset(const struct scmi_protocol_handle *ph, 2107e029344SCristian Marussi u32 domain) 21195a15d80SSudeep Holla { 2127e029344SCristian Marussi return scmi_domain_reset(ph, domain, AUTONOMOUS_RESET, 2137e029344SCristian Marussi ARCH_COLD_RESET); 2147e029344SCristian Marussi } 2157e029344SCristian Marussi 2167e029344SCristian Marussi static int 2177e029344SCristian Marussi scmi_reset_domain_assert(const struct scmi_protocol_handle *ph, u32 domain) 2187e029344SCristian Marussi { 2197e029344SCristian Marussi return scmi_domain_reset(ph, domain, EXPLICIT_RESET_ASSERT, 22095a15d80SSudeep Holla ARCH_COLD_RESET); 22195a15d80SSudeep Holla } 22295a15d80SSudeep Holla 22395a15d80SSudeep Holla static int 2247e029344SCristian Marussi scmi_reset_domain_deassert(const struct scmi_protocol_handle *ph, u32 domain) 22595a15d80SSudeep Holla { 2267e029344SCristian Marussi return scmi_domain_reset(ph, domain, 0, ARCH_COLD_RESET); 2277e029344SCristian Marussi } 2287e029344SCristian Marussi 2297e029344SCristian Marussi static const struct scmi_reset_proto_ops reset_proto_ops = { 23095a15d80SSudeep Holla .num_domains_get = scmi_reset_num_domains_get, 23195a15d80SSudeep Holla .name_get = scmi_reset_name_get, 23295a15d80SSudeep Holla .latency_get = scmi_reset_latency_get, 23395a15d80SSudeep Holla .reset = scmi_reset_domain_reset, 23495a15d80SSudeep Holla .assert = scmi_reset_domain_assert, 23595a15d80SSudeep Holla .deassert = scmi_reset_domain_deassert, 23695a15d80SSudeep Holla }; 23795a15d80SSudeep Holla 23812d6a03fSCristian Marussi static bool scmi_reset_notify_supported(const struct scmi_protocol_handle *ph, 23912d6a03fSCristian Marussi u8 evt_id, u32 src_id) 24012d6a03fSCristian Marussi { 24112d6a03fSCristian Marussi struct reset_dom_info *dom; 24212d6a03fSCristian Marussi struct scmi_reset_info *pi = ph->get_priv(ph); 24312d6a03fSCristian Marussi 24412d6a03fSCristian Marussi if (evt_id != SCMI_EVENT_RESET_ISSUED || src_id >= pi->num_domains) 24512d6a03fSCristian Marussi return false; 24612d6a03fSCristian Marussi 24712d6a03fSCristian Marussi dom = pi->dom_info + src_id; 24812d6a03fSCristian Marussi 24912d6a03fSCristian Marussi return dom->reset_notify; 25012d6a03fSCristian Marussi } 25112d6a03fSCristian Marussi 2527e029344SCristian Marussi static int scmi_reset_notify(const struct scmi_protocol_handle *ph, 2537e029344SCristian Marussi u32 domain_id, bool enable) 254469ca182SCristian Marussi { 255469ca182SCristian Marussi int ret; 256469ca182SCristian Marussi u32 evt_cntl = enable ? RESET_TP_NOTIFY_ALL : 0; 257469ca182SCristian Marussi struct scmi_xfer *t; 258469ca182SCristian Marussi struct scmi_msg_reset_notify *cfg; 259469ca182SCristian Marussi 2607e029344SCristian Marussi ret = ph->xops->xfer_get_init(ph, RESET_NOTIFY, sizeof(*cfg), 0, &t); 261469ca182SCristian Marussi if (ret) 262469ca182SCristian Marussi return ret; 263469ca182SCristian Marussi 264469ca182SCristian Marussi cfg = t->tx.buf; 265469ca182SCristian Marussi cfg->id = cpu_to_le32(domain_id); 266469ca182SCristian Marussi cfg->event_control = cpu_to_le32(evt_cntl); 267469ca182SCristian Marussi 2687e029344SCristian Marussi ret = ph->xops->do_xfer(ph, t); 269469ca182SCristian Marussi 2707e029344SCristian Marussi ph->xops->xfer_put(ph, t); 271469ca182SCristian Marussi return ret; 272469ca182SCristian Marussi } 273469ca182SCristian Marussi 2743cb8c95fSCristian Marussi static int scmi_reset_set_notify_enabled(const struct scmi_protocol_handle *ph, 275469ca182SCristian Marussi u8 evt_id, u32 src_id, bool enable) 276469ca182SCristian Marussi { 277469ca182SCristian Marussi int ret; 278469ca182SCristian Marussi 2797e029344SCristian Marussi ret = scmi_reset_notify(ph, src_id, enable); 280469ca182SCristian Marussi if (ret) 281469ca182SCristian Marussi pr_debug("FAIL_ENABLED - evt[%X] dom[%d] - ret:%d\n", 282469ca182SCristian Marussi evt_id, src_id, ret); 283469ca182SCristian Marussi 284469ca182SCristian Marussi return ret; 285469ca182SCristian Marussi } 286469ca182SCristian Marussi 2873cb8c95fSCristian Marussi static void * 2883cb8c95fSCristian Marussi scmi_reset_fill_custom_report(const struct scmi_protocol_handle *ph, 28972a5eb9dSCristian Marussi u8 evt_id, ktime_t timestamp, 290469ca182SCristian Marussi const void *payld, size_t payld_sz, 291469ca182SCristian Marussi void *report, u32 *src_id) 292469ca182SCristian Marussi { 293469ca182SCristian Marussi const struct scmi_reset_issued_notify_payld *p = payld; 294469ca182SCristian Marussi struct scmi_reset_issued_report *r = report; 295469ca182SCristian Marussi 296469ca182SCristian Marussi if (evt_id != SCMI_EVENT_RESET_ISSUED || sizeof(*p) != payld_sz) 297469ca182SCristian Marussi return NULL; 298469ca182SCristian Marussi 299469ca182SCristian Marussi r->timestamp = timestamp; 300469ca182SCristian Marussi r->agent_id = le32_to_cpu(p->agent_id); 301469ca182SCristian Marussi r->domain_id = le32_to_cpu(p->domain_id); 302469ca182SCristian Marussi r->reset_state = le32_to_cpu(p->reset_state); 303469ca182SCristian Marussi *src_id = r->domain_id; 304469ca182SCristian Marussi 305469ca182SCristian Marussi return r; 306469ca182SCristian Marussi } 307469ca182SCristian Marussi 3083cb8c95fSCristian Marussi static int scmi_reset_get_num_sources(const struct scmi_protocol_handle *ph) 309533c7095SCristian Marussi { 3103cb8c95fSCristian Marussi struct scmi_reset_info *pinfo = ph->get_priv(ph); 311533c7095SCristian Marussi 312533c7095SCristian Marussi if (!pinfo) 313533c7095SCristian Marussi return -EINVAL; 314533c7095SCristian Marussi 315533c7095SCristian Marussi return pinfo->num_domains; 316533c7095SCristian Marussi } 317533c7095SCristian Marussi 318469ca182SCristian Marussi static const struct scmi_event reset_events[] = { 319469ca182SCristian Marussi { 320469ca182SCristian Marussi .id = SCMI_EVENT_RESET_ISSUED, 321469ca182SCristian Marussi .max_payld_sz = sizeof(struct scmi_reset_issued_notify_payld), 322469ca182SCristian Marussi .max_report_sz = sizeof(struct scmi_reset_issued_report), 323469ca182SCristian Marussi }, 324469ca182SCristian Marussi }; 325469ca182SCristian Marussi 326469ca182SCristian Marussi static const struct scmi_event_ops reset_event_ops = { 32712d6a03fSCristian Marussi .is_notify_supported = scmi_reset_notify_supported, 328533c7095SCristian Marussi .get_num_sources = scmi_reset_get_num_sources, 329469ca182SCristian Marussi .set_notify_enabled = scmi_reset_set_notify_enabled, 330469ca182SCristian Marussi .fill_custom_report = scmi_reset_fill_custom_report, 331469ca182SCristian Marussi }; 332469ca182SCristian Marussi 333533c7095SCristian Marussi static const struct scmi_protocol_events reset_protocol_events = { 334533c7095SCristian Marussi .queue_sz = SCMI_PROTO_QUEUE_SZ, 335533c7095SCristian Marussi .ops = &reset_event_ops, 336533c7095SCristian Marussi .evts = reset_events, 337533c7095SCristian Marussi .num_events = ARRAY_SIZE(reset_events), 338533c7095SCristian Marussi }; 339533c7095SCristian Marussi 3407e029344SCristian Marussi static int scmi_reset_protocol_init(const struct scmi_protocol_handle *ph) 34195a15d80SSudeep Holla { 3424de1b36fSCristian Marussi int domain, ret; 34395a15d80SSudeep Holla u32 version; 34495a15d80SSudeep Holla struct scmi_reset_info *pinfo; 34595a15d80SSudeep Holla 3464de1b36fSCristian Marussi ret = ph->xops->version_get(ph, &version); 3474de1b36fSCristian Marussi if (ret) 3484de1b36fSCristian Marussi return ret; 34995a15d80SSudeep Holla 3507e029344SCristian Marussi dev_dbg(ph->dev, "Reset Version %d.%d\n", 35195a15d80SSudeep Holla PROTOCOL_REV_MAJOR(version), PROTOCOL_REV_MINOR(version)); 35295a15d80SSudeep Holla 3537e029344SCristian Marussi pinfo = devm_kzalloc(ph->dev, sizeof(*pinfo), GFP_KERNEL); 35495a15d80SSudeep Holla if (!pinfo) 35595a15d80SSudeep Holla return -ENOMEM; 35695a15d80SSudeep Holla 3574de1b36fSCristian Marussi ret = scmi_reset_attributes_get(ph, pinfo); 3584de1b36fSCristian Marussi if (ret) 3594de1b36fSCristian Marussi return ret; 36095a15d80SSudeep Holla 3617e029344SCristian Marussi pinfo->dom_info = devm_kcalloc(ph->dev, pinfo->num_domains, 36295a15d80SSudeep Holla sizeof(*pinfo->dom_info), GFP_KERNEL); 36395a15d80SSudeep Holla if (!pinfo->dom_info) 36495a15d80SSudeep Holla return -ENOMEM; 36595a15d80SSudeep Holla 36612d6a03fSCristian Marussi for (domain = 0; domain < pinfo->num_domains; domain++) 36712d6a03fSCristian Marussi scmi_reset_domain_attributes_get(ph, pinfo, domain, version); 36895a15d80SSudeep Holla 369b55b06b7SSudeep Holla pinfo->version = version; 370b5efc28aSCristian Marussi return ph->set_priv(ph, pinfo, version); 37195a15d80SSudeep Holla } 37295a15d80SSudeep Holla 37348dc16e2SCristian Marussi static const struct scmi_protocol scmi_reset = { 37448dc16e2SCristian Marussi .id = SCMI_PROTOCOL_RESET, 375f5800e0bSCristian Marussi .owner = THIS_MODULE, 3767e029344SCristian Marussi .instance_init = &scmi_reset_protocol_init, 3777e029344SCristian Marussi .ops = &reset_proto_ops, 378533c7095SCristian Marussi .events = &reset_protocol_events, 379b5efc28aSCristian Marussi .supported_version = SCMI_PROTOCOL_SUPPORTED_VERSION, 38048dc16e2SCristian Marussi }; 38148dc16e2SCristian Marussi 38248dc16e2SCristian Marussi DEFINE_SCMI_PROTOCOL_REGISTER_UNREGISTER(reset, scmi_reset) 383