diff options
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; -} |