Commit aab01a88 authored by Dave Airlie's avatar Dave Airlie
Browse files

Merge tag 'drm-misc-fixes-2026-03-26' of...

Merge tag 'drm-misc-fixes-2026-03-26' of https://gitlab.freedesktop.org/drm/misc/kernel

 into drm-fixes

A page mapping fix for shmem fault handler, a power-off fix for ivpu, a
GFP_* flag fix for syncobj, and a MAINTAINERS update.

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

From: Maxime Ripard <mripard@redhat.com>
Link: https://patch.msgid.link/20260326-lush-cuddly-limpet-ab2aa9@houat
parents 355223cb 87a70013
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -8628,8 +8628,14 @@ F: drivers/gpu/drm/lima/
F:	include/uapi/drm/lima_drm.h
DRM DRIVERS FOR LOONGSON
M:	Jianmin Lv <lvjianmin@loongson.cn>
M:	Qianhai Wu <wuqianhai@loongson.cn>
R:	Huacai Chen <chenhuacai@kernel.org>
R:	Mingcong Bai <jeffbai@aosc.io>
R:	Xi Ruoyao <xry111@xry111.site>
R:	Icenowy Zheng <zhengxingda@iscas.ac.cn>
L:	dri-devel@lists.freedesktop.org
S:	Orphan
S:	Maintained
T:	git https://gitlab.freedesktop.org/drm/misc/kernel.git
F:	drivers/gpu/drm/loongson/
+1 −0
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@
#define IVPU_HW_IP_60XX 60

#define IVPU_HW_IP_REV_LNL_B0 4
#define IVPU_HW_IP_REV_NVL_A0 0

#define IVPU_HW_BTRS_MTL 1
#define IVPU_HW_BTRS_LNL 2
+4 −2
Original line number Diff line number Diff line
@@ -70,8 +70,10 @@ static void wa_init(struct ivpu_device *vdev)
	if (ivpu_hw_btrs_gen(vdev) == IVPU_HW_BTRS_MTL)
		vdev->wa.interrupt_clear_with_0 = ivpu_hw_btrs_irqs_clear_with_0_mtl(vdev);

	if (ivpu_device_id(vdev) == PCI_DEVICE_ID_LNL &&
	    ivpu_revision(vdev) < IVPU_HW_IP_REV_LNL_B0)
	if ((ivpu_device_id(vdev) == PCI_DEVICE_ID_LNL &&
	     ivpu_revision(vdev) < IVPU_HW_IP_REV_LNL_B0) ||
	    (ivpu_device_id(vdev) == PCI_DEVICE_ID_NVL &&
	     ivpu_revision(vdev) == IVPU_HW_IP_REV_NVL_A0))
		vdev->wa.disable_clock_relinquish = true;

	if (ivpu_test_mode & IVPU_TEST_MODE_CLK_RELINQ_ENABLE)
+28 −22
Original line number Diff line number Diff line
@@ -550,27 +550,27 @@ int drm_gem_shmem_dumb_create(struct drm_file *file, struct drm_device *dev,
}
EXPORT_SYMBOL_GPL(drm_gem_shmem_dumb_create);

static bool drm_gem_shmem_try_map_pmd(struct vm_fault *vmf, unsigned long addr,
				      struct page *page)
static vm_fault_t try_insert_pfn(struct vm_fault *vmf, unsigned int order,
				 unsigned long pfn)
{
	if (!order) {
		return vmf_insert_pfn(vmf->vma, vmf->address, pfn);
#ifdef CONFIG_ARCH_SUPPORTS_PMD_PFNMAP
	unsigned long pfn = page_to_pfn(page);
	} else if (order == PMD_ORDER) {
		unsigned long paddr = pfn << PAGE_SHIFT;
	bool aligned = (addr & ~PMD_MASK) == (paddr & ~PMD_MASK);
		bool aligned = (vmf->address & ~PMD_MASK) == (paddr & ~PMD_MASK);

		if (aligned &&
	    pmd_none(*vmf->pmd) &&
	    folio_test_pmd_mappable(page_folio(page))) {
		    folio_test_pmd_mappable(page_folio(pfn_to_page(pfn)))) {
			pfn &= PMD_MASK >> PAGE_SHIFT;
		if (vmf_insert_pfn_pmd(vmf, pfn, false) == VM_FAULT_NOPAGE)
			return true;
			return vmf_insert_pfn_pmd(vmf, pfn, false);
		}
#endif

	return false;
	}
	return VM_FAULT_FALLBACK;
}

static vm_fault_t drm_gem_shmem_fault(struct vm_fault *vmf)
static vm_fault_t drm_gem_shmem_any_fault(struct vm_fault *vmf, unsigned int order)
{
	struct vm_area_struct *vma = vmf->vma;
	struct drm_gem_object *obj = vma->vm_private_data;
@@ -581,6 +581,9 @@ static vm_fault_t drm_gem_shmem_fault(struct vm_fault *vmf)
	pgoff_t page_offset;
	unsigned long pfn;

	if (order && order != PMD_ORDER)
		return VM_FAULT_FALLBACK;

	/* Offset to faulty address in the VMA. */
	page_offset = vmf->pgoff - vma->vm_pgoff;

@@ -593,13 +596,8 @@ static vm_fault_t drm_gem_shmem_fault(struct vm_fault *vmf)
		goto out;
	}

	if (drm_gem_shmem_try_map_pmd(vmf, vmf->address, pages[page_offset])) {
		ret = VM_FAULT_NOPAGE;
		goto out;
	}

	pfn = page_to_pfn(pages[page_offset]);
	ret = vmf_insert_pfn(vma, vmf->address, pfn);
	ret = try_insert_pfn(vmf, order, pfn);

 out:
	dma_resv_unlock(shmem->base.resv);
@@ -607,6 +605,11 @@ static vm_fault_t drm_gem_shmem_fault(struct vm_fault *vmf)
	return ret;
}

static vm_fault_t drm_gem_shmem_fault(struct vm_fault *vmf)
{
	return drm_gem_shmem_any_fault(vmf, 0);
}

static void drm_gem_shmem_vm_open(struct vm_area_struct *vma)
{
	struct drm_gem_object *obj = vma->vm_private_data;
@@ -643,6 +646,9 @@ static void drm_gem_shmem_vm_close(struct vm_area_struct *vma)

const struct vm_operations_struct drm_gem_shmem_vm_ops = {
	.fault = drm_gem_shmem_fault,
#ifdef CONFIG_ARCH_SUPPORTS_PMD_PFNMAP
	.huge_fault = drm_gem_shmem_any_fault,
#endif
	.open = drm_gem_shmem_vm_open,
	.close = drm_gem_shmem_vm_close,
};
+2 −2
Original line number Diff line number Diff line
@@ -602,7 +602,7 @@ int drm_syncobj_get_handle(struct drm_file *file_private,
	drm_syncobj_get(syncobj);

	ret = xa_alloc(&file_private->syncobj_xa, handle, syncobj, xa_limit_32b,
		       GFP_NOWAIT);
		       GFP_KERNEL);
	if (ret)
		drm_syncobj_put(syncobj);

@@ -716,7 +716,7 @@ static int drm_syncobj_fd_to_handle(struct drm_file *file_private,
	drm_syncobj_get(syncobj);

	ret = xa_alloc(&file_private->syncobj_xa, handle, syncobj, xa_limit_32b,
		       GFP_NOWAIT);
		       GFP_KERNEL);
	if (ret)
		drm_syncobj_put(syncobj);