@@ -196,7 +196,10 @@ static void gen8_ppgtt_cleanup(struct i915_address_space *vm)
196
196
if (intel_vgpu_active (vm -> i915 ))
197
197
gen8_ppgtt_notify_vgt (ppgtt , false);
198
198
199
- __gen8_ppgtt_cleanup (vm , ppgtt -> pd , gen8_pd_top_count (vm ), vm -> top );
199
+ if (ppgtt -> pd )
200
+ __gen8_ppgtt_cleanup (vm , ppgtt -> pd ,
201
+ gen8_pd_top_count (vm ), vm -> top );
202
+
200
203
free_scratch (vm );
201
204
}
202
205
@@ -803,8 +806,10 @@ static int gen8_init_scratch(struct i915_address_space *vm)
803
806
struct drm_i915_gem_object * obj ;
804
807
805
808
obj = vm -> alloc_pt_dma (vm , I915_GTT_PAGE_SIZE_4K );
806
- if (IS_ERR (obj ))
809
+ if (IS_ERR (obj )) {
810
+ ret = PTR_ERR (obj );
807
811
goto free_scratch ;
812
+ }
808
813
809
814
ret = map_pt_dma (vm , obj );
810
815
if (ret ) {
@@ -823,7 +828,8 @@ static int gen8_init_scratch(struct i915_address_space *vm)
823
828
free_scratch :
824
829
while (i -- )
825
830
i915_gem_object_put (vm -> scratch [i ]);
826
- return - ENOMEM ;
831
+ vm -> scratch [0 ] = NULL ;
832
+ return ret ;
827
833
}
828
834
829
835
static int gen8_preallocate_top_level_pdp (struct i915_ppgtt * ppgtt )
@@ -901,6 +907,7 @@ gen8_alloc_top_pd(struct i915_address_space *vm)
901
907
struct i915_ppgtt * gen8_ppgtt_create (struct intel_gt * gt ,
902
908
unsigned long lmem_pt_obj_flags )
903
909
{
910
+ struct i915_page_directory * pd ;
904
911
struct i915_ppgtt * ppgtt ;
905
912
int err ;
906
913
@@ -946,21 +953,7 @@ struct i915_ppgtt *gen8_ppgtt_create(struct intel_gt *gt,
946
953
ppgtt -> vm .alloc_scratch_dma = alloc_pt_dma ;
947
954
}
948
955
949
- err = gen8_init_scratch (& ppgtt -> vm );
950
- if (err )
951
- goto err_free ;
952
-
953
- ppgtt -> pd = gen8_alloc_top_pd (& ppgtt -> vm );
954
- if (IS_ERR (ppgtt -> pd )) {
955
- err = PTR_ERR (ppgtt -> pd );
956
- goto err_free_scratch ;
957
- }
958
-
959
- if (!i915_vm_is_4lvl (& ppgtt -> vm )) {
960
- err = gen8_preallocate_top_level_pdp (ppgtt );
961
- if (err )
962
- goto err_free_pd ;
963
- }
956
+ ppgtt -> vm .pte_encode = gen8_pte_encode ;
964
957
965
958
ppgtt -> vm .bind_async_flags = I915_VMA_LOCAL_BIND ;
966
959
ppgtt -> vm .insert_entries = gen8_ppgtt_insert ;
@@ -971,22 +964,31 @@ struct i915_ppgtt *gen8_ppgtt_create(struct intel_gt *gt,
971
964
ppgtt -> vm .allocate_va_range = gen8_ppgtt_alloc ;
972
965
ppgtt -> vm .clear_range = gen8_ppgtt_clear ;
973
966
ppgtt -> vm .foreach = gen8_ppgtt_foreach ;
967
+ ppgtt -> vm .cleanup = gen8_ppgtt_cleanup ;
974
968
975
- ppgtt -> vm .pte_encode = gen8_pte_encode ;
969
+ err = gen8_init_scratch (& ppgtt -> vm );
970
+ if (err )
971
+ goto err_put ;
972
+
973
+ pd = gen8_alloc_top_pd (& ppgtt -> vm );
974
+ if (IS_ERR (pd )) {
975
+ err = PTR_ERR (pd );
976
+ goto err_put ;
977
+ }
978
+ ppgtt -> pd = pd ;
979
+
980
+ if (!i915_vm_is_4lvl (& ppgtt -> vm )) {
981
+ err = gen8_preallocate_top_level_pdp (ppgtt );
982
+ if (err )
983
+ goto err_put ;
984
+ }
976
985
977
986
if (intel_vgpu_active (gt -> i915 ))
978
987
gen8_ppgtt_notify_vgt (ppgtt , true);
979
988
980
- ppgtt -> vm .cleanup = gen8_ppgtt_cleanup ;
981
-
982
989
return ppgtt ;
983
990
984
- err_free_pd :
985
- __gen8_ppgtt_cleanup (& ppgtt -> vm , ppgtt -> pd ,
986
- gen8_pd_top_count (& ppgtt -> vm ), ppgtt -> vm .top );
987
- err_free_scratch :
988
- free_scratch (& ppgtt -> vm );
989
- err_free :
990
- kfree (ppgtt );
991
+ err_put :
992
+ i915_vm_put (& ppgtt -> vm );
991
993
return ERR_PTR (err );
992
994
}
0 commit comments