Another round of nouveau whack-a-mole.

Nouveau compiles now, though it doesn't link yet.

Need to write driver attachment, wscons framebuffer, &c.  Probably
also some i2c stuff.
This commit is contained in:
riastradh 2015-02-25 22:11:59 +00:00
parent 6e33c83b5f
commit dbd4128628
11 changed files with 173 additions and 22 deletions

View File

@ -66,7 +66,7 @@ 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 *);
void _nouveau_pwr_dtor(struct nouveau_object *);
#else
#define _nouveau_pwr_dtor _nouveau_subdev_dtor
#endif

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_subdev_pwr_base.c,v 1.3 2015/02/25 17:29:43 riastradh Exp $ */
/* $NetBSD: nouveau_subdev_pwr_base.c,v 1.4 2015/02/25 22:12:00 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.3 2015/02/25 17:29:43 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_subdev_pwr_base.c,v 1.4 2015/02/25 22:12:00 riastradh Exp $");
#include <subdev/pwr.h>
#include <subdev/timer.h>
@ -271,7 +271,7 @@ nouveau_pwr_create_(struct nouveau_object *parent,
}
#ifdef __NetBSD__
int
void
_nouveau_pwr_dtor(struct nouveau_object *object)
{
struct nouveau_pwr *ppwr = (void *)object;

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_subdev_therm_ic.c,v 1.1.1.1 2014/08/06 12:36:32 riastradh Exp $ */
/* $NetBSD: nouveau_subdev_therm_ic.c,v 1.2 2015/02/25 22:12:00 riastradh Exp $ */
/*
* Copyright 2012 Nouveau community
@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_subdev_therm_ic.c,v 1.1.1.1 2014/08/06 12:36:32 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_subdev_therm_ic.c,v 1.2 2015/02/25 22:12:00 riastradh Exp $");
#include "priv.h"
@ -36,6 +36,9 @@ static bool
probe_monitoring_device(struct nouveau_i2c_port *i2c,
struct i2c_board_info *info, void *data)
{
#ifdef __NetBSD__
return false;
#else
struct nouveau_therm_priv *priv = data;
struct nvbios_therm_sensor *sensor = &priv->bios_sensor;
struct i2c_client *client;
@ -59,6 +62,7 @@ probe_monitoring_device(struct nouveau_i2c_port *i2c,
priv->ic = client;
return true;
#endif
}
static struct nouveau_i2c_board_info

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_subdev_timer_nv04.c,v 1.1.1.1 2014/08/06 12:36:32 riastradh Exp $ */
/* $NetBSD: nouveau_subdev_timer_nv04.c,v 1.2 2015/02/25 22:12:00 riastradh Exp $ */
/*
* Copyright 2012 Red Hat Inc.
@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_subdev_timer_nv04.c,v 1.1.1.1 2014/08/06 12:36:32 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_subdev_timer_nv04.c,v 1.2 2015/02/25 22:12:00 riastradh Exp $");
#include "nv04.h"
@ -49,7 +49,7 @@ nv04_timer_alarm_trigger(struct nouveau_timer *ptimer)
struct nv04_timer_priv *priv = (void *)ptimer;
struct nouveau_alarm *alarm, *atemp;
unsigned long flags;
LIST_HEAD(exec);
struct list_head exec = LIST_HEAD_INIT(exec);
/* move any due alarms off the pending list */
spin_lock_irqsave(&priv->lock, flags);

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_subdev_vm_base.c,v 1.1.1.1 2014/08/06 12:36:32 riastradh Exp $ */
/* $NetBSD: nouveau_subdev_vm_base.c,v 1.2 2015/02/25 22:12:00 riastradh Exp $ */
/*
* Copyright 2010 Red Hat Inc.
@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_subdev_vm_base.c,v 1.1.1.1 2014/08/06 12:36:32 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_subdev_vm_base.c,v 1.2 2015/02/25 22:12:00 riastradh Exp $");
#include <core/gpuobj.h>
#include <core/mm.h>
@ -77,6 +77,47 @@ nouveau_vm_map_at(struct nouveau_vma *vma, u64 delta, struct nouveau_mem *node)
vmm->flush(vm);
}
#ifdef __NetBSD__
static void
nouveau_vm_map_dma(struct nouveau_vma *vma, u64 delta, u64 length,
struct nouveau_mem *mem)
{
struct nouveau_vm *vm = vma->vm;
struct nouveau_vmmgr *vmm = vm->vmm;
int big = vma->node->type != vmm->spg_shift;
u32 offset = vma->node->offset + (delta >> 12);
u32 bits = vma->node->type - 12;
u32 num = length >> vma->node->type;
u32 pde = (offset >> vmm->pgt_bits) - vm->fpde;
u32 pte = (offset & ((1 << vmm->pgt_bits) - 1)) >> bits;
u32 max = 1 << (vmm->pgt_bits - bits);
unsigned seg;
for (seg = 0; seg < mem->pages->dm_nsegs; seg++) {
struct nouveau_gpuobj *pgt = vm->pgt[pde].obj[big];
dma_addr_t addr = mem->pages->dm_segs[seg].ds_addr;
KASSERT(mem->pages->dm_segs[seg].ds_len == PAGE_SIZE);
vmm->map_sg(vma, pgt, mem, pte, 1, &addr);
num--;
pte++;
if (num == 0)
goto finish;
if (__predict_false(pte >= max)) {
pde++;
pte = 0;
}
}
finish:
vmm->flush(vm);
}
#else
static void
nouveau_vm_map_sg_table(struct nouveau_vma *vma, u64 delta, u64 length,
struct nouveau_mem *mem)
@ -173,9 +214,17 @@ nouveau_vm_map_sg(struct nouveau_vma *vma, u64 delta, u64 length,
vmm->flush(vm);
}
#endif
void
nouveau_vm_map(struct nouveau_vma *vma, struct nouveau_mem *node)
{
#ifdef __NetBSD__
if (node->pages)
nouveau_vm_map_dma(vma, 0, node->size << 12, node);
else
nouveau_vm_map_at(vma, 0, node);
#else
if (node->sg)
nouveau_vm_map_sg_table(vma, 0, node->size << 12, node);
else
@ -183,6 +232,7 @@ nouveau_vm_map(struct nouveau_vma *vma, struct nouveau_mem *node)
nouveau_vm_map_sg(vma, 0, node->size << 12, node);
else
nouveau_vm_map_at(vma, 0, node);
#endif
}
void

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_subdev_vm_nv04.c,v 1.1.1.1 2014/08/06 12:36:32 riastradh Exp $ */
/* $NetBSD: nouveau_subdev_vm_nv04.c,v 1.2 2015/02/25 22:12:00 riastradh Exp $ */
/*
* Copyright 2012 Red Hat Inc.
@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_subdev_vm_nv04.c,v 1.1.1.1 2014/08/06 12:36:32 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_subdev_vm_nv04.c,v 1.2 2015/02/25 22:12:00 riastradh Exp $");
#include <core/gpuobj.h>
@ -137,10 +137,23 @@ nv04_vmmgr_dtor(struct nouveau_object *object)
nouveau_gpuobj_ref(NULL, &priv->vm->pgt[0].obj[0]);
nouveau_vm_ref(NULL, &priv->vm, NULL);
}
#ifdef __NetBSD__
if (priv->nullp) {
/* XXX pa_dmat or pa_dmat64? */
struct nouveau_device *device = nv_device(priv);
const bus_dma_tag_t dmat = device->pdev->pd_pa.pa_dmat64;
bus_dmamap_unload(dmat, priv->nullmap);
bus_dmamem_unmap(dmat, priv->nullp, PAGE_SIZE);
bus_dmamap_destroy(dmat, priv->nullmap);
bus_dmamem_free(dmat, &priv->nullseg, 1);
}
#else
if (priv->nullp) {
pci_free_consistent(nv_device(priv)->pdev, 16 * 1024,
priv->nullp, priv->null);
}
#endif
nouveau_vmmgr_destroy(&priv->base);
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_subdev_vm_nv44.c,v 1.1.1.1 2014/08/06 12:36:32 riastradh Exp $ */
/* $NetBSD: nouveau_subdev_vm_nv44.c,v 1.2 2015/02/25 22:12:00 riastradh Exp $ */
/*
* Copyright 2012 Red Hat Inc.
@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_subdev_vm_nv44.c,v 1.1.1.1 2014/08/06 12:36:32 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_subdev_vm_nv44.c,v 1.2 2015/02/25 22:12:00 riastradh Exp $");
#include <core/gpuobj.h>
#include <core/option.h>
@ -190,11 +190,54 @@ nv44_vmmgr_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
priv->base.unmap = nv44_vm_unmap;
priv->base.flush = nv44_vm_flush;
#ifdef __NetBSD__
{
/* XXX pa_dmat or pa_dmat64? */
const bus_dma_tag_t dmat = device->pdev->pd_pa.pa_dmat64;
int nsegs;
/* XXX errno NetBSD->Linux */
ret = -bus_dmamem_alloc(dmat, PAGE_SIZE, PAGE_SIZE, 0,
&priv->nullseg, 1, &nsegs, BUS_DMA_WAITOK);
if (ret) {
/* XXX Need to destroy stuff... */
fail0: nv_error(priv, "unable to allocate dummy pages\n");
return ret;
}
KASSERT(nsegs == 1);
/* XXX errno NetBSD->Linux */
ret = -bus_dmamap_create(dmat, PAGE_SIZE, 1, PAGE_SIZE, 0,
BUS_DMA_WAITOK, &priv->nullmap);
if (ret) {
fail1: bus_dmamem_free(dmat, &priv->nullseg, 1);
goto fail0;
}
/* XXX errno NetBSD->Linux */
ret = -bus_dmamem_map(dmat, &priv->nullseg, 1, PAGE_SIZE,
&priv->nullp, BUS_DMA_WAITOK);
if (ret) {
fail2: bus_dmamap_destroy(dmat, priv->nullmap);
goto fail1;
}
/* XXX errno NetBSD->Linux */
ret = -bus_dmamap_load(dmat, priv->nullmap, priv->nullp, PAGE_SIZE,
NULL, BUS_DMA_WAITOK);
if (ret) {
fail3: __unused bus_dmamem_unmap(dmat, priv->nullp, PAGE_SIZE);
goto fail2;
}
priv->null = priv->nullmap->dm_segs[0].ds_addr;
}
#else
priv->nullp = pci_alloc_consistent(device->pdev, 16 * 1024, &priv->null);
if (!priv->nullp) {
nv_error(priv, "unable to allocate dummy pages\n");
return -ENOMEM;
}
#endif
ret = nouveau_vm_create(&priv->base, 0, NV44_GART_SIZE, 0, 4096,
&priv->vm);

