summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Auld <matthew.auld@intel.com>2017-12-11 10:18:18 -0500
committerJoonas Lahtinen <joonas.lahtinen@linux.intel.com>2017-12-12 05:30:19 -0500
commit7789422665f59982743a32a7728a448c9ddd4003 (patch)
tree1f12d60f01e0295e47e0c7ac819d043a468cc04a
parentf773568b6ff8c31fce165d177a968f2ae31d10bb (diff)
drm/i915: make dsm struct resource centric
Now that we are using struct resource to track the stolen region, it is more convenient if we track dsm in a resource as well. v2: check range_overflow when writing to 32b registers (Chris) pepper in some comments (Chris) v3: refit i915_stolen_to_dma() v4: kill ggtt->stolen_size v5: some more polish Signed-off-by: Matthew Auld <matthew.auld@intel.com> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Cc: Chris Wilson <chris@chris-wilson.co.uk> Cc: Paulo Zanoni <paulo.r.zanoni@intel.com> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20171211151822.20953-6-matthew.auld@intel.com
-rw-r--r--drivers/char/agp/intel-gtt.c2
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h12
-rw-r--r--drivers/gpu/drm/i915/i915_gem_gtt.c8
-rw-r--r--drivers/gpu/drm/i915/i915_gem_gtt.h1
-rw-r--r--drivers/gpu/drm/i915/i915_gem_stolen.c125
-rw-r--r--drivers/gpu/drm/i915/intel_fbc.c13
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c15
-rw-r--r--include/drm/intel-gtt.h1
8 files changed, 89 insertions, 88 deletions
diff --git a/drivers/char/agp/intel-gtt.c b/drivers/char/agp/intel-gtt.c
index dde7caac7f9f..0c86b4dfd59c 100644
--- a/drivers/char/agp/intel-gtt.c
+++ b/drivers/char/agp/intel-gtt.c
@@ -1424,12 +1424,10 @@ int intel_gmch_probe(struct pci_dev *bridge_pdev, struct pci_dev *gpu_pdev,
1424EXPORT_SYMBOL(intel_gmch_probe); 1424EXPORT_SYMBOL(intel_gmch_probe);
1425 1425
1426void intel_gtt_get(u64 *gtt_total, 1426void intel_gtt_get(u64 *gtt_total,
1427 u32 *stolen_size,
1428 phys_addr_t *mappable_base, 1427 phys_addr_t *mappable_base,
1429 u64 *mappable_end) 1428 u64 *mappable_end)
1430{ 1429{
1431 *gtt_total = intel_private.gtt_total_entries << PAGE_SHIFT; 1430 *gtt_total = intel_private.gtt_total_entries << PAGE_SHIFT;
1432 *stolen_size = intel_private.stolen_size;
1433 *mappable_base = intel_private.gma_bus_addr; 1431 *mappable_base = intel_private.gma_bus_addr;
1434 *mappable_end = intel_private.gtt_mappable_entries << PAGE_SHIFT; 1432 *mappable_end = intel_private.gtt_mappable_entries << PAGE_SHIFT;
1435} 1433}
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index d57859cfad8e..1677b7e0d671 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1538,9 +1538,6 @@ struct i915_gem_mm {
1538 */ 1538 */
1539 struct pagevec wc_stash; 1539 struct pagevec wc_stash;
1540 1540
1541 /** Usable portion of the GTT for GEM */
1542 dma_addr_t stolen_base; /* limited to low memory (32-bit) */
1543
1544 /** 1541 /**
1545 * tmpfs instance used for shmem backed objects 1542 * tmpfs instance used for shmem backed objects
1546 */ 1543 */
@@ -2254,6 +2251,15 @@ struct drm_i915_private {
2254 2251
2255 const struct intel_device_info info; 2252 const struct intel_device_info info;
2256 2253
2254 /**
2255 * Data Stolen Memory - aka "i915 stolen memory" gives us the start and
2256 * end of stolen which we can optionally use to create GEM objects
2257 * backed by stolen memory. Note that ggtt->stolen_usable_size tells us
2258 * exactly how much of this we are actually allowed to use, given that
2259 * some portion of it is in fact reserved for use by hardware functions.
2260 */
2261 struct resource dsm;
2262
2257 void __iomem *regs; 2263 void __iomem *regs;
2258 2264
2259 struct intel_uncore uncore; 2265 struct intel_uncore uncore;
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
index c1b8b1c8401e..7a5302318d31 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
@@ -3299,8 +3299,6 @@ static int gen8_gmch_probe(struct i915_ggtt *ggtt)
3299 3299
3300 pci_read_config_word(pdev, SNB_GMCH_CTRL, &snb_gmch_ctl); 3300 pci_read_config_word(pdev, SNB_GMCH_CTRL, &snb_gmch_ctl);
3301 3301
3302 ggtt->stolen_size = resource_size(&intel_graphics_stolen_res);
3303
3304 if (INTEL_GEN(dev_priv) >= 9) { 3302 if (INTEL_GEN(dev_priv) >= 9) {
3305 size = gen8_get_total_gtt_size(snb_gmch_ctl); 3303 size = gen8_get_total_gtt_size(snb_gmch_ctl);
3306 } else if (IS_CHERRYVIEW(dev_priv)) { 3304 } else if (IS_CHERRYVIEW(dev_priv)) {
@@ -3363,8 +3361,6 @@ static int gen6_gmch_probe(struct i915_ggtt *ggtt)
3363 DRM_ERROR("Can't set DMA mask/consistent mask (%d)\n", err); 3361 DRM_ERROR("Can't set DMA mask/consistent mask (%d)\n", err);
3364 pci_read_config_word(pdev, SNB_GMCH_CTRL, &snb_gmch_ctl); 3362 pci_read_config_word(pdev, SNB_GMCH_CTRL, &snb_gmch_ctl);
3365 3363
3366 ggtt->stolen_size = resource_size(&intel_graphics_stolen_res);
3367
3368 size = gen6_get_total_gtt_size(snb_gmch_ctl); 3364 size = gen6_get_total_gtt_size(snb_gmch_ctl);
3369 ggtt->base.total = (size / sizeof(gen6_pte_t)) << PAGE_SHIFT; 3365 ggtt->base.total = (size / sizeof(gen6_pte_t)) << PAGE_SHIFT;
3370 3366
@@ -3410,7 +3406,6 @@ static int i915_gmch_probe(struct i915_ggtt *ggtt)
3410 } 3406 }
3411 3407
3412 intel_gtt_get(&ggtt->base.total, 3408 intel_gtt_get(&ggtt->base.total,
3413 &ggtt->stolen_size,
3414 &ggtt->mappable_base, 3409 &ggtt->mappable_base,
3415 &ggtt->mappable_end); 3410 &ggtt->mappable_end);
3416 3411
@@ -3482,7 +3477,8 @@ int i915_ggtt_probe_hw(struct drm_i915_private *dev_priv)
3482 DRM_INFO("Memory usable by graphics device = %lluM\n", 3477 DRM_INFO("Memory usable by graphics device = %lluM\n",
3483 ggtt->base.total >> 20); 3478 ggtt->base.total >> 20);
3484 DRM_DEBUG_DRIVER("GMADR size = %lldM\n", ggtt->mappable_end >> 20); 3479 DRM_DEBUG_DRIVER("GMADR size = %lldM\n", ggtt->mappable_end >> 20);
3485 DRM_DEBUG_DRIVER("GTT stolen size = %uM\n", ggtt->stolen_size >> 20); 3480 DRM_DEBUG_DRIVER("GTT stolen size = %lluM\n",
3481 (u64)resource_size(&intel_graphics_stolen_res) >> 20);
3486 if (intel_vtd_active()) 3482 if (intel_vtd_active())
3487 DRM_INFO("VT-d active for gfx access\n"); 3483 DRM_INFO("VT-d active for gfx access\n");
3488 3484
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.h b/drivers/gpu/drm/i915/i915_gem_gtt.h
index 93211a96fdad..30a2920b1291 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.h
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.h
@@ -381,7 +381,6 @@ struct i915_ggtt {
381 * avoid the first page! The upper end of stolen memory is reserved for 381 * avoid the first page! The upper end of stolen memory is reserved for
382 * hardware functions and similarly removed from the accessible range. 382 * hardware functions and similarly removed from the accessible range.
383 */ 383 */
384 u32 stolen_size; /* Total size of stolen memory */
385 u32 stolen_usable_size; /* Total size minus reserved ranges */ 384 u32 stolen_usable_size; /* Total size minus reserved ranges */
386 u32 stolen_reserved_base; 385 u32 stolen_reserved_base;
387 u32 stolen_reserved_size; 386 u32 stolen_reserved_size;
diff --git a/drivers/gpu/drm/i915/i915_gem_stolen.c b/drivers/gpu/drm/i915/i915_gem_stolen.c
index f8ac1438c35d..5b5558fe70cc 100644
--- a/drivers/gpu/drm/i915/i915_gem_stolen.c
+++ b/drivers/gpu/drm/i915/i915_gem_stolen.c
@@ -76,27 +76,26 @@ void i915_gem_stolen_remove_node(struct drm_i915_private *dev_priv,
76 mutex_unlock(&dev_priv->mm.stolen_lock); 76 mutex_unlock(&dev_priv->mm.stolen_lock);
77} 77}
78 78
79static dma_addr_t i915_stolen_to_dma(struct drm_i915_private *dev_priv) 79static int i915_adjust_stolen(struct drm_i915_private *dev_priv,
80 struct resource *dsm)
80{ 81{
81 struct i915_ggtt *ggtt = &dev_priv->ggtt; 82 struct i915_ggtt *ggtt = &dev_priv->ggtt;
82 dma_addr_t base = intel_graphics_stolen_res.start;
83 struct resource *r; 83 struct resource *r;
84 84
85 GEM_BUG_ON(overflows_type(intel_graphics_stolen_res.start, base)); 85 if (dsm->start == 0 || dsm->end <= dsm->start)
86 return -EINVAL;
86 87
87 if (base == 0 || add_overflows(base, ggtt->stolen_size)) 88 /*
88 return 0; 89 * TODO: We have yet too encounter the case where the GTT wasn't at the
90 * end of stolen. With that assumption we could simplify this.
91 */
89 92
90 /* make sure we don't clobber the GTT if it's within stolen memory */ 93 /* Make sure we don't clobber the GTT if it's within stolen memory */
91 if (INTEL_GEN(dev_priv) <= 4 && 94 if (INTEL_GEN(dev_priv) <= 4 &&
92 !IS_G33(dev_priv) && !IS_PINEVIEW(dev_priv) && !IS_G4X(dev_priv)) { 95 !IS_G33(dev_priv) && !IS_PINEVIEW(dev_priv) && !IS_G4X(dev_priv)) {
93 struct { 96 struct resource stolen[2] = {*dsm, *dsm};
94 dma_addr_t start, end; 97 struct resource ggtt_res;
95 } stolen[2] = { 98 u64 ggtt_start;
96 { .start = base, .end = base + ggtt->stolen_size, },
97 { .start = base, .end = base + ggtt->stolen_size, },
98 };
99 u64 ggtt_start, ggtt_end;
100 99
101 ggtt_start = I915_READ(PGTBL_CTL); 100 ggtt_start = I915_READ(PGTBL_CTL);
102 if (IS_GEN4(dev_priv)) 101 if (IS_GEN4(dev_priv))
@@ -104,70 +103,64 @@ static dma_addr_t i915_stolen_to_dma(struct drm_i915_private *dev_priv)
104 (ggtt_start & PGTBL_ADDRESS_HI_MASK) << 28; 103 (ggtt_start & PGTBL_ADDRESS_HI_MASK) << 28;
105 else 104 else
106 ggtt_start &= PGTBL_ADDRESS_LO_MASK; 105 ggtt_start &= PGTBL_ADDRESS_LO_MASK;
107 ggtt_end = ggtt_start + ggtt_total_entries(ggtt) * 4; 106
108 107 ggtt_res =
109 if (ggtt_start >= stolen[0].start && ggtt_start < stolen[0].end) 108 (struct resource) DEFINE_RES_MEM(ggtt_start,
110 stolen[0].end = ggtt_start; 109 ggtt_total_entries(ggtt) * 4);
111 if (ggtt_end > stolen[1].start && ggtt_end <= stolen[1].end) 110
112 stolen[1].start = ggtt_end; 111 if (ggtt_res.start >= stolen[0].start && ggtt_res.start < stolen[0].end)
113 112 stolen[0].end = ggtt_res.start;
114 /* pick the larger of the two chunks */ 113 if (ggtt_res.end > stolen[1].start && ggtt_res.end <= stolen[1].end)
115 if (stolen[0].end - stolen[0].start > 114 stolen[1].start = ggtt_res.end;
116 stolen[1].end - stolen[1].start) { 115
117 base = stolen[0].start; 116 /* Pick the larger of the two chunks */
118 ggtt->stolen_size = stolen[0].end - stolen[0].start; 117 if (resource_size(&stolen[0]) > resource_size(&stolen[1]))
119 } else { 118 *dsm = stolen[0];
120 base = stolen[1].start; 119 else
121 ggtt->stolen_size = stolen[1].end - stolen[1].start; 120 *dsm = stolen[1];
122 }
123 121
124 if (stolen[0].start != stolen[1].start || 122 if (stolen[0].start != stolen[1].start ||
125 stolen[0].end != stolen[1].end) { 123 stolen[0].end != stolen[1].end) {
126 dma_addr_t end = base + ggtt->stolen_size - 1; 124 DRM_DEBUG_KMS("GTT within stolen memory at %pR\n", &ggtt_res);
127 125 DRM_DEBUG_KMS("Stolen memory adjusted to %pR\n", dsm);
128 DRM_DEBUG_KMS("GTT within stolen memory at 0x%llx-0x%llx\n",
129 (unsigned long long)ggtt_start,
130 (unsigned long long)ggtt_end - 1);
131 DRM_DEBUG_KMS("Stolen memory adjusted to %pad - %pad\n",
132 &base, &end);
133 } 126 }
134 } 127 }
135 128
136 129 /*
137 /* Verify that nothing else uses this physical address. Stolen 130 * Verify that nothing else uses this physical address. Stolen
138 * memory should be reserved by the BIOS and hidden from the 131 * memory should be reserved by the BIOS and hidden from the
139 * kernel. So if the region is already marked as busy, something 132 * kernel. So if the region is already marked as busy, something
140 * is seriously wrong. 133 * is seriously wrong.
141 */ 134 */
142 r = devm_request_mem_region(dev_priv->drm.dev, base, ggtt->stolen_size, 135 r = devm_request_mem_region(dev_priv->drm.dev, dsm->start,
136 resource_size(dsm),
143 "Graphics Stolen Memory"); 137 "Graphics Stolen Memory");
144 if (r == NULL) { 138 if (r == NULL) {
145 /* 139 /*
146 * One more attempt but this time requesting region from 140 * One more attempt but this time requesting region from
147 * base + 1, as we have seen that this resolves the region 141 * start + 1, as we have seen that this resolves the region
148 * conflict with the PCI Bus. 142 * conflict with the PCI Bus.
149 * This is a BIOS w/a: Some BIOS wrap stolen in the root 143 * This is a BIOS w/a: Some BIOS wrap stolen in the root
150 * PCI bus, but have an off-by-one error. Hence retry the 144 * PCI bus, but have an off-by-one error. Hence retry the
151 * reservation starting from 1 instead of 0. 145 * reservation starting from 1 instead of 0.
152 * There's also BIOS with off-by-one on the other end. 146 * There's also BIOS with off-by-one on the other end.
153 */ 147 */
154 r = devm_request_mem_region(dev_priv->drm.dev, base + 1, 148 r = devm_request_mem_region(dev_priv->drm.dev, dsm->start + 1,
155 ggtt->stolen_size - 2, 149 resource_size(dsm) - 2,
156 "Graphics Stolen Memory"); 150 "Graphics Stolen Memory");
157 /* 151 /*
158 * GEN3 firmware likes to smash pci bridges into the stolen 152 * GEN3 firmware likes to smash pci bridges into the stolen
159 * range. Apparently this works. 153 * range. Apparently this works.
160 */ 154 */
161 if (r == NULL && !IS_GEN3(dev_priv)) { 155 if (r == NULL && !IS_GEN3(dev_priv)) {
162 dma_addr_t end = base + ggtt->stolen_size; 156 DRM_ERROR("conflict detected with stolen region: %pR\n",
157 dsm);
163 158
164 DRM_ERROR("conflict detected with stolen region: [%pad - %pad]\n", 159 return -EBUSY;
165 &base, &end);
166 base = 0;
167 } 160 }
168 } 161 }
169 162
170 return base; 163 return 0;
171} 164}
172 165
173void i915_gem_cleanup_stolen(struct drm_device *dev) 166void i915_gem_cleanup_stolen(struct drm_device *dev)
@@ -183,11 +176,10 @@ void i915_gem_cleanup_stolen(struct drm_device *dev)
183static void g4x_get_stolen_reserved(struct drm_i915_private *dev_priv, 176static void g4x_get_stolen_reserved(struct drm_i915_private *dev_priv,
184 dma_addr_t *base, u32 *size) 177 dma_addr_t *base, u32 *size)
185{ 178{
186 struct i915_ggtt *ggtt = &dev_priv->ggtt;
187 uint32_t reg_val = I915_READ(IS_GM45(dev_priv) ? 179 uint32_t reg_val = I915_READ(IS_GM45(dev_priv) ?
188 CTG_STOLEN_RESERVED : 180 CTG_STOLEN_RESERVED :
189 ELK_STOLEN_RESERVED); 181 ELK_STOLEN_RESERVED);
190 dma_addr_t stolen_top = dev_priv->mm.stolen_base + ggtt->stolen_size; 182 dma_addr_t stolen_top = dev_priv->dsm.end + 1;
191 183
192 if ((reg_val & G4X_STOLEN_RESERVED_ENABLE) == 0) { 184 if ((reg_val & G4X_STOLEN_RESERVED_ENABLE) == 0) {
193 *base = 0; 185 *base = 0;
@@ -308,7 +300,6 @@ static void chv_get_stolen_reserved(struct drm_i915_private *dev_priv,
308static void bdw_get_stolen_reserved(struct drm_i915_private *dev_priv, 300static void bdw_get_stolen_reserved(struct drm_i915_private *dev_priv,
309 dma_addr_t *base, u32 *size) 301 dma_addr_t *base, u32 *size)
310{ 302{
311 struct i915_ggtt *ggtt = &dev_priv->ggtt;
312 uint32_t reg_val = I915_READ(GEN6_STOLEN_RESERVED); 303 uint32_t reg_val = I915_READ(GEN6_STOLEN_RESERVED);
313 dma_addr_t stolen_top; 304 dma_addr_t stolen_top;
314 305
@@ -318,7 +309,7 @@ static void bdw_get_stolen_reserved(struct drm_i915_private *dev_priv,
318 return; 309 return;
319 } 310 }
320 311
321 stolen_top = dev_priv->mm.stolen_base + ggtt->stolen_size; 312 stolen_top = dev_priv->dsm.end + 1;
322 313
323 *base = reg_val & GEN6_STOLEN_RESERVED_ADDR_MASK; 314 *base = reg_val & GEN6_STOLEN_RESERVED_ADDR_MASK;
324 315
@@ -351,14 +342,18 @@ int i915_gem_init_stolen(struct drm_i915_private *dev_priv)
351 return 0; 342 return 0;
352 } 343 }
353 344
354 if (ggtt->stolen_size == 0) 345 if (resource_size(&intel_graphics_stolen_res) == 0)
355 return 0; 346 return 0;
356 347
357 dev_priv->mm.stolen_base = i915_stolen_to_dma(dev_priv); 348 dev_priv->dsm = intel_graphics_stolen_res;
358 if (dev_priv->mm.stolen_base == 0) 349
350 if (i915_adjust_stolen(dev_priv, &dev_priv->dsm))
359 return 0; 351 return 0;
360 352
361 stolen_top = dev_priv->mm.stolen_base + ggtt->stolen_size; 353 GEM_BUG_ON(dev_priv->dsm.start == 0);
354 GEM_BUG_ON(dev_priv->dsm.end <= dev_priv->dsm.start);
355
356 stolen_top = dev_priv->dsm.end + 1;
362 reserved_base = 0; 357 reserved_base = 0;
363 reserved_size = 0; 358 reserved_size = 0;
364 359
@@ -399,12 +394,11 @@ int i915_gem_init_stolen(struct drm_i915_private *dev_priv)
399 reserved_base = stolen_top; 394 reserved_base = stolen_top;
400 } 395 }
401 396
402 if (reserved_base < dev_priv->mm.stolen_base || 397 if (reserved_base < dev_priv->dsm.start ||
403 reserved_base + reserved_size > stolen_top) { 398 reserved_base + reserved_size > stolen_top) {
404 dma_addr_t reserved_top = reserved_base + reserved_size; 399 dma_addr_t reserved_top = reserved_base + reserved_size;
405 DRM_ERROR("Stolen reserved area [%pad - %pad] outside stolen memory [%pad - %pad]\n", 400 DRM_ERROR("Stolen reserved area [%pad - %pad] outside stolen memory %pR\n",
406 &reserved_base, &reserved_top, 401 &reserved_base, &reserved_top, &dev_priv->dsm);
407 &dev_priv->mm.stolen_base, &stolen_top);
408 return 0; 402 return 0;
409 } 403 }
410 404
@@ -415,9 +409,9 @@ int i915_gem_init_stolen(struct drm_i915_private *dev_priv)
415 * memory, so just consider the start. */ 409 * memory, so just consider the start. */
416 reserved_total = stolen_top - reserved_base; 410 reserved_total = stolen_top - reserved_base;
417 411
418 DRM_DEBUG_KMS("Memory reserved for graphics device: %uK, usable: %uK\n", 412 DRM_DEBUG_KMS("Memory reserved for graphics device: %lluK, usable: %lluK\n",
419 ggtt->stolen_size >> 10, 413 (u64)resource_size(&dev_priv->dsm) >> 10,
420 (ggtt->stolen_size - reserved_total) >> 10); 414 ((u64)resource_size(&dev_priv->dsm) - reserved_total) >> 10);
421 415
422 stolen_usable_start = 0; 416 stolen_usable_start = 0;
423 /* WaSkipStolenMemoryFirstPage:bdw+ */ 417 /* WaSkipStolenMemoryFirstPage:bdw+ */
@@ -425,7 +419,7 @@ int i915_gem_init_stolen(struct drm_i915_private *dev_priv)
425 stolen_usable_start = 4096; 419 stolen_usable_start = 4096;
426 420
427 ggtt->stolen_usable_size = 421 ggtt->stolen_usable_size =
428 ggtt->stolen_size - reserved_total - stolen_usable_start; 422 resource_size(&dev_priv->dsm) - reserved_total - stolen_usable_start;
429 423
430 /* Basic memrange allocator for stolen space. */ 424 /* Basic memrange allocator for stolen space. */
431 drm_mm_init(&dev_priv->mm.stolen, stolen_usable_start, 425 drm_mm_init(&dev_priv->mm.stolen, stolen_usable_start,
@@ -442,7 +436,8 @@ i915_pages_create_for_stolen(struct drm_device *dev,
442 struct sg_table *st; 436 struct sg_table *st;
443 struct scatterlist *sg; 437 struct scatterlist *sg;
444 438
445 GEM_BUG_ON(range_overflows(offset, size, dev_priv->ggtt.stolen_size)); 439 GEM_BUG_ON(range_overflows_t(resource_size_t, offset, size,
440 resource_size(&dev_priv->dsm)));
446 441
447 /* We hide that we have no struct page backing our stolen object 442 /* We hide that we have no struct page backing our stolen object
448 * by wrapping the contiguous physical allocation with a fake 443 * by wrapping the contiguous physical allocation with a fake
@@ -462,7 +457,7 @@ i915_pages_create_for_stolen(struct drm_device *dev,
462 sg->offset = 0; 457 sg->offset = 0;
463 sg->length = size; 458 sg->length = size;
464 459
465 sg_dma_address(sg) = (dma_addr_t)dev_priv->mm.stolen_base + offset; 460 sg_dma_address(sg) = (dma_addr_t)dev_priv->dsm.start + offset;
466 sg_dma_len(sg) = size; 461 sg_dma_len(sg) = size;
467 462
468 return st; 463 return st;
diff --git a/drivers/gpu/drm/i915/intel_fbc.c b/drivers/gpu/drm/i915/intel_fbc.c
index 4aefc658a5cf..f88c1b5dae4c 100644
--- a/drivers/gpu/drm/i915/intel_fbc.c
+++ b/drivers/gpu/drm/i915/intel_fbc.c
@@ -531,7 +531,6 @@ static int find_compression_threshold(struct drm_i915_private *dev_priv,
531 int size, 531 int size,
532 int fb_cpp) 532 int fb_cpp)
533{ 533{
534 struct i915_ggtt *ggtt = &dev_priv->ggtt;
535 int compression_threshold = 1; 534 int compression_threshold = 1;
536 int ret; 535 int ret;
537 u64 end; 536 u64 end;
@@ -541,7 +540,7 @@ static int find_compression_threshold(struct drm_i915_private *dev_priv,
541 * If we enable FBC using a CFB on that memory range we'll get FIFO 540 * If we enable FBC using a CFB on that memory range we'll get FIFO
542 * underruns, even if that range is not reserved by the BIOS. */ 541 * underruns, even if that range is not reserved by the BIOS. */
543 if (IS_BROADWELL(dev_priv) || IS_GEN9_BC(dev_priv)) 542 if (IS_BROADWELL(dev_priv) || IS_GEN9_BC(dev_priv))
544 end = ggtt->stolen_size - 8 * 1024 * 1024; 543 end = resource_size(&dev_priv->dsm) - 8 * 1024 * 1024;
545 else 544 else
546 end = U64_MAX; 545 end = U64_MAX;
547 546
@@ -615,10 +614,16 @@ static int intel_fbc_alloc_cfb(struct intel_crtc *crtc)
615 614
616 fbc->compressed_llb = compressed_llb; 615 fbc->compressed_llb = compressed_llb;
617 616
617 GEM_BUG_ON(range_overflows_t(u64, dev_priv->dsm.start,
618 fbc->compressed_fb.start,
619 U32_MAX));
620 GEM_BUG_ON(range_overflows_t(u64, dev_priv->dsm.start,
621 fbc->compressed_llb->start,
622 U32_MAX));
618 I915_WRITE(FBC_CFB_BASE, 623 I915_WRITE(FBC_CFB_BASE,
619 dev_priv->mm.stolen_base + fbc->compressed_fb.start); 624 dev_priv->dsm.start + fbc->compressed_fb.start);
620 I915_WRITE(FBC_LL_BASE, 625 I915_WRITE(FBC_LL_BASE,
621 dev_priv->mm.stolen_base + compressed_llb->start); 626 dev_priv->dsm.start + compressed_llb->start);
622 } 627 }
623 628
624 DRM_DEBUG_KMS("reserved %llu bytes of contiguous stolen space for FBC, threshold: %d\n", 629 DRM_DEBUG_KMS("reserved %llu bytes of contiguous stolen space for FBC, threshold: %d\n",
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 5836181d6f8a..79b3fd617de0 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -7020,7 +7020,7 @@ static void valleyview_check_pctx(struct drm_i915_private *dev_priv)
7020{ 7020{
7021 unsigned long pctx_addr = I915_READ(VLV_PCBR) & ~4095; 7021 unsigned long pctx_addr = I915_READ(VLV_PCBR) & ~4095;
7022 7022
7023 WARN_ON(pctx_addr != dev_priv->mm.stolen_base + 7023 WARN_ON(pctx_addr != dev_priv->dsm.start +
7024 dev_priv->vlv_pctx->stolen->start); 7024 dev_priv->vlv_pctx->stolen->start);
7025} 7025}
7026 7026
@@ -7035,7 +7035,6 @@ static void cherryview_check_pctx(struct drm_i915_private *dev_priv)
7035 7035
7036static void cherryview_setup_pctx(struct drm_i915_private *dev_priv) 7036static void cherryview_setup_pctx(struct drm_i915_private *dev_priv)
7037{ 7037{
7038 struct i915_ggtt *ggtt = &dev_priv->ggtt;
7039 unsigned long pctx_paddr, paddr; 7038 unsigned long pctx_paddr, paddr;
7040 u32 pcbr; 7039 u32 pcbr;
7041 int pctx_size = 32*1024; 7040 int pctx_size = 32*1024;
@@ -7043,8 +7042,8 @@ static void cherryview_setup_pctx(struct drm_i915_private *dev_priv)
7043 pcbr = I915_READ(VLV_PCBR); 7042 pcbr = I915_READ(VLV_PCBR);
7044 if ((pcbr >> VLV_PCBR_ADDR_SHIFT) == 0) { 7043 if ((pcbr >> VLV_PCBR_ADDR_SHIFT) == 0) {
7045 DRM_DEBUG_DRIVER("BIOS didn't set up PCBR, fixing up\n"); 7044 DRM_DEBUG_DRIVER("BIOS didn't set up PCBR, fixing up\n");
7046 paddr = (dev_priv->mm.stolen_base + 7045 paddr = dev_priv->dsm.end + 1 - pctx_size;
7047 (ggtt->stolen_size - pctx_size)); 7046 GEM_BUG_ON(paddr > U32_MAX);
7048 7047
7049 pctx_paddr = (paddr & (~4095)); 7048 pctx_paddr = (paddr & (~4095));
7050 I915_WRITE(VLV_PCBR, pctx_paddr); 7049 I915_WRITE(VLV_PCBR, pctx_paddr);
@@ -7065,7 +7064,7 @@ static void valleyview_setup_pctx(struct drm_i915_private *dev_priv)
7065 /* BIOS set it up already, grab the pre-alloc'd space */ 7064 /* BIOS set it up already, grab the pre-alloc'd space */
7066 int pcbr_offset; 7065 int pcbr_offset;
7067 7066
7068 pcbr_offset = (pcbr & (~4095)) - dev_priv->mm.stolen_base; 7067 pcbr_offset = (pcbr & (~4095)) - dev_priv->dsm.start;
7069 pctx = i915_gem_object_create_stolen_for_preallocated(dev_priv, 7068 pctx = i915_gem_object_create_stolen_for_preallocated(dev_priv,
7070 pcbr_offset, 7069 pcbr_offset,
7071 I915_GTT_OFFSET_NONE, 7070 I915_GTT_OFFSET_NONE,
@@ -7089,7 +7088,11 @@ static void valleyview_setup_pctx(struct drm_i915_private *dev_priv)
7089 goto out; 7088 goto out;
7090 } 7089 }
7091 7090
7092 pctx_paddr = dev_priv->mm.stolen_base + pctx->stolen->start; 7091 GEM_BUG_ON(range_overflows_t(u64,
7092 dev_priv->dsm.start,
7093 pctx->stolen->start,
7094 U32_MAX));
7095 pctx_paddr = dev_priv->dsm.start + pctx->stolen->start;
7093 I915_WRITE(VLV_PCBR, pctx_paddr); 7096 I915_WRITE(VLV_PCBR, pctx_paddr);
7094 7097
7095out: 7098out:
diff --git a/include/drm/intel-gtt.h b/include/drm/intel-gtt.h
index c5db7975c640..8c577ca38e2e 100644
--- a/include/drm/intel-gtt.h
+++ b/include/drm/intel-gtt.h
@@ -5,7 +5,6 @@
5#define _DRM_INTEL_GTT_H 5#define _DRM_INTEL_GTT_H
6 6
7void intel_gtt_get(u64 *gtt_total, 7void intel_gtt_get(u64 *gtt_total,
8 u32 *stolen_size,
9 phys_addr_t *mappable_base, 8 phys_addr_t *mappable_base,
10 u64 *mappable_end); 9 u64 *mappable_end);
11 10