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>
This commit is contained in:
George Shen
2023-04-19 21:56:08 -07:00
parent de91fb222e
commit 4e3d3a91bd

View File

@@ -48,7 +48,6 @@ struct cvp_tzbsp_memprot {
u32 cp_nonpixel_size; u32 cp_nonpixel_size;
}; };
#define TZBSP_PIL_SET_STATE 0xA
#define TZBSP_CVP_PAS_ID 26 #define TZBSP_CVP_PAS_ID 26
/* Poll interval in uS */ /* Poll interval in uS */
@@ -56,8 +55,8 @@ struct cvp_tzbsp_memprot {
enum tzbsp_subsys_state { enum tzbsp_subsys_state {
TZ_SUBSYS_STATE_SUSPEND = 0, TZ_SUBSYS_STATE_SUSPEND = 0,
TZ_SUBSYS_STATE_RESUME = 1, TZ_SUBSYS_STATE_RESUME = 1,
TZ_SUBSYS_STATE_RESTORE_THRESHOLD = 2, TZ_SUBSYS_STATE_RESTORE_THRESHOLD = 2,
}; };
const struct msm_cvp_gov_data CVP_DEFAULT_BUS_VOTE = { 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, static int __iface_cmdq_write(struct iris_hfi_device *device,
void *pkt); void *pkt);
static int __load_fw(struct iris_hfi_device *device); 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 void __unload_fw(struct iris_hfi_device *device);
static int __tzbsp_set_cvp_state(enum tzbsp_subsys_state state); static int __tzbsp_set_cvp_state(enum tzbsp_subsys_state state);
static int __enable_subcaches(struct iris_hfi_device *device); 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); 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) static inline int __boot_firmware(struct iris_hfi_device *device)
{ {
int rc = 0, loop = 10; int rc = 0, loop = 10;
@@ -1108,8 +1172,9 @@ static inline int __boot_firmware(struct iris_hfi_device *device)
skip_core_power_check: skip_core_power_check:
ctrl_init_val = BIT(0); 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); __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); ctrl_status = __read_register(device, CVP_CTRL_STATUS);
if ((ctrl_status & CVP_CTRL_ERROR_STATUS__M) == 0x4) { if ((ctrl_status & CVP_CTRL_ERROR_STATUS__M) == 0x4) {
dprintk(CVP_ERR, "invalid setting for UC_REGION\n"); 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)) { if (!(ctrl_status & CVP_CTRL_INIT_STATUS__M)) {
ctrl_init_val = __read_register(device, CVP_CTRL_INIT); ctrl_init_val = __read_register(device, CVP_CTRL_INIT);
dprintk(CVP_ERR, dprintk(CVP_ERR,
"Failed to boot FW status: %x %x\n", "Failed to boot FW status: %x %x %s\n",
ctrl_status, ctrl_init_val); ctrl_status, ctrl_init_val,
boot_states[(ctrl_status >> 9) & 0x3f]);
check_tensilica_in_reset(device); check_tensilica_in_reset(device);
rc = -ENODEV; rc = -ENODEV;
} }
@@ -2120,9 +2186,9 @@ static int iris_hfi_core_init(void *device)
__hwfence_regs_map(dev); __hwfence_regs_map(dev);
rc = __load_fw(dev); rc = __power_on_init(dev);
if (rc) { 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; goto err_load_fw;
} }
@@ -2171,6 +2237,12 @@ static int iris_hfi_core_init(void *device)
__write_register(dev, CVP_MMAP_ADDR, ipcc_iova); __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); rc = __boot_firmware(dev);
if (rc) { if (rc) {
dprintk(CVP_ERR, "Failed to start core\n"); 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", dprintk(CVP_ERR, "CVP power on failed gdsc %x cbcr %x\n",
reg_gdsc, reg_cbcr); reg_gdsc, reg_cbcr);
__setup_ucregion_memory_map(device);
/* RUMI: set CVP_CTRL_INIT register to disable synx in FW */
/* Reboot the firmware */ /* Reboot the firmware */
rc = __tzbsp_set_cvp_state(TZ_SUBSYS_STATE_RESUME); rc = __tzbsp_set_cvp_state(TZ_SUBSYS_STATE_RESUME);
if (rc) { if (rc) {
@@ -4832,8 +4908,6 @@ static inline int __resume(struct iris_hfi_device *device)
goto err_set_cvp_state; goto err_set_cvp_state;
} }
__setup_ucregion_memory_map(device);
/* Wait for boot completion */ /* Wait for boot completion */
rc = __boot_firmware(device); rc = __boot_firmware(device);
if (rc) { if (rc) {
@@ -4874,7 +4948,7 @@ err_iris_power_on:
return rc; return rc;
} }
static int __load_fw(struct iris_hfi_device *device) static int __power_on_init(struct iris_hfi_device *device)
{ {
int rc = 0; int rc = 0;
@@ -4882,36 +4956,41 @@ static int __load_fw(struct iris_hfi_device *device)
rc = __init_resources(device, device->res); rc = __init_resources(device, device->res);
if (rc) { if (rc) {
dprintk(CVP_ERR, "Failed to init resources: %d\n", rc); dprintk(CVP_ERR, "Failed to init resources: %d\n", rc);
goto fail_init_res; return rc;
} }
rc = __initialize_packetization(device); rc = __initialize_packetization(device);
if (rc) { if (rc) {
dprintk(CVP_ERR, "Failed to initialize packetization\n"); dprintk(CVP_ERR, "Failed to initialize packetization\n");
goto fail_init_pkt; goto fail_iris_init;
} }
rc = __iris_power_on(device); rc = __iris_power_on(device);
if (rc) { if (rc) {
dprintk(CVP_ERR, "Failed to power on iris in in load_fw\n"); 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) 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); rc = load_cvp_fw_impl(device);
if (rc) if (rc)
goto fail_load_fw; goto fail_load_fw;
} }
return rc; return rc;
fail_load_fw: fail_load_fw:
call_iris_op(device, power_off, device); call_iris_op(device, power_off, device);
fail_iris_power_on:
fail_init_pkt:
__deinit_resources(device);
fail_init_res:
return rc; return rc;
} }