4
4
*/
5
5
6
6
#include "gem/i915_gem_domain.h"
7
+ #include "gem/i915_gem_internal.h"
7
8
#include "gt/gen8_ppgtt.h"
8
9
9
10
#include "i915_drv.h"
@@ -127,8 +128,12 @@ struct i915_vma *intel_dpt_pin(struct i915_address_space *vm)
127
128
struct i915_vma * vma ;
128
129
void __iomem * iomem ;
129
130
struct i915_gem_ww_ctx ww ;
131
+ u64 pin_flags = 0 ;
130
132
int err ;
131
133
134
+ if (i915_gem_object_is_stolen (dpt -> obj ))
135
+ pin_flags |= PIN_MAPPABLE ;
136
+
132
137
wakeref = intel_runtime_pm_get (& i915 -> runtime_pm );
133
138
atomic_inc (& i915 -> gpu_error .pending_fb_pin );
134
139
@@ -138,7 +143,7 @@ struct i915_vma *intel_dpt_pin(struct i915_address_space *vm)
138
143
continue ;
139
144
140
145
vma = i915_gem_object_ggtt_pin_ww (dpt -> obj , & ww , NULL , 0 , 4096 ,
141
- HAS_LMEM ( i915 ) ? 0 : PIN_MAPPABLE );
146
+ pin_flags );
142
147
if (IS_ERR (vma )) {
143
148
err = PTR_ERR (vma );
144
149
continue ;
@@ -248,10 +253,13 @@ intel_dpt_create(struct intel_framebuffer *fb)
248
253
249
254
size = round_up (size * sizeof (gen8_pte_t ), I915_GTT_PAGE_SIZE );
250
255
251
- if (HAS_LMEM (i915 ))
252
- dpt_obj = i915_gem_object_create_lmem (i915 , size , I915_BO_ALLOC_CONTIGUOUS );
253
- else
256
+ dpt_obj = i915_gem_object_create_lmem (i915 , size , I915_BO_ALLOC_CONTIGUOUS );
257
+ if (IS_ERR (dpt_obj ) && i915_ggtt_has_aperture (to_gt (i915 )-> ggtt ))
254
258
dpt_obj = i915_gem_object_create_stolen (i915 , size );
259
+ if (IS_ERR (dpt_obj ) && !HAS_LMEM (i915 )) {
260
+ drm_dbg_kms (& i915 -> drm , "Allocating dpt from smem\n" );
261
+ dpt_obj = i915_gem_object_create_internal (i915 , size );
262
+ }
255
263
if (IS_ERR (dpt_obj ))
256
264
return ERR_CAST (dpt_obj );
257
265
0 commit comments