firmware: ti_sci: Add support for board configuration
authorAndreas Dannenberg <dannenberg@ti.com>
Mon, 27 Aug 2018 10:27:33 +0000 (15:57 +0530)
committerTom Rini <trini@konsulko.com>
Tue, 11 Sep 2018 12:32:55 +0000 (08:32 -0400)
TI-SCI message protocol provides support for board configuration
to assign resources and other board related operations.
Introduce the board configuration capability support to the driver protocol
as part of this change.

Reviewed-by: Tom Rini <trini@konsulko.com>
Signed-off-by: Andreas Dannenberg <dannenberg@ti.com>
Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
drivers/firmware/ti_sci.c
drivers/firmware/ti_sci.h
include/linux/soc/ti/ti_sci_protocol.h

index 857d960787de0bf6f702c9ff8c2f547484b58360..ac61ce514725c381238ca5e8e95e7d0186e9707f 100644 (file)
@@ -275,6 +275,142 @@ static inline bool ti_sci_is_response_ack(void *r)
        return hdr->flags & TI_SCI_FLAG_RESP_GENERIC_ACK ? true : false;
 }
 
+/**
+ * cmd_set_board_config_using_msg() - Common command to send board configuration
+ *                                    message
+ * @handle:    pointer to TI SCI handle
+ * @msg_type:  One of the TISCI message types to set board configuration
+ * @addr:      Address where the board config structure is located
+ * @size:      Size of the board config structure
+ *
+ * Return: 0 if all went well, else returns appropriate error value.
+ */
+static int cmd_set_board_config_using_msg(const struct ti_sci_handle *handle,
+                                         u16 msg_type, u64 addr, u32 size)
+{
+       struct ti_sci_msg_board_config req;
+       struct ti_sci_msg_hdr *resp;
+       struct ti_sci_info *info;
+       struct ti_sci_xfer *xfer;
+       int ret = 0;
+
+       if (IS_ERR(handle))
+               return PTR_ERR(handle);
+       if (!handle)
+               return -EINVAL;
+
+       info = handle_to_ti_sci_info(handle);
+
+       xfer = ti_sci_setup_one_xfer(info, msg_type,
+                                    TI_SCI_FLAG_REQ_ACK_ON_PROCESSED,
+                                    (u32 *)&req, sizeof(req), sizeof(*resp));
+       if (IS_ERR(xfer)) {
+               ret = PTR_ERR(xfer);
+               dev_err(info->dev, "Message alloc failed(%d)\n", ret);
+               return ret;
+       }
+       req.boardcfgp_high = (addr >> 32) & 0xffffffff;
+       req.boardcfgp_low = addr & 0xffffffff;
+       req.boardcfg_size = size;
+
+       ret = ti_sci_do_xfer(info, xfer);
+       if (ret) {
+               dev_err(info->dev, "Mbox send fail %d\n", ret);
+               return ret;
+       }
+
+       resp = (struct ti_sci_msg_hdr *)xfer->tx_message.buf;
+
+       if (!ti_sci_is_response_ack(resp))
+               return -ENODEV;
+
+       return ret;
+}
+
+/**
+ * ti_sci_cmd_set_board_config() - Command to send board configuration message
+ * @handle:    pointer to TI SCI handle
+ * @addr:      Address where the board config structure is located
+ * @size:      Size of the board config structure
+ *
+ * Return: 0 if all went well, else returns appropriate error value.
+ */
+static int ti_sci_cmd_set_board_config(const struct ti_sci_handle *handle,
+                                      u64 addr, u32 size)
+{
+       return cmd_set_board_config_using_msg(handle,
+                                             TI_SCI_MSG_BOARD_CONFIG,
+                                             addr, size);
+}
+
+/**
+ * ti_sci_cmd_set_board_config_rm() - Command to send board resource
+ *                                   management configuration
+ * @handle:    pointer to TI SCI handle
+ * @addr:      Address where the board RM config structure is located
+ * @size:      Size of the RM config structure
+ *
+ * Return: 0 if all went well, else returns appropriate error value.
+ */
+static
+int ti_sci_cmd_set_board_config_rm(const struct ti_sci_handle *handle,
+                                  u64 addr, u32 size)
+{
+       return cmd_set_board_config_using_msg(handle,
+                                             TI_SCI_MSG_BOARD_CONFIG_RM,
+                                             addr, size);
+}
+
+/**
+ * ti_sci_cmd_set_board_config_security() - Command to send board security
+ *                                         configuration message
+ * @handle:    pointer to TI SCI handle
+ * @addr:      Address where the board security config structure is located
+ * @size:      Size of the security config structure
+ *
+ * Return: 0 if all went well, else returns appropriate error value.
+ */
+static
+int ti_sci_cmd_set_board_config_security(const struct ti_sci_handle *handle,
+                                        u64 addr, u32 size)
+{
+       return cmd_set_board_config_using_msg(handle,
+                                             TI_SCI_MSG_BOARD_CONFIG_SECURITY,
+                                             addr, size);
+}
+
+/**
+ * ti_sci_cmd_set_board_config_pm() - Command to send board power and clock
+ *                                   configuration message
+ * @handle:    pointer to TI SCI handle
+ * @addr:      Address where the board PM config structure is located
+ * @size:      Size of the PM config structure
+ *
+ * Return: 0 if all went well, else returns appropriate error value.
+ */
+static int ti_sci_cmd_set_board_config_pm(const struct ti_sci_handle *handle,
+                                         u64 addr, u32 size)
+{
+       return cmd_set_board_config_using_msg(handle,
+                                             TI_SCI_MSG_BOARD_CONFIG_PM,
+                                             addr, size);
+}
+
+/*
+ * ti_sci_setup_ops() - Setup the operations structures
+ * @info:      pointer to TISCI pointer
+ */
+static void ti_sci_setup_ops(struct ti_sci_info *info)
+{
+       struct ti_sci_ops *ops = &info->handle.ops;
+       struct ti_sci_board_ops *bops = &ops->board_ops;
+
+       bops->board_config = ti_sci_cmd_set_board_config;
+       bops->board_config_rm = ti_sci_cmd_set_board_config_rm;
+       bops->board_config_security = ti_sci_cmd_set_board_config_security;
+       bops->board_config_pm = ti_sci_cmd_set_board_config_pm;
+}
+
 /**
  * ti_sci_get_handle_from_sysfw() - Get the TI SCI handle of the SYSFW
  * @dev:       Pointer to the SYSFW device
@@ -418,6 +554,7 @@ static int ti_sci_probe(struct udevice *dev)
        info->seq = 0xA;
 
        list_add_tail(&info->list, &ti_sci_list);
+       ti_sci_setup_ops(info);
 
        ret = ti_sci_cmd_get_revision(&info->handle);
 
index ae8506261d3941ca2e112004e421487ac1cbb233..24145e5034b80b92e4a3d5e30d8c96c3eb8db4f2 100644 (file)
@@ -22,6 +22,9 @@
 #define TI_SCI_MSG_GOODBYE             0x0004
 #define TI_SCI_MSG_SYS_RESET           0x0005
 #define TI_SCI_MSG_BOARD_CONFIG                0x000b
+#define TI_SCI_MSG_BOARD_CONFIG_RM     0x000c
+#define TI_SCI_MSG_BOARD_CONFIG_SECURITY  0x000d
+#define TI_SCI_MSG_BOARD_CONFIG_PM     0x000e
 
 /**
  * struct ti_sci_msg_hdr - Generic Message Header for All messages and responses
@@ -77,4 +80,22 @@ struct ti_sci_msg_resp_version {
        u8 abi_minor;
 } __packed;
 
+/**
+ * struct ti_sci_msg_board_config - Board configuration message
+ * @hdr:               Generic Header
+ * @boardcfgp_low:     Lower 32 bit of the pointer pointing to the board
+ *                     configuration data
+ * @boardcfgp_high:    Upper 32 bit of the pointer pointing to the board
+ *                     configuration data
+ * @boardcfg_size:     Size of board configuration data object
+ * Request type is TI_SCI_MSG_BOARD_CONFIG, responded with a generic
+ * ACK/NACK message.
+ */
+struct ti_sci_msg_board_config {
+       struct ti_sci_msg_hdr hdr;
+       u32 boardcfgp_low;
+       u32 boardcfgp_high;
+       u16 boardcfg_size;
+} __packed;
+
 #endif /* __TI_SCI_H */
