xref: /openbmc/linux/include/drm/drm_mm.h (revision fa8a1238)
1249d6048SJerome Glisse /**************************************************************************
2249d6048SJerome Glisse  *
3249d6048SJerome Glisse  * Copyright 2006-2008 Tungsten Graphics, Inc., Cedar Park, TX. USA.
4249d6048SJerome Glisse  * All Rights Reserved.
5249d6048SJerome Glisse  *
6249d6048SJerome Glisse  * Permission is hereby granted, free of charge, to any person obtaining a
7249d6048SJerome Glisse  * copy of this software and associated documentation files (the
8249d6048SJerome Glisse  * "Software"), to deal in the Software without restriction, including
9249d6048SJerome Glisse  * without limitation the rights to use, copy, modify, merge, publish,
10249d6048SJerome Glisse  * distribute, sub license, and/or sell copies of the Software, and to
11249d6048SJerome Glisse  * permit persons to whom the Software is furnished to do so, subject to
12249d6048SJerome Glisse  * the following conditions:
13249d6048SJerome Glisse  *
14249d6048SJerome Glisse  * The above copyright notice and this permission notice (including the
15249d6048SJerome Glisse  * next paragraph) shall be included in all copies or substantial portions
16249d6048SJerome Glisse  * of the Software.
17249d6048SJerome Glisse  *
18249d6048SJerome Glisse  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19249d6048SJerome Glisse  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20249d6048SJerome Glisse  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
21249d6048SJerome Glisse  * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
22249d6048SJerome Glisse  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
23249d6048SJerome Glisse  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
24249d6048SJerome Glisse  * USE OR OTHER DEALINGS IN THE SOFTWARE.
25249d6048SJerome Glisse  *
26249d6048SJerome Glisse  *
27249d6048SJerome Glisse  **************************************************************************/
28249d6048SJerome Glisse /*
29249d6048SJerome Glisse  * Authors:
30249d6048SJerome Glisse  * Thomas Hellstrom <thomas-at-tungstengraphics-dot-com>
31249d6048SJerome Glisse  */
32249d6048SJerome Glisse 
33249d6048SJerome Glisse #ifndef _DRM_MM_H_
34249d6048SJerome Glisse #define _DRM_MM_H_
35249d6048SJerome Glisse 
36249d6048SJerome Glisse /*
37249d6048SJerome Glisse  * Generic range manager structs
38249d6048SJerome Glisse  */
39249d6048SJerome Glisse #include <linux/list.h>
40249d6048SJerome Glisse 
41249d6048SJerome Glisse struct drm_mm_node {
42249d6048SJerome Glisse 	struct list_head fl_entry;
43249d6048SJerome Glisse 	struct list_head ml_entry;
44249d6048SJerome Glisse 	int free;
45249d6048SJerome Glisse 	unsigned long start;
46249d6048SJerome Glisse 	unsigned long size;
47249d6048SJerome Glisse 	struct drm_mm *mm;
48249d6048SJerome Glisse 	void *private;
49249d6048SJerome Glisse };
50249d6048SJerome Glisse 
51249d6048SJerome Glisse struct drm_mm {
52249d6048SJerome Glisse 	struct list_head fl_entry;
53249d6048SJerome Glisse 	struct list_head ml_entry;
54249d6048SJerome Glisse 	struct list_head unused_nodes;
55249d6048SJerome Glisse 	int num_unused;
56249d6048SJerome Glisse 	spinlock_t unused_lock;
57249d6048SJerome Glisse };
58249d6048SJerome Glisse 
59249d6048SJerome Glisse /*
60249d6048SJerome Glisse  * Basic range manager support (drm_mm.c)
61249d6048SJerome Glisse  */
6289579f77SThomas Hellstrom extern struct drm_mm_node *drm_mm_get_block_generic(struct drm_mm_node *node,
63249d6048SJerome Glisse 						    unsigned long size,
6489579f77SThomas Hellstrom 						    unsigned alignment,
6589579f77SThomas Hellstrom 						    int atomic);
6689579f77SThomas Hellstrom static inline struct drm_mm_node *drm_mm_get_block(struct drm_mm_node *parent,
67249d6048SJerome Glisse 						   unsigned long size,
6889579f77SThomas Hellstrom 						   unsigned alignment)
6989579f77SThomas Hellstrom {
7089579f77SThomas Hellstrom 	return drm_mm_get_block_generic(parent, size, alignment, 0);
7189579f77SThomas Hellstrom }
7289579f77SThomas Hellstrom static inline struct drm_mm_node *drm_mm_get_block_atomic(struct drm_mm_node *parent,
7389579f77SThomas Hellstrom 							  unsigned long size,
7489579f77SThomas Hellstrom 							  unsigned alignment)
7589579f77SThomas Hellstrom {
7689579f77SThomas Hellstrom 	return drm_mm_get_block_generic(parent, size, alignment, 1);
7789579f77SThomas Hellstrom }
78249d6048SJerome Glisse extern void drm_mm_put_block(struct drm_mm_node *cur);
79249d6048SJerome Glisse extern struct drm_mm_node *drm_mm_search_free(const struct drm_mm *mm,
80249d6048SJerome Glisse 					      unsigned long size,
81249d6048SJerome Glisse 					      unsigned alignment,
82249d6048SJerome Glisse 					      int best_match);
83249d6048SJerome Glisse extern int drm_mm_init(struct drm_mm *mm, unsigned long start,
84249d6048SJerome Glisse 		       unsigned long size);
85249d6048SJerome Glisse extern void drm_mm_takedown(struct drm_mm *mm);
86249d6048SJerome Glisse extern int drm_mm_clean(struct drm_mm *mm);
87249d6048SJerome Glisse extern unsigned long drm_mm_tail_space(struct drm_mm *mm);
88249d6048SJerome Glisse extern int drm_mm_remove_space_from_tail(struct drm_mm *mm,
89249d6048SJerome Glisse 					 unsigned long size);
90249d6048SJerome Glisse extern int drm_mm_add_space_to_tail(struct drm_mm *mm,
91249d6048SJerome Glisse 				    unsigned long size, int atomic);
92249d6048SJerome Glisse extern int drm_mm_pre_get(struct drm_mm *mm);
93249d6048SJerome Glisse 
94249d6048SJerome Glisse static inline struct drm_mm *drm_get_mm(struct drm_mm_node *block)
95249d6048SJerome Glisse {
96249d6048SJerome Glisse 	return block->mm;
97249d6048SJerome Glisse }
98249d6048SJerome Glisse 
99fa8a1238SDave Airlie #ifdef CONFIG_DEBUG_FS
100fa8a1238SDave Airlie int drm_mm_dump_table(struct seq_file *m, struct drm_mm *mm);
101fa8a1238SDave Airlie #endif
102fa8a1238SDave Airlie 
103249d6048SJerome Glisse #endif
104