drm: IRQ midlayer is now legacy
authorThomas Zimmermann <tzimmermann@suse.de>
Fri, 25 Jun 2021 13:50:33 +0000 (15:50 +0200)
committerThomas Zimmermann <tzimmermann@suse.de>
Tue, 10 Aug 2021 18:14:01 +0000 (20:14 +0200)
Hide the DRM midlayer behind CONFIG_DRM_LEGACY, make functions use
the prefix drm_legacy_, and move declarations to drm_legacy.h.
In struct drm_device, move the fields irq and irq_enabled behind
CONFIG_DRM_LEGACY.

All callers have been updated.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Acked-by: Sam Ravnborg <sam@ravnborg.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20210803090704.32152-15-tzimmermann@suse.de
12 files changed:
drivers/gpu/drm/drm_irq.c
drivers/gpu/drm/drm_legacy_misc.c
drivers/gpu/drm/drm_vblank.c
drivers/gpu/drm/i810/i810_dma.c
drivers/gpu/drm/mga/mga_dma.c
drivers/gpu/drm/mga/mga_drv.h
drivers/gpu/drm/r128/r128_cce.c
drivers/gpu/drm/via/via_mm.c
include/drm/drm_device.h
include/drm/drm_drv.h
include/drm/drm_irq.h [deleted file]
include/drm/drm_legacy.h

index 4a13d2fc5252b92a8648fc663a8e9c54f972fc15..13e1d5c4ec8209d6b8028ff9279d5d4583a4506b 100644 (file)
 #include <drm/drm.h>
 #include <drm/drm_device.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_irq.h>
+#include <drm/drm_legacy.h>
 #include <drm/drm_print.h>
 #include <drm/drm_vblank.h>
 
 #include "drm_internal.h"
 
-/**
- * DOC: irq helpers
- *
- * The DRM core provides very simple support helpers to enable IRQ handling on a
- * device through the drm_irq_install() and drm_irq_uninstall() functions. This
- * only supports devices with a single interrupt on the main device stored in
- * &drm_device.dev and set as the device parameter in drm_dev_alloc().
- *
- * These IRQ helpers are strictly optional. Since these helpers don't automatically
- * clean up the requested interrupt like e.g. devm_request_irq() they're not really
- * recommended.
- */
-
-/**
- * drm_irq_install - install IRQ handler
- * @dev: DRM device
- * @irq: IRQ number to install the handler for
- *
- * Initializes the IRQ related data. Installs the handler, calling the driver
- * &drm_driver.irq_preinstall and &drm_driver.irq_postinstall functions before
- * and after the installation.
- *
- * This is the simplified helper interface provided for drivers with no special
- * needs.
- *
- * @irq must match the interrupt number that would be passed to request_irq(),
- * if called directly instead of using this helper function.
- *
- * &drm_driver.irq_handler is called to handle the registered interrupt.
- *
- * Returns:
- * Zero on success or a negative error code on failure.
- */
-int drm_irq_install(struct drm_device *dev, int irq)
+#if IS_ENABLED(CONFIG_DRM_LEGACY)
+static int drm_legacy_irq_install(struct drm_device *dev, int irq)
 {
        int ret;
        unsigned long sh_flags = 0;
@@ -144,24 +112,8 @@ int drm_irq_install(struct drm_device *dev, int irq)
 
        return ret;
 }
-EXPORT_SYMBOL(drm_irq_install);
 
-/**
- * drm_irq_uninstall - uninstall the IRQ handler
- * @dev: DRM device
- *
- * Calls the driver's &drm_driver.irq_uninstall function and unregisters the IRQ
- * handler.  This should only be called by drivers which used drm_irq_install()
- * to set up their interrupt handler.
- *
- * Note that for kernel modesetting drivers it is a bug if this function fails.
- * The sanity checks are only to catch buggy user modesetting drivers which call
- * the same function through an ioctl.
- *
- * Returns:
- * Zero on success or a negative error code on failure.
- */
-int drm_irq_uninstall(struct drm_device *dev)
+int drm_legacy_irq_uninstall(struct drm_device *dev)
 {
        unsigned long irqflags;
        bool irq_enabled;
@@ -207,9 +159,8 @@ int drm_irq_uninstall(struct drm_device *dev)
 
        return 0;
 }
-EXPORT_SYMBOL(drm_irq_uninstall);
+EXPORT_SYMBOL(drm_legacy_irq_uninstall);
 
