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

drm/i915: Sanitycheck PCI BARs

For proper operation of i915 we need usable PCI GTTMMADDR BAR 0
(1 for GEN2). In most cases we also need usable PCI GFXMEM BAR 2.
Let's add functions to check if BARs are set, and that it have
a size greater than 0.
In case GTTMMADDR BAR, let's validate at the beginning of i915
initialization.
For other BARs, let's validate before first use.

Signed-off-by: Piotr Piórkowski <piotr.piorkowski@intel.com>
Cc: Jani Nikula <jani.nikula@linux.intel.com>
Cc: Lucas De Marchi <lucas.demarchi@intel.com>
Cc: Matt Roper <matthew.d.roper@intel.com>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220805155959.1983584-3-piotr.piorkowski@intel.com

authored by

Piotr Piórkowski and committed by
Jani Nikula
1bba7323 6bba2b30

+46
+4
drivers/gpu/drm/i915/gem/i915_gem_stolen.c
··· 18 18 #include "gt/intel_region_lmem.h" 19 19 #include "i915_drv.h" 20 20 #include "i915_gem_stolen.h" 21 + #include "i915_pci.h" 21 22 #include "i915_reg.h" 22 23 #include "i915_utils.h" 23 24 #include "i915_vgpu.h" ··· 828 827 829 828 if (WARN_ON_ONCE(instance)) 830 829 return ERR_PTR(-ENODEV); 830 + 831 + if (!i915_pci_resource_valid(pdev, GEN12_LMEM_BAR)) 832 + return ERR_PTR(-ENXIO); 831 833 832 834 /* Use DSM base address instead for stolen memory */ 833 835 dsm_base = intel_uncore_read64(uncore, GEN12_DSMBASE);
+7
drivers/gpu/drm/i915/gt/intel_ggtt.c
··· 18 18 #include "intel_gt_regs.h" 19 19 #include "intel_pci_config.h" 20 20 #include "i915_drv.h" 21 + #include "i915_pci.h" 21 22 #include "i915_scatterlist.h" 22 23 #include "i915_utils.h" 23 24 #include "i915_vgpu.h" ··· 932 931 u16 snb_gmch_ctl; 933 932 934 933 if (!HAS_LMEM(i915)) { 934 + if (!i915_pci_resource_valid(pdev, GTT_APERTURE_BAR)) 935 + return -ENXIO; 936 + 935 937 ggtt->gmadr = pci_resource(pdev, GTT_APERTURE_BAR); 936 938 ggtt->mappable_end = resource_size(&ggtt->gmadr); 937 939 } ··· 1088 1084 struct pci_dev *pdev = to_pci_dev(i915->drm.dev); 1089 1085 unsigned int size; 1090 1086 u16 snb_gmch_ctl; 1087 + 1088 + if (!i915_pci_resource_valid(pdev, GTT_APERTURE_BAR)) 1089 + return -ENXIO; 1091 1090 1092 1091 ggtt->gmadr = pci_resource(pdev, GTT_APERTURE_BAR); 1093 1092 ggtt->mappable_end = resource_size(&ggtt->gmadr);
+4
drivers/gpu/drm/i915/gt/intel_region_lmem.c
··· 4 4 */ 5 5 6 6 #include "i915_drv.h" 7 + #include "i915_pci.h" 7 8 #include "i915_reg.h" 8 9 #include "intel_memory_region.h" 9 10 #include "intel_pci_config.h" ··· 197 196 198 197 if (!IS_DGFX(i915)) 199 198 return ERR_PTR(-ENODEV); 199 + 200 + if (!i915_pci_resource_valid(pdev, GEN12_LMEM_BAR)) 201 + return ERR_PTR(-ENXIO); 200 202 201 203 if (HAS_FLAT_CCS(i915)) { 202 204 resource_size_t lmem_range;
+25
drivers/gpu/drm/i915/i915_pci.c
··· 30 30 #include "i915_drv.h" 31 31 #include "i915_pci.h" 32 32 #include "i915_reg.h" 33 + #include "intel_pci_config.h" 33 34 34 35 #define PLATFORM(x) .platform = (x) 35 36 #define GEN(x) \ ··· 1263 1262 return ret; 1264 1263 } 1265 1264 1265 + bool i915_pci_resource_valid(struct pci_dev *pdev, int bar) 1266 + { 1267 + if (!pci_resource_flags(pdev, bar)) 1268 + return false; 1269 + 1270 + if (pci_resource_flags(pdev, bar) & IORESOURCE_UNSET) 1271 + return false; 1272 + 1273 + if (!pci_resource_len(pdev, bar)) 1274 + return false; 1275 + 1276 + return true; 1277 + } 1278 + 1279 + static bool intel_mmio_bar_valid(struct pci_dev *pdev, struct intel_device_info *intel_info) 1280 + { 1281 + int gttmmaddr_bar = intel_info->graphics.ver == 2 ? GEN2_GTTMMADR_BAR : GTTMMADR_BAR; 1282 + 1283 + return i915_pci_resource_valid(pdev, gttmmaddr_bar); 1284 + } 1285 + 1266 1286 static int i915_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) 1267 1287 { 1268 1288 struct intel_device_info *intel_info = ··· 1308 1286 */ 1309 1287 if (PCI_FUNC(pdev->devfn)) 1310 1288 return -ENODEV; 1289 + 1290 + if (!intel_mmio_bar_valid(pdev, intel_info)) 1291 + return -ENXIO; 1311 1292 1312 1293 /* Detect if we need to wait for other drivers early on */ 1313 1294 if (intel_modeset_probe_defer(pdev))
+6
drivers/gpu/drm/i915/i915_pci.h
··· 6 6 #ifndef __I915_PCI_H__ 7 7 #define __I915_PCI_H__ 8 8 9 + #include <linux/types.h> 10 + 11 + struct pci_dev; 12 + 9 13 int i915_pci_register_driver(void); 10 14 void i915_pci_unregister_driver(void); 15 + 16 + bool i915_pci_resource_valid(struct pci_dev *pdev, int bar); 11 17 12 18 #endif /* __I915_PCI_H__ */