xref: /freebsd-src/sys/dev/firmware/arm/scmi.h (revision e6d0edd2fe8c3c15faa7c9c66703efa007a5fbe1)
154b96380SRuslan Bukin /*-
254b96380SRuslan Bukin  * SPDX-License-Identifier: BSD-2-Clause
354b96380SRuslan Bukin  *
454b96380SRuslan Bukin  * Copyright (c) 2022 Ruslan Bukin <br@bsdpad.com>
5d220b1cfSCristian Marussi  * Copyright (c) 2023 Arm Ltd
654b96380SRuslan Bukin  *
754b96380SRuslan Bukin  * This work was supported by Innovate UK project 105694, "Digital Security
854b96380SRuslan Bukin  * by Design (DSbD) Technology Platform Prototype".
954b96380SRuslan Bukin  *
1054b96380SRuslan Bukin  * Redistribution and use in source and binary forms, with or without
1154b96380SRuslan Bukin  * modification, are permitted provided that the following conditions
1254b96380SRuslan Bukin  * are met:
1354b96380SRuslan Bukin  * 1. Redistributions of source code must retain the above copyright
1454b96380SRuslan Bukin  *    notice, this list of conditions and the following disclaimer.
1554b96380SRuslan Bukin  * 2. Redistributions in binary form must reproduce the above copyright
1654b96380SRuslan Bukin  *    notice, this list of conditions and the following disclaimer in the
1754b96380SRuslan Bukin  *    documentation and/or other materials provided with the distribution.
1854b96380SRuslan Bukin  *
1954b96380SRuslan Bukin  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
2054b96380SRuslan Bukin  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2154b96380SRuslan Bukin  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2254b96380SRuslan Bukin  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
2354b96380SRuslan Bukin  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2454b96380SRuslan Bukin  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2554b96380SRuslan Bukin  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2654b96380SRuslan Bukin  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2754b96380SRuslan Bukin  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2854b96380SRuslan Bukin  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2954b96380SRuslan Bukin  * SUCH DAMAGE.
3054b96380SRuslan Bukin  */
3154b96380SRuslan Bukin 
3254b96380SRuslan Bukin #ifndef	_ARM64_SCMI_SCMI_H_
3354b96380SRuslan Bukin #define	_ARM64_SCMI_SCMI_H_
3454b96380SRuslan Bukin 
35*e6d0edd2SCristian Marussi #include <sys/sysctl.h>
36*e6d0edd2SCristian Marussi 
37d46f01fdSAndrew Turner #include "scmi_if.h"
38d46f01fdSAndrew Turner 
39103ea03eSCristian Marussi #define SCMI_DEF_MAX_MSG		32
40103ea03eSCristian Marussi #define SCMI_DEF_MAX_MSG_PAYLD_SIZE	128
41103ea03eSCristian Marussi 
42103ea03eSCristian Marussi #define SCMI_MAX_MSG_PAYLD_SIZE(sc)	((sc)->trs_desc.max_payld_sz + sizeof(uint32_t))
43103ea03eSCristian Marussi #define SCMI_MAX_MSG_REPLY_SIZE(sc)	(SCMI_MAX_MSG_PAYLD_SIZE((sc)) + sizeof(uint32_t))
44103ea03eSCristian Marussi #define SCMI_MAX_MSG_SIZE(sc)		(SCMI_MAX_MSG_REPLY_SIZE(sc) + sizeof(uint32_t))
45103ea03eSCristian Marussi #define SCMI_MAX_MSG(sc)		((sc)->trs_desc.max_msg)
46103ea03eSCristian Marussi #define SCMI_MAX_MSG_TIMEOUT_MS(sc)	((sc)->trs_desc.reply_timo_ms)
47d220b1cfSCristian Marussi 
48d220b1cfSCristian Marussi enum scmi_chan {
49d220b1cfSCristian Marussi 	SCMI_CHAN_A2P,
50d220b1cfSCristian Marussi 	SCMI_CHAN_P2A,
51d220b1cfSCristian Marussi 	SCMI_CHAN_MAX
52d220b1cfSCristian Marussi };
53d220b1cfSCristian Marussi 
543595f18fSCristian Marussi struct scmi_transport_desc {
553595f18fSCristian Marussi 	bool no_completion_irq;
56103ea03eSCristian Marussi 	unsigned int max_msg;
57103ea03eSCristian Marussi 	unsigned int max_payld_sz;
583595f18fSCristian Marussi 	unsigned int reply_timo_ms;
593595f18fSCristian Marussi };
603595f18fSCristian Marussi 
613595f18fSCristian Marussi struct scmi_transport;
623595f18fSCristian Marussi 
63d46f01fdSAndrew Turner struct scmi_softc {
64d46f01fdSAndrew Turner 	struct simplebus_softc		simplebus_sc;
65d46f01fdSAndrew Turner 	device_t			dev;
66d46f01fdSAndrew Turner 	struct mtx			mtx;
673595f18fSCristian Marussi 	struct scmi_transport_desc	trs_desc;
683595f18fSCristian Marussi 	struct scmi_transport		*trs;
69*e6d0edd2SCristian Marussi 	struct sysctl_oid		*sysctl_root;
70d46f01fdSAndrew Turner };
71d46f01fdSAndrew Turner 
7235f93203SCristian Marussi struct scmi_msg {
7335f93203SCristian Marussi 	bool		polling;
74a87dd741SCristian Marussi 	int		poll_done;
7535f93203SCristian Marussi 	uint32_t	tx_len;
7635f93203SCristian Marussi 	uint32_t	rx_len;
7735f93203SCristian Marussi #define SCMI_MSG_HDR_SIZE	(sizeof(uint32_t))
7835f93203SCristian Marussi 	uint32_t	hdr;
7935f93203SCristian Marussi 	uint8_t		payld[];
8054b96380SRuslan Bukin };
81a87dd741SCristian Marussi #define hdr_to_msg(h)	__containerof((h), struct scmi_msg, hdr)
8254b96380SRuslan Bukin 
8335f93203SCristian Marussi void *scmi_buf_get(device_t dev, uint8_t protocol_id, uint8_t message_id,
8435f93203SCristian Marussi 		   int tx_payd_sz, int rx_payld_sz);
8535f93203SCristian Marussi void scmi_buf_put(device_t dev, void *buf);
86e887179dSCristian Marussi struct scmi_msg *scmi_msg_get(device_t dev, int tx_payld_sz, int rx_payld_sz);
87e887179dSCristian Marussi void scmi_msg_put(device_t dev, struct scmi_msg *msg);
8835f93203SCristian Marussi int scmi_request(device_t dev, void *in, void **);
89341d8fd9SCristian Marussi int scmi_request_tx(device_t dev, void *in);
90b802926bSCristian Marussi int scmi_msg_async_enqueue(struct scmi_msg *msg);
919342829dSCristian Marussi void scmi_rx_irq_callback(device_t dev, void *chan, uint32_t hdr, uint32_t rx_len);
923595f18fSCristian Marussi 
93d46f01fdSAndrew Turner DECLARE_CLASS(scmi_driver);
94d46f01fdSAndrew Turner 
95d46f01fdSAndrew Turner int scmi_attach(device_t dev);
96d46f01fdSAndrew Turner 
9754b96380SRuslan Bukin #endif /* !_ARM64_SCMI_SCMI_H_ */
98