drm/i915: make local-memory probing a GT operation
authorMatthew Auld <matthew.auld@intel.com>
Wed, 27 Jan 2021 13:14:10 +0000 (13:14 +0000)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Wed, 24 Mar 2021 18:30:36 +0000 (19:30 +0100)
Device local memory is very much a GT thing, therefore it should be the
responsibility of the GT to setup the device local memory region.

Suggested-by: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
Signed-off-by: Matthew Auld <matthew.auld@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20210127131417.393872-1-matthew.auld@intel.com
[danvet: Rebase conflict.]
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/gt/intel_gt.c
drivers/gpu/drm/i915/gt/intel_gt.h
drivers/gpu/drm/i915/gt/intel_region_lmem.c
drivers/gpu/drm/i915/gt/intel_region_lmem.h
drivers/gpu/drm/i915/i915_drv.c
drivers/gpu/drm/i915/intel_memory_region.c

index d8e1ab4..edbee99 100644 (file)
@@ -39,6 +39,38 @@ void intel_gt_init_early(struct intel_gt *gt, struct drm_i915_private *i915)
        intel_uc_init_early(&gt->uc);
 }
 
+int intel_gt_probe_lmem(struct intel_gt *gt)
+{
+       struct drm_i915_private *i915 = gt->i915;
+       struct intel_memory_region *mem;
+       int id;
+       int err;
+
+       mem = intel_gt_setup_fake_lmem(gt);
+       if (IS_ERR(mem)) {
+               err = PTR_ERR(mem);
+               if (err == -ENODEV)
+                       return 0;
+
+               drm_err(&i915->drm,
+                       "Failed to setup region(%d) type=%d\n",
+                       err, INTEL_MEMORY_LOCAL);
+               return err;
+       }
+
+       id = INTEL_REGION_LMEM;
+
+       mem->id = id;
+       mem->type = INTEL_MEMORY_LOCAL;
+       mem->instance = 0;
+
+       GEM_BUG_ON(!HAS_REGION(i915, id));
+       GEM_BUG_ON(i915->mm.regions[id]);
+       i915->mm.regions[id] = mem;
+
+       return 0;
+}
+
 void intel_gt_init_hw_early(struct intel_gt *gt, struct i915_ggtt *ggtt)
 {
        gt->ggtt = ggtt;
index 9157c74..a17bd8b 100644 (file)
@@ -36,6 +36,7 @@ static inline struct intel_gt *huc_to_gt(struct intel_huc *huc)
 
 void intel_gt_init_early(struct intel_gt *gt, struct drm_i915_private *i915);
 void intel_gt_init_hw_early(struct intel_gt *gt, struct i915_ggtt *ggtt);
+int intel_gt_probe_lmem(struct intel_gt *gt);
 int intel_gt_init_mmio(struct intel_gt *gt);
 int __must_check intel_gt_init_hw(struct intel_gt *gt);
 int intel_gt_init(struct intel_gt *gt);
index 08bcb15..86f5dca 100644 (file)
@@ -102,16 +102,22 @@ static const struct intel_memory_region_ops intel_region_lmem_ops = {
 };
 
 struct intel_memory_region *
-intel_setup_fake_lmem(struct drm_i915_private *i915)
+intel_gt_setup_fake_lmem(struct intel_gt *gt)
 {
+       struct drm_i915_private *i915 = gt->i915;
        struct pci_dev *pdev = to_pci_dev(i915->drm.dev);
        struct intel_memory_region *mem;
        resource_size_t mappable_end;
        resource_size_t io_start;
        resource_size_t start;
 
+       if (!HAS_LMEM(i915))
+               return ERR_PTR(-ENODEV);
+
+       if (!i915->params.fake_lmem_start)
+               return ERR_PTR(-ENODEV);
+
        GEM_BUG_ON(i915_ggtt_has_aperture(&i915->ggtt));
-       GEM_BUG_ON(!i915->params.fake_lmem_start);
 
        /* Your mappable aperture belongs to me now! */
        mappable_end = pci_resource_len(pdev, 2);
index 8ea43e5..a4baa0f 100644 (file)
@@ -6,9 +6,9 @@
 #ifndef __INTEL_REGION_LMEM_H
 #define __INTEL_REGION_LMEM_H
 
-struct drm_i915_private;
+struct intel_gt;
 
 struct intel_memory_region *
-intel_setup_fake_lmem(struct drm_i915_private *i915);
+intel_gt_setup_fake_lmem(struct intel_gt *gt);
 
 #endif /* !__INTEL_REGION_LMEM_H */
index 43ac738..a32d847 100644 (file)
@@ -566,6 +566,10 @@ static int i915_driver_hw_probe(struct drm_i915_private *dev_priv)
 
        intel_gt_init_hw_early(&dev_priv->gt, &dev_priv->ggtt);
 
+       ret = intel_gt_probe_lmem(&dev_priv->gt);
+       if (ret)
+               goto err_mem_regions;
+
        ret = i915_ggtt_enable_hw(dev_priv);
        if (ret) {
                drm_err(&dev_priv->drm, "failed to enable GGTT\n");
index 1bfcdd8..b1b610b 100644 (file)
@@ -258,9 +258,8 @@ int intel_memory_regions_hw_probe(struct drm_i915_private *i915)
                case INTEL_MEMORY_STOLEN:
                        mem = i915_gem_stolen_setup(i915);
                        break;
-               case INTEL_MEMORY_LOCAL:
-                       mem = intel_setup_fake_lmem(i915);
-                       break;
+               default:
+                       continue;
                }
 
                if (IS_ERR(mem)) {