diff options
author | Thomas Hellstrom <thellstrom@vmware.com> | 2017-08-24 02:06:27 -0400 |
---|---|---|
committer | Sinclair Yeh <syeh@vmware.com> | 2017-08-28 11:40:40 -0400 |
commit | e300173f06160d65d383d54fdd48027ecd052af3 (patch) | |
tree | 0859b97da1dd00e43da3e9b4b13a0875acca92ea /drivers/gpu | |
parent | 7c0059dd832cc686bf0febefdcf8295cdd93007f (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.c | 11 | ||||
-rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_irq.c | 45 |
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); |
938 | out_no_fman: | 937 | out_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); |
941 | out_no_irq: | 940 | out_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 | ||
850 | extern irqreturn_t vmw_irq_handler(int irq, void *arg); | ||
851 | extern int vmw_wait_seqno(struct vmw_private *dev_priv, bool lazy, | 851 | extern 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); |
854 | extern void vmw_irq_preinstall(struct drm_device *dev); | 854 | extern int vmw_irq_install(struct drm_device *dev, int irq); |
855 | extern int vmw_irq_postinstall(struct drm_device *dev); | ||
856 | extern void vmw_irq_uninstall(struct drm_device *dev); | 855 | extern void vmw_irq_uninstall(struct drm_device *dev); |
857 | extern bool vmw_seqno_passed(struct vmw_private *dev_priv, | 856 | extern 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 | ||
33 | irqreturn_t vmw_irq_handler(int irq, void *arg) | 33 | static 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 | ||
284 | void vmw_irq_preinstall(struct drm_device *dev) | 284 | static 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 | ||
296 | int vmw_irq_postinstall(struct drm_device *dev) | ||
297 | { | ||
298 | return 0; | ||
299 | } | ||
300 | |||
301 | void vmw_irq_uninstall(struct drm_device *dev) | 293 | void 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 | */ | ||
320 | int 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 | } |