aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/vc4/vc4_plane.c31
-rw-r--r--drivers/gpu/drm/vc4/vc4_regs.h19
-rw-r--r--include/uapi/drm/drm_fourcc.h23
3 files changed, 68 insertions, 5 deletions
diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c
index da18dec21696..fa6809d8b0fe 100644
--- a/drivers/gpu/drm/vc4/vc4_plane.c
+++ b/drivers/gpu/drm/vc4/vc4_plane.c
@@ -500,8 +500,8 @@ static int vc4_plane_mode_set(struct drm_plane *plane,
500 u32 ctl0_offset = vc4_state->dlist_count; 500 u32 ctl0_offset = vc4_state->dlist_count;
501 const struct hvs_format *format = vc4_get_hvs_format(fb->format->format); 501 const struct hvs_format *format = vc4_get_hvs_format(fb->format->format);
502 int num_planes = drm_format_num_planes(format->drm); 502 int num_planes = drm_format_num_planes(format->drm);
503 u32 scl0, scl1; 503 u32 scl0, scl1, pitch0;
504 u32 lbm_size; 504 u32 lbm_size, tiling;
505 unsigned long irqflags; 505 unsigned long irqflags;
506 int ret, i; 506 int ret, i;
507 507
@@ -542,11 +542,31 @@ static int vc4_plane_mode_set(struct drm_plane *plane,
542 scl1 = vc4_get_scl_field(state, 0); 542 scl1 = vc4_get_scl_field(state, 0);
543 } 543 }
544 544
545 switch (fb->modifier) {
546 case DRM_FORMAT_MOD_LINEAR:
547 tiling = SCALER_CTL0_TILING_LINEAR;
548 pitch0 = VC4_SET_FIELD(fb->pitches[0], SCALER_SRC_PITCH);
549 break;
550 case DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED:
551 tiling = SCALER_CTL0_TILING_256B_OR_T;
552
553 pitch0 = (VC4_SET_FIELD(0, SCALER_PITCH0_TILE_Y_OFFSET),
554 VC4_SET_FIELD(0, SCALER_PITCH0_TILE_WIDTH_L),
555 VC4_SET_FIELD((vc4_state->src_w[0] + 31) >> 5,
556 SCALER_PITCH0_TILE_WIDTH_R));
557 break;
558 default:
559 DRM_DEBUG_KMS("Unsupported FB tiling flag 0x%16llx",
560 (long long)fb->modifier);
561 return -EINVAL;
562 }
563
545 /* Control word */ 564 /* Control word */
546 vc4_dlist_write(vc4_state, 565 vc4_dlist_write(vc4_state,
547 SCALER_CTL0_VALID | 566 SCALER_CTL0_VALID |
548 (format->pixel_order << SCALER_CTL0_ORDER_SHIFT) | 567 (format->pixel_order << SCALER_CTL0_ORDER_SHIFT) |
549 (format->hvs << SCALER_CTL0_PIXEL_FORMAT_SHIFT) | 568 (format->hvs << SCALER_CTL0_PIXEL_FORMAT_SHIFT) |
569 VC4_SET_FIELD(tiling, SCALER_CTL0_TILING) |
550 (vc4_state->is_unity ? SCALER_CTL0_UNITY : 0) | 570 (vc4_state->is_unity ? SCALER_CTL0_UNITY : 0) |
551 VC4_SET_FIELD(scl0, SCALER_CTL0_SCL0) | 571 VC4_SET_FIELD(scl0, SCALER_CTL0_SCL0) |
552 VC4_SET_FIELD(scl1, SCALER_CTL0_SCL1)); 572 VC4_SET_FIELD(scl1, SCALER_CTL0_SCL1));
@@ -600,8 +620,11 @@ static int vc4_plane_mode_set(struct drm_plane *plane,
600 for (i = 0; i < num_planes; i++) 620 for (i = 0; i < num_planes; i++)
601 vc4_dlist_write(vc4_state, 0xc0c0c0c0); 621 vc4_dlist_write(vc4_state, 0xc0c0c0c0);
602 622
603 /* Pitch word 0/1/2 */ 623 /* Pitch word 0 */
604 for (i = 0; i < num_planes; i++) { 624 vc4_dlist_write(vc4_state, pitch0);
625
626 /* Pitch word 1/2 */
627 for (i = 1; i < num_planes; i++) {
605 vc4_dlist_write(vc4_state, 628 vc4_dlist_write(vc4_state,
606 VC4_SET_FIELD(fb->pitches[i], SCALER_SRC_PITCH)); 629 VC4_SET_FIELD(fb->pitches[i], SCALER_SRC_PITCH));
607 } 630 }
diff --git a/drivers/gpu/drm/vc4/vc4_regs.h b/drivers/gpu/drm/vc4/vc4_regs.h
index 932093936178..d382c34c1b9e 100644
--- a/drivers/gpu/drm/vc4/vc4_regs.h
+++ b/drivers/gpu/drm/vc4/vc4_regs.h
@@ -709,6 +709,13 @@ enum hvs_pixel_format {
709#define SCALER_CTL0_SIZE_MASK VC4_MASK(29, 24) 709#define SCALER_CTL0_SIZE_MASK VC4_MASK(29, 24)
710#define SCALER_CTL0_SIZE_SHIFT 24 710#define SCALER_CTL0_SIZE_SHIFT 24
711 711
712#define SCALER_CTL0_TILING_MASK VC4_MASK(21, 20)
713#define SCALER_CTL0_TILING_SHIFT 20
714#define SCALER_CTL0_TILING_LINEAR 0
715#define SCALER_CTL0_TILING_64B 1
716#define SCALER_CTL0_TILING_128B 2
717#define SCALER_CTL0_TILING_256B_OR_T 3
718
712#define SCALER_CTL0_HFLIP BIT(16) 719#define SCALER_CTL0_HFLIP BIT(16)
713#define SCALER_CTL0_VFLIP BIT(15) 720#define SCALER_CTL0_VFLIP BIT(15)
714 721
@@ -838,7 +845,19 @@ enum hvs_pixel_format {
838#define SCALER_PPF_KERNEL_OFFSET_SHIFT 0 845#define SCALER_PPF_KERNEL_OFFSET_SHIFT 0
839#define SCALER_PPF_KERNEL_UNCACHED BIT(31) 846#define SCALER_PPF_KERNEL_UNCACHED BIT(31)
840 847
848/* PITCH0/1/2 fields for raster. */
841#define SCALER_SRC_PITCH_MASK VC4_MASK(15, 0) 849#define SCALER_SRC_PITCH_MASK VC4_MASK(15, 0)
842#define SCALER_SRC_PITCH_SHIFT 0 850#define SCALER_SRC_PITCH_SHIFT 0
843 851
852/* PITCH0 fields for T-tiled. */
853#define SCALER_PITCH0_TILE_WIDTH_L_MASK VC4_MASK(22, 16)
854#define SCALER_PITCH0_TILE_WIDTH_L_SHIFT 16
855#define SCALER_PITCH0_TILE_LINE_DIR BIT(15)
856#define SCALER_PITCH0_TILE_INITIAL_LINE_DIR BIT(14)
857/* Y offset within a tile. */
858#define SCALER_PITCH0_TILE_Y_OFFSET_MASK VC4_MASK(13, 7)
859#define SCALER_PITCH0_TILE_Y_OFFSET_SHIFT 7
860#define SCALER_PITCH0_TILE_WIDTH_R_MASK VC4_MASK(6, 0)
861#define SCALER_PITCH0_TILE_WIDTH_R_SHIFT 0
862
844#endif /* VC4_REGS_H */ 863#endif /* VC4_REGS_H */
diff --git a/include/uapi/drm/drm_fourcc.h b/include/uapi/drm/drm_fourcc.h
index 55e301047b3e..7586c46f68bf 100644
--- a/include/uapi/drm/drm_fourcc.h
+++ b/include/uapi/drm/drm_fourcc.h
@@ -182,6 +182,7 @@ extern "C" {
182#define DRM_FORMAT_MOD_VENDOR_SAMSUNG 0x04 182#define DRM_FORMAT_MOD_VENDOR_SAMSUNG 0x04
183#define DRM_FORMAT_MOD_VENDOR_QCOM 0x05 183#define DRM_FORMAT_MOD_VENDOR_QCOM 0x05
184#define DRM_FORMAT_MOD_VENDOR_VIVANTE 0x06 184#define DRM_FORMAT_MOD_VENDOR_VIVANTE 0x06
185#define DRM_FORMAT_MOD_VENDOR_BROADCOM 0x07
185/* add more to the end as needed */ 186/* add more to the end as needed */
186 187
187#define fourcc_mod_code(vendor, val) \ 188#define fourcc_mod_code(vendor, val) \
@@ -306,7 +307,6 @@ extern "C" {
306 */ 307 */
307#define DRM_FORMAT_MOD_VIVANTE_SPLIT_SUPER_TILED fourcc_mod_code(VIVANTE, 4) 308#define DRM_FORMAT_MOD_VIVANTE_SPLIT_SUPER_TILED fourcc_mod_code(VIVANTE, 4)
308 309
309
310/* NVIDIA Tegra frame buffer modifiers */ 310/* NVIDIA Tegra frame buffer modifiers */
311 311
312/* 312/*
@@ -351,6 +351,27 @@ extern "C" {
351 */ 351 */
352#define NV_FORMAT_MOD_TEGRA_16BX2_BLOCK(v) fourcc_mod_tegra_code(2, v) 352#define NV_FORMAT_MOD_TEGRA_16BX2_BLOCK(v) fourcc_mod_tegra_code(2, v)
353 353
354/*
355 * Broadcom VC4 "T" format
356 *
357 * This is the primary layout that the V3D GPU can texture from (it
358 * can't do linear). The T format has:
359 *
360 * - 64b utiles of pixels in a raster-order grid according to cpp. It's 4x4
361 * pixels at 32 bit depth.
362 *
363 * - 1k subtiles made of a 4x4 raster-order grid of 64b utiles (so usually
364 * 16x16 pixels).
365 *
366 * - 4k tiles made of a 2x2 grid of 1k subtiles (so usually 32x32 pixels). On
367 * even 4k tile rows, they're arranged as (BL, TL, TR, BR), and on odd rows
368 * they're (TR, BR, BL, TL), where bottom left is start of memory.
369 *
370 * - an image made of 4k tiles in rows either left-to-right (even rows of 4k
371 * tiles) or right-to-left (odd rows of 4k tiles).
372 */
373#define DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED fourcc_mod_code(BROADCOM, 1)
374
354#if defined(__cplusplus) 375#if defined(__cplusplus)
355} 376}
356#endif 377#endif