diff options
| author | Dave Airlie <airlied@redhat.com> | 2016-12-22 14:28:02 -0500 |
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2016-12-22 14:28:02 -0500 |
| commit | 4a401ceeef7bf3bc55f5e913cbf19d6038cf83c6 (patch) | |
| tree | 752e305ef740477c196102bc947cce48fdd74c86 | |
| parent | d043835d08b297a41275e4dd499a33dd57243dee (diff) | |
| parent | 6ba0566cf2afcdb17bff882e3a95cbbcb22c4a83 (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.h | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 79 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem_stolen.c | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_sysfs.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_bios.h | 12 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 31 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dsi_panel_vbt.c | 7 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_lrc.c | 7 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 109 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_psr.c | 10 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_runtime_pm.c | 13 |
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 | ||
| 3510 | int sandybridge_pcode_read(struct drm_i915_private *dev_priv, u32 mbox, u32 *val); | 3510 | int sandybridge_pcode_read(struct drm_i915_private *dev_priv, u32 mbox, u32 *val); |
| 3511 | int sandybridge_pcode_write(struct drm_i915_private *dev_priv, u32 mbox, u32 val); | 3511 | int sandybridge_pcode_write(struct drm_i915_private *dev_priv, u32 mbox, u32 val); |
| 3512 | int 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 */ |
| 3514 | u32 vlv_punit_read(struct drm_i915_private *dev_priv, u32 addr); | 3516 | u32 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 * | |||
| 174 | i915_gem_object_get_pages_phys(struct drm_i915_gem_object *obj) | 174 | i915_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 | |||
| 240 | err_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 | ||
| 277 | static void | 301 | static void |
| 278 | i915_gem_object_release_phys(struct drm_i915_gem_object *obj) | 302 | i915_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 | |||
| 538 | i915_gem_object_attach_phys(struct drm_i915_gem_object *obj, | 561 | i915_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 * | |||
| 2326 | i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj) | 2341 | i915_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; | 2371 | rebuild_st: |
| 2356 | if (sg_alloc_table(st, page_count, GFP_KERNEL)) { | 2372 | if (sg_alloc_table(st, page_count, GFP_KERNEL)) { |
