Commit 25fae0b9 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'drm-fixes-2025-07-24' of https://gitlab.freedesktop.org/drm/kernel

Pull drm fixes from Dave Airlie:
 "This might just be part one, but I'm sending it a bit early as it has
  two sets of reverts for regressions, one is all the gem/dma-buf
  handling and another was a nouveau ioctl change.

  Otherwise there is an amdgpu fix, nouveau fix and a scheduler fix.

  If any other changes come in I'll follow up with another more usual
  Fri/Sat MR.

  gem:
   - revert all the dma-buf/gem changes as there as lifetime issues
     with them

  nouveau:
   - revert an ioctl change as it causes issues
   - fix NULL ptr on fermi

  bridge:
   - remove extra semicolon

  sched:
   - remove hang causing optimisation

  amdgpu:
   - fix garbage in cleared vram after resume"

* tag 'drm-fixes-2025-07-24' of https://gitlab.freedesktop.org/drm/kernel:
  drm/bridge: ti-sn65dsi86: Remove extra semicolon in ti_sn_bridge_probe()
  Revert "drm/nouveau: check ioctl command codes better"
  drm/nouveau/nvif: fix null ptr deref on pre-fermi boards
  Revert "drm/gem-dma: Use dma_buf from GEM object instance"
  Revert "drm/gem-shmem: Use dma_buf from GEM object instance"
  Revert "drm/gem-framebuffer: Use dma_buf from GEM object instance"
  Revert "drm/prime: Use dma_buf from GEM object instance"
  Revert "drm/etnaviv: Use dma_buf from GEM object instance"
  Revert "drm/vmwgfx: Use dma_buf from GEM object instance"
  Revert "drm/virtio: Use dma_buf from GEM object instance"
  drm/sched: Remove optimization that causes hang when killing dependent jobs
  drm/amdgpu: Reset the clear flag in buddy during resume
parents f9af7b5d 337666c5
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -5193,6 +5193,8 @@ int amdgpu_device_resume(struct drm_device *dev, bool notify_clients)
		dev->dev->power.disable_depth--;
#endif
	}

	amdgpu_vram_mgr_clear_reset_blocks(adev);
	adev->in_suspend = false;

	if (amdgpu_acpi_smart_shift_update(dev, AMDGPU_SS_DEV_D0))
+1 −0
Original line number Diff line number Diff line
@@ -154,6 +154,7 @@ int amdgpu_vram_mgr_reserve_range(struct amdgpu_vram_mgr *mgr,
				  uint64_t start, uint64_t size);
int amdgpu_vram_mgr_query_page_status(struct amdgpu_vram_mgr *mgr,
				      uint64_t start);
void amdgpu_vram_mgr_clear_reset_blocks(struct amdgpu_device *adev);

bool amdgpu_res_cpu_visible(struct amdgpu_device *adev,
			    struct ttm_resource *res);
+17 −0
Original line number Diff line number Diff line
@@ -782,6 +782,23 @@ uint64_t amdgpu_vram_mgr_vis_usage(struct amdgpu_vram_mgr *mgr)
	return atomic64_read(&mgr->vis_usage);
}

/**
 * amdgpu_vram_mgr_clear_reset_blocks - reset clear blocks
 *
 * @adev: amdgpu device pointer
 *
 * Reset the cleared drm buddy blocks.
 */
void amdgpu_vram_mgr_clear_reset_blocks(struct amdgpu_device *adev)
{
	struct amdgpu_vram_mgr *mgr = &adev->mman.vram_mgr;
	struct drm_buddy *mm = &mgr->mm;

	mutex_lock(&mgr->lock);
	drm_buddy_reset_clear(mm, false);
	mutex_unlock(&mgr->lock);
}

/**
 * amdgpu_vram_mgr_intersects - test each drm buddy block for intersection
 *
+1 −1
Original line number Diff line number Diff line
@@ -1373,7 +1373,7 @@ static int ti_sn_bridge_probe(struct auxiliary_device *adev,
			regmap_update_bits(pdata->regmap, SN_HPD_DISABLE_REG,
					   HPD_DISABLE, 0);
		mutex_unlock(&pdata->comms_mutex);
	};
	}

	drm_bridge_add(&pdata->bridge);

+43 −0
Original line number Diff line number Diff line
@@ -404,6 +404,49 @@ drm_get_buddy(struct drm_buddy_block *block)
}
EXPORT_SYMBOL(drm_get_buddy);

/**
 * drm_buddy_reset_clear - reset blocks clear state
 *
 * @mm: DRM buddy manager
 * @is_clear: blocks clear state
 *
 * Reset the clear state based on @is_clear value for each block
 * in the freelist.
 */
void drm_buddy_reset_clear(struct drm_buddy *mm, bool is_clear)
{
	u64 root_size, size, start;
	unsigned int order;
	int i;

	size = mm->size;
	for (i = 0; i < mm->n_roots; ++i) {
		order = ilog2(size) - ilog2(mm->chunk_size);
		start = drm_buddy_block_offset(mm->roots[i]);
		__force_merge(mm, start, start + size, order);

		root_size = mm->chunk_size << order;
		size -= root_size;
	}

	for (i = 0; i <= mm->max_order; ++i) {
		struct drm_buddy_block *block;

		list_for_each_entry_reverse(block, &mm->free_list[i], link) {
			if (is_clear != drm_buddy_block_is_clear(block)) {
				if (is_clear) {
					mark_cleared(block);
					mm->clear_avail += drm_buddy_block_size(mm, block);
				} else {
					clear_reset(block);
					mm->clear_avail -= drm_buddy_block_size(mm, block);
				}
			}
		}
	}
}
EXPORT_SYMBOL(drm_buddy_reset_clear);

/**
 * drm_buddy_free_block - free a block
 *
Loading