aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLucas Stach <l.stach@pengutronix.de>2017-11-10 11:09:58 -0500
committerPhilipp Zabel <p.zabel@pengutronix.de>2017-12-19 06:49:11 -0500
commit2f64a554435da851a9593115b96bdc67e455047a (patch)
tree7857a1f6e364a4038ec13263b33fd57b18cb647a
parent729440897312c281367fe7fa1461e244dd84ec97 (diff)
gpu: ipu-v3: pre: add tiled prefetch support
This configures the TPR unit, using the DRM format modifier. For now only the single buffer modifiers are supported, as split buffer needs more configuration for the required cropping. Signed-off-by: Lucas Stach <l.stach@pengutronix.de> [p.zabel@pengutronix.de: rebased after ERR009624 workaround] Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
-rw-r--r--drivers/gpu/ipu-v3/ipu-pre.c29
-rw-r--r--drivers/gpu/ipu-v3/ipu-prg.c2
-rw-r--r--drivers/gpu/ipu-v3/ipu-prv.h4
3 files changed, 29 insertions, 6 deletions
diff --git a/drivers/gpu/ipu-v3/ipu-pre.c b/drivers/gpu/ipu-v3/ipu-pre.c
index c860a7997cb5..f1cec3d70498 100644
--- a/drivers/gpu/ipu-v3/ipu-pre.c
+++ b/drivers/gpu/ipu-v3/ipu-pre.c
@@ -49,6 +49,10 @@
49#define IPU_PRE_TPR_CTRL 0x070 49#define IPU_PRE_TPR_CTRL 0x070
50#define IPU_PRE_TPR_CTRL_TILE_FORMAT(v) ((v & 0xff) << 0) 50#define IPU_PRE_TPR_CTRL_TILE_FORMAT(v) ((v & 0xff) << 0)
51#define IPU_PRE_TPR_CTRL_TILE_FORMAT_MASK 0xff 51#define IPU_PRE_TPR_CTRL_TILE_FORMAT_MASK 0xff
52#define IPU_PRE_TPR_CTRL_TILE_FORMAT_16_BIT (1 << 0)
53#define IPU_PRE_TPR_CTRL_TILE_FORMAT_SPLIT_BUF (1 << 4)
54#define IPU_PRE_TPR_CTRL_TILE_FORMAT_SINGLE_BUF (1 << 5)
55#define IPU_PRE_TPR_CTRL_TILE_FORMAT_SUPER_TILED (1 << 6)
52 56
53#define IPU_PRE_PREFETCH_ENG_CTRL 0x080 57#define IPU_PRE_PREFETCH_ENG_CTRL 0x080
54#define IPU_PRE_PREF_ENG_CTRL_PREFETCH_EN (1 << 0) 58#define IPU_PRE_PREF_ENG_CTRL_PREFETCH_EN (1 << 0)
@@ -147,7 +151,7 @@ int ipu_pre_get(struct ipu_pre *pre)
147 val = IPU_PRE_CTRL_HANDSHAKE_ABORT_SKIP_EN | 151 val = IPU_PRE_CTRL_HANDSHAKE_ABORT_SKIP_EN |
148 IPU_PRE_CTRL_HANDSHAKE_EN | 152 IPU_PRE_CTRL_HANDSHAKE_EN |
149 IPU_PRE_CTRL_TPR_REST_SEL | 153 IPU_PRE_CTRL_TPR_REST_SEL |
150 IPU_PRE_CTRL_BLOCK_16 | IPU_PRE_CTRL_SDW_UPDATE; 154 IPU_PRE_CTRL_SDW_UPDATE;
151 writel(val, pre->regs + IPU_PRE_CTRL); 155 writel(val, pre->regs + IPU_PRE_CTRL);
152 156
153 pre->in_use = true; 157 pre->in_use = true;
@@ -163,14 +167,17 @@ void ipu_pre_put(struct ipu_pre *pre)
163 167
164void ipu_pre_configure(struct ipu_pre *pre, unsigned int width, 168void ipu_pre_configure(struct ipu_pre *pre, unsigned int width,
165 unsigned int height, unsigned int stride, u32 format, 169 unsigned int height, unsigned int stride, u32 format,
166 unsigned int bufaddr) 170 uint64_t modifier, unsigned int bufaddr)
167{ 171{
168 const struct drm_format_info *info = drm_format_info(format); 172 const struct drm_format_info *info = drm_format_info(format);
169 u32 active_bpp = info->cpp[0] >> 1; 173 u32 active_bpp = info->cpp[0] >> 1;
170 u32 val; 174 u32 val;
171 175
172 /* calculate safe window for ctrl register updates */ 176 /* calculate safe window for ctrl register updates */
173 pre->safe_window_end = height - 2; 177 if (modifier == DRM_FORMAT_MOD_LINEAR)
178 pre->safe_window_end = height - 2;
179 else
180 pre->safe_window_end = DIV_ROUND_UP(height, 4) - 1;
174 181
175 writel(bufaddr, pre->regs + IPU_PRE_CUR_BUF); 182 writel(bufaddr, pre->regs + IPU_PRE_CUR_BUF);
176 writel(bufaddr, pre->regs + IPU_PRE_NEXT_BUF); 183 writel(bufaddr, pre->regs + IPU_PRE_NEXT_BUF);
@@ -203,9 +210,25 @@ void ipu_pre_configure(struct ipu_pre *pre, unsigned int width,
203 210
204 writel(pre->buffer_paddr, pre->regs + IPU_PRE_STORE_ENG_ADDR); 211 writel(pre->buffer_paddr, pre->regs + IPU_PRE_STORE_ENG_ADDR);
205 212
213 val = readl(pre->regs + IPU_PRE_TPR_CTRL);
214 val &= ~IPU_PRE_TPR_CTRL_TILE_FORMAT_MASK;
215 if (modifier != DRM_FORMAT_MOD_LINEAR) {
216 /* only support single buffer formats for now */
217 val |= IPU_PRE_TPR_CTRL_TILE_FORMAT_SINGLE_BUF;
218 if (modifier == DRM_FORMAT_MOD_VIVANTE_SUPER_TILED)
219 val |= IPU_PRE_TPR_CTRL_TILE_FORMAT_SUPER_TILED;
220 if (info->cpp[0] == 2)
221 val |= IPU_PRE_TPR_CTRL_TILE_FORMAT_16_BIT;
222 }
223 writel(val, pre->regs + IPU_PRE_TPR_CTRL);
224
206 val = readl(pre->regs + IPU_PRE_CTRL); 225 val = readl(pre->regs + IPU_PRE_CTRL);
207 val |= IPU_PRE_CTRL_EN_REPEAT | IPU_PRE_CTRL_ENABLE | 226 val |= IPU_PRE_CTRL_EN_REPEAT | IPU_PRE_CTRL_ENABLE |
208 IPU_PRE_CTRL_SDW_UPDATE; 227 IPU_PRE_CTRL_SDW_UPDATE;
228 if (modifier == DRM_FORMAT_MOD_LINEAR)
229 val &= ~IPU_PRE_CTRL_BLOCK_EN;
230 else
231 val |= IPU_PRE_CTRL_BLOCK_EN;
209 writel(val, pre->regs + IPU_PRE_CTRL); 232 writel(val, pre->regs + IPU_PRE_CTRL);
210} 233}
211 234
diff --git a/drivers/gpu/ipu-v3/ipu-prg.c b/drivers/gpu/ipu-v3/ipu-prg.c
index fd98f48e8a08..1a4d3a635d1d 100644
--- a/drivers/gpu/ipu-v3/ipu-prg.c
+++ b/drivers/gpu/ipu-v3/ipu-prg.c
@@ -287,7 +287,7 @@ int ipu_prg_channel_configure(struct ipuv3_channel *ipu_chan,
287 return ret; 287 return ret;
288 288
289 ipu_pre_configure(prg->pres[chan->used_pre], 289 ipu_pre_configure(prg->pres[chan->used_pre],
290 width, height, stride, format, *eba); 290 width, height, stride, format, 0, *eba);
291 291
292 292
293 pm_runtime_get_sync(prg->dev); 293 pm_runtime_get_sync(prg->dev);
diff --git a/drivers/gpu/ipu-v3/ipu-prv.h b/drivers/gpu/ipu-v3/ipu-prv.h
index ac4b8d658500..d6beee99b6b8 100644
--- a/drivers/gpu/ipu-v3/ipu-prv.h
+++ b/drivers/gpu/ipu-v3/ipu-prv.h
@@ -269,8 +269,8 @@ int ipu_pre_get(struct ipu_pre *pre);
269void ipu_pre_put(struct ipu_pre *pre); 269void ipu_pre_put(struct ipu_pre *pre);
270u32 ipu_pre_get_baddr(struct ipu_pre *pre); 270u32 ipu_pre_get_baddr(struct ipu_pre *pre);
271void ipu_pre_configure(struct ipu_pre *pre, unsigned int width, 271void ipu_pre_configure(struct ipu_pre *pre, unsigned int width,
272 unsigned int height, 272 unsigned int height, unsigned int stride, u32 format,
273 unsigned int stride, u32 format, unsigned int bufaddr); 273 uint64_t modifier, unsigned int bufaddr);
274void ipu_pre_update(struct ipu_pre *pre, unsigned int bufaddr); 274void ipu_pre_update(struct ipu_pre *pre, unsigned int bufaddr);
275 275
276struct ipu_prg *ipu_prg_lookup_by_phandle(struct device *dev, const char *name, 276struct ipu_prg *ipu_prg_lookup_by_phandle(struct device *dev, const char *name,