summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/io/drm/drm_scatter.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common/io/drm/drm_scatter.c')
-rw-r--r--usr/src/uts/common/io/drm/drm_scatter.c169
1 files changed, 66 insertions, 103 deletions
diff --git a/usr/src/uts/common/io/drm/drm_scatter.c b/usr/src/uts/common/io/drm/drm_scatter.c
index b1d1076..50fc361 100644
--- a/usr/src/uts/common/io/drm/drm_scatter.c
+++ b/usr/src/uts/common/io/drm/drm_scatter.c
@@ -1,13 +1,21 @@
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved.
*/
-/* BEGIN CSTYLED */
+/*
+ * Copyright (c) 2012 Intel Corporation. All rights reserved.
+ */
+
+/**
+ * \file drm_scatter.c
+ * IOCTLs to manage scatter/gather memory
+ *
+ * \author Gareth Hughes <gareth@valinux.com>
+ */
-/* drm_scatter.h -- IOCTLs to manage scatter/gather memory -*- linux-c -*-
- * Created: Mon Dec 18 23:20:54 2000 by gareth@valinux.com */
-/*-
+/*
+ * Created: Mon Dec 18 23:20:54 2000 by gareth@valinux.com
+ *
* Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
* All Rights Reserved.
*
@@ -29,32 +37,16 @@
* 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:
- * Gareth Hughes <gareth@valinux.com>
- * Eric Anholt <anholt@FreeBSD.org>
- *
*/
-/* END CSTYLED */
-
-#pragma ident "%Z%%M% %I% %E% SMI"
#include "drmP.h"
-#include <gfx_private.h>
#include "drm_io32.h"
-#define DEBUG_SCATTER 0
+#define DEBUG_SCATTER 0
-#ifdef _LP64
-#define ScatterHandle(x) (unsigned int)((x >> 32) + (x & ((1L << 32) - 1)))
-#else
-#define ScatterHandle(x) (unsigned int)(x)
-#endif
-
-void
-drm_sg_cleanup(drm_device_t *dev, drm_sg_mem_t *entry)
+void drm_sg_cleanup(struct drm_sg_mem *entry)
{
- int pages = entry->pages;
+ int pages = entry->pages;
if (entry->busaddr) {
kmem_free(entry->busaddr, sizeof (*entry->busaddr) * pages);
@@ -64,52 +56,46 @@ drm_sg_cleanup(drm_device_t *dev, drm_sg_mem_t *entry)
ASSERT(entry->umem_cookie == NULL);
if (entry->dmah_sg) {
- drm_pci_free(dev, entry->dmah_sg);
+ drm_pci_free(entry->dmah_sg);
entry->dmah_sg = NULL;
}
if (entry->dmah_gart) {
- drm_pci_free(dev, entry->dmah_gart);
+ drm_pci_free(entry->dmah_gart);
entry->dmah_gart = NULL;
}
- if (entry) {
- drm_free(entry, sizeof (drm_sg_mem_t), DRM_MEM_SGLISTS);
- entry = NULL;
- }
+ kfree(entry, sizeof (struct drm_sg_mem));
}
-/*ARGSUSED*/
-int
-drm_sg_alloc(DRM_IOCTL_ARGS)
+#ifdef _LP64
+#define ScatterHandle(x) (unsigned int)((x >> 32) + (x & ((1L << 32) - 1)))
+#else
+#define ScatterHandle(x) (unsigned int)(x)
+#endif
+
+int drm_sg_alloc(struct drm_device *dev, struct drm_scatter_gather * request)
{
- DRM_DEVICE;
+ struct drm_sg_mem *entry;
unsigned long pages;
- drm_sg_mem_t *entry;
- drm_dma_handle_t *dmah;
- drm_scatter_gather_t request;
+ drm_dma_handle_t *dmah;
- DRM_DEBUG("%s\n", "drm_sg_alloc");
+ DRM_DEBUG("\n");
+
+ if (!drm_core_check_feature(dev, DRIVER_SG))
+ return -EINVAL;
if (dev->sg)
- return (EINVAL);
+ return -EINVAL;
-#ifdef _MULTI_DATAMODEL
- if (ddi_model_convert_from(mode & FMODELS) == DDI_MODEL_ILP32) {
- drm_scatter_gather_32_t request32;
+ entry = kmalloc(sizeof(*entry), GFP_KERNEL);
+ if (!entry)
+ return -ENOMEM;
- DRM_COPYFROM_WITH_RETURN(&request32, (void *)data,
- sizeof (request32));
- request.size = request32.size;
- request.handle = request32.handle;
- } else
-#endif
- DRM_COPYFROM_WITH_RETURN(&request, (void *)data,
- sizeof (request));
+ (void) memset(entry, 0, sizeof(*entry));
+ pages = (request->size + PAGE_SIZE - 1) / PAGE_SIZE;
+ DRM_DEBUG("size=%ld pages=%ld\n", request->size, pages);
- pages = btopr(request.size);
- DRM_DEBUG("sg size=%ld pages=%ld\n", request.size, pages);
- entry = kmem_zalloc(sizeof (*entry), KM_SLEEP);
entry->pages = (int)pages;
dmah = drm_pci_alloc(dev, ptob(pages), 4096, 0xfffffffful, pages);
if (dmah == NULL)
@@ -119,68 +105,45 @@ drm_sg_alloc(DRM_IOCTL_ARGS)
entry->handle = ScatterHandle((unsigned long)dmah->vaddr);
entry->virtual = (void *)dmah->vaddr;
- request.handle = entry->handle;
+ request->handle = entry->handle;
entry->dmah_sg = dmah;
-#ifdef _MULTI_DATAMODEL
- if (ddi_model_convert_from(mode & FMODELS) == DDI_MODEL_ILP32) {
- drm_scatter_gather_32_t data32;
- data32.size = (uint32_t)request.size;
- data32.handle = (uint32_t)request.handle;
-
- DRM_COPYTO_WITH_RETURN((void *)data, &data32,
- sizeof (data32));
- } else
-#endif
- DRM_COPYTO_WITH_RETURN((void *)data, &request,
- sizeof (request));
-
- DRM_LOCK();
- if (dev->sg) {
- DRM_UNLOCK();
- drm_sg_cleanup(dev, entry);
- return (EINVAL);
- }
dev->sg = entry;
- DRM_UNLOCK();
- return (0);
+ return 0;
err_exit:
- drm_sg_cleanup(dev, entry);
- return (ENOMEM);
+ drm_sg_cleanup(entry);
+ return -ENOMEM;
}
-/*ARGSUSED*/
-int
-drm_sg_free(DRM_IOCTL_ARGS)
+/* LINTED */
+int drm_sg_alloc_ioctl(DRM_IOCTL_ARGS)
{
- DRM_DEVICE;
- drm_scatter_gather_t request;
- drm_sg_mem_t *entry;
-
-#ifdef _MULTI_DATAMODEL
- if (ddi_model_convert_from(mode & FMODELS) == DDI_MODEL_ILP32) {
- drm_scatter_gather_32_t request32;
-
- DRM_COPYFROM_WITH_RETURN(&request32, (void *)data,
- sizeof (request32));
- request.size = request32.size;
- request.handle = request32.handle;
- } else
-#endif
- DRM_COPYFROM_WITH_RETURN(&request, (void *)data,
- sizeof (request));
+ struct drm_scatter_gather *request = data;
+
+ return drm_sg_alloc(dev, request);
+
+}
+
+/* LINTED */
+int drm_sg_free(DRM_IOCTL_ARGS)
+{
+ struct drm_scatter_gather *request = data;
+ struct drm_sg_mem *entry;
+
+ if (!drm_core_check_feature(dev, DRIVER_SG))
+ return -EINVAL;
- DRM_LOCK();
entry = dev->sg;
dev->sg = NULL;
- DRM_UNLOCK();
- if (!entry || entry->handle != request.handle)
- return (EINVAL);
+ if (!entry || entry->handle != request->handle)
+ return -EINVAL;
+
+ DRM_DEBUG("virtual = %p\n", entry->virtual);
- drm_sg_cleanup(dev, entry);
+ drm_sg_cleanup(entry);
- return (0);
+ return 0;
}