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/drm2/drm_buffer.h

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  *
    3  * Copyright 2010 Pauli Nieminen.
    4  * All Rights Reserved.
    5  *
    6  * Permission is hereby granted, free of charge, to any person obtaining a
    7  * copy of this software and associated documentation files (the
    8  * "Software"), to deal in the Software without restriction, including
    9  * without limitation the rights to use, copy, modify, merge, publish,
   10  * distribute, sub license, and/or sell copies of the Software, and to
   11  * permit persons to whom the Software is furnished to do so, subject to
   12  * the following conditions:
   13  *
   14  * The above copyright notice and this permission notice (including the
   15  * next paragraph) shall be included in all copies or substantial portions
   16  * of the Software.
   17  *
   18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   19  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   20  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
   21  * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
   22  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
   23  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
   24  * USE OR OTHER DEALINGS IN THE SOFTWARE.
   25  *
   26  *
   27  **************************************************************************/
   28 /*
   29  * Multipart buffer for coping data which is larger than the page size.
   30  *
   31  * Authors:
   32  * Pauli Nieminen <suokkos-at-gmail-dot-com>
   33  */
   34 
   35 #include <sys/cdefs.h>
   36 __FBSDID("$FreeBSD$");
   37 
   38 #ifndef _DRM_BUFFER_H_
   39 #define _DRM_BUFFER_H_
   40 
   41 #include <dev/drm2/drmP.h>
   42 
   43 struct drm_buffer {
   44         int iterator;
   45         int size;
   46         char *data[];
   47 };
   48 
   49 
   50 /**
   51  * Return the index of page that buffer is currently pointing at.
   52  */
   53 static inline int drm_buffer_page(struct drm_buffer *buf)
   54 {
   55         return buf->iterator / PAGE_SIZE;
   56 }
   57 /**
   58  * Return the index of the current byte in the page
   59  */
   60 static inline int drm_buffer_index(struct drm_buffer *buf)
   61 {
   62         return buf->iterator & (PAGE_SIZE - 1);
   63 }
   64 /**
   65  * Return number of bytes that is left to process
   66  */
   67 static inline int drm_buffer_unprocessed(struct drm_buffer *buf)
   68 {
   69         return buf->size - buf->iterator;
   70 }
   71 
   72 /**
   73  * Advance the buffer iterator number of bytes that is given.
   74  */
   75 static inline void drm_buffer_advance(struct drm_buffer *buf, int bytes)
   76 {
   77         buf->iterator += bytes;
   78 }
   79 
   80 /**
   81  * Allocate the drm buffer object.
   82  *
   83  *   buf: A pointer to a pointer where the object is stored.
   84  *   size: The number of bytes to allocate.
   85  */
   86 extern int drm_buffer_alloc(struct drm_buffer **buf, int size);
   87 
   88 /**
   89  * Copy the user data to the begin of the buffer and reset the processing
   90  * iterator.
   91  *
   92  *   user_data: A pointer the data that is copied to the buffer.
   93  *   size: The Number of bytes to copy.
   94  */
   95 extern int drm_buffer_copy_from_user(struct drm_buffer *buf,
   96                 void __user *user_data, int size);
   97 
   98 /**
   99  * Free the drm buffer object
  100  */
  101 extern void drm_buffer_free(struct drm_buffer *buf);
  102 
  103 /**
  104  * Read an object from buffer that may be split to multiple parts. If object
  105  * is not split function just returns the pointer to object in buffer. But in
  106  * case of split object data is copied to given stack object that is suplied
  107  * by caller.
  108  *
  109  * The processing location of the buffer is also advanced to the next byte
  110  * after the object.
  111  *
  112  *   objsize: The size of the objet in bytes.
  113  *   stack_obj: A pointer to a memory location where object can be copied.
  114  */
  115 extern void *drm_buffer_read_object(struct drm_buffer *buf,
  116                 int objsize, void *stack_obj);
  117 
  118 /**
  119  * Returns the pointer to the dword which is offset number of elements from the
  120  * current processing location.
  121  *
  122  * Caller must make sure that dword is not split in the buffer. This
  123  * requirement is easily met if all the sizes of objects in buffer are
  124  * multiples of dword and PAGE_SIZE is multiple dword.
  125  *
  126  * Call to this function doesn't change the processing location.
  127  *
  128  *   offset: The index of the dword relative to the internat iterator.
  129  */
  130 static inline void *drm_buffer_pointer_to_dword(struct drm_buffer *buffer,
  131                 int offset)
  132 {
  133         int iter = buffer->iterator + offset * 4;
  134         return &buffer->data[iter / PAGE_SIZE][iter & (PAGE_SIZE - 1)];
  135 }
  136 /**
  137  * Returns the pointer to the dword which is offset number of elements from
  138  * the current processing location.
  139  *
  140  * Call to this function doesn't change the processing location.
  141  *
  142  *   offset: The index of the byte relative to the internat iterator.
  143  */
  144 static inline void *drm_buffer_pointer_to_byte(struct drm_buffer *buffer,
  145                 int offset)
  146 {
  147         int iter = buffer->iterator + offset;
  148         return &buffer->data[iter / PAGE_SIZE][iter & (PAGE_SIZE - 1)];
  149 }
  150 
  151 #endif

Cache object: 0de836d00b8ad4c02876ef9b5f15f2a0


[ 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.