MLK-15110-18 gpu: imx: dpu: fetcheco: Add helper fetcheco_set_burstlength()
authorLiu Ying <victor.liu@nxp.com>
Mon, 7 Aug 2017 05:24:21 +0000 (13:24 +0800)
committerNitin Garg <nitin.garg@nxp.com>
Tue, 20 Mar 2018 19:50:52 +0000 (14:50 -0500)
This patch adds helper fetcheco_set_burstlength() so that
the burst length of fetcheco can be set to appropriate value.
When we don't use prefetch engine, the burst length is set to
the maximal value - 16.  When we use prefetch engine, the burst
length should make the buffer base address align to burst size
but not greater than 16.  This alignment operation can address
the issue recorded by TKT343664.

Signed-off-by: Liu Ying <victor.liu@nxp.com>
drivers/gpu/imx/dpu/dpu-fetcheco.c
include/video/dpu.h

index 91aaec4..178ecae 100644 (file)
@@ -88,6 +88,37 @@ void fetcheco_shden(struct dpu_fetcheco *fe, bool enable)
 }
 EXPORT_SYMBOL_GPL(fetcheco_shden);
 
+void fetcheco_set_burstlength(struct dpu_fetcheco *fe, dma_addr_t baddr,
+                             bool use_prefetch)
+{
+       struct dpu_soc *dpu = fe->dpu;
+       unsigned int burst_size, burst_length;
+       u32 val;
+
+       if (use_prefetch) {
+               /*
+                * address TKT343664:
+                * fetch unit base address has to align to burst size
+                */
+               burst_size = 1 << (ffs(baddr) - 1);
+               burst_size = min(burst_size, 128U);
+               burst_length = burst_size / 8;
+       } else {
+               burst_length = 16;
+       }
+
+       mutex_lock(&fe->mutex);
+       val = dpu_fe_read(fe, BURSTBUFFERMANAGEMENT);
+       val &= ~SETBURSTLENGTH_MASK;
+       val |= SETBURSTLENGTH(burst_length);
+       dpu_fe_write(fe, val, BURSTBUFFERMANAGEMENT);
+       mutex_unlock(&fe->mutex);
+
+       dev_dbg(dpu->dev, "FetchEco%d burst length is %u\n",
+                                               fe->id, burst_length);
+}
+EXPORT_SYMBOL_GPL(fetcheco_set_burstlength);
+
 void fetcheco_baseaddress(struct dpu_fetcheco *fe, dma_addr_t paddr)
 {
        mutex_lock(&fe->mutex);
index dd82df2..ddec9c5 100644 (file)
@@ -541,6 +541,8 @@ void dpu_fd_put(struct dpu_fetchdecode *fd);
 /* Fetch ECO Unit */
 struct dpu_fetcheco;
 void fetcheco_shden(struct dpu_fetcheco *fe, bool enable);
+void fetcheco_set_burstlength(struct dpu_fetcheco *fe, dma_addr_t baddr,
+                             bool use_prefetch);
 void fetcheco_baseaddress(struct dpu_fetcheco *fe, dma_addr_t paddr);
 void fetcheco_source_bpp(struct dpu_fetcheco *fe, int bpp);
 void fetcheco_source_stride(struct dpu_fetcheco *fe, int stride);