Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/radeon: enable ABGR and XBGR formats (v2)

Add support for DRM_FORMAT_{A,X}BGR8888 in atombios_crtc
Swapping of red and blue channels is implemented for radeon chipsets:
DCE2/R6xx and later - crossbar registers defined where needed and used
DCE1/R5xx - AVIVO_D1GRPH_SWAP_RB bit is used

(v2) Set AVIVO_D1GRPH_SWAP_RB bit in fb_format, using bitwise OR for DCE1 path
Use bitwise OR where required for big endian settings in fb_swap
Use existing code style CHIP_R600 condition, fix typo in R600 blue crossbar

Signed-off-by: Mauro Rossi <issor.oruam@gmail.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Mauro Rossi and committed by
Alex Deucher
a69e40fd 00ecc6e6

+51 -5
+25
drivers/gpu/drm/radeon/atombios_crtc.c
··· 1254 1254 /* Greater 8 bpc fb needs to bypass hw-lut to retain precision */ 1255 1255 bypass_lut = true; 1256 1256 break; 1257 + case DRM_FORMAT_XBGR8888: 1258 + case DRM_FORMAT_ABGR8888: 1259 + fb_format = (EVERGREEN_GRPH_DEPTH(EVERGREEN_GRPH_DEPTH_32BPP) | 1260 + EVERGREEN_GRPH_FORMAT(EVERGREEN_GRPH_FORMAT_ARGB8888)); 1261 + fb_swap = (EVERGREEN_GRPH_RED_CROSSBAR(EVERGREEN_GRPH_RED_SEL_B) | 1262 + EVERGREEN_GRPH_BLUE_CROSSBAR(EVERGREEN_GRPH_BLUE_SEL_R)); 1263 + #ifdef __BIG_ENDIAN 1264 + fb_swap |= EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_8IN32); 1265 + #endif 1266 + break; 1257 1267 default: 1258 1268 DRM_ERROR("Unsupported screen format %s\n", 1259 1269 drm_get_format_name(target_fb->format->format, &format_name)); ··· 1560 1550 #endif 1561 1551 /* Greater 8 bpc fb needs to bypass hw-lut to retain precision */ 1562 1552 bypass_lut = true; 1553 + break; 1554 + case DRM_FORMAT_XBGR8888: 1555 + case DRM_FORMAT_ABGR8888: 1556 + fb_format = 1557 + AVIVO_D1GRPH_CONTROL_DEPTH_32BPP | 1558 + AVIVO_D1GRPH_CONTROL_32BPP_ARGB8888; 1559 + if (rdev->family >= CHIP_R600) 1560 + fb_swap = 1561 + (R600_D1GRPH_RED_CROSSBAR(R600_D1GRPH_RED_SEL_B) | 1562 + R600_D1GRPH_BLUE_CROSSBAR(R600_D1GRPH_BLUE_SEL_R)); 1563 + else /* DCE1 (R5xx) */ 1564 + fb_format |= AVIVO_D1GRPH_SWAP_RB; 1565 + #ifdef __BIG_ENDIAN 1566 + fb_swap |= R600_D1GRPH_SWAP_ENDIAN_32BIT; 1567 + #endif 1563 1568 break; 1564 1569 default: 1565 1570 DRM_ERROR("Unsupported screen format %s\n",
+26 -5
drivers/gpu/drm/radeon/r600_reg.h
··· 87 87 #define R600_MEDIUM_VID_LOWER_GPIO_CNTL 0x720 88 88 #define R600_LOW_VID_LOWER_GPIO_CNTL 0x724 89 89 90 - #define R600_D1GRPH_SWAP_CONTROL 0x610C 91 - # define R600_D1GRPH_SWAP_ENDIAN_NONE (0 << 0) 92 - # define R600_D1GRPH_SWAP_ENDIAN_16BIT (1 << 0) 93 - # define R600_D1GRPH_SWAP_ENDIAN_32BIT (2 << 0) 94 - # define R600_D1GRPH_SWAP_ENDIAN_64BIT (3 << 0) 90 + #define R600_D1GRPH_SWAP_CONTROL 0x610C 91 + # define R600_D1GRPH_ENDIAN_SWAP(x) (((x) & 0x3) << 0) 92 + # define R600_D1GRPH_SWAP_ENDIAN_NONE 0 93 + # define R600_D1GRPH_SWAP_ENDIAN_16BIT 1 94 + # define R600_D1GRPH_SWAP_ENDIAN_32BIT 2 95 + # define R600_D1GRPH_SWAP_ENDIAN_64BIT 3 96 + # define R600_D1GRPH_RED_CROSSBAR(x) (((x) & 0x3) << 4) 97 + # define R600_D1GRPH_RED_SEL_R 0 98 + # define R600_D1GRPH_RED_SEL_G 1 99 + # define R600_D1GRPH_RED_SEL_B 2 100 + # define R600_D1GRPH_RED_SEL_A 3 101 + # define R600_D1GRPH_GREEN_CROSSBAR(x) (((x) & 0x3) << 6) 102 + # define R600_D1GRPH_GREEN_SEL_G 0 103 + # define R600_D1GRPH_GREEN_SEL_B 1 104 + # define R600_D1GRPH_GREEN_SEL_A 2 105 + # define R600_D1GRPH_GREEN_SEL_R 3 106 + # define R600_D1GRPH_BLUE_CROSSBAR(x) (((x) & 0x3) << 8) 107 + # define R600_D1GRPH_BLUE_SEL_B 0 108 + # define R600_D1GRPH_BLUE_SEL_A 1 109 + # define R600_D1GRPH_BLUE_SEL_R 2 110 + # define R600_D1GRPH_BLUE_SEL_G 3 111 + # define R600_D1GRPH_ALPHA_CROSSBAR(x) (((x) & 0x3) << 10) 112 + # define R600_D1GRPH_ALPHA_SEL_A 0 113 + # define R600_D1GRPH_ALPHA_SEL_R 1 114 + # define R600_D1GRPH_ALPHA_SEL_G 2 115 + # define R600_D1GRPH_ALPHA_SEL_B 3 95 116 96 117 #define R600_HDP_NONSURFACE_BASE 0x2c04 97 118