linux/drivers/firmware/arm_scmi/common.h
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * System Control and Management Interface (SCMI) Message Protocol
   4 * driver common header file containing some definitions, structures
   5 * and function prototypes used in all the different SCMI protocols.
   6 *
   7 * Copyright (C) 2018 ARM Ltd.
   8 */
   9
  10#include <linux/bitfield.h>
  11#include <linux/completion.h>
  12#include <linux/device.h>
  13#include <linux/errno.h>
  14#include <linux/kernel.h>
  15#include <linux/scmi_protocol.h>
  16#include <linux/types.h>
  17
  18#define PROTOCOL_REV_MINOR_MASK GENMASK(15, 0)
  19#define PROTOCOL_REV_MAJOR_MASK GENMASK(31, 16)
  20#define PROTOCOL_REV_MAJOR(x)   (u16)(FIELD_GET(PROTOCOL_REV_MAJOR_MASK, (x)))
  21#define PROTOCOL_REV_MINOR(x)   (u16)(FIELD_GET(PROTOCOL_REV_MINOR_MASK, (x)))
  22#define MAX_PROTOCOLS_IMP       16
  23#define MAX_OPPS                16
  24
  25enum scmi_common_cmd {
  26        PROTOCOL_VERSION = 0x0,
  27        PROTOCOL_ATTRIBUTES = 0x1,
  28        PROTOCOL_MESSAGE_ATTRIBUTES = 0x2,
  29};
  30
  31/**
  32 * struct scmi_msg_resp_prot_version - Response for a message
  33 *
  34 * @major_version: Major version of the ABI that firmware supports
  35 * @minor_version: Minor version of the ABI that firmware supports
  36 *
  37 * In general, ABI version changes follow the rule that minor version increments
  38 * are backward compatible. Major revision changes in ABI may not be
  39 * backward compatible.
  40 *
  41 * Response to a generic message with message type SCMI_MSG_VERSION
  42 */
  43struct scmi_msg_resp_prot_version {
  44        __le16 minor_version;
  45        __le16 major_version;
  46};
  47
  48/**
  49 * struct scmi_msg_hdr - Message(Tx/Rx) header
  50 *
  51 * @id: The identifier of the command being sent
  52 * @protocol_id: The identifier of the protocol used to send @id command
  53 * @seq: The token to identify the message. when a message/command returns,
  54 *      the platform returns the whole message header unmodified including
  55 *      the token
  56 * @status: Status of the transfer once it's complete
  57 * @poll_completion: Indicate if the transfer needs to be polled for
  58 *      completion or interrupt mode is used
  59 */
  60struct scmi_msg_hdr {
  61        u8 id;
  62        u8 protocol_id;
  63        u16 seq;
  64        u32 status;
  65        bool poll_completion;
  66};
  67
  68/**
  69 * struct scmi_msg - Message(Tx/Rx) structure
  70 *
  71 * @buf: Buffer pointer
  72 * @len: Length of data in the Buffer
  73 */
  74struct scmi_msg {
  75        void *buf;
  76        size_t len;
  77};
  78
  79/**
  80 * struct scmi_xfer - Structure representing a message flow
  81 *
  82 * @hdr: Transmit message header
  83 * @tx: Transmit message
  84 * @rx: Receive message, the buffer should be pre-allocated to store
  85 *      message. If request-ACK protocol is used, we can reuse the same
  86 *      buffer for the rx path as we use for the tx path.
  87 * @done: completion event
  88 */
  89struct scmi_xfer {
  90        struct scmi_msg_hdr hdr;
  91        struct scmi_msg tx;
  92        struct scmi_msg rx;
  93        struct completion done;
  94};
  95
  96void scmi_xfer_put(const struct scmi_handle *h, struct scmi_xfer *xfer);
  97int scmi_do_xfer(const struct scmi_handle *h, struct scmi_xfer *xfer);
  98int scmi_xfer_get_init(const struct scmi_handle *h, u8 msg_id, u8 prot_id,
  99                       size_t tx_size, size_t rx_size, struct scmi_xfer **p);
 100int scmi_handle_put(const struct scmi_handle *handle);
 101struct scmi_handle *scmi_handle_get(struct device *dev);
 102void scmi_set_handle(struct scmi_device *scmi_dev);
 103int scmi_version_get(const struct scmi_handle *h, u8 protocol, u32 *version);
 104void scmi_setup_protocol_implemented(const struct scmi_handle *handle,
 105                                     u8 *prot_imp);
 106
 107int scmi_base_protocol_init(struct scmi_handle *h);
 108