Module Name:    src
Committed By:   riastradh
Date:           Tue Oct 25 23:35:43 UTC 2022

Modified Files:
        src/sys/external/bsd/drm2/dist/drm/vmwgfx: vmwgfx_drv.c vmwgfx_drv.h
            vmwgfx_ioctl.c vmwgfx_irq.c vmwgfx_marker.c vmwgfx_overlay.c
            vmwgfx_reg.h

Log Message:
vmwgfx(4): Misc porting too.

- inl/outl -> bus_space_read/write
- struct device for DMA stuff -> bus_dma_tag_t
- spin_lock_destroy (and don't hold spin lock across kfree)
- driver load/unload, fops, &c.
- drm_irq_install/uninstall


To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 \
    src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_drv.c
cvs rdiff -u -r1.7 -r1.8 \
    src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_drv.h
cvs rdiff -u -r1.3 -r1.4 \
    src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_ioctl.c \
    src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_marker.c \
    src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_overlay.c \
    src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_reg.h
cvs rdiff -u -r1.4 -r1.5 \
    src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_irq.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_drv.c
diff -u src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_drv.c:1.6 src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_drv.c:1.7
--- src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_drv.c:1.6	Tue Oct 25 23:34:05 2022
+++ src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_drv.c	Tue Oct 25 23:35:43 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: vmwgfx_drv.c,v 1.6 2022/10/25 23:34:05 riastradh Exp $	*/
+/*	$NetBSD: vmwgfx_drv.c,v 1.7 2022/10/25 23:35:43 riastradh Exp $	*/
 
 // SPDX-License-Identifier: GPL-2.0 OR MIT
 /**************************************************************************
@@ -28,7 +28,7 @@
  **************************************************************************/
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vmwgfx_drv.c,v 1.6 2022/10/25 23:34:05 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vmwgfx_drv.c,v 1.7 2022/10/25 23:35:43 riastradh Exp $");
 
 #include <linux/console.h>
 #include <linux/dma-mapping.h>
@@ -46,6 +46,8 @@ __KERNEL_RCSID(0, "$NetBSD: vmwgfx_drv.c
 #include "vmwgfx_binding.h"
 #include "vmwgfx_drv.h"
 
+#include <linux/nbsd-namespace.h>
+
 #define VMWGFX_DRIVER_DESC "Linux drm driver for VMware graphics devices"
 #define VMWGFX_CHIP_SVGAII 0
 #define VMW_FB_RESERVATION 0
@@ -269,7 +271,9 @@ static int vmw_force_coherent;
 static int vmw_restrict_dma_mask;
 static int vmw_assume_16bpp;
 
+#ifndef __NetBSD__
 static int vmw_probe(struct pci_dev *, const struct pci_device_id *);
+#endif
 static int vmwgfx_pm_notifier(struct notifier_block *nb, unsigned long val,
 			      void *ptr);
 
@@ -608,11 +612,19 @@ static int vmw_dma_masks(struct vmw_priv
 	struct drm_device *dev = dev_priv->dev;
 	int ret = 0;
 
+#ifdef __NetBSD__
+	ret = drm_limit_dma_space(dev, 0, __BITS(63,0));
+#else
 	ret = dma_set_mask_and_coherent(dev->dev, DMA_BIT_MASK(64));
+#endif
 	if (dev_priv->map_mode != vmw_dma_phys &&
 	    (sizeof(unsigned long) == 4 || vmw_restrict_dma_mask)) {
 		DRM_INFO("Restricting DMA addresses to 44 bits.\n");
+#ifdef __NetBSD__
+		return drm_limit_dma_space(dev, 0, __BITS(43,0));
+#else
 		return dma_set_mask_and_coherent(dev->dev, DMA_BIT_MASK(44));
+#endif
 	}
 
 	return ret;
@@ -762,8 +774,10 @@ static int vmw_driver_load(struct drm_de
 	if (unlikely(ret != 0))
 		goto out_err0;
 
+#ifndef __NetBSD__		/* XXX set bus_dma maxsegsz? */
 	dma_set_max_seg_size(dev->dev, min_t(unsigned int, U32_MAX & PAGE_MASK,
 					     SCATTERLIST_MAX_SEGMENT));
+#endif
 
 	if (dev_priv->capabilities & SVGA_CAP_GMR2) {
 		DRM_INFO("Max GMR ids is %u\n",
@@ -780,8 +794,20 @@ static int vmw_driver_load(struct drm_de
 	DRM_INFO("MMIO at 0x%08x size is %u kiB\n",
 		 dev_priv->mmio_start, dev_priv->mmio_size / 1024);
 
+#ifdef __NetBSD__
+	dev_priv->mmio_bst = dev->bst;
+	if (bus_space_map(dev_priv->mmio_bst, dev_priv->mmio_start,
+		dev_priv->mmio_size, BUS_SPACE_MAP_LINEAR,
+		&dev_priv->mmio_bsh) == 0) {
+		dev_priv->mmio_virt = bus_space_vaddr(dev_priv->mmio_bst,
+		    dev_priv->mmio_bsh);
+	} else {
+		dev_priv->mmio_virt = NULL;
+	}
+#else
 	dev_priv->mmio_virt = memremap(dev_priv->mmio_start,
 				       dev_priv->mmio_size, MEMREMAP_WB);
+#endif
 
 	if (unlikely(dev_priv->mmio_virt == NULL)) {
 		ret = -ENOMEM;
@@ -789,6 +815,18 @@ static int vmw_driver_load(struct drm_de
 		goto out_err0;
 	}
 
+#ifdef __NetBSD__
+	dev_priv->iot = dev->pdev->pd_pa.pa_iot;
+
+	/* XXX errno NetBSD->Linux */
+	ret = -bus_space_map(dev_priv->iot, dev_priv->io_start, VMWGFX_IOSIZE,
+	    0, &dev_priv->ioh);
+	if (ret) {
+		DRM_ERROR("Failed mapping IO ports.\n");
+		goto out_err3;
+	}
+#endif
+
 	/* Need mmio memory to check for fifo pitchlock cap. */
 	if (!(dev_priv->capabilities & SVGA_CAP_DISPLAY_TOPOLOGY) &&
 	    !(dev_priv->capabilities & SVGA_CAP_PITCHLOCK) &&
@@ -826,7 +864,11 @@ static int vmw_driver_load(struct drm_de
 	}
 
 	if (dev_priv->capabilities & SVGA_CAP_IRQMASK) {
+#ifdef __NetBSD__
+		ret = vmw_irq_install(dev, 0);
+#else
 		ret = vmw_irq_install(dev, dev->pdev->irq);
+#endif
 		if (ret != 0) {
 			DRM_ERROR("Failed installing irq: %d\n", ret);
 			goto out_no_irq;
@@ -844,7 +886,12 @@ static int vmw_driver_load(struct drm_de
 				    DRM_FILE_PAGE_OFFSET_SIZE);
 	ret = ttm_bo_device_init(&dev_priv->bdev,
 				 &vmw_bo_driver,
+#ifdef __NetBSD__
+				 dev->bst,
+				 dev->dmat,
+#else
 				 dev->anon_inode->i_mapping,
+#endif
 				 &dev_priv->vma_manager,
 				 false);
 	if (unlikely(ret != 0)) {
@@ -963,7 +1010,15 @@ out_no_irq:
 out_no_device:
 	ttm_object_device_release(&dev_priv->tdev);
 out_err4:
+#ifdef __NetBSD__
+	bus_space_unmap(dev_priv->iot, dev_priv->ioh, VMWGFX_IOSIZE);
+out_err3:
+	dev_priv->mmio_virt = NULL;
+	bus_space_unmap(dev_priv->mmio_bst, dev_priv->mmio_bsh,
+	    dev_priv->mmio_size);
+#else
 	memunmap(dev_priv->mmio_virt);
+#endif
 out_err0:
 	spin_lock_destroy(&dev_priv->fifo_lock);
 	DRM_DESTROY_WAITQUEUE(&dev_priv->fifo_queue);
@@ -1018,7 +1073,13 @@ static void vmw_driver_unload(struct drm
 		pci_release_regions(dev->pdev);
 
 	ttm_object_device_release(&dev_priv->tdev);
+#ifdef __NetBSD__
+	dev_priv->mmio_virt = NULL;
+	bus_space_unmap(dev_priv->mmio_bst, dev_priv->mmio_bsh,
+	    dev_priv->mmio_size);
+#else
 	memunmap(dev_priv->mmio_virt);
+#endif
 	if (dev_priv->ctx.staged_bindings)
 		vmw_binding_state_free(dev_priv->ctx.staged_bindings);
 
@@ -1065,12 +1126,23 @@ out_no_tfile:
 	return ret;
 }
 
+#ifdef __NetBSD__
+static int vmw_generic_ioctl(struct file *filp, unsigned long cmd,
+			      void *arg,
+			      int (*ioctl_func)(struct file *, unsigned long,
+						 void *))
+#else
 static long vmw_generic_ioctl(struct file *filp, unsigned int cmd,
 			      unsigned long arg,
 			      long (*ioctl_func)(struct file *, unsigned int,
 						 unsigned long))
+#endif
 {
+#ifdef __NetBSD__
+	struct drm_file *file_priv = filp->f_data;
+#else
 	struct drm_file *file_priv = filp->private_data;
+#endif
 	struct drm_device *dev = file_priv->minor->dev;
 	unsigned int nr = DRM_IOCTL_NR(cmd);
 	unsigned int flags;
@@ -1108,8 +1180,12 @@ out_io_encoding:
 	return -EINVAL;
 }
 
+#ifdef __NetBSD__
+static int vmw_unlocked_ioctl(struct file *filp, unsigned long cmd, void *arg)
+#else
 static long vmw_unlocked_ioctl(struct file *filp, unsigned int cmd,
 			       unsigned long arg)
+#endif
 {
 	return vmw_generic_ioctl(filp, cmd, arg, &drm_ioctl);
 }
@@ -1230,6 +1306,7 @@ void vmw_svga_disable(struct vmw_private
 	ttm_write_unlock(&dev_priv->reservation_sem);
 }
 
+#ifndef __NetBSD__
 static void vmw_remove(struct pci_dev *pdev)
 {
 	struct drm_device *dev = pci_get_drvdata(pdev);
@@ -1239,10 +1316,12 @@ static void vmw_remove(struct pci_dev *p
 	drm_dev_put(dev);
 	pci_disable_device(pdev);
 }
+#endif
 
 static int vmwgfx_pm_notifier(struct notifier_block *nb, unsigned long val,
 			      void *ptr)
 {
+#ifndef __NetBSD__
 	struct vmw_private *dev_priv =
 		container_of(nb, struct vmw_private, pm_nb);
 
@@ -1269,9 +1348,12 @@ static int vmwgfx_pm_notifier(struct not
 	default:
 		break;
 	}
+#endif
 	return 0;
 }
 
+#ifndef __NetBSD__
+
 static int vmw_pci_suspend(struct pci_dev *pdev, pm_message_t state)
 {
 	struct drm_device *dev = pci_get_drvdata(pdev);
@@ -1413,6 +1495,8 @@ static const struct file_operations vmwg
 	.llseek = noop_llseek,
 };
 
+#endif
+
 static struct drm_driver driver = {
 	.driver_features =
 	DRIVER_MODESET | DRIVER_RENDER | DRIVER_ATOMIC,
@@ -1423,8 +1507,10 @@ static struct drm_driver driver = {
 	.num_ioctls = ARRAY_SIZE(vmw_ioctls),
 	.master_set = vmw_master_set,
 	.master_drop = vmw_master_drop,
+	.load = vmw_driver_load,
 	.open = vmw_driver_open,
 	.postclose = vmw_postclose,
+	.unload = vmw_driver_unload,
 
 	.dumb_create = vmw_dumb_create,
 	.dumb_map_offset = vmw_dumb_map_offset,
@@ -1433,7 +1519,11 @@ static struct drm_driver driver = {
 	.prime_fd_to_handle = vmw_prime_fd_to_handle,
 	.prime_handle_to_fd = vmw_prime_handle_to_fd,
 
+#ifdef __NetBSD__
+	.ioctl_override = &vmw_unlocked_ioctl,
+#else
 	.fops = &vmwgfx_driver_fops,
+#endif
 	.name = VMWGFX_DRIVER_NAME,
 	.desc = VMWGFX_DRIVER_DESC,
 	.date = VMWGFX_DRIVER_DATE,
@@ -1444,9 +1534,9 @@ static struct drm_driver driver = {
 
 #ifdef __NetBSD__
 
-static const struct drm_driver *const vmwgfx_driver = &driver;
-static const struct pci_device_id *const vmwgfx_pci_ids = vmw_pci_id_list;
-static const size_t vmwgfx_n_pci_ids = __arraycount(vmw_pci_id_list);
+const struct drm_driver *const vmwgfx_driver = &driver;
+const struct pci_device_id *const vmwgfx_pci_ids = vmw_pci_id_list;
+const size_t vmwgfx_n_pci_ids = __arraycount(vmw_pci_id_list);
 
 #else
 

Index: src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_drv.h
diff -u src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_drv.h:1.7 src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_drv.h:1.8
--- src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_drv.h:1.7	Tue Oct 25 23:34:05 2022
+++ src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_drv.h	Tue Oct 25 23:35:43 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: vmwgfx_drv.h,v 1.7 2022/10/25 23:34:05 riastradh Exp $	*/
+/*	$NetBSD: vmwgfx_drv.h,v 1.8 2022/10/25 23:35:43 riastradh Exp $	*/
 
 /* SPDX-License-Identifier: GPL-2.0 OR MIT */
 /**************************************************************************
@@ -33,6 +33,7 @@
 #include <linux/notifier.h>
 #include <linux/suspend.h>
 #include <linux/sync_file.h>
+#include <linux/uaccess.h>
 
 #include <drm/drm_auth.h>
 #include <drm/drm_device.h>
@@ -458,10 +459,8 @@ struct vmw_private {
 #ifdef __NetBSD__
 	bus_space_tag_t iot;
 	bus_space_handle_t ioh;
-	bus_size_t iosz;
-#else
-	unsigned int io_start;
 #endif
+	unsigned int io_start;
 	uint32_t vram_start;
 	uint32_t vram_size;
 	uint32_t prim_bb_mem;
@@ -475,6 +474,10 @@ struct vmw_private {
 	uint32_t stdu_max_height;
 	uint32_t initial_width;
 	uint32_t initial_height;
+#ifdef __NetBSD__
+	bus_space_tag_t mmio_bst;
+	bus_space_handle_t mmio_bsh;
+#endif
 	u32 *mmio_virt;
 	uint32_t capabilities;
 	uint32_t capabilities2;

Index: src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_ioctl.c
diff -u src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_ioctl.c:1.3 src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_ioctl.c:1.4
--- src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_ioctl.c:1.3	Sat Dec 18 23:45:45 2021
+++ src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_ioctl.c	Tue Oct 25 23:35:43 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: vmwgfx_ioctl.c,v 1.3 2021/12/18 23:45:45 riastradh Exp $	*/
+/*	$NetBSD: vmwgfx_ioctl.c,v 1.4 2022/10/25 23:35:43 riastradh Exp $	*/
 
 // SPDX-License-Identifier: GPL-2.0 OR MIT
 /**************************************************************************
@@ -28,7 +28,7 @@
  **************************************************************************/
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vmwgfx_ioctl.c,v 1.3 2021/12/18 23:45:45 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vmwgfx_ioctl.c,v 1.4 2022/10/25 23:35:43 riastradh Exp $");
 
 #include "vmwgfx_drv.h"
 #include <drm/vmwgfx_drm.h>
@@ -411,6 +411,8 @@ out_clips:
 }
 
 
+#ifndef __NetBSD__		/* XXX vmwgfx fops ping */
+
 /**
  * vmw_fops_poll - wrapper around the drm_poll function
  *
@@ -452,3 +454,5 @@ ssize_t vmw_fops_read(struct file *filp,
 	vmw_fifo_ping_host(dev_priv, SVGA_SYNC_GENERIC);
 	return drm_read(filp, buffer, count, offset);
 }
+
+#endif	/* __NetBSD__ */
Index: src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_marker.c
diff -u src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_marker.c:1.3 src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_marker.c:1.4
--- src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_marker.c:1.3	Sat Dec 18 23:45:45 2021
+++ src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_marker.c	Tue Oct 25 23:35:43 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: vmwgfx_marker.c,v 1.3 2021/12/18 23:45:45 riastradh Exp $	*/
+/*	$NetBSD: vmwgfx_marker.c,v 1.4 2022/10/25 23:35:43 riastradh Exp $	*/
 
 // SPDX-License-Identifier: GPL-2.0 OR MIT
 /**************************************************************************
@@ -29,7 +29,7 @@
 
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vmwgfx_marker.c,v 1.3 2021/12/18 23:45:45 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vmwgfx_marker.c,v 1.4 2022/10/25 23:35:43 riastradh Exp $");
 
 #include "vmwgfx_drv.h"
 
@@ -51,11 +51,10 @@ void vmw_marker_queue_takedown(struct vm
 {
 	struct vmw_marker *marker, *next;
 
-	spin_lock(&queue->lock);
 	list_for_each_entry_safe(marker, next, &queue->head, head) {
 		kfree(marker);
 	}
-	spin_unlock(&queue->lock);
+	spin_lock_destroy(&queue->lock);
 }
 
 int vmw_marker_push(struct vmw_marker_queue *queue,
Index: src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_overlay.c
diff -u src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_overlay.c:1.3 src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_overlay.c:1.4
--- src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_overlay.c:1.3	Sat Dec 18 23:45:45 2021
+++ src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_overlay.c	Tue Oct 25 23:35:43 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: vmwgfx_overlay.c,v 1.3 2021/12/18 23:45:45 riastradh Exp $	*/
+/*	$NetBSD: vmwgfx_overlay.c,v 1.4 2022/10/25 23:35:43 riastradh Exp $	*/
 
 // SPDX-License-Identifier: GPL-2.0 OR MIT
 /**************************************************************************
@@ -28,7 +28,7 @@
  **************************************************************************/
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vmwgfx_overlay.c,v 1.3 2021/12/18 23:45:45 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vmwgfx_overlay.c,v 1.4 2022/10/25 23:35:43 riastradh Exp $");
 
 #include <drm/ttm/ttm_placement.h>
 
@@ -37,6 +37,8 @@ __KERNEL_RCSID(0, "$NetBSD: vmwgfx_overl
 
 #include "vmwgfx_drv.h"
 
+#include <linux/nbsd-namespace.h>
+
 #define VMW_MAX_NUM_STREAMS 1
 #define VMW_OVERLAY_CAP_MASK (SVGA_FIFO_CAP_VIDEO | SVGA_FIFO_CAP_ESCAPE)
 
Index: src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_reg.h
diff -u src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_reg.h:1.3 src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_reg.h:1.4
--- src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_reg.h:1.3	Sat Dec 18 23:45:45 2021
+++ src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_reg.h	Tue Oct 25 23:35:43 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: vmwgfx_reg.h,v 1.3 2021/12/18 23:45:45 riastradh Exp $	*/
+/*	$NetBSD: vmwgfx_reg.h,v 1.4 2022/10/25 23:35:43 riastradh Exp $	*/
 
 /* SPDX-License-Identifier: GPL-2.0 OR MIT */
 /**************************************************************************
@@ -39,6 +39,7 @@
 #define VMWGFX_INDEX_PORT     0x0
 #define VMWGFX_VALUE_PORT     0x1
 #define VMWGFX_IRQSTATUS_PORT 0x8
+#define VMWGFX_IOSIZE	      0xc
 
 struct svga_guest_mem_descriptor {
 	u32 ppn;

Index: src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_irq.c
diff -u src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_irq.c:1.4 src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_irq.c:1.5
--- src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_irq.c:1.4	Tue Oct 25 23:34:06 2022
+++ src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_irq.c	Tue Oct 25 23:35:43 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: vmwgfx_irq.c,v 1.4 2022/10/25 23:34:06 riastradh Exp $	*/
+/*	$NetBSD: vmwgfx_irq.c,v 1.5 2022/10/25 23:35:43 riastradh Exp $	*/
 
 // SPDX-License-Identifier: GPL-2.0 OR MIT
 /**************************************************************************
@@ -28,10 +28,12 @@
  **************************************************************************/
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vmwgfx_irq.c,v 1.4 2022/10/25 23:34:06 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vmwgfx_irq.c,v 1.5 2022/10/25 23:35:43 riastradh Exp $");
 
 #include <linux/sched/signal.h>
 
+#include <drm/drm_irq.h>
+
 #include "vmwgfx_drv.h"
 
 #define VMW_FENCE_WRAP (1 << 24)
@@ -90,11 +92,21 @@ static irqreturn_t vmw_irq_handler(int i
 	uint32_t status, masked_status;
 	irqreturn_t ret = IRQ_HANDLED;
 
+#ifdef __NetBSD__
+	status = bus_space_read_4(dev_priv->iot, dev_priv->ioh,
+	    VMWGFX_IRQSTATUS_PORT);
+#else
 	status = inl(dev_priv->io_start + VMWGFX_IRQSTATUS_PORT);
+#endif
 	masked_status = status & READ_ONCE(dev_priv->irq_mask);
 
 	if (likely(status))
+#ifdef __NetBSD__
+		bus_space_write_4(dev_priv->iot, dev_priv->ioh,
+		    VMWGFX_IRQSTATUS_PORT, status);
+#else
 		outl(status, dev_priv->io_start + VMWGFX_IRQSTATUS_PORT);
+#endif
 
 	if (!status)
 		return IRQ_NONE;
@@ -296,7 +308,12 @@ void vmw_generic_waiter_add(struct vmw_p
 {
 	spin_lock_bh(&dev_priv->waiter_lock);
 	if ((*waiter_count)++ == 0) {
+#ifdef __NetBSD__
+		bus_space_write_4(dev_priv->iot, dev_priv->ioh,
+		    VMWGFX_IRQSTATUS_PORT, flag);
+#else
 		outl(flag, dev_priv->io_start + VMWGFX_IRQSTATUS_PORT);
+#endif
 		dev_priv->irq_mask |= flag;
 		vmw_write(dev_priv, SVGA_REG_IRQMASK, dev_priv->irq_mask);
 	}
@@ -398,8 +415,15 @@ static void vmw_irq_preinstall(struct dr
 	struct vmw_private *dev_priv = vmw_priv(dev);
 	uint32_t status;
 
+#ifdef __NetBSD__
+	status = bus_space_read_4(dev_priv->iot, dev_priv->ioh,
+	    VMWGFX_IRQSTATUS_PORT);
+	bus_space_write_4(dev_priv->iot, dev_priv->ioh, VMWGFX_IRQSTATUS_PORT,
+	    status);
+#else
 	status = inl(dev_priv->io_start + VMWGFX_IRQSTATUS_PORT);
 	outl(status, dev_priv->io_start + VMWGFX_IRQSTATUS_PORT);
+#endif
 }
 
 void vmw_irq_uninstall(struct drm_device *dev)
@@ -415,8 +439,15 @@ void vmw_irq_uninstall(struct drm_device
 
 	vmw_write(dev_priv, SVGA_REG_IRQMASK, 0);
 
+#ifdef __NetBSD__
+	status = bus_space_read_4(dev_priv->iot, dev_priv->ioh,
+	    VMWGFX_IRQSTATUS_PORT);
+	bus_space_write_4(dev_priv->iot, dev_priv->ioh, VMWGFX_IRQSTATUS_PORT,
+	    status);
+#else
 	status = inl(dev_priv->io_start + VMWGFX_IRQSTATUS_PORT);
 	outl(status, dev_priv->io_start + VMWGFX_IRQSTATUS_PORT);
+#endif
 
 	dev->irq_enabled = false;
 	free_irq(dev->irq, dev);

Reply via email to