diff options
Diffstat (limited to 'drivers/char/drm/via_mm.c')
-rw-r--r-- | drivers/char/drm/via_mm.c | 194 |
1 files changed, 0 insertions, 194 deletions
diff --git a/drivers/char/drm/via_mm.c b/drivers/char/drm/via_mm.c deleted file mode 100644 index e64094916e4f..000000000000 --- a/drivers/char/drm/via_mm.c +++ /dev/null | |||
@@ -1,194 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright 2006 Tungsten Graphics Inc., Bismarck, ND., USA. | ||
3 | * All rights reserved. | ||
4 | * | ||
5 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
6 | * copy of this software and associated documentation files (the "Software"), | ||
7 | * to deal in the Software without restriction, including without limitation | ||
8 | * the rights to use, copy, modify, merge, publish, distribute, sub license, | ||
9 | * and/or sell copies of the Software, and to permit persons to whom the | ||
10 | * Software is furnished to do so, subject to the following conditions: | ||
11 | * | ||
12 | * The above copyright notice and this permission notice (including the | ||
13 | * next paragraph) shall be included in all copies or substantial portions | ||
14 | * of the Software. | ||
15 | * | ||
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL | ||
19 | * THE AUTHORS OR COPYRIGHT HOLDERS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, | ||
20 | * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
21 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | ||
22 | * DEALINGS IN THE SOFTWARE. | ||
23 | */ | ||
24 | /* | ||
25 | * Authors: Thomas Hellström <thomas-at-tungstengraphics-dot-com> | ||
26 | */ | ||
27 | |||
28 | #include "drmP.h" | ||
29 | #include "via_drm.h" | ||
30 | #include "via_drv.h" | ||
31 | #include "drm_sman.h" | ||
32 | |||
33 | #define VIA_MM_ALIGN_SHIFT 4 | ||
34 | #define VIA_MM_ALIGN_MASK ( (1 << VIA_MM_ALIGN_SHIFT) - 1) | ||
35 | |||
36 | int via_agp_init(struct drm_device *dev, void *data, struct drm_file *file_priv) | ||
37 | { | ||
38 | drm_via_agp_t *agp = data; | ||
39 | drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private; | ||
40 | int ret; | ||
41 | |||
42 | mutex_lock(&dev->struct_mutex); | ||
43 | ret = drm_sman_set_range(&dev_priv->sman, VIA_MEM_AGP, 0, | ||
44 | agp->size >> VIA_MM_ALIGN_SHIFT); | ||
45 | |||
46 | if (ret) { | ||
47 | DRM_ERROR("AGP memory manager initialisation error\n"); | ||
48 | mutex_unlock(&dev->struct_mutex); | ||
49 | return ret; | ||
50 | } | ||
51 | |||
52 | dev_priv->agp_initialized = 1; | ||
53 | dev_priv->agp_offset = agp->offset; | ||
54 | mutex_unlock(&dev->struct_mutex); | ||
55 | |||
56 | DRM_DEBUG("offset = %u, size = %u\n", agp->offset, agp->size); | ||
57 | return 0; | ||
58 | } | ||
59 | |||
60 | int via_fb_init(struct drm_device *dev, void *data, struct drm_file *file_priv) | ||
61 | { | ||
62 | drm_via_fb_t *fb = data; | ||
63 | drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private; | ||
64 | int ret; | ||
65 | |||
66 | mutex_lock(&dev->struct_mutex); | ||
67 | ret = drm_sman_set_range(&dev_priv->sman, VIA_MEM_VIDEO, 0, | ||
68 | fb->size >> VIA_MM_ALIGN_SHIFT); | ||
69 | |||
70 | if (ret) { | ||
71 | DRM_ERROR("VRAM memory manager initialisation error\n"); | ||
72 | mutex_unlock(&dev->struct_mutex); | ||
73 | return ret; | ||
74 | } | ||
75 | |||
76 | dev_priv->vram_initialized = 1; | ||
77 | dev_priv->vram_offset = fb->offset; | ||
78 | |||
79 | mutex_unlock(&dev->struct_mutex); | ||
80 | DRM_DEBUG("offset = %u, size = %u\n", fb->offset, fb->size); | ||
81 | |||
82 | return 0; | ||
83 | |||
84 | } | ||
85 | |||
86 | int via_final_context(struct drm_device *dev, int context) | ||
87 | { | ||
88 | drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private; | ||
89 | |||
90 | via_release_futex(dev_priv, context); | ||
91 | |||
92 | /* Linux specific until context tracking code gets ported to BSD */ | ||
93 | /* Last context, perform cleanup */ | ||
94 | if (dev->ctx_count == 1 && dev->dev_private) { | ||
95 | DRM_DEBUG("Last Context\n"); | ||
96 | if (dev->irq) | ||
97 | drm_irq_uninstall(dev); | ||
98 | via_cleanup_futex(dev_priv); | ||
99 | via_do_cleanup_map(dev); | ||
100 | } | ||
101 | return 1; | ||
102 | } | ||
103 | |||
104 | void via_lastclose(struct drm_device *dev) | ||
105 | { | ||
106 | drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private; | ||
107 | |||
108 | if (!dev_priv) | ||
109 | return; | ||
110 | |||
111 | mutex_lock(&dev->struct_mutex); | ||
112 | drm_sman_cleanup(&dev_priv->sman); | ||
113 | dev_priv->vram_initialized = 0; | ||
114 | dev_priv->agp_initialized = 0; | ||
115 | mutex_unlock(&dev->struct_mutex); | ||
116 | } | ||
117 | |||
118 | int via_mem_alloc(struct drm_device *dev, void *data, | ||
119 | struct drm_file *file_priv) | ||
120 | { | ||
121 | drm_via_mem_t *mem = data; | ||
122 | int retval = 0; | ||
123 | struct drm_memblock_item *item; | ||
124 | drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private; | ||
125 | unsigned long tmpSize; | ||
126 | |||
127 | if (mem->type > VIA_MEM_AGP) { | ||
128 | DRM_ERROR("Unknown memory type allocation\n"); | ||
129 | return -EINVAL; | ||
130 | } | ||
131 | mutex_lock(&dev->struct_mutex); | ||
132 | if (0 == ((mem->type == VIA_MEM_VIDEO) ? dev_priv->vram_initialized : | ||
133 | dev_priv->agp_initialized)) { | ||
134 | DRM_ERROR | ||
135 | ("Attempt to allocate from uninitialized memory manager.\n"); | ||
136 | mutex_unlock(&dev->struct_mutex); | ||
137 | return -EINVAL; | ||
138 | } | ||
139 | |||
140 | tmpSize = (mem->size + VIA_MM_ALIGN_MASK) >> VIA_MM_ALIGN_SHIFT; | ||
141 | item = drm_sman_alloc(&dev_priv->sman, mem->type, tmpSize, 0, | ||
142 | (unsigned long)file_priv); | ||
143 | mutex_unlock(&dev->struct_mutex); | ||
144 | if (item) { | ||
145 | mem->offset = ((mem->type == VIA_MEM_VIDEO) ? | ||
146 | dev_priv->vram_offset : dev_priv->agp_offset) + | ||
147 | (item->mm-> | ||
148 | offset(item->mm, item->mm_info) << VIA_MM_ALIGN_SHIFT); | ||
149 | mem->index = item->user_hash.key; | ||
150 | } else { | ||
151 | mem->offset = 0; | ||
152 | mem->size = 0; | ||
153 | mem->index = 0; | ||
154 | DRM_DEBUG("Video memory allocation failed\n"); | ||
155 | retval = -ENOMEM; | ||
156 | } | ||
157 | |||
158 | return retval; | ||
159 | } | ||
160 | |||
161 | int via_mem_free(struct drm_device *dev, void *data, struct drm_file *file_priv) | ||
162 | { | ||
163 | drm_via_private_t *dev_priv = dev->dev_private; | ||
164 | drm_via_mem_t *mem = data; | ||
165 | int ret; | ||
166 | |||
167 | mutex_lock(&dev->struct_mutex); | ||
168 | ret = drm_sman_free_key(&dev_priv->sman, mem->index); | ||
169 | mutex_unlock(&dev->struct_mutex); | ||
170 | DRM_DEBUG("free = 0x%lx\n", mem->index); | ||
171 | |||
172 | return ret; | ||
173 | } | ||
174 | |||
175 | |||
176 | void via_reclaim_buffers_locked(struct drm_device * dev, | ||
177 | struct drm_file *file_priv) | ||
178 | { | ||
179 | drm_via_private_t *dev_priv = dev->dev_private; | ||
180 | |||
181 | mutex_lock(&dev->struct_mutex); | ||
182 | if (drm_sman_owner_clean(&dev_priv->sman, (unsigned long)file_priv)) { | ||
183 | mutex_unlock(&dev->struct_mutex); | ||
184 | return; | ||
185 | } | ||
186 | |||
187 | if (dev->driver->dma_quiescent) { | ||
188 | dev->driver->dma_quiescent(dev); | ||
189 | } | ||
190 | |||
191 | drm_sman_owner_cleanup(&dev_priv->sman, (unsigned long)file_priv); | ||
192 | mutex_unlock(&dev->struct_mutex); | ||
193 | return; | ||
194 | } | ||