Another round of nouveau whack-a-mole.

This commit is contained in:
riastradh 2014-08-23 08:03:33 +00:00
parent dfb3f06a5c
commit fd20828015
48 changed files with 674 additions and 114 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_engine_copy_nva3.c,v 1.1.1.1 2014/08/06 12:36:24 riastradh Exp $ */
/* $NetBSD: nouveau_engine_copy_nva3.c,v 1.2 2014/08/23 08:03:33 riastradh Exp $ */
/*
* Copyright 2012 Red Hat Inc.
@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_engine_copy_nva3.c,v 1.1.1.1 2014/08/06 12:36:24 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_engine_copy_nva3.c,v 1.2 2014/08/23 08:03:33 riastradh Exp $");
#include <engine/falcon.h>
#include <engine/fifo.h>
@ -107,7 +107,7 @@ nva3_copy_intr(struct nouveau_subdev *subdev)
if (stat & 0x00000040) {
nv_error(falcon, "DISPATCH_ERROR [");
nouveau_enum_print(nva3_copy_isr_error_name, ssta);
pr_cont("] ch %d [0x%010llx %s] subc %d mthd 0x%04x data 0x%08x\n",
pr_cont("] ch %d [0x%010"PRIx64" %s] subc %d mthd 0x%04x data 0x%08x\n",
chid, inst << 12, nouveau_client_name(engctx), subc,
mthd, data);
nv_wo32(falcon, 0x004, 0x00000040);

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_engine_crypt_nv84.c,v 1.1.1.1 2014/08/06 12:36:24 riastradh Exp $ */
/* $NetBSD: nouveau_engine_crypt_nv84.c,v 1.2 2014/08/23 08:03:33 riastradh Exp $ */
/*
* Copyright 2012 Red Hat Inc.
@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_engine_crypt_nv84.c,v 1.1.1.1 2014/08/06 12:36:24 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_engine_crypt_nv84.c,v 1.2 2014/08/23 08:03:33 riastradh Exp $");
#include <core/client.h>
#include <core/os.h>
@ -134,7 +134,7 @@ nv84_crypt_intr(struct nouveau_subdev *subdev)
if (stat) {
nv_error(priv, "%s", "");
nouveau_bitfield_print(nv84_crypt_intr_mask, stat);
pr_cont(" ch %d [0x%010llx %s] mthd 0x%04x data 0x%08x\n",
pr_cont(" ch %d [0x%010"PRIx64" %s] mthd 0x%04x data 0x%08x\n",
chid, (u64)inst << 12, nouveau_client_name(engctx),
mthd, data);
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_engine_crypt_nv98.c,v 1.1.1.1 2014/08/06 12:36:24 riastradh Exp $ */
/* $NetBSD: nouveau_engine_crypt_nv98.c,v 1.2 2014/08/23 08:03:33 riastradh Exp $ */
/*
* Copyright 2012 Red Hat Inc.
@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_engine_crypt_nv98.c,v 1.1.1.1 2014/08/06 12:36:24 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_engine_crypt_nv98.c,v 1.2 2014/08/23 08:03:33 riastradh Exp $");
#include <core/client.h>
#include <core/os.h>
@ -108,7 +108,7 @@ nv98_crypt_intr(struct nouveau_subdev *subdev)
if (stat & 0x00000040) {
nv_error(priv, "DISPATCH_ERROR [");
nouveau_enum_print(nv98_crypt_isr_error_name, ssta);
pr_cont("] ch %d [0x%010llx %s] subc %d mthd 0x%04x data 0x%08x\n",
pr_cont("] ch %d [0x%010"PRIx64" %s] subc %d mthd 0x%04x data 0x%08x\n",
chid, (u64)inst << 12, nouveau_client_name(engctx),
subc, mthd, data);
nv_wr32(priv, 0x087004, 0x00000040);

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_engine_device_base.c,v 1.2 2014/08/06 15:01:33 riastradh Exp $ */
/* $NetBSD: nouveau_engine_device_base.c,v 1.3 2014/08/23 08:03:33 riastradh Exp $ */
/*
* Copyright 2012 Red Hat Inc.
@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_engine_device_base.c,v 1.2 2014/08/06 15:01:33 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_engine_device_base.c,v 1.3 2014/08/23 08:03:33 riastradh Exp $");
#include <core/object.h>
#include <core/device.h>
@ -36,8 +36,27 @@ __KERNEL_RCSID(0, "$NetBSD: nouveau_engine_device_base.c,v 1.2 2014/08/06 15:01:
#include "priv.h"
#ifdef __NetBSD__
static struct mutex nv_devices_mutex;
static struct list_head nv_devices = LIST_HEAD_INIT(nv_devices);
void
nouveau_devices_init(void)
{
linux_mutex_init(&nv_devices_mutex);
}
void
nouveau_devices_fini(void)
{
linux_mutex_destroy(&nv_devices_mutex);
}
#else
static DEFINE_MUTEX(nv_devices_mutex);
static LIST_HEAD(nv_devices);
#endif
struct nouveau_device *
nouveau_device_find(u64 name)
@ -112,7 +131,12 @@ nouveau_devobj_ctor(struct nouveau_object *parent,
struct nv_device_class *args = data;
u32 boot0, strap;
u64 disable, mmio_base, mmio_size;
#ifdef __NetBSD__
bus_space_tag_t mmiot;
bus_space_handle_t mmioh;
#else
void __iomem *map;
#endif
int ret, i, c;
if (size < sizeof(struct nv_device_class))
@ -136,6 +160,9 @@ nouveau_devobj_ctor(struct nouveau_object *parent,
if (ret)
return ret;
#ifdef __NetBSD__
mmiot = nv_device_resource_tag(device, 0);
#endif
mmio_base = nv_device_resource_start(device, 0);
mmio_size = nv_device_resource_len(device, 0);
@ -149,6 +176,21 @@ nouveau_devobj_ctor(struct nouveau_object *parent,
/* identify the chipset, and determine classes of subdev/engines */
if (!(args->disable & NV_DEVICE_DISABLE_IDENTIFY) &&
!device->card_type) {
#ifdef __NetBSD__
if (bus_space_map(mmiot, mmio_base, mmio_size, 0, &mmioh) != 0)
return -ENOMEM;
#ifndef __BIG_ENDIAN
if (bus_space_read_4(mmiot, mmioh, 4) != 0)
#else
if (bus_space_read_4(mmiot, mmioh, 4) == 0)
#endif
bus_space_write_4(mmiot, mmioh, 4, 0x01000001);
boot0 = bus_space_read_4(mmiot, mmioh, 0x000000);
strap = bus_space_read_4(mmiot, mmioh, 0x101000);
bus_space_unmap(mmiot, mmioh, mmio_size);
#else
map = ioremap(mmio_base, 0x102000);
if (map == NULL)
return -ENOMEM;
@ -165,6 +207,7 @@ nouveau_devobj_ctor(struct nouveau_object *parent,
boot0 = ioread32_native(map + 0x000000);
strap = ioread32_native(map + 0x101000);
iounmap(map);
#endif
/* determine chipset and derive architecture from it */
if ((boot0 & 0x1f000000) > 0) {
@ -247,6 +290,19 @@ nouveau_devobj_ctor(struct nouveau_object *parent,
nv_debug(device, "crystal freq: %dKHz\n", device->crystal);
}
#ifdef __NetBSD__
if (!(args->disable & NV_DEVICE_DISABLE_MMIO) &&
!nv_subdev(device)->mmiosz) {
if (bus_space_map(mmiot, mmio_base, mmio_size, 0,
&nv_subdev(device)->mmioh) != 0) {
nv_error(device, "unable to map device registers\n");
return -ENOMEM;
}
nv_subdev(device)->mmiot = mmiot;
nv_subdev(device)->mmioh = mmioh;
nv_subdev(device)->mmiosz = mmio_size;
}
#else
if (!(args->disable & NV_DEVICE_DISABLE_MMIO) &&
!nv_subdev(device)->mmio) {
nv_subdev(device)->mmio = ioremap(mmio_base, mmio_size);
@ -255,6 +311,7 @@ nouveau_devobj_ctor(struct nouveau_object *parent,
return -ENOMEM;
}
}
#endif
/* ensure requested subsystems are available for use */
for (i = 1, c = 1; i < NVDEV_SUBDEV_NR; i++) {
@ -447,8 +504,14 @@ nouveau_device_dtor(struct nouveau_object *object)
list_del(&device->head);
mutex_unlock(&nv_devices_mutex);
#ifdef __NetBSD__
if (nv_subdev(device)->mmiosz)
bus_space_unmap(nv_subdev(device)->mmiot,
nv_subdev(device)->mmioh, nv_subdev(device)->mmiosz);
#else
if (nv_subdev(device)->mmio)
iounmap(nv_subdev(device)->mmio);
#endif
nouveau_engine_destroy(&device->base);
}
@ -477,12 +540,17 @@ nv_device_resource_start(struct nouveau_device *device, unsigned int bar)
if (nv_device_is_pci(device)) {
return pci_resource_start(device->pdev, bar);
} else {
#ifdef __NetBSD__
/* XXX nouveau platform device */
panic("can't handle non-PCI nouveau devices");
#else
struct resource *res;
res = platform_get_resource(device->platformdev,
IORESOURCE_MEM, bar);
if (!res)
return 0;
return res->start;
#endif
}
}
@ -492,15 +560,21 @@ nv_device_resource_len(struct nouveau_device *device, unsigned int bar)
if (nv_device_is_pci(device)) {
return pci_resource_len(device->pdev, bar);
} else {
#ifdef __NetBSD__
/* XXX nouveau platform device */
panic("can't handle non-PCI nouveau devices");
#else
struct resource *res;
res = platform_get_resource(device->platformdev,
IORESOURCE_MEM, bar);
if (!res)
return 0;
return resource_size(res);
#endif
}
}
#ifndef __NetBSD__
dma_addr_t
nv_device_map_page(struct nouveau_device *device, struct page *page)
{
@ -525,15 +599,31 @@ nv_device_unmap_page(struct nouveau_device *device, dma_addr_t addr)
pci_unmap_page(device->pdev, addr, PAGE_SIZE,
PCI_DMA_BIDIRECTIONAL);
}
#endif
int
nv_device_get_irq(struct nouveau_device *device, bool stall)
{
if (nv_device_is_pci(device)) {
#ifdef __NetBSD__
pci_intr_handle_t ih;
CTASSERT(sizeof ih <= sizeof(int)); /* XXX */
if (pci_intr_map(&device->pdev->pd_pa, &ih))
panic("unable to map nouveau interrupt"); /* XXX */
return ih;
#else
return device->pdev->irq;
#endif
} else {
#ifdef __NetBSD__
/* XXX nouveau platform device */
panic("can't handle non-PCI nouveau devices");
#else
return platform_get_irq_byname(device->platformdev,
stall ? "stall" : "nonstall");
#endif
}
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_engine_disp_dacnv50.c,v 1.1.1.1 2014/08/06 12:36:24 riastradh Exp $ */
/* $NetBSD: nouveau_engine_disp_dacnv50.c,v 1.2 2014/08/23 08:03:33 riastradh Exp $ */
/*
* Copyright 2012 Red Hat Inc.
@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_engine_disp_dacnv50.c,v 1.1.1.1 2014/08/06 12:36:24 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_engine_disp_dacnv50.c,v 1.2 2014/08/23 08:03:33 riastradh Exp $");
#include <core/os.h>
#include <core/class.h>
@ -97,6 +97,7 @@ nv50_dac_mthd(struct nouveau_object *object, u32 mthd, void *args, u32 size)
break;
default:
BUG_ON(1);
ret = -EIO; /* XXX GCC */
}
return ret;

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_engine_disp_nv04.c,v 1.1.1.1 2014/08/06 12:36:24 riastradh Exp $ */
/* $NetBSD: nouveau_engine_disp_nv04.c,v 1.2 2014/08/23 08:03:33 riastradh Exp $ */
/*
* Copyright 2012 Red Hat Inc.
@ -25,13 +25,15 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_engine_disp_nv04.c,v 1.1.1.1 2014/08/06 12:36:24 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_engine_disp_nv04.c,v 1.2 2014/08/23 08:03:33 riastradh Exp $");
#include "priv.h"
#include <core/event.h>
#include <core/class.h>
#include <linux/ktime.h> /* XXX */
struct nv04_disp_priv {
struct nouveau_disp base;
};

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_engine_disp_nv50.c,v 1.1.1.1 2014/08/06 12:36:24 riastradh Exp $ */
/* $NetBSD: nouveau_engine_disp_nv50.c,v 1.2 2014/08/23 08:03:33 riastradh Exp $ */
/*
* Copyright 2012 Red Hat Inc.
@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_engine_disp_nv50.c,v 1.1.1.1 2014/08/06 12:36:24 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_engine_disp_nv50.c,v 1.2 2014/08/23 08:03:33 riastradh Exp $");
#include <core/object.h>
#include <core/parent.h>
@ -42,6 +42,10 @@ __KERNEL_RCSID(0, "$NetBSD: nouveau_engine_disp_nv50.c,v 1.1.1.1 2014/08/06 12:3
#include <subdev/timer.h>
#include <subdev/fb.h>
#include <asm/div64.h> /* XXX */
#include <linux/bitops.h> /* XXX */
#include <linux/ktime.h> /* XXX */
#include "nv50.h"
/*******************************************************************************
@ -1355,7 +1359,7 @@ nv50_disp_intr_unk20_2_dp(struct nv50_disp_priv *priv,
int TU, VTUi, VTUf, VTUa;
u64 link_data_rate, link_ratio, unk;
u32 best_diff = 64 * symbol;
u32 link_nr, link_bw, bits, r;
u32 link_nr, link_bw, bits;
/* calculate packed data rate for each lane */
if (dpctrl > 0x00030000) link_nr = 4;
@ -1375,7 +1379,7 @@ nv50_disp_intr_unk20_2_dp(struct nv50_disp_priv *priv,
/* calculate ratio of packed data rate to link symbol rate */
link_ratio = link_data_rate * symbol;
r = do_div(link_ratio, link_bw);
(void)do_div(link_ratio, link_bw);
for (TU = 64; TU >= 32; TU--) {
/* calculate average number of valid symbols in each TU */
@ -1436,8 +1440,8 @@ nv50_disp_intr_unk20_2_dp(struct nv50_disp_priv *priv,
/* XXX close to vbios numbers, but not right */
unk = (symbol - link_ratio) * bestTU;
unk *= link_ratio;
r = do_div(unk, symbol);
r = do_div(unk, symbol);
(void)do_div(unk, symbol);
(void)do_div(unk, symbol);
unk += 6;
nv_mask(priv, 0x61c10c + loff, 0x000001fc, bestTU << 2);

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_engine_disp_nvd0.c,v 1.1.1.1 2014/08/06 12:36:24 riastradh Exp $ */
/* $NetBSD: nouveau_engine_disp_nvd0.c,v 1.2 2014/08/23 08:03:33 riastradh Exp $ */
/*
* Copyright 2012 Red Hat Inc.
@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_engine_disp_nvd0.c,v 1.1.1.1 2014/08/06 12:36:24 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_engine_disp_nvd0.c,v 1.2 2014/08/23 08:03:33 riastradh Exp $");
#include <core/object.h>
#include <core/parent.h>
@ -43,6 +43,9 @@ __KERNEL_RCSID(0, "$NetBSD: nouveau_engine_disp_nvd0.c,v 1.1.1.1 2014/08/06 12:3
#include <subdev/fb.h>
#include <subdev/timer.h>
#include <asm/div64.h> /* XXX */
#include <linux/ktime.h> /* XXX */
#include "nv50.h"
/*******************************************************************************

View File

@ -9,6 +9,8 @@
#include <engine/dmaobj.h>
#include <linux/workqueue.h> /* XXX */
#include "dport.h"
#include "priv.h"

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_engine_fifo_base.c,v 1.2 2014/08/06 15:01:33 riastradh Exp $ */
/* $NetBSD: nouveau_engine_fifo_base.c,v 1.3 2014/08/23 08:03:33 riastradh Exp $ */
/*
* Copyright 2012 Red Hat Inc.
@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_engine_fifo_base.c,v 1.2 2014/08/06 15:01:33 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_engine_fifo_base.c,v 1.3 2014/08/23 08:03:33 riastradh Exp $");
#include <core/client.h>
#include <core/object.h>
@ -92,10 +92,10 @@ nouveau_fifo_channel_create_(struct nouveau_object *parent,
/* map fifo control registers */
#ifdef __NetBSD__
chan->bst = nv_device_resource_tag(device, bar);
/* XXX errno NetBSD->Linux */
chan->bst = nv_device_resource_tag(device, bar)
ret = -bus_space_map(chan->bst, nv_device_resource_start(device, bar),
(addr + (chan->chid * size)), 0, size, &chan->bsh);
ret = -bus_space_map(chan->bst, nv_device_resource_start(device, bar) +
addr + (chan->chid * size), size, 0, &chan->bsh);
if (ret)
return ret;
#else
@ -143,14 +143,22 @@ u32
_nouveau_fifo_channel_rd32(struct nouveau_object *object, u64 addr)
{
struct nouveau_fifo_chan *chan = (void *)object;
#ifdef __NetBSD__
return bus_space_read_4(chan->bst, chan->bsh, addr);
#else
return ioread32_native(chan->user + addr);
#endif
}
void
_nouveau_fifo_channel_wr32(struct nouveau_object *object, u64 addr, u32 data)
{
struct nouveau_fifo_chan *chan = (void *)object;
#ifdef __NetBSD__
bus_space_write_4(chan->bst, chan->bsh, addr, data);
#else
iowrite32_native(data, chan->user + addr);
#endif
}
static int

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_engine_fifo_nvc0.c,v 1.1.1.1 2014/08/06 12:36:24 riastradh Exp $ */
/* $NetBSD: nouveau_engine_fifo_nvc0.c,v 1.2 2014/08/23 08:03:33 riastradh Exp $ */
/*
* Copyright 2012 Red Hat Inc.
@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_engine_fifo_nvc0.c,v 1.1.1.1 2014/08/06 12:36:24 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_engine_fifo_nvc0.c,v 1.2 2014/08/23 08:03:33 riastradh Exp $");
#include <core/client.h>
#include <core/handle.h>
@ -44,6 +44,9 @@ __KERNEL_RCSID(0, "$NetBSD: nouveau_engine_fifo_nvc0.c,v 1.1.1.1 2014/08/06 12:3
#include <engine/dmaobj.h>
#include <engine/fifo.h>
#include <drm/drmP.h> /* XXX */
#include <linux/workqueue.h> /* XXX */
struct nvc0_fifo_priv {
struct nouveau_fifo base;
@ -53,7 +56,12 @@ struct nvc0_fifo_priv {
struct {
struct nouveau_gpuobj *mem[2];
int active;
#ifdef __NetBSD__
spinlock_t lock;
drm_waitqueue_t wait;
#else
wait_queue_head_t wait;
#endif
} runlist;
struct {
@ -106,10 +114,24 @@ nvc0_fifo_runlist_update(struct nvc0_fifo_priv *priv)
nv_wr32(priv, 0x002270, cur->addr >> 12);
nv_wr32(priv, 0x002274, 0x01f00000 | (p >> 3));
#ifdef __NetBSD__
{
int ret;
spin_lock(&priv->runlist.lock);
DRM_SPIN_TIMED_WAIT_UNTIL(ret, &priv->runlist.wait,
&priv->runlist.lock, msecs_to_jiffies(2000),
!(nv_rd32(priv, 0x00227c) & 0x00100000));
if (ret == -ETIMEDOUT)
nv_error(priv, "runlist update timeout\n");
spin_unlock(&priv->runlist.lock);
}
#else
if (wait_event_timeout(priv->runlist.wait,
!(nv_rd32(priv, 0x00227c) & 0x00100000),
msecs_to_jiffies(2000)) == 0)
nv_error(priv, "runlist update timeout\n");
#endif
mutex_unlock(&nv_subdev(priv)->mutex);
}
@ -649,8 +671,8 @@ nvc0_fifo_intr_fault(struct nvc0_fifo_priv *priv, int unit)
if (!ec)
snprintf(ecunk, sizeof(ecunk), "UNK%02x", client);
nv_error(priv, "%s fault at 0x%010llx [%s] from %s/%s%s%s%s on "
"channel 0x%010llx [%s]\n", write ? "write" : "read",
nv_error(priv, "%s fault at 0x%010"PRIx64" [%s] from %s/%s%s%s%s on "
"channel 0x%010"PRIx64" [%s]\n", write ? "write" : "read",
(u64)vahi << 32 | valo, er ? er->name : erunk,
eu ? eu->name : euunk, hub ? "" : "GPC", gpcid, hub ? "" : "/",
ec ? ec->name : ecunk, (u64)inst << 12,
@ -714,7 +736,13 @@ nvc0_fifo_intr_runlist(struct nvc0_fifo_priv *priv)
u32 intr = nv_rd32(priv, 0x002a00);
if (intr & 0x10000000) {
#ifdef __NetBSD__
spin_lock(&priv->runlist.lock);
DRM_SPIN_WAKEUP_ONE(&priv->runlist.wait, &priv->runlist.lock);
spin_unlock(&priv->runlist.lock);
#else
wake_up(&priv->runlist.wait);
#endif
nv_wr32(priv, 0x002a00, 0x10000000);
intr &= ~0x10000000;
}
@ -860,6 +888,11 @@ nvc0_fifo_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
INIT_WORK(&priv->fault, nvc0_fifo_recover_work);
#ifdef __NetBSD__
spin_lock_init(&priv->runlist.lock);
DRM_INIT_WAITQUEUE(&priv->runlist.wait, "nvfifo");
#endif
ret = nouveau_gpuobj_new(nv_object(priv), NULL, 0x1000, 0x1000, 0,
&priv->runlist.mem[0]);
if (ret)
@ -870,7 +903,9 @@ nvc0_fifo_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
if (ret)
return ret;
#ifndef __NetBSD__
init_waitqueue_head(&priv->runlist.wait);
#endif
ret = nouveau_gpuobj_new(nv_object(priv), NULL, 128 * 0x1000, 0x1000, 0,
&priv->user.mem);
@ -903,6 +938,11 @@ nvc0_fifo_dtor(struct nouveau_object *object)
nouveau_gpuobj_ref(NULL, &priv->runlist.mem[0]);
nouveau_gpuobj_ref(NULL, &priv->runlist.mem[1]);
#ifdef __NetBSD__
DRM_DESTROY_WAITQUEUE(&priv->runlist.wait);
spin_lock_destroy(&priv->runlist.lock);
#endif
nouveau_fifo_destroy(&priv->base);
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_engine_fifo_nve0.c,v 1.1.1.1 2014/08/06 12:36:24 riastradh Exp $ */
/* $NetBSD: nouveau_engine_fifo_nve0.c,v 1.2 2014/08/23 08:03:33 riastradh Exp $ */
/*
* Copyright 2012 Red Hat Inc.
@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_engine_fifo_nve0.c,v 1.1.1.1 2014/08/06 12:36:24 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_engine_fifo_nve0.c,v 1.2 2014/08/23 08:03:33 riastradh Exp $");
#include <core/client.h>
#include <core/handle.h>
@ -43,6 +43,9 @@ __KERNEL_RCSID(0, "$NetBSD: nouveau_engine_fifo_nve0.c,v 1.1.1.1 2014/08/06 12:3
#include <engine/dmaobj.h>
#include <drm/drmP.h> /* XXX */
#include <linux/workqueue.h> /* XXX */
#include "nve0.h"
#define _(a,b) { (a), ((1ULL << (a)) | (b)) }
@ -65,7 +68,12 @@ static const struct {
struct nve0_fifo_engn {
struct nouveau_gpuobj *runlist[2];
int cur_runlist;
#ifdef __NetBSD__
spinlock_t lock;
drm_waitqueue_t wait;
#else
wait_queue_head_t wait;
#endif
};
struct nve0_fifo_priv {
@ -127,10 +135,25 @@ nve0_fifo_runlist_update(struct nve0_fifo_priv *priv, u32 engine)
nv_wr32(priv, 0x002270, cur->addr >> 12);
nv_wr32(priv, 0x002274, (engine << 20) | (p >> 3));
#ifdef __NetBSD__
{
int ret;
spin_lock(&engn->lock);
DRM_SPIN_TIMED_WAIT_UNTIL(ret, &engn->wait, &engn->lock,
msecs_to_jiffies(2000),
!(nv_rd32(priv, 0x002284 +
(engine * 0x08)) & 0x00100000));
if (ret == -ETIMEDOUT)
nv_error(priv, "runlist %d update timeout\n", engine);
spin_unlock(&engn->lock);
}
#else
if (wait_event_timeout(engn->wait, !(nv_rd32(priv, 0x002284 +
(engine * 0x08)) & 0x00100000),
msecs_to_jiffies(2000)) == 0)
nv_error(priv, "runlist %d update timeout\n", engine);
#endif
mutex_unlock(&nv_subdev(priv)->mutex);
}
@ -764,8 +787,8 @@ nve0_fifo_intr_fault(struct nve0_fifo_priv *priv, int unit)
if (!ec)
snprintf(ecunk, sizeof(ecunk), "UNK%02x", client);
nv_error(priv, "%s fault at 0x%010llx [%s] from %s/%s%s%s%s on "
"channel 0x%010llx [%s]\n", write ? "write" : "read",
nv_error(priv, "%s fault at 0x%010"PRIx64" [%s] from %s/%s%s%s%s on "
"channel 0x%010"PRIx64" [%s]\n", write ? "write" : "read",
(u64)vahi << 32 | valo, er ? er->name : erunk,
eu ? eu->name : euunk, hub ? "" : "GPC", gpcid, hub ? "" : "/",
ec ? ec->name : ecunk, (u64)inst << 12,
@ -855,7 +878,14 @@ nve0_fifo_intr_runlist(struct nve0_fifo_priv *priv)
u32 mask = nv_rd32(priv, 0x002a00);
while (mask) {
u32 engn = __ffs(mask);
#ifdef __NetBSD__
spin_lock(&priv->engine[engn].lock);
DRM_SPIN_WAKEUP_ONE(&priv->engine[engn].wait,
&priv->engine[engn].lock);
spin_unlock(&priv->engine[engn].lock);
#else
wake_up(&priv->engine[engn].wait);
#endif
nv_wr32(priv, 0x002a00, 1 << engn);
mask &= ~(1 << engn);
}
@ -1026,6 +1056,10 @@ nve0_fifo_dtor(struct nouveau_object *object)
for (i = 0; i < FIFO_ENGINE_NR; i++) {
nouveau_gpuobj_ref(NULL, &priv->engine[i].runlist[1]);
nouveau_gpuobj_ref(NULL, &priv->engine[i].runlist[0]);
#ifdef __NetBSD__
DRM_DESTROY_WAITQUEUE(&priv->engine[i].wait);
spin_lock_destroy(&priv->engine[i].lock);
#endif
}
nouveau_fifo_destroy(&priv->base);
@ -1059,7 +1093,12 @@ nve0_fifo_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
if (ret)
return ret;
#ifdef __NetBSD__
spin_lock_init(&priv->engine[i].lock);
DRM_INIT_WAITQUEUE(&priv->engine[i].wait, "nve0fifo");
#else
init_waitqueue_head(&priv->engine[i].wait);
#endif
}
ret = nouveau_gpuobj_new(nv_object(priv), NULL, impl->channels * 0x200,

View File

@ -8,6 +8,7 @@ int nve0_fifo_ctor(struct nouveau_object *, struct nouveau_object *,
struct nouveau_object **);
void nve0_fifo_dtor(struct nouveau_object *);
int nve0_fifo_init(struct nouveau_object *);
int nve0_fifo_fini(struct nouveau_object *, bool);
struct nve0_fifo_impl {
struct nouveau_oclass base;

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_engine_graph_ctxnvd7.c,v 1.1.1.1 2014/08/06 12:36:25 riastradh Exp $ */
/* $NetBSD: nouveau_engine_graph_ctxnvd7.c,v 1.2 2014/08/23 08:03:33 riastradh Exp $ */
/*
* Copyright 2013 Red Hat Inc.
@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_engine_graph_ctxnvd7.c,v 1.1.1.1 2014/08/06 12:36:25 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_engine_graph_ctxnvd7.c,v 1.2 2014/08/23 08:03:33 riastradh Exp $");
#include "ctxnvc0.h"
@ -222,7 +222,7 @@ nvd7_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
mmio_list(0x17e91c, 0x03060609, 0, 0); /* different from kepler */
}
void
static void
nvd7_grctx_generate_main(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
{
struct nvc0_grctx_oclass *oclass = (void *)nv_engine(priv)->cclass;

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_engine_graph_gm107.c,v 1.1.1.1 2014/08/06 12:36:25 riastradh Exp $ */
/* $NetBSD: nouveau_engine_graph_gm107.c,v 1.2 2014/08/23 08:03:33 riastradh Exp $ */
/*
* Copyright 2013 Red Hat Inc.
@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_engine_graph_gm107.c,v 1.1.1.1 2014/08/06 12:36:25 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_engine_graph_gm107.c,v 1.2 2014/08/23 08:03:33 riastradh Exp $");
#include <subdev/bios.h>
#include <subdev/bios/P0260.h>
@ -323,7 +323,7 @@ gm107_graph_init_bios(struct nvc0_graph_priv *priv)
}
}
int
static int
gm107_graph_init(struct nouveau_object *object)
{
struct nvc0_graph_oclass *oclass = (void *)object->oclass;

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_engine_graph_nv50.c,v 1.1.1.1 2014/08/06 12:36:26 riastradh Exp $ */
/* $NetBSD: nouveau_engine_graph_nv50.c,v 1.2 2014/08/23 08:03:33 riastradh Exp $ */
/*
* Copyright 2012 Red Hat Inc.
@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_engine_graph_nv50.c,v 1.1.1.1 2014/08/06 12:36:26 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_engine_graph_nv50.c,v 1.2 2014/08/23 08:03:33 riastradh Exp $");
#include <core/os.h>
#include <core/class.h>
@ -621,7 +621,7 @@ nv50_graph_trap_handler(struct nv50_graph_priv *priv, u32 display,
nv_error(priv, "TRAP DISPATCH_FAULT\n");
if (display && (addr & 0x80000000)) {
nv_error(priv,
"ch %d [0x%010llx %s] subc %d class 0x%04x mthd 0x%04x data 0x%08x%08x 400808 0x%08x 400848 0x%08x\n",
"ch %d [0x%010"PRIx64" %s] subc %d class 0x%04x mthd 0x%04x data 0x%08x%08x 400808 0x%08x 400848 0x%08x\n",
chid, inst,
nouveau_client_name(engctx), subc,
class, mthd, datah, datal, addr, r848);
@ -646,7 +646,7 @@ nv50_graph_trap_handler(struct nv50_graph_priv *priv, u32 display,
nv_error(priv, "TRAP DISPATCH_QUERY\n");
if (display && (addr & 0x80000000)) {
nv_error(priv,
"ch %d [0x%010llx %s] subc %d class 0x%04x mthd 0x%04x data 0x%08x 40084c 0x%08x\n",
"ch %d [0x%010"PRIx64" %s] subc %d class 0x%04x mthd 0x%04x data 0x%08x 40084c 0x%08x\n",
chid, inst,
nouveau_client_name(engctx), subc,
class, mthd, data, addr);
@ -850,7 +850,7 @@ nv50_graph_intr(struct nouveau_subdev *subdev)
pr_cont("\n");
}
nv_error(priv,
"ch %d [0x%010llx %s] subc %d class 0x%04x mthd 0x%04x data 0x%08x\n",
"ch %d [0x%010"PRIx64" %s] subc %d class 0x%04x mthd 0x%04x data 0x%08x\n",
chid, (u64)inst << 12, nouveau_client_name(engctx),
subc, class, mthd, data);
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_engine_graph_nvc0.c,v 1.1.1.1 2014/08/06 12:36:26 riastradh Exp $ */
/* $NetBSD: nouveau_engine_graph_nvc0.c,v 1.2 2014/08/23 08:03:33 riastradh Exp $ */
/*
* Copyright 2012 Red Hat Inc.
@ -25,7 +25,9 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_engine_graph_nvc0.c,v 1.1.1.1 2014/08/06 12:36:26 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_engine_graph_nvc0.c,v 1.2 2014/08/23 08:03:33 riastradh Exp $");
#include <linux/string.h> /* XXX */
#include "nvc0.h"
#include "ctxnvc0.h"
@ -832,7 +834,7 @@ nvc0_graph_intr(struct nouveau_subdev *subdev)
handle = nouveau_handle_get_class(engctx, class);
if (!handle || nv_call(handle->object, mthd, data)) {
nv_error(priv,
"ILLEGAL_MTHD ch %d [0x%010llx %s] subc %d class 0x%04x mthd 0x%04x data 0x%08x\n",
"ILLEGAL_MTHD ch %d [0x%010"PRIx64" %s] subc %d class 0x%04x mthd 0x%04x data 0x%08x\n",
chid, inst << 12, nouveau_client_name(engctx),
subc, class, mthd, data);
}
@ -843,7 +845,7 @@ nvc0_graph_intr(struct nouveau_subdev *subdev)
if (stat & 0x00000020) {
nv_error(priv,
"ILLEGAL_CLASS ch %d [0x%010llx %s] subc %d class 0x%04x mthd 0x%04x data 0x%08x\n",
"ILLEGAL_CLASS ch %d [0x%010"PRIx64" %s] subc %d class 0x%04x mthd 0x%04x data 0x%08x\n",
chid, inst << 12, nouveau_client_name(engctx), subc,
class, mthd, data);
nv_wr32(priv, 0x400100, 0x00000020);
@ -853,7 +855,7 @@ nvc0_graph_intr(struct nouveau_subdev *subdev)
if (stat & 0x00100000) {
nv_error(priv, "DATA_ERROR [");
nouveau_enum_print(nv50_data_error_names, code);
pr_cont("] ch %d [0x%010llx %s] subc %d class 0x%04x mthd 0x%04x data 0x%08x\n",
pr_cont("] ch %d [0x%010"PRIx64" %s] subc %d class 0x%04x mthd 0x%04x data 0x%08x\n",
chid, inst << 12, nouveau_client_name(engctx), subc,
class, mthd, data);
nv_wr32(priv, 0x400100, 0x00100000);
@ -861,7 +863,7 @@ nvc0_graph_intr(struct nouveau_subdev *subdev)
}
if (stat & 0x00200000) {
nv_error(priv, "TRAP ch %d [0x%010llx %s]\n", chid, inst << 12,
nv_error(priv, "TRAP ch %d [0x%010"PRIx64" %s]\n", chid, inst << 12,
nouveau_client_name(engctx));
nvc0_graph_trap_intr(priv);
nv_wr32(priv, 0x400100, 0x00200000);
@ -883,7 +885,7 @@ nvc0_graph_intr(struct nouveau_subdev *subdev)
nouveau_engctx_put(engctx);
}
void
static void
nvc0_graph_init_fw(struct nvc0_graph_priv *priv, u32 fuc_base,
struct nvc0_graph_fuc *code, struct nvc0_graph_fuc *data)
{
@ -1212,7 +1214,7 @@ nvc0_graph_dtor_fw(struct nvc0_graph_fuc *fuc)
fuc->data = NULL;
}
int
static int
nvc0_graph_ctor_fw(struct nvc0_graph_priv *priv, const char *fwname,
struct nvc0_graph_fuc *fuc)
{

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_engine_xtensa.c,v 1.1.1.1 2014/08/06 12:36:24 riastradh Exp $ */
/* $NetBSD: nouveau_engine_xtensa.c,v 1.2 2014/08/23 08:03:33 riastradh Exp $ */
/*
* Copyright 2013 Ilia Mirkin
@ -23,7 +23,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_engine_xtensa.c,v 1.1.1.1 2014/08/06 12:36:24 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_engine_xtensa.c,v 1.2 2014/08/23 08:03:33 riastradh Exp $");
#include <engine/xtensa.h>
@ -136,8 +136,8 @@ _nouveau_xtensa_init(struct nouveau_object *object)
return ret;
}
nv_debug(xtensa, "Loading firmware to address: 0x%llx\n",
xtensa->gpu_fw->addr);
nv_debug(xtensa, "Loading firmware to address: 0x%"PRIxMAX"\n",
(uintmax_t)xtensa->gpu_fw->addr);
for (i = 0; i < fw->size / 4; i++)
nv_wo32(xtensa->gpu_fw, i * 4, *((u32 *)fw->data + i));

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_engine_perfmon_base.c,v 1.1.1.1 2014/08/06 12:36:27 riastradh Exp $ */
/* $NetBSD: nouveau_engine_perfmon_base.c,v 1.2 2014/08/23 08:03:34 riastradh Exp $ */
/*
* Copyright 2013 Red Hat Inc.
@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_engine_perfmon_base.c,v 1.1.1.1 2014/08/06 12:36:27 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_engine_perfmon_base.c,v 1.2 2014/08/23 08:03:34 riastradh Exp $");
#include <core/option.h>
#include <core/class.h>
@ -60,7 +60,7 @@ nouveau_perfsig_find_(struct nouveau_perfdom *dom, const char *name, u32 size)
return NULL;
}
struct nouveau_perfsig *
static struct nouveau_perfsig *
nouveau_perfsig_find(struct nouveau_perfmon *ppm, const char *name, u32 size,
struct nouveau_perfdom **pdom)
{

View File

@ -167,11 +167,13 @@ nv_device_resource_start(struct nouveau_device *device, unsigned int bar);
resource_size_t
nv_device_resource_len(struct nouveau_device *device, unsigned int bar);
#ifndef __NetBSD__
dma_addr_t
nv_device_map_page(struct nouveau_device *device, struct page *page);
void
nv_device_unmap_page(struct nouveau_device *device, dma_addr_t addr);
#endif
int
nv_device_get_irq(struct nouveau_device *device, bool stall);

View File

@ -30,4 +30,9 @@ int gm100_identify(struct nouveau_device *);
struct nouveau_device *nouveau_device_find(u64 name);
#ifdef __NetBSD__
void nouveau_devices_init(void);
void nouveau_devices_fini(void);
#endif
#endif

View File

@ -13,8 +13,9 @@ struct nouveau_bar {
int (*alloc)(struct nouveau_bar *, struct nouveau_object *,
struct nouveau_mem *, struct nouveau_object **);
#ifdef __NetBSD__
bus_space_tag_t bst;
bus_space_handle_t bsh;
bus_space_tag_t iomemt;
bus_space_handle_t iomemh;
bus_size_t iomemsz;
#else
void __iomem *iomem;
#endif

View File

@ -33,7 +33,11 @@ struct nouveau_mem {
struct nouveau_mm_node *tag;
struct list_head regions;
#ifdef __NetBSD__
bus_dmamap_t pages;
#else
dma_addr_t *pages;
#endif
u32 memtype;
u64 offset;
u64 size;

View File

@ -3,6 +3,8 @@
#include <core/subdev.h>
#include <core/device.h>
#include <linux/workqueue.h> /* XXX */
#include <drm/drmP.h> /* XXX */
struct nouveau_pwr {
struct nouveau_subdev base;
@ -29,7 +31,12 @@ struct nouveau_pwr {
u32 size;
struct work_struct work;
#ifdef __NetBSD__
struct mutex lock;
drm_waitqueue_t wait;
#else
wait_queue_head_t wait;
#endif
u32 process;
u32 message;
u32 data[2];
@ -59,7 +66,11 @@ nouveau_pwr(void *obj)
int nouveau_pwr_create_(struct nouveau_object *, struct nouveau_object *,
struct nouveau_oclass *, int, void **);
#ifdef __NetBSD__
int _nouveau_pwr_dtor(struct nouveau_object *);
#else
#define _nouveau_pwr_dtor _nouveau_subdev_dtor
#endif
int _nouveau_pwr_init(struct nouveau_object *);
int _nouveau_pwr_fini(struct nouveau_object *, bool);

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_subdev_bar_base.c,v 1.1.1.1 2014/08/06 12:36:28 riastradh Exp $ */
/* $NetBSD: nouveau_subdev_bar_base.c,v 1.2 2014/08/23 08:03:34 riastradh Exp $ */
/*
* Copyright 2012 Red Hat Inc.
@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_subdev_bar_base.c,v 1.1.1.1 2014/08/06 12:36:28 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_subdev_bar_base.c,v 1.2 2014/08/23 08:03:34 riastradh Exp $");
#include <core/object.h>
@ -37,7 +37,12 @@ __KERNEL_RCSID(0, "$NetBSD: nouveau_subdev_bar_base.c,v 1.1.1.1 2014/08/06 12:36
struct nouveau_barobj {
struct nouveau_object base;
struct nouveau_vma vma;
#ifdef __NetBSD__
bus_space_tag_t iomemt;
bus_space_handle_t iomemh;
#else
void __iomem *iomem;
#endif
};
static int
@ -59,7 +64,15 @@ nouveau_barobj_ctor(struct nouveau_object *parent,
if (ret)
return ret;
#ifdef __NetBSD__
barobj->iomemt = bar->iomemt;
if (bus_space_subregion(bar->iomemt, bar->iomemh, barobj->vma.offset,
bar->iomemsz - barobj->vma.offset, &barobj->iomemh) != 0)
/* XXX error branch */
return ret;
#else
barobj->iomem = bar->iomem + (u32)barobj->vma.offset;
#endif
return 0;
}
@ -77,14 +90,22 @@ static u32
nouveau_barobj_rd32(struct nouveau_object *object, u64 addr)
{
struct nouveau_barobj *barobj = (void *)object;
#ifdef __NetBSD__
return bus_space_read_4(barobj->iomemt, barobj->iomemh, addr);
#else
return ioread32_native(barobj->iomem + addr);
#endif
}
static void
nouveau_barobj_wr32(struct nouveau_object *object, u64 addr, u32 data)
{
struct nouveau_barobj *barobj = (void *)object;
#ifdef __NetBSD__
bus_space_write_4(barobj->iomemt, barobj->iomemh, addr, data);
#else
iowrite32_native(data, barobj->iomem + addr);
#endif
}
static struct nouveau_oclass
@ -123,16 +144,29 @@ nouveau_bar_create_(struct nouveau_object *parent,
if (ret)
return ret;
#ifdef __NetBSD__
bar->iomemt = nv_device_resource_tag(device, 3);
bar->iomemsz = nv_device_resource_len(device, 3);
if (bus_space_map(bar->iomemt, nv_device_resource_start(device, 3),
bar->iomemsz, 0, &bar->iomemh))
bar->iomemsz = 0; /* XXX Fail? */
#else
bar->iomem = ioremap(nv_device_resource_start(device, 3),
nv_device_resource_len(device, 3));
#endif
return 0;
}
void
nouveau_bar_destroy(struct nouveau_bar *bar)
{
#ifdef __NetBSD__
if (bar->iomemsz)
bus_space_unmap(bar->iomemt, bar->iomemh, bar->iomemsz);
#else
if (bar->iomem)
iounmap(bar->iomem);
#endif
nouveau_subdev_destroy(&bar->base);
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_subdev_instmem_nv04.c,v 1.1.1.1 2014/08/06 12:36:31 riastradh Exp $ */
/* $NetBSD: nouveau_subdev_instmem_nv04.c,v 1.2 2014/08/23 08:03:34 riastradh Exp $ */
/*
* Copyright 2012 Red Hat Inc.
@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_subdev_instmem_nv04.c,v 1.1.1.1 2014/08/06 12:36:31 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_subdev_instmem_nv04.c,v 1.2 2014/08/23 08:03:34 riastradh Exp $");
#include "nv04.h"
@ -121,8 +121,13 @@ nv04_instmem_dtor(struct nouveau_object *object)
nouveau_ramht_ref(NULL, &priv->ramht);
nouveau_gpuobj_ref(NULL, &priv->vbios);
nouveau_mm_fini(&priv->heap);
#ifdef __NetBSD__
if (priv->iomemsz)
bus_space_unmap(priv->iomemt, priv->iomemh, priv->iomemsz);
#else
if (priv->iomem)
iounmap(priv->iomem);
#endif
nouveau_instmem_destroy(&priv->base);
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_subdev_instmem_nv40.c,v 1.1.1.1 2014/08/06 12:36:31 riastradh Exp $ */
/* $NetBSD: nouveau_subdev_instmem_nv40.c,v 1.2 2014/08/23 08:03:34 riastradh Exp $ */
/*
* Copyright 2012 Red Hat Inc.
@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_subdev_instmem_nv40.c,v 1.1.1.1 2014/08/06 12:36:31 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_subdev_instmem_nv40.c,v 1.2 2014/08/23 08:03:34 riastradh Exp $");
#include <engine/graph/nv40.h>
@ -39,14 +39,22 @@ static u32
nv40_instmem_rd32(struct nouveau_object *object, u64 addr)
{
struct nv04_instmem_priv *priv = (void *)object;
#ifdef __NetBSD__
return bus_space_read_4(priv->iomemt, priv->iomemh, addr);
#else
return ioread32_native(priv->iomem + addr);
#endif
}
static void
nv40_instmem_wr32(struct nouveau_object *object, u64 addr, u32 data)
{
struct nv04_instmem_priv *priv = (void *)object;
#ifdef __NetBSD__
bus_space_write_4(priv->iomemt, priv->iomemh, addr, data);
#else
iowrite32_native(data, priv->iomem + addr);
#endif
}
static int
@ -69,12 +77,23 @@ nv40_instmem_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
else
bar = 3;
#ifdef __NetBSD__
priv->iomemt = nv_device_resource_tag(device, bar);
priv->iomemsz = nv_device_resource_len(device, bar);
if (bus_space_map(priv->iomemt, nv_device_resource_start(device, bar),
priv->iomemsz, 0, &priv->iomemh)) {
priv->iomemsz = 0;
nv_error(priv, "unable to map PRAMIN BAR\n");
return -EFAULT;
}
#else
priv->iomem = ioremap(nv_device_resource_start(device, bar),
nv_device_resource_len(device, bar));
if (!priv->iomem) {
nv_error(priv, "unable to map PRAMIN BAR\n");
return -EFAULT;
}
#endif
/* PRAMIN aperture maps over the end of vram, reserve enough space
* to fit graphics contexts for every channel, the magics come

View File

@ -12,7 +12,13 @@ extern struct nouveau_instobj_impl nv04_instobj_oclass;
struct nv04_instmem_priv {
struct nouveau_instmem base;
#ifdef __NetBSD__
bus_space_tag_t iomemt;
bus_space_handle_t iomemh;
bus_size_t iomemsz;
#else
void __iomem *iomem;
#endif
struct nouveau_mm heap;
struct nouveau_gpuobj *vbios;

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_subdev_pwr_base.c,v 1.1.1.1 2014/08/06 12:36:31 riastradh Exp $ */
/* $NetBSD: nouveau_subdev_pwr_base.c,v 1.2 2014/08/23 08:03:34 riastradh Exp $ */
/*
* Copyright 2013 Red Hat Inc.
@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_subdev_pwr_base.c,v 1.1.1.1 2014/08/06 12:36:31 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_subdev_pwr_base.c,v 1.2 2014/08/23 08:03:34 riastradh Exp $");
#include <subdev/pwr.h>
#include <subdev/timer.h>
@ -110,16 +110,27 @@ nouveau_pwr_recv(struct work_struct *work)
nv_wr32(ppwr, 0x10a580, 0x00000000);
/* wake process if it's waiting on a synchronous reply */
#ifdef __NetBSD__
mutex_lock(&ppwr->recv.lock);
#endif
if (ppwr->recv.process) {
if (process == ppwr->recv.process &&
message == ppwr->recv.message) {
ppwr->recv.data[0] = data0;
ppwr->recv.data[1] = data1;
ppwr->recv.process = 0;
#ifdef __NetBSD__
DRM_WAKEUP_ONE(&ppwr->recv.wait, &ppwr->recv.lock);
mutex_unlock(&ppwr->recv.lock);
#else
wake_up(&ppwr->recv.wait);
#endif
return;
}
}
#ifdef __NetBSD__
mutex_unlock(&ppwr->recv.lock);
#endif
/* right now there's no other expected responses from the engine,
* so assume that any unexpected message is an error.
@ -247,6 +258,24 @@ nouveau_pwr_create_(struct nouveau_object *parent,
return ret;
INIT_WORK(&ppwr->recv.work, nouveau_pwr_recv);
#ifdef __NetBSD__
linux_mutex_init(&ppwr->recv.lock);
DRM_INIT_WAITQUEUE(&ppwr->recv.wait, "nvppwr");
#else
init_waitqueue_head(&ppwr->recv.wait);
#endif
return 0;
}
#ifdef __NetBSD__
int
_nouveau_pwr_dtor(struct nouveau_object *object)
{
struct nouveau_pwr *ppwr = (void *)object;
DRM_DESTROY_WAITQUEUE(&ppwr->recv.wait);
linux_mutex_destroy(&ppwr->recv.lock);
_nouveau_subdev_dtor(object);
}
#endif

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_dispnv04_tvmodesnv17.c,v 1.2 2014/08/06 15:01:34 riastradh Exp $ */
/* $NetBSD: nouveau_dispnv04_tvmodesnv17.c,v 1.3 2014/08/23 08:03:34 riastradh Exp $ */
/*
* Copyright (C) 2009 Francisco Jerez.
@ -27,8 +27,9 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_dispnv04_tvmodesnv17.c,v 1.2 2014/08/06 15:01:34 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_dispnv04_tvmodesnv17.c,v 1.3 2014/08/23 08:03:34 riastradh Exp $");
#include <asm/div64.h> /* XXX */
#include <drm/drmP.h>
#include <drm/drm_crtc_helper.h>
#include "nouveau_drm.h"

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_dispnv04_tvnv17.c,v 1.2 2014/08/06 15:01:34 riastradh Exp $ */
/* $NetBSD: nouveau_dispnv04_tvnv17.c,v 1.3 2014/08/23 08:03:34 riastradh Exp $ */
/*
* Copyright (C) 2009 Francisco Jerez.
@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_dispnv04_tvnv17.c,v 1.2 2014/08/06 15:01:34 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_dispnv04_tvnv17.c,v 1.3 2014/08/23 08:03:34 riastradh Exp $");
#include <drm/drmP.h>
#include <drm/drm_crtc_helper.h>
@ -324,7 +324,7 @@ static int nv17_tv_mode_valid(struct drm_encoder *encoder,
const struct nv17_tv_norm_params *tv_norm = get_tv_norm(encoder);
if (tv_norm->kind == CTV_ENC_MODE) {
struct drm_display_mode *output_mode =
const struct drm_display_mode *output_mode =
&tv_norm->ctv_enc_mode.mode;
if (mode->clock > 400000)
@ -534,7 +534,7 @@ static void nv17_tv_mode_set(struct drm_encoder *encoder,
tv_regs->tv_enc[i] = tv_norm->tv_enc_mode.tv_enc[i];
} else {
struct drm_display_mode *output_mode =
const struct drm_display_mode *output_mode =
&tv_norm->ctv_enc_mode.mode;
/* The registers in PRAMDAC+0xc00 control some timings and CSC

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_bo.c,v 1.4 2014/08/06 15:01:33 riastradh Exp $ */
/* $NetBSD: nouveau_bo.c,v 1.5 2014/08/23 08:03:33 riastradh Exp $ */
/*
* Copyright 2007 Dave Airlied
@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_bo.c,v 1.4 2014/08/06 15:01:33 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_bo.c,v 1.5 2014/08/23 08:03:33 riastradh Exp $");
#include <core/engine.h>
#include <linux/swiotlb.h>
@ -1401,8 +1401,10 @@ static int
nouveau_ttm_tt_populate(struct ttm_tt *ttm)
{
struct ttm_dma_tt *ttm_dma = (void *)ttm;
#ifndef __NetBSD__
#if defined(__OS_HAS_AGP) || !defined(__NetBSD__)
struct nouveau_drm *drm;
#endif
#ifndef __NetBSD__
struct nouveau_device *device;
struct drm_device *dev;
unsigned i;
@ -1425,8 +1427,10 @@ nouveau_ttm_tt_populate(struct ttm_tt *ttm)
}
#endif
#ifndef __NetBSD__
#if defined(__OS_HAS_AGP) || !defined(__NetBSD__)
drm = nouveau_bdev(ttm->bdev);
#endif
#ifndef __NetBSD__
device = nv_device(drm->device);
dev = drm->dev;
#endif
@ -1472,8 +1476,10 @@ static void
nouveau_ttm_tt_unpopulate(struct ttm_tt *ttm)
{
struct ttm_dma_tt *ttm_dma = (void *)ttm;
#ifndef __NetBSD__
#if defined(__OS_HAS_AGP) || !defined(__NetBSD__)
struct nouveau_drm *drm;
#endif
#ifndef __NetBSD__
struct nouveau_device *device;
struct drm_device *dev;
unsigned i;
@ -1483,8 +1489,10 @@ nouveau_ttm_tt_unpopulate(struct ttm_tt *ttm)
if (slave)
return;
#ifndef __NetBSD__
#if defined(__OS_HAS_AGP) || !defined(__NetBSD__)
drm = nouveau_bdev(ttm->bdev);
#endif
#ifndef __NetBSD__
device = nv_device(drm->device);
dev = drm->dev;
#endif

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_drm.c,v 1.2 2014/08/06 15:01:33 riastradh Exp $ */
/* $NetBSD: nouveau_drm.c,v 1.3 2014/08/23 08:03:33 riastradh Exp $ */
/*
* Copyright 2012 Red Hat Inc.
@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_drm.c,v 1.2 2014/08/06 15:01:33 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_drm.c,v 1.3 2014/08/23 08:03:33 riastradh Exp $");
#include <linux/console.h>
#include <linux/module.h>
@ -85,12 +85,20 @@ int nouveau_runtime_pm = -1;
module_param_named(runpm, nouveau_runtime_pm, int, 0400);
static struct drm_driver driver;
#ifdef __NetBSD__
struct drm_driver *const nouveau_drm_driver = &driver;
#endif
static u64
nouveau_pci_name(struct pci_dev *pdev)
{
#ifdef __NetBSD__
u64 name = (u64)device_unit(device_parent(pdev->pd_dev)) << 32;
name |= (u64)pdev->pd_pa.pa_bus << 16;
#else
u64 name = (u64)pci_domain_nr(pdev->bus) << 32;
name |= pdev->bus->number << 16;
#endif
name |= PCI_SLOT(pdev->devfn) << 8;
return name | PCI_FUNC(pdev->devfn);
}
@ -335,6 +343,7 @@ static int nouveau_drm_probe(struct pci_dev *pdev,
static void
nouveau_get_hdmi_dev(struct nouveau_drm *drm)
{
#ifndef __NetBSD__ /* XXX nouveau hdmi */
struct pci_dev *pdev = drm->dev->pdev;
if (!pdev) {
@ -358,6 +367,7 @@ nouveau_get_hdmi_dev(struct nouveau_drm *drm)
drm->hdmi_device = NULL;
return;
}
#endif
}
static int
@ -504,12 +514,15 @@ nouveau_drm_unload(struct drm_device *dev)
nouveau_agp_fini(drm);
nouveau_vga_fini(drm);
#ifndef __NetBSD__ /* XXX nouveau hdmi */
if (drm->hdmi_device)
pci_dev_put(drm->hdmi_device);
#endif
nouveau_cli_destroy(&drm->client);
return 0;
}
#ifndef __NetBSD__ /* XXX nouveau detach */
static void
nouveau_drm_remove(struct pci_dev *pdev)
{
@ -524,7 +537,9 @@ nouveau_drm_remove(struct pci_dev *pdev)
nouveau_object_ref(NULL, &device);
nouveau_object_debug();
}
#endif
#ifndef __NetBSD__ /* XXX nouveau pm */
static int
nouveau_do_suspend(struct drm_device *dev, bool runtime)
{
@ -706,14 +721,18 @@ static int nouveau_pmops_thaw(struct device *dev)
nouveau_display_resume(drm_dev);
return 0;
}
#endif /* XXX nouveau pm */
static int
nouveau_drm_open(struct drm_device *dev, struct drm_file *fpriv)
{
struct nouveau_drm *drm = nouveau_drm(dev);
struct nouveau_cli *cli;
#ifdef __NetBSD__
const char name[] = "user";
#else
char name[32], tmpname[TASK_COMM_LEN];
#endif
int ret;
/* need to bring up power immediately if opening device */
@ -721,8 +740,10 @@ nouveau_drm_open(struct drm_device *dev, struct drm_file *fpriv)
if (ret < 0 && ret != -EACCES)
return ret;
#ifndef __NetBSD__
get_task_comm(tmpname, current);
snprintf(name, sizeof(name), "%s[%d]", tmpname, pid_nr(fpriv->pid));
#endif
ret = nouveau_cli_create(nouveau_name(dev), name, sizeof(*cli),
(void **)&cli);
@ -794,6 +815,7 @@ nouveau_ioctls[] = {
DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_INFO, nouveau_gem_ioctl_info, DRM_UNLOCKED|DRM_AUTH|DRM_RENDER_ALLOW),
};
#ifndef __NetBSD__ /* XXX nouveau pm */
long nouveau_drm_ioctl(struct file *filp,
unsigned int cmd, unsigned long arg)
{
@ -826,6 +848,7 @@ nouveau_driver_fops = {
#endif
.llseek = noop_llseek,
};
#endif
static struct drm_driver
driver = {
@ -853,8 +876,11 @@ driver = {
.ioctls = nouveau_ioctls,
.num_ioctls = ARRAY_SIZE(nouveau_ioctls),
#ifndef __NetBSD__
.fops = &nouveau_driver_fops,
#endif
#ifndef __NetBSD__ /* XXX drm prime */
.prime_handle_to_fd = drm_gem_prime_handle_to_fd,
.prime_fd_to_handle = drm_gem_prime_fd_to_handle,
.gem_prime_export = drm_gem_prime_export,
@ -865,6 +891,7 @@ driver = {
.gem_prime_import_sg_table = nouveau_gem_prime_import_sg_table,
.gem_prime_vmap = nouveau_gem_prime_vmap,
.gem_prime_vunmap = nouveau_gem_prime_vunmap,
#endif
.gem_free_object = nouveau_gem_object_del,
.gem_open_object = nouveau_gem_object_open,
@ -886,6 +913,7 @@ driver = {
.patchlevel = DRIVER_PATCHLEVEL,
};
#ifndef __NetBSD__
static struct pci_device_id
nouveau_drm_pci_table[] = {
{
@ -900,7 +928,9 @@ nouveau_drm_pci_table[] = {
},
{}
};
#endif
#ifndef __NetBSD__ /* XXX nouveau pm */
static int nouveau_pmops_runtime_suspend(struct device *dev)
{
struct pci_dev *pdev = to_pci_dev(dev);
@ -977,6 +1007,7 @@ static int nouveau_pmops_runtime_idle(struct device *dev)
return -EBUSY;
}
#ifndef __NetBSD__ /* XXX nouveau hdmi */
/* if we have a hdmi audio device - make sure it has a driver loaded */
if (drm->hdmi_device) {
if (!drm->hdmi_device->driver) {
@ -985,6 +1016,7 @@ static int nouveau_pmops_runtime_idle(struct device *dev)
return -EBUSY;
}
}
#endif
list_for_each_entry(crtc, &drm->dev->mode_config.crtc_list, head) {
if (crtc->enabled) {
@ -1009,7 +1041,9 @@ static const struct dev_pm_ops nouveau_pm_ops = {
.runtime_resume = nouveau_pmops_runtime_resume,
.runtime_idle = nouveau_pmops_runtime_idle,
};
#endif /* XXX nouveau pm */
#ifndef __NetBSD__
static struct pci_driver
nouveau_drm_pci_driver = {
.name = "nouveau",
@ -1064,6 +1098,7 @@ nouveau_drm_exit(void)
drm_pci_exit(&driver, &nouveau_drm_pci_driver);
nouveau_unregister_dsm_handler();
}
#endif
module_init(nouveau_drm_init);
module_exit(nouveau_drm_exit);

View File

@ -139,7 +139,9 @@ struct nouveau_drm {
bool have_disp_power_ref;
struct dev_pm_domain vga_pm_domain;
#ifndef __NetBSD__ /* XXX nouveau hdmi */
struct pci_dev *hdmi_device;
#endif
};
static inline struct nouveau_drm *

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_fence.c,v 1.2 2014/08/06 13:35:13 riastradh Exp $ */
/* $NetBSD: nouveau_fence.c,v 1.3 2014/08/23 08:03:33 riastradh Exp $ */
/*
* Copyright (C) 2007 Ben Skeggs.
@ -27,10 +27,11 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_fence.c,v 1.2 2014/08/06 13:35:13 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_fence.c,v 1.3 2014/08/23 08:03:33 riastradh Exp $");
#include <drm/drmP.h>
#include <asm/param.h>
#include <linux/ktime.h>
#include <linux/hrtimer.h>
@ -210,12 +211,12 @@ nouveau_fence_wait_uevent(struct nouveau_fence *fence, bool intr)
#ifdef __NetBSD__
spin_lock(&priv->waitlock);
if (intr) {
DRM_SPIN_TIMED_WAIT_UNITL(ret,
DRM_SPIN_TIMED_WAIT_UNTIL(ret,
&priv->waitqueue, &priv->waitlock,
timeout,
nouveau_fence_done(fence));
} else {
DRM_SPIN_TIMED_WAIT_NOINTR_UNITL(ret,
DRM_SPIN_TIMED_WAIT_NOINTR_UNTIL(ret,
&priv->waitqueue, &priv->waitlock,
timeout,
nouveau_fence_done(fence));
@ -275,8 +276,10 @@ nouveau_fence_wait(struct nouveau_fence *fence, bool lazy, bool intr)
{
struct nouveau_channel *chan = fence->channel;
struct nouveau_fence_priv *priv = chan ? chan->drm->fence : NULL;
#ifndef __NetBSD__
unsigned long sleep_time = NSEC_PER_MSEC / 1000;
ktime_t t;
#endif
int ret = 0;
while (priv && priv->uevent && lazy && !nouveau_fence_done(fence)) {

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_gem.c,v 1.2 2014/08/06 15:01:33 riastradh Exp $ */
/* $NetBSD: nouveau_gem.c,v 1.3 2014/08/23 08:03:33 riastradh Exp $ */
/*
* Copyright (C) 2008 Ben Skeggs.
@ -27,10 +27,12 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_gem.c,v 1.2 2014/08/06 15:01:33 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_gem.c,v 1.3 2014/08/23 08:03:33 riastradh Exp $");
#include <subdev/fb.h>
#include <linux/err.h> /* XXX */
#include "nouveau_drm.h"
#include "nouveau_dma.h"
#include "nouveau_fence.h"
@ -45,8 +47,10 @@ nouveau_gem_object_del(struct drm_gem_object *gem)
struct nouveau_bo *nvbo = nouveau_gem_object(gem);
struct ttm_buffer_object *bo = &nvbo->bo;
#ifndef __NetBSD__ /* XXX drm prime */
if (gem->import_attach)
drm_prime_gem_destroy(gem, nvbo->bo.sg);
#endif
drm_gem_object_release(gem);
@ -459,6 +463,10 @@ validate_sync(struct nouveau_channel *chan, struct nouveau_bo *nvbo)
return ret;
}
#ifdef __NetBSD__ /* XXX yargleblargh */
# define __force
#endif
static int
validate_list(struct nouveau_channel *chan, struct nouveau_cli *cli,
struct list_head *list, struct drm_nouveau_gem_pushbuf_bo *pbbo,

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_nv10_fence.c,v 1.1.1.1 2014/08/06 12:36:23 riastradh Exp $ */
/* $NetBSD: nouveau_nv10_fence.c,v 1.2 2014/08/23 08:03:33 riastradh Exp $ */
/*
* Copyright 2012 Red Hat Inc.
@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_nv10_fence.c,v 1.1.1.1 2014/08/06 12:36:23 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_nv10_fence.c,v 1.2 2014/08/23 08:03:33 riastradh Exp $");
#include <core/object.h>
#include <core/class.h>
@ -70,7 +70,7 @@ nv10_fence_context_del(struct nouveau_channel *chan)
kfree(fctx);
}
int
static int
nv10_fence_context_new(struct nouveau_channel *chan)
{
struct nv10_fence_chan *fctx;

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_nv50_display.c,v 1.1.1.1 2014/08/06 12:36:23 riastradh Exp $ */
/* $NetBSD: nouveau_nv50_display.c,v 1.2 2014/08/23 08:03:33 riastradh Exp $ */
/*
* Copyright 2011 Red Hat Inc.
@ -25,9 +25,10 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_nv50_display.c,v 1.1.1.1 2014/08/06 12:36:23 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_nv50_display.c,v 1.2 2014/08/23 08:03:33 riastradh Exp $");
#include <linux/dma-mapping.h>
#include <linux/err.h>
#include <drm/drmP.h>
#include <drm/drm_crtc_helper.h>
@ -132,6 +133,11 @@ nv50_pioc_create(struct nouveau_object *core, u32 bclass, u8 head,
struct nv50_dmac {
struct nv50_chan base;
#ifdef __NetBSD__
bus_dma_segment_t dmaseg;
bus_dmamap_t dmamap;
void *dmakva;
#endif
dma_addr_t handle;
u32 *ptr;
@ -145,10 +151,25 @@ static void
nv50_dmac_destroy(struct nouveau_object *core, struct nv50_dmac *dmac)
{
if (dmac->ptr) {
#ifdef __NetBSD__
const bus_dma_tag_t dmat = nv_device(core)->dmat;
bus_dmamem_unload(dmat, dmac->dmamap);
bus_dmamem_unmap(dmat, dmac->dmakva, PAGE_SIZE);
bus_dmamap_destroy(dmat, dmac->dmamap);
bus_dmamem_free(dmat, &dmac->dmaseg, 1);
dmac->handle = 0;
dmac->ptr = NULL;
#else
struct pci_dev *pdev = nv_device(core)->pdev;
pci_free_consistent(pdev, PAGE_SIZE, dmac->ptr, dmac->handle);
#endif
}
#ifdef __NetBSD__
linux_mutex_destroy(&dmac->lock);
#endif
nv50_chan_destroy(core, &dmac->base);
}
@ -282,12 +303,56 @@ nv50_dmac_create(struct nouveau_object *core, u32 bclass, u8 head,
u32 pushbuf = *(u32 *)data;
int ret;
#ifdef __NetBSD__
linux_mutex_init(&dmac->lock);
#else
mutex_init(&dmac->lock);
#endif
#ifdef __NetBSD__
{
const bus_dma_tag_t dmat = nv_device(core)->dmat;
int rsegs;
/* XXX errno NetBSD->Linux */
ret = -bus_dmamem_alloc(dmat, PAGE_SIZE, PAGE_SIZE, 0, &dmac->dmaseg,
1, &rsegs, BUS_DMA_WAITOK);
if (ret)
return ret;
KASSERT(rsegs == 1);
/* XXX errno NetBSD->Linux */
ret = -bus_dmamap_create(dmat, PAGE_SIZE, 1, PAGE_SIZE, 0,
BUS_DMA_WAITOK, &dmac->dmamap);
if (ret) {
bus_dmamem_free(dmat, &dmac->dmaseg, 1);
return ret;
}
/* XXX errno NetBSD->Linux */
ret = -bus_dmamem_map(dmat, &dmac->dmaseg, 1, PAGE_SIZE, &dmac->dmakva,
BUS_DMA_WAITOK);
if (ret) {
bus_dmamap_destroy(dmat, dmac->dmamap);
bus_dmamem_free(dmat, &dmac->dmaseg, 1);
return ret;
}
ret = -bus_dmamap_load(dmat, dmac->dmamap, dmac->dmakva, PAGE_SIZE,
BUS_DMA_WAITOK);
if (ret) {
bus_dmamem_unmap(dmat, dmac->dmakva, PAGE_SIZE);
bus_dmamap_destroy(dmat, dmac->dmamap);
bus_dmamem_free(dmat, &dmac->dmaseg, 1);
return ret;
}
dmac->handle = dmac->dmamap->dm_segs[0].ds_addr;
dmac->ptr = dmac->dmakva;
}
#else
dmac->ptr = pci_alloc_consistent(nv_device(core)->pdev, PAGE_SIZE,
&dmac->handle);
if (!dmac->ptr)
return -ENOMEM;
#endif
ret = nouveau_object_new(client, NVDRM_DEVICE, pushbuf,
NV_DMA_FROM_MEMORY_CLASS,

View File

@ -1,4 +1,4 @@
/* $NetBSD: drm_agp_netbsd.h,v 1.3 2014/07/16 20:56:25 riastradh Exp $ */
/* $NetBSD: drm_agp_netbsd.h,v 1.4 2014/08/23 08:03:33 riastradh Exp $ */
/*-
* Copyright (c) 2013 The NetBSD Foundation, Inc.
@ -41,6 +41,7 @@
#include <sys/agpio.h>
#include <dev/pci/pcivar.h> /* XXX include order botch */
#include <dev/pci/agpreg.h>
#include <dev/pci/agpvar.h>
#include <linux/kernel.h>
@ -48,6 +49,8 @@
#define __OS_HAS_AGP 1
#define PCI_AGP_COMMAND_FW AGPCMD_FWEN
__CTASSERT(PAGE_SIZE == AGP_PAGE_SIZE);
__CTASSERT(PAGE_SHIFT == AGP_PAGE_SHIFT);

View File

@ -1,4 +1,4 @@
/* $NetBSD: bitops.h,v 1.7 2014/08/06 13:50:38 riastradh Exp $ */
/* $NetBSD: bitops.h,v 1.8 2014/08/23 08:03:33 riastradh Exp $ */
/*-
* Copyright (c) 2013 The NetBSD Foundation, Inc.
@ -42,6 +42,12 @@
#include <lib/libkern/libkern.h>
static inline unsigned long
__ffs(unsigned long x)
{
return ffs64(x);
}
static inline unsigned long
__ffs64(uint64_t x)
{

View File

@ -1,4 +1,4 @@
/* $NetBSD: i2c.h,v 1.5 2014/08/06 15:01:33 riastradh Exp $ */
/* $NetBSD: i2c.h,v 1.6 2014/08/23 08:03:33 riastradh Exp $ */
/*-
* Copyright (c) 2013 The NetBSD Foundation, Inc.
@ -52,6 +52,10 @@ struct i2c_board_info {
void *platform_data;
};
#define I2C_BOARD_INFO(board_type, board_addr) \
.type = (board_type), \
.addr = (board_addr)
static inline void
i2c_new_device(const struct i2c_adapter *adapter __unused,
const struct i2c_board_info *board __unused)

View File

@ -1,4 +1,4 @@
/* $NetBSD: mutex.h,v 1.6 2014/08/06 15:01:33 riastradh Exp $ */
/* $NetBSD: mutex.h,v 1.7 2014/08/23 08:03:33 riastradh Exp $ */
/*-
* Copyright (c) 2013 The NetBSD Foundation, Inc.
@ -36,6 +36,9 @@
#include <lib/libkern/libkern.h> /* KASSERT */
#define __acquires(lock) /* XXX lockdep stuff */
#define __releases(lock) /* XXX lockdep stuff */
struct mutex {
kmutex_t mtx_lock;
};

View File

@ -1,4 +1,4 @@
/* $NetBSD: pagemap.h,v 1.2 2014/03/18 18:20:43 riastradh Exp $ */
/* $NetBSD: pagemap.h,v 1.3 2014/08/23 08:03:33 riastradh Exp $ */
/*-
* Copyright (c) 2013 The NetBSD Foundation, Inc.
@ -32,6 +32,8 @@
#ifndef _LINUX_PAGEMAP_H_
#define _LINUX_PAGEMAP_H_
#include <sys/types.h>
static inline int
fault_in_multipages_readable(const char *uaddr __unused, size_t len __unused)
{

View File

@ -1,4 +1,4 @@
/* $NetBSD: pm_runtime.h,v 1.2 2014/07/16 20:59:58 riastradh Exp $ */
/* $NetBSD: pm_runtime.h,v 1.3 2014/08/23 08:03:33 riastradh Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@ -55,6 +55,11 @@ pm_runtime_mark_last_busy(struct device *dev __unused)
{
}
static inline void
pm_runtime_put(struct device *dev __unused)
{
}
static inline void
pm_runtime_put_autosuspend(struct device *dev __unused)
{

View File

@ -1,4 +1,4 @@
/* $NetBSD: spinlock.h,v 1.3 2014/08/06 13:53:12 riastradh Exp $ */
/* $NetBSD: spinlock.h,v 1.4 2014/08/23 08:03:33 riastradh Exp $ */
/*-
* Copyright (c) 2013 The NetBSD Foundation, Inc.
@ -35,6 +35,9 @@
#include <sys/cdefs.h>
#include <sys/mutex.h>
#define __acquires(lock) /* XXX lockdep stuff */
#define __releases(lock) /* XXX lockdep stuff */
typedef struct spinlock {
kmutex_t sl_lock;
} spinlock_t;

View File

@ -1,4 +1,4 @@
/* $NetBSD: vmalloc.h,v 1.3 2014/07/16 20:56:25 riastradh Exp $ */
/* $NetBSD: vmalloc.h,v 1.4 2014/08/23 08:03:33 riastradh Exp $ */
/*-
* Copyright (c) 2013 The NetBSD Foundation, Inc.
@ -38,6 +38,19 @@
#include <linux/mm_types.h>
static inline bool
is_vmalloc_addr(void *addr)
{
/* XXX Assumes vmalloc and kmalloc both use malloc(9). */
return true;
}
static inline void *
vmalloc(unsigned long size)
{
return malloc(size, M_TEMP, M_WAITOK);
}
static inline void *
vmalloc_user(unsigned long size)
{

View File

@ -1,4 +1,4 @@
# $NetBSD: files.nouveau,v 1.2 2014/08/06 15:01:34 riastradh Exp $
# $NetBSD: files.nouveau,v 1.3 2014/08/23 08:03:34 riastradh Exp $
device nouveau: drmkms, drmkms_pci, drmkms_ttm, genfb, wsemuldisplaydev
attach nouveau at pci
@ -29,6 +29,90 @@ makeoptions nouveau "CWARNFLAGS.nouveau_engine_bsp_nve0.c"+="-Wno-missing-field-
makeoptions nouveau "CWARNFLAGS.nouveau_engine_copy_nva3.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_copy_nvc0.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_copy_nve0.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_crypt_nv84.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_crypt_nv98.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_device_base.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_device_ctrl.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_disp_gm107.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_disp_nv04.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_disp_nv50.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_disp_nv84.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_disp_nv94.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_disp_nva0.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_disp_nva3.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_disp_nvd0.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_disp_nve0.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_disp_nvf0.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_dmaobj_base.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_dmaobj_nv04.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_dmaobj_nv50.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_dmaobj_nvc0.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_dmaobj_nvd0.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_fifo_nv04.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_fifo_nv10.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_fifo_nv108.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_fifo_nv17.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_fifo_nv40.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_fifo_nv50.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_fifo_nv84.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_fifo_nvc0.c"+="-Wno-missing-field-initializers -Wno-shadow"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_fifo_nve0.c"+="-Wno-missing-field-initializers -Wno-shadow"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_graph_ctxgm107.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_graph_ctxnv108.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_graph_ctxnvc0.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_graph_ctxnvc1.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_graph_ctxnvc4.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_graph_ctxnvc8.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_graph_ctxnvd7.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_graph_ctxnvd9.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_graph_ctxnve4.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_graph_ctxnvf0.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_graph_gm107.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_graph_nv04.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_graph_nv10.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_graph_nv108.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_graph_nv20.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_graph_nv25.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_graph_nv2a.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_graph_nv30.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_graph_nv34.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_graph_nv35.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_graph_nv40.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_graph_nv50.c"+="-Wno-missing-field-initializers -Wno-shadow"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_graph_nvc0.c"+="-Wno-missing-field-initializers -Wno-shadow"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_graph_nvc1.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_graph_nvc4.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_graph_nvc8.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_graph_nvd7.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_graph_nvd9.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_graph_nve4.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_graph_nvf0.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_mpeg_nv31.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_mpeg_nv40.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_mpeg_nv44.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_mpeg_nv50.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_mpeg_nv84.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_perfmon_base.c"+="-Wno-missing-field-initializers -Wno-type-limits"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_perfmon_daemon.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_perfmon_nv40.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_perfmon_nv50.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_perfmon_nv84.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_perfmon_nva3.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_perfmon_nvc0.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_perfmon_nve0.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_perfmon_nvf0.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_ppp_nvc0.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_ppp_nv98.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_software_nv04.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_software_nv10.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_software_nv50.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_software_nvc0.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_vp_nv84.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_vp_nv98.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_vp_nvc0.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_engine_vp_nve0.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_subdev_bar_base.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_subdev_bar_nvc0.c"+="-Wno-missing-field-initializers"
file external/bsd/drm2/nouveau/nouveau_module.c nouveau
@ -347,21 +431,21 @@ file external/bsd/drm2/dist/drm/nouveau/nouveau_display.c nouveau
file external/bsd/drm2/dist/drm/nouveau/nouveau_dma.c nouveau
file external/bsd/drm2/dist/drm/nouveau/nouveau_dp.c nouveau
file external/bsd/drm2/dist/drm/nouveau/nouveau_drm.c nouveau
file external/bsd/drm2/dist/drm/nouveau/nouveau_fbcon.c nouveau
#file external/bsd/drm2/dist/drm/nouveau/nouveau_fbcon.c nouveau
file external/bsd/drm2/dist/drm/nouveau/nouveau_fence.c nouveau
file external/bsd/drm2/dist/drm/nouveau/nouveau_gem.c nouveau
file external/bsd/drm2/dist/drm/nouveau/nouveau_hwmon.c nouveau
file external/bsd/drm2/dist/drm/nouveau/nouveau_nv04_fbcon.c nouveau
#file external/bsd/drm2/dist/drm/nouveau/nouveau_nv04_fbcon.c nouveau
file external/bsd/drm2/dist/drm/nouveau/nouveau_nv04_fence.c nouveau
file external/bsd/drm2/dist/drm/nouveau/nouveau_nv10_fence.c nouveau
file external/bsd/drm2/dist/drm/nouveau/nouveau_nv17_fence.c nouveau
file external/bsd/drm2/dist/drm/nouveau/nouveau_nv50_display.c nouveau
file external/bsd/drm2/dist/drm/nouveau/nouveau_nv50_fbcon.c nouveau
#file external/bsd/drm2/dist/drm/nouveau/nouveau_nv50_fbcon.c nouveau
file external/bsd/drm2/dist/drm/nouveau/nouveau_nv50_fence.c nouveau
file external/bsd/drm2/dist/drm/nouveau/nouveau_nv84_fence.c nouveau
file external/bsd/drm2/dist/drm/nouveau/nouveau_nvc0_fbcon.c nouveau
#file external/bsd/drm2/dist/drm/nouveau/nouveau_nvc0_fbcon.c nouveau
file external/bsd/drm2/dist/drm/nouveau/nouveau_nvc0_fence.c nouveau
file external/bsd/drm2/dist/drm/nouveau/nouveau_prime.c nouveau
#file external/bsd/drm2/dist/drm/nouveau/nouveau_prime.c nouveau # XXX drm prime
file external/bsd/drm2/dist/drm/nouveau/nouveau_sgdma.c nouveau
file external/bsd/drm2/dist/drm/nouveau/nouveau_sysfs.c nouveau
file external/bsd/drm2/dist/drm/nouveau/nouveau_ttm.c nouveau

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_module.c,v 1.1 2014/08/06 13:36:07 riastradh Exp $ */
/* $NetBSD: nouveau_module.c,v 1.2 2014/08/23 08:03:34 riastradh Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_module.c,v 1.1 2014/08/06 13:36:07 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_module.c,v 1.2 2014/08/23 08:03:34 riastradh Exp $");
#include <sys/types.h>
#include <sys/module.h>
@ -42,6 +42,7 @@ __KERNEL_RCSID(0, "$NetBSD: nouveau_module.c,v 1.1 2014/08/06 13:36:07 riastradh
#include <drm/drmP.h>
#include <core/object.h>
#include <engine/device.h>
MODULE(MODULE_CLASS_DRIVER, nouveau, "drmkms,drmkms_pci"); /* XXX drmkms_i2c, drmkms_ttm */
@ -49,6 +50,8 @@ MODULE(MODULE_CLASS_DRIVER, nouveau, "drmkms,drmkms_pci"); /* XXX drmkms_i2c, dr
#include "ioconf.c"
#endif
extern struct drm_driver *const nouveau_drm_driver; /* XXX */
static int
nouveau_init(void)
{
@ -66,9 +69,12 @@ nouveau_init(void)
}
nouveau_objects_init();
nouveau_devices_init();
#if 0 /* XXX nouveau acpi */
nouveau_register_dsm_handler();
#endif
return 0;
}
int nouveau_guarantee_initialized(void); /* XXX */
@ -91,6 +97,7 @@ nouveau_fini(void)
#if 0 /* XXX nouveau acpi */
nouveau_unregister_dsm_handler();
#endif
nouveau_devices_fini();
nouveau_objects_fini();
drm_pci_exit(nouveau_drm_driver, NULL);
}