aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorTom Rini2022-06-23 14:30:27 -0400
committerTom Rini2022-06-23 14:30:27 -0400
commit31016a5a853cb5b8e27e9fdf956d8250ae59eca9 (patch)
treeb80400cbdcabd651926ee4e4eedc95cdb27b05b2 /include
parent3e00721b3b8fed05a99cfcde5b4fdc210f0b33ab (diff)
parent53355bb86c25d9cced1493df9fc95140acece556 (diff)
Merge branch '2022-06-23-scmi-optee-and-smccc-updates' into next
This consists of two slightly related series. For the first, to quote the author: This series implements 2 features in driver/firmware/scmi. First, a single change adds support for SCMI OP-TEE transport to use OP-TEE native shared memory. See the 1st patch in this series: "firmware: scmi: optee: use TEE shared memory for SCMI messages". Then come changes for supporting multi-channel in the SCMI drivers. I've split the implementation in 11 several small incremental changes in the hope it helps the review. Few minor fixup commits are also inserted in the series. And the second series implements some smccc improvements.
Diffstat (limited to 'include')
-rw-r--r--include/linux/arm-smccc.h20
-rw-r--r--include/linux/psci.h14
-rw-r--r--include/scmi_agent-uclass.h15
-rw-r--r--include/scmi_agent.h14
4 files changed, 60 insertions, 3 deletions
diff --git a/include/linux/arm-smccc.h b/include/linux/arm-smccc.h
index 7f2be233947..e1d09884a1c 100644
--- a/include/linux/arm-smccc.h
+++ b/include/linux/arm-smccc.h
@@ -51,6 +51,10 @@
#define ARM_SMCCC_QUIRK_NONE 0
#define ARM_SMCCC_QUIRK_QCOM_A6 1 /* Save/restore register a6 */
+#define ARM_SMCCC_ARCH_FEATURES 0x80000001
+
+#define ARM_SMCCC_RET_NOT_SUPPORTED ((unsigned long)-1)
+
#ifndef __ASSEMBLY__
#include <linux/linkage.h>
@@ -80,6 +84,22 @@ struct arm_smccc_quirk {
};
/**
+ * struct arm_smccc_feature - Driver registration data for discoverable feature
+ * @driver_name: name of the driver relate to the SMCCC feature
+ * @is_supported: callback to test if SMCCC feature is supported
+ */
+struct arm_smccc_feature {
+ const char *driver_name;
+ bool (*is_supported)(void (*invoke_fn)(unsigned long a0, unsigned long a1, unsigned long a2,
+ unsigned long a3, unsigned long a4, unsigned long a5,
+ unsigned long a6, unsigned long a7,
+ struct arm_smccc_res *res));
+};
+
+#define ARM_SMCCC_FEATURE_DRIVER(__name) \
+ ll_entry_declare(struct arm_smccc_feature, __name, arm_smccc_feature)
+
+/**
* __arm_smccc_smc() - make SMC calls
* @a0-a7: arguments passed in registers 0 to 7
* @res: result values from registers 0 to 3
diff --git a/include/linux/psci.h b/include/linux/psci.h
index c78c1079a82..03e41863432 100644
--- a/include/linux/psci.h
+++ b/include/linux/psci.h
@@ -11,6 +11,8 @@
#ifndef _UAPI_LINUX_PSCI_H
#define _UAPI_LINUX_PSCI_H
+#include <linux/arm-smccc.h>
+
/*
* PSCI v0.1 interface
*
@@ -115,6 +117,18 @@
#define PSCI_RET_DISABLED -8
#define PSCI_RET_INVALID_ADDRESS -9
+/**
+ * struct psci_plat_data - PSCI driver platform data
+ * @method: Selected invocation conduit
+ */
+struct psci_plat_data {
+ void (*invoke_fn)(unsigned long arg0, unsigned long arg1,
+ unsigned long arg2, unsigned long arg3,
+ unsigned long arg4, unsigned long arg5,
+ unsigned long arg6, unsigned long arg7,
+ struct arm_smccc_res *res);
+};
+
#ifdef CONFIG_ARM_PSCI_FW
unsigned long invoke_psci_fn(unsigned long a0, unsigned long a1,
unsigned long a2, unsigned long a3);
diff --git a/include/scmi_agent-uclass.h b/include/scmi_agent-uclass.h
index a501d1b4825..b1c93532c0e 100644
--- a/include/scmi_agent-uclass.h
+++ b/include/scmi_agent-uclass.h
@@ -7,18 +7,29 @@
struct udevice;
struct scmi_msg;
+struct scmi_channel;
/**
* struct scmi_transport_ops - The functions that a SCMI transport layer must implement.
*/
struct scmi_agent_ops {
/*
+ * of_get_channel - Get SCMI channel from SCMI agent device tree node
+ *
+ * @dev: SCMI protocol device using the transport
+ * @channel: Output reference to SCMI channel upon success
+ * Return 0 upon success and a negative errno on failure
+ */
+ int (*of_get_channel)(struct udevice *dev, struct scmi_channel **channel);
+
+ /*
* process_msg - Request transport to get the SCMI message processed
*
- * @agent: Agent using the transport
+ * @dev: SCMI protocol device using the transport
* @msg: SCMI message to be transmitted
*/
- int (*process_msg)(struct udevice *dev, struct scmi_msg *msg);
+ int (*process_msg)(struct udevice *dev, struct scmi_channel *channel,
+ struct scmi_msg *msg);
};
#endif /* _SCMI_TRANSPORT_UCLASS_H */
diff --git a/include/scmi_agent.h b/include/scmi_agent.h
index 18bcd48a9d4..ee6286366df 100644
--- a/include/scmi_agent.h
+++ b/include/scmi_agent.h
@@ -13,6 +13,7 @@
#include <asm/types.h>
struct udevice;
+struct scmi_channel;
/*
* struct scmi_msg - Context of a SCMI message sent and the response received
@@ -45,6 +46,15 @@ struct scmi_msg {
}
/**
+ * devm_scmi_of_get_channel() - Get SCMI channel handle from SCMI agent DT node
+ *
+ * @dev: Device requesting a channel
+ * @channel: Output reference to the SCMI channel upon success
+ * @return 0 on success and a negative errno on failure
+ */
+int devm_scmi_of_get_channel(struct udevice *dev, struct scmi_channel **channel);
+
+/**
* devm_scmi_process_msg() - Send and process an SCMI message
*
* Send a message to an SCMI server through a target SCMI agent device.
@@ -52,10 +62,12 @@ struct scmi_msg {
* On return, scmi_msg::out_msg_sz stores the response payload size.
*
* @dev: SCMI device
+ * @channel: Communication channel for the device
* @msg: Message structure reference
* Return: 0 on success and a negative errno on failure
*/
-int devm_scmi_process_msg(struct udevice *dev, struct scmi_msg *msg);
+int devm_scmi_process_msg(struct udevice *dev, struct scmi_channel *channel,
+ struct scmi_msg *msg);
/**
* scmi_to_linux_errno() - Convert an SCMI error code into a Linux errno code