aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorThomas Hellstrom <thellstrom@vmware.com>2017-08-24 02:06:27 -0400
committerSinclair Yeh <syeh@vmware.com>2017-08-28 11:40:40 -0400
commite300173f06160d65d383d54fdd48027ecd052af3 (patch)
tree0859b97da1dd00e43da3e9b4b13a0875acca92ea /drivers/gpu
parent7c0059dd832cc686bf0febefdcf8295cdd93007f (diff)
drm/vmwgfx: Don't use drm_irq_[un]install
We're not allowed to change the upstream version of the drm_irq_install function to be able to incorporate threaded irqs. So roll our own irq install- and uninstall functions instead of relying on the drm core ones. Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_drv.c11
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_drv.h5
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_irq.c45
3 files changed, 40 insertions, 21 deletions
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
index 8be26509a9aa..e84fee3ec4f3 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
@@ -36,7 +36,6 @@
36#include <drm/ttm/ttm_module.h> 36#include <drm/ttm/ttm_module.h>
37#include <linux/dma_remapping.h> 37#include <linux/dma_remapping.h>
38 38
39#define VMWGFX_DRIVER_NAME "vmwgfx"
40#define VMWGFX_DRIVER_DESC "Linux drm driver for VMware graphics devices" 39#define VMWGFX_DRIVER_DESC "Linux drm driver for VMware graphics devices"
41#define VMWGFX_CHIP_SVGAII 0 40#define VMWGFX_CHIP_SVGAII 0
42#define VMW_FB_RESERVATION 0 41#define VMW_FB_RESERVATION 0
@@ -825,7 +824,7 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
825 } 824 }
826 825
827 if (dev_priv->capabilities & SVGA_CAP_IRQMASK) { 826 if (dev_priv->capabilities & SVGA_CAP_IRQMASK) {
828 ret = drm_irq_install(dev, dev->pdev->irq); 827 ret = vmw_irq_install(dev, dev->pdev->irq);
829 if (ret != 0) { 828 if (ret != 0) {
830 DRM_ERROR("Failed installing irq: %d\n", ret); 829 DRM_ERROR("Failed installing irq: %d\n", ret);
831 goto out_no_irq; 830 goto out_no_irq;
@@ -937,7 +936,7 @@ out_no_bdev:
937 vmw_fence_manager_takedown(dev_priv->fman); 936 vmw_fence_manager_takedown(dev_priv->fman);
938out_no_fman: 937out_no_fman:
939 if (dev_priv->capabilities & SVGA_CAP_IRQMASK) 938 if (dev_priv->capabilities & SVGA_CAP_IRQMASK)
940 drm_irq_uninstall(dev_priv->dev); 939 vmw_irq_uninstall(dev_priv->dev);
941out_no_irq: 940out_no_irq:
942 if (dev_priv->stealth) 941 if (dev_priv->stealth)
943 pci_release_region(dev->pdev, 2); 942 pci_release_region(dev->pdev, 2);
@@ -990,7 +989,7 @@ static void vmw_driver_unload(struct drm_device *dev)
990 vmw_release_device_late(dev_priv); 989 vmw_release_device_late(dev_priv);
991 vmw_fence_manager_takedown(dev_priv->fman); 990 vmw_fence_manager_takedown(dev_priv->fman);
992 if (dev_priv->capabilities & SVGA_CAP_IRQMASK) 991 if (dev_priv->capabilities & SVGA_CAP_IRQMASK)
993 drm_irq_uninstall(dev_priv->dev); 992 vmw_irq_uninstall(dev_priv->dev);
994 if (dev_priv->stealth) 993 if (dev_priv->stealth)
995 pci_release_region(dev->pdev, 2); 994 pci_release_region(dev->pdev, 2);
996 else 995 else
@@ -1516,10 +1515,6 @@ static struct drm_driver driver = {
1516 .load = vmw_driver_load, 1515 .load = vmw_driver_load,
1517 .unload = vmw_driver_unload, 1516 .unload = vmw_driver_unload,
1518 .lastclose = vmw_lastclose, 1517 .lastclose = vmw_lastclose,
1519 .irq_preinstall = vmw_irq_preinstall,
1520 .irq_postinstall = vmw_irq_postinstall,
1521 .irq_uninstall = vmw_irq_uninstall,
1522 .irq_handler = vmw_irq_handler,
1523 .get_vblank_counter = vmw_get_vblank_counter, 1518 .get_vblank_counter = vmw_get_vblank_counter,
1524 .enable_vblank = vmw_enable_vblank, 1519 .enable_vblank = vmw_enable_vblank,
1525 .disable_vblank = vmw_disable_vblank, 1520 .disable_vblank = vmw_disable_vblank,
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
index 4b948fba9eec..5e7e8a3df7c3 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
@@ -41,6 +41,7 @@
41#include <drm/ttm/ttm_module.h> 41#include <drm/ttm/ttm_module.h>
42#include "vmwgfx_fence.h" 42#include "vmwgfx_fence.h"
43 43
44#define VMWGFX_DRIVER_NAME "vmwgfx"
44#define VMWGFX_DRIVER_DATE "20170607" 45#define VMWGFX_DRIVER_DATE "20170607"
45#define VMWGFX_DRIVER_MAJOR 2 46#define VMWGFX_DRIVER_MAJOR 2
46#define VMWGFX_DRIVER_MINOR 13 47#define VMWGFX_DRIVER_MINOR 13
@@ -847,12 +848,10 @@ extern int vmw_validate_single_buffer(struct vmw_private *dev_priv,
847 * IRQs and wating - vmwgfx_irq.c 848 * IRQs and wating - vmwgfx_irq.c
848 */ 849 */
849 850
850extern irqreturn_t vmw_irq_handler(int irq, void *arg);
851extern int vmw_wait_seqno(struct vmw_private *dev_priv, bool lazy, 851extern int vmw_wait_seqno(struct vmw_private *dev_priv, bool lazy,
852 uint32_t seqno, bool interruptible, 852 uint32_t seqno, bool interruptible,
853 unsigned long timeout); 853 unsigned long timeout);
854extern void vmw_irq_preinstall(struct drm_device *dev); 854extern int vmw_irq_install(struct drm_device *dev, int irq);
855extern int vmw_irq_postinstall(struct drm_device *dev);
856extern void vmw_irq_uninstall(struct drm_device *dev); 855extern void vmw_irq_uninstall(struct drm_device *dev);
857extern bool vmw_seqno_passed(struct vmw_private *dev_priv, 856extern bool vmw_seqno_passed(struct vmw_private *dev_priv,
858 uint32_t seqno); 857 uint32_t seqno);
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c b/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c
index 0c7e1723292c..9b519c4b4ec2 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c
@@ -30,7 +30,7 @@
30 30
31#define VMW_FENCE_WRAP (1 << 24) 31#define VMW_FENCE_WRAP (1 << 24)
32 32
33irqreturn_t vmw_irq_handler(int irq, void *arg) 33static irqreturn_t vmw_irq_handler(int irq, void *arg)
34{ 34{
35 struct drm_device *dev = (struct drm_device *)arg; 35 struct drm_device *dev = (struct drm_device *)arg;
36 struct vmw_private *dev_priv = vmw_priv(dev); 36 struct vmw_private *dev_priv = vmw_priv(dev);
@@ -281,23 +281,15 @@ int vmw_wait_seqno(struct vmw_private *dev_priv,
281 return ret; 281 return ret;
282} 282}
283 283
284void vmw_irq_preinstall(struct drm_device *dev) 284static void vmw_irq_preinstall(struct drm_device *dev)
285{ 285{
286 struct vmw_private *dev_priv = vmw_priv(dev); 286 struct vmw_private *dev_priv = vmw_priv(dev);
287 uint32_t status; 287 uint32_t status;
288 288
289 if (!(dev_priv->capabilities & SVGA_CAP_IRQMASK))
290 return;
291
292 status = inl(dev_priv->io_start + VMWGFX_IRQSTATUS_PORT); 289 status = inl(dev_priv->io_start + VMWGFX_IRQSTATUS_PORT);
293 outl(status, dev_priv->io_start + VMWGFX_IRQSTATUS_PORT); 290 outl(status, dev_priv->io_start + VMWGFX_IRQSTATUS_PORT);
294} 291}
295 292
296int vmw_irq_postinstall(struct drm_device *dev)
297{
298 return 0;
299}
300
301void vmw_irq_uninstall(struct drm_device *dev) 293void vmw_irq_uninstall(struct drm_device *dev)
302{ 294{
303 struct vmw_private *dev_priv = vmw_priv(dev); 295 struct vmw_private *dev_priv = vmw_priv(dev);
@@ -306,8 +298,41 @@ void vmw_irq_uninstall(struct drm_device *dev)
306 if (!(dev_priv->capabilities & SVGA_CAP_IRQMASK)) 298 if (!(dev_priv->capabilities & SVGA_CAP_IRQMASK))
307 return; 299 return;
308 300
301 if (!dev->irq_enabled)
302 return;
303
309 vmw_write(dev_priv, SVGA_REG_IRQMASK, 0); 304 vmw_write(dev_priv, SVGA_REG_IRQMASK, 0);
310 305
311 status = inl(dev_priv->io_start + VMWGFX_IRQSTATUS_PORT); 306 status = inl(dev_priv->io_start + VMWGFX_IRQSTATUS_PORT);
312 outl(status, dev_priv->io_start + VMWGFX_IRQSTATUS_PORT); 307 outl(status, dev_priv->io_start + VMWGFX_IRQSTATUS_PORT);
308
309 dev->irq_enabled = false;
310 free_irq(dev->irq, dev);
311}
312
313/**
314 * vmw_irq_install - Install the irq handlers
315 *
316 * @dev: Pointer to the drm device.
317 * @irq: The irq number.
318 * Return: Zero if successful. Negative number otherwise.
319 */
320int vmw_irq_install(struct drm_device *dev, int irq)
321{
322 int ret;
323
324 if (dev->irq_enabled)
325 return -EBUSY;
326
327 vmw_irq_preinstall(dev);
328
329 ret = request_threaded_irq(irq, vmw_irq_handler, NULL,
330 IRQF_SHARED, VMWGFX_DRIVER_NAME, dev);
331 if (ret < 0)
332 return ret;
333
334 dev->irq_enabled = true;
335 dev->irq = irq;
336
337 return ret;
313} 338}