2 * Copyright 2007 Jérôme Glisse
3 * Copyright 2007 Alex Deucher
4 * Copyright 2007 Dave Airlie
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice (including the next
15 * paragraph) shall be included in all copies or substantial portions of the
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 NONINFRINGEMENT. IN NO EVENT SHALL
21 * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
22 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
23 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
24 * DEALINGS IN THE SOFTWARE.
28 * Jerome Glisse <glisse@freedesktop.org>
30 #include "drm_pciids.h"
31 #include "radeon_ms.h"
32 #include "amd_legacy_fence.h"
35 static uint32_t radeon_ms_mem_prios[] = {
41 static uint32_t radeon_ms_busy_prios[] = {
47 struct drm_bo_driver radeon_ms_bo_driver = {
48 .mem_type_prio = radeon_ms_mem_prios,
49 .mem_busy_prio = radeon_ms_busy_prios,
50 .num_mem_type_prio = sizeof(radeon_ms_mem_prios)/sizeof(uint32_t),
51 .num_mem_busy_prio = sizeof(radeon_ms_busy_prios)/sizeof(uint32_t),
52 .create_ttm_backend_entry = radeon_ms_create_ttm_backend,
53 .fence_type = r3xx_fence_types,
54 .invalidate_caches = radeon_ms_invalidate_caches,
55 .init_mem_type = radeon_ms_init_mem_type,
56 .evict_flags = radeon_ms_evict_flags,
57 .move = radeon_ms_bo_move,
58 .ttm_cache_flush = radeon_ms_ttm_flush,
61 struct drm_ioctl_desc radeon_ms_ioctls[] = {
62 DRM_IOCTL_DEF(DRM_AMD_CMD, amd_ioctl_cmd, DRM_AUTH),
63 DRM_IOCTL_DEF(DRM_AMD_RESETCP, radeon_ms_resetcp, DRM_AUTH),
65 int radeon_ms_num_ioctls = DRM_ARRAY_SIZE(radeon_ms_ioctls);
67 int radeon_ms_driver_dma_ioctl(struct drm_device *dev, void *data,
68 struct drm_file *file_priv)
70 struct drm_device_dma *dma = dev->dma;
71 struct drm_dma *d = data;
73 LOCK_TEST_WITH_RETURN(dev, file_priv);
75 /* Please don't send us buffers.
77 if (d->send_count != 0) {
78 DRM_ERROR("Process %d trying to send %d buffers via drmDMA\n",
79 DRM_CURRENTPID, d->send_count);
83 /* Don't ask us buffer neither :)
85 DRM_ERROR("Process %d trying to get %d buffers (of %d max)\n",
86 DRM_CURRENTPID, d->request_count, dma->buf_count);
90 void radeon_ms_driver_lastclose(struct drm_device * dev)
94 int radeon_ms_driver_load(struct drm_device *dev, unsigned long flags)
96 struct drm_radeon_private *dev_priv;
99 DRM_INFO("[radeon_ms] loading\n");
100 /* allocate and clear device private structure */
101 dev_priv = drm_alloc(sizeof(struct drm_radeon_private), DRM_MEM_DRIVER);
102 if (dev_priv == NULL)
104 memset(dev_priv, 0, sizeof(struct drm_radeon_private));
105 dev->dev_private = (void *)dev_priv;
107 /* initialize modesetting structure (must be done here) */
108 drm_mode_config_init(dev);
110 /* flags correspond to chipset family */
111 dev_priv->usec_timeout = 100;
112 dev_priv->family = flags & 0xffffU;
113 dev_priv->bus_type = flags & 0xff0000U;
114 /* initialize family functions */
115 ret = radeon_ms_family_init(dev);
117 radeon_ms_driver_unload(dev);
121 dev_priv->fence = drm_alloc(sizeof(struct legacy_fence), DRM_MEM_DRIVER);
122 if (dev_priv->fence == NULL) {
123 radeon_ms_driver_unload(dev);
126 memset(dev_priv->fence, 0, sizeof(struct legacy_fence));
128 /* we don't want userspace to be able to map this so don't use
130 dev_priv->mmio.offset = drm_get_resource_start(dev, 2);
131 dev_priv->mmio.size = drm_get_resource_len(dev, 2);
132 dev_priv->mmio.type = _DRM_REGISTERS;
133 dev_priv->mmio.flags = _DRM_RESTRICTED;
134 drm_core_ioremap(&dev_priv->mmio, dev);
135 /* map vram FIXME: IGP likely don't have any of this */
136 dev_priv->vram.offset = drm_get_resource_start(dev, 0);
137 dev_priv->vram.size = drm_get_resource_len(dev, 0);
138 dev_priv->vram.type = _DRM_FRAME_BUFFER;
139 dev_priv->vram.flags = _DRM_RESTRICTED;
140 drm_core_ioremap(&dev_priv->vram, dev);
142 /* save radeon initial state which will be restored upon module
144 radeon_ms_state_save(dev, &dev_priv->load_state);
145 dev_priv->restore_state = 1;
146 memcpy(&dev_priv->driver_state, &dev_priv->load_state,
147 sizeof(struct radeon_state));
150 ret = radeon_ms_irq_init(dev);
152 radeon_ms_driver_unload(dev);
157 dev_priv->fence_id_last = 1;
158 dev_priv->fence_reg = SCRATCH_REG2;
159 ret = drm_bo_driver_init(dev);
161 DRM_INFO("[radeon_ms] failed to init bo driver %d.\n", ret);
162 radeon_ms_driver_unload(dev);
165 DRM_INFO("[radeon_ms] bo driver succesfull %d.\n", dev->bm.initialized);
166 /* initialize vram */
167 ret = drm_bo_init_mm(dev, DRM_BO_MEM_VRAM, 0, dev_priv->vram.size, 1);
169 radeon_ms_driver_unload(dev);
173 /* initialize gpu address space (only after) VRAM initialization */
174 ret = radeon_ms_gpu_initialize(dev);
176 radeon_ms_driver_unload(dev);
179 radeon_ms_gpu_restore(dev, &dev_priv->driver_state);
182 ret = drm_bo_init_mm(dev, DRM_BO_MEM_TT, 0,
183 dev_priv->gpu_gart_size / RADEON_PAGE_SIZE, 1);
185 radeon_ms_driver_unload(dev);
189 /* initialize ring buffer */
190 /* set ring size to 4Mo FIXME: should make a parameter for this */
191 dev_priv->write_back_area_size = 4 * 1024;
192 dev_priv->ring_buffer_size = 4 * 1024 * 1024;
193 ret = radeon_ms_cp_init(dev);
195 radeon_ms_driver_unload(dev);
199 /* initialize modesetting */
200 dev->mode_config.min_width = 0;
201 dev->mode_config.min_height = 0;
202 dev->mode_config.max_width = 4096;
203 dev->mode_config.max_height = 4096;
204 dev->mode_config.fb_base = dev_priv->vram.offset;
205 ret = radeon_ms_crtc_create(dev, 1);
207 radeon_ms_driver_unload(dev);
210 ret = radeon_ms_outputs_from_rom(dev);
212 radeon_ms_driver_unload(dev);
215 ret = radeon_ms_outputs_from_properties(dev);
217 radeon_ms_driver_unload(dev);
219 } else if (ret == 0) {
220 DRM_INFO("[radeon_ms] no outputs !\n");
223 DRM_INFO("[radeon_ms] added %d outputs from rom.\n", ret);
225 ret = radeon_ms_connectors_from_rom(dev);
227 radeon_ms_driver_unload(dev);
230 ret = radeon_ms_connectors_from_properties(dev);
232 radeon_ms_driver_unload(dev);
235 DRM_INFO("[radeon_ms] no connectors !\n");
238 DRM_INFO("[radeon_ms] added %d connectors from rom.\n", ret);
240 radeon_ms_outputs_save(dev, &dev_priv->load_state);
241 drm_initial_config(dev, false);
243 ret = drm_irq_install(dev);
245 radeon_ms_driver_unload(dev);
249 /* initialze driver specific */
250 ret = amd_legacy_cmd_module_initialize(dev);
252 radeon_ms_driver_unload(dev);
256 if (dev->primary && dev->control) {
257 DRM_INFO("[radeon_ms] control 0x%lx, render 0x%lx\n",
258 (long)dev->primary->device, (long)dev->control->device);
260 DRM_INFO("[radeon_ms] error control 0x%lx, render 0x%lx\n",
261 (long)dev->primary, (long)dev->control);
263 DRM_INFO("[radeon_ms] successfull initialization\n");
267 int radeon_ms_driver_open(struct drm_device * dev, struct drm_file *file_priv)
273 int radeon_ms_driver_unload(struct drm_device *dev)
275 struct drm_radeon_private *dev_priv = dev->dev_private;
277 if (dev_priv == NULL) {
281 /* cleanup modesetting */
282 drm_mode_config_cleanup(dev);
283 DRM_INFO("[radeon_ms] modesetting clean\n");
284 radeon_ms_outputs_restore(dev, &dev_priv->load_state);
285 radeon_ms_connectors_destroy(dev);
286 radeon_ms_outputs_destroy(dev);
288 /* shutdown specific driver */
289 amd_legacy_cmd_module_destroy(dev);
291 /* shutdown cp engine */
292 radeon_ms_cp_finish(dev);
293 DRM_INFO("[radeon_ms] cp clean\n");
295 drm_irq_uninstall(dev);
296 DRM_INFO("[radeon_ms] irq uninstalled\n");
298 DRM_INFO("[radeon_ms] unloading\n");
299 /* clean ttm memory manager */
300 mutex_lock(&dev->struct_mutex);
301 if (drm_bo_clean_mm(dev, DRM_BO_MEM_TT, 1)) {
302 DRM_ERROR("TT memory manager not clean. Delaying takedown\n");
304 mutex_unlock(&dev->struct_mutex);
305 DRM_INFO("[radeon_ms] TT memory clean\n");
307 if (dev_priv->bus_finish) {
308 dev_priv->bus_finish(dev);
310 DRM_INFO("[radeon_ms] bus down\n");
311 /* clean vram memory manager */
312 mutex_lock(&dev->struct_mutex);
313 if (drm_bo_clean_mm(dev, DRM_BO_MEM_VRAM, 1)) {
314 DRM_ERROR("VRAM memory manager not clean. Delaying takedown\n");
316 mutex_unlock(&dev->struct_mutex);
317 DRM_INFO("[radeon_ms] VRAM memory clean\n");
318 /* clean memory manager */
319 drm_bo_driver_finish(dev);
320 DRM_INFO("[radeon_ms] memory manager clean\n");
321 /* restore card state */
322 if (dev_priv->restore_state) {
323 radeon_ms_state_restore(dev, &dev_priv->load_state);
325 DRM_INFO("[radeon_ms] state restored\n");
326 if (dev_priv->mmio.handle) {
327 drm_core_ioremapfree(&dev_priv->mmio, dev);
329 if (dev_priv->vram.handle) {
330 drm_core_ioremapfree(&dev_priv->vram, dev);
332 DRM_INFO("[radeon_ms] map released\n");
333 drm_free(dev_priv->fence, sizeof(struct legacy_fence), DRM_MEM_DRIVER);
334 drm_free(dev_priv, sizeof(*dev_priv), DRM_MEM_DRIVER);
335 dev->dev_private = NULL;
338 DRM_INFO("[radeon_ms] that's all the folks\n");