summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiu Ying <victor.liu@nxp.com>2019-11-01 13:46:52 +0800
committerDong Aisheng <aisheng.dong@nxp.com>2019-11-25 15:58:04 +0800
commit8212c85a3c2a864559dc0b1e38f6b85c947996cf (patch)
tree360aa4d33c91e36dcf4553aa23996a504df18bfa
parentacbd004cf44127db5f3116fcea360f7e09bedc78 (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.c5
-rw-r--r--drivers/gpu/imx/dpu/dpu-fetchdecode.c22
-rw-r--r--drivers/gpu/imx/dpu/dpu-fetchunit.c22
-rw-r--r--include/video/dpu.h10
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);