| From 845b3e926d33a56b6509d157cb18a7d28faf46a9 Mon Sep 17 00:00:00 2001 |
| From: Daniel Kolesa <daniel@octaforge.org> |
| Date: Sat, 8 Aug 2020 22:44:58 +0200 |
| Subject: [PATCH] UPSTREAM: drm/amd/display: add DCN support for aarch64 |
| |
| This adds ARM64 support into the DCN. This mainly enables support |
| for Navi graphics cards. The dcn10 changes haven't been tested, |
| since I don't have the relevant hardware available, but there |
| is no way to conditionally disable them, so I've done them anyway. |
| |
| Signed-off-by: Daniel Kolesa <daniel@octaforge.org> |
| Signed-off-by: Alex Deucher <alexander.deucher@amd.com> |
| (cherry picked from commit c38d444e44badc557cf29fdfdfb823604890ccfa) |
| Signed-off-by: Sean Paul <seanpaul@chromium.org> |
| |
| BUG=b:177892854 |
| TEST=Tested on volteer, build-tested trogdor |
| |
| Change-Id: I9132f0e9baad53a35bd84e59c9579f4b44d101b5 |
| --- |
| drivers/gpu/drm/amd/display/Kconfig | 2 +- |
| drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.c | 6 ++++++ |
| drivers/gpu/drm/amd/display/dc/calcs/Makefile | 4 ++++ |
| drivers/gpu/drm/amd/display/dc/clk_mgr/Makefile | 7 +++++++ |
| drivers/gpu/drm/amd/display/dc/dcn10/Makefile | 7 +++++++ |
| drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c | 7 +++++++ |
| drivers/gpu/drm/amd/display/dc/dcn20/Makefile | 4 ++++ |
| drivers/gpu/drm/amd/display/dc/dcn21/Makefile | 4 ++++ |
| drivers/gpu/drm/amd/display/dc/dml/Makefile | 4 ++++ |
| drivers/gpu/drm/amd/display/dc/dsc/Makefile | 4 ++++ |
| 10 files changed, 48 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/gpu/drm/amd/display/Kconfig b/drivers/gpu/drm/amd/display/Kconfig |
| --- a/drivers/gpu/drm/amd/display/Kconfig |
| +++ b/drivers/gpu/drm/amd/display/Kconfig |
| @@ -6,7 +6,7 @@ config DRM_AMD_DC |
| bool "AMD DC - Enable new display engine" |
| default y |
| select SND_HDA_COMPONENT if SND_HDA_CORE |
| - select DRM_AMD_DC_DCN if (X86 || PPC64) && !(KCOV_INSTRUMENT_ALL && KCOV_ENABLE_COMPARISONS) |
| + select DRM_AMD_DC_DCN if (X86 || PPC64 || (ARM64 && KERNEL_MODE_NEON)) && !(KCOV_INSTRUMENT_ALL && KCOV_ENABLE_COMPARISONS) |
| help |
| Choose this option if you want to use the new display engine |
| support for AMDGPU. This adds required support for Vega and |
| diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.c b/drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.c |
| --- a/drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.c |
| +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.c |
| @@ -28,6 +28,8 @@ |
| |
| #if defined(CONFIG_X86) |
| #include <asm/fpu/api.h> |
| +#elif defined(CONFIG_ARM64) |
| +#include <asm/neon.h> |
| #elif defined(CONFIG_PPC64) |
| #include <asm/switch_to.h> |
| #include <asm/cputable.h> |
| @@ -88,6 +90,8 @@ void dc_fpu_begin(const char *function_name, const int line) |
| if (*pcpu == 1) { |
| #if defined(CONFIG_X86) |
| kernel_fpu_begin(); |
| +#elif defined(CONFIG_ARM64) |
| + kernel_neon_begin() |
| #elif defined(CONFIG_PPC64) |
| if (cpu_has_feature(CPU_FTR_VSX_COMP)) { |
| preempt_disable(); |
| @@ -125,6 +129,8 @@ void dc_fpu_end(const char *function_name, const int line) |
| if (*pcpu <= 0) { |
| #if defined(CONFIG_X86) |
| kernel_fpu_end(); |
| +#elif defined(CONFIG_ARM64) |
| + kernel_neon_end() |
| #elif defined(CONFIG_PPC64) |
| if (cpu_has_feature(CPU_FTR_VSX_COMP)) { |
| disable_kernel_vsx(); |
| diff --git a/drivers/gpu/drm/amd/display/dc/calcs/Makefile b/drivers/gpu/drm/amd/display/dc/calcs/Makefile |
| --- a/drivers/gpu/drm/amd/display/dc/calcs/Makefile |
| +++ b/drivers/gpu/drm/amd/display/dc/calcs/Makefile |
| @@ -33,6 +33,10 @@ ifdef CONFIG_PPC64 |
| calcs_ccflags := -mhard-float -maltivec |
| endif |
| |
| +ifdef CONFIG_ARM64 |
| +calcs_rcflags := -mgeneral-regs-only |
| +endif |
| + |
| ifdef CONFIG_CC_IS_GCC |
| ifeq ($(call cc-ifversion, -lt, 0701, y), y) |
| IS_OLD_GCC = 1 |
| diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/Makefile b/drivers/gpu/drm/amd/display/dc/clk_mgr/Makefile |
| --- a/drivers/gpu/drm/amd/display/dc/clk_mgr/Makefile |
| +++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/Makefile |
| @@ -104,6 +104,13 @@ ifdef CONFIG_PPC64 |
| CFLAGS_$(AMDDALPATH)/dc/clk_mgr/dcn21/rn_clk_mgr.o := $(call cc-option,-mno-gnu-attribute) |
| endif |
| |
| +# prevent build errors: |
| +# ...: '-mgeneral-regs-only' is incompatible with the use of floating-point types |
| +# this file is unused on arm64, just like on ppc64 |
| +ifdef CONFIG_ARM64 |
| +CFLAGS_REMOVE_$(AMDDALPATH)/dc/clk_mgr/dcn21/rn_clk_mgr.o := -mgeneral-regs-only |
| +endif |
| + |
| AMD_DAL_CLK_MGR_DCN21 = $(addprefix $(AMDDALPATH)/dc/clk_mgr/dcn21/,$(CLK_MGR_DCN21)) |
| |
| AMD_DISPLAY_FILES += $(AMD_DAL_CLK_MGR_DCN21) |
| diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/Makefile b/drivers/gpu/drm/amd/display/dc/dcn10/Makefile |
| --- a/drivers/gpu/drm/amd/display/dc/dcn10/Makefile |
| +++ b/drivers/gpu/drm/amd/display/dc/dcn10/Makefile |
| @@ -31,4 +31,11 @@ DCN10 = dcn10_init.o dcn10_resource.o dcn10_ipp.o dcn10_hw_sequencer.o \ |
| |
| AMD_DAL_DCN10 = $(addprefix $(AMDDALPATH)/dc/dcn10/,$(DCN10)) |
| |
| +# fix: |
| +# ...: '-mgeneral-regs-only' is incompatible with the use of floating-point types |
| +# aarch64 does not support soft-float, so use hard-float and handle this in code |
| +ifdef CONFIG_ARM64 |
| +CFLAGS_REMOVE_$(AMDDALPATH)/dc/dcn10/dcn10_resource.o := -mgeneral-regs-only |
| +endif |
| + |
| AMD_DISPLAY_FILES += $(AMD_DAL_DCN10) |
| diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c |
| --- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c |
| +++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c |
| @@ -1534,8 +1534,15 @@ static bool dcn10_resource_construct( |
| memcpy(dc->dcn_ip, &dcn10_ip_defaults, sizeof(dcn10_ip_defaults)); |
| memcpy(dc->dcn_soc, &dcn10_soc_defaults, sizeof(dcn10_soc_defaults)); |
| |
| +#if defined(CONFIG_ARM64) |
| + /* Aarch64 does not support -msoft-float/-mfloat-abi=soft */ |
| + DC_FP_START(); |
| + dcn10_resource_construct_fp(dc); |
| + DC_FP_END(); |
| +#else |
| /* Other architectures we build for build this with soft-float */ |
| dcn10_resource_construct_fp(dc); |
| +#endif |
| |
| pool->base.pp_smu = dcn10_pp_smu_create(ctx); |
| |
| diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/Makefile b/drivers/gpu/drm/amd/display/dc/dcn20/Makefile |
| --- a/drivers/gpu/drm/amd/display/dc/dcn20/Makefile |
| +++ b/drivers/gpu/drm/amd/display/dc/dcn20/Makefile |
| @@ -17,6 +17,10 @@ ifdef CONFIG_PPC64 |
| CFLAGS_$(AMDDALPATH)/dc/dcn20/dcn20_resource.o := -mhard-float -maltivec |
| endif |
| |
| +ifdef CONFIG_ARM64 |
| +CFLAGS_REMOVE_$(AMDDALPATH)/dc/dcn20/dcn20_resource.o := -mgeneral-regs-only |
| +endif |
| + |
| ifdef CONFIG_CC_IS_GCC |
| ifeq ($(call cc-ifversion, -lt, 0701, y), y) |
| IS_OLD_GCC = 1 |
| diff --git a/drivers/gpu/drm/amd/display/dc/dcn21/Makefile b/drivers/gpu/drm/amd/display/dc/dcn21/Makefile |
| --- a/drivers/gpu/drm/amd/display/dc/dcn21/Makefile |
| +++ b/drivers/gpu/drm/amd/display/dc/dcn21/Makefile |
| @@ -13,6 +13,10 @@ ifdef CONFIG_PPC64 |
| CFLAGS_$(AMDDALPATH)/dc/dcn21/dcn21_resource.o := -mhard-float -maltivec |
| endif |
| |
| +ifdef CONFIG_ARM64 |
| +CFLAGS_REMOVE_$(AMDDALPATH)/dc/dcn21/dcn21_resource.o := -mgeneral-regs-only |
| +endif |
| + |
| ifdef CONFIG_CC_IS_GCC |
| ifeq ($(call cc-ifversion, -lt, 0701, y), y) |
| IS_OLD_GCC = 1 |
| diff --git a/drivers/gpu/drm/amd/display/dc/dml/Makefile b/drivers/gpu/drm/amd/display/dc/dml/Makefile |
| --- a/drivers/gpu/drm/amd/display/dc/dml/Makefile |
| +++ b/drivers/gpu/drm/amd/display/dc/dml/Makefile |
| @@ -33,6 +33,10 @@ ifdef CONFIG_PPC64 |
| dml_ccflags := -mhard-float -maltivec |
| endif |
| |
| +ifdef CONFIG_ARM64 |
| +dml_rcflags := -mgeneral-regs-only |
| +endif |
| + |
| ifdef CONFIG_CC_IS_GCC |
| ifeq ($(call cc-ifversion, -lt, 0701, y), y) |
| IS_OLD_GCC = 1 |
| diff --git a/drivers/gpu/drm/amd/display/dc/dsc/Makefile b/drivers/gpu/drm/amd/display/dc/dsc/Makefile |
| --- a/drivers/gpu/drm/amd/display/dc/dsc/Makefile |
| +++ b/drivers/gpu/drm/amd/display/dc/dsc/Makefile |
| @@ -10,6 +10,10 @@ ifdef CONFIG_PPC64 |
| dsc_ccflags := -mhard-float -maltivec |
| endif |
| |
| +ifdef CONFIG_ARM64 |
| +dsc_rcflags := -mgeneral-regs-only |
| +endif |
| + |
| ifdef CONFIG_CC_IS_GCC |
| ifeq ($(call cc-ifversion, -lt, 0701, y), y) |
| IS_OLD_GCC = 1 |
| -- |
| 2.33.0.685.g46640cef36-goog |
| |