meta-intel/recipes-multimedia/libva/files/0006-add-INTEL-MEDIA-ALLOC-refineE-to-specify-the-memory-.patch
Lim Siew Hoon 723644dd33 intel-media-driver: upgrade 23.3.5 -> 23.4.3
Drop patches already merged:
 * 0002-Add-VASurfaceAttribMemoryType-for-ACM.patch
 * 0004-Set-sRGB-color-space-for-non-video-wall-and-no-backg.patch
 * 0005-XRGB-force-to-do-swizzle-for-AVC-HEVC.patch
 * 0006-Add-DG2-DIDs.patch

Rebased patchess:
 * 0001-Disable-vp9-padding-on-mtl.patch
 * 0002-Force-ARGB-surface-to-tile4-for-ACM.patch

Added new bug fixed:
 * 0004-Add-device-ID-for-ARL.patch
 * 0005-Add-XR24-support-to-DMABuf.patch
 * 0006-add-INTEL-MEDIA-ALLOC-refineE-to-specify-the-memory-.patch
 * 0007-Skip-report-keys.patch
 * 0008-Limit-INTEL-MEDIA-ALLOC-MODE-to-MTL-and-ARL-only.patch
 * 0009-Skip-cache-bucket-realloc-for-default-mode-0.patch
 * 0010-Fix-failed-4k-video-wall-test-case-and-color-corrupt.patch
 * 0011-Disable-422H-format-output.patch
 * 0012-Decode-Fix-AVC-decode-SFC-4K-hang-issue.patch

Release notes:
https://github.com/intel/media-driver/releases/tag/intel-media-23.4.3

Signed-off-by: Lim Siew Hoon <siew.hoon.lim@intel.com>
Signed-off-by: Anuj Mittal <anuj.mittal@intel.com>
2024-02-26 14:23:43 +08:00

215 lines
8.3 KiB
Diff

