aports

Custom Alpine Linux aports

git clone git://git.lin.moe/aports.git

  1From 64f03f0d9ece74ead6eaff63a4356b9fb481aa5f Mon Sep 17 00:00:00 2001
  2From: Jianfeng Liu <liujianfeng1994@gmail.com>
  3Date: Wed, 4 Jun 2025 17:44:54 +0800
  4Subject: [PATCH] add loongarch64 build support
  5
  6---
  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(-)
 16
 17diff --git a/cmrtlib/build_linux.sh b/cmrtlib/build_linux.sh
 18index f3f5fd02a91..b80460df90f 100644
 19--- a/cmrtlib/build_linux.sh
 20+++ b/cmrtlib/build_linux.sh
 21@@ -138,7 +138,11 @@ case $BUILD_SIZE in
 22         if [[ $BUILD_64 -eq 1 ]]; then
 23             CROSS_BUILD=1
 24             BUILD_SIZE=64
 25-            EXTRA_OPTIONS="export CFLAGS=-m64 CXXFLAGS=-m64"
 26+            if [ ${MACHINE_TYPE} == 'loongarch64' ]; then
 27+                EXTRA_OPTIONS=""
 28+            else
 29+                EXTRA_OPTIONS="export CFLAGS=-m64 CXXFLAGS=-m64"
 30+            fi
 31         fi
 32         ;;
 33     64)
 34diff --git a/media_driver/agnostic/common/cm/cm_mem.cpp b/media_driver/agnostic/common/cm/cm_mem.cpp
 35index f40b6925c8e..799dbaebde0 100644
 36--- a/media_driver/agnostic/common/cm/cm_mem.cpp
 37+++ b/media_driver/agnostic/common/cm/cm_mem.cpp
 38@@ -26,27 +26,40 @@
 39 
 40 #include "cm_mem.h"
 41 #include "cm_mem_c_impl.h"
 42+
 43+#if !defined(__loongarch64)
 44 #include "cm_mem_sse2_impl.h"
 45+#endif
 46 
 47 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 );
 49 
 50+#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+#endif
 55 
 56 void CmFastMemCopy( void* dst, const void* src, const size_t bytes )
 57 {
 58+#if defined(__loongarch64)
 59+    CmFastMemCopy_C(dst, src, bytes);
 60+#else
 61     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);
 63 
 64     CmFastMemCopy_impl(dst, src, bytes);
 65+#endif
 66 }
 67 
 68 void CmFastMemCopyWC( void* dst, const void* src, const size_t bytes )
 69 {
 70+#if defined(__loongarch64)
 71+    CmFastMemCopyWC_C(dst, src, bytes);
 72+#else
 73     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);
 75 
 76     CmFastMemCopyWC_impl(dst, src, bytes);
 77+#endif
 78 }
 79diff --git a/media_driver/agnostic/common/cm/cm_mem.h b/media_driver/agnostic/common/cm/cm_mem.h
 80index 67cfd75b106..d51e290ae6e 100644
 81--- a/media_driver/agnostic/common/cm/cm_mem.h
 82+++ b/media_driver/agnostic/common/cm/cm_mem.h
 83@@ -25,9 +25,15 @@
 84 //!
 85 #pragma once
 86 
 87+#if defined(__loongarch64)
 88+#define SIMDE_X86_SSE2_ENABLE_NATIVE_ALIASES
 89+#include <simde/x86/sse2.h>
 90+#else
 91 #include <mmintrin.h>
 92 #include <xmmintrin.h>
 93 #include <emmintrin.h>
 94+#endif
 95+
 96 #include "cm_debug.h"
 97 #include "mos_utilities.h"
 98 
 99@@ -43,7 +49,11 @@ enum CPU_INSTRUCTION_LEVEL
