diff options
author | Owain Ainsworth <oga@cvs.openbsd.org> | 2009-04-06 04:45:20 +0000 |
---|---|---|
committer | Owain Ainsworth <oga@cvs.openbsd.org> | 2009-04-06 04:45:20 +0000 |
commit | 071593aded91939c0b8949599c2ebcbdaf576e39 (patch) | |
tree | ff33ffec429564162ba5913cc368b52e49d8bfdb /sys/dev/pci/drm | |
parent | 8152cd1e1ffc808cc5909283b8f891aea8148e32 (diff) |
sisdrm is disabled. That does not mean that the code doesn't offend me.
This driver is a very thin wrapper for doling out memory to userland,
everything else is handled by the userland drivers, therefore I really
want to rewrite this driver before even thinking about enabling it,
userland mapping graphics registers makes it hard for me to sleep at
night.
Anyway, remove a huge pile of scary code by switching the memory
allocation ioctls to user the drm_heap.c code instead of the very
complicated mess that it uses right now, probably saves some space, too.
Turns out linux made some similar (but far from identical) changes ages ago,
They did more, that may come later.
Diffstat (limited to 'sys/dev/pci/drm')
-rw-r--r-- | sys/dev/pci/drm/files.drm | 4 | ||||
-rw-r--r-- | sys/dev/pci/drm/sis_drv.c | 148 | ||||
-rw-r--r-- | sys/dev/pci/drm/sis_drv.h | 97 | ||||
-rw-r--r-- | sys/dev/pci/drm/sis_ds.c | 297 | ||||
-rw-r--r-- | sys/dev/pci/drm/sis_ds.h | 146 | ||||
-rw-r--r-- | sys/dev/pci/drm/sis_mm.c | 293 |
6 files changed, 136 insertions, 849 deletions
diff --git a/sys/dev/pci/drm/files.drm b/sys/dev/pci/drm/files.drm index daf993fbb55..bf6e86e6f05 100644 --- a/sys/dev/pci/drm/files.drm +++ b/sys/dev/pci/drm/files.drm @@ -1,5 +1,5 @@ # $NetBSD: files.drm,v 1.2 2007/03/28 11:29:37 jmcneill Exp $ -# $OpenBSD: files.drm,v 1.14 2009/03/27 19:00:45 oga Exp $ +# $OpenBSD: files.drm,v 1.15 2009/04/06 04:45:19 oga Exp $ # direct rendering modules define drmbase {} @@ -63,8 +63,6 @@ file dev/pci/drm/savage_state.c savagedrm device sisdrm: drmbase attach sisdrm at drmdev file dev/pci/drm/sis_drv.c sisdrm -file dev/pci/drm/sis_ds.c sisdrm -file dev/pci/drm/sis_mm.c sisdrm device tdfxdrm: drmbase attach tdfxdrm at drmdev diff --git a/sys/dev/pci/drm/sis_drv.c b/sys/dev/pci/drm/sis_drv.c index 7c5f6ea8229..f6926dcd104 100644 --- a/sys/dev/pci/drm/sis_drv.c +++ b/sys/dev/pci/drm/sis_drv.c @@ -1,6 +1,7 @@ /* sis.c -- sis driver -*- linux-c -*- */ /*- + * Copyright 2000 Silicon Integrated Systems Corp, Inc., HsinChu, Taiwan. * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. * All Rights Reserved. @@ -24,17 +25,46 @@ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. * + * Authors: + * Sung-Ching Lin <sclin@sis.com.tw> */ #include "drmP.h" #include "sis_drm.h" -#include "sis_drv.h" + +#define DRIVER_AUTHOR "SIS, Tungsten Graphics" +#define DRIVER_NAME "sis" +#define DRIVER_DESC "SIS 300/630/540 and XGI V3XE/V5/V8" +#define DRIVER_DATE "20070626" +#define DRIVER_MAJOR 1 +#define DRIVER_MINOR 3 +#define DRIVER_PATCHLEVEL 0 + +struct drm_sis_private { + struct device dev; + struct device *drmdev; + + struct drm_heap agp_heap; + struct drm_heap fb_heap; +} drm_sis_private_t; + +enum sis_family { + SIS_OTHER = 0, + SIS_CHIP_315 = 1, +}; int sisdrm_probe(struct device *, void *, void *); void sisdrm_attach(struct device *, struct device *, void *); int sisdrm_detach(struct device *, int); +void sisdrm_lastclose(struct drm_device *); +void sisdrm_close(struct drm_device *, struct drm_file *); int sisdrm_ioctl(struct drm_device *, u_long, caddr_t, struct drm_file *); +int sis_alloc(struct drm_heap *, drm_sis_mem_t *, struct drm_file *); +int sis_free(struct drm_heap *, drm_sis_mem_t *, struct drm_file *); +int sis_fb_init(struct drm_device *, void *, struct drm_file *); +int sis_agp_init(struct drm_device *, void *, struct drm_file *); + const static struct drm_pcidev sis_pciidlist[] = { {PCI_VENDOR_SIS, PCI_PRODUCT_SIS_300}, {PCI_VENDOR_SIS, PCI_PRODUCT_SIS_5300}, @@ -47,10 +77,9 @@ const static struct drm_pcidev sis_pciidlist[] = { }; static const struct drm_driver_info sis_driver = { - .buf_priv_size = 1, /* No dev_priv */ + .close = sisdrm_close, + .lastclose = sisdrm_lastclose, .ioctl = sisdrm_ioctl, - .context_ctor = sis_init_context, - .context_dtor = sis_final_context, .name = DRIVER_NAME, .desc = DRIVER_DESC, @@ -65,13 +94,13 @@ static const struct drm_driver_info sis_driver = { int sisdrm_probe(struct device *parent, void *match, void *aux) { - return drm_pciprobe((struct pci_attach_args *)aux, sis_pciidlist); + return (drm_pciprobe((struct pci_attach_args *)aux, sis_pciidlist)); } void sisdrm_attach(struct device *parent, struct device *self, void *aux) { - drm_sis_private_t *dev_priv = (drm_sis_private_t *)self; + struct drm_sis_private *dev_priv = (struct drm_sis_private *)self; struct pci_attach_args *pa = aux; int is_agp; @@ -85,7 +114,7 @@ sisdrm_attach(struct device *parent, struct device *self, void *aux) int sisdrm_detach(struct device *self, int flags) { - drm_sis_private_t *dev_priv = (drm_sis_private_t *)self; + struct drm_sis_private *dev_priv = (struct drm_sis_private *)self; if (dev_priv->drmdev != NULL) { config_detach(dev_priv->drmdev, flags); @@ -96,7 +125,7 @@ sisdrm_detach(struct device *self, int flags) } struct cfattach sisdrm_ca = { - sizeof(drm_sis_private_t), sisdrm_probe, sisdrm_attach, + sizeof(struct drm_sis_private), sisdrm_probe, sisdrm_attach, sisdrm_detach }; @@ -104,30 +133,123 @@ struct cfdriver sisdrm_cd = { 0, "sisdrm", DV_DULL }; +void +sisdrm_close(struct drm_device *dev, struct drm_file *file_priv) +{ + struct drm_sis_private *dev_priv = dev->dev_private; + + drm_mem_release(&dev_priv->agp_heap, file_priv); + drm_mem_release(&dev_priv->fb_heap, file_priv); +} + +void +sisdrm_lastclose(struct drm_device *dev) +{ + struct drm_sis_private *dev_priv = dev->dev_private; + + drm_mem_takedown(&dev_priv->agp_heap); + drm_mem_takedown(&dev_priv->fb_heap); +} int sisdrm_ioctl(struct drm_device *dev, u_long cmd, caddr_t data, struct drm_file *file_priv) { + struct drm_sis_private *dev_priv = dev->dev_private; + + if (dev_priv == NULL) + return (EINVAL); + if (file_priv->authenticated == 1) { switch (cmd) { case DRM_IOCTL_SIS_FB_ALLOC: - return (sis_fb_alloc(dev, data, file_priv)); + return (sis_alloc(&dev_priv->fb_heap, + (drm_sis_mem_t *)data, file_priv)); case DRM_IOCTL_SIS_FB_FREE: - return (sis_fb_free(dev, data, file_priv)); + return (sis_free(&dev_priv->fb_heap, + (drm_sis_mem_t *)data, file_priv)); case DRM_IOCTL_SIS_AGP_ALLOC: - return (sis_ioctl_agp_alloc(dev, data, file_priv)); + return (sis_alloc(&dev_priv->agp_heap, + (drm_sis_mem_t *)data, file_priv)); case DRM_IOCTL_SIS_AGP_FREE: - return (sis_ioctl_agp_free(dev, data, file_priv)); + return (sis_free(&dev_priv->agp_heap, + (drm_sis_mem_t *)data, file_priv)); } } if (file_priv->master == 1) { switch (cmd) { case DRM_IOCTL_SIS_AGP_INIT: - return (sis_ioctl_agp_init(dev, data, file_priv)); + return (sis_agp_init(dev, data, file_priv)); case DRM_IOCTL_SIS_FB_INIT: return (sis_fb_init(dev, data, file_priv)); } } return (EINVAL); } + +/* fb management via fb device */ +/* Called by the X Server to initialize the FB heap. Allocations will fail + * unless this is called. Offset is the beginning of the heap from the + * framebuffer offset (MaxXFBMem in XFree86). + * + * Memory layout according to Thomas Winischofer: + * |------------------|DDDDDDDDDDDDDDDDDDDDDDDDDDDDD|HHHH|CCCCCCCCCCC| + * + * X driver/sisfb HW- Command- + * framebuffer memory DRI heap Cursor queue + */ +int +sis_fb_init(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + struct drm_sis_private *dev_priv = dev->dev_private; + drm_sis_fb_t *fb = data; + + DRM_DEBUG("offset = %u, size = %u", fb->offset, fb->size); + + return (drm_init_heap(&dev_priv->fb_heap, fb->offset, fb->size)); +} + +int +sis_agp_init(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + struct drm_sis_private *dev_priv = dev->dev_private; + drm_sis_agp_t *agp = data; + + DRM_DEBUG("offset = %u, size = %u", agp->offset, agp->size); + + return (drm_init_heap(&dev_priv->agp_heap, agp->offset, agp->size)); +} + +int +sis_alloc(struct drm_heap *heap, drm_sis_mem_t *mem, + struct drm_file *file_priv) +{ + struct drm_mem *block; + + /* Original code had no aligment restrictions. Should we page align? */ + if ((block = drm_alloc_block(heap, mem->size, 0, file_priv)) == NULL) + return (ENOMEM); + + mem->offset = block->start; + mem->free = block->start; + DRM_DEBUG("alloc agp, size = %d, offset = %d\n", mem->size, + mem->offset); + + return (0); +} + +int +sis_free(struct drm_heap *heap, drm_sis_mem_t *mem, struct drm_file *file_priv) +{ + struct drm_mem *block; + + DRM_DEBUG("free fb, free = 0x%lx\n", mem->free); + + if ((block = drm_find_block(heap, mem->free)) == NULL) + return (EFAULT); + if (block->file_priv != file_priv) + return (EPERM); + + drm_free_block(heap, block); + return (0); +} diff --git a/sys/dev/pci/drm/sis_drv.h b/sys/dev/pci/drm/sis_drv.h deleted file mode 100644 index 375acc53187..00000000000 --- a/sys/dev/pci/drm/sis_drv.h +++ /dev/null @@ -1,97 +0,0 @@ -/* sis_drv.h -- Private header for sis driver -*- linux-c -*- */ -/* - * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. - * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - */ - -#ifndef _SIS_DRV_H_ -#define _SIS_DRV_H_ - -/* General customization: - */ - -#define DRIVER_AUTHOR "SIS, Tungsten Graphics" -#define DRIVER_NAME "sis" -#define DRIVER_DESC "SIS 300/630/540 and XGI V3XE/V5/V8" -#define DRIVER_DATE "20070626" -#define DRIVER_MAJOR 1 -#define DRIVER_MINOR 3 -#define DRIVER_PATCHLEVEL 0 - -enum sis_family { - SIS_OTHER = 0, - SIS_CHIP_315 = 1, -}; - -#if defined(__linux__) -#define SIS_HAVE_CORE_MM -#endif - -#ifdef SIS_HAVE_CORE_MM -#include "drm_sman.h" - -#define SIS_BASE (dev_priv->mmio) -#define SIS_READ(reg) DRM_READ32(SIS_BASE, reg); -#define SIS_WRITE(reg, val) DRM_WRITE32(SIS_BASE, reg, val); - -typedef struct drm_sis_private { - struct drm_local_map *mmio; - unsigned int idle_fault; - struct drm_sman sman; - unsigned int chipset; - int vram_initialized; - int agp_initialized; - unsigned long vram_offset; - unsigned long agp_offset; -} drm_sis_private_t; - -extern int sis_idle(struct drm_device *dev); -extern void sis_reclaim_buffers_locked(struct drm_device *dev, - struct drm_file *file_priv); -extern void sis_lastclose(struct drm_device *dev); - -#else -#include "sis_ds.h" - -typedef struct drm_sis_private { - struct device dev; - struct device *drmdev; - - memHeap_t *AGPHeap; - memHeap_t *FBHeap; -} drm_sis_private_t; - -extern int sis_init_context(struct drm_device * dev, int context); -extern int sis_final_context(struct drm_device * dev, int context); -extern int sis_fb_alloc(struct drm_device *, void *, struct drm_file *); -extern int sis_fb_free(struct drm_device *, void *, struct drm_file *); -extern int sis_ioctl_agp_init(struct drm_device *, void *, struct drm_file *); -extern int sis_ioctl_agp_alloc(struct drm_device *, void *, struct drm_file *); -extern int sis_ioctl_agp_free(struct drm_device *, void *, struct drm_file *); -extern int sis_fb_init(struct drm_device *, void *, struct drm_file *); - - -#endif - -#endif diff --git a/sys/dev/pci/drm/sis_ds.c b/sys/dev/pci/drm/sis_ds.c deleted file mode 100644 index 959ddd96927..00000000000 --- a/sys/dev/pci/drm/sis_ds.c +++ /dev/null @@ -1,297 +0,0 @@ -/* sis_ds.c -- Private header for Direct Rendering Manager -*- linux-c -*- - * Created: Mon Jan 4 10:05:05 1999 by sclin@sis.com.tw - * - * Copyright 2000 Silicon Integrated Systems Corp, Inc., HsinChu, Taiwan. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Authors: - * Sung-Ching Lin <sclin@sis.com.tw> - * - */ - -#include "drmP.h" -#include "drm.h" -#include "sis_ds.h" - -/* Set Data Structure, not check repeated value - * temporarily used - */ - -set_t *setInit(void) -{ - int i; - set_t *set; - - set = drm_alloc(sizeof(*set)); - if (set != NULL) { - for (i = 0; i < SET_SIZE; i++) { - set->list[i].free_next = i + 1; - set->list[i].alloc_next = -1; - } - set->list[SET_SIZE - 1].free_next = -1; - set->free = 0; - set->alloc = -1; - set->trace = -1; - } - return set; -} - -int setAdd(set_t * set, ITEM_TYPE item) -{ - int free = set->free; - - if (free != -1) { - set->list[free].val = item; - set->free = set->list[free].free_next; - } else { - return 0; - } - - set->list[free].alloc_next = set->alloc; - set->alloc = free; - set->list[free].free_next = -1; - - return 1; -} - -int setDel(set_t * set, ITEM_TYPE item) -{ - int alloc = set->alloc; - int prev = -1; - - while (alloc != -1) { - if (set->list[alloc].val == item) { - if (prev != -1) - set->list[prev].alloc_next = - set->list[alloc].alloc_next; - else - set->alloc = set->list[alloc].alloc_next; - break; - } - prev = alloc; - alloc = set->list[alloc].alloc_next; - } - - if (alloc == -1) - return 0; - - set->list[alloc].free_next = set->free; - set->free = alloc; - set->list[alloc].alloc_next = -1; - - return 1; -} - -/* setFirst -> setAdd -> setNext is wrong */ - -int setFirst(set_t * set, ITEM_TYPE * item) -{ - if (set->alloc == -1) - return 0; - - *item = set->list[set->alloc].val; - set->trace = set->list[set->alloc].alloc_next; - - return 1; -} - -int setNext(set_t * set, ITEM_TYPE * item) -{ - if (set->trace == -1) - return 0; - - *item = set->list[set->trace].val; - set->trace = set->list[set->trace].alloc_next; - - return 1; -} - -int setDestroy(set_t * set) -{ - drm_free(set); - - return 1; -} - -/* - * GLX Hardware Device Driver common code - * Copyright (C) 1999 Wittawat Yamwong - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * WITTAWAT YAMWONG, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM, - * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR - * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE - * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#define ISFREE(bptr) ((bptr)->free) - -memHeap_t *mmInit(int ofs, int size) -{ - PMemBlock blocks; - - if (size <= 0) - return NULL; - - blocks = drm_calloc(1, sizeof(*blocks)); - if (blocks != NULL) { - blocks->ofs = ofs; - blocks->size = size; - blocks->free = 1; - return (memHeap_t *) blocks; - } else - return NULL; -} - -/* Checks if a pointer 'b' is part of the heap 'heap' */ -int mmBlockInHeap(memHeap_t * heap, PMemBlock b) -{ - TMemBlock *p; - - if (heap == NULL || b == NULL) - return 0; - - p = heap; - while (p != NULL && p != b) { - p = p->next; - } - if (p == b) - return 1; - else - return 0; -} - -static TMemBlock *SliceBlock(TMemBlock * p, - int startofs, int size, - int reserved, int alignment) -{ - TMemBlock *newblock; - - /* break left */ - if (startofs > p->ofs) { - newblock = drm_calloc(1, sizeof(*newblock)); - newblock->ofs = startofs; - newblock->size = p->size - (startofs - p->ofs); - newblock->free = 1; - newblock->next = p->next; - p->size -= newblock->size; - p->next = newblock; - p = newblock; - } - - /* break right */ - if (size < p->size) { - newblock = drm_calloc(1, sizeof(*newblock)); - newblock->ofs = startofs + size; - newblock->size = p->size - size; - newblock->free = 1; - newblock->next = p->next; - p->size = size; - p->next = newblock; - } - - /* p = middle block */ - p->align = alignment; - p->free = 0; - p->reserved = reserved; - return p; -} - -PMemBlock mmAllocMem(memHeap_t * heap, int size, int align2, int startSearch) -{ - int mask, startofs, endofs; - TMemBlock *p; - - if (heap == NULL || align2 < 0 || size <= 0) - return NULL; - - mask = (1 << align2) - 1; - startofs = 0; - p = (TMemBlock *) heap; - while (p != NULL) { - if (ISFREE(p)) { - startofs = (p->ofs + mask) & ~mask; - if (startofs < startSearch) { - startofs = startSearch; - } - endofs = startofs + size; - if (endofs <= (p->ofs + p->size)) - break; - } - p = p->next; - } - if (p == NULL) - return NULL; - p = SliceBlock(p, startofs, size, 0, mask + 1); - p->heap = heap; - return p; -} - -static __inline__ int Join2Blocks(TMemBlock * p) -{ - if (p->free && p->next && p->next->free) { - TMemBlock *q = p->next; - p->size += q->size; - p->next = q->next; - drm_free(q); - return 1; - } - return 0; -} - -int mmFreeMem(PMemBlock b) -{ - TMemBlock *p, *prev; - - if (b == NULL) - return 0; - if (b->heap == NULL) - return -1; - - p = b->heap; - prev = NULL; - while (p != NULL && p != b) { - prev = p; - p = p->next; - } - if (p == NULL || p->free || p->reserved) - return -1; - - p->free = 1; - Join2Blocks(p); - if (prev) - Join2Blocks(prev); - return 0; -} diff --git a/sys/dev/pci/drm/sis_ds.h b/sys/dev/pci/drm/sis_ds.h deleted file mode 100644 index 0a3e3c7b0ad..00000000000 --- a/sys/dev/pci/drm/sis_ds.h +++ /dev/null @@ -1,146 +0,0 @@ -/* sis_ds.h -- Private header for Direct Rendering Manager -*- linux-c -*- - * Created: Mon Jan 4 10:05:05 1999 by sclin@sis.com.tw - */ -/* - * Copyright 2000 Silicon Integrated Systems Corp, Inc., HsinChu, Taiwan. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Authors: - * Sung-Ching Lin <sclin@sis.com.tw> - * - */ - -#ifndef __SIS_DS_H__ -#define __SIS_DS_H__ - -/* Set Data Structure */ - -#define SET_SIZE 5000 - -typedef unsigned long ITEM_TYPE; - -typedef struct { - ITEM_TYPE val; - int alloc_next, free_next; -} list_item_t; - -typedef struct { - int alloc; - int free; - int trace; - list_item_t list[SET_SIZE]; -} set_t; - -set_t *setInit(void); -int setAdd(set_t * set, ITEM_TYPE item); -int setDel(set_t * set, ITEM_TYPE item); -int setFirst(set_t * set, ITEM_TYPE * item); -int setNext(set_t * set, ITEM_TYPE * item); -int setDestroy(set_t * set); - -/* - * GLX Hardware Device Driver common code - * Copyright (C) 1999 Wittawat Yamwong - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * WITTAWAT YAMWONG, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM, - * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR - * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE - * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -struct mem_block_t { - struct mem_block_t *next; - struct mem_block_t *heap; - int ofs, size; - int align; - unsigned int free:1; - unsigned int reserved:1; -}; -typedef struct mem_block_t TMemBlock; -typedef struct mem_block_t *PMemBlock; - -/* a heap is just the first block in a chain */ -typedef struct mem_block_t memHeap_t; - -static __inline__ int mmBlockSize(PMemBlock b) -{ - return b->size; -} - -static __inline__ int mmOffset(PMemBlock b) -{ - return b->ofs; -} - -static __inline__ void mmMarkReserved(PMemBlock b) -{ - b->reserved = 1; -} - -/* - * input: total size in bytes - * return: a heap pointer if OK, NULL if error - */ -memHeap_t *mmInit(int ofs, int size); - -/* - * Allocate 'size' bytes with 2^align2 bytes alignment, - * restrict the search to free memory after 'startSearch' - * depth and back buffers should be in different 4mb banks - * to get better page hits if possible - * input: size = size of block - * align2 = 2^align2 bytes alignment - * startSearch = linear offset from start of heap to begin search - * return: pointer to the allocated block, 0 if error - */ -PMemBlock mmAllocMem(memHeap_t * heap, int size, int align2, int startSearch); - -/* - * Returns 1 if the block 'b' is part of the heap 'heap' - */ -int mmBlockInHeap(PMemBlock heap, PMemBlock b); - -/* - * Free block starts at offset - * input: pointer to a block - * return: 0 if OK, -1 if error - */ -int mmFreeMem(PMemBlock b); - -/* For debuging purpose. */ -void mmDumpMemInfo(memHeap_t * mmInit); - -#endif /* __SIS_DS_H__ */ diff --git a/sys/dev/pci/drm/sis_mm.c b/sys/dev/pci/drm/sis_mm.c deleted file mode 100644 index 07f3f575f45..00000000000 --- a/sys/dev/pci/drm/sis_mm.c +++ /dev/null @@ -1,293 +0,0 @@ -/* sis_mm.c -- Private header for Direct Rendering Manager -*- linux-c -*- - * Created: Mon Jan 4 10:05:05 1999 by sclin@sis.com.tw - * - * Copyright 2000 Silicon Integrated Systems Corp, Inc., HsinChu, Taiwan. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Authors: - * Sung-Ching Lin <sclin@sis.com.tw> - * - */ - -#include "drmP.h" -#include "sis_drm.h" -#include "sis_drv.h" -#include "sis_ds.h" - -#define MAX_CONTEXT 100 -#define VIDEO_TYPE 0 -#define AGP_TYPE 1 - -typedef struct { - int used; - int context; - set_t *sets[2]; /* 0 for video, 1 for AGP */ -} sis_context_t; - -static sis_context_t global_ppriv[MAX_CONTEXT]; - -static int add_alloc_set(int context, int type, unsigned int val) -{ - int i, retval = 0; - - for (i = 0; i < MAX_CONTEXT; i++) { - if (global_ppriv[i].used && global_ppriv[i].context == context) { - retval = setAdd(global_ppriv[i].sets[type], val); - break; - } - } - return retval; -} - -static int del_alloc_set(int context, int type, unsigned int val) -{ - int i, retval = 0; - - for (i = 0; i < MAX_CONTEXT; i++) { - if (global_ppriv[i].used && global_ppriv[i].context == context) { - retval = setDel(global_ppriv[i].sets[type], val); - break; - } - } - return retval; -} - -/* fb management via fb device */ - -/* Called by the X Server to initialize the FB heap. Allocations will fail - * unless this is called. Offset is the beginning of the heap from the - * framebuffer offset (MaxXFBMem in XFree86). - * - * Memory layout according to Thomas Winischofer: - * |------------------|DDDDDDDDDDDDDDDDDDDDDDDDDDDDD|HHHH|CCCCCCCCCCC| - * - * X driver/sisfb HW- Command- - * framebuffer memory DRI heap Cursor queue - */ -int sis_fb_init(struct drm_device *dev, void *data, struct drm_file *file_priv) -{ - drm_sis_private_t *dev_priv = dev->dev_private; - drm_sis_fb_t *fb = data; - - if (dev_priv->FBHeap != NULL) - return (EINVAL); - - dev_priv->FBHeap = mmInit(fb->offset, fb->size); - - DRM_DEBUG("offset = %u, size = %u", fb->offset, fb->size); - - return 0; -} - -int sis_fb_alloc(struct drm_device *dev, void *data, struct drm_file *file_priv) -{ - drm_sis_private_t *dev_priv = dev->dev_private; - drm_sis_mem_t *fb = data; - PMemBlock block; - int retval = 0; - - if (dev_priv == NULL || dev_priv->FBHeap == NULL) - return EINVAL; - - block = mmAllocMem(dev_priv->FBHeap, fb->size, 0, 0); - if (block) { - /* TODO */ - fb->offset = block->ofs; - fb->free = (unsigned long)block; - if (!add_alloc_set(fb->context, VIDEO_TYPE, fb->free)) { - DRM_DEBUG("adding to allocation set fails\n"); - mmFreeMem((PMemBlock) fb->free); - retval = EINVAL; - } - } else { - fb->offset = 0; - fb->size = 0; - fb->free = 0; - } - - DRM_DEBUG("alloc fb, size = %d, offset = %d\n", fb->size, fb->offset); - - return retval; -} - -int sis_fb_free(struct drm_device *dev, void *data, struct drm_file *file_priv) -{ - drm_sis_private_t *dev_priv = dev->dev_private; - drm_sis_mem_t *fb = data; - - if (dev_priv == NULL || dev_priv->FBHeap == NULL) - return EINVAL; - - if (!mmBlockInHeap(dev_priv->FBHeap, (PMemBlock) fb->free)) - return EINVAL; - - if (!del_alloc_set(fb->context, VIDEO_TYPE, fb->free)) - return EINVAL; - mmFreeMem((PMemBlock) fb->free); - - DRM_DEBUG("free fb, free = 0x%lx\n", fb->free); - - return 0; -} - -/* agp memory management */ - -int sis_ioctl_agp_init(struct drm_device *dev, void *data, struct drm_file *file_priv) -{ - drm_sis_private_t *dev_priv = dev->dev_private; - drm_sis_agp_t *agp = data; - - if (dev_priv->AGPHeap != NULL) - return EINVAL; - - dev_priv->AGPHeap = mmInit(agp->offset, agp->size); - - DRM_DEBUG("offset = %u, size = %u", agp->offset, agp->size); - - return 0; -} - -int sis_ioctl_agp_alloc(struct drm_device *dev, void *data, struct drm_file *file_priv) -{ - drm_sis_private_t *dev_priv = dev->dev_private; - drm_sis_mem_t *agp = data; - PMemBlock block; - int retval = 0; - - if (dev_priv == NULL || dev_priv->AGPHeap == NULL) - return EINVAL; - - block = mmAllocMem(dev_priv->AGPHeap, agp->size, 0, 0); - if (block) { - /* TODO */ - agp->offset = block->ofs; - agp->free = (unsigned long)block; - if (!add_alloc_set(agp->context, AGP_TYPE, agp->free)) { - DRM_DEBUG("adding to allocation set fails\n"); - mmFreeMem((PMemBlock) agp->free); - retval = -1; - } - } else { - agp->offset = 0; - agp->size = 0; - agp->free = 0; - } - - DRM_DEBUG("alloc agp, size = %d, offset = %d\n", agp->size, - agp->offset); - - return retval; -} - -int sis_ioctl_agp_free(struct drm_device *dev, void *data, struct drm_file *file_priv) -{ - drm_sis_private_t *dev_priv = dev->dev_private; - drm_sis_mem_t *agp = data; - - if (dev_priv == NULL || dev_priv->AGPHeap == NULL) - return EINVAL; - - if (!mmBlockInHeap(dev_priv->AGPHeap, (PMemBlock) agp->free)) - return EINVAL; - - mmFreeMem((PMemBlock) agp->free); - if (!del_alloc_set(agp->context, AGP_TYPE, agp->free)) - return EINVAL; - - DRM_DEBUG("free agp, free = 0x%lx\n", agp->free); - - return 0; -} - -int sis_init_context(struct drm_device *dev, int context) -{ - int i; - - for (i = 0; i < MAX_CONTEXT; i++) { - if (global_ppriv[i].used && - (global_ppriv[i].context == context)) - break; - } - - if (i >= MAX_CONTEXT) { - for (i = 0; i < MAX_CONTEXT; i++) { - if (!global_ppriv[i].used) { - global_ppriv[i].context = context; - global_ppriv[i].used = 1; - global_ppriv[i].sets[0] = setInit(); - global_ppriv[i].sets[1] = setInit(); - DRM_DEBUG("init allocation set, socket=%d, " - "context = %d\n", i, context); - break; - } - } - if ((i >= MAX_CONTEXT) || (global_ppriv[i].sets[0] == NULL) || - (global_ppriv[i].sets[1] == NULL)) { - return 0; - } - } - - return 1; -} - -int sis_final_context(struct drm_device *dev, int context) -{ - int i; - - for (i = 0; i < MAX_CONTEXT; i++) { - if (global_ppriv[i].used && - (global_ppriv[i].context == context)) - break; - } - - if (i < MAX_CONTEXT) { - set_t *set; - ITEM_TYPE item; - int retval; - - DRM_DEBUG("find socket %d, context = %d\n", i, context); - - /* Video Memory */ - set = global_ppriv[i].sets[0]; - retval = setFirst(set, &item); - while (retval) { - DRM_DEBUG("free video memory 0x%lx\n", item); - mmFreeMem((PMemBlock) item); - retval = setNext(set, &item); - } - setDestroy(set); - - /* AGP Memory */ - set = global_ppriv[i].sets[1]; - retval = setFirst(set, &item); - while (retval) { - DRM_DEBUG("free agp memory 0x%lx\n", item); - mmFreeMem((PMemBlock) item); - retval = setNext(set, &item); - } - setDestroy(set); - - global_ppriv[i].used = 0; - } - - return 1; -} |