diff options
author | Liu Ying <victor.liu@nxp.com> | 2019-11-01 13:46:52 +0800 |
---|---|---|
committer | Dong Aisheng <aisheng.dong@nxp.com> | 2019-11-25 15:58:04 +0800 |
commit | 8212c85a3c2a864559dc0b1e38f6b85c947996cf (patch) | |
tree | 360aa4d33c91e36dcf4553aa23996a504df18bfa | |
parent | acbd004cf44127db5f3116fcea360f7e09bedc78 (diff) |
gpu: imx: dpu: fetchunit: Use TKT343664&TKT339017's fixups for ->set_baseaddress()
This patch uses TKT343664&TKT339017's fixups for ->set_baseaddress().
Signed-off-by: Liu Ying <victor.liu@nxp.com>
-rw-r--r-- | drivers/gpu/drm/imx/dpu/dpu-plane.c | 5 | ||||
-rw-r--r-- | drivers/gpu/imx/dpu/dpu-fetchdecode.c | 22 | ||||
-rw-r--r-- | drivers/gpu/imx/dpu/dpu-fetchunit.c | 22 | ||||
-rw-r--r-- | include/video/dpu.h | 10 |
4 files changed, 53 insertions, 6 deletions
diff --git a/drivers/gpu/drm/imx/dpu/dpu-plane.c b/drivers/gpu/drm/imx/dpu/dpu-plane.c index 8ab1cada21af..42dbcf61a2c4 100644 --- a/drivers/gpu/drm/imx/dpu/dpu-plane.c +++ b/drivers/gpu/drm/imx/dpu/dpu-plane.c @@ -428,7 +428,7 @@ static void dpu_plane_atomic_update(struct drm_plane *plane, fu->ops->set_fmt(fu, fb->format->format, fb_is_interlaced); fu->ops->enable_src_buf(fu); fu->ops->set_framedimensions(fu, src_w, src_h, fb_is_interlaced); - fu->ops->set_baseaddress(fu, baseaddr); + fu->ops->set_baseaddress(fu, src_w, 0, 0, 0, 0, bpp, baseaddr); fu->ops->set_stream_id(fu, dplane->stream_id ? DPU_PLANE_SRC_TO_DISP_STREAM1 : DPU_PLANE_SRC_TO_DISP_STREAM0); @@ -452,7 +452,8 @@ static void dpu_plane_atomic_update(struct drm_plane *plane, fb_is_interlaced); fe->ops->set_framedimensions(fe, src_w, src_h, fb_is_interlaced); - fe->ops->set_baseaddress(fe, uv_baseaddr); + fe->ops->set_baseaddress(fe, src_w, 0, 0, 0, 0, bpp, + uv_baseaddr); fe->ops->enable_src_buf(fe); fe->ops->set_stream_id(fe, dplane->stream_id ? DPU_PLANE_SRC_TO_DISP_STREAM1 : diff --git a/drivers/gpu/imx/dpu/dpu-fetchdecode.c b/drivers/gpu/imx/dpu/dpu-fetchdecode.c index c37ed1717b4c..f5cd810f65ce 100644 --- a/drivers/gpu/imx/dpu/dpu-fetchdecode.c +++ b/drivers/gpu/imx/dpu/dpu-fetchdecode.c @@ -93,8 +93,28 @@ int fetchdecode_pixengcfg_dynamic_src_sel(struct dpu_fetchunit *fu, EXPORT_SYMBOL_GPL(fetchdecode_pixengcfg_dynamic_src_sel); static void -fetchdecode_set_baseaddress(struct dpu_fetchunit *fu, dma_addr_t baddr) +fetchdecode_set_baseaddress(struct dpu_fetchunit *fu, unsigned int width, + unsigned int x_offset, unsigned int y_offset, + unsigned int mt_w, unsigned int mt_h, + int bpp, dma_addr_t baddr) { + unsigned int burst_size, stride; + bool nonzero_mod = !!mt_w; + + if (nonzero_mod) { + /* consider PRG x offset to calculate buffer address */ + baddr += (x_offset % mt_w) * (bpp / 8); + + burst_size = fetchunit_burst_size_fixup_tkt343664(baddr); + + stride = width * (bpp / 8); + stride = fetchunit_stride_fixup_tkt339017(stride, burst_size, + baddr, nonzero_mod); + + /* consider PRG y offset to calculate buffer address */ + baddr += (y_offset % mt_h) * stride; + } + mutex_lock(&fu->mutex); dpu_fu_write(fu, BASEADDRESS0, baddr); mutex_unlock(&fu->mutex); diff --git a/drivers/gpu/imx/dpu/dpu-fetchunit.c b/drivers/gpu/imx/dpu/dpu-fetchunit.c index 65523d1d148c..f950214bb7d5 100644 --- a/drivers/gpu/imx/dpu/dpu-fetchunit.c +++ b/drivers/gpu/imx/dpu/dpu-fetchunit.c @@ -126,8 +126,28 @@ void fetchunit_set_burstlength(struct dpu_fetchunit *fu, } EXPORT_SYMBOL_GPL(fetchunit_set_burstlength); -void fetchunit_set_baseaddress(struct dpu_fetchunit *fu, dma_addr_t baddr) +void fetchunit_set_baseaddress(struct dpu_fetchunit *fu, unsigned int width, + unsigned int x_offset, unsigned int y_offset, + unsigned int mt_w, unsigned int mt_h, + int bpp, dma_addr_t baddr) { + unsigned int burst_size, stride; + bool nonzero_mod = !!mt_w; + + if (nonzero_mod) { + /* consider PRG x offset to calculate buffer address */ + baddr += (x_offset % mt_w) * (bpp / 8); + + burst_size = fetchunit_burst_size_fixup_tkt343664(baddr); + + stride = width * (bpp / 8); + stride = fetchunit_stride_fixup_tkt339017(stride, burst_size, + baddr, nonzero_mod); + + /* consider PRG y offset to calculate buffer address */ + baddr += (y_offset % mt_h) * stride; + } + mutex_lock(&fu->mutex); dpu_fu_write(fu, BASEADDRESS(fu->sub_id), baddr); mutex_unlock(&fu->mutex); diff --git a/include/video/dpu.h b/include/video/dpu.h index b5058f71cb3e..9fce4b6a339f 100644 --- a/include/video/dpu.h +++ b/include/video/dpu.h @@ -332,7 +332,10 @@ struct dpu_fetchunit_ops { unsigned int x_offset, unsigned int mt_w, int bpp, dma_addr_t baddr, bool use_prefetch); - void (*set_baseaddress)(struct dpu_fetchunit *fu, dma_addr_t baddr); + void (*set_baseaddress)(struct dpu_fetchunit *fu, unsigned int width, + unsigned int x_offset, unsigned int y_offset, + unsigned int mt_w, unsigned int mt_h, + int bpp, dma_addr_t baddr); void (*set_src_bpp)(struct dpu_fetchunit *fu, int bpp); @@ -579,7 +582,10 @@ void fetchunit_shdldreq_sticky(struct dpu_fetchunit *fu, u8 layer_mask); void fetchunit_set_burstlength(struct dpu_fetchunit *fu, unsigned int x_offset, unsigned int mt_w, int bpp, dma_addr_t baddr, bool use_prefetch); -void fetchunit_set_baseaddress(struct dpu_fetchunit *fu, dma_addr_t baddr); +void fetchunit_set_baseaddress(struct dpu_fetchunit *fu, unsigned int width, + unsigned int x_offset, unsigned int y_offset, + unsigned int mt_w, unsigned int mt_h, + int bpp, dma_addr_t baddr); void fetchunit_set_src_bpp(struct dpu_fetchunit *fu, int bpp); void fetchunit_set_src_stride(struct dpu_fetchunit *fu, unsigned int stride); void fetchunit_enable_src_buf(struct dpu_fetchunit *fu); |