@@ -196,7 +196,10 @@ static void gen8_ppgtt_cleanup(struct i915_address_space *vm)
196196 if (intel_vgpu_active (vm -> i915 ))
197197 gen8_ppgtt_notify_vgt (ppgtt , false);
198198
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+
200203 free_scratch (vm );
201204}
202205
@@ -803,8 +806,10 @@ static int gen8_init_scratch(struct i915_address_space *vm)
803806 struct drm_i915_gem_object * obj ;
804807
805808 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 );
807811 goto free_scratch ;
812+ }
808813
809814 ret = map_pt_dma (vm , obj );
810815 if (ret ) {
@@ -823,7 +828,8 @@ static int gen8_init_scratch(struct i915_address_space *vm)
823828free_scratch :
824829 while (i -- )
825830 i915_gem_object_put (vm -> scratch [i ]);
826- return - ENOMEM ;
831+ vm -> scratch [0 ] = NULL ;
832+ return ret ;
827833}
828834
829835static int gen8_preallocate_top_level_pdp (struct i915_ppgtt * ppgtt )
@@ -901,6 +907,7 @@ gen8_alloc_top_pd(struct i915_address_space *vm)
901907struct i915_ppgtt * gen8_ppgtt_create (struct intel_gt * gt ,
902908 unsigned long lmem_pt_obj_flags )
903909{
910+ struct i915_page_directory * pd ;
904911 struct i915_ppgtt * ppgtt ;
905912 int err ;
906913
@@ -946,21 +953,7 @@ struct i915_ppgtt *gen8_ppgtt_create(struct intel_gt *gt,
946953 ppgtt -> vm .alloc_scratch_dma = alloc_pt_dma ;
947954 }
948955
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 ;
964957
965958 ppgtt -> vm .bind_async_flags = I915_VMA_LOCAL_BIND ;
966959 ppgtt -> vm .insert_entries = gen8_ppgtt_insert ;
@@ -971,22 +964,31 @@ struct i915_ppgtt *gen8_ppgtt_create(struct intel_gt *gt,
971964 ppgtt -> vm .allocate_va_range = gen8_ppgtt_alloc ;
972965 ppgtt -> vm .clear_range = gen8_ppgtt_clear ;
973966 ppgtt -> vm .foreach = gen8_ppgtt_foreach ;
967+ ppgtt -> vm .cleanup = gen8_ppgtt_cleanup ;
974968
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+ }
976985
977986 if (intel_vgpu_active (gt -> i915 ))
978987 gen8_ppgtt_notify_vgt (ppgtt , true);
979988
980- ppgtt -> vm .cleanup = gen8_ppgtt_cleanup ;
981-
982989 return ppgtt ;
983990
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 );
991993 return ERR_PTR (err );
992994}
0 commit comments