aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorJerome Glisse <glisse@freedesktop.org>2009-04-08 11:11:16 -0400
committerDave Airlie <airlied@redhat.com>2009-06-12 01:56:31 -0400
commit249d6048ca98b5452105b0824abac1275661b8e3 (patch)
tree5e8e89288ec6f6a278fcb819ea49d0d9984576fd /include
parent715cbb05c935e8a4306a730d14a72d5af881523e (diff)
drm: Split out the mm declarations in a separate header. Add atomic operations.
this is a TTM preparation patch, it rearranges the mm and add operations needed to do mm operations in atomic context. Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'include')
-rw-r--r--include/drm/drmP.h37
-rw-r--r--include/drm/drm_mm.h90
2 files changed, 91 insertions, 36 deletions
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index 1cc51a0812fe..d4ddc22e46bb 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -86,6 +86,7 @@ struct drm_device;
86 86
87#include "drm_os_linux.h" 87#include "drm_os_linux.h"
88#include "drm_hashtab.h" 88#include "drm_hashtab.h"
89#include "drm_mm.h"
89 90
90#define DRM_UT_CORE 0x01 91#define DRM_UT_CORE 0x01
91#define DRM_UT_DRIVER 0x02 92#define DRM_UT_DRIVER 0x02
@@ -553,26 +554,6 @@ struct drm_sigdata {
553}; 554};
554 555
555 556
556/*
557 * Generic memory manager structs
558 */
559
560struct drm_mm_node {
561 struct list_head fl_entry;
562 struct list_head ml_entry;
563 int free;
564 unsigned long start;
565 unsigned long size;
566 struct drm_mm *mm;
567 void *private;
568};
569
570struct drm_mm {
571 struct list_head fl_entry;
572 struct list_head ml_entry;
573};
574
575
576/** 557/**
577 * Kernel side of a mapping 558 * Kernel side of a mapping
578 */ 559 */
@@ -1436,22 +1417,6 @@ extern char *drm_get_connector_status_name(enum drm_connector_status status);
1436extern int drm_sysfs_connector_add(struct drm_connector *connector); 1417extern int drm_sysfs_connector_add(struct drm_connector *connector);
1437extern void drm_sysfs_connector_remove(struct drm_connector *connector); 1418extern void drm_sysfs_connector_remove(struct drm_connector *connector);
1438 1419
1439/*
1440 * Basic memory manager support (drm_mm.c)
1441 */
1442extern struct drm_mm_node *drm_mm_get_block(struct drm_mm_node * parent,
1443 unsigned long size,
1444 unsigned alignment);
1445extern void drm_mm_put_block(struct drm_mm_node * cur);
1446extern struct drm_mm_node *drm_mm_search_free(const struct drm_mm *mm, unsigned long size,
1447 unsigned alignment, int best_match);
1448extern int drm_mm_init(struct drm_mm *mm, unsigned long start, unsigned long size);
1449extern void drm_mm_takedown(struct drm_mm *mm);
1450extern int drm_mm_clean(struct drm_mm *mm);
1451extern unsigned long drm_mm_tail_space(struct drm_mm *mm);
1452extern int drm_mm_remove_space_from_tail(struct drm_mm *mm, unsigned long size);
1453extern int drm_mm_add_space_to_tail(struct drm_mm *mm, unsigned long size);
1454
1455/* Graphics Execution Manager library functions (drm_gem.c) */ 1420/* Graphics Execution Manager library functions (drm_gem.c) */
1456int drm_gem_init(struct drm_device *dev); 1421int drm_gem_init(struct drm_device *dev);
1457void drm_gem_destroy(struct drm_device *dev); 1422void drm_gem_destroy(struct drm_device *dev);
diff --git a/include/drm/drm_mm.h b/include/drm/drm_mm.h
new file mode 100644
index 000000000000..5662f4278ef3
--- /dev/null
+++ b/include/drm/drm_mm.h
@@ -0,0 +1,90 @@
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
41struct drm_mm_node {
42 struct list_head fl_entry;
43 struct list_head ml_entry;
44 int free;
45 unsigned long start;
46 unsigned long size;
47 struct drm_mm *mm;
48 void *private;
49};
50
51struct drm_mm {
52 struct list_head fl_entry;
53 struct list_head ml_entry;
54 struct list_head unused_nodes;
55 int num_unused;
56 spinlock_t unused_lock;
57};
58
59/*
60 * Basic range manager support (drm_mm.c)
61 */
62
63extern struct drm_mm_node *drm_mm_get_block(struct drm_mm_node *parent,
64 unsigned long size,
65 unsigned alignment);
66extern struct drm_mm_node *drm_mm_get_block_atomic(struct drm_mm_node *parent,
67 unsigned long size,
68 unsigned alignment);
69extern void drm_mm_put_block(struct drm_mm_node *cur);
70extern struct drm_mm_node *drm_mm_search_free(const struct drm_mm *mm,
71 unsigned long size,
72 unsigned alignment,
73 int best_match);
74extern int drm_mm_init(struct drm_mm *mm, unsigned long start,
75 unsigned long size);
76extern void drm_mm_takedown(struct drm_mm *mm);
77extern int drm_mm_clean(struct drm_mm *mm);
78extern unsigned long drm_mm_tail_space(struct drm_mm *mm);
79extern int drm_mm_remove_space_from_tail(struct drm_mm *mm,
80 unsigned long size);
81extern int drm_mm_add_space_to_tail(struct drm_mm *mm,
82 unsigned long size, int atomic);
83extern int drm_mm_pre_get(struct drm_mm *mm);
84
85static inline struct drm_mm *drm_get_mm(struct drm_mm_node *block)
86{
87 return block->mm;
88}
89
90#endif