diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/0060-drm-amdgpu-enable-ABGR-and-XBGR-formats-v2.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.19.8/0060-drm-amdgpu-enable-ABGR-and-XBGR-formats-v2.patch | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/0060-drm-amdgpu-enable-ABGR-and-XBGR-formats-v2.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/0060-drm-amdgpu-enable-ABGR-and-XBGR-formats-v2.patch new file mode 100644 index 00000000..c2085c38 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/0060-drm-amdgpu-enable-ABGR-and-XBGR-formats-v2.patch @@ -0,0 +1,174 @@ +From f672a82c76e8690f2b34d25975abce1b00b61877 Mon Sep 17 00:00:00 2001 +From: Mauro Rossi <issor.oruam@gmail.com> +Date: Sun, 12 Aug 2018 21:43:02 +0200 +Subject: [PATCH 0060/2940] drm/amdgpu: enable ABGR and XBGR formats (v2) + +Add support for DRM_FORMAT_{A,X}BGR8888 in amdgpu with amd dc disabled + +(v2) Crossbar registers are defined and used to swap red and blue channels, + keeping the existing coding style in each of the dce modules. + After setting crossbar bits in fb_swap, use bitwise OR for big endian + where required in DCE6 and DCE8 which do not rely on REG_SET_FIELD() + +Signed-off-by: Mauro Rossi <issor.oruam@gmail.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/dce_v10_0.c | 11 +++++++++++ + drivers/gpu/drm/amd/amdgpu/dce_v11_0.c | 11 +++++++++++ + drivers/gpu/drm/amd/amdgpu/dce_v6_0.c | 10 ++++++++++ + drivers/gpu/drm/amd/amdgpu/dce_v8_0.c | 10 ++++++++++ + drivers/gpu/drm/amd/amdgpu/si_enums.h | 20 ++++++++++++++++++++ + drivers/gpu/drm/amd/amdgpu/sid.h | 20 ++++++++++++++++++++ + 6 files changed, 82 insertions(+) + +diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c +index 4313d6c6407d..3916aa6cc4ec 100644 +--- a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c +@@ -1943,6 +1943,17 @@ static int dce_v10_0_crtc_do_set_base(struct drm_crtc *crtc, + /* Greater 8 bpc fb needs to bypass hw-lut to retain precision */ + bypass_lut = true; + break; ++ case DRM_FORMAT_XBGR8888: ++ case DRM_FORMAT_ABGR8888: ++ fb_format = REG_SET_FIELD(0, GRPH_CONTROL, GRPH_DEPTH, 2); ++ fb_format = REG_SET_FIELD(fb_format, GRPH_CONTROL, GRPH_FORMAT, 0); ++ fb_swap = REG_SET_FIELD(fb_swap, GRPH_SWAP_CNTL, GRPH_RED_CROSSBAR, 2); ++ fb_swap = REG_SET_FIELD(fb_swap, GRPH_SWAP_CNTL, GRPH_BLUE_CROSSBAR, 2); ++#ifdef __BIG_ENDIAN ++ fb_swap = REG_SET_FIELD(fb_swap, GRPH_SWAP_CNTL, GRPH_ENDIAN_SWAP, ++ ENDIAN_8IN32); ++#endif ++ break; + default: + DRM_ERROR("Unsupported screen format %s\n", + drm_get_format_name(target_fb->format->format, &format_name)); +diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c +index e295cc18cae4..4ffb612a4e53 100644 +--- a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c +@@ -1985,6 +1985,17 @@ static int dce_v11_0_crtc_do_set_base(struct drm_crtc *crtc, + /* Greater 8 bpc fb needs to bypass hw-lut to retain precision */ + bypass_lut = true; + break; ++ case DRM_FORMAT_XBGR8888: ++ case DRM_FORMAT_ABGR8888: ++ fb_format = REG_SET_FIELD(0, GRPH_CONTROL, GRPH_DEPTH, 2); ++ fb_format = REG_SET_FIELD(fb_format, GRPH_CONTROL, GRPH_FORMAT, 0); ++ fb_swap = REG_SET_FIELD(fb_swap, GRPH_SWAP_CNTL, GRPH_RED_CROSSBAR, 2); ++ fb_swap = REG_SET_FIELD(fb_swap, GRPH_SWAP_CNTL, GRPH_BLUE_CROSSBAR, 2); ++#ifdef __BIG_ENDIAN ++ fb_swap = REG_SET_FIELD(fb_swap, GRPH_SWAP_CNTL, GRPH_ENDIAN_SWAP, ++ ENDIAN_8IN32); ++#endif ++ break; + default: + DRM_ERROR("Unsupported screen format %s\n", + drm_get_format_name(target_fb->format->format, &format_name)); +diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c +index 018dd62dc5b6..480c5348a14f 100644 +--- a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c +@@ -1888,6 +1888,16 @@ static int dce_v6_0_crtc_do_set_base(struct drm_crtc *crtc, + /* Greater 8 bpc fb needs to bypass hw-lut to retain precision */ + bypass_lut = true; + break; ++ case DRM_FORMAT_XBGR8888: ++ case DRM_FORMAT_ABGR8888: ++ fb_format = (GRPH_DEPTH(GRPH_DEPTH_32BPP) | ++ GRPH_FORMAT(GRPH_FORMAT_ARGB8888)); ++ fb_swap = (GRPH_RED_CROSSBAR(GRPH_RED_SEL_B) | ++ GRPH_BLUE_CROSSBAR(GRPH_BLUE_SEL_R)); ++#ifdef __BIG_ENDIAN ++ fb_swap |= GRPH_ENDIAN_SWAP(GRPH_ENDIAN_8IN32); ++#endif ++ break; + default: + DRM_ERROR("Unsupported screen format %s\n", + drm_get_format_name(target_fb->format->format, &format_name)); +diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c +index 2bae3ad2bbf8..797196476c94 100644 +--- a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c +@@ -1865,6 +1865,16 @@ static int dce_v8_0_crtc_do_set_base(struct drm_crtc *crtc, + /* Greater 8 bpc fb needs to bypass hw-lut to retain precision */ + bypass_lut = true; + break; ++ case DRM_FORMAT_XBGR8888: ++ case DRM_FORMAT_ABGR8888: ++ fb_format = ((GRPH_DEPTH_32BPP << GRPH_CONTROL__GRPH_DEPTH__SHIFT) | ++ (GRPH_FORMAT_ARGB8888 << GRPH_CONTROL__GRPH_FORMAT__SHIFT)); ++ fb_swap = ((GRPH_RED_SEL_B << GRPH_SWAP_CNTL__GRPH_RED_CROSSBAR__SHIFT) | ++ (GRPH_BLUE_SEL_R << GRPH_SWAP_CNTL__GRPH_BLUE_CROSSBAR__SHIFT)); ++#ifdef __BIG_ENDIAN ++ fb_swap |= (GRPH_ENDIAN_8IN32 << GRPH_SWAP_CNTL__GRPH_ENDIAN_SWAP__SHIFT); ++#endif ++ break; + default: + DRM_ERROR("Unsupported screen format %s\n", + drm_get_format_name(target_fb->format->format, &format_name)); +diff --git a/drivers/gpu/drm/amd/amdgpu/si_enums.h b/drivers/gpu/drm/amd/amdgpu/si_enums.h +index dc9e0e6b4558..790ba46eaebb 100644 +--- a/drivers/gpu/drm/amd/amdgpu/si_enums.h ++++ b/drivers/gpu/drm/amd/amdgpu/si_enums.h +@@ -46,6 +46,26 @@ + #define GRPH_ENDIAN_8IN16 1 + #define GRPH_ENDIAN_8IN32 2 + #define GRPH_ENDIAN_8IN64 3 ++#define GRPH_RED_CROSSBAR(x) (((x) & 0x3) << 4) ++#define GRPH_RED_SEL_R 0 ++#define GRPH_RED_SEL_G 1 ++#define GRPH_RED_SEL_B 2 ++#define GRPH_RED_SEL_A 3 ++#define GRPH_GREEN_CROSSBAR(x) (((x) & 0x3) << 6) ++#define GRPH_GREEN_SEL_G 0 ++#define GRPH_GREEN_SEL_B 1 ++#define GRPH_GREEN_SEL_A 2 ++#define GRPH_GREEN_SEL_R 3 ++#define GRPH_BLUE_CROSSBAR(x) (((x) & 0x3) << 8) ++#define GRPH_BLUE_SEL_B 0 ++#define GRPH_BLUE_SEL_A 1 ++#define GRPH_BLUE_SEL_R 2 ++#define GRPH_BLUE_SEL_G 3 ++#define GRPH_ALPHA_CROSSBAR(x) (((x) & 0x3) << 10) ++#define GRPH_ALPHA_SEL_A 0 ++#define GRPH_ALPHA_SEL_R 1 ++#define GRPH_ALPHA_SEL_G 2 ++#define GRPH_ALPHA_SEL_B 3 + + #define GRPH_DEPTH(x) (((x) & 0x3) << 0) + #define GRPH_DEPTH_8BPP 0 +diff --git a/drivers/gpu/drm/amd/amdgpu/sid.h b/drivers/gpu/drm/amd/amdgpu/sid.h +index c57eff159374..7cf12adb3915 100644 +--- a/drivers/gpu/drm/amd/amdgpu/sid.h ++++ b/drivers/gpu/drm/amd/amdgpu/sid.h +@@ -2201,6 +2201,26 @@ + # define EVERGREEN_GRPH_ENDIAN_8IN16 1 + # define EVERGREEN_GRPH_ENDIAN_8IN32 2 + # define EVERGREEN_GRPH_ENDIAN_8IN64 3 ++#define EVERGREEN_GRPH_RED_CROSSBAR(x) (((x) & 0x3) << 4) ++# define EVERGREEN_GRPH_RED_SEL_R 0 ++# define EVERGREEN_GRPH_RED_SEL_G 1 ++# define EVERGREEN_GRPH_RED_SEL_B 2 ++# define EVERGREEN_GRPH_RED_SEL_A 3 ++#define EVERGREEN_GRPH_GREEN_CROSSBAR(x) (((x) & 0x3) << 6) ++# define EVERGREEN_GRPH_GREEN_SEL_G 0 ++# define EVERGREEN_GRPH_GREEN_SEL_B 1 ++# define EVERGREEN_GRPH_GREEN_SEL_A 2 ++# define EVERGREEN_GRPH_GREEN_SEL_R 3 ++#define EVERGREEN_GRPH_BLUE_CROSSBAR(x) (((x) & 0x3) << 8) ++# define EVERGREEN_GRPH_BLUE_SEL_B 0 ++# define EVERGREEN_GRPH_BLUE_SEL_A 1 ++# define EVERGREEN_GRPH_BLUE_SEL_R 2 ++# define EVERGREEN_GRPH_BLUE_SEL_G 3 ++#define EVERGREEN_GRPH_ALPHA_CROSSBAR(x) (((x) & 0x3) << 10) ++# define EVERGREEN_GRPH_ALPHA_SEL_A 0 ++# define EVERGREEN_GRPH_ALPHA_SEL_R 1 ++# define EVERGREEN_GRPH_ALPHA_SEL_G 2 ++# define EVERGREEN_GRPH_ALPHA_SEL_B 3 + + #define EVERGREEN_D3VGA_CONTROL 0xf8 + #define EVERGREEN_D4VGA_CONTROL 0xf9 +-- +2.17.1 + |