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