1
0
Fork 0

MLK-20454 [iMX8QXP/Bon-Auto] VPU initializing time is too long

1. get boot size and rpc size from dts file
 2. set p[18]=1 in vpu_firmware_download()

Signed-off-by: Huang Chaofan <chaofan.huang@nxp.com>
(cherry picked from commit b859b67f2cc6ea05ece69294a960e85eb198d61e)
pull/10/head
Huang Chaofan 2018-11-27 10:47:02 +08:00
parent 9c3c107ff2
commit 9a7c1e9d7b
2 changed files with 26 additions and 15 deletions

View File

@ -52,7 +52,7 @@
unsigned int vpu_dbg_level_decoder = 1;
static int vpu_frm_depth = INVALID_FRAME_DEPTH;
static int vpu_log_depth = 10;
static int vpu_log_depth = DEFAULT_LOG_DEPTH;
/* Generic End of content startcodes to differentiate from those naturally in the stream/file */
#define EOS_GENERIC_HEVC 0x7c010000
@ -1568,12 +1568,18 @@ static int update_stream_addr(struct vpu_ctx *ctx, void *input_buffer, uint32_t
start = pStrBufDesc->start;
end = pStrBufDesc->end;
if (start != ctx->stream_buffer.dma_phy ||
end != ctx->stream_buffer.dma_phy + ctx->stream_buffer.dma_size) {
vpu_dbg(LVL_ERR, "error: %s(), start or end pointer cross-border\n", __func__);
return 0;
}
if (wptr < start || wptr > end) {
vpu_dbg(LVL_ERR, "%s(), wptr pointer cross-border\n", __func__);
vpu_dbg(LVL_ERR, "error: %s(), wptr pointer cross-border\n", __func__);
return 0;
}
if (rptr < start || rptr > end) {
vpu_dbg(LVL_ERR, "%s(), rptr pointer cross-border\n", __func__);
vpu_dbg(LVL_ERR, "error: %s(), rptr pointer cross-border\n", __func__);
return 0;
}
wptr_virt = (void *)ctx->stream_buffer.dma_virt + wptr - start;
@ -2163,6 +2169,7 @@ static void vpu_api_event_handler(struct vpu_ctx *ctx, u_int32 uStrIdx, u_int32
.type = V4L2_EVENT_EOS
};
vpu_dbg(LVL_ERR, "warning: VID_API_EVENT_FIRMWARE_XCPT,exception info: %s\n", xcpt_info);
ctx->hang_status = true;
v4l2_event_queue_fh(&ctx->fh, &ev);
}
break;
@ -2186,7 +2193,7 @@ static irqreturn_t fsl_vpu_mu_isr(int irq, void *This)
MU_ReceiveMsg(dev->mu_base_virtaddr, 0, &msg);
if (msg == 0xaa) {
rpc_init_shared_memory(&dev->shared_mem, dev->m0_rpc_phy - dev->m0_p_fw_space_phy, dev->m0_rpc_virt, SHARED_SIZE);
rpc_init_shared_memory(&dev->shared_mem, dev->m0_rpc_phy - dev->m0_p_fw_space_phy, dev->m0_rpc_virt, dev->m0_rpc_size);
rpc_set_system_cfg_value(dev->shared_mem.pSharedInterface, VPU_REG_BASE);
MU_sendMesgToFW(dev->mu_base_virtaddr, RPC_BUF_OFFSET, dev->m0_rpc_phy - dev->m0_p_fw_space_phy); //CM0 use relative address
@ -2619,6 +2626,7 @@ static int vpu_firmware_download(struct vpu_dev *This)
);
p[16] = This->plat_type;
p[18] = 1;
enable_csr_reg(This);
return ret;
@ -2756,23 +2764,23 @@ static ssize_t show_instance_log_info(struct device *dev,
switch (vpu_info->type) {
case LOG_EVENT:
num += snprintf(buf + num, PAGE_SIZE - num,
"\t%20s:%26s\n", "event", event2str[vpu_info->log_info[vpu_info->type]]);
"\t%20s:%40s\n", "event", event2str[vpu_info->log_info[vpu_info->type]]);
break;
case LOG_COMMAND:
num += snprintf(buf + num, PAGE_SIZE - num,
"\t%20s:%26s\n", "command", cmd2str[vpu_info->log_info[vpu_info->type]]);
"\t%20s:%40s\n", "command", cmd2str[vpu_info->log_info[vpu_info->type]]);
break;
case LOG_EOS:
num += snprintf(buf + num, PAGE_SIZE - num,
"\t%20s:%26s\n", "add eos", "done");
"\t%20s:%40s\n", "add eos", "done");
break;
case LOG_PADDING:
num += snprintf(buf + num, PAGE_SIZE - num,
"\t%20s:%26s\n", "add padding", "done");
"\t%20s:%40s\n", "add padding", "done");
break;
case LOG_UPDATE_STREAM:
num += snprintf(buf + num, PAGE_SIZE - num,
"\t%20s:%16s %16d\n", "update stream data", "stream size", vpu_info->data);
"\t%20s:%40s %16d\n", "update stream data", "stream size", vpu_info->data);
break;
default:
break;
@ -3254,6 +3262,7 @@ static int parse_dt_info(struct vpu_dev *dev, struct device_node *np)
return -EINVAL;
}
dev->m0_p_fw_space_phy = reserved_res.start;
dev->m0_boot_size = reserved_res.end - reserved_res.start;
reserved_node = of_parse_phandle(np, "rpc-region", 0);
if (!reserved_node) {
vpu_dbg(LVL_ERR, "error: rpc-region of_parse_phandle error\n");
@ -3265,6 +3274,7 @@ static int parse_dt_info(struct vpu_dev *dev, struct device_node *np)
return -EINVAL;
}
dev->m0_rpc_phy = reserved_res.start;
dev->m0_rpc_size = reserved_res.end - reserved_res.start;
ret = of_property_read_u32(np, "reg-csr", &csr_base);
if (ret) {
@ -3337,24 +3347,24 @@ static int init_vpudev_parameters(struct vpu_dev *dev)
//firmware space for M0
dev->m0_p_fw_space_vir = ioremap_wc(dev->m0_p_fw_space_phy,
M0_BOOT_SIZE
dev->m0_boot_size
);
if (!dev->m0_p_fw_space_vir) {
vpu_dbg(LVL_ERR, "error: failed to remap space for M0 firmware\n");
return -ENOMEM;
}
memset_io(dev->m0_p_fw_space_vir, 0, M0_BOOT_SIZE);
memset_io(dev->m0_p_fw_space_vir, 0, dev->m0_boot_size);
dev->m0_rpc_virt = ioremap_wc(dev->m0_rpc_phy,
SHARED_SIZE
dev->m0_rpc_size
);
if (!dev->m0_rpc_virt) {
vpu_dbg(LVL_ERR, "error: failed to remap space for rpc shared memory\n");
return -ENOMEM;
}
memset_io(dev->m0_rpc_virt, 0, SHARED_SIZE);
memset_io(dev->m0_rpc_virt, 0, dev->m0_rpc_size);
return 0;
}

