Skip to content

Commit 337666c

Browse files
committed
Merge tag 'drm-misc-fixes-2025-07-23' of https://gitlab.freedesktop.org/drm/misc/kernel into drm-fixes
drm-misc-fixes for v6.16-rc8/final?: - Revert all uses of drm_gem_object->dmabuf to drm_gem_object->import_attach->dmabuf. - Fix amdgpu returning BIOS cluttered VRAM after resume. - Scheduler hang fix. - Revert nouveau ioctl fix as it caused regressions. - Fix null pointer deref in nouveau. - Fix unnecessary semicolon in ti_sn_bridge_probe. Signed-off-by: Dave Airlie <[email protected]> From: Maarten Lankhorst <[email protected]> Link: https://lore.kernel.org/r/[email protected]
2 parents 89be9a8 + 15a7ca7 commit 337666c

File tree

16 files changed

+101
-38
lines changed

16 files changed

+101
-38
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5193,6 +5193,8 @@ int amdgpu_device_resume(struct drm_device *dev, bool notify_clients)
51935193
dev->dev->power.disable_depth--;
51945194
#endif
51955195
}
5196+
5197+
amdgpu_vram_mgr_clear_reset_blocks(adev);
51965198
adev->in_suspend = false;
51975199

51985200
if (amdgpu_acpi_smart_shift_update(dev, AMDGPU_SS_DEV_D0))

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ int amdgpu_vram_mgr_reserve_range(struct amdgpu_vram_mgr *mgr,
154154
uint64_t start, uint64_t size);
155155
int amdgpu_vram_mgr_query_page_status(struct amdgpu_vram_mgr *mgr,
156156
uint64_t start);
157+
void amdgpu_vram_mgr_clear_reset_blocks(struct amdgpu_device *adev);
157158

158159
bool amdgpu_res_cpu_visible(struct amdgpu_device *adev,
159160
struct ttm_resource *res);

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -782,6 +782,23 @@ uint64_t amdgpu_vram_mgr_vis_usage(struct amdgpu_vram_mgr *mgr)
782782
return atomic64_read(&mgr->vis_usage);
783783
}
784784

785+
/**
786+
* amdgpu_vram_mgr_clear_reset_blocks - reset clear blocks
787+
*
788+
* @adev: amdgpu device pointer
789+
*
790+
* Reset the cleared drm buddy blocks.
791+
*/
792+
void amdgpu_vram_mgr_clear_reset_blocks(struct amdgpu_device *adev)
793+
{
794+
struct amdgpu_vram_mgr *mgr = &adev->mman.vram_mgr;
795+
struct drm_buddy *mm = &mgr->mm;
796+
797+
mutex_lock(&mgr->lock);
798+
drm_buddy_reset_clear(mm, false);
799+
mutex_unlock(&mgr->lock);
800+
}
801+
785802
/**
786803
* amdgpu_vram_mgr_intersects - test each drm buddy block for intersection
787804
*

drivers/gpu/drm/bridge/ti-sn65dsi86.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1373,7 +1373,7 @@ static int ti_sn_bridge_probe(struct auxiliary_device *adev,
13731373
regmap_update_bits(pdata->regmap, SN_HPD_DISABLE_REG,
13741374
HPD_DISABLE, 0);
13751375
mutex_unlock(&pdata->comms_mutex);
1376-
};
1376+
}
13771377

13781378
drm_bridge_add(&pdata->bridge);
13791379

drivers/gpu/drm/drm_buddy.c

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,49 @@ drm_get_buddy(struct drm_buddy_block *block)
404404
}
405405
EXPORT_SYMBOL(drm_get_buddy);
406406

407+
/**
408+
* drm_buddy_reset_clear - reset blocks clear state
409+
*
410+
* @mm: DRM buddy manager
411+
* @is_clear: blocks clear state
412+
*
413+
* Reset the clear state based on @is_clear value for each block
414+
* in the freelist.
415+
*/
416+
void drm_buddy_reset_clear(struct drm_buddy *mm, bool is_clear)
417+
{
418+
u64 root_size, size, start;
419+
unsigned int order;
420+
int i;
421+
422+
size = mm->size;
423+
for (i = 0; i < mm->n_roots; ++i) {
424+
order = ilog2(size) - ilog2(mm->chunk_size);
425+
start = drm_buddy_block_offset(mm->roots[i]);
426+
__force_merge(mm, start, start + size, order);
427+
428+
root_size = mm->chunk_size << order;
429+
size -= root_size;
430+
}
431+
432+
for (i = 0; i <= mm->max_order; ++i) {
433+
struct drm_buddy_block *block;
434+
435+
list_for_each_entry_reverse(block, &mm->free_list[i], link) {
436+
if (is_clear != drm_buddy_block_is_clear(block)) {
437+
if (is_clear) {
438+
mark_cleared(block);
439+
mm->clear_avail += drm_buddy_block_size(mm, block);
440+
} else {
441+
clear_reset(block);
442+
mm->clear_avail -= drm_buddy_block_size(mm, block);
443+
}
444+
}
445+
}
446+
}
447+
}
448+
EXPORT_SYMBOL(drm_buddy_reset_clear);
449+
407450
/**
408451
* drm_buddy_free_block - free a block
409452
*

drivers/gpu/drm/drm_gem_dma_helper.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ void drm_gem_dma_free(struct drm_gem_dma_object *dma_obj)
230230

231231
if (drm_gem_is_imported(gem_obj)) {
232232
if (dma_obj->vaddr)
233-
dma_buf_vunmap_unlocked(gem_obj->dma_buf, &map);
233+
dma_buf_vunmap_unlocked(gem_obj->import_attach->dmabuf, &map);
234234
drm_prime_gem_destroy(gem_obj, dma_obj->sgt);
235235
} else if (dma_obj->vaddr) {
236236
if (dma_obj->map_noncoherent)

drivers/gpu/drm/drm_gem_framebuffer_helper.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,7 @@ EXPORT_SYMBOL(drm_gem_fb_vunmap);
419419
static void __drm_gem_fb_end_cpu_access(struct drm_framebuffer *fb, enum dma_data_direction dir,
420420
unsigned int num_planes)
421421
{
422+
struct dma_buf_attachment *import_attach;
422423
struct drm_gem_object *obj;
423424
int ret;
424425

@@ -427,9 +428,10 @@ static void __drm_gem_fb_end_cpu_access(struct drm_framebuffer *fb, enum dma_dat
427428
obj = drm_gem_fb_get_obj(fb, num_planes);
428429
if (!obj)
429430
continue;
431+
import_attach = obj->import_attach;
430432
if (!drm_gem_is_imported(obj))
431433
continue;
432-
ret = dma_buf_end_cpu_access(obj->dma_buf, dir);
434+
ret = dma_buf_end_cpu_access(import_attach->dmabuf, dir);
433435
if (ret)
434436
drm_err(fb->dev, "dma_buf_end_cpu_access(%u, %d) failed: %d\n",
435437
ret, num_planes, dir);
@@ -452,6 +454,7 @@ static void __drm_gem_fb_end_cpu_access(struct drm_framebuffer *fb, enum dma_dat
452454
*/
453455
int drm_gem_fb_begin_cpu_access(struct drm_framebuffer *fb, enum dma_data_direction dir)
454456
{
457+
struct dma_buf_attachment *import_attach;
455458
struct drm_gem_object *obj;
456459
unsigned int i;
457460
int ret;
@@ -462,9 +465,10 @@ int drm_gem_fb_begin_cpu_access(struct drm_framebuffer *fb, enum dma_data_direct
462465
ret = -EINVAL;
463466
goto err___drm_gem_fb_end_cpu_access;
464467
}
468+
import_attach = obj->import_attach;
465469
if (!drm_gem_is_imported(obj))
466470
continue;
467-
ret = dma_buf_begin_cpu_access(obj->dma_buf, dir);
471+
ret = dma_buf_begin_cpu_access(import_attach->dmabuf, dir);
468472
if (ret)
469473
goto err___drm_gem_fb_end_cpu_access;
470474
}

