Revert last commit -- breaks i915.

This commit is contained in:
bjs 2008-05-06 01:45:47 +00:00
parent 3b59dc3936
commit 829081eaa7
4 changed files with 85 additions and 116 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: drmP.h,v 1.21 2008/05/06 01:26:14 bjs Exp $ */
/* $NetBSD: drmP.h,v 1.22 2008/05/06 01:45:47 bjs Exp $ */
/* drmP.h -- Private header for Direct Rendering Manager -*- linux-c -*-
* Created: Mon Jan 4 10:05:05 1999 by faith@precisioninsight.com
@ -1059,7 +1059,7 @@ void drm_vbl_send_signals(drm_device_t *dev);
/* AGP/PCI Express/GART support (drm_agpsupport.c) */
int drm_device_is_agp(drm_device_t *dev);
int drm_device_is_pcie(drm_device_t *dev);
drm_agp_head_t *drm_agp_init(drm_device_t *dev);
drm_agp_head_t *drm_agp_init(void);
int drm_agp_acquire(drm_device_t *dev);
int drm_agp_release(drm_device_t *dev);
int drm_agp_info(drm_device_t * dev, drm_agp_info_t *info);

View File

@ -1,4 +1,4 @@
/* $NetBSD: drm_irq.c,v 1.9 2008/05/06 01:26:14 bjs Exp $ */
/* $NetBSD: drm_irq.c,v 1.10 2008/05/06 01:45:47 bjs Exp $ */
/* drm_irq.c -- IRQ IOCTL and function support
* Created: Fri Oct 18 2003 by anholt@FreeBSD.org
@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: drm_irq.c,v 1.9 2008/05/06 01:26:14 bjs Exp $");
__KERNEL_RCSID(0, "$NetBSD: drm_irq.c,v 1.10 2008/05/06 01:45:47 bjs Exp $");
/*
__FBSDID("$FreeBSD: src/sys/dev/drm/drm_irq.c,v 1.2 2005/11/28 23:13:52 anholt Exp $");
*/
@ -68,9 +68,9 @@ drm_irq_handler_wrap(DRM_IRQ_ARGS)
irqreturn_t ret;
drm_device_t *dev = (drm_device_t *)arg;
mutex_enter(&dev->irq_lock);
DRM_SPINLOCK(&dev->irq_lock);
ret = dev->driver.irq_handler(arg);
mutex_exit(&dev->irq_lock);
DRM_SPINUNLOCK(&dev->irq_lock);
return ret;
}
@ -94,7 +94,7 @@ int drm_irq_install(drm_device_t *dev)
dev->context_flag = 0;
mutex_init(&dev->irq_lock, MUTEX_DEFAULT, IPL_VM);
DRM_SPININIT(&dev->irq_lock, "DRM IRQ lock");
/* Before installing handler */
@ -107,7 +107,7 @@ int drm_irq_install(drm_device_t *dev)
goto err;
}
istr = pci_intr_string(dev->pa.pa_pc, ih);
dev->irqh = pci_intr_establish(dev->pa.pa_pc, ih, IPL_VM,
dev->irqh = pci_intr_establish(dev->pa.pa_pc, ih, IPL_TTY,
drm_irq_handler_wrap, dev);
if (!dev->irqh) {
retcode = ENOENT;
@ -124,7 +124,7 @@ int drm_irq_install(drm_device_t *dev)
err:
DRM_LOCK();
dev->irq_enabled = 0;
mutex_destroy(&dev->irq_lock);
DRM_SPINUNINIT(&dev->irq_lock);
DRM_UNLOCK();
return retcode;
}
@ -141,7 +141,7 @@ int drm_irq_uninstall(drm_device_t *dev)
dev->driver.irq_uninstall(dev);
pci_intr_disestablish(dev->pa.pa_pc, dev->irqh);
mutex_destroy(&dev->irq_lock);
DRM_SPINUNINIT(&dev->irq_lock);
return 0;
}
@ -209,9 +209,9 @@ int drm_wait_vblank(DRM_IOCTL_ARGS)
vblwait.reply.sequence = atomic_read(&dev->vbl_received);
mutex_enter(&dev->irq_lock);
DRM_SPINLOCK(&dev->irq_lock);
TAILQ_INSERT_HEAD(&dev->vbl_sig_list, vbl_sig, link);
mutex_exit(&dev->irq_lock);
DRM_SPINUNLOCK(&dev->irq_lock);
ret = 0;
#endif
ret = EINVAL;

View File

