Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/i915: make local-memory probing a GT operation

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>

authored by

Matthew Auld and committed by
Daniel Vetter
2dfcc7f4 2913fa4d

+49 -7
+32
drivers/gpu/drm/i915/gt/intel_gt.c
··· 39 39 intel_uc_init_early(&gt->uc); 40 40 } 41 41 42 + int intel_gt_probe_lmem(struct intel_gt *gt) 43 + { 44 + struct drm_i915_private *i915 = gt->i915; 45 + struct intel_memory_region *mem; 46 + int id; 47 + int err; 48 + 49 + mem = intel_gt_setup_fake_lmem(gt); 50 + if (IS_ERR(mem)) { 51 + err = PTR_ERR(mem); 52 + if (err == -ENODEV) 53 + return 0; 54 + 55 + drm_err(&i915->drm, 56 + "Failed to setup region(%d) type=%d\n", 57 + err, INTEL_MEMORY_LOCAL); 58 + return err; 59 + } 60 + 61 + id = INTEL_REGION_LMEM; 62 + 63 + mem->id = id; 64 + mem->type = INTEL_MEMORY_LOCAL; 65 + mem->instance = 0; 66 + 67 + GEM_BUG_ON(!HAS_REGION(i915, id)); 68 + GEM_BUG_ON(i915->mm.regions[id]); 69 + i915->mm.regions[id] = mem; 70 + 71 + return 0; 72 + } 73 + 42 74 void intel_gt_init_hw_early(struct intel_gt *gt, struct i915_ggtt *ggtt) 43 75 { 44 76 gt->ggtt = ggtt;
+1
drivers/gpu/drm/i915/gt/intel_gt.h
··· 36 36 37 37 void intel_gt_init_early(struct intel_gt *gt, struct drm_i915_private *i915); 38 38 void intel_gt_init_hw_early(struct intel_gt *gt, struct i915_ggtt *ggtt); 39 + int intel_gt_probe_lmem(struct intel_gt *gt); 39 40 int intel_gt_init_mmio(struct intel_gt *gt); 40 41 int __must_check intel_gt_init_hw(struct intel_gt *gt); 41 42 int intel_gt_init(struct intel_gt *gt);
+8 -2
drivers/gpu/drm/i915/gt/intel_region_lmem.c
··· 102 102 }; 103 103 104 104 struct intel_memory_region * 105 - intel_setup_fake_lmem(struct drm_i915_private *i915) 105 + intel_gt_setup_fake_lmem(struct intel_gt *gt) 106 106 { 107 + struct drm_i915_private *i915 = gt->i915; 107 108 struct pci_dev *pdev = to_pci_dev(i915->drm.dev); 108 109 struct intel_memory_region *mem; 109 110 resource_size_t mappable_end; 110 111 resource_size_t io_start; 111 112 resource_size_t start; 112 113 114 + if (!HAS_LMEM(i915)) 115 + return ERR_PTR(-ENODEV); 116 + 117 + if (!i915->params.fake_lmem_start) 118 + return ERR_PTR(-ENODEV); 119 + 113 120 GEM_BUG_ON(i915_ggtt_has_aperture(&i915->ggtt)); 114 - GEM_BUG_ON(!i915->params.fake_lmem_start); 115 121 116 122 /* Your mappable aperture belongs to me now! */ 117 123 mappable_end = pci_resource_len(pdev, 2);
+2 -2
drivers/gpu/drm/i915/gt/intel_region_lmem.h
··· 6 6 #ifndef __INTEL_REGION_LMEM_H 7 7 #define __INTEL_REGION_LMEM_H 8 8 9 - struct drm_i915_private; 9 + struct intel_gt; 10 10 11 11 struct intel_memory_region * 12 - intel_setup_fake_lmem(struct drm_i915_private *i915); 12 + intel_gt_setup_fake_lmem(struct intel_gt *gt); 13 13 14 14 #endif /* !__INTEL_REGION_LMEM_H */
+4
drivers/gpu/drm/i915/i915_drv.c
··· 566 566 567 567 intel_gt_init_hw_early(&dev_priv->gt, &dev_priv->ggtt); 568 568 569 + ret = intel_gt_probe_lmem(&dev_priv->gt); 570 + if (ret) 571 + goto err_mem_regions; 572 + 569 573 ret = i915_ggtt_enable_hw(dev_priv); 570 574 if (ret) { 571 575 drm_err(&dev_priv->drm, "failed to enable GGTT\n");
+2 -3
drivers/gpu/drm/i915/intel_memory_region.c
··· 258 258 case INTEL_MEMORY_STOLEN: 259 259 mem = i915_gem_stolen_setup(i915); 260 260 break; 261 - case INTEL_MEMORY_LOCAL: 262 - mem = intel_setup_fake_lmem(i915); 263 - break; 261 + default: 262 + continue; 264 263 } 265 264 266 265 if (IS_ERR(mem)) {