The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/drm/drm_scatter.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * Copyright (c) 2009 Robert C. Noland III <rnoland@FreeBSD.org>
    3  * All Rights Reserved.
    4  *
    5  * Permission is hereby granted, free of charge, to any person obtaining a
    6  * copy of this software and associated documentation files (the "Software"),
    7  * to deal in the Software without restriction, including without limitation
    8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
    9  * and/or sell copies of the Software, and to permit persons to whom the
   10  * Software is furnished to do so, subject to the following conditions:
   11  *
   12  * The above copyright notice and this permission notice (including the next
   13  * paragraph) shall be included in all copies or substantial portions of the
   14  * Software.
   15  *
   16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
   19  * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
   20  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
   21  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
   22  * DEALINGS IN THE SOFTWARE.
   23  */
   24 
   25 #include <sys/cdefs.h>
   26 __FBSDID("$FreeBSD$");
   27 
   28 /** @file drm_scatter.c
   29  * Allocation of memory for scatter-gather mappings by the graphics chip.
   30  * The memory allocated here is then made into an aperture in the card
   31  * by mapping the pages into the GART.
   32  */
   33 
   34 #include "dev/drm/drmP.h"
   35 
   36 int
   37 drm_sg_alloc(struct drm_device *dev, struct drm_scatter_gather *request)
   38 {
   39         struct drm_sg_mem *entry;
   40         vm_size_t size;
   41         vm_pindex_t pindex;
   42 
   43         if (dev->sg)
   44                 return EINVAL;
   45 
   46         DRM_DEBUG("request size=%ld\n", request->size);
   47 
   48         entry = malloc(sizeof(*entry), DRM_MEM_DRIVER, M_WAITOK | M_ZERO);
   49 
   50         size = round_page(request->size);
   51         entry->pages = OFF_TO_IDX(size);
   52         entry->busaddr = malloc(entry->pages * sizeof(*entry->busaddr),
   53             DRM_MEM_SGLISTS, M_WAITOK | M_ZERO);
   54 
   55         entry->vaddr = kmem_alloc_attr(kernel_map, size, M_WAITOK | M_ZERO,
   56             0, BUS_SPACE_MAXADDR_32BIT, VM_MEMATTR_WRITE_COMBINING);
   57         if (entry->vaddr == 0) {
   58                 drm_sg_cleanup(entry);
   59                 return (ENOMEM);
   60         }
   61 
   62         for(pindex = 0; pindex < entry->pages; pindex++) {
   63                 entry->busaddr[pindex] =
   64                     vtophys(entry->vaddr + IDX_TO_OFF(pindex));
   65         }
   66 
   67         DRM_LOCK();
   68         if (dev->sg) {
   69                 DRM_UNLOCK();
   70                 drm_sg_cleanup(entry);
   71                 return (EINVAL);
   72         }
   73         dev->sg = entry;
   74         DRM_UNLOCK();
   75 
   76         request->handle = entry->vaddr;
   77 
   78         DRM_DEBUG("allocated %ju pages @ 0x%08zx, contents=%08lx\n",
   79             entry->pages, entry->vaddr, *(unsigned long *)entry->vaddr);
   80 
   81         return (0);
   82 }
   83 
   84 int
   85 drm_sg_alloc_ioctl(struct drm_device *dev, void *data,
   86                    struct drm_file *file_priv)
   87 {
   88         struct drm_scatter_gather *request = data;
   89 
   90         DRM_DEBUG("\n");
   91 
   92         return (drm_sg_alloc(dev, request));
   93 }
   94 
   95 void
   96 drm_sg_cleanup(struct drm_sg_mem *entry)
   97 {
   98         if (entry == NULL)
   99                 return;
  100 
  101         if (entry->vaddr != 0)
  102                 kmem_free(kernel_map, entry->vaddr, IDX_TO_OFF(entry->pages));
  103 
  104         free(entry->busaddr, DRM_MEM_SGLISTS);
  105         free(entry, DRM_MEM_DRIVER);
  106 
  107         return;
  108 }
  109 
  110 int
  111 drm_sg_free(struct drm_device *dev, void *data, struct drm_file *file_priv)
  112 {
  113         struct drm_scatter_gather *request = data;
  114         struct drm_sg_mem *entry;
  115 
  116         DRM_LOCK();
  117         entry = dev->sg;
  118         dev->sg = NULL;
  119         DRM_UNLOCK();
  120 
  121         if (!entry || entry->vaddr != request->handle)
  122                 return (EINVAL);
  123 
  124         DRM_DEBUG("free 0x%zx\n", entry->vaddr);
  125 
  126         drm_sg_cleanup(entry);
  127 
  128         return (0);
  129 }

Cache object: 6293f7992f623f89c2849d4a0b10f14b


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.