PageRenderTime 101ms CodeModel.GetById 37ms app.highlight 12ms RepoModel.GetById 40ms app.codeStats 0ms

/include/drm/drm_mm.h

https://bitbucket.org/thekraven/iscream_thunderc-2.6.35
C++ Header | 141 lines | 96 code | 8 blank | 37 comment | 0 complexity | df68c1ab73ecf941f111a98ab89f8fd3 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.0, AGPL-1.0
  1/**************************************************************************
  2 *
  3 * Copyright 2006-2008 Tungsten Graphics, Inc., Cedar Park, TX. USA.
  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 * Authors:
 30 * Thomas Hellstrom <thomas-at-tungstengraphics-dot-com>
 31 */
 32
 33#ifndef _DRM_MM_H_
 34#define _DRM_MM_H_
 35
 36/*
 37 * Generic range manager structs
 38 */
 39#include <linux/list.h>
 40#ifdef CONFIG_DEBUG_FS
 41#include <linux/seq_file.h>
 42#endif
 43
 44struct drm_mm_node {
 45	struct list_head fl_entry;
 46	struct list_head ml_entry;
 47	int free;
 48	unsigned long start;
 49	unsigned long size;
 50	struct drm_mm *mm;
 51	void *private;
 52};
 53
 54struct drm_mm {
 55	struct list_head fl_entry;
 56	struct list_head ml_entry;
 57	struct list_head unused_nodes;
 58	int num_unused;
 59	spinlock_t unused_lock;
 60};
 61
 62/*
 63 * Basic range manager support (drm_mm.c)
 64 */
 65extern struct drm_mm_node *drm_mm_get_block_generic(struct drm_mm_node *node,
 66						    unsigned long size,
 67						    unsigned alignment,
 68						    int atomic);
 69extern struct drm_mm_node *drm_mm_get_block_range_generic(
 70						struct drm_mm_node *node,
 71						unsigned long size,
 72						unsigned alignment,
 73						unsigned long start,
 74						unsigned long end,
 75						int atomic);
 76static inline struct drm_mm_node *drm_mm_get_block(struct drm_mm_node *parent,
 77						   unsigned long size,
 78						   unsigned alignment)
 79{
 80	return drm_mm_get_block_generic(parent, size, alignment, 0);
 81}
 82static inline struct drm_mm_node *drm_mm_get_block_atomic(struct drm_mm_node *parent,
 83							  unsigned long size,
 84							  unsigned alignment)
 85{
 86	return drm_mm_get_block_generic(parent, size, alignment, 1);
 87}
 88static inline struct drm_mm_node *drm_mm_get_block_range(
 89						struct drm_mm_node *parent,
 90						unsigned long size,
 91						unsigned alignment,
 92						unsigned long start,
 93						unsigned long end)
 94{
 95	return drm_mm_get_block_range_generic(parent, size, alignment,
 96						start, end, 0);
 97}
 98static inline struct drm_mm_node *drm_mm_get_block_atomic_range(
 99						struct drm_mm_node *parent,
100						unsigned long size,
101						unsigned alignment,
102						unsigned long start,
103						unsigned long end)
104{
105	return drm_mm_get_block_range_generic(parent, size, alignment,
106						start, end, 1);
107}
108extern void drm_mm_put_block(struct drm_mm_node *cur);
109extern struct drm_mm_node *drm_mm_search_free(const struct drm_mm *mm,
110					      unsigned long size,
111					      unsigned alignment,
112					      int best_match);
113extern struct drm_mm_node *drm_mm_search_free_in_range(
114						const struct drm_mm *mm,
115						unsigned long size,
116						unsigned alignment,
117						unsigned long start,
118						unsigned long end,
119						int best_match);
120extern int drm_mm_init(struct drm_mm *mm, unsigned long start,
121		       unsigned long size);
122extern void drm_mm_takedown(struct drm_mm *mm);
123extern int drm_mm_clean(struct drm_mm *mm);
124extern unsigned long drm_mm_tail_space(struct drm_mm *mm);
125extern int drm_mm_remove_space_from_tail(struct drm_mm *mm,
126					 unsigned long size);
127extern int drm_mm_add_space_to_tail(struct drm_mm *mm,
128				    unsigned long size, int atomic);
129extern int drm_mm_pre_get(struct drm_mm *mm);
130
131static inline struct drm_mm *drm_get_mm(struct drm_mm_node *block)
132{
133	return block->mm;
134}
135
136extern void drm_mm_debug_table(struct drm_mm *mm, const char *prefix);
137#ifdef CONFIG_DEBUG_FS
138int drm_mm_dump_table(struct seq_file *m, struct drm_mm *mm);
139#endif
140
141#endif