View File

@ -6,6 +6,10 @@
struct nv04_vmmgr_priv {
struct nouveau_vmmgr base;
struct nouveau_vm *vm;
#ifdef __NetBSD__
bus_dma_segment_t nullseg;
bus_dmamap_t nullmap;
#endif
dma_addr_t null;
void *nullp;
};

View File

@ -1,4 +1,4 @@
/* $NetBSD: nouveau_ttm.c,v 1.2 2014/08/06 13:35:13 riastradh Exp $ */
/* $NetBSD: nouveau_ttm.c,v 1.3 2015/02/25 22:12:00 riastradh Exp $ */
/*
* Copyright (c) 2007-2008 Tungsten Graphics, Inc., Cedar Park, TX., USA,
@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nouveau_ttm.c,v 1.2 2014/08/06 13:35:13 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: nouveau_ttm.c,v 1.3 2015/02/25 22:12:00 riastradh Exp $");
#include <subdev/fb.h>
#include <subdev/vm.h>
@ -118,7 +118,7 @@ nouveau_vram_manager_debug(struct ttm_mem_type_manager *man, const char *prefix)
mutex_lock(&nv_subdev(pfb)->mutex);
list_for_each_entry(r, &mm->nodes, nl_entry) {
printk(KERN_DEBUG "%s %d: 0x%010llx 0x%010llx\n",
printk(KERN_DEBUG "%s %d: 0x%010"PRIx64" 0x%010"PRIx64"\n",
prefix, r->type, ((u64)r->offset << 12),
(((u64)r->offset + r->length) << 12));
@ -128,7 +128,7 @@ nouveau_vram_manager_debug(struct ttm_mem_type_manager *man, const char *prefix)
}
mutex_unlock(&nv_subdev(pfb)->mutex);
printk(KERN_DEBUG "%s total: 0x%010llx free: 0x%010llx\n",
printk(KERN_DEBUG "%s total: 0x%010"PRIx64" free: 0x%010"PRIx64"\n",
prefix, (u64)total << 12, (u64)free << 12);
printk(KERN_DEBUG "%s block: 0x%08x\n",
prefix, mm->block_size << 12);
@ -283,6 +283,27 @@ const struct ttm_mem_type_manager_func nv04_gart_manager = {
nv04_gart_manager_debug
};
#ifdef __NetBSD__
int
nouveau_ttm_mmap_object(struct drm_device *dev, off_t offset, size_t size,
vm_prot_t prot, struct uvm_object **uobjp, voff_t *uoffsetp,
struct file *file)
{
struct nouveau_drm *const drm = nouveau_drm(dev);
KASSERT(0 == (offset & (PAGE_SIZE - 1)));
if (__predict_false((offset >> PAGE_SHIFT) < DRM_FILE_PAGE_OFFSET))
return drm_mmap_object(dev, offset, size, prot, uobjp,
uoffsetp, file);
else
return ttm_bo_mmap_object(&drm->ttm.bdev, offset, size, prot,
uobjp, uoffsetp, file);
}
#else
int
nouveau_ttm_mmap(struct file *filp, struct vm_area_struct *vma)
{
@ -295,6 +316,8 @@ nouveau_ttm_mmap(struct file *filp, struct vm_area_struct *vma)
return ttm_bo_mmap(filp, vma, &drm->ttm.bdev);
}
#endif
static int
nouveau_ttm_mem_global_init(struct drm_global_reference *ref)
{

View File

@ -17,7 +17,12 @@ struct ttm_tt *nouveau_sgdma_create_ttm(struct ttm_bo_device *,
int nouveau_ttm_init(struct nouveau_drm *drm);
void nouveau_ttm_fini(struct nouveau_drm *drm);
#ifdef __NetBSD__
int nouveau_ttm_mmap_object(struct drm_device *, off_t, size_t, vm_prot_t,
struct uvm_object **, voff_t *, struct file *);
#else
int nouveau_ttm_mmap(struct file *, struct vm_area_struct *);
#endif
int nouveau_ttm_global_init(struct nouveau_drm *);
void nouveau_ttm_global_release(struct nouveau_drm *);

View File

@ -1,4 +1,4 @@
# $NetBSD: files.nouveau,v 1.6 2015/02/25 17:29:42 riastradh Exp $
# $NetBSD: files.nouveau,v 1.7 2015/02/25 22:11:59 riastradh Exp $
device nouveau: drmkms, drmkms_pci, drmkms_ttm, genfb, wsemuldisplaydev
attach nouveau at pci
@ -229,7 +229,16 @@ makeoptions nouveau "CWARNFLAGS.nouveau_subdev_therm_ic.c"+="-Wno-missing-field-
makeoptions nouveau "CWARNFLAGS.nouveau_subdev_therm_nv40.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_subdev_therm_nv50.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_subdev_therm_nv84.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_subdev_therm_nva3.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_subdev_therm_nvd0.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_subdev_timer_gk20a.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_subdev_timer_nv04.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_subdev_vm_nv04.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_subdev_vm_nv41.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_subdev_vm_nv44.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_subdev_vm_nv50.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_subdev_vm_nvc0.c"+="-Wno-missing-field-initializers"
makeoptions nouveau "CWARNFLAGS.nouveau_subdev_volt_nv40.c"+="-Wno-missing-field-initializers"
file external/bsd/drm2/nouveau/nouveau_module.c nouveau
@ -564,6 +573,6 @@ file external/bsd/drm2/dist/drm/nouveau/nouveau_nv84_fence.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 # 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_sysfs.c nouveau
file external/bsd/drm2/dist/drm/nouveau/nouveau_ttm.c nouveau
file external/bsd/drm2/dist/drm/nouveau/nouveau_vga.c nouveau
#file external/bsd/drm2/dist/drm/nouveau/nouveau_vga.c nouveau