]> git.baikalelectronics.ru Git - arm-tf.git/commitdiff
intel: mailbox: Mailbox error recovery handling
authorChee Hong Ang <chee.hong.ang@intel.com>
Mon, 11 May 2020 03:23:21 +0000 (11:23 +0800)
committerAbdul Halim, Muhammad Hadi Asyrafi <muhammad.hadi.asyrafi.abdul.halim@intel.com>
Tue, 27 Oct 2020 03:20:59 +0000 (11:20 +0800)
Attempt to restart the mailbox if the mailbox driver not able
to write any data into the mailbox command buffer.

Signed-off-by: Chee Hong Ang <chee.hong.ang@intel.com>
Change-Id: Ia45291c985844dec9da82839cac701347534d32b

plat/intel/soc/common/include/socfpga_mailbox.h
plat/intel/soc/common/soc/socfpga_mailbox.c

index 59714fdb1e76d62db1620dbe76d871785017be66..3a2bf309e09aac332b50f7b92b122d7d2833715b 100644 (file)
 #define MBOX_JOB_ID_CMD(JOB_ID)                (JOB_ID<<24)
 #define MBOX_CMD_LEN_CMD(CMD_LEN)      ((CMD_LEN) << 12)
 #define MBOX_INDIRECT(val)             ((val) << 11)
+#define MBOX_CMD_MASK(header)          ((header) & 0x7ff)
 
 /* RSU Macros */
 #define RSU_VERSION_ACMF               BIT(8)
index 870ef10d4e26ec4babc5d24eb2930f0f586f3099..9ba9b3171f111d65d1cb80e2ea39d36403694fe8 100644 (file)
@@ -94,7 +94,7 @@ static int fill_mailbox_circular_buffer(uint32_t header_cmd, uint32_t *args,
        ret = write_mailbox_cmd_buffer(&cmd_free_offset, sdm_read_offset,
                                       header_cmd, &is_doorbell_triggered);
        if (ret != 0) {
-               return ret;
+               goto restart_mailbox;
        }
 
        for (i = 0U; i < len; i++) {
@@ -103,7 +103,7 @@ static int fill_mailbox_circular_buffer(uint32_t header_cmd, uint32_t *args,
                                               sdm_read_offset, args[i],
                                               &is_doorbell_triggered);
                if (ret != 0) {
-                       return ret;
+                       goto restart_mailbox;
                }
        }
 
@@ -112,6 +112,22 @@ static int fill_mailbox_circular_buffer(uint32_t header_cmd, uint32_t *args,
        }
 
        return MBOX_RET_OK;
+
+restart_mailbox:
+       /*
+        * Attempt to restart mailbox if the driver not able to write
+        * into mailbox command buffer
+        */
+       if (MBOX_CMD_MASK(header_cmd) != MBOX_CMD_RESTART) {
+               INFO("Mailbox timed out: Attempting mailbox reset\n");
+               ret = mailbox_init();
+
+               if (ret == MBOX_TIMEOUT) {
+                       INFO("Error: Mailbox fail to restart\n");
+               }
+       }
+
+       return MBOX_TIMEOUT;
 }
 
 int mailbox_read_response(uint32_t *job_id, uint32_t *response, int resp_len)
@@ -150,7 +166,7 @@ int mailbox_read_response(uint32_t *job_id, uint32_t *response, int resp_len)
 
                if (MBOX_RESP_ERR(resp_data) > 0) {
                        INFO("Error in response: %x\n", resp_data);
-                       return -resp_data;
+                       return -MBOX_RESP_ERR(resp_data);
                }
 
                return ret_resp_len;