Commit c1736b90 authored by Thomas Zimmermann's avatar Thomas Zimmermann

drm: IRQ midlayer is now legacy

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: default avatarThomas Zimmermann <tzimmermann@suse.de>
Acked-by: default avatarSam Ravnborg <sam@ravnborg.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20210803090704.32152-15-tzimmermann@suse.de
parent 0b05dd6b
...@@ -60,46 +60,14 @@ ...@@ -60,46 +60,14 @@
#include <drm/drm.h> #include <drm/drm.h>
#include <drm/drm_device.h> #include <drm/drm_device.h>
#include <drm/drm_drv.h> #include <drm/drm_drv.h>
#include <drm/drm_irq.h> #include <drm/drm_legacy.h>
#include <drm/drm_print.h> #include <drm/drm_print.h>
#include <drm/drm_vblank.h> #include <drm/drm_vblank.h>
#include "drm_internal.h" #include "drm_internal.h"
/** #if IS_ENABLED(CONFIG_DRM_LEGACY)
* DOC: irq helpers static int drm_legacy_irq_install(struct drm_device *dev, int irq)
*
* 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)
{ {
int ret; int ret;
unsigned long sh_flags = 0; unsigned long sh_flags = 0;
...@@ -144,24 +112,8 @@ int drm_irq_install(struct drm_device *dev, int irq) ...@@ -144,24 +112,8 @@ int drm_irq_install(struct drm_device *dev, int irq)
return ret; return ret;
} }
EXPORT_SYMBOL(drm_irq_install);
/** int drm_legacy_irq_uninstall(struct drm_device *dev)
* 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)
{ {
unsigned long irqflags; unsigned long irqflags;
bool irq_enabled; bool irq_enabled;
...@@ -207,9 +159,8 @@ int drm_irq_uninstall(struct drm_device *dev) ...@@ -207,9 +159,8 @@ int drm_irq_uninstall(struct drm_device *dev)
return 0; 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, int drm_legacy_irq_control(struct drm_device *dev, void *data,
struct drm_file *file_priv) struct drm_file *file_priv)
{ {
...@@ -238,13 +189,13 @@ int drm_legacy_irq_control(struct drm_device *dev, void *data, ...@@ -238,13 +189,13 @@ int drm_legacy_irq_control(struct drm_device *dev, void *data,
ctl->irq != irq) ctl->irq != irq)
return -EINVAL; return -EINVAL;
mutex_lock(&dev->struct_mutex); mutex_lock(&dev->struct_mutex);
ret = drm_irq_install(dev, irq); ret = drm_legacy_irq_install(dev, irq);
mutex_unlock(&dev->struct_mutex); mutex_unlock(&dev->struct_mutex);
return ret; return ret;
case DRM_UNINST_HANDLER: case DRM_UNINST_HANDLER:
mutex_lock(&dev->struct_mutex); mutex_lock(&dev->struct_mutex);
ret = drm_irq_uninstall(dev); ret = drm_legacy_irq_uninstall(dev);
mutex_unlock(&dev->struct_mutex); mutex_unlock(&dev->struct_mutex);
return ret; return ret;
......
...@@ -35,7 +35,6 @@ ...@@ -35,7 +35,6 @@
#include <drm/drm_device.h> #include <drm/drm_device.h>
#include <drm/drm_drv.h> #include <drm/drm_drv.h>
#include <drm/drm_irq.h>
#include <drm/drm_print.h> #include <drm/drm_print.h>
#include "drm_internal.h" #include "drm_internal.h"
...@@ -78,7 +77,7 @@ int drm_legacy_setup(struct drm_device * dev) ...@@ -78,7 +77,7 @@ int drm_legacy_setup(struct drm_device * dev)
void drm_legacy_dev_reinit(struct drm_device *dev) void drm_legacy_dev_reinit(struct drm_device *dev)
{ {
if (dev->irq_enabled) if (dev->irq_enabled)
drm_irq_uninstall(dev); drm_legacy_irq_uninstall(dev);
mutex_lock(&dev->struct_mutex); mutex_lock(&dev->struct_mutex);
......
...@@ -1739,10 +1739,10 @@ static void drm_wait_vblank_reply(struct drm_device *dev, unsigned int pipe, ...@@ -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) static bool drm_wait_vblank_supported(struct drm_device *dev)
{ {
if (IS_ENABLED(CONFIG_DRM_LEGACY)) { #if IS_ENABLED(CONFIG_DRM_LEGACY)
if (unlikely(drm_core_check_feature(dev, DRIVER_LEGACY))) if (unlikely(drm_core_check_feature(dev, DRIVER_LEGACY)))
return dev->irq_enabled; return dev->irq_enabled;
} #endif
return drm_dev_has_vblank(dev); return drm_dev_has_vblank(dev);
} }
......
...@@ -38,7 +38,6 @@ ...@@ -38,7 +38,6 @@
#include <drm/drm_drv.h> #include <drm/drm_drv.h>
#include <drm/drm_file.h> #include <drm/drm_file.h>
#include <drm/drm_ioctl.h> #include <drm/drm_ioctl.h>
#include <drm/drm_irq.h>
#include <drm/drm_print.h> #include <drm/drm_print.h>
#include <drm/i810_drm.h> #include <drm/i810_drm.h>
...@@ -209,7 +208,7 @@ static int i810_dma_cleanup(struct drm_device *dev) ...@@ -209,7 +208,7 @@ static int i810_dma_cleanup(struct drm_device *dev)
* is freed, it's too late. * is freed, it's too late.
*/ */
if (drm_core_check_feature(dev, DRIVER_HAVE_IRQ) && dev->irq_enabled) 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) { if (dev->dev_private) {
int i; int i;
......
...@@ -949,7 +949,7 @@ static int mga_do_cleanup_dma(struct drm_device *dev, int full_cleanup) ...@@ -949,7 +949,7 @@ static int mga_do_cleanup_dma(struct drm_device *dev, int full_cleanup)
* is freed, it's too late. * is freed, it's too late.
*/ */
if (dev->irq_enabled) if (dev->irq_enabled)
drm_irq_uninstall(dev); drm_legacy_irq_uninstall(dev);
if (dev->dev_private) { if (dev->dev_private) {
drm_mga_private_t *dev_priv = dev->dev_private; drm_mga_private_t *dev_priv = dev->dev_private;
......
...@@ -38,7 +38,6 @@ ...@@ -38,7 +38,6 @@
#include <drm/drm_device.h> #include <drm/drm_device.h>
#include <drm/drm_file.h> #include <drm/drm_file.h>
#include <drm/drm_ioctl.h> #include <drm/drm_ioctl.h>
#include <drm/drm_irq.h>
#include <drm/drm_legacy.h> #include <drm/drm_legacy.h>
#include <drm/drm_print.h> #include <drm/drm_print.h>
#include <drm/drm_sarea.h> #include <drm/drm_sarea.h>
......
...@@ -39,7 +39,6 @@ ...@@ -39,7 +39,6 @@
#include <drm/drm_device.h> #include <drm/drm_device.h>
#include <drm/drm_file.h> #include <drm/drm_file.h>
#include <drm/drm_irq.h>
#include <drm/drm_legacy.h> #include <drm/drm_legacy.h>
#include <drm/drm_print.h> #include <drm/drm_print.h>
#include <drm/r128_drm.h> #include <drm/r128_drm.h>
...@@ -603,7 +602,7 @@ int r128_do_cleanup_cce(struct drm_device *dev) ...@@ -603,7 +602,7 @@ int r128_do_cleanup_cce(struct drm_device *dev)
* is freed, it's too late. * is freed, it's too late.
*/ */
if (dev->irq_enabled) if (dev->irq_enabled)
drm_irq_uninstall(dev); drm_legacy_irq_uninstall(dev);
if (dev->dev_private) { if (dev->dev_private) {
drm_r128_private_t *dev_priv = dev->dev_private; drm_r128_private_t *dev_priv = dev->dev_private;
......
...@@ -29,7 +29,6 @@ ...@@ -29,7 +29,6 @@
#include <drm/drm_device.h> #include <drm/drm_device.h>
#include <drm/drm_file.h> #include <drm/drm_file.h>
#include <drm/drm_irq.h>
#include <drm/via_drm.h> #include <drm/via_drm.h>
#include "via_drv.h" #include "via_drv.h"
...@@ -86,7 +85,7 @@ int via_final_context(struct drm_device *dev, int context) ...@@ -86,7 +85,7 @@ int via_final_context(struct drm_device *dev, int context)
/* Last context, perform cleanup */ /* Last context, perform cleanup */
if (list_is_singular(&dev->ctxlist)) { if (list_is_singular(&dev->ctxlist)) {
DRM_DEBUG("Last Context\n"); DRM_DEBUG("Last Context\n");
drm_irq_uninstall(dev); drm_legacy_irq_uninstall(dev);
via_cleanup_futex(dev_priv); via_cleanup_futex(dev_priv);
via_do_cleanup_map(dev); via_do_cleanup_map(dev);
} }
......
...@@ -191,20 +191,6 @@ struct drm_device { ...@@ -191,20 +191,6 @@ struct drm_device {
*/ */
struct list_head clientlist; 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: * @vblank_disable_immediate:
* *
...@@ -372,6 +358,10 @@ struct drm_device { ...@@ -372,6 +358,10 @@ struct drm_device {
/* Scatter gather memory */ /* Scatter gather memory */
struct drm_sg_mem *sg; struct drm_sg_mem *sg;
/* IRQs */
bool irq_enabled;
int irq;
#endif #endif
}; };
......
...@@ -137,10 +137,6 @@ enum drm_driver_feature { ...@@ -137,10 +137,6 @@ enum drm_driver_feature {
* @DRIVER_HAVE_IRQ: * @DRIVER_HAVE_IRQ:
* *
* Legacy irq support. Only for legacy drivers. Do not use. * 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), DRIVER_HAVE_IRQ = BIT(30),
/** /**
...@@ -271,42 +267,6 @@ struct drm_driver { ...@@ -271,42 +267,6 @@ struct drm_driver {
*/ */
void (*release) (struct drm_device *); 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: * @master_set:
* *
...@@ -504,6 +464,10 @@ struct drm_driver { ...@@ -504,6 +464,10 @@ struct drm_driver {
int (*dma_ioctl) (struct drm_device *dev, void *data, struct drm_file *file_priv); int (*dma_ioctl) (struct drm_device *dev, void *data, struct drm_file *file_priv);
int (*dma_quiescent) (struct drm_device *); int (*dma_quiescent) (struct drm_device *);
int (*context_dtor) (struct drm_device *dev, int context); 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); u32 (*get_vblank_counter)(struct drm_device *dev, unsigned int pipe);
int (*enable_vblank)(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); void (*disable_vblank)(struct drm_device *dev, unsigned int pipe);
......
/*
* 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
...@@ -192,6 +192,9 @@ do { \ ...@@ -192,6 +192,9 @@ do { \
void drm_legacy_idlelock_take(struct drm_lock_data *lock); void drm_legacy_idlelock_take(struct drm_lock_data *lock);
void drm_legacy_idlelock_release(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 */ /* drm_pci.c */
#ifdef CONFIG_PCI #ifdef CONFIG_PCI
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment