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_lock.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 /* lock.c -- IOCTLs for locking -*- linux-c -*-
    2  * Created: Tue Feb  2 08:37:54 1999 by faith@valinux.com */
    3 /*-
    4  * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
    5  * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
    6  * All Rights Reserved.
    7  *
    8  * Permission is hereby granted, free of charge, to any person obtaining a
    9  * copy of this software and associated documentation files (the "Software"),
   10  * to deal in the Software without restriction, including without limitation
   11  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   12  * and/or sell copies of the Software, and to permit persons to whom the
   13  * Software is furnished to do so, subject to the following conditions:
   14  *
   15  * The above copyright notice and this permission notice (including the next
   16  * paragraph) shall be included in all copies or substantial portions of the
   17  * Software.
   18  *
   19  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   20  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   21  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
   22  * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
   23  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
   24  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
   25  * OTHER DEALINGS IN THE SOFTWARE.
   26  *
   27  * Authors:
   28  *    Rickard E. (Rik) Faith <faith@valinux.com>
   29  *    Gareth Hughes <gareth@valinux.com>
   30  *
   31  * $FreeBSD$
   32  */
   33 
   34 #include "dev/drm/drmP.h"
   35 
   36 int DRM(lock_take)(__volatile__ unsigned int *lock, unsigned int context)
   37 {
   38         unsigned int old, new;
   39 
   40         do {
   41                 old = *lock;
   42                 if (old & _DRM_LOCK_HELD) new = old | _DRM_LOCK_CONT;
   43                 else                      new = context | _DRM_LOCK_HELD;
   44         } while (!atomic_cmpset_int(lock, old, new));
   45 
   46         if (_DRM_LOCKING_CONTEXT(old) == context) {
   47                 if (old & _DRM_LOCK_HELD) {
   48                         if (context != DRM_KERNEL_CONTEXT) {
   49                                 DRM_ERROR("%d holds heavyweight lock\n",
   50                                           context);
   51                         }
   52                         return 0;
   53                 }
   54         }
   55         if (new == (context | _DRM_LOCK_HELD)) {
   56                                 /* Have lock */
   57                 return 1;
   58         }
   59         return 0;
   60 }
   61 
   62 /* This takes a lock forcibly and hands it to context.  Should ONLY be used
   63    inside *_unlock to give lock to kernel before calling *_dma_schedule. */
   64 int DRM(lock_transfer)(drm_device_t *dev,
   65                        __volatile__ unsigned int *lock, unsigned int context)
   66 {
   67         unsigned int old, new;
   68 
   69         dev->lock.filp = NULL;
   70         do {
   71                 old  = *lock;
   72                 new  = context | _DRM_LOCK_HELD;
   73         } while (!atomic_cmpset_int(lock, old, new));
   74 
   75         return 1;
   76 }
   77 
   78 int DRM(lock_free)(drm_device_t *dev,
   79                    __volatile__ unsigned int *lock, unsigned int context)
   80 {
   81         unsigned int old, new;
   82 
   83         dev->lock.filp = NULL;
   84         do {
   85                 old  = *lock;
   86                 new  = 0;
   87         } while (!atomic_cmpset_int(lock, old, new));
   88 
   89         if (_DRM_LOCK_IS_HELD(old) && _DRM_LOCKING_CONTEXT(old) != context) {
   90                 DRM_ERROR("%d freed heavyweight lock held by %d\n",
   91                           context, _DRM_LOCKING_CONTEXT(old));
   92                 return 1;
   93         }
   94         DRM_WAKEUP_INT((void *)&dev->lock.lock_queue);
   95         return 0;
   96 }
   97 

Cache object: d137d3b602cd8c6524c46ef00c12296a


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