60405de4d8688d96dd05157c28db3ade5c9bc234kz * drm_bufs.h -- Generic buffer template -*- linux-c -*-
60405de4d8688d96dd05157c28db3ade5c9bc234kz * Created: Thu Nov 23 03:10:50 2000 by gareth@valinux.com
60405de4d8688d96dd05157c28db3ade5c9bc234kz * Copyright 1999, 2000 Precision Insight, Inc., Cedar Park, Texas.
60405de4d8688d96dd05157c28db3ade5c9bc234kz * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
0035d21c77a24d02faf34c10aabc120ca692efb5miao chen - Sun Microsystems - Beijing China * Copyright (c) 2009, Intel Corporation.
60405de4d8688d96dd05157c28db3ade5c9bc234kz * All Rights Reserved.
60405de4d8688d96dd05157c28db3ade5c9bc234kz * Permission is hereby granted, free of charge, to any person obtaining a
60405de4d8688d96dd05157c28db3ade5c9bc234kz * copy of this software and associated documentation files (the "Software"),
60405de4d8688d96dd05157c28db3ade5c9bc234kz * to deal in the Software without restriction, including without limitation
60405de4d8688d96dd05157c28db3ade5c9bc234kz * the rights to use, copy, modify, merge, publish, distribute, sublicense,
60405de4d8688d96dd05157c28db3ade5c9bc234kz * and/or sell copies of the Software, and to permit persons to whom the
60405de4d8688d96dd05157c28db3ade5c9bc234kz * Software is furnished to do so, subject to the following conditions:
60405de4d8688d96dd05157c28db3ade5c9bc234kz * The above copyright notice and this permission notice (including the next
60405de4d8688d96dd05157c28db3ade5c9bc234kz * paragraph) shall be included in all copies or substantial portions of the
60405de4d8688d96dd05157c28db3ade5c9bc234kz * Software.
60405de4d8688d96dd05157c28db3ade5c9bc234kz * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
60405de4d8688d96dd05157c28db3ade5c9bc234kz * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
60405de4d8688d96dd05157c28db3ade5c9bc234kz * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
60405de4d8688d96dd05157c28db3ade5c9bc234kz * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
60405de4d8688d96dd05157c28db3ade5c9bc234kz * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
60405de4d8688d96dd05157c28db3ade5c9bc234kz * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
60405de4d8688d96dd05157c28db3ade5c9bc234kz * OTHER DEALINGS IN THE SOFTWARE.
60405de4d8688d96dd05157c28db3ade5c9bc234kz * Authors:
60405de4d8688d96dd05157c28db3ade5c9bc234kz * Rickard E. (Rik) Faith <faith@valinux.com>
60405de4d8688d96dd05157c28db3ade5c9bc234kz * Gareth Hughes <gareth@valinux.com>
d02310705313ee2fcefee164a4b26d1fa85e9d22miao chen - Sun Microsystems - Beijing China * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
e92e3a8694f157faf8a9e44096a70ada86c556bfzw * Use is subject to license terms.
60405de4d8688d96dd05157c28db3ade5c9bc234kz * Compute order. Can be made faster.
d0538f66491267879b7418b21ad78e3dcc2dcc83cgstatic inline drm_local_map_t *
d0538f66491267879b7418b21ad78e3dcc2dcc83cgdrm_find_map(drm_device_t *dev, u_offset_t offset, int type)
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * Only allow shared memory to be removable since we only keep
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * enough book keeping information about shared memory to allow
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * for removal when processes fork.
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * Check if this is just another version of a kernel-allocated
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * map, and just hand that back if so.
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * Allocate a new map structure, fill it in, and do any
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * type-specific initialization necessary.
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * ddi_umem_alloc() grants page-aligned memory. We needn't
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * handle alignment issue here.
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * record only low 32-bit of this handle, since 32-bit
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * user app is incapable of passing in 64bit offset when
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * doing mmap.
60405de4d8688d96dd05157c28db3ade5c9bc234kz /* Prevent a 2nd X Server from creating a 2nd lock */
0035d21c77a24d02faf34c10aabc120ca692efb5miao chen - Sun Microsystems - Beijing China DRM_ERROR("%d DRM_AGP_CONSISTENT", __LINE__);
d0538f66491267879b7418b21ad78e3dcc2dcc83cg if (kva == 0) {
d0538f66491267879b7418b21ad78e3dcc2dcc83cg "drm_addmap: failed to map AGP aperture");
60405de4d8688d96dd05157c28db3ade5c9bc234kz /* Jumped to, with lock held, when a kernel map is found. */
60405de4d8688d96dd05157c28db3ade5c9bc234kz return (0);
60405de4d8688d96dd05157c28db3ade5c9bc234kz/*ARGSUSED*/
60405de4d8688d96dd05157c28db3ade5c9bc234kz if (ddi_model_convert_from(mode & FMODELS) == DDI_MODEL_ILP32) {
60405de4d8688d96dd05157c28db3ade5c9bc234kz err = drm_addmap(dev, request.offset, request.size, request.type,
60405de4d8688d96dd05157c28db3ade5c9bc234kz if (ddi_model_convert_from(mode & FMODELS) == DDI_MODEL_ILP32) {
60405de4d8688d96dd05157c28db3ade5c9bc234kz return (0);
60405de4d8688d96dd05157c28db3ade5c9bc234kz /* FALLTHROUGH */
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * we mapped AGP aperture into kernel space in drm_addmap,
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * here, unmap them and release kernel virtual address space
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * Remove a map private from list and deallocate resources if the
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * mapping isn't in use.
60405de4d8688d96dd05157c28db3ade5c9bc234kz/*ARGSUSED*/
60405de4d8688d96dd05157c28db3ade5c9bc234kz if (ddi_model_convert_from(mode & FMODELS) == DDI_MODEL_ILP32) {
d0538f66491267879b7418b21ad78e3dcc2dcc83cg if (((uintptr_t)map->handle == (request.handle & 0xffffffff)) &&
60405de4d8688d96dd05157c28db3ade5c9bc234kz /* No match found. */
60405de4d8688d96dd05157c28db3ade5c9bc234kz return (0);
60405de4d8688d96dd05157c28db3ade5c9bc234kz/*ARGSUSED*/
60405de4d8688d96dd05157c28db3ade5c9bc234kzstatic void
60405de4d8688d96dd05157c28db3ade5c9bc234kzdrm_cleanup_buf_error(drm_device_t *dev, drm_buf_entry_t *entry)
60405de4d8688d96dd05157c28db3ade5c9bc234kz "drm_cleanup_buf_error: not implemented");
60405de4d8688d96dd05157c28db3ade5c9bc234kz/*ARGSUSED*/
60405de4d8688d96dd05157c28db3ade5c9bc234kz/*ARGSUSED*/
60405de4d8688d96dd05157c28db3ade5c9bc234kzdrm_do_addbufs_agp(drm_device_t *dev, drm_buf_desc_t *request)
60405de4d8688d96dd05157c28db3ade5c9bc234kz page_order = order - PAGE_SHIFT > 0 ? order - PAGE_SHIFT : 0;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg /* No more than one allocation per order */
60405de4d8688d96dd05157c28db3ade5c9bc234kz entry->buflist = drm_alloc(count * sizeof (*entry->buflist),
d0538f66491267879b7418b21ad78e3dcc2dcc83cg buf->dev_private = drm_alloc(buf->dev_priv_size, DRM_MEM_BUFS);
60405de4d8688d96dd05157c28db3ade5c9bc234kz /* Set count correctly so we free the proper amount. */
60405de4d8688d96dd05157c28db3ade5c9bc234kz (dma->buf_count + entry->buf_count) * sizeof (*dma->buflist),
60405de4d8688d96dd05157c28db3ade5c9bc234kz /* Free the entry because it isn't valid */
60405de4d8688d96dd05157c28db3ade5c9bc234kz kmem_free(dma->buflist, dma->buf_count *sizeof (*dma->buflist));
60405de4d8688d96dd05157c28db3ade5c9bc234kz return (0);
60405de4d8688d96dd05157c28db3ade5c9bc234kzdrm_do_addbufs_sg(drm_device_t *dev, drm_buf_desc_t *request)
60405de4d8688d96dd05157c28db3ade5c9bc234kz page_order = order - PAGE_SHIFT > 0 ? order - PAGE_SHIFT : 0;
60405de4d8688d96dd05157c28db3ade5c9bc234kz entry->buflist = drm_alloc(count * sizeof (*entry->buflist),
60405de4d8688d96dd05157c28db3ade5c9bc234kz buf->address = (void *)(agp_offset + offset + dev->sg->handle);
60405de4d8688d96dd05157c28db3ade5c9bc234kz /* Set count correctly so we free the proper amount. */
60405de4d8688d96dd05157c28db3ade5c9bc234kz return (0);
60405de4d8688d96dd05157c28db3ade5c9bc234kzdrm_addbufs_agp(drm_device_t *dev, drm_buf_desc_t *request)
60405de4d8688d96dd05157c28db3ade5c9bc234kz /* No more allocations after first buffer-using ioctl. */
60405de4d8688d96dd05157c28db3ade5c9bc234kz /* No more than one allocation per order */
60405de4d8688d96dd05157c28db3ade5c9bc234kzdrm_addbufs_sg(drm_device_t *dev, drm_buf_desc_t *request)
60405de4d8688d96dd05157c28db3ade5c9bc234kz /* No more allocations after first buffer-using ioctl. */
60405de4d8688d96dd05157c28db3ade5c9bc234kz /* No more than one allocation per order */
60405de4d8688d96dd05157c28db3ade5c9bc234kz/*ARGSUSED*/
60405de4d8688d96dd05157c28db3ade5c9bc234kz if (ddi_model_convert_from(mode & FMODELS) == DDI_MODEL_ILP32) {
60405de4d8688d96dd05157c28db3ade5c9bc234kz if (ddi_model_convert_from(mode & FMODELS) == DDI_MODEL_ILP32) {
60405de4d8688d96dd05157c28db3ade5c9bc234kz/*ARGSUSED*/
60405de4d8688d96dd05157c28db3ade5c9bc234kz if (ddi_model_convert_from(mode & FMODELS) == DDI_MODEL_ILP32) {
60405de4d8688d96dd05157c28db3ade5c9bc234kz if (DRM_COPY_FROM_USER(&idx, &request.list[i], sizeof (idx))) {
60405de4d8688d96dd05157c28db3ade5c9bc234kz "drm_freebufs: process %d not owning the buffer.\n",
d0538f66491267879b7418b21ad78e3dcc2dcc83cgextern caddr_t smmap64(caddr_t, size_t, int, int, int, off_t);
d0538f66491267879b7418b21ad78e3dcc2dcc83cgextern caddr_t smmap32(caddr32_t, size32_t, int, int, int, off32_t);
60405de4d8688d96dd05157c28db3ade5c9bc234kz/*ARGSUSED*/
60405de4d8688d96dd05157c28db3ade5c9bc234kz if (ddi_model_convert_from(mode & FMODELS) == DDI_MODEL_ILP32) {
d0538f66491267879b7418b21ad78e3dcc2dcc83cg request.list = (drm_buf_pub_t *)(uintptr_t)request32.list;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg if ((dev->driver->use_agp && (dma->flags & _DRM_DMA_USE_AGP)) ||
d0538f66491267879b7418b21ad78e3dcc2dcc83cg (dev->driver->use_sg && (dma->flags & _DRM_DMA_USE_SG))) {
d0538f66491267879b7418b21ad78e3dcc2dcc83cg request.virtual = drm_smmap(NULL, size, PROT_READ | PROT_WRITE,
d0538f66491267879b7418b21ad78e3dcc2dcc83cg if (ddi_model_convert_from(mode & FMODELS) == DDI_MODEL_ILP32) {
d0538f66491267879b7418b21ad78e3dcc2dcc83cg ASSERT(ddi_model_convert_from(mode & FMODELS) != DDI_MODEL_ILP32);
60405de4d8688d96dd05157c28db3ade5c9bc234kz &dma->buflist[i]->total, sizeof (request.list[0].total))) {
60405de4d8688d96dd05157c28db3ade5c9bc234kz sizeof (zero))) {
60405de4d8688d96dd05157c28db3ade5c9bc234kz if (ddi_model_convert_from(mode & FMODELS) == DDI_MODEL_ILP32) {
60405de4d8688d96dd05157c28db3ade5c9bc234kz request32.virtual = (caddr32_t)(uintptr_t)request.virtual;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg return (0);