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

drm/radeon: use pixel formats instead of depth/bpp

This disambiguates depth 16 formats, such as ARGB1555 and ARGB4444,
and depth 32 formats such as ARGB2101010 and ARGB8888.

This patch also adds support for depth 30 (XRGB2101010) framebuffers.

Signed-off-by: Fredrik Höglund <fredrik@kde.org>
Reviewed-by: Mario Kleiner <mario.kleiner.de@gmail.com>
Tested-by: Mario Kleiner <mario.kleiner.de@gmail.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Fredrik Höglund and committed by
Alex Deucher
8bae4276 bc1dfff0

+73 -16
+73 -16
drivers/gpu/drm/radeon/atombios_crtc.c
··· 1174 1174 radeon_bo_get_tiling_flags(rbo, &tiling_flags, NULL); 1175 1175 radeon_bo_unreserve(rbo); 1176 1176 1177 - switch (target_fb->bits_per_pixel) { 1178 - case 8: 1177 + switch (target_fb->pixel_format) { 1178 + case DRM_FORMAT_C8: 1179 1179 fb_format = (EVERGREEN_GRPH_DEPTH(EVERGREEN_GRPH_DEPTH_8BPP) | 1180 1180 EVERGREEN_GRPH_FORMAT(EVERGREEN_GRPH_FORMAT_INDEXED)); 1181 1181 break; 1182 - case 15: 1182 + case DRM_FORMAT_XRGB4444: 1183 + case DRM_FORMAT_ARGB4444: 1184 + fb_format = (EVERGREEN_GRPH_DEPTH(EVERGREEN_GRPH_DEPTH_16BPP) | 1185 + EVERGREEN_GRPH_FORMAT(EVERGREEN_GRPH_FORMAT_ARGB4444)); 1186 + #ifdef __BIG_ENDIAN 1187 + fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_8IN16); 1188 + #endif 1189 + break; 1190 + case DRM_FORMAT_XRGB1555: 1191 + case DRM_FORMAT_ARGB1555: 1183 1192 fb_format = (EVERGREEN_GRPH_DEPTH(EVERGREEN_GRPH_DEPTH_16BPP) | 1184 1193 EVERGREEN_GRPH_FORMAT(EVERGREEN_GRPH_FORMAT_ARGB1555)); 1194 + #ifdef __BIG_ENDIAN 1195 + fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_8IN16); 1196 + #endif 1185 1197 break; 1186 - case 16: 1198 + case DRM_FORMAT_BGRX5551: 1199 + case DRM_FORMAT_BGRA5551: 1200 + fb_format = (EVERGREEN_GRPH_DEPTH(EVERGREEN_GRPH_DEPTH_16BPP) | 1201 + EVERGREEN_GRPH_FORMAT(EVERGREEN_GRPH_FORMAT_BGRA5551)); 1202 + #ifdef __BIG_ENDIAN 1203 + fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_8IN16); 1204 + #endif 1205 + break; 1206 + case DRM_FORMAT_RGB565: 1187 1207 fb_format = (EVERGREEN_GRPH_DEPTH(EVERGREEN_GRPH_DEPTH_16BPP) | 1188 1208 EVERGREEN_GRPH_FORMAT(EVERGREEN_GRPH_FORMAT_ARGB565)); 1189 1209 #ifdef __BIG_ENDIAN 1190 1210 fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_8IN16); 1191 1211 #endif 1192 1212 break; 1193 - case 24: 1194 - case 32: 1213 + case DRM_FORMAT_XRGB8888: 1214 + case DRM_FORMAT_ARGB8888: 1195 1215 fb_format = (EVERGREEN_GRPH_DEPTH(EVERGREEN_GRPH_DEPTH_32BPP) | 1196 1216 EVERGREEN_GRPH_FORMAT(EVERGREEN_GRPH_FORMAT_ARGB8888)); 1197 1217 #ifdef __BIG_ENDIAN 1198 1218 fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_8IN32); 1199 1219 #endif 1200 1220 break; 1221 + case DRM_FORMAT_XRGB2101010: 1222 + case DRM_FORMAT_ARGB2101010: 1223 + fb_format = (EVERGREEN_GRPH_DEPTH(EVERGREEN_GRPH_DEPTH_32BPP) | 1224 + EVERGREEN_GRPH_FORMAT(EVERGREEN_GRPH_FORMAT_ARGB2101010)); 1225 + #ifdef __BIG_ENDIAN 1226 + fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_8IN32); 1227 + #endif 1228 + break; 1229 + case DRM_FORMAT_BGRX1010102: 1230 + case DRM_FORMAT_BGRA1010102: 1231 + fb_format = (EVERGREEN_GRPH_DEPTH(EVERGREEN_GRPH_DEPTH_32BPP) | 1232 + EVERGREEN_GRPH_FORMAT(EVERGREEN_GRPH_FORMAT_BGRA1010102)); 1233 + #ifdef __BIG_ENDIAN 1234 + fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_8IN32); 1235 + #endif 1236 + break; 1201 1237 default: 1202 - DRM_ERROR("Unsupported screen depth %d\n", 1203 - target_fb->bits_per_pixel); 1238 + DRM_ERROR("Unsupported screen format %s\n", 1239 + drm_get_format_name(target_fb->pixel_format)); 1204 1240 return -EINVAL; 1205 1241 } 1206 1242 ··· 1469 1433 radeon_bo_get_tiling_flags(rbo, &tiling_flags, NULL); 1470 1434 radeon_bo_unreserve(rbo); 1471 1435 1472 - switch (target_fb->bits_per_pixel) { 1473 - case 8: 1436 + switch (target_fb->pixel_format) { 1437 + case DRM_FORMAT_C8: 1474 1438 fb_format = 1475 1439 AVIVO_D1GRPH_CONTROL_DEPTH_8BPP | 1476 1440 AVIVO_D1GRPH_CONTROL_8BPP_INDEXED; 1477 1441 break; 1478 - case 15: 1442 + case DRM_FORMAT_XRGB4444: 1443 + case DRM_FORMAT_ARGB4444: 1444 + fb_format = 1445 + AVIVO_D1GRPH_CONTROL_DEPTH_16BPP | 1446 + AVIVO_D1GRPH_CONTROL_16BPP_ARGB4444; 1447 + #ifdef __BIG_ENDIAN 1448 + fb_swap = R600_D1GRPH_SWAP_ENDIAN_16BIT; 1449 + #endif 1450 + break; 1451 + case DRM_FORMAT_XRGB1555: 1479 1452 fb_format = 1480 1453 AVIVO_D1GRPH_CONTROL_DEPTH_16BPP | 1481 1454 AVIVO_D1GRPH_CONTROL_16BPP_ARGB1555; 1455 + #ifdef __BIG_ENDIAN 1456 + fb_swap = R600_D1GRPH_SWAP_ENDIAN_16BIT; 1457 + #endif 1482 1458 break; 1483 - case 16: 1459 + case DRM_FORMAT_RGB565: 1484 1460 fb_format = 1485 1461 AVIVO_D1GRPH_CONTROL_DEPTH_16BPP | 1486 1462 AVIVO_D1GRPH_CONTROL_16BPP_RGB565; ··· 1500 1452 fb_swap = R600_D1GRPH_SWAP_ENDIAN_16BIT; 1501 1453 #endif 1502 1454 break; 1503 - case 24: 1504 - case 32: 1455 + case DRM_FORMAT_XRGB8888: 1456 + case DRM_FORMAT_ARGB8888: 1505 1457 fb_format = 1506 1458 AVIVO_D1GRPH_CONTROL_DEPTH_32BPP | 1507 1459 AVIVO_D1GRPH_CONTROL_32BPP_ARGB8888; ··· 1509 1461 fb_swap = R600_D1GRPH_SWAP_ENDIAN_32BIT; 1510 1462 #endif 1511 1463 break; 1464 + case DRM_FORMAT_XRGB2101010: 1465 + case DRM_FORMAT_ARGB2101010: 1466 + fb_format = 1467 + AVIVO_D1GRPH_CONTROL_DEPTH_32BPP | 1468 + AVIVO_D1GRPH_CONTROL_32BPP_ARGB2101010; 1469 + #ifdef __BIG_ENDIAN 1470 + fb_swap = R600_D1GRPH_SWAP_ENDIAN_32BIT; 1471 + #endif 1472 + break; 1512 1473 default: 1513 - DRM_ERROR("Unsupported screen depth %d\n", 1514 - target_fb->bits_per_pixel); 1474 + DRM_ERROR("Unsupported screen format %s\n", 1475 + drm_get_format_name(target_fb->pixel_format)); 1515 1476 return -EINVAL; 1516 1477 } 1517 1478