summaryrefslogtreecommitdiff
path: root/sys/dev/pci
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/pci')
-rw-r--r--sys/dev/pci/drm/files.drm4
-rw-r--r--sys/dev/pci/drm/sis_drv.c148
-rw-r--r--sys/dev/pci/drm/sis_drv.h97
-rw-r--r--sys/dev/pci/drm/sis_ds.c297
-rw-r--r--sys/dev/pci/drm/sis_ds.h146
-rw-r--r--sys/dev/pci/drm/sis_mm.c293
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;
-}