index f216bfbcfa49827c17cf1ce92f8948fce2803469..dd88f646ed69c066d194fcd90b862b5eae28ca0a 100644 (file)
@@ -29,11 +29,49 @@ struct ti_sci_version_info {
 
 struct ti_sci_handle;
 
+/**
+ * struct ti_sci_board_ops - Board config operations
+ * @board_config: Command to set the board configuration
+ *               Returns 0 for successful exclusive request, else returns
+ *               corresponding error message.
+ * @board_config_rm: Command to set the board resource management
+ *               configuration
+ *               Returns 0 for successful exclusive request, else returns
+ *               corresponding error message.
+ * @board_config_security: Command to set the board security configuration
+ *               Returns 0 for successful exclusive request, else returns
+ *               corresponding error message.
+ * @board_config_pm: Command to trigger and set the board power and clock
+ *               management related configuration
+ *               Returns 0 for successful exclusive request, else returns
+ *               corresponding error message.
+ */
+struct ti_sci_board_ops {
+       int (*board_config)(const struct ti_sci_handle *handle,
+                           u64 addr, u32 size);
+       int (*board_config_rm)(const struct ti_sci_handle *handle,
+                              u64 addr, u32 size);
+       int (*board_config_security)(const struct ti_sci_handle *handle,
+                                    u64 addr, u32 size);
+       int (*board_config_pm)(const struct ti_sci_handle *handle,
+                              u64 addr, u32 size);
+};
+
+/**
+ * struct ti_sci_ops - Function support for TI SCI
+ * @board_ops: Miscellaneous operations
+ */
+struct ti_sci_ops {
+       struct ti_sci_board_ops board_ops;
+};
+
 /**
  * struct ti_sci_handle - Handle returned to TI SCI clients for usage.
+ * @ops:       operations that are made available to TI SCI clients
  * @version:   structure containing version information
  */
 struct ti_sci_handle {
+       struct ti_sci_ops ops;
        struct ti_sci_version_info version;
 };