View File

@ -49,11 +49,9 @@ extern unsigned int vpu_dbg_level_decoder;
#define M0FW_FILENAME "vpu/vpu_fw_imx8_dec.bin"
#define MMAP_BUF_TYPE_SHIFT 28
#define MMAP_BUF_TYPE_MASK 0xF0000000
#define M0_BOOT_SIZE 0x1000000
#define DCP_SIZE 0x3000000
#define MAX_BUFFER_SIZE 0xc00000
#define UDATA_BUFFER_SIZE 0x1000
#define SHARED_SIZE 0x00400000
#define MAX_DCP_NUM 2
#define MAX_MBI_NUM 18 // same with MEDIA_PLAYER_MAX_MBI_UNIT defined in firmware
#define MAX_TIMEOUT_COUNT 10
@ -63,6 +61,7 @@ extern unsigned int vpu_dbg_level_decoder;
#define V4L2_PIX_FMT_NV12_10BIT v4l2_fourcc('N', 'T', '1', '2') /* Y/CbCr 4:2:0 for 10bit */
#define INVALID_FRAME_DEPTH -1
#define DECODER_NODE_NUMBER 12 // use /dev/video12 as vpu decoder
#define DEFAULT_LOG_DEPTH 20
struct vpu_v4l2_control {
uint32_t id;
@ -193,8 +192,10 @@ struct vpu_dev {
struct firmware *m0_pfw;
void *m0_p_fw_space_vir;
u_int32 m0_p_fw_space_phy;
u_int32 m0_boot_size;
void *m0_rpc_virt;
u_int32 m0_rpc_phy;
u_int32 m0_rpc_size;
struct mutex dev_mutex;
struct mutex cmd_mutex;
bool fw_is_ready;