Skip to content

Commit 6fe0e07

Browse files
committed
Merge tag 'drm-fixes-2022-11-25' of git://anongit.freedesktop.org/drm/drm
Pull drm fixes from Dave Airlie: "Weekly fixes, amdgpu has not quite settled down. Most of the changes are small, and the non-amdgpu ones are all fine. There are a bunch of DP MST DSC fixes that fix some issues introduced in a previous larger MST rework. The biggest one is mainly propagating some error values properly instead of bool returns, and I think it just looks large but doesn't really change anything too much, except propagating errors that are required to avoid deadlocks. I've gone over it and a few others and they've had some decent testing over the last few weeks. Summary: amdgpu: - amdgpu gang submit fix - DCN 3.1.4 fixes - DP MST DSC deadlock fixes - HMM userptr fixes - Fix Aldebaran CU occupancy reporting - GFX11 fixes - PSP suspend/resume fix - DCE12 KASAN fix - DCN 3.2.x fixes - Rotated cursor fix - SMU 13.x fix - DELL platform suspend/resume fixes - VCN4 SR-IOV fix - Display regression fix for polled connectors i915: - Fix GVT KVM reference count handling - Never purge busy TTM objects - Fix warn in intel_display_power_*_domain() functions dma-buf: - Use dma_fence_unwrap_for_each when importing sync files - Fix race in dma_heap_add() fbcon: - Fix use of uninitialized memory in logo" * tag 'drm-fixes-2022-11-25' of git://anongit.freedesktop.org/drm/drm: (30 commits) drm/amdgpu/vcn: re-use original vcn0 doorbell value drm/amdgpu: Partially revert "drm/amdgpu: update drm_display_info correctly when the edid is read" drm/amd/display: No display after resume from WB/CB drm/amdgpu: fix use-after-free during gpu recovery drm/amd/pm: update driver if header for smu_13_0_7 drm/amd/display: Fix rotated cursor offset calculation drm/amd/display: Use new num clk levels struct for max mclk index drm/amd/display: Avoid setting pixel rate divider to N/A drm/amd/display: Use viewport height for subvp mall allocation size drm/amd/display: Update soc bounding box for dcn32/dcn321 drm/amd/dc/dce120: Fix audio register mapping, stop triggering KASAN drm/amdgpu/psp: don't free PSP buffers on suspend fbcon: Use kzalloc() in fbcon_prepare_logo() dma-buf: fix racing conflict of dma_heap_add() drm/amd/amdgpu: reserve vm invalidation engine for firmware drm/amdgpu: Enable Aldebaran devices to report CU Occupancy drm/amdgpu: fix userptr HMM range handling v2 drm/amdgpu: always register an MMU notifier for userptr drm/amdgpu/dm/mst: Fix uninitialized var in pre_compute_mst_dsc_configs_for_state() drm/amdgpu/dm/dp_mst: Don't grab mst_mgr->lock when computing DSC state ...
2 parents 08ad43d + e577020 commit 6fe0e07

38 files changed

+487
-326
lines changed

