1From 64f03f0d9ece74ead6eaff63a4356b9fb481aa5f Mon Sep 17 00:00:00 20012From: Jianfeng Liu <liujianfeng1994@gmail.com>3Date: Wed, 4 Jun 2025 17:44:54 +08004Subject: [PATCH] add loongarch64 build support56---7 cmrtlib/build_linux.sh | 6 ++-8 media_driver/agnostic/common/cm/cm_mem.cpp | 13 ++++++9 media_driver/agnostic/common/cm/cm_mem.h | 14 ++++++10 .../linux/media_compile_flags_linux.cmake | 9 +++-11 .../common/cm/hal/osservice/cm_mem_os.cpp | 9 ++++12 .../linux/common/cm/hal/osservice/cm_mem_os.h | 9 ++++13 media_driver/media_top_cmake.cmake | 43 +++++++++++++++++++14 .../linux/media_compile_flags_linux.cmake | 9 ++--15 8 files changed, 106 insertions(+), 6 deletions(-)1617diff --git a/cmrtlib/build_linux.sh b/cmrtlib/build_linux.sh18index f3f5fd02a91..b80460df90f 10064419--- a/cmrtlib/build_linux.sh20+++ b/cmrtlib/build_linux.sh21@@ -138,7 +138,11 @@ case $BUILD_SIZE in22 if [[ $BUILD_64 -eq 1 ]]; then23 CROSS_BUILD=124 BUILD_SIZE=6425- EXTRA_OPTIONS="export CFLAGS=-m64 CXXFLAGS=-m64"26+ if [ ${MACHINE_TYPE} == 'loongarch64' ]; then27+ EXTRA_OPTIONS=""28+ else29+ EXTRA_OPTIONS="export CFLAGS=-m64 CXXFLAGS=-m64"30+ fi31 fi32 ;;33 64)34diff --git a/media_driver/agnostic/common/cm/cm_mem.cpp b/media_driver/agnostic/common/cm/cm_mem.cpp35index f40b6925c8e..799dbaebde0 10064436--- a/media_driver/agnostic/common/cm/cm_mem.cpp37+++ b/media_driver/agnostic/common/cm/cm_mem.cpp38@@ -26,27 +26,40 @@3940 #include "cm_mem.h"41 #include "cm_mem_c_impl.h"42+43+#if !defined(__loongarch64)44 #include "cm_mem_sse2_impl.h"45+#endif4647 typedef void(*t_CmFastMemCopy)( void* dst, const void* src, const size_t bytes );48 typedef void(*t_CmFastMemCopyWC)( void* dst, const void* src, const size_t bytes );4950+#if !defined(__loongarch64)51 #define CM_FAST_MEM_COPY_CPU_INIT_C(func) (func ## _C)52 #define CM_FAST_MEM_COPY_CPU_INIT_SSE2(func) (func ## _SSE2)53 #define CM_FAST_MEM_COPY_CPU_INIT(func) (is_SSE2_available ? CM_FAST_MEM_COPY_CPU_INIT_SSE2(func) : CM_FAST_MEM_COPY_CPU_INIT_C(func))54+#endif5556 void CmFastMemCopy( void* dst, const void* src, const size_t bytes )57 {58+#if defined(__loongarch64)59+ CmFastMemCopy_C(dst, src, bytes);60+#else61 static const bool is_SSE2_available = (GetCpuInstructionLevel() >= CPU_INSTRUCTION_LEVEL_SSE2);62 static const t_CmFastMemCopy CmFastMemCopy_impl = CM_FAST_MEM_COPY_CPU_INIT(CmFastMemCopy);6364 CmFastMemCopy_impl(dst, src, bytes);65+#endif66 }6768 void CmFastMemCopyWC( void* dst, const void* src, const size_t bytes )69 {70+#if defined(__loongarch64)71+ CmFastMemCopyWC_C(dst, src, bytes);72+#else73 static const bool is_SSE2_available = (GetCpuInstructionLevel() >= CPU_INSTRUCTION_LEVEL_SSE2);74 static const t_CmFastMemCopyWC CmFastMemCopyWC_impl = CM_FAST_MEM_COPY_CPU_INIT(CmFastMemCopyWC);7576 CmFastMemCopyWC_impl(dst, src, bytes);77+#endif78 }79diff --git a/media_driver/agnostic/common/cm/cm_mem.h b/media_driver/agnostic/common/cm/cm_mem.h80index 67cfd75b106..d51e290ae6e 10064481--- a/media_driver/agnostic/common/cm/cm_mem.h82+++ b/media_driver/agnostic/common/cm/cm_mem.h83@@ -25,9 +25,15 @@84 //!85 #pragma once8687+#if defined(__loongarch64)88+#define SIMDE_X86_SSE2_ENABLE_NATIVE_ALIASES89+#include <simde/x86/sse2.h>90+#else91 #include <mmintrin.h>92 #include <xmmintrin.h>93 #include <emmintrin.h>94+#endif95+96 #include "cm_debug.h"97 #include "mos_utilities.h"9899@@ -43,7 +49,11 @@ enum CPU_INSTRUCTION_LEVEL100 NUM_CPU_INSTRUCTION_LEVELS101 };102103+#if defined(__loongarch64)104+typedef __m128i DQWORD; // 128-bits, 16-bytes105+#else106 typedef __m128 DQWORD; // 128-bits, 16-bytes107+#endif108 typedef uint32_t PREFETCH[8]; // 32-bytes109 typedef uint32_t CACHELINE[8]; // 32-bytes110 typedef uint16_t DHWORD[32]; // 512-bits, 64-bytes111@@ -230,9 +240,12 @@ inline CPU_INSTRUCTION_LEVEL GetCpuInstructionLevel( void )112 int cpuInfo[4];113 memset( cpuInfo, 0, 4*sizeof(int) );114115+#if !defined(__loongarch64)116 GetCPUID(cpuInfo, 1);117+#endif118119 CPU_INSTRUCTION_LEVEL cpuInstructionLevel = CPU_INSTRUCTION_LEVEL_UNKNOWN;120+#if !defined(__loongarch64)121 if( (cpuInfo[2] & BIT(19)) && TestSSE4_1() )122 {123 cpuInstructionLevel = CPU_INSTRUCTION_LEVEL_SSE4_1;124@@ -253,6 +266,7 @@ inline CPU_INSTRUCTION_LEVEL GetCpuInstructionLevel( void )125 {126 cpuInstructionLevel = CPU_INSTRUCTION_LEVEL_MMX;127 }128+#endif129130 return cpuInstructionLevel;131 }132diff --git a/media_driver/cmake/linux/media_compile_flags_linux.cmake b/media_driver/cmake/linux/media_compile_flags_linux.cmake133index 397e8c5cb58..677a3b78ae0 100755134--- a/media_driver/cmake/linux/media_compile_flags_linux.cmake135+++ b/media_driver/cmake/linux/media_compile_flags_linux.cmake136@@ -54,8 +54,6 @@ set(MEDIA_COMPILER_FLAGS_COMMON137138 # Enable c++14 features139 -std=c++14140- # -m32 or -m64141- -m${ARCH}142143 # Global defines144 -DLINUX=1145@@ -66,6 +64,13 @@ set(MEDIA_COMPILER_FLAGS_COMMON146 -g147 )148149+if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "^loongarch")150+ list(APPEND MEDIA_COMPILER_FLAGS_COMMON "-Wno-overloaded-virtual")151+else()152+ # -m32 or -m64153+ list(APPEND MEDIA_COMPILER_FLAGS_COMMON "-m${ARCH}")154+endif()155+156 if(MEDIA_BUILD_HARDENING)157 set(MEDIA_COMPILER_FLAGS_COMMON158 ${MEDIA_COMPILER_FLAGS_COMMON}159diff --git a/media_driver/linux/common/cm/hal/osservice/cm_mem_os.cpp b/media_driver/linux/common/cm/hal/osservice/cm_mem_os.cpp160index 97d224473fe..f9ab76b12c4 100644161--- a/media_driver/linux/common/cm/hal/osservice/cm_mem_os.cpp162+++ b/media_driver/linux/common/cm/hal/osservice/cm_mem_os.cpp163@@ -27,18 +27,27 @@164 #include "cm_mem.h"165 #include "cm_mem_os.h"166 #include "cm_mem_os_c_impl.h"167+168+#if !defined(__loongarch64)169 #include "cm_mem_os_sse4_impl.h"170+#endif171172 typedef void(*t_CmFastMemCopyFromWC)( void* dst, const void* src, const size_t bytes );173174+#if !defined(__loongarch64)175 #define CM_FAST_MEM_COPY_CPU_INIT_C(func) (func ## _C)176 #define CM_FAST_MEM_COPY_CPU_INIT_SSE4(func) (func ## _SSE4)177 #define CM_FAST_MEM_COPY_CPU_INIT(func) (is_SSE4_available ? CM_FAST_MEM_COPY_CPU_INIT_SSE4(func) : CM_FAST_MEM_COPY_CPU_INIT_C(func))178+#endif179180 void CmFastMemCopyFromWC( void* dst, const void* src, const size_t bytes, CPU_INSTRUCTION_LEVEL cpuInstructionLevel )181 {182+#if defined(__loongarch64)183+ CmFastMemCopyFromWC_C(dst, src, bytes);184+#else185 static const bool is_SSE4_available = (cpuInstructionLevel >= CPU_INSTRUCTION_LEVEL_SSE4_1);186 static const t_CmFastMemCopyFromWC CmFastMemCopyFromWC_impl = CM_FAST_MEM_COPY_CPU_INIT(CmFastMemCopyFromWC);187188 CmFastMemCopyFromWC_impl(dst, src, bytes);189+#endif190 }191diff --git a/media_driver/linux/common/cm/hal/osservice/cm_mem_os.h b/media_driver/linux/common/cm/hal/osservice/cm_mem_os.h192index e911e4e7e40..13d79df21aa 100644193--- a/media_driver/linux/common/cm/hal/osservice/cm_mem_os.h194+++ b/media_driver/linux/common/cm/hal/osservice/cm_mem_os.h195@@ -26,8 +26,13 @@196 #pragma once197198 #include <iostream>199+#if defined(__loongarch64)200+#define SIMDE_X86_SSE2_ENABLE_NATIVE_ALIASES201+#include <simde/x86/sse2.h>202+#else203 #include "cpuid.h"204 #include <smmintrin.h>205+#endif206207 typedef uintptr_t UINT_PTR;208 #define __fastcall209@@ -120,6 +125,9 @@ Inline Function:210 \*****************************************************************************/211 inline void GetCPUID(int cpuInfo[4], int infoType)212 {213+#if defined(__loongarch64)214+ return;215+#else216 #ifndef NO_EXCEPTION_HANDLING217 __try218 {219@@ -135,6 +143,7 @@ inline void GetCPUID(int cpuInfo[4], int infoType)220 return;221 }222 #endif //NO_EXCEPTION_HANDLING223+#endif //defined(__loongarch64)224 }225226 void CmFastMemCopyFromWC( void* dst, const void* src, const size_t bytes, CPU_INSTRUCTION_LEVEL cpuInstructionLevel );227diff --git a/media_driver/media_top_cmake.cmake b/media_driver/media_top_cmake.cmake228index a82ebe4d22b..8974dbe80da 100755229--- a/media_driver/media_top_cmake.cmake230+++ b/media_driver/media_top_cmake.cmake231@@ -46,6 +46,20 @@ if(NOT DEFINED SKIP_GMM_CHECK)232 endif()233 endif(NOT DEFINED SKIP_GMM_CHECK)234235+if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "^loongarch")236+find_path(SIMDE_INCLUDE_DIR237+ NAMES simde/simde-common.h # A key SIMDE header238+ PATHS /usr/include /usr/local/include # Default paths239+ DOC "Path to SIMDE headers"240+ )241+ if(SIMDE_INCLUDE_DIR)242+ include_directories(${SIMDE_INCLUDE_DIR})243+ message(STATUS "Found SIMDE: ${SIMDE_INCLUDE_DIR}")244+ else()245+ message(FATAL_ERROR "SIMDE not found. Install it or set SIMDE_INCLUDE_DIR manually.")246+ endif()247+endif()248+249 message("-- media -- PLATFORM = ${PLATFORM}")250 message("-- media -- ARCH = ${ARCH}")251 message("-- media -- CMAKE_CURRENT_LIST_DIR = ${CMAKE_CURRENT_LIST_DIR}")252@@ -248,8 +262,11 @@ set_source_files_properties(${CP_COMMON_SHARED_SOURCES_} PROPERTIES LANGUAGE "CX253 set_source_files_properties(${CP_COMMON_NEXT_SOURCES_} PROPERTIES LANGUAGE "CXX")254 set_source_files_properties(${CP_SOURCES_} PROPERTIES LANGUAGE "CXX")255 set_source_files_properties(${SOFTLET_DDI_SOURCES_} PROPERTIES LANGUAGE "CXX")256+257+if(NOT ${CMAKE_SYSTEM_PROCESSOR} MATCHES "^loongarch")258 set_source_files_properties(${SOURCES_SSE2} PROPERTIES LANGUAGE "CXX")259 set_source_files_properties(${SOURCES_SSE4} PROPERTIES LANGUAGE "CXX")260+endif()261262 # MHW settings263 set(SOFTLET_MHW_PRIVATE_INCLUDE_DIRS_264@@ -421,6 +438,7 @@ set (VP_PRIVATE_INCLUDE_DIRS_265 ${VP_PRIVATE_INCLUDE_DIRS_}266 ${SOFTLET_VP_PRIVATE_INCLUDE_DIRS_})267268+if(NOT ${CMAKE_SYSTEM_PROCESSOR} MATCHES "^loongarch")269 add_library(${LIB_NAME}_SSE2 OBJECT ${SOURCES_SSE2})270 target_compile_options(${LIB_NAME}_SSE2 PRIVATE -msse2)271 target_include_directories(${LIB_NAME}_SSE2 BEFORE PRIVATE ${SOFTLET_MOS_PREPEND_INCLUDE_DIRS_} ${MOS_PUBLIC_INCLUDE_DIRS_} ${SOFTLET_MOS_PUBLIC_INCLUDE_DIRS_} ${COMMON_PRIVATE_INCLUDE_DIRS_} ${SOFTLET_MHW_PRIVATE_INCLUDE_DIRS_} ${SOFTLET_DDI_PUBLIC_INCLUDE_DIRS_})272@@ -428,6 +446,7 @@ target_include_directories(${LIB_NAME}_SSE2 BEFORE PRIVATE ${SOFTLET_MOS_PREPEND273 add_library(${LIB_NAME}_SSE4 OBJECT ${SOURCES_SSE4})274 target_compile_options(${LIB_NAME}_SSE4 PRIVATE -msse4.1)275 target_include_directories(${LIB_NAME}_SSE4 BEFORE PRIVATE ${SOFTLET_MOS_PREPEND_INCLUDE_DIRS_} ${MOS_PUBLIC_INCLUDE_DIRS_} ${SOFTLET_MOS_PUBLIC_INCLUDE_DIRS_} ${COMMON_PRIVATE_INCLUDE_DIRS_} ${SOFTLET_MHW_PRIVATE_INCLUDE_DIRS_} ${SOFTLET_DDI_PUBLIC_INCLUDE_DIRS_})276+endif()277278 add_library(${LIB_NAME}_COMMON OBJECT ${COMMON_SOURCES_} ${SOFTLET_DDI_SOURCES_})279 set_property(TARGET ${LIB_NAME}_COMMON PROPERTY POSITION_INDEPENDENT_CODE 1)280@@ -603,6 +622,17 @@ target_include_directories(${LIB_NAME}_mos_softlet BEFORE PRIVATE281 ############## MOS LIB END ########################################282283 ############## Media Driver Static and Shared Lib #################284+if( ${CMAKE_SYSTEM_PROCESSOR} MATCHES "^loongarch")285+add_library(${LIB_NAME} SHARED286+ $<TARGET_OBJECTS:${LIB_NAME}_mos>287+ $<TARGET_OBJECTS:${LIB_NAME}_COMMON>288+ $<TARGET_OBJECTS:${LIB_NAME}_CODEC>289+ $<TARGET_OBJECTS:${LIB_NAME}_VP>290+ $<TARGET_OBJECTS:${LIB_NAME}_CP>291+ $<TARGET_OBJECTS:${LIB_NAME}_SOFTLET_VP>292+ $<TARGET_OBJECTS:${LIB_NAME}_SOFTLET_CODEC>293+ $<TARGET_OBJECTS:${LIB_NAME}_SOFTLET_COMMON>)294+else()295 add_library(${LIB_NAME} SHARED296 $<TARGET_OBJECTS:${LIB_NAME}_mos>297 $<TARGET_OBJECTS:${LIB_NAME}_COMMON>298@@ -614,8 +644,20 @@ add_library(${LIB_NAME} SHARED299 $<TARGET_OBJECTS:${LIB_NAME}_SOFTLET_VP>300 $<TARGET_OBJECTS:${LIB_NAME}_SOFTLET_CODEC>301 $<TARGET_OBJECTS:${LIB_NAME}_SOFTLET_COMMON>)302+endif()303304305+if( ${CMAKE_SYSTEM_PROCESSOR} MATCHES "^loongarch")306+add_library(${LIB_NAME_STATIC} STATIC307+ $<TARGET_OBJECTS:${LIB_NAME}_mos>308+ $<TARGET_OBJECTS:${LIB_NAME}_COMMON>309+ $<TARGET_OBJECTS:${LIB_NAME}_CODEC>310+ $<TARGET_OBJECTS:${LIB_NAME}_VP>311+ $<TARGET_OBJECTS:${LIB_NAME}_CP>312+ $<TARGET_OBJECTS:${LIB_NAME}_SOFTLET_VP>313+ $<TARGET_OBJECTS:${LIB_NAME}_SOFTLET_CODEC>314+ $<TARGET_OBJECTS:${LIB_NAME}_SOFTLET_COMMON>)315+else()316 add_library(${LIB_NAME_STATIC} STATIC317 $<TARGET_OBJECTS:${LIB_NAME}_mos>318 $<TARGET_OBJECTS:${LIB_NAME}_COMMON>319@@ -627,5 +669,6 @@ add_library(${LIB_NAME_STATIC} STATIC320 $<TARGET_OBJECTS:${LIB_NAME}_SOFTLET_VP>321 $<TARGET_OBJECTS:${LIB_NAME}_SOFTLET_CODEC>322 $<TARGET_OBJECTS:${LIB_NAME}_SOFTLET_COMMON>)323+endif()324325 set_target_properties(${LIB_NAME_STATIC} PROPERTIES OUTPUT_NAME ${LIB_NAME})326