1203287Srnoland/**************************************************************************
2203287Srnoland *
3203287Srnoland * Copyright 2006-2008 Tungsten Graphics, Inc., Cedar Park, TX. USA.
4203287Srnoland * All Rights Reserved.
5203287Srnoland *
6203287Srnoland * Permission is hereby granted, free of charge, to any person obtaining a
7203287Srnoland * copy of this software and associated documentation files (the
8203287Srnoland * "Software"), to deal in the Software without restriction, including
9203287Srnoland * without limitation the rights to use, copy, modify, merge, publish,
10203287Srnoland * distribute, sub license, and/or sell copies of the Software, and to
11203287Srnoland * permit persons to whom the Software is furnished to do so, subject to
12203287Srnoland * the following conditions:
13203287Srnoland *
14203287Srnoland * The above copyright notice and this permission notice (including the
15203287Srnoland * next paragraph) shall be included in all copies or substantial portions
16203287Srnoland * of the Software.
17203287Srnoland *
18203287Srnoland * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19203287Srnoland * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20203287Srnoland * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
21203287Srnoland * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
22203287Srnoland * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
23203287Srnoland * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
24203287Srnoland * USE OR OTHER DEALINGS IN THE SOFTWARE.
25203287Srnoland *
26203287Srnoland *
27203287Srnoland **************************************************************************/
28203287Srnoland
29203287Srnoland#include <sys/cdefs.h>
30203287Srnoland__FBSDID("$FreeBSD$");
31203287Srnoland
32203287Srnoland/*
33203287Srnoland * Authors:
34203287Srnoland * Thomas Hellstrom <thomas-at-tungstengraphics-dot-com>
35203287Srnoland */
36203287Srnoland
37203287Srnoland#ifndef _DRM_MM_H_
38203287Srnoland#define _DRM_MM_H_
39203287Srnoland
40203287Srnoland#include "dev/drm/drm_linux_list.h"
41203287Srnoland
42203287Srnolandstruct drm_mm_node {
43203287Srnoland	struct list_head fl_entry;
44203287Srnoland	struct list_head ml_entry;
45203287Srnoland	int free;
46203287Srnoland	unsigned long start;
47203287Srnoland	unsigned long size;
48203287Srnoland	struct drm_mm *mm;
49203287Srnoland	void *private;
50203287Srnoland};
51203287Srnoland
52203287Srnolandstruct drm_mm {
53203287Srnoland	struct list_head fl_entry;
54203287Srnoland	struct list_head ml_entry;
55203287Srnoland	struct list_head unused_nodes;
56203287Srnoland	int num_unused;
57203287Srnoland	struct mtx unused_lock;
58203287Srnoland};
59203287Srnoland
60203287Srnoland/*
61203287Srnoland * Basic range manager support (drm_mm.c)
62203287Srnoland */
63203287Srnolandextern struct drm_mm_node *drm_mm_get_block_generic(struct drm_mm_node *node,
64203287Srnoland						    unsigned long size,
65203287Srnoland						    unsigned alignment,
66203287Srnoland						    int atomic);
67203287Srnolandstatic inline struct drm_mm_node *drm_mm_get_block(struct drm_mm_node *parent,
68203287Srnoland						   unsigned long size,
69203287Srnoland						   unsigned alignment)
70203287Srnoland{
71203287Srnoland	return drm_mm_get_block_generic(parent, size, alignment, 0);
72203287Srnoland}
73203287Srnolandstatic inline struct drm_mm_node *drm_mm_get_block_atomic(struct drm_mm_node *parent,
74203287Srnoland							  unsigned long size,
75203287Srnoland							  unsigned alignment)
76203287Srnoland{
77203287Srnoland	return drm_mm_get_block_generic(parent, size, alignment, 1);
78203287Srnoland}
79203287Srnolandextern void drm_mm_put_block(struct drm_mm_node *cur);
80203287Srnolandextern struct drm_mm_node *drm_mm_search_free(const struct drm_mm *mm,
81203287Srnoland					      unsigned long size,
82203287Srnoland					      unsigned alignment,
83203287Srnoland					      int best_match);
84203287Srnolandextern int drm_mm_init(struct drm_mm *mm, unsigned long start,
85203287Srnoland		       unsigned long size);
86203287Srnolandextern void drm_mm_takedown(struct drm_mm *mm);
87203287Srnolandextern int drm_mm_clean(struct drm_mm *mm);
88203287Srnolandextern unsigned long drm_mm_tail_space(struct drm_mm *mm);
89203287Srnolandextern int drm_mm_remove_space_from_tail(struct drm_mm *mm,
90203287Srnoland					 unsigned long size);
91203287Srnolandextern int drm_mm_add_space_to_tail(struct drm_mm *mm,
92203287Srnoland				    unsigned long size, int atomic);
93203287Srnolandextern int drm_mm_pre_get(struct drm_mm *mm);
94203287Srnoland
95203287Srnolandstatic inline struct drm_mm *drm_get_mm(struct drm_mm_node *block)
96203287Srnoland{
97203287Srnoland	return block->mm;
98203287Srnoland}
99203287Srnoland
100203287Srnoland#endif
101