|
@@ -994,6 +994,7 @@ static int evergreen_crtc_do_set_base(struct drm_crtc *crtc,
|
|
|
struct radeon_bo *rbo;
|
|
|
uint64_t fb_location;
|
|
|
uint32_t fb_format, fb_pitch_pixels, tiling_flags;
|
|
|
+ u32 fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_NONE);
|
|
|
int r;
|
|
|
|
|
|
/* no fb bound */
|
|
@@ -1045,11 +1046,17 @@ static int evergreen_crtc_do_set_base(struct drm_crtc *crtc,
|
|
|
case 16:
|
|
|
fb_format = (EVERGREEN_GRPH_DEPTH(EVERGREEN_GRPH_DEPTH_16BPP) |
|
|
|
EVERGREEN_GRPH_FORMAT(EVERGREEN_GRPH_FORMAT_ARGB565));
|
|
|
+#ifdef __BIG_ENDIAN
|
|
|
+ fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_8IN16);
|
|
|
+#endif
|
|
|
break;
|
|
|
case 24:
|
|
|
case 32:
|
|
|
fb_format = (EVERGREEN_GRPH_DEPTH(EVERGREEN_GRPH_DEPTH_32BPP) |
|
|
|
EVERGREEN_GRPH_FORMAT(EVERGREEN_GRPH_FORMAT_ARGB8888));
|
|
|
+#ifdef __BIG_ENDIAN
|
|
|
+ fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_8IN32);
|
|
|
+#endif
|
|
|
break;
|
|
|
default:
|
|
|
DRM_ERROR("Unsupported screen depth %d\n",
|
|
@@ -1094,6 +1101,7 @@ static int evergreen_crtc_do_set_base(struct drm_crtc *crtc,
|
|
|
WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
|
|
|
(u32) fb_location & EVERGREEN_GRPH_SURFACE_ADDRESS_MASK);
|
|
|
WREG32(EVERGREEN_GRPH_CONTROL + radeon_crtc->crtc_offset, fb_format);
|
|
|
+ WREG32(EVERGREEN_GRPH_SWAP_CONTROL + radeon_crtc->crtc_offset, fb_swap);
|
|
|
|
|
|
WREG32(EVERGREEN_GRPH_SURFACE_OFFSET_X + radeon_crtc->crtc_offset, 0);
|
|
|
WREG32(EVERGREEN_GRPH_SURFACE_OFFSET_Y + radeon_crtc->crtc_offset, 0);
|
|
@@ -1150,6 +1158,7 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc,
|
|
|
struct drm_framebuffer *target_fb;
|
|
|
uint64_t fb_location;
|
|
|
uint32_t fb_format, fb_pitch_pixels, tiling_flags;
|
|
|
+ u32 fb_swap = R600_D1GRPH_SWAP_ENDIAN_NONE;
|
|
|
int r;
|
|
|
|
|
|
/* no fb bound */
|
|
@@ -1203,12 +1212,18 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc,
|
|
|
fb_format =
|
|
|
AVIVO_D1GRPH_CONTROL_DEPTH_16BPP |
|
|
|
AVIVO_D1GRPH_CONTROL_16BPP_RGB565;
|
|
|
+#ifdef __BIG_ENDIAN
|
|
|
+ fb_swap = R600_D1GRPH_SWAP_ENDIAN_16BIT;
|
|
|
+#endif
|
|
|
break;
|
|
|
case 24:
|
|
|
case 32:
|
|
|
fb_format =
|
|
|
AVIVO_D1GRPH_CONTROL_DEPTH_32BPP |
|
|
|
AVIVO_D1GRPH_CONTROL_32BPP_ARGB8888;
|
|
|
+#ifdef __BIG_ENDIAN
|
|
|
+ fb_swap = R600_D1GRPH_SWAP_ENDIAN_32BIT;
|
|
|
+#endif
|
|
|
break;
|
|
|
default:
|
|
|
DRM_ERROR("Unsupported screen depth %d\n",
|
|
@@ -1248,6 +1263,8 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc,
|
|
|
WREG32(AVIVO_D1GRPH_SECONDARY_SURFACE_ADDRESS +
|
|
|
radeon_crtc->crtc_offset, (u32) fb_location);
|
|
|
WREG32(AVIVO_D1GRPH_CONTROL + radeon_crtc->crtc_offset, fb_format);
|
|
|
+ if (rdev->family >= CHIP_R600)
|
|
|
+ WREG32(R600_D1GRPH_SWAP_CONTROL + radeon_crtc->crtc_offset, fb_swap);
|
|
|
|
|
|
WREG32(AVIVO_D1GRPH_SURFACE_OFFSET_X + radeon_crtc->crtc_offset, 0);
|
|
|
WREG32(AVIVO_D1GRPH_SURFACE_OFFSET_Y + radeon_crtc->crtc_offset, 0);
|