aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2016-12-22 14:28:02 -0500
committerDave Airlie <airlied@redhat.com>2016-12-22 14:28:02 -0500
commit4a401ceeef7bf3bc55f5e913cbf19d6038cf83c6 (patch)
tree752e305ef740477c196102bc947cce48fdd74c86
parentd043835d08b297a41275e4dd499a33dd57243dee (diff)
parent6ba0566cf2afcdb17bff882e3a95cbbcb22c4a83 (diff)
Merge tag 'drm-intel-next-fixes-2016-12-22' of git://anongit.freedesktop.org/git/drm-intel into drm-fixes
First set of i915 fixes for code in next. * tag 'drm-intel-next-fixes-2016-12-22' of git://anongit.freedesktop.org/git/drm-intel: drm/i915: skip the first 4k of stolen memory on everything >= gen8 drm/i915: Fallback to single PAGE_SIZE segments for DMA remapping drm/i915: Fix use after free in logical_render_ring_init drm/i915: disable PSR by default on HSW/BDW drm/i915: Fix setting of boost freq tunable drm/i915: tune down the fast link training vs boot fail drm/i915: Reorder phys backing storage release drm/i915/gen9: Fix PCODE polling during SAGV disabling drm/i915/gen9: Fix PCODE polling during CDCLK change notification drm/i915/dsi: Fix chv_exec_gpio disabling the GPIOs it is setting drm/i915/dsi: Fix swapping of MIPI_SEQ_DEASSERT_RESET / MIPI_SEQ_ASSERT_RESET drm/i915/dsi: Do not clear DPOUNIT_CLOCK_GATE_DISABLE from vlv_init_display_clock_gating drm/i915: drop the struct_mutex when wedged or trying to reset
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h2
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c79
-rw-r--r--drivers/gpu/drm/i915/i915_gem_stolen.c5
-rw-r--r--drivers/gpu/drm/i915/i915_sysfs.c2
-rw-r--r--drivers/gpu/drm/i915/intel_bios.h12
-rw-r--r--drivers/gpu/drm/i915/intel_display.c31
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c4
-rw-r--r--drivers/gpu/drm/i915/intel_dsi_panel_vbt.c7
-rw-r--r--drivers/gpu/drm/i915/intel_lrc.c7
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c109
-rw-r--r--drivers/gpu/drm/i915/intel_psr.c10
-rw-r--r--drivers/gpu/drm/i915/intel_runtime_pm.c13
12 files changed, 186 insertions, 95 deletions
</
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 56002a52936d..243224aeabf8 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -3509,6 +3509,8 @@ extern void intel_display_print_error_state(struct drm_i915_error_state_buf *e,
3509 3509
3510int sandybridge_pcode_read(struct drm_i915_private *dev_priv, u32 mbox, u32 *val); 3510int sandybridge_pcode_read(struct drm_i915_private *dev_priv, u32 mbox, u32 *val);
3511int sandybridge_pcode_write(struct drm_i915_private *dev_priv, u32 mbox, u32 val); 3511int sandybridge_pcode_write(struct drm_i915_private *dev_priv, u32 mbox, u32 val);
3512int skl_pcode_request(struct drm_i915_private *dev_priv, u32 mbox, u32 request,
3513 u32 reply_mask, u32 reply, int timeout_base_ms);
3512 3514
3513/* intel_sideband.c */ 3515/* intel_sideband.c */
3514u32 vlv_punit_read(struct drm_i915_private *dev_priv, u32 addr); 3516u32 vlv_punit_read(struct drm_i915_private *dev_priv, u32 addr);
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 412f3513f269..4a31b7a891ec 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -174,21 +174,35 @@ static struct sg_table *
174i915_gem_object_get_pages_phys(struct drm_i915_gem_object *obj) 174i915_gem_object_get_pages_phys(struct drm_i915_gem_object *obj)
175{ 175{
176 struct address_space *mapping = obj->base.filp->f_mapping; 176 struct address_space *mapping = obj->base.filp->f_mapping;
177 char *vaddr = obj->phys_handle->vaddr; 177 drm_dma_handle_t *phys;
178 struct sg_table *st; 178 struct sg_table *st;
179 struct scatterlist *sg; 179 struct scatterlist *sg;
180 char *vaddr;
180 int i; 181 int i;
181 182
182 if (WARN_ON(i915_gem_object_needs_bit17_swizzle(obj))) 183 if (WARN_ON(i915_gem_object_needs_bit17_swizzle(obj)))
183 return ERR_PTR(-EINVAL); 184 return ERR_PTR(-EINVAL);
184 185
186 /* Always aligning to the object size, allows a single allocation
187 * to handle all possible callers, and given typical object sizes,
188 * the alignment of the buddy allocation will naturally match.
189 */
190 phys = drm_pci_alloc(obj->base.dev,
191 obj->base.size,
192 roundup_pow_of_two(obj->base.size));
193 if (!phys)
194 return ERR_PTR(-ENOMEM);
195
196 vaddr = phys->vaddr;
185 for (i = 0; i < obj->base.size / PAGE_SIZE; i++) { 197 for (i = 0; i < obj->base.size / PAGE_SIZE; i++) {
186 struct page *page; 198 struct page *page;
187 char *src; 199 char *src;
188 200
189 page = shmem_read_mapping_page(mapping, i); 201 page = shmem_read_mapping_page(mapping, i);
190 if (IS_ERR(page)) 202 if (IS_ERR(page)) {
191 return ERR_CAST(page); 203 st = ERR_CAST(page);
204 goto err_phys;
205 }
192 206
193 src = kmap_atomic(page); 207 src = kmap_atomic(page);
194 memcpy(vaddr, src, PAGE_SIZE); 208 memcpy(vaddr, src, PAGE_SIZE);
@@ -202,21 +216,29 @@ i915_gem_object_get_pages_phys(struct drm_i915_gem_object *obj)
202 i915_gem_chipset_flush(to_i915(obj->base.dev)); 216 i915_gem_chipset_flush(to_i915(obj->base.dev));
203 217
204 st = kmalloc(sizeof(*st), GFP_KERNEL); 218 st = kmalloc(sizeof(*st), GFP_KERNEL);
205 if (st == NULL) 219 if (!st) {
206 return ERR_PTR(-ENOMEM); 220 st = ERR_PTR(-ENOMEM);
221 goto err_phys;
222 }
207 223
208 if (sg_alloc_table(st, 1, GFP_KERNEL)) { 224 if (sg_alloc_table(st, 1, GFP_KERNEL)) {
209 kfree(st); 225 kfree(st);
210 return ERR_PTR(-ENOMEM); 226 st = ERR_PTR(-ENOMEM);
227 goto err_phys;
211 } 228 }
212 229
213 sg = st->sgl; 230 sg = st->sgl;
214 sg->offset = 0; 231 sg->offset = 0;
215 sg->length = obj->base.size; 232 sg->length = obj->base.size;
216 233
217 sg_dma_address(sg) = obj->phys_handle->busaddr; 234 sg_dma_address(sg) = phys->busaddr;
218 sg_dma_len(sg) = obj->base.size; 235 sg_dma_len(sg) = obj->base.size;
219 236
237 obj->phys_handle = phys;
238 return st;
239
240err_phys:
241 drm_pci_free(obj->base.dev, phys);
220 return st; 242 return st;
221} 243}
222 244
@@ -272,12 +294,13 @@ i915_gem_object_put_pages_phys(struct drm_i915_gem_object *obj,
272 294
273 sg_free_table(pages); 295 sg_free_table(pages);
274 kfree(pages); 296 kfree(pages);
297
298 drm_pci_free(obj->base.dev, obj->phys_handle);
275} 299}
276 300
277static void 301static void
278i915_gem_object_release_phys(struct drm_i915_gem_object *obj) 302i915_gem_object_release_phys(struct drm_i915_gem_object *obj)
279{ 303{
280 drm_pci_free(obj->base.dev, obj->phys_handle);
281 i915_gem_object_unpin_pages(obj); 304 i915_gem_object_unpin_pages(obj);
282} 305}
283 306
@@ -538,15 +561,13 @@ int
538i915_gem_object_attach_phys(struct drm_i915_gem_object *obj, 561i915_gem_object_attach_phys(struct drm_i915_gem_object *obj,
539 int align) 562 int align)
540{ 563{
541 drm_dma_handle_t *phys;
542 int ret; 564 int ret;
543 565
544 if (obj->phys_handle) { 566 if (align > obj->base.size)
545 if ((unsigned long)obj->phys_handle->vaddr & (align -1)) 567 return -EINVAL;
546 return -EBUSY;
547 568
569 if (obj->ops == &i915_gem_phys_ops)
548 return 0; 570 return 0;
549 }
550 571
551 if (obj->mm.madv != I915_MADV_WILLNEED) 572 if (obj->mm.madv != I915_MADV_WILLNEED)
552 return -EFAULT; 573 return -EFAULT;
@@ -562,12 +583,6 @@ i915_gem_object_attach_phys(struct drm_i915_gem_object *obj,
562 if (obj->mm.pages) 583 if (obj->mm.pages)
563 return -EBUSY; 584 return -EBUSY;
564 585
565 /* create a new object */
566 phys = drm_pci_alloc(obj->base.dev, obj->base.size, align);
567 if (!phys)
568 return -ENOMEM;
569
570 obj->phys_handle = phys;
571 obj->ops = &i915_gem_phys_ops; 586 obj->ops = &i915_gem_phys_ops;
572 587
573 return i915_gem_object_pin_pages(obj); 588 return i915_gem_object_pin_pages(obj);
@@ -2326,7 +2341,8 @@ static struct sg_table *
2326i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj) 2341i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)
2327{ 2342{
2328 struct drm_i915_private *dev_priv = to_i915(obj->base.dev); 2343 struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
2329 int page_count, i; 2344 const unsigned long page_count = obj->base.size / PAGE_SIZE;
2345 unsigned long i;
2330 struct address_space *mapping; 2346 struct address_space *mapping;
2331 struct sg_table *st; 2347 struct sg_table *st;
2332 struct scatterlist *sg; 2348 struct scatterlist *sg;
@@ -2352,7 +2368,7 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)
2352 if (st == NULL) 2368 if (st == NULL)
2353 return ERR_PTR(-ENOMEM); 2369 return ERR_PTR(-ENOMEM);
2354 2370
2355 page_count = obj->base.size / PAGE_SIZE; 2371rebuild_st:
2356 if (sg_alloc_table(st, page_count, GFP_KERNEL)) { 2372 if (sg_alloc_table(st, page_count, GFP_KERNEL)) {