• Hsin-Yi Wang's avatar
    media: mtk-vpu: avoid unaligned access to DTCM buffer. · e6599adf
    Hsin-Yi Wang authored
    Previously, vpu->recv_buf and send_buf are forced cast from
    void __iomem *tcm. vpu->recv_buf->share_buf is passed to
    vpu_ipi_desc.handler(). It's not able to do unaligned access. Otherwise
    kernel would crash due to unable to handle kernel paging request.
    
    struct vpu_run {
    	u32 signaled;
    	char fw_ver[VPU_FW_VER_LEN];
    	unsigned int	dec_capability;
    	unsigned int	enc_capability;
    	wait_queue_head_t wq;
    };
    
    fw_ver starts at 4 byte boundary. If system enables
    CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS, strscpy() will do
    read_word_at_a_time(), which tries to read 8-byte: *(unsigned long *)addr
    
    vpu_init_ipi_handler() calls strscpy(), which would lead to crash.
    
    vpu_init_ipi_handler() and several other handlers (eg.
    vpu_dec_ipi_handler) only do read access to this data, so they can be
    const, and we can use memcpy_fromio() to copy the buf to another non iomem
    buffer then pass to handler.
    
    Fixes: 85709cbf ("media: replace strncpy() by strscpy()")
    Signed-off-by: default avatarHsin-Yi Wang <hsinyi@chromium.org>
    Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
    e6599adf
mtk_mdp_vpu.c 3.19 KB