diff options
author | Matthew Auld <matthew.auld@intel.com> | 2017-12-11 10:18:18 -0500 |
---|---|---|
committer | Joonas Lahtinen <joonas.lahtinen@linux.intel.com> | 2017-12-12 05:30:19 -0500 |
commit | 7789422665f59982743a32a7728a448c9ddd4003 (patch) | |
tree | 1f12d60f01e0295e47e0c7ac819d043a468cc04a | |
parent | f773568b6ff8c31fce165d177a968f2ae31d10bb (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.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 12 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_gtt.c | 8 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_gtt.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_stolen.c | 125 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_fbc.c | 13 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 15 | ||||
-rw-r--r-- | include/drm/intel-gtt.h | 1 |
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, | |||
1424 | EXPORT_SYMBOL(intel_gmch_probe); | 1424 | EXPORT_SYMBOL(intel_gmch_probe); |
1425 | 1425 | ||
1426 | void intel_gtt_get(u64 *gtt_total, | 1426 | void 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 | ||
79 | static dma_addr_t i915_stolen_to_dma(struct drm_i915_private *dev_priv) | 79 | static 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 | ||
173 | void i915_gem_cleanup_stolen(struct drm_device *dev) | 166 | void i915_gem_cleanup_stolen(struct drm_device *dev) |
@@ -183,11 +176,10 @@ void i915_gem_cleanup_stolen(struct drm_device *dev) | |||
183 | static void g4x_get_stolen_reserved(struct drm_i915_private *dev_priv, | 176 | static 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, | |||
308 | static void bdw_get_stolen_reserved(struct drm_i915_private *dev_priv, | 300 | static 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 | ||
7036 | static void cherryview_setup_pctx(struct drm_i915_private *dev_priv) | 7036 | static 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 | ||
7095 | out: | 7098 | out: |
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 | ||
7 | void intel_gtt_get(u64 *gtt_total, | 7 | void 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 | ||