msm: eva: Change FW boot sequence

Match MPTest sequence to facilitate presilicon bringup.

Change-Id: Iafd4443eb0f9d6045e61eb2dd33b6663dc3f1334
Signed-off-by: George Shen <quic_sqiao@quicinc.com>
这个提交包含在:
George Shen
2023-04-19 21:56:08 -07:00
父节点 de91fb222e
当前提交 4e3d3a91bd

查看文件

@@ -48,7 +48,6 @@ struct cvp_tzbsp_memprot {
u32 cp_nonpixel_size;
};
#define TZBSP_PIL_SET_STATE 0xA
#define TZBSP_CVP_PAS_ID 26
/* Poll interval in uS */
@@ -56,8 +55,8 @@ struct cvp_tzbsp_memprot {
enum tzbsp_subsys_state {
TZ_SUBSYS_STATE_SUSPEND = 0,
TZ_SUBSYS_STATE_RESUME = 1,
TZ_SUBSYS_STATE_RESTORE_THRESHOLD = 2,
TZ_SUBSYS_STATE_RESUME = 1,
TZ_SUBSYS_STATE_RESTORE_THRESHOLD = 2,
};
const struct msm_cvp_gov_data CVP_DEFAULT_BUS_VOTE = {
@@ -84,6 +83,7 @@ static bool __is_session_valid(struct iris_hfi_device *device,
static int __iface_cmdq_write(struct iris_hfi_device *device,
void *pkt);
static int __load_fw(struct iris_hfi_device *device);
static int __power_on_init(struct iris_hfi_device *device);
static void __unload_fw(struct iris_hfi_device *device);
static int __tzbsp_set_cvp_state(enum tzbsp_subsys_state state);
static int __enable_subcaches(struct iris_hfi_device *device);
@@ -1075,6 +1075,70 @@ static inline void check_tensilica_in_reset(struct iris_hfi_device *device)
X2RPMh, wait_mode, fal10_veto);
}
static const char boot_states[0x40][32] = {
"NOT INIT",
"RST_START",
"INIT_MEMCTL",
"INTENABLE_RST",
"LITBASE_RST",
"PREFETCH_EN",
"MPU_INIT",
"CTRL_INIT_READ",
"MEMCTL_L1_FIX",
"RESTORE_EXTRA_NW",
"CORE_RESTORE",
"COLD_BOOT",
"DISABLE_CACHE",
"BEFORE_MPU_C",
"RET_MPU_C",
"IN_MPU_C",
"IN_MPU_DEFAULT",
"IN_MPU_SYNX",
"UCR_SIZE_FAIL",
"UCR_ADDR_FAIL",
"UCR1_SIZE_FAIL",
"UCR1_ADDR_FAIL",
"UCR_OVERLAPPED_UCR1",
"UCR1_OVERLAPPED_UCR",
"UCR_EQ_UCR1",
"MPU_CHECK_DONE",
"BEFORE_INT_LOCK",
"AFTER_INT_LOCK",
"BEFORE_INT_UNLOCK",
"AFTER_INT_UNLOCK",
"CALL_START",
"MAIN_ENTRY",
"VENUS_INIT_ENTRY",
"VSYS_INIT_ENTRY",
"BEFORE_XOS_CLK",
"AFTER_XOS_CLK",
"LOG_MUTEX_INIT",
"CREATE_FRAMEWORK_ENTRY",
"DTG_INIT",
"IDLE_TASK_INIT",
"VENUS_CORE_INIT",
"HW_CORES_INIT",
"RST_THREAD_INIT",
"HOST_THREAD_INIT",
"ALL_THREADS_INIT",
"TASK_MEMPOOL",
"SESSION_MUTEX",
"SIGNALS_INIT",
"RST_SIGNAL_INIT",
"INTR_EN_HOST",
"INTR_REG_HOST",
"INTR_EN_DSP",
"INTR_REG_DSP",
"X2HSOFTINTEN",
"H2XSOFTINTEN",
"CPU2DSPINTEN",
"DSP2CPUINT_SWRESET",
"THREADS_START",
"RST_THREAD_START",
"HST_THREAD_START",
"HST_THREAD_ENTRY"
};
static inline int __boot_firmware(struct iris_hfi_device *device)
{
int rc = 0, loop = 10;
@@ -1108,8 +1172,9 @@ static inline int __boot_firmware(struct iris_hfi_device *device)
skip_core_power_check:
ctrl_init_val = BIT(0);
/* RUMI: CVP_CTRL_INIT in MPTest has bit 0 and 3 set */
__write_register(device, CVP_CTRL_INIT, ctrl_init_val);
while (!ctrl_status && count < max_tries) {
while (!(ctrl_status & CVP_CTRL_INIT_STATUS__M) && count < max_tries) {
ctrl_status = __read_register(device, CVP_CTRL_STATUS);
if ((ctrl_status & CVP_CTRL_ERROR_STATUS__M) == 0x4) {
dprintk(CVP_ERR, "invalid setting for UC_REGION\n");
@@ -1125,8 +1190,9 @@ skip_core_power_check:
if (!(ctrl_status & CVP_CTRL_INIT_STATUS__M)) {
ctrl_init_val = __read_register(device, CVP_CTRL_INIT);
dprintk(CVP_ERR,
"Failed to boot FW status: %x %x\n",
ctrl_status, ctrl_init_val);
"Failed to boot FW status: %x %x %s\n",
ctrl_status, ctrl_init_val,
boot_states[(ctrl_status >> 9) & 0x3f]);
check_tensilica_in_reset(device);
rc = -ENODEV;
}
@@ -2120,9 +2186,9 @@ static int iris_hfi_core_init(void *device)
__hwfence_regs_map(dev);
rc = __load_fw(dev);
rc = __power_on_init(dev);
if (rc) {
dprintk(CVP_ERR, "Failed to load Iris FW\n");
dprintk(CVP_ERR, "Failed to power on init EVA\n");
goto err_load_fw;
}
@@ -2171,6 +2237,12 @@ static int iris_hfi_core_init(void *device)
__write_register(dev, CVP_MMAP_ADDR, ipcc_iova);
}
rc = __load_fw(dev);
if (rc) {
dprintk(CVP_ERR, "Failed to load Iris FW\n");
goto err_core_init;
}
rc = __boot_firmware(dev);
if (rc) {
dprintk(CVP_ERR, "Failed to start core\n");
@@ -4825,6 +4897,10 @@ static inline int __resume(struct iris_hfi_device *device)
dprintk(CVP_ERR, "CVP power on failed gdsc %x cbcr %x\n",
reg_gdsc, reg_cbcr);
__setup_ucregion_memory_map(device);
/* RUMI: set CVP_CTRL_INIT register to disable synx in FW */
/* Reboot the firmware */
rc = __tzbsp_set_cvp_state(TZ_SUBSYS_STATE_RESUME);
if (rc) {
@@ -4832,8 +4908,6 @@ static inline int __resume(struct iris_hfi_device *device)
goto err_set_cvp_state;
}
__setup_ucregion_memory_map(device);
/* Wait for boot completion */
rc = __boot_firmware(device);
if (rc) {
@@ -4874,7 +4948,7 @@ err_iris_power_on:
return rc;
}
static int __load_fw(struct iris_hfi_device *device)
static int __power_on_init(struct iris_hfi_device *device)
{
int rc = 0;
@@ -4882,36 +4956,41 @@ static int __load_fw(struct iris_hfi_device *device)
rc = __init_resources(device, device->res);
if (rc) {
dprintk(CVP_ERR, "Failed to init resources: %d\n", rc);
goto fail_init_res;
return rc;
}
rc = __initialize_packetization(device);
if (rc) {
dprintk(CVP_ERR, "Failed to initialize packetization\n");
goto fail_init_pkt;
goto fail_iris_init;
}
rc = __iris_power_on(device);
if (rc) {
dprintk(CVP_ERR, "Failed to power on iris in in load_fw\n");
goto fail_iris_power_on;
goto fail_iris_init;
}
return rc;
fail_iris_init:
__deinit_resources(device);
return rc;
}
static int __load_fw(struct iris_hfi_device *device)
{
int rc = 0;
if ((!device->res->use_non_secure_pil && !device->res->firmware_base)
|| device->res->use_non_secure_pil) {
|| device->res->use_non_secure_pil) {
rc = load_cvp_fw_impl(device);
if (rc)
goto fail_load_fw;
}
return rc;
fail_load_fw:
call_iris_op(device, power_off, device);
fail_iris_power_on:
fail_init_pkt:
__deinit_resources(device);
fail_init_res:
return rc;
}