diff options
Diffstat (limited to 'recipes-multimedia/libva/files/0006-add-INTEL-MEDIA-ALLOC-refineE-to-specify-the-memory-.patch')
-rw-r--r-- | recipes-multimedia/libva/files/0006-add-INTEL-MEDIA-ALLOC-refineE-to-specify-the-memory-.patch | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/recipes-multimedia/libva/files/0006-add-INTEL-MEDIA-ALLOC-refineE-to-specify-the-memory-.patch b/recipes-multimedia/libva/files/0006-add-INTEL-MEDIA-ALLOC-refineE-to-specify-the-memory-.patch new file mode 100644 index 00000000..5b04201a --- /dev/null +++ b/recipes-multimedia/libva/files/0006-add-INTEL-MEDIA-ALLOC-refineE-to-specify-the-memory-.patch | |||
@@ -0,0 +1,214 @@ | |||
1 | From 67fb6128adf8fc03d429393e98f0982b42a40e64 Mon Sep 17 00:00:00 2001 | ||
2 | From: Zhang_Xinfeng <carl.zhang@intel.com> | ||
3 | Date: Wed, 27 Dec 2023 09:59:29 +0800 | ||
4 | Subject: [PATCH 06/12] add INTEL MEDIA ALLOC refineE to specify the memory | ||
5 | alignment | ||
6 | |||
7 | this key is used to allocate bigger pages | ||
8 | env variable INTEL_MEDIA_ALLOC_refineE also could be used | ||
9 | and was not enabled by default | ||
10 | mode 0 is default mode | ||
11 | mode 1 is < 64 align to 64 | ||
12 | mode 2 is > 1M && <= 3M align to 1M, >3M align to 2M | ||
13 | mode 3 is mode 1 & mode 2 | ||
14 | |||
15 | Upstream-Status: Backport [https://github.com/intel/media-driver/commit/765dd939dcc5562d18cca18e5eda505bda952797] | ||
16 | Signed-off-by: Lim, Siew Hoon <siew.hoon.lim@intel.com> | ||
17 | --- | ||
18 | .../linux/common/os/i915/mos_bufmgr.c | 75 +++++++++++++++---- | ||
19 | .../common/os/i915_production/mos_bufmgr.c | 1 + | ||
20 | .../common/os/mos_context_specific_next.cpp | 21 +++++- | ||
21 | .../common/os/mos_user_setting_specific.cpp | 7 ++ | ||
22 | 4 files changed, 90 insertions(+), 14 deletions(-) | ||
23 | |||
24 | diff --git a/media_softlet/linux/common/os/i915/mos_bufmgr.c b/media_softlet/linux/common/os/i915/mos_bufmgr.c | ||
25 | index c0b3ba027..b623d0129 100644 | ||
26 | --- a/media_softlet/linux/common/os/i915/mos_bufmgr.c | ||
27 | +++ b/media_softlet/linux/common/os/i915/mos_bufmgr.c | ||
28 | @@ -138,7 +138,7 @@ struct mos_bufmgr_gem { | ||
29 | int exec_count; | ||
30 | |||
31 | /** Array of lists of cached gem objects of power-of-two sizes */ | ||
32 | - struct mos_gem_bo_bucket cache_bucket[14 * 4]; | ||
33 | + struct mos_gem_bo_bucket cache_bucket[64]; | ||
34 | int num_buckets; | ||
35 | time_t time; | ||
36 | |||
37 | @@ -3852,9 +3852,9 @@ add_bucket(struct mos_bufmgr_gem *bufmgr_gem, int size) | ||
38 | } | ||
39 | |||
40 | static void | ||
41 | -init_cache_buckets(struct mos_bufmgr_gem *bufmgr_gem) | ||
42 | +init_cache_buckets(struct mos_bufmgr_gem *bufmgr_gem, uint8_t alloc_mode) | ||
43 | { | ||
44 | - unsigned long size, cache_max_size = 64 * 1024 * 1024; | ||
45 | + unsigned long size, cache_max_size = 64 * 1024 * 1024, unit_size; | ||
46 | |||
47 | /* OK, so power of two buckets was too wasteful of memory. | ||
48 | * Give 3 other sizes between each power of two, to hopefully | ||
49 | @@ -3864,17 +3864,63 @@ init_cache_buckets(struct mos_bufmgr_gem *bufmgr_gem) | ||
50 | * width/height alignment and rounding of sizes to pages will | ||
51 | * get us useful cache hit rates anyway) | ||
52 | */ | ||
53 | - add_bucket(bufmgr_gem, 4096); | ||
54 | - add_bucket(bufmgr_gem, 4096 * 2); | ||
55 | - add_bucket(bufmgr_gem, 4096 * 3); | ||
56 | + /* alloc_mode 0 is default alloc_mode | ||
57 | + * alloc_mode 1 rounding up to 64K for all < 1M | ||
58 | + * alloc_mode 2 rounding up to 2M for size> 1M | ||
59 | + * alloc_mode 3 rounding up to 2M for size > 1M and 64K for size <= 1M */ | ||
60 | + if( alloc_mode > 3 ) | ||
61 | + alloc_mode = 0; | ||
62 | + | ||
63 | + if ( 0 == alloc_mode || 2 == alloc_mode) | ||
64 | + { | ||
65 | + // < 1M normal alloc_mode | ||
66 | + add_bucket(bufmgr_gem, 4096); | ||
67 | + add_bucket(bufmgr_gem, 4096 * 2); | ||
68 | + add_bucket(bufmgr_gem, 4096 * 3); | ||
69 | + /* Initialize the linked lists for BO reuse cache. */ | ||
70 | + for (size = 4 * 4096; size < 1024 * 1024; size *= 2) { | ||
71 | + add_bucket(bufmgr_gem, size); | ||
72 | + add_bucket(bufmgr_gem, size + size * 1 / 4); | ||
73 | + add_bucket(bufmgr_gem, size + size * 2 / 4); | ||
74 | + add_bucket(bufmgr_gem, size + size * 3 / 4); | ||
75 | + } | ||
76 | |||
77 | - /* Initialize the linked lists for BO reuse cache. */ | ||
78 | - for (size = 4 * 4096; size <= cache_max_size; size *= 2) { | ||
79 | - add_bucket(bufmgr_gem, size); | ||
80 | + add_bucket(bufmgr_gem, 1024 * 1024); | ||
81 | + } | ||
82 | + if (1 == alloc_mode || 3 == alloc_mode) | ||
83 | + { | ||
84 | + // < 1M 64k alignment | ||
85 | + unit_size = 64 * 1024; | ||
86 | + for (size = unit_size; size <= 1024 * 1024; size += unit_size) | ||
87 | + { | ||
88 | + add_bucket(bufmgr_gem, size); | ||
89 | + } | ||
90 | + } | ||
91 | + if( 0 == alloc_mode || 1 == alloc_mode) | ||
92 | + { | ||
93 | + //> 1M is normal alloc_mode | ||
94 | + add_bucket(bufmgr_gem, 1280 * 1024); | ||
95 | + add_bucket(bufmgr_gem, 1536 * 1024); | ||
96 | + add_bucket(bufmgr_gem, 1792 * 1024); | ||
97 | + | ||
98 | + for (size = 2 * 1024 * 1024; size < cache_max_size; size *= 2) { | ||
99 | + add_bucket(bufmgr_gem, size); | ||
100 | + add_bucket(bufmgr_gem, size + size * 1 / 4); | ||
101 | + add_bucket(bufmgr_gem, size + size * 2 / 4); | ||
102 | + add_bucket(bufmgr_gem, size + size * 3 / 4); | ||
103 | + } | ||
104 | + } | ||
105 | + if( 2 == alloc_mode || 3 == alloc_mode) | ||
106 | + { | ||
107 | + //> 1M rolling to 2M | ||
108 | + unit_size = 2 * 1024 * 1024; | ||
109 | + add_bucket(bufmgr_gem, unit_size); | ||
110 | + add_bucket(bufmgr_gem, 3 * 1024 * 1024); | ||
111 | |||
112 | - add_bucket(bufmgr_gem, size + size * 1 / 4); | ||
113 | - add_bucket(bufmgr_gem, size + size * 2 / 4); | ||
114 | - add_bucket(bufmgr_gem, size + size * 3 / 4); | ||
115 | + for (size = 4 * 1024 * 1024; size <= cache_max_size; size += unit_size) | ||
116 | + { | ||
117 | + add_bucket(bufmgr_gem, size); | ||
118 | + } | ||
119 | } | ||
120 | } | ||
121 | |||
122 | @@ -5100,6 +5146,7 @@ mos_bufmgr_gem_init_i915(int fd, int batch_size) | ||
123 | struct drm_i915_gem_get_aperture aperture; | ||
124 | drm_i915_getparam_t gp; | ||
125 | int ret, tmp; | ||
126 | + uint8_t alloc_mode; | ||
127 | bool exec2 = false; | ||
128 | |||
129 | pthread_mutex_lock(&bufmgr_list_mutex); | ||
130 | @@ -5352,10 +5399,12 @@ mos_bufmgr_gem_init_i915(int fd, int batch_size) | ||
131 | * | ||
132 | * Every 4 was too few for the blender benchmark. | ||
133 | */ | ||
134 | + alloc_mode = (uint8_t)(batch_size & 0xff); | ||
135 | + batch_size &= 0xffffff00; | ||
136 | bufmgr_gem->max_relocs = batch_size / sizeof(uint32_t) / 2 - 2; | ||
137 | |||
138 | DRMINITLISTHEAD(&bufmgr_gem->named); | ||
139 | - init_cache_buckets(bufmgr_gem); | ||
140 | + init_cache_buckets(bufmgr_gem,alloc_mode); | ||
141 | |||
142 | DRMLISTADD(&bufmgr_gem->managers, &bufmgr_list); | ||
143 | |||
144 | diff --git a/media_softlet/linux/common/os/i915_production/mos_bufmgr.c b/media_softlet/linux/common/os/i915_production/mos_bufmgr.c | ||
145 | index 90b5685b1..b3574f7d3 100644 | ||
146 | --- a/media_softlet/linux/common/os/i915_production/mos_bufmgr.c | ||
147 | +++ b/media_softlet/linux/common/os/i915_production/mos_bufmgr.c | ||
148 | @@ -5403,6 +5403,7 @@ mos_bufmgr_gem_init_i915(int fd, int batch_size) | ||
149 | * | ||
150 | * Every 4 was too few for the blender benchmark. | ||
151 | */ | ||
152 | + batch_size &= 0xffffff00; | ||
153 | bufmgr_gem->max_relocs = batch_size / sizeof(uint32_t) / 2 - 2; | ||
154 | |||
155 | DRMINITLISTHEAD(&bufmgr_gem->named); | ||
156 | diff --git a/media_softlet/linux/common/os/mos_context_specific_next.cpp b/media_softlet/linux/common/os/mos_context_specific_next.cpp | ||
157 | index 9e9e3ff7e..543e262d1 100644 | ||
158 | --- a/media_softlet/linux/common/os/mos_context_specific_next.cpp | ||
159 | +++ b/media_softlet/linux/common/os/mos_context_specific_next.cpp | ||
160 | @@ -64,6 +64,7 @@ MOS_STATUS OsContextSpecificNext::Init(DDI_DEVICE_CONTEXT ddiDriverContext) | ||
161 | uint32_t iDeviceId = 0; | ||
162 | MOS_STATUS eStatus = MOS_STATUS_SUCCESS; | ||
163 | uint32_t value = 0; | ||
164 | + uint32_t mode = 0; | ||
165 | MediaUserSettingSharedPtr userSettingPtr = nullptr; | ||
166 | |||
167 | MOS_OS_FUNCTION_ENTER; | ||
168 | @@ -89,7 +90,25 @@ MOS_STATUS OsContextSpecificNext::Init(DDI_DEVICE_CONTEXT ddiDriverContext) | ||
169 | |||
170 | userSettingPtr = MosInterface::MosGetUserSettingInstance(osDriverContext); | ||
171 | |||
172 | - m_bufmgr = mos_bufmgr_gem_init(m_fd, BATCH_BUFFER_SIZE, &m_deviceType); | ||
173 | + mode = BATCH_BUFFER_SIZE; | ||
174 | + ReadUserSetting( | ||
175 | + userSettingPtr, | ||
176 | + value, | ||
177 | + "INTEL MEDIA ALLOC MODE", | ||
178 | + MediaUserSetting::Group::Device); | ||
179 | + | ||
180 | + if (value) | ||
181 | + { | ||
182 | + mode |= (value & 0x000000ff); | ||
183 | + } | ||
184 | + value = 0; | ||
185 | + /* no need to set batch buffer size after switch to softpin | ||
186 | + * keep it, just for test during relocation to softpin transition | ||
187 | + * now , it could be a debug method , but is actually useless | ||
188 | + * so it is safe to reuse the lowest 8bit to convey addtional information | ||
189 | + * more suitable solution is deleting it , or add additional parameter*/ | ||
190 | + | ||
191 | + m_bufmgr = mos_bufmgr_gem_init(m_fd, (int)mode, &m_deviceType); | ||
192 | if (nullptr == m_bufmgr) | ||
193 | { | ||
194 | MOS_OS_ASSERTMESSAGE("Not able to allocate buffer manager, fd=0x%d", m_fd); | ||
195 | diff --git a/media_softlet/linux/common/os/mos_user_setting_specific.cpp b/media_softlet/linux/common/os/mos_user_setting_specific.cpp | ||
196 | index 6be8b4298..caed584f4 100644 | ||
197 | --- a/media_softlet/linux/common/os/mos_user_setting_specific.cpp | ||
198 | +++ b/media_softlet/linux/common/os/mos_user_setting_specific.cpp | ||
199 | @@ -52,5 +52,12 @@ MOS_STATUS MosUserSetting::InitMosUserSettingSpecific(MediaUserSettingSharedPtr | ||
200 | 0, | ||
201 | true); //"Enable VM Bind." | ||
202 | |||
203 | + DeclareUserSettingKey( | ||
204 | + userSettingPtr, | ||
205 | + "INTEL MEDIA ALLOC MODE", | ||
206 | + MediaUserSetting::Group::Device, | ||
207 | + 0, | ||
208 | + false); // | ||
209 | + | ||
210 | return MOS_STATUS_SUCCESS; | ||
211 | } | ||
212 | -- | ||
213 | 2.40.1 | ||
214 | |||