xref: /linux/drivers/firmware/arm_scmi/reset.c (revision b8979c6b4d0d1b36e94f5bc483fd86e38107e554)
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