From 67fb6128adf8fc03d429393e98f0982b42a40e64 Mon Sep 17 00:00:00 2001
From: Zhang_Xinfeng <carl.zhang@intel.com>
Date: Wed, 27 Dec 2023 09:59:29 +0800
Subject: [PATCH 06/12] add INTEL MEDIA ALLOC refineE to specify the memory
alignment
this key is used to allocate bigger pages
env variable INTEL_MEDIA_ALLOC_refineE also could be used
and was not enabled by default
mode 0 is default mode
mode 1 is < 64 align to 64
mode 2 is > 1M && <= 3M align to 1M, >3M align to 2M
mode 3 is mode 1 & mode 2
Upstream-Status: Backport [https://github.com/intel/media-driver/commit/765dd939dcc5562d18cca18e5eda505bda952797]
Signed-off-by: Lim, Siew Hoon <siew.hoon.lim@intel.com>
---
.../linux/common/os/i915/mos_bufmgr.c | 75 +++++++++++++++----
.../common/os/i915_production/mos_bufmgr.c | 1 +
.../common/os/mos_context_specific_next.cpp | 21 +++++-
.../common/os/mos_user_setting_specific.cpp | 7 ++
4 files changed, 90 insertions(+), 14 deletions(-)
diff --git a/media_softlet/linux/common/os/i915/mos_bufmgr.c b/media_softlet/linux/common/os/i915/mos_bufmgr.c
index c0b3ba027..b623d0129 100644
--- a/media_softlet/linux/common/os/i915/mos_bufmgr.c
+++ b/media_softlet/linux/common/os/i915/mos_bufmgr.c
@@ -138,7 +138,7 @@ struct mos_bufmgr_gem {
int exec_count;
/** Array of lists of cached gem objects of power-of-two sizes */
- struct mos_gem_bo_bucket cache_bucket[14 * 4];
+ struct mos_gem_bo_bucket cache_bucket[64];
int num_buckets;
time_t time;
@@ -3852,9 +3852,9 @@ add_bucket(struct mos_bufmgr_gem *bufmgr_gem, int size)
}
static void
-init_cache_buckets(struct mos_bufmgr_gem *bufmgr_gem)
+init_cache_buckets(struct mos_bufmgr_gem *bufmgr_gem, uint8_t alloc_mode)
{
- unsigned long size, cache_max_size = 64 * 1024 * 1024;
+ unsigned long size, cache_max_size = 64 * 1024 * 1024, unit_size;
/* OK, so power of two buckets was too wasteful of memory.
* Give 3 other sizes between each power of two, to hopefully
@@ -3864,17 +3864,63 @@ init_cache_buckets(struct mos_bufmgr_gem *bufmgr_gem)
* width/height alignment and rounding of sizes to pages will
* get us useful cache hit rates anyway)
*/
- add_bucket(bufmgr_gem, 4096);
- add_bucket(bufmgr_gem, 4096 * 2);
- add_bucket(bufmgr_gem, 4096 * 3);
+ /* alloc_mode 0 is default alloc_mode
+ * alloc_mode 1 rounding up to 64K for all < 1M
+ * alloc_mode 2 rounding up to 2M for size> 1M
+ * alloc_mode 3 rounding up to 2M for size > 1M and 64K for size <= 1M */
+ if( alloc_mode > 3 )
+ alloc_mode = 0;
+
+ if ( 0 == alloc_mode || 2 == alloc_mode)
+ {
+ // < 1M normal alloc_mode
+ add_bucket(bufmgr_gem, 4096);
+ add_bucket(bufmgr_gem, 4096 * 2);
+ add_bucket(bufmgr_gem, 4096 * 3);
+ /* Initialize the linked lists for BO reuse cache. */
+ for (size = 4 * 4096; size < 1024 * 1024; size *= 2) {
+ add_bucket(bufmgr_gem, size);
+ add_bucket(bufmgr_gem, size + size * 1 / 4);
+ add_bucket(bufmgr_gem, size + size * 2 / 4);
+ add_bucket(bufmgr_gem, size + size * 3 / 4);
+ }
- /* Initialize the linked lists for BO reuse cache. */
- for (size = 4 * 4096; size <= cache_max_size; size *= 2) {
- add_bucket(bufmgr_gem, size);
+ add_bucket(bufmgr_gem, 1024 * 1024);
+ }
+ if (1 == alloc_mode || 3 == alloc_mode)
+ {
+ // < 1M 64k alignment
+ unit_size = 64 * 1024;
+ for (size = unit_size; size <= 1024 * 1024; size += unit_size)
+ {
+ add_bucket(bufmgr_gem, size);
+ }
+ }
+ if( 0 == alloc_mode || 1 == alloc_mode)
+ {
+ //> 1M is normal alloc_mode
+ add_bucket(bufmgr_gem, 1280 * 1024);
+ add_bucket(bufmgr_gem, 1536 * 1024);
+ add_bucket(bufmgr_gem, 1792 * 1024);
+
+ for (size = 2 * 1024 * 1024; size < cache_max_size; size *= 2) {
+ add_bucket(bufmgr_gem, size);
+ add_bucket(bufmgr_gem, size + size * 1 / 4);
+ add_bucket(bufmgr_gem, size + size * 2 / 4);
+ add_bucket(bufmgr_gem, size + size * 3 / 4);
+ }
+ }
+ if( 2 == alloc_mode || 3 == alloc_mode)
+ {
+ //> 1M rolling to 2M
+ unit_size = 2 * 1024 * 1024;
+ add_bucket(bufmgr_gem, unit_size);
+ add_bucket(bufmgr_gem, 3 * 1024 * 1024);
- add_bucket(bufmgr_gem, size + size * 1 / 4);
- add_bucket(bufmgr_gem, size + size * 2 / 4);
- add_bucket(bufmgr_gem, size + size * 3 / 4);
+ for (size = 4 * 1024 * 1024; size <= cache_max_size; size += unit_size)
+ {
+ add_bucket(bufmgr_gem, size);
+ }
}
}
@@ -5100,6 +5146,7 @@ mos_bufmgr_gem_init_i915(int fd, int batch_size)
struct drm_i915_gem_get_aperture aperture;
drm_i915_getparam_t gp;
int ret, tmp;
+ uint8_t alloc_mode;
bool exec2 = false;
pthread_mutex_lock(&bufmgr_list_mutex);
@@ -5352,10 +5399,12 @@ mos_bufmgr_gem_init_i915(int fd, int batch_size)
*
* Every 4 was too few for the blender benchmark.
*/
+ alloc_mode = (uint8_t)(batch_size & 0xff);
+ batch_size &= 0xffffff00;
bufmgr_gem->max_relocs = batch_size / sizeof(uint32_t) / 2 - 2;
DRMINITLISTHEAD(&bufmgr_gem->named);
- init_cache_buckets(bufmgr_gem);
+ init_cache_buckets(bufmgr_gem,alloc_mode);
DRMLISTADD(&bufmgr_gem->managers, &bufmgr_list);
diff --git a/media_softlet/linux/common/os/i915_production/mos_bufmgr.c b/media_softlet/linux/common/os/i915_production/mos_bufmgr.c
index 90b5685b1..b3574f7d3 100644
--- a/media_softlet/linux/common/os/i915_production/mos_bufmgr.c
+++ b/media_softlet/linux/common/os/i915_production/mos_bufmgr.c
@@ -5403,6 +5403,7 @@ mos_bufmgr_gem_init_i915(int fd, int batch_size)
*
* Every 4 was too few for the blender benchmark.
*/
+ batch_size &= 0xffffff00;
bufmgr_gem->max_relocs = batch_size / sizeof(uint32_t) / 2 - 2;
DRMINITLISTHEAD(&bufmgr_gem->named);
diff --git a/media_softlet/linux/common/os/mos_context_specific_next.cpp b/media_softlet/linux/common/os/mos_context_specific_next.cpp
index 9e9e3ff7e..543e262d1 100644
--- a/media_softlet/linux/common/os/mos_context_specific_next.cpp
+++ b/media_softlet/linux/common/os/mos_context_specific_next.cpp
@@ -64,6 +64,7 @@ MOS_STATUS OsContextSpecificNext::Init(DDI_DEVICE_CONTEXT ddiDriverContext)
uint32_t iDeviceId = 0;
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
uint32_t value = 0;
+ uint32_t mode = 0;
MediaUserSettingSharedPtr userSettingPtr = nullptr;
MOS_OS_FUNCTION_ENTER;
@@ -89,7 +90,25 @@ MOS_STATUS OsContextSpecificNext::Init(DDI_DEVICE_CONTEXT ddiDriverContext)
userSettingPtr = MosInterface::MosGetUserSettingInstance(osDriverContext);
- m_bufmgr = mos_bufmgr_gem_init(m_fd, BATCH_BUFFER_SIZE, &m_deviceType);
+ mode = BATCH_BUFFER_SIZE;
+ ReadUserSetting(
+ userSettingPtr,
+ value,
+ "INTEL MEDIA ALLOC MODE",
+ MediaUserSetting::Group::Device);
+
+ if (value)
+ {
+ mode |= (value & 0x000000ff);
+ }
+ value = 0;
+ /* no need to set batch buffer size after switch to softpin
+ * keep it, just for test during relocation to softpin transition
+ * now , it could be a debug method , but is actually useless
+ * so it is safe to reuse the lowest 8bit to convey addtional information
+ * more suitable solution is deleting it , or add additional parameter*/
+
+ m_bufmgr = mos_bufmgr_gem_init(m_fd, (int)mode, &m_deviceType);
if (nullptr == m_bufmgr)
{
MOS_OS_ASSERTMESSAGE("Not able to allocate buffer manager, fd=0x%d", m_fd);
diff --git a/media_softlet/linux/common/os/mos_user_setting_specific.cpp b/media_softlet/linux/common/os/mos_user_setting_specific.cpp
index 6be8b4298..caed584f4 100644
--- a/media_softlet/linux/common/os/mos_user_setting_specific.cpp
+++ b/media_softlet/linux/common/os/mos_user_setting_specific.cpp
@@ -52,5 +52,12 @@ MOS_STATUS MosUserSetting::InitMosUserSettingSpecific(MediaUserSettingSharedPtr
0,
true); //"Enable VM Bind."
+ DeclareUserSettingKey(
+ userSettingPtr,
+ "INTEL MEDIA ALLOC MODE",
+ MediaUserSetting::Group::Device,
+ 0,
+ false); //
+
return MOS_STATUS_SUCCESS;
}
--
2.40.1