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

Configure Feed

Select the types of activity you want to include in your feed.

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>

authored by

Daniel Kolesa and committed by
Alex Deucher
c38d444e fbd7cda0

+102 -32
+1 -1
drivers/gpu/drm/amd/display/Kconfig
··· 6 6 bool "AMD DC - Enable new display engine" 7 7 default y 8 8 select SND_HDA_COMPONENT if SND_HDA_CORE 9 - select DRM_AMD_DC_DCN if (X86 || PPC64) && !(KCOV_INSTRUMENT_ALL && KCOV_ENABLE_COMPARISONS) 9 + select DRM_AMD_DC_DCN if (X86 || PPC64 || (ARM64 && KERNEL_MODE_NEON)) && !(KCOV_INSTRUMENT_ALL && KCOV_ENABLE_COMPARISONS) 10 10 help 11 11 Choose this option if you want to use the new display engine 12 12 support for AMDGPU. This adds required support for Vega and
+7
drivers/gpu/drm/amd/display/dc/calcs/Makefile
··· 33 33 calcs_ccflags := -mhard-float -maltivec 34 34 endif 35 35 36 + ifdef CONFIG_ARM64 37 + calcs_rcflags := -mgeneral-regs-only 38 + endif 39 + 36 40 ifdef CONFIG_CC_IS_GCC 37 41 ifeq ($(call cc-ifversion, -lt, 0701, y), y) 38 42 IS_OLD_GCC = 1 ··· 57 53 CFLAGS_$(AMDDALPATH)/dc/calcs/dcn_calcs.o := $(calcs_ccflags) 58 54 CFLAGS_$(AMDDALPATH)/dc/calcs/dcn_calc_auto.o := $(calcs_ccflags) 59 55 CFLAGS_$(AMDDALPATH)/dc/calcs/dcn_calc_math.o := $(calcs_ccflags) -Wno-tautological-compare 56 + CFLAGS_REMOVE_$(AMDDALPATH)/dc/calcs/dcn_calcs.o := $(calcs_rcflags) 57 + CFLAGS_REMOVE_$(AMDDALPATH)/dc/calcs/dcn_calc_auto.o := $(calcs_rcflags) 58 + CFLAGS_REMOVE_$(AMDDALPATH)/dc/calcs/dcn_calc_math.o := $(calcs_rcflags) 60 59 61 60 BW_CALCS = dce_calcs.o bw_fixed.o custom_float.o 62 61
+7
drivers/gpu/drm/amd/display/dc/clk_mgr/Makefile
··· 104 104 CFLAGS_$(AMDDALPATH)/dc/clk_mgr/dcn21/rn_clk_mgr.o := $(call cc-option,-mno-gnu-attribute) 105 105 endif 106 106 107 + # prevent build errors: 108 + # ...: '-mgeneral-regs-only' is incompatible with the use of floating-point types 109 + # this file is unused on arm64, just like on ppc64 110 + ifdef CONFIG_ARM64 111 + CFLAGS_REMOVE_$(AMDDALPATH)/dc/clk_mgr/dcn21/rn_clk_mgr.o := -mgeneral-regs-only 112 + endif 113 + 107 114 AMD_DAL_CLK_MGR_DCN21 = $(addprefix $(AMDDALPATH)/dc/clk_mgr/dcn21/,$(CLK_MGR_DCN21)) 108 115 109 116 AMD_DISPLAY_FILES += $(AMD_DAL_CLK_MGR_DCN21)
+7
drivers/gpu/drm/amd/display/dc/dcn10/Makefile
··· 31 31 32 32 AMD_DAL_DCN10 = $(addprefix $(AMDDALPATH)/dc/dcn10/,$(DCN10)) 33 33 34 + # fix: 35 + # ...: '-mgeneral-regs-only' is incompatible with the use of floating-point types 36 + # aarch64 does not support soft-float, so use hard-float and handle this in code 37 + ifdef CONFIG_ARM64 38 + CFLAGS_REMOVE_$(AMDDALPATH)/dc/dcn10/dcn10_resource.o := -mgeneral-regs-only 39 + endif 40 + 34 41 AMD_DISPLAY_FILES += $(AMD_DAL_DCN10)
+50 -31
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c
··· 1331 1331 return value; 1332 1332 } 1333 1333 1334 + /* 1335 + * Some architectures don't support soft-float (e.g. aarch64), on those 1336 + * this function has to be called with hardfloat enabled, make sure not 1337 + * to inline it so whatever fp stuff is done stays inside 1338 + */ 1339 + static noinline void dcn10_resource_construct_fp( 1340 + struct dc *dc) 1341 + { 1342 + if (dc->ctx->dce_version == DCN_VERSION_1_01) { 1343 + struct dcn_soc_bounding_box *dcn_soc = dc->dcn_soc; 1344 + struct dcn_ip_params *dcn_ip = dc->dcn_ip; 1345 + struct display_mode_lib *dml = &dc->dml; 1346 + 1347 + dml->ip.max_num_dpp = 3; 1348 + /* TODO how to handle 23.84? */ 1349 + dcn_soc->dram_clock_change_latency = 23; 1350 + dcn_ip->max_num_dpp = 3; 1351 + } 1352 + if (ASICREV_IS_RV1_F0(dc->ctx->asic_id.hw_internal_rev)) { 1353 + dc->dcn_soc->urgent_latency = 3; 1354 + dc->debug.disable_dmcu = true; 1355 + dc->dcn_soc->fabric_and_dram_bandwidth_vmax0p9 = 41.60f; 1356 + } 1357 + 1358 + 1359 + dc->dcn_soc->number_of_channels = dc->ctx->asic_id.vram_width / ddr4_dram_width; 1360 + ASSERT(dc->dcn_soc->number_of_channels < 3); 1361 + if (dc->dcn_soc->number_of_channels == 0)/*old sbios bug*/ 1362 + dc->dcn_soc->number_of_channels = 2; 1363 + 1364 + if (dc->dcn_soc->number_of_channels == 1) { 1365 + dc->dcn_soc->fabric_and_dram_bandwidth_vmax0p9 = 19.2f; 1366 + dc->dcn_soc->fabric_and_dram_bandwidth_vnom0p8 = 17.066f; 1367 + dc->dcn_soc->fabric_and_dram_bandwidth_vmid0p72 = 14.933f; 1368 + dc->dcn_soc->fabric_and_dram_bandwidth_vmin0p65 = 12.8f; 1369 + if (ASICREV_IS_RV1_F0(dc->ctx->asic_id.hw_internal_rev)) { 1370 + dc->dcn_soc->fabric_and_dram_bandwidth_vmax0p9 = 20.80f; 1371 + } 1372 + } 1373 + } 1374 + 1334 1375 static bool dcn10_resource_construct( 1335 1376 uint8_t num_virtual_links, 1336 1377 struct dc *dc, ··· 1523 1482 memcpy(dc->dcn_ip, &dcn10_ip_defaults, sizeof(dcn10_ip_defaults)); 1524 1483 memcpy(dc->dcn_soc, &dcn10_soc_defaults, sizeof(dcn10_soc_defaults)); 1525 1484 1526 - if (dc->ctx->dce_version == DCN_VERSION_1_01) { 1527 - struct dcn_soc_bounding_box *dcn_soc = dc->dcn_soc; 1528 - struct dcn_ip_params *dcn_ip = dc->dcn_ip; 1529 - struct display_mode_lib *dml = &dc->dml; 1530 - 1531 - dml->ip.max_num_dpp = 3; 1532 - /* TODO how to handle 23.84? */ 1533 - dcn_soc->dram_clock_change_latency = 23; 1534 - dcn_ip->max_num_dpp = 3; 1535 - } 1536 - if (ASICREV_IS_RV1_F0(dc->ctx->asic_id.hw_internal_rev)) { 1537 - dc->dcn_soc->urgent_latency = 3; 1538 - dc->debug.disable_dmcu = true; 1539 - dc->dcn_soc->fabric_and_dram_bandwidth_vmax0p9 = 41.60f; 1540 - } 1541 - 1542 - 1543 - dc->dcn_soc->number_of_channels = dc->ctx->asic_id.vram_width / ddr4_dram_width; 1544 - ASSERT(dc->dcn_soc->number_of_channels < 3); 1545 - if (dc->dcn_soc->number_of_channels == 0)/*old sbios bug*/ 1546 - dc->dcn_soc->number_of_channels = 2; 1547 - 1548 - if (dc->dcn_soc->number_of_channels == 1) { 1549 - dc->dcn_soc->fabric_and_dram_bandwidth_vmax0p9 = 19.2f; 1550 - dc->dcn_soc->fabric_and_dram_bandwidth_vnom0p8 = 17.066f; 1551 - dc->dcn_soc->fabric_and_dram_bandwidth_vmid0p72 = 14.933f; 1552 - dc->dcn_soc->fabric_and_dram_bandwidth_vmin0p65 = 12.8f; 1553 - if (ASICREV_IS_RV1_F0(dc->ctx->asic_id.hw_internal_rev)) { 1554 - dc->dcn_soc->fabric_and_dram_bandwidth_vmax0p9 = 20.80f; 1555 - } 1556 - } 1485 + #if defined(CONFIG_ARM64) 1486 + /* Aarch64 does not support -msoft-float/-mfloat-abi=soft */ 1487 + DC_FP_START(); 1488 + dcn10_resource_construct_fp(dc); 1489 + DC_FP_END(); 1490 + #else 1491 + /* Other architectures we build for build this with soft-float */ 1492 + dcn10_resource_construct_fp(dc); 1493 + #endif 1557 1494 1558 1495 pool->base.pp_smu = dcn10_pp_smu_create(ctx); 1559 1496
+4
drivers/gpu/drm/amd/display/dc/dcn20/Makefile
··· 17 17 CFLAGS_$(AMDDALPATH)/dc/dcn20/dcn20_resource.o := -mhard-float -maltivec 18 18 endif 19 19 20 + ifdef CONFIG_ARM64 21 + CFLAGS_REMOVE_$(AMDDALPATH)/dc/dcn20/dcn20_resource.o := -mgeneral-regs-only 22 + endif 23 + 20 24 ifdef CONFIG_CC_IS_GCC 21 25 ifeq ($(call cc-ifversion, -lt, 0701, y), y) 22 26 IS_OLD_GCC = 1
+4
drivers/gpu/drm/amd/display/dc/dcn21/Makefile
··· 13 13 CFLAGS_$(AMDDALPATH)/dc/dcn21/dcn21_resource.o := -mhard-float -maltivec 14 14 endif 15 15 16 + ifdef CONFIG_ARM64 17 + CFLAGS_REMOVE_$(AMDDALPATH)/dc/dcn21/dcn21_resource.o := -mgeneral-regs-only 18 + endif 19 + 16 20 ifdef CONFIG_CC_IS_GCC 17 21 ifeq ($(call cc-ifversion, -lt, 0701, y), y) 18 22 IS_OLD_GCC = 1
+13
drivers/gpu/drm/amd/display/dc/dml/Makefile
··· 33 33 dml_ccflags := -mhard-float -maltivec 34 34 endif 35 35 36 + ifdef CONFIG_ARM64 37 + dml_rcflags := -mgeneral-regs-only 38 + endif 39 + 36 40 ifdef CONFIG_CC_IS_GCC 37 41 ifeq ($(call cc-ifversion, -lt, 0701, y), y) 38 42 IS_OLD_GCC = 1 ··· 64 60 CFLAGS_$(AMDDALPATH)/dc/dml/dcn20/display_rq_dlg_calc_20v2.o := $(dml_ccflags) 65 61 CFLAGS_$(AMDDALPATH)/dc/dml/dcn21/display_mode_vba_21.o := $(dml_ccflags) 66 62 CFLAGS_$(AMDDALPATH)/dc/dml/dcn21/display_rq_dlg_calc_21.o := $(dml_ccflags) 63 + CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml/display_mode_vba.o := $(dml_rcflags) 64 + CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml/dcn20/display_mode_vba_20.o := $(dml_rcflags) 65 + CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml/dcn20/display_rq_dlg_calc_20.o := $(dml_rcflags) 66 + CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml/dcn20/display_mode_vba_20v2.o := $(dml_rcflags) 67 + CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml/dcn20/display_rq_dlg_calc_20v2.o := $(dml_rcflags) 68 + CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml/dcn21/display_mode_vba_21.o := $(dml_rcflags) 69 + CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml/dcn21/display_rq_dlg_calc_21.o := $(dml_rcflags) 67 70 endif 68 71 ifdef CONFIG_DRM_AMD_DC_DCN3_0 69 72 CFLAGS_$(AMDDALPATH)/dc/dml/dcn30/display_mode_vba_30.o := $(dml_ccflags) -Wframe-larger-than=2048 ··· 78 67 endif 79 68 CFLAGS_$(AMDDALPATH)/dc/dml/dml1_display_rq_dlg_calc.o := $(dml_ccflags) 80 69 CFLAGS_$(AMDDALPATH)/dc/dml/display_rq_dlg_helpers.o := $(dml_ccflags) 70 + CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml/dml1_display_rq_dlg_calc.o := $(dml_rcflags) 71 + CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml/display_rq_dlg_helpers.o := $(dml_rcflags) 81 72 82 73 DML = display_mode_lib.o display_rq_dlg_helpers.o dml1_display_rq_dlg_calc.o \ 83 74
+5
drivers/gpu/drm/amd/display/dc/dsc/Makefile
··· 10 10 dsc_ccflags := -mhard-float -maltivec 11 11 endif 12 12 13 + ifdef CONFIG_ARM64 14 + dsc_rcflags := -mgeneral-regs-only 15 + endif 16 + 13 17 ifdef CONFIG_CC_IS_GCC 14 18 ifeq ($(call cc-ifversion, -lt, 0701, y), y) 15 19 IS_OLD_GCC = 1 ··· 32 28 endif 33 29 34 30 CFLAGS_$(AMDDALPATH)/dc/dsc/rc_calc.o := $(dsc_ccflags) 31 + CFLAGS_REMOVE_$(AMDDALPATH)/dc/dsc/rc_calc.o := $(dsc_rcflags) 35 32 36 33 DSC = dc_dsc.o rc_calc.o rc_calc_dpi.o 37 34
+4
drivers/gpu/drm/amd/display/dc/os_types.h
··· 55 55 #include <asm/fpu/api.h> 56 56 #define DC_FP_START() kernel_fpu_begin() 57 57 #define DC_FP_END() kernel_fpu_end() 58 + #elif defined(CONFIG_ARM64) 59 + #include <asm/neon.h> 60 + #define DC_FP_START() kernel_neon_begin() 61 + #define DC_FP_END() kernel_neon_end() 58 62 #elif defined(CONFIG_PPC64) 59 63 #include <asm/switch_to.h> 60 64 #include <asm/cputable.h>