On 2024-03-29 03:18, Samuel Holland wrote: > Now that all previously-supported architectures select > ARCH_HAS_KERNEL_FPU_SUPPORT, this code can depend on that symbol instead > of the existing list of architectures. It can also take advantage of the > common kernel-mode FPU API and method of adjusting CFLAGS. > > Acked-by: Alex Deucher <alexander.deucher@xxxxxxx> > Reviewed-by: Christoph Hellwig <hch@xxxxxx> Really nice set of changes. Acked-by: Harry Wentland <harry.wentland@xxxxxxx> Harry > Signed-off-by: Samuel Holland <samuel.holland@xxxxxxxxxx> > --- > > (no changes since v2) > > Changes in v2: > - Split altivec removal to a separate patch > - Use linux/fpu.h instead of asm/fpu.h in consumers > > drivers/gpu/drm/amd/display/Kconfig | 2 +- > .../gpu/drm/amd/display/amdgpu_dm/dc_fpu.c | 27 ++------------ > drivers/gpu/drm/amd/display/dc/dml/Makefile | 36 ++----------------- > drivers/gpu/drm/amd/display/dc/dml2/Makefile | 36 ++----------------- > 4 files changed, 7 insertions(+), 94 deletions(-) > > diff --git a/drivers/gpu/drm/amd/display/Kconfig b/drivers/gpu/drm/amd/display/Kconfig > index 901d1961b739..5fcd4f778dc3 100644 > --- a/drivers/gpu/drm/amd/display/Kconfig > +++ b/drivers/gpu/drm/amd/display/Kconfig > @@ -8,7 +8,7 @@ config DRM_AMD_DC > depends on BROKEN || !CC_IS_CLANG || ARM64 || RISCV || SPARC64 || X86_64 > select SND_HDA_COMPONENT if SND_HDA_CORE > # !CC_IS_CLANG: https://github.com/ClangBuiltLinux/linux/issues/1752 > - select DRM_AMD_DC_FP if (X86 || LOONGARCH || (PPC64 && ALTIVEC) || (ARM64 && KERNEL_MODE_NEON && !CC_IS_CLANG)) > + select DRM_AMD_DC_FP if ARCH_HAS_KERNEL_FPU_SUPPORT && (!ARM64 || !CC_IS_CLANG) > 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 > index 0de16796466b..e46f8ce41d87 100644 > --- a/drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.c > +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.c > @@ -26,16 +26,7 @@ > > #include "dc_trace.h" > > -#if defined(CONFIG_X86) > -#include <asm/fpu/api.h> > -#elif defined(CONFIG_PPC64) > -#include <asm/switch_to.h> > -#include <asm/cputable.h> > -#elif defined(CONFIG_ARM64) > -#include <asm/neon.h> > -#elif defined(CONFIG_LOONGARCH) > -#include <asm/fpu.h> > -#endif > +#include <linux/fpu.h> > > /** > * DOC: DC FPU manipulation overview > @@ -87,16 +78,9 @@ void dc_fpu_begin(const char *function_name, const int line) > WARN_ON_ONCE(!in_task()); > preempt_disable(); > depth = __this_cpu_inc_return(fpu_recursion_depth); > - > if (depth == 1) { > -#if defined(CONFIG_X86) || defined(CONFIG_LOONGARCH) > + BUG_ON(!kernel_fpu_available()); > kernel_fpu_begin(); > -#elif defined(CONFIG_PPC64) > - if (!cpu_has_feature(CPU_FTR_FPU_UNAVAILABLE)) > - enable_kernel_fp(); > -#elif defined(CONFIG_ARM64) > - kernel_neon_begin(); > -#endif > } > > TRACE_DCN_FPU(true, function_name, line, depth); > @@ -118,14 +102,7 @@ void dc_fpu_end(const char *function_name, const int line) > > depth = __this_cpu_dec_return(fpu_recursion_depth); > if (depth == 0) { > -#if defined(CONFIG_X86) || defined(CONFIG_LOONGARCH) > kernel_fpu_end(); > -#elif defined(CONFIG_PPC64) > - if (!cpu_has_feature(CPU_FTR_FPU_UNAVAILABLE)) > - disable_kernel_fp(); > -#elif defined(CONFIG_ARM64) > - kernel_neon_end(); > -#endif > } else { > WARN_ON_ONCE(depth < 0); > } > diff --git a/drivers/gpu/drm/amd/display/dc/dml/Makefile b/drivers/gpu/drm/amd/display/dc/dml/Makefile > index 59d3972341d2..a94b6d546cd1 100644 > --- a/drivers/gpu/drm/amd/display/dc/dml/Makefile > +++ b/drivers/gpu/drm/amd/display/dc/dml/Makefile > @@ -25,40 +25,8 @@ > # It provides the general basic services required by other DAL > # subcomponents. > > -ifdef CONFIG_X86 > -dml_ccflags-$(CONFIG_CC_IS_GCC) := -mhard-float > -dml_ccflags := $(dml_ccflags-y) -msse > -endif > - > -ifdef CONFIG_PPC64 > -dml_ccflags := -mhard-float > -endif > - > -ifdef CONFIG_ARM64 > -dml_rcflags := -mgeneral-regs-only > -endif > - > -ifdef CONFIG_LOONGARCH > -dml_ccflags := -mfpu=64 > -dml_rcflags := -msoft-float > -endif > - > -ifdef CONFIG_CC_IS_GCC > -ifneq ($(call gcc-min-version, 70100),y) > -IS_OLD_GCC = 1 > -endif > -endif > - > -ifdef CONFIG_X86 > -ifdef IS_OLD_GCC > -# Stack alignment mismatch, proceed with caution. > -# GCC < 7.1 cannot compile code using `double` and -mpreferred-stack-boundary=3 > -# (8B stack alignment). > -dml_ccflags += -mpreferred-stack-boundary=4 > -else > -dml_ccflags += -msse2 > -endif > -endif > +dml_ccflags := $(CC_FLAGS_FPU) > +dml_rcflags := $(CC_FLAGS_NO_FPU) > > ifneq ($(CONFIG_FRAME_WARN),0) > ifeq ($(filter y,$(CONFIG_KASAN)$(CONFIG_KCSAN)),y) > diff --git a/drivers/gpu/drm/amd/display/dc/dml2/Makefile b/drivers/gpu/drm/amd/display/dc/dml2/Makefile > index 7b51364084b5..4f6c804a26ad 100644 > --- a/drivers/gpu/drm/amd/display/dc/dml2/Makefile > +++ b/drivers/gpu/drm/amd/display/dc/dml2/Makefile > @@ -24,40 +24,8 @@ > # > # Makefile for dml2. > > -ifdef CONFIG_X86 > -dml2_ccflags-$(CONFIG_CC_IS_GCC) := -mhard-float > -dml2_ccflags := $(dml2_ccflags-y) -msse > -endif > - > -ifdef CONFIG_PPC64 > -dml2_ccflags := -mhard-float > -endif > - > -ifdef CONFIG_ARM64 > -dml2_rcflags := -mgeneral-regs-only > -endif > - > -ifdef CONFIG_LOONGARCH > -dml2_ccflags := -mfpu=64 > -dml2_rcflags := -msoft-float > -endif > - > -ifdef CONFIG_CC_IS_GCC > -ifeq ($(call cc-ifversion, -lt, 0701, y), y) > -IS_OLD_GCC = 1 > -endif > -endif > - > -ifdef CONFIG_X86 > -ifdef IS_OLD_GCC > -# Stack alignment mismatch, proceed with caution. > -# GCC < 7.1 cannot compile code using `double` and -mpreferred-stack-boundary=3 > -# (8B stack alignment). > -dml2_ccflags += -mpreferred-stack-boundary=4 > -else > -dml2_ccflags += -msse2 > -endif > -endif > +dml2_ccflags := $(CC_FLAGS_FPU) > +dml2_rcflags := $(CC_FLAGS_NO_FPU) > > ifneq ($(CONFIG_FRAME_WARN),0) > ifeq ($(filter y,$(CONFIG_KASAN)$(CONFIG_KCSAN)),y)