100     NUM_CPU_INSTRUCTION_LEVELS
101 };
102 
103+#if defined(__loongarch64)
104+typedef __m128i             DQWORD;         // 128-bits,   16-bytes
105+#else
106 typedef __m128              DQWORD;         // 128-bits,   16-bytes
107+#endif
108 typedef uint32_t            PREFETCH[8];    //             32-bytes
109 typedef uint32_t            CACHELINE[8];   //             32-bytes
110 typedef uint16_t            DHWORD[32];     // 512-bits,   64-bytes
111@@ -230,9 +240,12 @@ inline CPU_INSTRUCTION_LEVEL GetCpuInstructionLevel( void )
112     int cpuInfo[4];
113     memset( cpuInfo, 0, 4*sizeof(int) );
114 
115+#if !defined(__loongarch64)
116     GetCPUID(cpuInfo, 1);
117+#endif
118 
119     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+#endif
129 
130     return cpuInstructionLevel;
131 }
132diff --git a/media_driver/cmake/linux/media_compile_flags_linux.cmake b/media_driver/cmake/linux/media_compile_flags_linux.cmake
133index 397e8c5cb58..677a3b78ae0 100755
134--- a/media_driver/cmake/linux/media_compile_flags_linux.cmake
135+++ b/media_driver/cmake/linux/media_compile_flags_linux.cmake
136@@ -54,8 +54,6 @@ set(MEDIA_COMPILER_FLAGS_COMMON
137 
138     # Enable c++14 features
139     -std=c++14
140-    # -m32 or -m64
141-    -m${ARCH}
142 
143     # Global defines
144     -DLINUX=1
145@@ -66,6 +64,13 @@ set(MEDIA_COMPILER_FLAGS_COMMON
146     -g
147 )
148 
149+if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "^loongarch")
150+    list(APPEND MEDIA_COMPILER_FLAGS_COMMON "-Wno-overloaded-virtual")
151+else()
152+    # -m32 or -m64
153+    list(APPEND MEDIA_COMPILER_FLAGS_COMMON "-m${ARCH}")
154+endif()
155+
156 if(MEDIA_BUILD_HARDENING)
157     set(MEDIA_COMPILER_FLAGS_COMMON
158         ${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.cpp
160index 97d224473fe..f9ab76b12c4 100644
161--- a/media_driver/linux/common/cm/hal/osservice/cm_mem_os.cpp
162+++ b/media_driver/linux/common/cm/hal/osservice/cm_mem_os.cpp
163@@ -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+#endif
171 
172 typedef void(*t_CmFastMemCopyFromWC)( void* dst, const void* src, const size_t bytes );
173 
174+#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+#endif
179 
180 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+#else
185     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);
187 
188     CmFastMemCopyFromWC_impl(dst, src, bytes);
189+#endif
190 }
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.h
192index e911e4e7e40..13d79df21aa 100644
193--- a/media_driver/linux/common/cm/hal/osservice/cm_mem_os.h
194+++ b/media_driver/linux/common/cm/hal/osservice/cm_mem_os.h
195@@ -26,8 +26,13 @@
196 #pragma once
197 
198 #include <iostream>
199+#if defined(__loongarch64)
200+#define SIMDE_X86_SSE2_ENABLE_NATIVE_ALIASES
201+#include <simde/x86/sse2.h>
202+#else
203 #include "cpuid.h"
204 #include <smmintrin.h>
205+#endif
206 
207 typedef uintptr_t           UINT_PTR;
208 #define __fastcall
209@@ -120,6 +125,9 @@ Inline Function:
210 \*****************************************************************************/
211 inline void GetCPUID(int cpuInfo[4], int infoType)
212 {
213+#if defined(__loongarch64)
214+    return;
215+#else
216 #ifndef NO_EXCEPTION_HANDLING
217     __try
218     {
219@@ -135,6 +143,7 @@ inline void GetCPUID(int cpuInfo[4], int infoType)
220         return;
221     }
222 #endif  //NO_EXCEPTION_HANDLING
223+#endif //defined(__loongarch64)
224 }
225 
226 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.cmake
228index a82ebe4d22b..8974dbe80da 100755
229--- a/media_driver/media_top_cmake.cmake
230+++ b/media_driver/media_top_cmake.cmake
231@@ -46,6 +46,20 @@ if(NOT DEFINED SKIP_GMM_CHECK)
232     endif()
233 endif(NOT DEFINED SKIP_GMM_CHECK)
234 
235+if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "^loongarch")
236+find_path(SIMDE_INCLUDE_DIR
237+        NAMES simde/simde-common.h  # A key SIMDE header
238+        PATHS /usr/include /usr/local/include  # Default paths
239+        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 "CX
253 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()
261 
262 # MHW settings
263 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_})
267 
268+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_PREPEND
273 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()
277 
278 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 PRIVATE
281 ############## MOS LIB END ########################################
282 
283 ############## Media Driver Static and Shared Lib #################
284+if( ${CMAKE_SYSTEM_PROCESSOR} MATCHES "^loongarch")
285+add_library(${LIB_NAME} SHARED
286+    $<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} SHARED
296     $<TARGET_OBJECTS:${LIB_NAME}_mos>
297     $<TARGET_OBJECTS:${LIB_NAME}_COMMON>
298@@ -614,8 +644,20 @@ add_library(${LIB_NAME} SHARED
299     $<TARGET_OBJECTS:${LIB_NAME}_SOFTLET_VP>
300     $<TARGET_OBJECTS:${LIB_NAME}_SOFTLET_CODEC>
301     $<TARGET_OBJECTS:${LIB_NAME}_SOFTLET_COMMON>)
302+endif()
303 
304 
305+if( ${CMAKE_SYSTEM_PROCESSOR} MATCHES "^loongarch")
306+add_library(${LIB_NAME_STATIC} STATIC
307+    $<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} STATIC
317     $<TARGET_OBJECTS:${LIB_NAME}_mos>
318     $<TARGET_OBJECTS:${LIB_NAME}_COMMON>
319@@ -627,5 +669,6 @@ add_library(${LIB_NAME_STATIC} STATIC
320     $<TARGET_OBJECTS:${LIB_NAME}_SOFTLET_VP>
321     $<TARGET_OBJECTS:${LIB_NAME}_SOFTLET_CODEC>
322     $<TARGET_OBJECTS:${LIB_NAME}_SOFTLET_COMMON>)
323+endif()
324 
325 set_target_properties(${LIB_NAME_STATIC} PROPERTIES OUTPUT_NAME ${LIB_NAME})
326