开发者
资源
ARM 服务器使能 AMD W6800
ARM 服务器使能 AMD W6800
新人帖
发表于2023/02/15
1.2k3

本教程以 5.10.27 内核版本为例。

1. 环境准备

1.1 内核源码和Firmware下载

需要下载以下压缩包,分别为内核源码和固件

linux-5.10.27.tar.gz

linux-firmware-20210919.tar.gz

true

1.2 依赖安装

编译内核需要以下工具,已安装过的此环节可以跳过

apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison

1.3拷贝firmware到系统目录

cp ./linux-firmware-20210919/amdgpu/* /lib/firmware/amdgpu/

1.4 合入内核补丁

补丁文件在文末提供,拷贝补丁内容到文件中如:enable_W6800.patch,拷贝该文件到内核源码目录下后执行如下命令合入补丁。

拷贝patch 内容到本地后,合入patch可能失败。如遇失败,可按照patch 手动修改内核源码或者联系华为工程时获取patch

patch -p1 < enable_W6800.patch

1.5内核选项配置

  1. 进入内核目录,拷贝“/boot”目录下的config文件到该目录下,并重命名为.config。
    cp /boot/config-* ./
    mv config-* .config
    命令中的“/boot”目录下的config文件名称仅为示例,实际的文件名称要通过uname -r命令确认,拷贝的config文件版本要与操作系统的内核版本保持一致。
  2. 输入make menuconfig命令,加载 .config 文件 true
  3. 输入 “/”,打开搜索功能,输入 DRM_AMD_DC_DCN,确认配置打开。 true
  4. 保存.config文件后退出该界面
  5. 修改内核源码目录下的 .config,对应配置项内容如下(确保两个配置项如下所示):
    CONFIG_SYSTEM_TRUSTED_KEYS="" 
    # CONFIG_DEBUG_INFO is not set
    注:.config文件中的“CONFIG_DEBUG_INFO”配置项,需完全按照代码段中的内容配置,修改整句内容,包括#。 。
  6. 抑制本地版本号 进入内核源码目录,执行如下命令
    touch .scmversion

1.6 内核编译

  1. 编译命令
    make all -j64
  2. 安装命令
    make INSTALL_MOD_STRIP=1 modules_install -j64 && make install -j64
  3. 更新启动项
    # sudo update-grub2
  4. 检查新内核版本,如果版本号显示5.10.27,则说明导入正确

2 内核修改解释

该章节仅提供对补丁文件的解释,如不关心修改内容可跳过该章,直接根据第3章确认是否使能成功

通过分析源码发现如需使用 dm block(Xorg会使用该block),需要配置 CONFIG_DRM_AMD_DC_DCN3_0(W6800 的芯片架构为 CHIP_SIENNA_CICHLID)。 true

2.1 配置 CONFIG_DRM_AMD_DC_DCN3_0

修改 drivers/gpu/drm/amd/display/Kconfig,移除该配置项对CPU架构的要求。

修改前: true

修改后:

true

2.2解决编译报错

将 DRM_AMD_DC_DCN/DRM_AMD_DC_DCN3_0 使能后直接编译会报错,需要解决对应错误

错误类型一:DC_FP_START 和 DC_FP_END 报错

true

修改 drivers/gpu/drm/amd/display/dc/os_types.h 添加 ARM64 的定义

#elif defined(CONFIG_ARM64)
#include <asm/neon.h>
#define DC_FP_START() kernel_neon_begin()
#define DC_FP_END() kernel_neon_end()

修改如下

true

修改 drivers/gpu/drm/i915/i915_memcpy.c,如下

true

true

错误类型二:calcs_rcflags 编译参数错误

ARM 平台上需要将 calcs_rcflasg 编译参数设置为 “-mgeneral-regs-only”,该修改涉及的文件较多,编译过程中需要根据编译报错信息修改对应的 Makefile 文件。

true

修改如下:

true

需要修改的文件如下:

true


3.适配效果

查询 dmesg 日志并过滤出 “drm” 关键字,当 ip block 中出现 dm block,并在 /sys/class/drm 目录下出现对应设备节点时,即表示使能成功,并可使用Xorg功能。 true

true

3.1 配置Xorg

  1. 进入配置文件所在目录。

    cd /etc/X11/
  2. 修改配置文件。

    touch xorg.conf
    vi /etc/X11/xorg.conf

    配置文件内容如下

    Section "ServerFlags"
    Option "DontVTSwitch" "on"
    Option "AutoAddDevices" "off"
    Option "AutoEnableDevices" "off"
    Option "AutoAddGPU" "off"
    Option "AutoBindGPU" "off"
    EndSection
    Section "Device"
    Identifier "AMD"
    Driver "amdgpu"
    BusID "pci:03:00:00"
    EndSection
    Section "Monitor"
    Identifier "monitor0"
    Option "enable" "true"
    EndSection
    Section "Screen"
    Identifier "screen0"
    Device "AMD"
    Monitor "monitor0"
    DefaultDepth 24
    SubSection "Display"
    Depth 24
    EndSubSection
    EndSection

    BusID &quot;pci:03:00:00&quot; 根据实际情况配置,使用 lspci | grep VGA 查找 BusID true 需要转化成十进制,查询到的为十六进制,如下查询到是 83:00:0 需要改成 131:00:0 true

  3. 打开Xorg

    Xorg :0 -config /etc/X11/xorg0.conf -sharevts

    true


提供patch文件如下

复制如下代码到txt文件,并更名为“enable_W6800.patch”后,将patch文件合入内核源码即可。

diff --git a/drivers/gpu/drm/amd/display/Kconfig b/drivers/gpu/drm/amd/display/Kconfig
index 3c410d236c49..aa5d797e7da2 100644
--- a/drivers/gpu/drm/amd/display/Kconfig
+++ b/drivers/gpu/drm/amd/display/Kconfig
@@ -6,20 +6,20 @@ 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 !(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
       Raven ASICs.
 
 config DRM_AMD_DC_DCN
-    def_bool n
+    def_bool y
     help
       Raven, Navi and Renoir family support for display engine
 
 config DRM_AMD_DC_DCN3_0
         bool "DCN 3.0 family"
-        depends on DRM_AMD_DC && X86
+        depends on DRM_AMD_DC
         depends on DRM_AMD_DC_DCN
         help
             Choose this option if you want to have
diff --git a/drivers/gpu/drm/amd/display/dc/calcs/Makefile b/drivers/gpu/drm/amd/display/dc/calcs/Makefile
index 4674aca8f206..1cf6e308b589 100644
--- a/drivers/gpu/drm/amd/display/dc/calcs/Makefile
+++ b/drivers/gpu/drm/amd/display/dc/calcs/Makefile
@@ -29,10 +29,20 @@ ifdef CONFIG_X86
 calcs_ccflags := -mhard-float -msse
 endif
 
+
+ifdef CONFIG_ARM64
+calcs_rcflags := -mgeneral-regs-only
+endif
+
+#ifdef CONFIG_ARM64
+#CFLAGS_REMOVE_$(AMDDALPATH)/dc/dsc/rc_calc.o := -mgeneral-regs-only
+#endif
+
 ifdef CONFIG_PPC64
-calcs_ccflags := -mhard-float -maltivec
+    calcs_ccflags := -mhard-float -maltivec
 endif
 
+
 ifdef CONFIG_CC_IS_GCC
 ifeq ($(call cc-ifversion, -lt, 0701, y), y)
 IS_OLD_GCC = 1
@@ -53,6 +63,9 @@ endif
 CFLAGS_$(AMDDALPATH)/dc/calcs/dcn_calcs.o := $(calcs_ccflags)
 CFLAGS_$(AMDDALPATH)/dc/calcs/dcn_calc_auto.o := $(calcs_ccflags)
 CFLAGS_$(AMDDALPATH)/dc/calcs/dcn_calc_math.o := $(calcs_ccflags) -Wno-tautological-compare
+CFLAGS_REMOVE_$(AMDDALPATH)/dc/calcs/dcn_calcs.o := $(calcs_rcflags)
+CFLAGS_REMOVE_$(AMDDALPATH)/dc/calcs/dcn_calc_auto.o := $(calcs_rcflags)
+CFLAGS_REMOVE_$(AMDDALPATH)/dc/calcs/dcn_calc_math.o := $(calcs_rcflags)
 
 BW_CALCS = dce_calcs.o bw_fixed.o custom_float.o
 
diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/Makefile b/drivers/gpu/drm/amd/display/dc/clk_mgr/Makefile
index 52b1ce775a1e..2be2d31b271a 100644
--- a/drivers/gpu/drm/amd/display/dc/clk_mgr/Makefile
+++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/Makefile
@@ -104,6 +104,10 @@ ifdef CONFIG_PPC64
 CFLAGS_$(AMDDALPATH)/dc/clk_mgr/dcn21/rn_clk_mgr.o := $(call cc-option,-mno-gnu-attribute)
 endif
 
+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)
@@ -114,6 +118,10 @@ ifdef CONFIG_DRM_AMD_DC_DCN3_0
 ###############################################################################
 CLK_MGR_DCN30 = dcn30_clk_mgr.o dcn30_clk_mgr_smu_msg.o
 
+ifdef CONFIG_ARM64
+CFLAGS_REMOVE_$(AMDDALPATH)/dc/clk_mgr/dcn30/dcn30_clk_mgr.o := -mgeneral-regs-only
+endif
+
 AMD_DAL_CLK_MGR_DCN30 = $(addprefix $(AMDDALPATH)/dc/clk_mgr/dcn30/,$(CLK_MGR_DCN30))
 
 AMD_DISPLAY_FILES += $(AMD_DAL_CLK_MGR_DCN30)
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/Makefile b/drivers/gpu/drm/amd/display/dc/dcn10/Makefile
index 62ad1a11bff9..4decf428c8a5 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/Makefile
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/Makefile
@@ -31,4 +31,8 @@ DCN10 = dcn10_init.o dcn10_resource.o dcn10_ipp.o dcn10_hw_sequencer.o \
 
 AMD_DAL_DCN10 = $(addprefix $(AMDDALPATH)/dc/dcn10/,$(DCN10))
 
+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/dcn20/Makefile b/drivers/gpu/drm/amd/display/dc/dcn20/Makefile
index 5fcaf78334ff..624cb1341ef1 100644
--- 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
index 07684d3e375a..51a2f3d4c194 100644
--- 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/dcn30/Makefile b/drivers/gpu/drm/amd/display/dc/dcn30/Makefile
index bd2a068f9863..248c2711aace 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn30/Makefile
+++ b/drivers/gpu/drm/amd/display/dc/dcn30/Makefile
@@ -52,6 +52,7 @@ 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
@@ -62,6 +63,7 @@ else
 CFLAGS_$(AMDDALPATH)/dc/dcn30/dcn30_resource.o += -msse2
 CFLAGS_$(AMDDALPATH)/dc/dcn30/dcn30_optc.o += -msse2
 endif
+endif
 
 AMD_DAL_DCN30 = $(addprefix $(AMDDALPATH)/dc/dcn30/,$(DCN30))
 
diff --git a/drivers/gpu/drm/amd/display/dc/dml/Makefile b/drivers/gpu/drm/amd/display/dc/dml/Makefile
index 417331438c30..6effcc7188af 100644
--- a/drivers/gpu/drm/amd/display/dc/dml/Makefile
+++ b/drivers/gpu/drm/amd/display/dc/dml/Makefile
@@ -29,6 +29,10 @@ ifdef CONFIG_X86
 dml_ccflags := -mhard-float -msse
 endif
 
+ifdef CONFIG_ARM64
+dml_rcflags := -mgeneral-regs-only
+endif
+
 ifdef CONFIG_PPC64
 dml_ccflags := -mhard-float -maltivec
 endif
@@ -60,13 +64,25 @@ CFLAGS_$(AMDDALPATH)/dc/dml/dcn20/display_mode_vba_20v2.o := $(dml_ccflags)
 CFLAGS_$(AMDDALPATH)/dc/dml/dcn20/display_rq_dlg_calc_20v2.o := $(dml_ccflags)
 CFLAGS_$(AMDDALPATH)/dc/dml/dcn21/display_mode_vba_21.o := $(dml_ccflags)
 CFLAGS_$(AMDDALPATH)/dc/dml/dcn21/display_rq_dlg_calc_21.o := $(dml_ccflags)
-endif
-ifdef CONFIG_DRM_AMD_DC_DCN3_0
 CFLAGS_$(AMDDALPATH)/dc/dml/dcn30/display_mode_vba_30.o := $(dml_ccflags) -Wframe-larger-than=2048
 CFLAGS_$(AMDDALPATH)/dc/dml/dcn30/display_rq_dlg_calc_30.o := $(dml_ccflags)
+CFLAGS_$(AMDDALPATH)/dc/dml/display_mode_lib.o := $(dml_ccflags)
+CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml/display_mode_vba.o := $(dml_rcflags)
+CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml/dcn20/display_mode_vba_20.o := $(dml_rcflags)
+CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml/dcn20/display_rq_dlg_calc_20.o := $(dml_rcflags)
+CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml/dcn20/display_mode_vba_20v2.o := $(dml_rcflags)
+CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml/dcn20/display_rq_dlg_calc_20v2.o := $(dml_rcflags)
+CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml/dcn21/display_mode_vba_21.o := $(dml_rcflags)
+CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml/dcn21/display_rq_dlg_calc_21.o := $(dml_rcflags)
+CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml/dcn30/display_mode_vba_30.o := $(dml_rcflags)
+CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml/dcn30/display_rq_dlg_calc_30.o := $(dml_rcflags)
+CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml/display_mode_lib.o := $(dml_rcflags)
 endif
 CFLAGS_$(AMDDALPATH)/dc/dml/dml1_display_rq_dlg_calc.o := $(dml_ccflags)
 CFLAGS_$(AMDDALPATH)/dc/dml/display_rq_dlg_helpers.o := $(dml_ccflags)
+CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml/dml1_display_rq_dlg_calc.o := $(dml_rcflags)
+CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml/display_rq_dlg_helpers.o := $(dml_rcflags)
+CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml/dml_common_defs.o := $(dml_rcflags)
 
 DML = display_mode_lib.o display_rq_dlg_helpers.o dml1_display_rq_dlg_calc.o \
 
@@ -74,9 +90,6 @@ ifdef CONFIG_DRM_AMD_DC_DCN
 DML += display_mode_vba.o dcn20/display_rq_dlg_calc_20.o dcn20/display_mode_vba_20.o
 DML += dcn20/display_rq_dlg_calc_20v2.o dcn20/display_mode_vba_20v2.o
 DML += dcn21/display_rq_dlg_calc_21.o dcn21/display_mode_vba_21.o
-endif
-
-ifdef CONFIG_DRM_AMD_DC_DCN3_0
 DML += dcn30/display_mode_vba_30.o dcn30/display_rq_dlg_calc_30.o
 endif
 
diff --git a/drivers/gpu/drm/amd/display/dc/dsc/Makefile b/drivers/gpu/drm/amd/display/dc/dsc/Makefile
index ea29cf95d470..cac6f7a35f24 100644
--- a/drivers/gpu/drm/amd/display/dc/dsc/Makefile
+++ b/drivers/gpu/drm/amd/display/dc/dsc/Makefile
@@ -6,6 +6,14 @@ ifdef CONFIG_X86
 dsc_ccflags := -mhard-float -msse
 endif
 
+ifdef CONFIG_ARM64
+dsc_rcflags := -mgeneral-regs-only
+endif
+
+ifdef CONFIG_ARM64
+CFLAGS_REMOVE_$(AMDDALPATH)/dc/dsc/rc_calc.o := -mgeneral-regs-only
+endif
+
 ifdef CONFIG_PPC64
 dsc_ccflags := -mhard-float -maltivec
 endif
@@ -28,6 +36,10 @@ endif
 endif
 
 CFLAGS_$(AMDDALPATH)/dc/dsc/rc_calc.o := $(dsc_ccflags)
+CFLAGS_REMOVE_$(AMDDALPATH)/dc/dsc/rc_calc.o := $(dsc_rcflags)
+CFLAGS_REMOVE_$(AMDDALPATH)/dc/dsc/dc_dsc.o := $(dsc_rcflags)
+CFLAGS_REMOVE_$(AMDDALPATH)/dc/dsc/rc_calc_dpi.o := $(dsc_rcflags)
+CFLAGS_REMOVE_$(AMDDALPATH)/dc/dsc/rc_calc.o := $(dsc_rcflags)
 
 DSC = dc_dsc.o rc_calc.o rc_calc_dpi.o
 
diff --git a/drivers/gpu/drm/amd/display/dc/os_types.h b/drivers/gpu/drm/amd/display/dc/os_types.h
index 126c2f3a4dd3..95cb56929e79 100644
--- a/drivers/gpu/drm/amd/display/dc/os_types.h
+++ b/drivers/gpu/drm/amd/display/dc/os_types.h
@@ -55,6 +55,10 @@
 #include <asm/fpu/api.h>
 #define DC_FP_START() kernel_fpu_begin()
 #define DC_FP_END() kernel_fpu_end()
+#elif defined(CONFIG_ARM64)
+#include <asm/neon.h>
+#define DC_FP_START() kernel_neon_begin()
+#define DC_FP_END() kernel_neon_end()
 #elif defined(CONFIG_PPC64)
 #include <asm/switch_to.h>
 #include <asm/cputable.h>
diff --git a/drivers/gpu/drm/i915/i915_memcpy.c b/drivers/gpu/drm/i915/i915_memcpy.c
index 7b3b83bd5ab8..0c53bb8a2cea 100644
--- a/drivers/gpu/drm/i915/i915_memcpy.c
+++ b/drivers/gpu/drm/i915/i915_memcpy.c
@@ -37,8 +37,8 @@ static DEFINE_STATIC_KEY_FALSE(has_movntdqa);
 
 static void __memcpy_ntdqa(void *dst, const void *src, unsigned long len)
 {
-    kernel_fpu_begin();
-
+    //kernel_fpu_begin();
+    DC_FP_START();
     while (len >= 4) {
         asm("movntdqa   (%0), %%xmm0\n"
             "movntdqa 16(%0), %%xmm1\n"
@@ -61,13 +61,14 @@ static void __memcpy_ntdqa(void *dst, const void *src, unsigned long len)
         dst += 16;
     }
 
-    kernel_fpu_end();
+    DC_FP_END();
+    //kernel_fpu_end();
 }
 
 static void __memcpy_ntdqu(void *dst, const void *src, unsigned long len)
 {
-    kernel_fpu_begin();
-
+    // kernel_fpu_begin();
+    DC_FP_START();
     while (len >= 4) {
         asm("movntdqa   (%0), %%xmm0\n"
             "movntdqa 16(%0), %%xmm1\n"
@@ -89,8 +90,8 @@ static void __memcpy_ntdqu(void *dst, const void *src, unsigned long len)
         src += 16;
         dst += 16;
     }
-
-    kernel_fpu_end();
+    DC_FP_END();
+    //kernel_fpu_end();
 }
 
 /**
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
index d244616d28d8..a40fce541aac 100644
--- a/sound/pci/hda/hda_intel.c
+++ b/sound/pci/hda/hda_intel.c
@@ -2704,8 +2704,8 @@ static const struct pci_device_id azx_ids[] = {
       .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS |
       AZX_DCAPS_PM_RUNTIME },
     { PCI_DEVICE(0x1002, 0xab28),
-      .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS |
-      AZX_DCAPS_PM_RUNTIME },
+      .driver_data = (AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS |
+      AZX_DCAPS_PM_RUNTIME) & ~AZX_DCAPS_NO_MSI64 },
     { PCI_DEVICE(0x1002, 0xab38),
       .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS |
       AZX_DCAPS_PM_RUNTIME },
收藏举报
Level 1
0
帖子
0
粉丝
0
获赞