From 28a2bb46e849fbcbe2149c1f9bb0c7f5e1d88edf Mon Sep 17 00:00:00 2001 From: Stanislav Vorobiov Date: Fri, 14 Mar 2014 17:45:37 +0400 Subject: [PATCH] VIGS: Fixed for kernel 3.12 Change-Id: Ic4ae0c0dea0e9901c5f648e1b215fd82d26cc3b2 --- drivers/gpu/drm/vigs/vigs_crtc.c | 12 ++-- drivers/gpu/drm/vigs/vigs_device.c | 31 ++++++----- drivers/gpu/drm/vigs/vigs_driver.c | 15 ++--- drivers/gpu/drm/vigs/vigs_execbuffer.c | 9 ++- drivers/gpu/drm/vigs/vigs_fbdev.c | 76 ++++++++++++++++++++++++-- drivers/gpu/drm/vigs/vigs_fence.c | 2 +- drivers/gpu/drm/vigs/vigs_gem.c | 17 +++--- drivers/gpu/drm/vigs/vigs_gem.h | 2 +- drivers/gpu/drm/vigs/vigs_mman.c | 25 ++++++--- drivers/gpu/drm/vigs/vigs_output.c | 2 +- drivers/gpu/drm/vigs/vigs_plane.c | 4 +- 11 files changed, 128 insertions(+), 67 deletions(-) diff --git a/drivers/gpu/drm/vigs/vigs_crtc.c b/drivers/gpu/drm/vigs/vigs_crtc.c index fed194a91d7e..dbc3487fc5b1 100644 --- a/drivers/gpu/drm/vigs/vigs_crtc.c +++ b/drivers/gpu/drm/vigs/vigs_crtc.c @@ -41,8 +41,7 @@ retry: * and with small amount of VRAM memory it's possible that * GEM pin will be failing for some time, thus, framebuffer pin * will be failing. This is unavoidable with current TTM design, - * even though ttm_bo_validate has 'no_wait_reserve' parameter it's - * always assumed that it's true, thus, if someone is intensively + * thus, if someone is intensively * reserves/unreserves GEMs then ttm_bo_validate can fail even if there * is free space in a placement. Even worse, ttm_bo_validate fails with * ENOMEM so it's not possible to tell if it's a temporary failure due @@ -51,10 +50,6 @@ retry: * is relatively safe since we only pin GEMs on pageflip and user * should have started the VM with VRAM size equal to at least 3 frames, * thus, 2 frame will always be free and we can always pin 1 frame. - * - * Also, 'no_wait_reserve' parameter is completely removed in future - * kernels with this commit: - * https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=97a875cbdf89a4638eea57c2b456c7cc4e3e8b21 */ cpu_relax(); goto retry; @@ -170,7 +165,7 @@ static void vigs_crtc_dpms(struct drm_crtc *crtc, int mode) } static bool vigs_crtc_mode_fixup(struct drm_crtc *crtc, - struct drm_display_mode *mode, + const struct drm_display_mode *mode, struct drm_display_mode *adjusted_mode) { DRM_DEBUG_KMS("enter\n"); @@ -235,7 +230,8 @@ static int vigs_crtc_cursor_move(struct drm_crtc *crtc, int x, int y) static int vigs_crtc_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb, - struct drm_pending_vblank_event *event) + struct drm_pending_vblank_event *event, + uint32_t page_flip_flags) { unsigned long flags; struct vigs_device *vigs_dev = crtc->dev->dev_private; diff --git a/drivers/gpu/drm/vigs/vigs_device.c b/drivers/gpu/drm/vigs/vigs_device.c index 74bf36c99779..14b64187a224 100644 --- a/drivers/gpu/drm/vigs/vigs_device.c +++ b/drivers/gpu/drm/vigs/vigs_device.c @@ -20,14 +20,16 @@ static void vigs_device_mman_vram_to_gpu(void *user_data, bool need_gpu_update = vigs_surface_need_gpu_update(vigs_sfc); if (!vigs_sfc->is_gpu_dirty && need_gpu_update) { - DRM_INFO("vram_to_gpu: 0x%llX\n", bo->addr_space_offset); + DRM_INFO("vram_to_gpu: 0x%llX\n", + drm_vma_node_offset_addr(&bo->vma_node)); vigs_comm_update_gpu(vigs_dev->comm, vigs_sfc->id, vigs_sfc->width, vigs_sfc->height, vigs_gem_offset(vigs_gem)); } else { - DRM_INFO("vram_to_gpu: 0x%llX (no-op)\n", bo->addr_space_offset); + DRM_INFO("vram_to_gpu: 0x%llX (no-op)\n", + drm_vma_node_offset_addr(&bo->vma_node)); } vigs_sfc->is_gpu_dirty = false; @@ -42,12 +44,14 @@ static void vigs_device_mman_gpu_to_vram(void *user_data, struct vigs_surface *vigs_sfc = vigs_gem_to_vigs_surface(vigs_gem); if (vigs_surface_need_vram_update(vigs_sfc)) { - DRM_DEBUG_DRIVER("0x%llX\n", bo->addr_space_offset); + DRM_DEBUG_DRIVER("0x%llX\n", + drm_vma_node_offset_addr(&bo->vma_node)); vigs_comm_update_vram(vigs_dev->comm, vigs_sfc->id, new_offset); } else { - DRM_DEBUG_DRIVER("0x%llX (no-op)\n", bo->addr_space_offset); + DRM_DEBUG_DRIVER("0x%llX (no-op)\n", + drm_vma_node_offset_addr(&bo->vma_node)); } } @@ -283,24 +287,21 @@ int vigs_device_add_surface(struct vigs_device *vigs_dev, struct vigs_surface *sfc, vigsp_surface_id* id) { - int ret, tmp_id = 0; + int ret; mutex_lock(&vigs_dev->surface_idr_mutex); - do { - if (unlikely(idr_pre_get(&vigs_dev->surface_idr, GFP_KERNEL) == 0)) { - mutex_unlock(&vigs_dev->surface_idr_mutex); - return -ENOMEM; - } + ret = idr_alloc(&vigs_dev->surface_idr, sfc, 1, 0, GFP_KERNEL); - ret = idr_get_new_above(&vigs_dev->surface_idr, sfc, 1, &tmp_id); - } while (ret == -EAGAIN); + mutex_unlock(&vigs_dev->surface_idr_mutex); - *id = tmp_id; + if (ret < 0) { + return ret; + } - mutex_unlock(&vigs_dev->surface_idr_mutex); + *id = ret; - return ret; + return 0; } void vigs_device_remove_surface(struct vigs_device *vigs_dev, diff --git a/drivers/gpu/drm/vigs/vigs_driver.c b/drivers/gpu/drm/vigs/vigs_driver.c index 342911e3dae2..110ba4d6415a 100644 --- a/drivers/gpu/drm/vigs/vigs_driver.c +++ b/drivers/gpu/drm/vigs/vigs_driver.c @@ -10,8 +10,7 @@ #include "vigs_file.h" #include "vigs_plane.h" #include "vigs_mman.h" -#include "drmP.h" -#include "drm.h" +#include #include #include @@ -24,7 +23,7 @@ #define DRIVER_MAJOR DRM_VIGS_DRIVER_VERSION #define DRIVER_MINOR 0 -static struct pci_device_id vigs_pci_table[] __devinitdata = +static struct pci_device_id vigs_pci_table[] = { { .vendor = PCI_VENDOR_ID_VIGS, @@ -77,7 +76,6 @@ static const struct file_operations vigs_drm_driver_fops = .release = drm_release, .unlocked_ioctl = drm_ioctl, .poll = drm_poll, - .fasync = drm_fasync, .mmap = vigs_device_mmap, .read = drm_read }; @@ -142,10 +140,7 @@ static int vigs_drm_open(struct drm_device *dev, struct drm_file *file_priv) file_priv->driver_priv = vigs_file; - if (unlikely(vigs_dev->mman->bo_dev.dev_mapping == NULL)) { - vigs_dev->mman->bo_dev.dev_mapping = - file_priv->filp->f_path.dentry->d_inode->i_mapping; - } + vigs_dev->mman->bo_dev.dev_mapping = dev->dev_mapping; return 0; } @@ -229,7 +224,7 @@ static struct drm_driver vigs_drm_driver = .minor = DRIVER_MINOR, }; -static int __devinit vigs_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) +static int vigs_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { return drm_get_pci_dev(pdev, ent, &vigs_drm_driver); } @@ -246,7 +241,7 @@ static struct pci_driver vigs_pci_driver = .name = DRIVER_NAME, .id_table = vigs_pci_table, .probe = vigs_pci_probe, - .remove = __devexit_p(vigs_pci_remove), + .remove = vigs_pci_remove, }; int vigs_driver_register(void) diff --git a/drivers/gpu/drm/vigs/vigs_execbuffer.c b/drivers/gpu/drm/vigs/vigs_execbuffer.c index 32b508aed5fb..db73cdbb66df 100644 --- a/drivers/gpu/drm/vigs/vigs_execbuffer.c +++ b/drivers/gpu/drm/vigs/vigs_execbuffer.c @@ -30,7 +30,6 @@ static int vigs_execbuffer_validate_buffer(struct vigs_device *vigs_dev, return -EINVAL; } - buffer->base.new_sync_obj_arg = NULL; buffer->base.bo = &sfc->gem.bo; buffer->cmd = cmd; buffer->which = which; @@ -409,6 +408,7 @@ int vigs_execbuffer_exec_ioctl(struct drm_device *drm_dev, struct drm_gem_object *gem; struct vigs_gem_object *vigs_gem; struct vigs_execbuffer *execbuffer; + struct ww_acquire_ctx ticket; struct list_head list; struct vigs_validate_buffer *buffers; int num_buffers = 0; @@ -462,17 +462,16 @@ int vigs_execbuffer_exec_ioctl(struct drm_device *drm_dev, if (list_empty(&list)) { vigs_comm_exec(vigs_dev->comm, execbuffer); } else { - ret = ttm_eu_reserve_buffers(&list); + ret = ttm_eu_reserve_buffers(&ticket, &list); if (ret != 0) { - ttm_eu_backoff_reservation(&list); goto out3; } ret = vigs_fence_create(vigs_dev->fenceman, &fence); if (ret != 0) { - ttm_eu_backoff_reservation(&list); + ttm_eu_backoff_reservation(&ticket, &list); goto out3; } @@ -482,7 +481,7 @@ int vigs_execbuffer_exec_ioctl(struct drm_device *drm_dev, vigs_comm_exec(vigs_dev->comm, execbuffer); - ttm_eu_fence_buffer_objects(&list, fence); + ttm_eu_fence_buffer_objects(&ticket, &list, fence); if (sync) { vigs_fence_wait(fence, false); diff --git a/drivers/gpu/drm/vigs/vigs_fbdev.c b/drivers/gpu/drm/vigs/vigs_fbdev.c index e1bad3826bfb..ba6176ecca68 100644 --- a/drivers/gpu/drm/vigs/vigs_fbdev.c +++ b/drivers/gpu/drm/vigs/vigs_fbdev.c @@ -12,6 +12,29 @@ * @{ */ +static bool vigs_fbdev_helper_is_bound(struct drm_fb_helper *fb_helper) +{ + struct drm_device *dev = fb_helper->dev; + struct drm_crtc *crtc; + int bound = 0, crtcs_bound = 0; + + list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { + if (crtc->fb) { + crtcs_bound++; + } + + if (crtc->fb == fb_helper->fb) { + bound++; + } + } + + if (bound < crtcs_bound) { + return false; + } + + return true; +} + static int vigs_fbdev_setcolreg(struct drm_crtc *crtc, u16 red, u16 green, u16 blue, u16 regno, struct fb_info *fbi) { @@ -41,6 +64,15 @@ static int vigs_fbdev_setcolreg(struct drm_crtc *crtc, u16 red, u16 green, return 0; } + /* + * The driver really shouldn't advertise pseudo/directcolor + * visuals if it can't deal with the palette. + */ + if (WARN_ON(!fb_helper->funcs->gamma_set || + !fb_helper->funcs->gamma_get)) { + return -EINVAL; + } + pindex = regno; if (fb->bits_per_pixel == 16) { @@ -87,12 +119,19 @@ static int vigs_fbdev_setcolreg(struct drm_crtc *crtc, u16 red, u16 green, static int vigs_fbdev_setcmap(struct fb_cmap *cmap, struct fb_info *fbi) { struct drm_fb_helper *fb_helper = fbi->par; + struct drm_device *dev = fb_helper->dev; struct drm_crtc_helper_funcs *crtc_funcs; u16 *red, *green, *blue, *transp; struct drm_crtc *crtc; int i, j, ret = 0; int start; + drm_modeset_lock_all(dev); + if (!vigs_fbdev_helper_is_bound(fb_helper)) { + drm_modeset_unlock_all(dev); + return -EBUSY; + } + for (i = 0; i < fb_helper->crtc_count; i++) { crtc = fb_helper->crtc_info[i].mode_set.crtc; crtc_funcs = crtc->helper_private; @@ -117,13 +156,17 @@ static int vigs_fbdev_setcmap(struct fb_cmap *cmap, struct fb_info *fbi) ret = vigs_fbdev_setcolreg(crtc, hred, hgreen, hblue, start++, fbi); if (ret != 0) { - return ret; + goto out; } } - crtc_funcs->load_lut(crtc); + if (crtc_funcs->load_lut) { + crtc_funcs->load_lut(crtc); + } } + out: + drm_modeset_unlock_all(dev); return ret; } @@ -151,10 +194,23 @@ static void vigs_fbdev_dpms(struct fb_info *fbi, int dpms_mode) struct drm_connector *connector; int i, j; + /* + * fbdev->blank can be called from irq context in case of a panic. + * Since we already have our own special panic handler which will + * restore the fbdev console mode completely, just bail out early. + */ + if (oops_in_progress) { + return; + } + /* * For each CRTC in this fb, turn the connectors on/off. */ - mutex_lock(&dev->mode_config.mutex); + drm_modeset_lock_all(dev); + if (!vigs_fbdev_helper_is_bound(fb_helper)) { + drm_modeset_unlock_all(dev); + return; + } for (i = 0; i < fb_helper->crtc_count; i++) { crtc = fb_helper->crtc_info[i].mode_set.crtc; @@ -169,15 +225,15 @@ static void vigs_fbdev_dpms(struct fb_info *fbi, int dpms_mode) /* Walk the connectors & encoders on this fb turning them on/off */ for (j = 0; j < fb_helper->connector_count; j++) { connector = fb_helper->connector_info[j]->connector; - drm_helper_connector_dpms(connector, dpms_mode); - drm_connector_property_set_value(connector, + connector->funcs->dpms(connector, dpms_mode); + drm_object_property_set_value(&connector->base, dev->mode_config.dpms_property, dpms_mode); } vigs_crtc->in_fb_blank = false; } - mutex_unlock(&dev->mode_config.mutex); + drm_modeset_unlock_all(dev); } /* @@ -456,6 +512,7 @@ fail1: void vigs_fbdev_destroy(struct vigs_fbdev *vigs_fbdev) { struct fb_info *fbi = vigs_fbdev->base.fbdev; + struct drm_framebuffer *fb; DRM_DEBUG_KMS("enter\n"); @@ -465,12 +522,17 @@ void vigs_fbdev_destroy(struct vigs_fbdev *vigs_fbdev) framebuffer_release(fbi); } + fb = vigs_fbdev->base.fb; + drm_fb_helper_fini(&vigs_fbdev->base); if (vigs_fbdev->kptr) { iounmap(vigs_fbdev->kptr); } + drm_framebuffer_unregister_private(fb); + drm_framebuffer_remove(fb); + kfree(vigs_fbdev); } @@ -485,5 +547,7 @@ void vigs_fbdev_restore_mode(struct vigs_fbdev *vigs_fbdev) { DRM_DEBUG_KMS("enter\n"); + drm_modeset_lock_all(vigs_fbdev->base.dev); drm_fb_helper_restore_fbdev_mode(&vigs_fbdev->base); + drm_modeset_unlock_all(vigs_fbdev->base.dev); } diff --git a/drivers/gpu/drm/vigs/vigs_fence.c b/drivers/gpu/drm/vigs/vigs_fence.c index fbbfe14d507f..8a9b34993919 100644 --- a/drivers/gpu/drm/vigs/vigs_fence.c +++ b/drivers/gpu/drm/vigs/vigs_fence.c @@ -20,7 +20,7 @@ static void vigs_user_fence_destroy(struct vigs_fence *fence) struct vigs_user_fence *user_fence = vigs_fence_to_vigs_user_fence(fence); vigs_fence_cleanup(&user_fence->fence); - kfree(user_fence); + ttm_base_object_kfree(user_fence, base); } static void vigs_fence_release_locked(struct kref *kref) diff --git a/drivers/gpu/drm/vigs/vigs_gem.c b/drivers/gpu/drm/vigs/vigs_gem.c index a983627c9c8d..1a15b043e8fb 100644 --- a/drivers/gpu/drm/vigs/vigs_gem.c +++ b/drivers/gpu/drm/vigs/vigs_gem.c @@ -72,8 +72,8 @@ int vigs_gem_init(struct vigs_gem_object *vigs_gem, } ret = ttm_bo_init(&vigs_dev->mman->bo_dev, &vigs_gem->bo, size, bo_type, - &placement, 0, 0, - false, NULL, 0, + &placement, 0, + false, NULL, 0, NULL, &vigs_gem_bo_destroy); if (ret != 0) { @@ -126,7 +126,7 @@ int vigs_gem_pin(struct vigs_gem_object *vigs_gem) placement.num_placement = 1; placement.num_busy_placement = 1; - ret = ttm_bo_validate(&vigs_gem->bo, &placement, false, true, false); + ret = ttm_bo_validate(&vigs_gem->bo, &placement, false, false); if (ret != 0) { DRM_ERROR("GEM pin failed (type = %u, off = 0x%llX, sz = %lu)\n", @@ -176,7 +176,7 @@ void vigs_gem_unpin(struct vigs_gem_object *vigs_gem) placement.num_placement = 2; placement.num_busy_placement = 2; - ret = ttm_bo_validate(&vigs_gem->bo, &placement, false, true, false); + ret = ttm_bo_validate(&vigs_gem->bo, &placement, false, false); if (ret != 0) { DRM_ERROR("GEM unpin failed (type = %u, off = 0x%llX, sz = %lu)\n", @@ -302,7 +302,7 @@ int vigs_gem_map_ioctl(struct drm_device *drm_dev, struct drm_gem_object *gem; struct vigs_gem_object *vigs_gem; struct mm_struct *mm = current->mm; - unsigned long address; + unsigned long address, unused; gem = drm_gem_object_lookup(drm_dev, file_priv, args->handle); @@ -319,16 +319,13 @@ int vigs_gem_map_ioctl(struct drm_device *drm_dev, * 'do_mmap' takes an offset in bytes and our * offset is 64-bit (since it's TTM offset) and it can't fit into 32-bit * variable. - * For this to work we had to export - * 'do_mmap_pgoff'. 'do_mmap_pgoff' was exported prior to - * 3.4 and it's available after 3.5, but for some reason it's - * static in 3.4. */ vigs_dev->track_gem_access = args->track_access; address = do_mmap_pgoff(file_priv->filp, 0, vigs_gem_size(vigs_gem), PROT_READ | PROT_WRITE, MAP_SHARED, - vigs_gem_mmap_offset(vigs_gem) >> PAGE_SHIFT); + vigs_gem_mmap_offset(vigs_gem) >> PAGE_SHIFT, + &unused); vigs_dev->track_gem_access = false; up_write(&mm->mmap_sem); diff --git a/drivers/gpu/drm/vigs/vigs_gem.h b/drivers/gpu/drm/vigs/vigs_gem.h index ccfbff70ac7a..dd8d8d187e59 100644 --- a/drivers/gpu/drm/vigs/vigs_gem.h +++ b/drivers/gpu/drm/vigs/vigs_gem.h @@ -102,7 +102,7 @@ static inline unsigned long vigs_gem_offset(struct vigs_gem_object *vigs_gem) */ static inline u64 vigs_gem_mmap_offset(struct vigs_gem_object *vigs_gem) { - return vigs_gem->bo.addr_space_offset; + return drm_vma_node_offset_addr(&vigs_gem->bo.vma_node); } static inline void vigs_gem_reserve(struct vigs_gem_object *vigs_gem) diff --git a/drivers/gpu/drm/vigs/vigs_mman.c b/drivers/gpu/drm/vigs/vigs_mman.c index 02e4af3ca58a..5e6000ef298d 100644 --- a/drivers/gpu/drm/vigs/vigs_mman.c +++ b/drivers/gpu/drm/vigs/vigs_mman.c @@ -119,6 +119,7 @@ static void vigs_ttm_backend_destroy(struct ttm_tt *tt) { struct ttm_dma_tt *dma_tt = (void*)tt; + ttm_dma_tt_fini(dma_tt); kfree(dma_tt); } @@ -134,6 +135,7 @@ static struct ttm_tt *vigs_ttm_tt_create(struct ttm_bo_device *bo_dev, struct page *dummy_read_page) { struct ttm_dma_tt *dma_tt; + int ret; dma_tt = kzalloc(sizeof(struct ttm_dma_tt), GFP_KERNEL); @@ -144,6 +146,15 @@ static struct ttm_tt *vigs_ttm_tt_create(struct ttm_bo_device *bo_dev, dma_tt->ttm.func = &vigs_ttm_backend_func; + ret = ttm_dma_tt_init(dma_tt, bo_dev, size, page_flags, + dummy_read_page); + + if (ret != 0) { + DRM_ERROR("ttm_dma_tt_init failed: %d\n", ret); + kfree(dma_tt); + return NULL; + } + return &dma_tt->ttm; } @@ -226,7 +237,6 @@ static void vigs_ttm_evict_flags(struct ttm_buffer_object *bo, static int vigs_ttm_move(struct ttm_buffer_object *bo, bool evict, bool interruptible, - bool no_wait_reserve, bool no_wait_gpu, struct ttm_mem_reg *new_mem) { @@ -256,7 +266,7 @@ static int vigs_ttm_move(struct ttm_buffer_object *bo, return 0; } else { - return ttm_bo_move_memcpy(bo, evict, no_wait_reserve, no_wait_gpu, new_mem); + return ttm_bo_move_memcpy(bo, evict, no_wait_gpu, new_mem); } } @@ -266,21 +276,19 @@ static int vigs_ttm_verify_access(struct ttm_buffer_object *bo, return 0; } -static bool vigs_ttm_sync_obj_signaled(void *sync_obj, void *sync_arg) +static bool vigs_ttm_sync_obj_signaled(void *sync_obj) { return vigs_fence_signaled((struct vigs_fence*)sync_obj); } static int vigs_ttm_sync_obj_wait(void *sync_obj, - void *sync_arg, bool lazy, bool interruptible) { return vigs_fence_wait((struct vigs_fence*)sync_obj, interruptible); } -static int vigs_ttm_sync_obj_flush(void *sync_obj, - void *sync_arg) +static int vigs_ttm_sync_obj_flush(void *sync_obj) { return 0; } @@ -325,10 +333,11 @@ static int vigs_ttm_fault_reserve_notify(struct ttm_buffer_object *bo) placement.num_placement = 1; placement.num_busy_placement = 1; - ret = ttm_bo_validate(bo, &placement, false, true, false); + ret = ttm_bo_validate(bo, &placement, false, false); if (ret != 0) { - DRM_ERROR("movement failed for 0x%llX\n", bo->addr_space_offset); + DRM_ERROR("movement failed for 0x%llX\n", + drm_vma_node_offset_addr(&bo->vma_node)); return ret; } diff --git a/drivers/gpu/drm/vigs/vigs_output.c b/drivers/gpu/drm/vigs/vigs_output.c index 28984813bf5c..fffcb709da82 100644 --- a/drivers/gpu/drm/vigs/vigs_output.c +++ b/drivers/gpu/drm/vigs/vigs_output.c @@ -140,7 +140,7 @@ static void vigs_encoder_dpms(struct drm_encoder *encoder, int mode) } static bool vigs_encoder_mode_fixup(struct drm_encoder *encoder, - struct drm_display_mode *mode, + const struct drm_display_mode *mode, struct drm_display_mode *adjusted_mode) { DRM_DEBUG_KMS("enter\n"); diff --git a/drivers/gpu/drm/vigs/vigs_plane.c b/drivers/gpu/drm/vigs/vigs_plane.c index 7d6aad7a3ce1..f7f06711f0fa 100644 --- a/drivers/gpu/drm/vigs/vigs_plane.c +++ b/drivers/gpu/drm/vigs/vigs_plane.c @@ -177,7 +177,7 @@ int vigs_plane_set_zpos_ioctl(struct drm_device *drm_dev, struct vigs_plane *vigs_plane; int ret; - mutex_lock(&drm_dev->mode_config.mutex); + drm_modeset_lock_all(drm_dev); obj = drm_mode_object_find(drm_dev, args->plane_id, @@ -195,7 +195,7 @@ int vigs_plane_set_zpos_ioctl(struct drm_device *drm_dev, ret = 0; out: - mutex_unlock(&drm_dev->mode_config.mutex); + drm_modeset_unlock_all(drm_dev); return ret; } -- 2.34.1