@ -1,4 +1,4 @@
/* $NetBSD: drm_memory.c,v 1.9 2008/05/06 01:26:14 bjs Exp $ */
/* $NetBSD: drm_memory.c,v 1.10 2008/05/06 01:45:47 bjs Exp $ */
/* drm_memory.h -- Memory management wrappers for DRM -*- linux-c -*-
* Created: Thu Feb 4 14:00:34 1999 by faith@valinux.com
@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: drm_memory.c,v 1.9 2008/05/06 01:26:14 bjs Exp $");
__KERNEL_RCSID(0, "$NetBSD: drm_memory.c,v 1.10 2008/05/06 01:45:47 bjs Exp $");
/*
__FBSDID("$FreeBSD: src/sys/dev/drm/drm_memory.c,v 1.2 2005/11/28 23:13:52 anholt Exp $");
*/
@ -54,53 +54,42 @@ MALLOC_DEFINE(M_DRM, "drm", "DRM Data Structures");
void drm_mem_init(void)
{
/*
malloc_type_attach(M_DRM);
*/
}
void drm_mem_uninit(void)
{
}
inline void *drm_mem_alloc(size_t size)
void *drm_alloc(size_t size, int area)
{
return kmem_alloc(size, KM_NOSLEEP);
return malloc(size, M_DRM, M_NOWAIT);
}
inline void *drm_mem_zalloc(size_t size)
void *drm_calloc(size_t nmemb, size_t size, int area)
{
return kmem_zalloc(size, KM_NOSLEEP);
return malloc(size * nmemb, M_DRM, M_NOWAIT | M_ZERO);
}
inline void *drm_mem_calloc(size_t nmemb, size_t size)
{
return kmem_zalloc(size * nmemb, KM_NOSLEEP);
}
inline void *drm_mem_realloc(void *oldpt, size_t oldsize, size_t size)
void *drm_realloc(void *oldpt, size_t oldsize, size_t size, int area)
{
void *pt;
pt = drm_mem_alloc(size);
pt = malloc(size, M_DRM, M_NOWAIT);
if (pt == NULL)
return NULL;
if (oldpt && oldsize) {
memcpy(pt, oldpt, oldsize);
drm_mem_free(oldpt, oldsize);
free(oldpt, M_DRM);
}
return pt;
}
inline void drm_mem_free(void *pt, size_t size)
void drm_free(void *pt, size_t size, int area)
{
#if 0
KASSERT(pt == NULL)
#else
if (pt == NULL) {
DRM_DEBUG("drm_mem_free: told to free a null pointer!");
return;
}
#endif
kmem_free(pt, size);
free(pt, M_DRM);
}
void *drm_ioremap(drm_device_t *dev, drm_local_map_t *map)
@ -238,60 +227,3 @@ drm_mtrr_del(int __unused handle, unsigned long offset, size_t size, int flags)
return 0;
#endif
}
inline struct drm_dmamem *
drm_dmamem_alloc(bus_dma_tag_t tag, size_t size, int wait)
{
struct drm_dmamem *dma;
int kmflag;
kmflag = (wait & DRM_DMA_NOWAIT) != 0 ? KM_NOSLEEP : KM_SLEEP;
dma = kmem_zalloc(sizeof(*dma), kmflag);
if (dma == NULL)
return NULL;
dma->dm_size = size;
dma->dm_tag = tag;
if (bus_dmamap_create(dma->dm_tag, size, size / PAGE_SIZE + 1, size, 0,
wait|BUS_DMA_ALLOCNOW, &dma->dm_map) != 0)
goto dmafree;
if (bus_dmamem_alloc(dma->dm_tag, size, PAGE_SIZE, 0, dma->dm_segs,
1, &dma->dm_nsegs, wait) != 0)
goto destroy;
if (bus_dmamem_map(dma->dm_tag, dma->dm_segs, dma->dm_nsegs, size,
&dma->dm_kva, wait|BUS_DMA_COHERENT) != 0)
goto free;
if (bus_dmamap_load(dma->dm_tag, dma->dm_map, dma->dm_kva, size,
NULL, wait) != 0)
goto unmap;
return dma;
unmap:
bus_dmamem_unmap(dma->dm_tag, dma->dm_kva, size);
free:
bus_dmamem_free(dma->dm_tag, dma->dm_segs, dma->dm_nsegs);
destroy:
bus_dmamap_destroy(dma->dm_tag, dma->dm_map);
dmafree:
kmem_free(dma, sizeof(*dma));
return NULL;
}
inline void
drm_dmamem_free(struct drm_dmamem *dma)
{
if (dma != NULL) {
bus_dmamap_unload(dma->dm_tag, dma->dm_map);
bus_dmamem_unmap(dma->dm_tag, dma->dm_kva, dma->dm_size);
bus_dmamem_free(dma->dm_tag, dma->dm_segs, dma->dm_nsegs);
bus_dmamap_destroy(dma->dm_tag, dma->dm_map);
kmem_free(dma, sizeof(*dma));
}
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: drm_pci.c,v 1.9 2008/05/06 01:26:14 bjs Exp $ */
/* $NetBSD: drm_pci.c,v 1.10 2008/05/06 01:45:47 bjs Exp $ */
/*
* Copyright 2003 Eric Anholt.
@ -24,7 +24,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: drm_pci.c,v 1.9 2008/05/06 01:26:14 bjs Exp $");
__KERNEL_RCSID(0, "$NetBSD: drm_pci.c,v 1.10 2008/05/06 01:45:47 bjs Exp $");
/*
__FBSDID("$FreeBSD: src/sys/dev/drm/drm_pci.c,v 1.2 2005/11/28 23:13:52 anholt Exp $");
*/
@ -34,35 +34,72 @@ __FBSDID("$FreeBSD: src/sys/dev/drm/drm_pci.c,v 1.2 2005/11/28 23:13:52 anholt E
drm_dma_handle_t *
drm_pci_alloc(drm_device_t *dev, size_t size, size_t align, dma_addr_t maxaddr)
{
drm_dma_handle_t *hdl;
struct drm_dmamem *dmam;
drm_dma_handle_t *h;
int error, nsegs;
hdl = drm_mem_zalloc(sizeof(drm_dma_handle_t));
if (hdl == NULL)
goto err;
dmam = drm_dmamem_alloc(dev->pa.pa_dmat, size, DRM_DMA_NOWAIT);
if (dmam == NULL)
goto free;
/* Need power-of-two alignment, so fail the allocation if it isn't. */
if ((align & (align - 1)) != 0) {
DRM_ERROR("drm_pci_alloc with non-power-of-two alignment %d\n",
(int)align);
return NULL;
}
hdl->busaddr = DRM_NETBSD_DMA_ADDR(dmam);
hdl->vaddr = DRM_NETBSD_DMA_VADDR(dmam);
hdl->size = size;
return hdl;
h = malloc(sizeof(drm_dma_handle_t), M_DRM, M_ZERO | M_NOWAIT);
if (h == NULL)
return NULL;
if ((error = bus_dmamem_alloc(dev->pa.pa_dmat, size, align, 0,
h->segs, 1, &nsegs, BUS_DMA_NOWAIT)) != 0) {
printf("drm: Unable to allocate DMA, error %d\n", error);
goto fail;
}
if ((error = bus_dmamem_map(dev->pa.pa_dmat, h->segs, nsegs, size,
&h->addr, BUS_DMA_NOWAIT | BUS_DMA_COHERENT)) != 0) {
printf("drm: Unable to map DMA, error %d\n", error);
goto free;
}
if ((error = bus_dmamap_create(dev->pa.pa_dmat, size, 1, size, 0,
BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &h->map)) != 0) {
printf("drm: Unable to create DMA map, error %d\n", error);
goto unmap;
}
if ((error = bus_dmamap_load(dev->pa.pa_dmat, h->map, h->addr, size,
NULL, BUS_DMA_NOWAIT)) != 0) {
printf("drm: Unable to load DMA map, error %d\n", error);
goto destroy;
}
h->busaddr = DRM_PCI_DMAADDR(h);
h->vaddr = h->addr;
h->size = size;
return h;
destroy:
bus_dmamap_destroy(dev->pa.pa_dmat, h->map);
unmap:
bus_dmamem_unmap(dev->pa.pa_dmat, h->addr, size);
free:
drm_mem_free(hdl, sizeof(*hdl));
err:
bus_dmamem_free(dev->pa.pa_dmat, h->segs, 1);
fail:
free(h, M_DRM);
return NULL;
}
/*
* Free a DMA-accessible consistent memory block.
*/
void
drm_pci_free(drm_device_t *dev, drm_dma_handle_t *hdl)
drm_pci_free(drm_device_t *dev, drm_dma_handle_t *h)
{
if (hdl != NULL) {
if (hdl->dmam != NULL)
drm_dmamem_free(hdl->dmam);
drm_mem_free(hdl, sizeof(*hdl));
}
if (h == NULL)
return;
bus_dmamap_unload(dev->pa.pa_dmat, h->map);
bus_dmamap_destroy(dev->pa.pa_dmat, h->map);
bus_dmamem_unmap(dev->pa.pa_dmat, h->addr, h->size);
bus_dmamem_free(dev->pa.pa_dmat, h->segs, 1);
free(h, M_DRM);
}