Commit 92c4c9fd authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'drm-next-2026-04-24' of https://gitlab.freedesktop.org/drm/kernel

Pull drm next fixes from Dave Airlie:
 "This is the first of two fixes for the merge PRs, the other is based
  on 7.0 branch. This mostly AMD fixes, a couple of weeks of backlog
  built up and this weeks. The main complaint I've seen is some boot
  warnings around the FP code handling which this should fix. Otherwise
  a single rcar-du and a single i915 fix.

  amdgpu:
   - SMU 14 fixes
   - Partition fixes
   - SMUIO 15.x fix
   - SR-IOV fixes
   - JPEG fix
   - PSP 15.x fix
   - NBIF fix
   - Devcoredump fixes
   - DPC fix
   - RAS fixes
   - Aldebaran smu fix
   - IP discovery fix
   - SDMA 7.1 fix
   - Runtime pm fix
   - MES 12.1 fix
   - DML2 fixes
   - DCN 4.2 fixes
   - YCbCr fixes
   - Freesync fixes
   - ISM fixes
   - Overlay cursor fix
   - DC FP fixes
   - UserQ locking fixes
   - DC idle state manager fix
   - ASPM fix
   - GPUVM SVM fix
   - DCE 6 fix

  amdkfd:
   - Fix memory clear handling
   - num_of_nodes bounds check fix

  i915:
   - Fix uninitialized variable in the alignment loop [psr]

  rcar-du:
   - fix NULL-ptr crash"

* tag 'drm-next-2026-04-24' of https://gitlab.freedesktop.org/drm/kernel: (75 commits)
  drm/amdkfd: Add upper bound check for num_of_nodes
  drm: rcar-du: Fix crash when no CMM is available
  drm/amd/display: Disable 10-bit truncation and dithering on DCE 6.x
  drm/amdgpu: OR init_pte_flags into invalid leaf PTE updates
  drm/amd: Adjust ASPM support quirk to cover more Intel hosts
  drm/amd/display: Undo accidental fix revert in amdgpu_dm_ism.c
  drm/i915/psr: Init variable to avoid early exit from et alignment loop
  drm/amdgpu: drop userq fence driver refs out of fence process()
  drm/amdgpu/userq: unpin and unref doorbell and wptr outside mutex
  drm/amdgpu/userq: use pm_runtime_resume_and_get and fix err handling
  drm/amdgpu/userq: unmap_helper dont return the queue state
  drm/amdgpu/userq: unmap is to be called before freeing doorbell/wptr bo
  drm/amdgpu/userq: hold root bo lock in caller of input_va_validate
  drm/amdgpu/userq: caller to take reserv lock for vas_list_cleanup
  drm/amdgpu/userq: create_mqd does not need userq_mutex
  drm/amdgpu/userq: dont lock root bo with userq_mutex held
  drm/amdgpu/userq: fix kerneldoc for amdgpu_userq_ensure_ev_fence
  drm/amdgpu/userq: clean the VA mapping list for failed queue creation
  drm/amdgpu/userq: avoid uneccessary locking in amdgpu_userq_create
  drm/amd/display: Fix ISM teardown crash from NULL dc dereference
  ...