drivers/dma-buf/dma-buf.c

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <linux/slab.h>
1616
#include <linux/dma-buf.h>
1717
#include <linux/dma-fence.h>
18+
#include <linux/dma-fence-unwrap.h>
1819
#include <linux/anon_inodes.h>
1920
#include <linux/export.h>
2021
#include <linux/debugfs.h>
@@ -391,8 +392,10 @@ static long dma_buf_import_sync_file(struct dma_buf *dmabuf,
391392
const void __user *user_data)
392393
{
393394
struct dma_buf_import_sync_file arg;
394-
struct dma_fence *fence;
395+
struct dma_fence *fence, *f;
395396
enum dma_resv_usage usage;
397+
struct dma_fence_unwrap iter;
398+
unsigned int num_fences;
396399
int ret = 0;
397400

398401
if (copy_from_user(&arg, user_data, sizeof(arg)))
@@ -411,13 +414,21 @@ static long dma_buf_import_sync_file(struct dma_buf *dmabuf,
411414
usage = (arg.flags & DMA_BUF_SYNC_WRITE) ? DMA_RESV_USAGE_WRITE :
412415
DMA_RESV_USAGE_READ;
413416

414-
dma_resv_lock(dmabuf->resv, NULL);
417+
num_fences = 0;
418+
dma_fence_unwrap_for_each(f, &iter, fence)
419+
++num_fences;
415420

416-
ret = dma_resv_reserve_fences(dmabuf->resv, 1);
417-
if (!ret)
418-
dma_resv_add_fence(dmabuf->resv, fence, usage);
421+
if (num_fences > 0) {
422+
dma_resv_lock(dmabuf->resv, NULL);
419423

420-
dma_resv_unlock(dmabuf->resv);
424+
ret = dma_resv_reserve_fences(dmabuf->resv, num_fences);
425+
if (!ret) {
426+
dma_fence_unwrap_for_each(f, &iter, fence)
427+
dma_resv_add_fence(dmabuf->resv, f, usage);
428+
}
429+
430+
dma_resv_unlock(dmabuf->resv);
431+
}
421432

422433
dma_fence_put(fence);
423434

drivers/dma-buf/dma-heap.c

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -233,18 +233,6 @@ struct dma_heap *dma_heap_add(const struct dma_heap_export_info *exp_info)
233233
return ERR_PTR(-EINVAL);
234234
}
235235

236-
/* check the name is unique */
237-
mutex_lock(&heap_list_lock);
238-
list_for_each_entry(h, &heap_list, list) {
239-
if (!strcmp(h->name, exp_info->name)) {
240-
mutex_unlock(&heap_list_lock);
241-
pr_err("dma_heap: Already registered heap named %s\n",
242-
exp_info->name);
243-
return ERR_PTR(-EINVAL);
244-
}
245-
}
246-
mutex_unlock(&heap_list_lock);
247-
248236
heap = kzalloc(sizeof(*heap), GFP_KERNEL);
249237
if (!heap)
250238
return ERR_PTR(-ENOMEM);
@@ -283,13 +271,27 @@ struct dma_heap *dma_heap_add(const struct dma_heap_export_info *exp_info)
283271
err_ret = ERR_CAST(dev_ret);
284272
goto err2;
285273
}
286-
/* Add heap to the list */
274+
287275
mutex_lock(&heap_list_lock);
276+
/* check the name is unique */
277+
list_for_each_entry(h, &heap_list, list) {
278+
if (!strcmp(h->name, exp_info->name)) {
279+
mutex_unlock(&heap_list_lock);
280+
pr_err("dma_heap: Already registered heap named %s\n",
281+
exp_info->name);
282+
err_ret = ERR_PTR(-EINVAL);
283+
goto err3;
284+
}
285+
}
286+
287+
/* Add heap to the list */
288288
list_add(&heap->list, &heap_list);
289289
mutex_unlock(&heap_list_lock);
290290

291291
return heap;
292292

293+
err3:
294+
device_destroy(dma_heap_class, heap->heap_devt);
293295
err2:
294296
cdev_del(&heap->heap_cdev);
295297
err1:

drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_aldebaran.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,5 +41,6 @@ const struct kfd2kgd_calls aldebaran_kfd2kgd = {
4141
.get_atc_vmid_pasid_mapping_info =
4242
kgd_gfx_v9_get_atc_vmid_pasid_mapping_info,
4343
.set_vm_context_page_table_base = kgd_gfx_v9_set_vm_context_page_table_base,
44+
.get_cu_occupancy = kgd_gfx_v9_get_cu_occupancy,
4445
.program_trap_handler_settings = kgd_gfx_v9_program_trap_handler_settings
4546
};

drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -986,6 +986,7 @@ static int init_user_pages(struct kgd_mem *mem, uint64_t user_addr,
986986
struct amdkfd_process_info *process_info = mem->process_info;
987987
struct amdgpu_bo *bo = mem->bo;
988988
struct ttm_operation_ctx ctx = { true, false };
989+
struct hmm_range *range;
989990
int ret = 0;
990991

991992
mutex_lock(&process_info->lock);
@@ -1015,7 +1016,7 @@ static int init_user_pages(struct kgd_mem *mem, uint64_t user_addr,
10151016
return 0;
10161017
}
10171018

1018-
ret = amdgpu_ttm_tt_get_user_pages(bo, bo->tbo.ttm->pages);
1019+
ret = amdgpu_ttm_tt_get_user_pages(bo, bo->tbo.ttm->pages, &range);
10191020
if (ret) {
10201021
pr_err("%s: Failed to get user pages: %d\n", __func__, ret);
10211022
goto unregister_out;
@@ -1033,7 +1034,7 @@ static int init_user_pages(struct kgd_mem *mem, uint64_t user_addr,
10331034
amdgpu_bo_unreserve(bo);
10341035

10351036
release_out:
1036-
amdgpu_ttm_tt_get_user_pages_done(bo->tbo.ttm);
1037+
amdgpu_ttm_tt_get_user_pages_done(bo->tbo.ttm, range);
10371038
unregister_out:
10381039
if (ret)
10391040
amdgpu_mn_unregister(bo);
@@ -2370,6 +2371,8 @@ static int update_invalid_user_pages(struct amdkfd_process_info *process_info,
23702371
/* Go through userptr_inval_list and update any invalid user_pages */
23712372
list_for_each_entry(mem, &process_info->userptr_inval_list,
23722373
validate_list.head) {
2374+
struct hmm_range *range;
2375+
23732376
invalid = atomic_read(&mem->invalid);
23742377
if (!invalid)
23752378
/* BO hasn't been invalidated since the last
@@ -2380,7 +2383,8 @@ static int update_invalid_user_pages(struct amdkfd_process_info *process_info,
23802383
bo = mem->bo;
23812384

23822385
/* Get updated user pages */
2383-
ret = amdgpu_ttm_tt_get_user_pages(bo, bo->tbo.ttm->pages);
2386+
ret = amdgpu_ttm_tt_get_user_pages(bo, bo->tbo.ttm->pages,
2387+
&range);
23842388
if (ret) {
23852389
pr_debug("Failed %d to get user pages\n", ret);
23862390

@@ -2399,7 +2403,7 @@ static int update_invalid_user_pages(struct amdkfd_process_info *process_info,
23992403
* FIXME: Cannot ignore the return code, must hold
24002404
* notifier_lock
24012405
*/
2402-
amdgpu_ttm_tt_get_user_pages_done(bo->tbo.ttm);
2406+
amdgpu_ttm_tt_get_user_pages_done(bo->tbo.ttm, range);
24032407
}
24042408

24052409
/* Mark the BO as valid unless it was invalidated

drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ void amdgpu_bo_list_get_list(struct amdgpu_bo_list *list,
209209
list_add_tail(&e->tv.head, &bucket[priority]);
210210

211211
e->user_pages = NULL;
212+
e->range = NULL;
212213
}
213214

214215
/* Connect the sorted buckets in the output list. */

drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
#include <drm/ttm/ttm_execbuf_util.h>
2727
#include <drm/amdgpu_drm.h>
2828

29+
struct hmm_range;
30+
2931
struct amdgpu_device;
3032
struct amdgpu_bo;
3133
struct amdgpu_bo_va;
@@ -36,6 +38,7 @@ struct amdgpu_bo_list_entry {
3638
struct amdgpu_bo_va *bo_va;
3739
uint32_t priority;
3840
struct page **user_pages;
41+
struct hmm_range *range;
3942
bool user_invalidated;
4043
};
4144

drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,6 @@ static void amdgpu_connector_free_edid(struct drm_connector *connector)
328328

329329
kfree(amdgpu_connector->edid);
330330
amdgpu_connector->edid = NULL;
331-
drm_connector_update_edid_property(connector, NULL);
332331
}
333332

334333
static int amdgpu_connector_ddc_get_modes(struct drm_connector *connector)

drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -913,7 +913,7 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
913913
goto out_free_user_pages;
914914
}
915915

916-
r = amdgpu_ttm_tt_get_user_pages(bo, e->user_pages);
916+
r = amdgpu_ttm_tt_get_user_pages(bo, e->user_pages, &e->range);
917917
if (r) {
918918
kvfree(e->user_pages);
919919
e->user_pages = NULL;
@@ -991,9 +991,10 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
991991

992992
if (!e->user_pages)
993993
continue;
994-
amdgpu_ttm_tt_get_user_pages_done(bo->tbo.ttm);
994+
amdgpu_ttm_tt_get_user_pages_done(bo->tbo.ttm, e->range);
995995
kvfree(e->user_pages);
996996
e->user_pages = NULL;
997+
e->range = NULL;
997998
}
998999
mutex_unlock(&p->bo_list->bo_list_mutex);
9991000
return r;
@@ -1273,7 +1274,8 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
12731274
amdgpu_bo_list_for_each_userptr_entry(e, p->bo_list) {
12741275
struct amdgpu_bo *bo = ttm_to_amdgpu_bo(e->tv.bo);
12751276

1276-
r |= !amdgpu_ttm_tt_get_user_pages_done(bo->tbo.ttm);
1277+
r |= !amdgpu_ttm_tt_get_user_pages_done(bo->tbo.ttm, e->range);
1278+
e->range = NULL;
12771279
}
12781280
if (r) {
12791281
r = -EAGAIN;

drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,7 @@ int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data,
378378
struct amdgpu_device *adev = drm_to_adev(dev);
379379
struct drm_amdgpu_gem_userptr *args = data;
380380
struct drm_gem_object *gobj;
381+
struct hmm_range *range;
381382
struct amdgpu_bo *bo;
382383
uint32_t handle;
383384
int r;
@@ -413,14 +414,13 @@ int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data,
413414
if (r)
414415
goto release_object;
415416

416-
if (args->flags & AMDGPU_GEM_USERPTR_REGISTER) {
417-
r = amdgpu_mn_register(bo, args->addr);
418-
if (r)
419-
goto release_object;
420-
}
417+
r = amdgpu_mn_register(bo, args->addr);
418+
if (r)
419+
goto release_object;
421420

422421
if (args->flags & AMDGPU_GEM_USERPTR_VALIDATE) {
423-
r = amdgpu_ttm_tt_get_user_pages(bo, bo->tbo.ttm->pages);
422+
r = amdgpu_ttm_tt_get_user_pages(bo, bo->tbo.ttm->pages,
423+
&range);
424424
if (r)
425425
goto release_object;
426426

@@ -443,7 +443,7 @@ int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data,
443443

444444
user_pages_done:
445445
if (args->flags & AMDGPU_GEM_USERPTR_VALIDATE)
446-
amdgpu_ttm_tt_get_user_pages_done(bo->tbo.ttm);
446+
amdgpu_ttm_tt_get_user_pages_done(bo->tbo.ttm, range);
447447

448448
release_object:
449449
drm_gem_object_put(gobj);

drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -479,6 +479,12 @@ int amdgpu_gmc_allocate_vm_inv_eng(struct amdgpu_device *adev)
479479
unsigned i;
480480
unsigned vmhub, inv_eng;
481481

482+
if (adev->enable_mes) {
483+
/* reserve engine 5 for firmware */
484+
for (vmhub = 0; vmhub < AMDGPU_MAX_VMHUBS; vmhub++)
485+
vm_inv_engs[vmhub] &= ~(1 << 5);
486+
}
487+
482488
for (i = 0; i < adev->num_rings; ++i) {
483489
ring = adev->rings[i];
484490
vmhub = ring->funcs->vmhub;

0 commit comments

Comments
 (0)