950-0830-vc4-hvs-Updates-to-support-D0-alpha-and-csc-changes.patch 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. From efc0d85363a0e089ec3cdd0fbee58b4320fca449 Mon Sep 17 00:00:00 2001
  2. From: Dom Cobley <[email protected]>
  3. Date: Fri, 12 Jan 2024 15:48:14 +0000
  4. Subject: [PATCH 0830/1085] vc4/hvs: Updates to support D0 alpha and csc
  5. changes
  6. 2712D0 has a simpler colourspace conversion matrix block
  7. so set that up.
  8. Signed-off-by: Dom Cobley <[email protected]>
  9. ---
  10. drivers/gpu/drm/vc4/vc4_hvs.c | 73 ++++++++++++++++++++++-----------
  11. drivers/gpu/drm/vc4/vc4_plane.c | 20 +++++++--
  12. drivers/gpu/drm/vc4/vc4_regs.h | 3 ++
  13. 3 files changed, 67 insertions(+), 29 deletions(-)
  14. --- a/drivers/gpu/drm/vc4/vc4_hvs.c
  15. +++ b/drivers/gpu/drm/vc4/vc4_hvs.c
  16. @@ -1903,6 +1903,17 @@ static int vc4_hvs_hw_init(struct vc4_hv
  17. #define CFC1_N_MA_CSC_COEFF_C23(x) (0xa03c + ((x) * 0x3000))
  18. #define CFC1_N_MA_CSC_COEFF_C24(x) (0xa040 + ((x) * 0x3000))
  19. +#define SCALER_PI_CMP_CSC_RED0(x) (0x200 + ((x) * 0x40))
  20. +#define SCALER_PI_CMP_CSC_RED1(x) (0x204 + ((x) * 0x40))
  21. +#define SCALER_PI_CMP_CSC_RED_CLAMP(x) (0x208 + ((x) * 0x40))
  22. +#define SCALER_PI_CMP_CSC_CFG(x) (0x20c + ((x) * 0x40))
  23. +#define SCALER_PI_CMP_CSC_GREEN0(x) (0x210 + ((x) * 0x40))
  24. +#define SCALER_PI_CMP_CSC_GREEN1(x) (0x214 + ((x) * 0x40))
  25. +#define SCALER_PI_CMP_CSC_GREEN_CLAMP(x) (0x218 + ((x) * 0x40))
  26. +#define SCALER_PI_CMP_CSC_BLUE0(x) (0x220 + ((x) * 0x40))
  27. +#define SCALER_PI_CMP_CSC_BLUE1(x) (0x224 + ((x) * 0x40))
  28. +#define SCALER_PI_CMP_CSC_BLUE_CLAMP(x) (0x228 + ((x) * 0x40))
  29. +
  30. /* 4 S2.22 multiplication factors, and 1 S9.15 addititive element for each of 3
  31. * output components
  32. */
  33. @@ -1973,31 +1984,43 @@ static int vc6_hvs_hw_init(struct vc4_hv
  34. HVS_WRITE(SCALER6(PRI_MAP0), 0xffffffff);
  35. HVS_WRITE(SCALER6(PRI_MAP1), 0xffffffff);
  36. - if (hvs->vc4->step_d0)
  37. - return;
  38. -
  39. - for (i = 0; i < 6; i++) {
  40. - coeffs = &csc_coeffs[i / 3][i % 3];
  41. -
  42. - HVS_WRITE(CFC1_N_MA_CSC_COEFF_C00(i), coeffs->csc[0][0]);
  43. - HVS_WRITE(CFC1_N_MA_CSC_COEFF_C01(i), coeffs->csc[0][1]);
  44. - HVS_WRITE(CFC1_N_MA_CSC_COEFF_C02(i), coeffs->csc[0][2]);
  45. - HVS_WRITE(CFC1_N_MA_CSC_COEFF_C03(i), coeffs->csc[0][3]);
  46. - HVS_WRITE(CFC1_N_MA_CSC_COEFF_C04(i), coeffs->csc[0][4]);
  47. -
  48. - HVS_WRITE(CFC1_N_MA_CSC_COEFF_C10(i), coeffs->csc[1][0]);
  49. - HVS_WRITE(CFC1_N_MA_CSC_COEFF_C11(i), coeffs->csc[1][1]);
  50. - HVS_WRITE(CFC1_N_MA_CSC_COEFF_C12(i), coeffs->csc[1][2]);
  51. - HVS_WRITE(CFC1_N_MA_CSC_COEFF_C13(i), coeffs->csc[1][3]);
  52. - HVS_WRITE(CFC1_N_MA_CSC_COEFF_C14(i), coeffs->csc[1][4]);
  53. -
  54. - HVS_WRITE(CFC1_N_MA_CSC_COEFF_C20(i), coeffs->csc[2][0]);
  55. - HVS_WRITE(CFC1_N_MA_CSC_COEFF_C21(i), coeffs->csc[2][1]);
  56. - HVS_WRITE(CFC1_N_MA_CSC_COEFF_C22(i), coeffs->csc[2][2]);
  57. - HVS_WRITE(CFC1_N_MA_CSC_COEFF_C23(i), coeffs->csc[2][3]);
  58. - HVS_WRITE(CFC1_N_MA_CSC_COEFF_C24(i), coeffs->csc[2][4]);
  59. + if (hvs->vc4->step_d0) {
  60. + for (i = 0; i < 8; i++) {
  61. + HVS_WRITE(SCALER_PI_CMP_CSC_RED0(i), 0x1f002566);
  62. + HVS_WRITE(SCALER_PI_CMP_CSC_RED1(i), 0x3994);
  63. + HVS_WRITE(SCALER_PI_CMP_CSC_RED_CLAMP(i), 0xfff00000);
  64. + HVS_WRITE(SCALER_PI_CMP_CSC_CFG(i), 0x1);
  65. + HVS_WRITE(SCALER_PI_CMP_CSC_GREEN0(i), 0x18002566);
  66. + HVS_WRITE(SCALER_PI_CMP_CSC_GREEN1(i), 0xf927eee2);
  67. + HVS_WRITE(SCALER_PI_CMP_CSC_GREEN_CLAMP(i), 0xfff00000);
  68. + HVS_WRITE(SCALER_PI_CMP_CSC_BLUE0(i), 0x18002566);
  69. + HVS_WRITE(SCALER_PI_CMP_CSC_BLUE1(i), 0x43d80000);
  70. + HVS_WRITE(SCALER_PI_CMP_CSC_BLUE_CLAMP(i), 0xfff00000);
  71. + }
  72. + } else {
  73. + for (i = 0; i < 6; i++) {
  74. + coeffs = &csc_coeffs[i / 3][i % 3];
  75. +
  76. + HVS_WRITE(CFC1_N_MA_CSC_COEFF_C00(i), coeffs->csc[0][0]);
  77. + HVS_WRITE(CFC1_N_MA_CSC_COEFF_C01(i), coeffs->csc[0][1]);
  78. + HVS_WRITE(CFC1_N_MA_CSC_COEFF_C02(i), coeffs->csc[0][2]);
  79. + HVS_WRITE(CFC1_N_MA_CSC_COEFF_C03(i), coeffs->csc[0][3]);
  80. + HVS_WRITE(CFC1_N_MA_CSC_COEFF_C04(i), coeffs->csc[0][4]);
  81. +
  82. + HVS_WRITE(CFC1_N_MA_CSC_COEFF_C10(i), coeffs->csc[1][0]);
  83. + HVS_WRITE(CFC1_N_MA_CSC_COEFF_C11(i), coeffs->csc[1][1]);
  84. + HVS_WRITE(CFC1_N_MA_CSC_COEFF_C12(i), coeffs->csc[1][2]);
  85. + HVS_WRITE(CFC1_N_MA_CSC_COEFF_C13(i), coeffs->csc[1][3]);
  86. + HVS_WRITE(CFC1_N_MA_CSC_COEFF_C14(i), coeffs->csc[1][4]);
  87. +
  88. + HVS_WRITE(CFC1_N_MA_CSC_COEFF_C20(i), coeffs->csc[2][0]);
  89. + HVS_WRITE(CFC1_N_MA_CSC_COEFF_C21(i), coeffs->csc[2][1]);
  90. + HVS_WRITE(CFC1_N_MA_CSC_COEFF_C22(i), coeffs->csc[2][2]);
  91. + HVS_WRITE(CFC1_N_MA_CSC_COEFF_C23(i), coeffs->csc[2][3]);
  92. + HVS_WRITE(CFC1_N_MA_CSC_COEFF_C24(i), coeffs->csc[2][4]);
  93. - HVS_WRITE(CFC1_N_NL_CSC_CTRL(i), BIT(15));
  94. + HVS_WRITE(CFC1_N_NL_CSC_CTRL(i), BIT(15));
  95. + }
  96. }
  97. return 0;
  98. --- a/drivers/gpu/drm/vc4/vc4_plane.c
  99. +++ b/drivers/gpu/drm/vc4/vc4_plane.c
  100. @@ -1080,6 +1080,12 @@ static u32 vc4_hvs5_get_alpha_blend_mode
  101. WARN_ON_ONCE(vc4->gen != VC4_GEN_5 && vc4->gen != VC4_GEN_6);
  102. + if (vc4->gen == VC4_GEN_6 && vc4->step_d0) {
  103. + return state->pixel_blend_mode == DRM_MODE_BLEND_PREMULTI ?
  104. + SCALER5_CTL2_ALPHA_PREMULT : 0;
  105. + }
  106. +
  107. +
  108. if (!state->fb->format->has_alpha)
  109. return VC4_SET_FIELD(SCALER5_CTL2_ALPHA_MODE_FIXED,
  110. SCALER5_CTL2_ALPHA_MODE);
  111. @@ -1595,14 +1601,13 @@ static int vc4_plane_mode_set(struct drm
  112. static u32 vc6_plane_get_csc_mode(struct vc4_plane_state *vc4_state)
  113. {
  114. struct drm_plane_state *state = &vc4_state->base;
  115. + struct vc4_dev *vc4 = to_vc4_dev(state->plane->dev);
  116. u32 ret = 0;
  117. if (vc4_state->is_yuv) {
  118. enum drm_color_encoding color_encoding = state->color_encoding;
  119. enum drm_color_range color_range = state->color_range;
  120. - ret |= SCALER6_CTL2_CSC_ENABLE;
  121. -
  122. /* CSC pre-loaded with:
  123. * 0 = BT601 limited range
  124. * 1 = BT709 limited range
  125. @@ -1616,8 +1621,15 @@ static u32 vc6_plane_get_csc_mode(struct
  126. if (color_range > DRM_COLOR_YCBCR_FULL_RANGE)
  127. color_range = DRM_COLOR_YCBCR_LIMITED_RANGE;
  128. - ret |= VC4_SET_FIELD(color_encoding + (color_range * 3),
  129. - SCALER6_CTL2_BRCM_CFC_CONTROL);
  130. + if (vc4->step_d0) {
  131. + ret |= SCALER6D0_CTL2_CSC_ENABLE;
  132. + ret |= VC4_SET_FIELD(color_encoding + (color_range * 3),
  133. + SCALER6D0_CTL2_BRCM_CFC_CONTROL);
  134. + } else {
  135. + ret |= SCALER6_CTL2_CSC_ENABLE;
  136. + ret |= VC4_SET_FIELD(color_encoding + (color_range * 3),
  137. + SCALER6_CTL2_BRCM_CFC_CONTROL);
  138. + }
  139. }
  140. return ret;
  141. --- a/drivers/gpu/drm/vc4/vc4_regs.h
  142. +++ b/drivers/gpu/drm/vc4/vc4_regs.h
  143. @@ -1417,6 +1417,9 @@ enum hvs_pixel_format {
  144. #define SCALER6_CTL2_BRCM_CFC_CONTROL_MASK VC4_MASK(18, 16)
  145. #define SCALER6_CTL2_ALPHA_MASK VC4_MASK(15, 4)
  146. +#define SCALER6D0_CTL2_CSC_ENABLE BIT(19)
  147. +#define SCALER6D0_CTL2_BRCM_CFC_CONTROL_MASK VC4_MASK(22, 20)
  148. +
  149. #define SCALER6_POS1_SCL_LINES_MASK VC4_MASK(28, 16)
  150. #define SCALER6_POS1_SCL_WIDTH_MASK VC4_MASK(12, 0)