Commit 0389aa70 authored by Dave Airlie's avatar Dave Airlie
Browse files

Merge tag 'amd-drm-next-7.1-2026-04-17' of https://gitlab.freedesktop.org/agd5f/linux into drm-next



amd-drm-next-7.1-2026-04-17:

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

amdkfd:
- Fix memory clear handling

Signed-off-by: default avatarDave Airlie <airlied@redhat.com>

From: Alex Deucher <alexander.deucher@amd.com>
Link: https://patch.msgid.link/20260417225351.8714-1-alexander.deucher@amd.com
parents a7756371 dd88d42d
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;
+7 −4
Original line number Diff line number Diff line
@@ -5518,8 +5518,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 +6289,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 +6412,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 +6469,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