drivers/gpu/drm/drm_gem_shmem_helper.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ int drm_gem_shmem_vmap_locked(struct drm_gem_shmem_object *shmem,
349349
int ret = 0;
350350

351351
if (drm_gem_is_imported(obj)) {
352-
ret = dma_buf_vmap(obj->dma_buf, map);
352+
ret = dma_buf_vmap(obj->import_attach->dmabuf, map);
353353
} else {
354354
pgprot_t prot = PAGE_KERNEL;
355355

@@ -409,7 +409,7 @@ void drm_gem_shmem_vunmap_locked(struct drm_gem_shmem_object *shmem,
409409
struct drm_gem_object *obj = &shmem->base;
410410

411411
if (drm_gem_is_imported(obj)) {
412-
dma_buf_vunmap(obj->dma_buf, map);
412+
dma_buf_vunmap(obj->import_attach->dmabuf, map);
413413
} else {
414414
dma_resv_assert_held(shmem->base.resv);
415415

drivers/gpu/drm/drm_prime.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -453,7 +453,13 @@ struct dma_buf *drm_gem_prime_handle_to_dmabuf(struct drm_device *dev,
453453
}
454454

455455
mutex_lock(&dev->object_name_lock);
456-
/* re-export the original imported/exported object */
456+
/* re-export the original imported object */
457+
if (obj->import_attach) {
458+
dmabuf = obj->import_attach->dmabuf;
459+
get_dma_buf(dmabuf);
460+
goto out_have_obj;
461+
}
462+
457463
if (obj->dma_buf) {
458464
get_dma_buf(obj->dma_buf);
459465
dmabuf = obj->dma_buf;

drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ static void etnaviv_gem_prime_release(struct etnaviv_gem_object *etnaviv_obj)
6565
struct iosys_map map = IOSYS_MAP_INIT_VADDR(etnaviv_obj->vaddr);
6666

6767
if (etnaviv_obj->vaddr)
68-
dma_buf_vunmap_unlocked(etnaviv_obj->base.dma_buf, &map);
68+
dma_buf_vunmap_unlocked(etnaviv_obj->base.import_attach->dmabuf, &map);
6969

7070
/* Don't drop the pages for imported dmabuf, as they are not
7171
* ours, just free the array we allocated:
@@ -82,7 +82,7 @@ static void *etnaviv_gem_prime_vmap_impl(struct etnaviv_gem_object *etnaviv_obj)
8282

8383
lockdep_assert_held(&etnaviv_obj->lock);
8484

85-
ret = dma_buf_vmap(etnaviv_obj->base.dma_buf, &map);
85+
ret = dma_buf_vmap(etnaviv_obj->base.import_attach->dmabuf, &map);
8686
if (ret)
8787
return NULL;
8888
return map.vaddr;

0 commit comments

Comments
 (0)