Skip to content

Commit aab01a8

Browse files
committed
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: Dave Airlie <[email protected]> From: Maxime Ripard <[email protected]> Link: https://patch.msgid.link/20260326-lush-cuddly-limpet-ab2aa9@houat
2 parents 355223c + 87a7001 commit aab01a8

5 files changed

Lines changed: 42 additions & 27 deletions

File tree

MAINTAINERS

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8628,8 +8628,14 @@ F: drivers/gpu/drm/lima/
86288628
F: include/uapi/drm/lima_drm.h
86298629

86308630
DRM DRIVERS FOR LOONGSON
8631+
M: Jianmin Lv <[email protected]>
8632+
M: Qianhai Wu <[email protected]>
8633+
R: Huacai Chen <[email protected]>
8634+
R: Mingcong Bai <[email protected]>
8635+
R: Xi Ruoyao <[email protected]>
8636+
R: Icenowy Zheng <[email protected]>
86318637
8632-
S: Orphan
8638+
S: Maintained
86338639
T: git https://gitlab.freedesktop.org/drm/misc/kernel.git
86348640
F: drivers/gpu/drm/loongson/
86358641

drivers/accel/ivpu/ivpu_drv.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
#define IVPU_HW_IP_60XX 60
3636

3737
#define IVPU_HW_IP_REV_LNL_B0 4
38+
#define IVPU_HW_IP_REV_NVL_A0 0
3839

3940
#define IVPU_HW_BTRS_MTL 1
4041
#define IVPU_HW_BTRS_LNL 2

drivers/accel/ivpu/ivpu_hw.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,10 @@ static void wa_init(struct ivpu_device *vdev)
7070
if (ivpu_hw_btrs_gen(vdev) == IVPU_HW_BTRS_MTL)
7171
vdev->wa.interrupt_clear_with_0 = ivpu_hw_btrs_irqs_clear_with_0_mtl(vdev);
7272

73-
if (ivpu_device_id(vdev) == PCI_DEVICE_ID_LNL &&
74-
ivpu_revision(vdev) < IVPU_HW_IP_REV_LNL_B0)
73+
if ((ivpu_device_id(vdev) == PCI_DEVICE_ID_LNL &&
74+
ivpu_revision(vdev) < IVPU_HW_IP_REV_LNL_B0) ||
75+
(ivpu_device_id(vdev) == PCI_DEVICE_ID_NVL &&
76+
ivpu_revision(vdev) == IVPU_HW_IP_REV_NVL_A0))
7577
vdev->wa.disable_clock_relinquish = true;
7678

7779
if (ivpu_test_mode & IVPU_TEST_MODE_CLK_RELINQ_ENABLE)

drivers/gpu/drm/drm_gem_shmem_helper.c

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -550,27 +550,27 @@ int drm_gem_shmem_dumb_create(struct drm_file *file, struct drm_device *dev,
550550
}
551551
EXPORT_SYMBOL_GPL(drm_gem_shmem_dumb_create);
552552

553-
static bool drm_gem_shmem_try_map_pmd(struct vm_fault *vmf, unsigned long addr,
554-
struct page *page)
553+
static vm_fault_t try_insert_pfn(struct vm_fault *vmf, unsigned int order,
554+
unsigned long pfn)
555555
{
556+
if (!order) {
557+
return vmf_insert_pfn(vmf->vma, vmf->address, pfn);
556558
#ifdef CONFIG_ARCH_SUPPORTS_PMD_PFNMAP
557-
unsigned long pfn = page_to_pfn(page);
558-
unsigned long paddr = pfn << PAGE_SHIFT;
559-
bool aligned = (addr & ~PMD_MASK) == (paddr & ~PMD_MASK);
560-
561-
if (aligned &&
562-
pmd_none(*vmf->pmd) &&
563-
folio_test_pmd_mappable(page_folio(page))) {
564-
pfn &= PMD_MASK >> PAGE_SHIFT;
565-
if (vmf_insert_pfn_pmd(vmf, pfn, false) == VM_FAULT_NOPAGE)
566-
return true;
567-
}
559+
} else if (order == PMD_ORDER) {
560+
unsigned long paddr = pfn << PAGE_SHIFT;
561+
bool aligned = (vmf->address & ~PMD_MASK) == (paddr & ~PMD_MASK);
562+
563+
if (aligned &&
564+
folio_test_pmd_mappable(page_folio(pfn_to_page(pfn)))) {
565+
pfn &= PMD_MASK >> PAGE_SHIFT;
566+
return vmf_insert_pfn_pmd(vmf, pfn, false);
567+
}
568568
#endif
569-
570-
return false;
569+
}
570+
return VM_FAULT_FALLBACK;
571571
}
572572

573-
static vm_fault_t drm_gem_shmem_fault(struct vm_fault *vmf)
573+
static vm_fault_t drm_gem_shmem_any_fault(struct vm_fault *vmf, unsigned int order)
574574
{
575575
struct vm_area_struct *vma = vmf->vma;
576576
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)
581581
pgoff_t page_offset;
582582
unsigned long pfn;
583583

584+
if (order && order != PMD_ORDER)
585+
return VM_FAULT_FALLBACK;
586+
584587
/* Offset to faulty address in the VMA. */
585588
page_offset = vmf->pgoff - vma->vm_pgoff;
586589

@@ -593,20 +596,20 @@ static vm_fault_t drm_gem_shmem_fault(struct vm_fault *vmf)
593596
goto out;
594597
}
595598

596-
if (drm_gem_shmem_try_map_pmd(vmf, vmf->address, pages[page_offset])) {
597-
ret = VM_FAULT_NOPAGE;
598-
goto out;
599-
}
600-
601599
pfn = page_to_pfn(pages[page_offset]);
602-
ret = vmf_insert_pfn(vma, vmf->address, pfn);
600+
ret = try_insert_pfn(vmf, order, pfn);
603601

604602
out:
605603
dma_resv_unlock(shmem->base.resv);
606604

607605
return ret;
608606
}
609607

608+
static vm_fault_t drm_gem_shmem_fault(struct vm_fault *vmf)
609+
{
610+
return drm_gem_shmem_any_fault(vmf, 0);
611+
}
612+
610613
static void drm_gem_shmem_vm_open(struct vm_area_struct *vma)
611614
{
612615
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)
643646

644647
const struct vm_operations_struct drm_gem_shmem_vm_ops = {
645648
.fault = drm_gem_shmem_fault,
649+
#ifdef CONFIG_ARCH_SUPPORTS_PMD_PFNMAP
650+
.huge_fault = drm_gem_shmem_any_fault,
651+
#endif
646652
.open = drm_gem_shmem_vm_open,
647653
.close = drm_gem_shmem_vm_close,
648654
};

drivers/gpu/drm/drm_syncobj.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -602,7 +602,7 @@ int drm_syncobj_get_handle(struct drm_file *file_private,
602602
drm_syncobj_get(syncobj);
603603

604604
ret = xa_alloc(&file_private->syncobj_xa, handle, syncobj, xa_limit_32b,
605-
GFP_NOWAIT);
605+
GFP_KERNEL);
606606
if (ret)
607607
drm_syncobj_put(syncobj);
608608

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

718718
ret = xa_alloc(&file_private->syncobj_xa, handle, syncobj, xa_limit_32b,
719-
GFP_NOWAIT);
719+
GFP_KERNEL);
720720
if (ret)
721721
drm_syncobj_put(syncobj);
722722

0 commit comments

Comments
 (0)