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);