parents 892c894b e49712ef
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -1735,7 +1735,8 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
			alloc_domain = AMDGPU_GEM_DOMAIN_GTT;
			alloc_flags = 0;
		} else {
			alloc_flags = AMDGPU_GEM_CREATE_VRAM_WIPE_ON_RELEASE;
			alloc_flags = AMDGPU_GEM_CREATE_VRAM_WIPE_ON_RELEASE |
				AMDGPU_GEM_CREATE_VRAM_CLEARED;
			alloc_flags |= (flags & KFD_IOC_ALLOC_MEM_FLAGS_PUBLIC) ?
			AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED : 0;

+6 −0
Original line number Diff line number Diff line
@@ -866,6 +866,7 @@ amdgpu_connector_vga_detect(struct drm_connector *connector, bool force)
	if (dret) {
		amdgpu_connector->detected_by_load = false;
		drm_edid_free(amdgpu_connector->edid);
		amdgpu_connector->edid = NULL;
		amdgpu_connector_get_edid(connector);

		if (!amdgpu_connector->edid) {
@@ -882,6 +883,7 @@ amdgpu_connector_vga_detect(struct drm_connector *connector, bool force)
			 */
			if (amdgpu_connector->use_digital && amdgpu_connector->shared_ddc) {
				drm_edid_free(amdgpu_connector->edid);
				amdgpu_connector->edid = NULL;
				ret = connector_status_disconnected;
			} else {
				ret = connector_status_connected;
@@ -977,6 +979,7 @@ static void amdgpu_connector_shared_ddc(enum drm_connector_status *status,
					if (!amdgpu_display_hpd_sense(adev,
								      amdgpu_connector->hpd.hpd)) {
						drm_edid_free(amdgpu_connector->edid);
						amdgpu_connector->edid = NULL;
						*status = connector_status_disconnected;
					}
				}
@@ -1046,6 +1049,7 @@ amdgpu_connector_dvi_detect(struct drm_connector *connector, bool force)
	if (dret) {
		amdgpu_connector->detected_by_load = false;
		drm_edid_free(amdgpu_connector->edid);
		amdgpu_connector->edid = NULL;
		amdgpu_connector_get_edid(connector);

		if (!amdgpu_connector->edid) {
@@ -1062,6 +1066,7 @@ amdgpu_connector_dvi_detect(struct drm_connector *connector, bool force)
			 */
			if ((!amdgpu_connector->use_digital) && amdgpu_connector->shared_ddc) {
				drm_edid_free(amdgpu_connector->edid);
				amdgpu_connector->edid = NULL;
				ret = connector_status_disconnected;
			} else {
				ret = connector_status_connected;
@@ -1412,6 +1417,7 @@ amdgpu_connector_dp_detect(struct drm_connector *connector, bool force)
	}

	drm_edid_free(amdgpu_connector->edid);
	amdgpu_connector->edid = NULL;

	if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) ||
	    (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) {
+27 −9
Original line number Diff line number Diff line
@@ -32,6 +32,8 @@ static const guid_t BOOT = BOOT_TYPE;
static const guid_t CRASHDUMP		= AMD_CRASHDUMP;
static const guid_t RUNTIME		= AMD_GPU_NONSTANDARD_ERROR;

#define CPER_SIGNATURE_SZ		(sizeof(((struct cper_hdr *)0)->signature))

static void __inc_entry_length(struct cper_hdr *hdr, uint32_t size)
{
	hdr->record_length += size;
@@ -425,23 +427,40 @@ int amdgpu_cper_generate_ce_records(struct amdgpu_device *adev,

static bool amdgpu_cper_is_hdr(struct amdgpu_ring *ring, u64 pos)
{
	struct cper_hdr *chdr;
	char signature[CPER_SIGNATURE_SZ];

	if ((pos << 2) >= ring->ring_size)
		return false;

	chdr = (struct cper_hdr *)&(ring->ring[pos]);
	return strcmp(chdr->signature, "CPER") ? false : true;
	if ((pos << 2) + CPER_SIGNATURE_SZ <= ring->ring_size) {
		memcpy(signature, &ring->ring[pos], CPER_SIGNATURE_SZ);
	} else {
		u32 chunk = ring->ring_size - (pos << 2);

		memcpy(signature, &ring->ring[pos], chunk);
		memcpy(signature + chunk, ring->ring, CPER_SIGNATURE_SZ - chunk);
	}

	return !memcmp(signature, "CPER", CPER_SIGNATURE_SZ);
}

static u32 amdgpu_cper_ring_get_ent_sz(struct amdgpu_ring *ring, u64 pos)
{
	struct cper_hdr *chdr;
	struct cper_hdr chdr;
	u64 p;
	u32 chunk, rec_len = 0;

	chdr = (struct cper_hdr *)&(ring->ring[pos]);
	chunk = ring->ring_size - (pos << 2);

	if (!strcmp(chdr->signature, "CPER")) {
		rec_len = chdr->record_length;
	if (amdgpu_cper_is_hdr(ring, pos)) {
		if (chunk >= sizeof(chdr)) {
			memcpy(&chdr, &ring->ring[pos], sizeof(chdr));
		} else {
			memcpy(&chdr, &ring->ring[pos], chunk);
			memcpy((u8 *)&chdr + chunk, ring->ring, sizeof(chdr) - chunk);
		}

		rec_len = chdr.record_length;
		goto calc;
	}

@@ -450,8 +469,7 @@ static u32 amdgpu_cper_ring_get_ent_sz(struct amdgpu_ring *ring, u64 pos)
		goto calc;

	for (p = pos + 1; p <= ring->buf_mask; p++) {
		chdr = (struct cper_hdr *)&(ring->ring[p]);
		if (!strcmp(chdr->signature, "CPER")) {
		if (amdgpu_cper_is_hdr(ring, p)) {
			rec_len = (p - pos) << 2;
			goto calc;
		}
+6 −3
Original line number Diff line number Diff line
@@ -464,6 +464,9 @@ static void amdgpu_devcoredump_deferred_work(struct work_struct *work)
	struct amdgpu_device *adev = container_of(work, typeof(*adev), coredump_work);
	struct amdgpu_coredump_info *coredump = adev->coredump;

	if (!coredump)
		goto end;

	/* Do a one-time preparation of the coredump output because
	 * repeatingly calling drm_coredump_printer is very slow.
	 */
@@ -499,7 +502,7 @@ void amdgpu_coredump(struct amdgpu_device *adev, bool skip_vram_check,
	int i, off, idx;

	/* No need to generate a new coredump if there's one in progress already. */
	if (work_pending(&adev->coredump_work))
	if (work_busy(&adev->coredump_work))
		return;

	if (job && job->pasid)
@@ -511,7 +514,6 @@ void amdgpu_coredump(struct amdgpu_device *adev, bool skip_vram_check,

	coredump->skip_vram_check = skip_vram_check;
	coredump->reset_vram_lost = vram_lost;
	coredump->pasid = job->pasid;

	if (job && job->pasid) {
		struct amdgpu_task_info *ti;
@@ -521,6 +523,7 @@ void amdgpu_coredump(struct amdgpu_device *adev, bool skip_vram_check,
			coredump->reset_task_info = *ti;
			amdgpu_vm_put_task_info(ti);
		}
		coredump->pasid = job->pasid;
		coredump->num_ibs = job->num_ibs;
		for (i = 0; i < job->num_ibs; ++i) {
			coredump->ibs[i].gpu_addr = job->ibs[i].gpu_addr;
@@ -563,7 +566,7 @@ void amdgpu_coredump(struct amdgpu_device *adev, bool skip_vram_check,
			coredump->rings[idx].offset = off;

			memcpy(&coredump->rings_dw[off], ring->ring, ring->ring_size);
			off += ring->ring_size;
			off += ring->ring_size / 4;
			idx++;
		}
		coredump->num_rings = idx;
+10 −10
Original line number Diff line number Diff line
@@ -1334,18 +1334,15 @@ static bool amdgpu_device_aspm_support_quirk(struct amdgpu_device *adev)
#if IS_ENABLED(CONFIG_X86)
	struct cpuinfo_x86 *c = &cpu_data(0);

	if (!(amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(12, 0, 0) ||
		  amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(12, 0, 1)))
		return false;

	if (c->x86 == 6 &&
		adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN5) {
	if (c->x86_vendor == X86_VENDOR_INTEL) {
		switch (c->x86_model) {
		case VFM_MODEL(INTEL_ALDERLAKE):
		case VFM_MODEL(INTEL_ALDERLAKE_L):
		case VFM_MODEL(INTEL_RAPTORLAKE):
		case VFM_MODEL(INTEL_RAPTORLAKE_P):
		case VFM_MODEL(INTEL_RAPTORLAKE_S):
		case VFM_MODEL(INTEL_TIGERLAKE):
		case VFM_MODEL(INTEL_TIGERLAKE_L):
			return true;
		default:
			return false;
@@ -5518,8 +5515,6 @@ static void amdgpu_device_recovery_prepare(struct amdgpu_device *adev,
			list_add_tail(&tmp_adev->reset_list, device_list);
			if (adev->shutdown)
				tmp_adev->shutdown = true;
			if (amdgpu_reset_in_dpc(adev))
				tmp_adev->pcie_reset_ctx.in_link_reset = true;
		}
		if (!list_is_first(&adev->reset_list, device_list))
			list_rotate_to_front(&adev->reset_list, device_list);
@@ -6291,6 +6286,9 @@ pci_ers_result_t amdgpu_pci_error_detected(struct pci_dev *pdev, pci_channel_sta
			amdgpu_reset_set_dpc_status(adev, true);

			mutex_lock(&hive->hive_lock);
		} else {
			if (amdgpu_device_bus_status_check(adev))
				amdgpu_reset_set_dpc_status(adev, true);
		}
		memset(&reset_context, 0, sizeof(reset_context));
		INIT_LIST_HEAD(&device_list);
@@ -6411,6 +6409,7 @@ pci_ers_result_t amdgpu_pci_slot_reset(struct pci_dev *pdev)
		list_for_each_entry(tmp_adev, &hive->device_list, gmc.xgmi.head)
			tmp_adev->pcie_reset_ctx.in_link_reset = true;
	} else {
		adev->pcie_reset_ctx.in_link_reset = true;
		set_bit(AMDGPU_SKIP_HW_RESET, &reset_context.flags);
	}

@@ -6467,9 +6466,10 @@ void amdgpu_pci_resume(struct pci_dev *pdev)
			tmp_adev->pcie_reset_ctx.in_link_reset = false;
			list_add_tail(&tmp_adev->reset_list, &device_list);
		}
	} else
	} else {
		adev->pcie_reset_ctx.in_link_reset = false;
		list_add_tail(&adev->reset_list, &device_list);

	}
	amdgpu_device_sched_resume(&device_list, NULL, NULL);
	amdgpu_device_gpu_resume(adev, &device_list, false);
	amdgpu_device_recovery_put_reset_lock(adev, &device_list);
Loading