-#if IS_ENABLED(CONFIG_DRM_LEGACY)
 int drm_legacy_irq_control(struct drm_device *dev, void *data,
                           struct drm_file *file_priv)
 {
@@ -238,13 +189,13 @@ int drm_legacy_irq_control(struct drm_device *dev, void *data,
                    ctl->irq != irq)
                        return -EINVAL;
                mutex_lock(&dev->struct_mutex);
-               ret = drm_irq_install(dev, irq);
+               ret = drm_legacy_irq_install(dev, irq);
                mutex_unlock(&dev->struct_mutex);
 
                return ret;
        case DRM_UNINST_HANDLER:
                mutex_lock(&dev->struct_mutex);
-               ret = drm_irq_uninstall(dev);
+               ret = drm_legacy_irq_uninstall(dev);
                mutex_unlock(&dev->struct_mutex);
 
                return ret;
index 83db43b7a25e7beb5b598664f601284a2d58e2b9..d4c5434062d7c35164ef0561f5a15933980d2977 100644 (file)
@@ -35,7 +35,6 @@
 
 #include <drm/drm_device.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_irq.h>
 #include <drm/drm_print.h>
 
 #include "drm_internal.h"
@@ -78,7 +77,7 @@ int drm_legacy_setup(struct drm_device * dev)
 void drm_legacy_dev_reinit(struct drm_device *dev)
 {
        if (dev->irq_enabled)
-               drm_irq_uninstall(dev);
+               drm_legacy_irq_uninstall(dev);
 
        mutex_lock(&dev->struct_mutex);
 
index 977b6509bb4b5994239d7ab0f5d2d7fd91af8ef1..b701cda86d0c909fd59c02b82204ab0c7212166e 100644 (file)
@@ -1739,10 +1739,10 @@ static void drm_wait_vblank_reply(struct drm_device *dev, unsigned int pipe,
 
 static bool drm_wait_vblank_supported(struct drm_device *dev)
 {
-       if  (IS_ENABLED(CONFIG_DRM_LEGACY)) {
-               if (unlikely(drm_core_check_feature(dev, DRIVER_LEGACY)))
-                       return dev->irq_enabled;
-       }
+#if IS_ENABLED(CONFIG_DRM_LEGACY)
+       if (unlikely(drm_core_check_feature(dev, DRIVER_LEGACY)))
+               return dev->irq_enabled;
+#endif
        return drm_dev_has_vblank(dev);
 }
 
index d78c82af367c76a8e8c815535106e9e94309adb6..9fb4dd63342f3be5a0115fa476f8a5d3a037f224 100644 (file)
@@ -38,7 +38,6 @@
 #include <drm/drm_drv.h>
 #include <drm/drm_file.h>
 #include <drm/drm_ioctl.h>
-#include <drm/drm_irq.h>
 #include <drm/drm_print.h>
 #include <drm/i810_drm.h>
 
@@ -209,7 +208,7 @@ static int i810_dma_cleanup(struct drm_device *dev)
         * is freed, it's too late.
         */
        if (drm_core_check_feature(dev, DRIVER_HAVE_IRQ) && dev->irq_enabled)
-               drm_irq_uninstall(dev);
+               drm_legacy_irq_uninstall(dev);
 
        if (dev->dev_private) {
                int i;
index 403efc1f1a7cb55f31773acb0d5edf45942c1b11..331c2f0da57ae0df7fd323f7a2d6c8f6520f33ee 100644 (file)
@@ -949,7 +949,7 @@ static int mga_do_cleanup_dma(struct drm_device *dev, int full_cleanup)
         * is freed, it's too late.
         */
        if (dev->irq_enabled)
-               drm_irq_uninstall(dev);
+               drm_legacy_irq_uninstall(dev);
 
        if (dev->dev_private) {
                drm_mga_private_t *dev_priv = dev->dev_private;
index 84395d81ab9b05dc708904e6bf3d094fd2775423..f61401c70b903de93c4eb4621ca36f7021147e1e 100644 (file)
@@ -38,7 +38,6 @@
 #include <drm/drm_device.h>
 #include <drm/drm_file.h>
 #include <drm/drm_ioctl.h>
-#include <drm/drm_irq.h>
 #include <drm/drm_legacy.h>
 #include <drm/drm_print.h>
 #include <drm/drm_sarea.h>
index 2a2933c16308cccb38f731561c6239d7139d6f77..c04d84a69dd29e1387040fe06709fc0c05c997a1 100644 (file)
@@ -39,7 +39,6 @@
 
 #include <drm/drm_device.h>
 #include <drm/drm_file.h>
-#include <drm/drm_irq.h>
 #include <drm/drm_legacy.h>
 #include <drm/drm_print.h>
 #include <drm/r128_drm.h>
@@ -603,7 +602,7 @@ int r128_do_cleanup_cce(struct drm_device *dev)
         * is freed, it's too late.
         */
        if (dev->irq_enabled)
-               drm_irq_uninstall(dev);
+               drm_legacy_irq_uninstall(dev);
 
        if (dev->dev_private) {
                drm_r128_private_t *dev_priv = dev->dev_private;
index dae1bacd86c1eacb72886b62da0ab2921c8963f0..c9afa1a51f23aa4988f71d27e6aa957fd14e5e1f 100644 (file)
@@ -29,7 +29,6 @@
 
 #include <drm/drm_device.h>
 #include <drm/drm_file.h>
-#include <drm/drm_irq.h>
 #include <drm/via_drm.h>
 
 #include "via_drv.h"
@@ -86,7 +85,7 @@ int via_final_context(struct drm_device *dev, int context)
        /* Last context, perform cleanup */
        if (list_is_singular(&dev->ctxlist)) {
                DRM_DEBUG("Last Context\n");
-               drm_irq_uninstall(dev);
+               drm_legacy_irq_uninstall(dev);
                via_cleanup_futex(dev_priv);
                via_do_cleanup_map(dev);
        }
index f588f967bb1498df62cf7e2d338fcecbc0401ce5..604b1d1b2d7297a24cb44cf241445dee1a3aab0d 100644 (file)
@@ -191,20 +191,6 @@ struct drm_device {
         */
        struct list_head clientlist;
 
-       /**
-        * @irq_enabled:
-        *
-        * Indicates that interrupt handling is enabled, specifically vblank
-        * handling. Drivers which don't use drm_irq_install() need to set this
-        * to true manually.
-        */
-       bool irq_enabled;
-
-       /**
-        * @irq: Used by the drm_irq_install() and drm_irq_unistall() helpers.
-        */
-       int irq;
-
        /**
         * @vblank_disable_immediate:
         *
@@ -372,6 +358,10 @@ struct drm_device {
 
        /* Scatter gather memory */
        struct drm_sg_mem *sg;
+
+       /* IRQs */
+       bool irq_enabled;
+       int irq;
 #endif
 };
 
index b439ae1921b8cd0e0cb685c5d67b45d21b598e68..0cd95953cdf5516c31258d92ce8b15a7a7356dd8 100644 (file)
@@ -137,10 +137,6 @@ enum drm_driver_feature {
         * @DRIVER_HAVE_IRQ:
         *
         * Legacy irq support. Only for legacy drivers. Do not use.
-        *
-        * New drivers can either use the drm_irq_install() and
-        * drm_irq_uninstall() helper functions, or roll their own irq support
-        * code by calling request_irq() directly.
         */
        DRIVER_HAVE_IRQ                 = BIT(30),
        /**
@@ -271,42 +267,6 @@ struct drm_driver {
         */
        void (*release) (struct drm_device *);
 
-       /**
-        * @irq_handler:
-        *
-        * Interrupt handler called when using drm_irq_install(). Not used by
-        * drivers which implement their own interrupt handling.
-        */
-       irqreturn_t(*irq_handler) (int irq, void *arg);
-
-       /**
-        * @irq_preinstall:
-        *
-        * Optional callback used by drm_irq_install() which is called before
-        * the interrupt handler is registered. This should be used to clear out
-        * any pending interrupts (from e.g. firmware based drives) and reset
-        * the interrupt handling registers.
-        */
-       void (*irq_preinstall) (struct drm_device *dev);
-
-       /**
-        * @irq_postinstall:
-        *
-        * Optional callback used by drm_irq_install() which is called after
-        * the interrupt handler is registered. This should be used to enable
-        * interrupt generation in the hardware.
-        */
-       int (*irq_postinstall) (struct drm_device *dev);
-
-       /**
-        * @irq_uninstall:
-        *
-        * Optional callback used by drm_irq_uninstall() which is called before
-        * the interrupt handler is unregistered. This should be used to disable
-        * interrupt generation in the hardware.
-        */
-       void (*irq_uninstall) (struct drm_device *dev);
-
        /**
         * @master_set:
         *
@@ -504,6 +464,10 @@ struct drm_driver {
        int (*dma_ioctl) (struct drm_device *dev, void *data, struct drm_file *file_priv);
        int (*dma_quiescent) (struct drm_device *);
        int (*context_dtor) (struct drm_device *dev, int context);
+       irqreturn_t (*irq_handler)(int irq, void *arg);
+       void (*irq_preinstall)(struct drm_device *dev);
+       int (*irq_postinstall)(struct drm_device *dev);
+       void (*irq_uninstall)(struct drm_device *dev);
        u32 (*get_vblank_counter)(struct drm_device *dev, unsigned int pipe);
        int (*enable_vblank)(struct drm_device *dev, unsigned int pipe);
        void (*disable_vblank)(struct drm_device *dev, unsigned int pipe);
diff --git a/include/drm/drm_irq.h b/include/drm/drm_irq.h
deleted file mode 100644 (file)
index 53634b9..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright 2016 Intel Corp.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- */
-
-#ifndef _DRM_IRQ_H_
-#define _DRM_IRQ_H_
-
-struct drm_device;
-
-int drm_irq_install(struct drm_device *dev, int irq);
-int drm_irq_uninstall(struct drm_device *dev);
-#endif
index b17e79e12bc25757a394908becaafee509d59640..58dc8d8cc907b44ecdb564f7d10bfadc9b2605eb 100644 (file)
@@ -192,6 +192,9 @@ do {                                                                                \
 void drm_legacy_idlelock_take(struct drm_lock_data *lock);
 void drm_legacy_idlelock_release(struct drm_lock_data *lock);
 
+/* drm_irq.c */
+int drm_legacy_irq_uninstall(struct drm_device *dev);
+
 /* drm_pci.c */
 
 #ifdef CONFIG_PCI