firmware: zynqmp: Separate function for sending message via mailbox
authorMichal Simek <michal.simek@xilinx.com>
Fri, 27 Sep 2019 12:08:41 +0000 (14:08 +0200)
committerMichal Simek <michal.simek@xilinx.com>
Tue, 8 Oct 2019 07:55:11 +0000 (09:55 +0200)
U-Boot running in EL3 can't use SMC that's why there is a need to talk to
PMUFW directly via mailbox. The same logic is applied to all functions
which need to talk to PMUFW that's why move this logic to separate function
to avoid code duplication.

Also SMC request ID can be composed from PM_SIP_SVC offset that's why
ZYNQMP_SIP_SVC_GET_API_VERSION macro can be removed completely.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
drivers/firmware/firmware-zynqmp.c
include/zynqmp_firmware.h

index 8327214290566c2db81f7a291aa414303acc5fc2..304398fed6df0afcf5a209aa288df5005533aa73 100644 (file)
@@ -49,6 +49,14 @@ static int ipi_req(const u32 *req, size_t req_len, u32 *res, size_t res_maxlen)
        return ret;
 }
 
+static int send_req(const u32 *req, size_t req_len, u32 *res, size_t res_maxlen)
+{
+       if (IS_ENABLED(CONFIG_SPL_BUILD))
+               return ipi_req(req, req_len, res, res_maxlen);
+
+       return invoke_smc(req[0] + PM_SIP_SVC, 0, 0, 0, 0, res);
+}
+
 unsigned int zynqmp_firmware_version(void)
 {
        int ret;
@@ -61,16 +69,9 @@ unsigned int zynqmp_firmware_version(void)
         * asking PMUFW again.
         **/
        if (pm_api_version == ZYNQMP_PM_VERSION_INVALID) {
-               if (IS_ENABLED(CONFIG_SPL_BUILD)) {
-                       const u32 request[] = { PM_GET_API_VERSION };
-
-                       ret = ipi_req(request, ARRAY_SIZE(request),
-                                     ret_payload, 2);
-               } else {
-                       ret = invoke_smc(ZYNQMP_SIP_SVC_GET_API_VERSION, 0, 0,
-                                        0, 0, ret_payload);
-               };
+               const u32 request[] = { PM_GET_API_VERSION };
 
+               ret = send_req(request, ARRAY_SIZE(request), ret_payload, 2);
                if (ret)
                        panic("PMUFW is not found - Please load it!\n");
 
index 30bf870b02da4a65ae6c7f399262d618c8f67b74..cebac74e9140b2e2fe6ebf3030e049df8371428a 100644 (file)
@@ -15,8 +15,6 @@ enum pm_api_id {
 };
 
 #define PM_SIP_SVC      0xc2000000
-#define ZYNQMP_SIP_SVC_GET_API_VERSION          \
-       (PM_SIP_SVC + PM_GET_API_VERSION)
 #define ZYNQMP_SIP_SVC_PM_SECURE_IMG_LOAD       \
        (PM_SIP_SVC + PM_SECURE_IMAGE)