blob: 6bd15254f643b3a23cea263b4f04ed862d95c7f4 [file] [log] [blame]
Daniel Vetter0a10c852010-03-11 21:19:14 +00001/*
2 * Copyright 2008 Advanced Micro Devices, Inc.
3 * Copyright 2008 Red Hat Inc.
4 * Copyright 2009 Jerome Glisse.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions 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 NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
20 * 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
22 * OTHER DEALINGS IN THE SOFTWARE.
23 *
24 * Authors: Dave Airlie
25 * Alex Deucher
26 * Jerome Glisse
27 */
28
29#include <linux/console.h>
30#include <drm/drmP.h>
31#include <drm/drm_crtc_helper.h>
32#include <drm/radeon_drm.h>
33#include <linux/vgaarb.h>
34#include <linux/vga_switcheroo.h>
35#include "radeon_reg.h"
36#include "radeon.h"
37#include "radeon_asic.h"
38#include "atom.h"
39
40/*
41 * Registers accessors functions.
42 */
43static uint32_t radeon_invalid_rreg(struct radeon_device *rdev, uint32_t reg)
44{
45 DRM_ERROR("Invalid callback to read register 0x%04X\n", reg);
46 BUG_ON(1);
47 return 0;
48}
49
50static void radeon_invalid_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v)
51{
52 DRM_ERROR("Invalid callback to write register 0x%04X with 0x%08X\n",
53 reg, v);
54 BUG_ON(1);
55}
56
57static void radeon_register_accessor_init(struct radeon_device *rdev)
58{
59 rdev->mc_rreg = &radeon_invalid_rreg;
60 rdev->mc_wreg = &radeon_invalid_wreg;
61 rdev->pll_rreg = &radeon_invalid_rreg;
62 rdev->pll_wreg = &radeon_invalid_wreg;
63 rdev->pciep_rreg = &radeon_invalid_rreg;
64 rdev->pciep_wreg = &radeon_invalid_wreg;
65
66 /* Don't change order as we are overridding accessor. */
67 if (rdev->family < CHIP_RV515) {
68 rdev->pcie_reg_mask = 0xff;
69 } else {
70 rdev->pcie_reg_mask = 0x7ff;
71 }
72 /* FIXME: not sure here */
73 if (rdev->family <= CHIP_R580) {
74 rdev->pll_rreg = &r100_pll_rreg;
75 rdev->pll_wreg = &r100_pll_wreg;
76 }
77 if (rdev->family >= CHIP_R420) {
78 rdev->mc_rreg = &r420_mc_rreg;
79 rdev->mc_wreg = &r420_mc_wreg;
80 }
81 if (rdev->family >= CHIP_RV515) {
82 rdev->mc_rreg = &rv515_mc_rreg;
83 rdev->mc_wreg = &rv515_mc_wreg;
84 }
85 if (rdev->family == CHIP_RS400 || rdev->family == CHIP_RS480) {
86 rdev->mc_rreg = &rs400_mc_rreg;
87 rdev->mc_wreg = &rs400_mc_wreg;
88 }
89 if (rdev->family == CHIP_RS690 || rdev->family == CHIP_RS740) {
90 rdev->mc_rreg = &rs690_mc_rreg;
91 rdev->mc_wreg = &rs690_mc_wreg;
92 }
93 if (rdev->family == CHIP_RS600) {
94 rdev->mc_rreg = &rs600_mc_rreg;
95 rdev->mc_wreg = &rs600_mc_wreg;
96 }
Alex Deucherb4df8be2011-04-12 13:40:18 -040097 if (rdev->family >= CHIP_R600) {
Daniel Vetter0a10c852010-03-11 21:19:14 +000098 rdev->pciep_rreg = &r600_pciep_rreg;
99 rdev->pciep_wreg = &r600_pciep_wreg;
100 }
101}
102
103
104/* helper to disable agp */
105void radeon_agp_disable(struct radeon_device *rdev)
106{
107 rdev->flags &= ~RADEON_IS_AGP;
108 if (rdev->family >= CHIP_R600) {
109 DRM_INFO("Forcing AGP to PCIE mode\n");
110 rdev->flags |= RADEON_IS_PCIE;
111 } else if (rdev->family >= CHIP_RV515 ||
112 rdev->family == CHIP_RV380 ||
113 rdev->family == CHIP_RV410 ||
114 rdev->family == CHIP_R423) {
115 DRM_INFO("Forcing AGP to PCIE mode\n");
116 rdev->flags |= RADEON_IS_PCIE;
117 rdev->asic->gart_tlb_flush = &rv370_pcie_gart_tlb_flush;
118 rdev->asic->gart_set_page = &rv370_pcie_gart_set_page;
119 } else {
120 DRM_INFO("Forcing AGP to PCI mode\n");
121 rdev->flags |= RADEON_IS_PCI;
122 rdev->asic->gart_tlb_flush = &r100_pci_gart_tlb_flush;
123 rdev->asic->gart_set_page = &r100_pci_gart_set_page;
124 }
125 rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024;
126}
127
128/*
129 * ASIC
130 */
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000131static struct radeon_asic r100_asic = {
132 .init = &r100_init,
133 .fini = &r100_fini,
134 .suspend = &r100_suspend,
135 .resume = &r100_resume,
136 .vga_set_state = &r100_vga_set_state,
Jerome Glisse225758d2010-03-09 14:45:10 +0000137 .gpu_is_lockup = &r100_gpu_is_lockup,
Jerome Glissea2d07b72010-03-09 14:45:11 +0000138 .asic_reset = &r100_asic_reset,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000139 .gart_tlb_flush = &r100_pci_gart_tlb_flush,
140 .gart_set_page = &r100_pci_gart_set_page,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000141 .ring_start = &r100_ring_start,
142 .ring_test = &r100_ring_test,
Christian König4c87bc22011-10-19 19:02:21 +0200143 .ring = {
144 [RADEON_RING_TYPE_GFX_INDEX] = {
145 .ib_execute = &r100_ring_ib_execute,
146 .emit_fence = &r100_fence_ring_emit,
147 .emit_semaphore = &r100_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +0100148 .cs_parse = &r100_cs_parse,
Christian König4c87bc22011-10-19 19:02:21 +0200149 }
150 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000151 .irq_set = &r100_irq_set,
152 .irq_process = &r100_irq_process,
153 .get_vblank_counter = &r100_get_vblank_counter,
Alex Deucher27cd7762012-02-23 17:53:42 -0500154 .copy = {
155 .blit = &r100_copy_blit,
156 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
157 .dma = NULL,
158 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
159 .copy = &r100_copy_blit,
160 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
161 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000162 .get_engine_clock = &radeon_legacy_get_engine_clock,
163 .set_engine_clock = &radeon_legacy_set_engine_clock,
164 .get_memory_clock = &radeon_legacy_get_memory_clock,
165 .set_memory_clock = NULL,
166 .get_pcie_lanes = NULL,
167 .set_pcie_lanes = NULL,
168 .set_clock_gating = &radeon_legacy_set_clock_gating,
169 .set_surface_reg = r100_set_surface_reg,
170 .clear_surface_reg = r100_clear_surface_reg,
171 .bandwidth_update = &r100_bandwidth_update,
Alex Deucher901ea572012-02-23 17:53:39 -0500172 .hpd = {
173 .init = &r100_hpd_init,
174 .fini = &r100_hpd_fini,
175 .sense = &r100_hpd_sense,
176 .set_polarity = &r100_hpd_set_polarity,
177 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000178 .ioctl_wait_idle = NULL,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400179 .gui_idle = &r100_gui_idle,
Alex Deuchera02fa392012-02-23 17:53:41 -0500180 .pm = {
181 .misc = &r100_pm_misc,
182 .prepare = &r100_pm_prepare,
183 .finish = &r100_pm_finish,
184 .init_profile = &r100_pm_init_profile,
185 .get_dynpm_state = &r100_pm_get_dynpm_state,
186 },
Alex Deucher0f9e0062012-02-23 17:53:40 -0500187 .pflip = {
188 .pre_page_flip = &r100_pre_page_flip,
189 .page_flip = &r100_page_flip,
190 .post_page_flip = &r100_post_page_flip,
191 },
Alex Deucher3ae19b72012-02-23 17:53:37 -0500192 .wait_for_vblank = &r100_wait_for_vblank,
Alex Deucher89e51812012-02-23 17:53:38 -0500193 .mc_wait_for_idle = &r100_mc_wait_for_idle,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000194};
195
196static struct radeon_asic r200_asic = {
197 .init = &r100_init,
198 .fini = &r100_fini,
199 .suspend = &r100_suspend,
200 .resume = &r100_resume,
201 .vga_set_state = &r100_vga_set_state,
Jerome Glisse225758d2010-03-09 14:45:10 +0000202 .gpu_is_lockup = &r100_gpu_is_lockup,
Jerome Glissea2d07b72010-03-09 14:45:11 +0000203 .asic_reset = &r100_asic_reset,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000204 .gart_tlb_flush = &r100_pci_gart_tlb_flush,
205 .gart_set_page = &r100_pci_gart_set_page,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000206 .ring_start = &r100_ring_start,
207 .ring_test = &r100_ring_test,
Christian König4c87bc22011-10-19 19:02:21 +0200208 .ring = {
209 [RADEON_RING_TYPE_GFX_INDEX] = {
210 .ib_execute = &r100_ring_ib_execute,
211 .emit_fence = &r100_fence_ring_emit,
212 .emit_semaphore = &r100_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +0100213 .cs_parse = &r100_cs_parse,
Christian König4c87bc22011-10-19 19:02:21 +0200214 }
215 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000216 .irq_set = &r100_irq_set,
217 .irq_process = &r100_irq_process,
218 .get_vblank_counter = &r100_get_vblank_counter,
Alex Deucher27cd7762012-02-23 17:53:42 -0500219 .copy = {
220 .blit = &r100_copy_blit,
221 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
222 .dma = &r200_copy_dma,
223 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
224 .copy = &r100_copy_blit,
225 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
226 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000227 .get_engine_clock = &radeon_legacy_get_engine_clock,
228 .set_engine_clock = &radeon_legacy_set_engine_clock,
229 .get_memory_clock = &radeon_legacy_get_memory_clock,
230 .set_memory_clock = NULL,
231 .set_pcie_lanes = NULL,
232 .set_clock_gating = &radeon_legacy_set_clock_gating,
233 .set_surface_reg = r100_set_surface_reg,
234 .clear_surface_reg = r100_clear_surface_reg,
235 .bandwidth_update = &r100_bandwidth_update,
Alex Deucher901ea572012-02-23 17:53:39 -0500236 .hpd = {
237 .init = &r100_hpd_init,
238 .fini = &r100_hpd_fini,
239 .sense = &r100_hpd_sense,
240 .set_polarity = &r100_hpd_set_polarity,
241 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000242 .ioctl_wait_idle = NULL,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400243 .gui_idle = &r100_gui_idle,
Alex Deuchera02fa392012-02-23 17:53:41 -0500244 .pm = {
245 .misc = &r100_pm_misc,
246 .prepare = &r100_pm_prepare,
247 .finish = &r100_pm_finish,
248 .init_profile = &r100_pm_init_profile,
249 .get_dynpm_state = &r100_pm_get_dynpm_state,
250 },
Alex Deucher0f9e0062012-02-23 17:53:40 -0500251 .pflip = {
252 .pre_page_flip = &r100_pre_page_flip,
253 .page_flip = &r100_page_flip,
254 .post_page_flip = &r100_post_page_flip,
255 },
Alex Deucher3ae19b72012-02-23 17:53:37 -0500256 .wait_for_vblank = &r100_wait_for_vblank,
Alex Deucher89e51812012-02-23 17:53:38 -0500257 .mc_wait_for_idle = &r100_mc_wait_for_idle,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000258};
259
260static struct radeon_asic r300_asic = {
261 .init = &r300_init,
262 .fini = &r300_fini,
263 .suspend = &r300_suspend,
264 .resume = &r300_resume,
265 .vga_set_state = &r100_vga_set_state,
Jerome Glisse225758d2010-03-09 14:45:10 +0000266 .gpu_is_lockup = &r300_gpu_is_lockup,
Jerome Glissea2d07b72010-03-09 14:45:11 +0000267 .asic_reset = &r300_asic_reset,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000268 .gart_tlb_flush = &r100_pci_gart_tlb_flush,
269 .gart_set_page = &r100_pci_gart_set_page,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000270 .ring_start = &r300_ring_start,
271 .ring_test = &r100_ring_test,
Christian König4c87bc22011-10-19 19:02:21 +0200272 .ring = {
273 [RADEON_RING_TYPE_GFX_INDEX] = {
274 .ib_execute = &r100_ring_ib_execute,
275 .emit_fence = &r300_fence_ring_emit,
276 .emit_semaphore = &r100_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +0100277 .cs_parse = &r300_cs_parse,
Christian König4c87bc22011-10-19 19:02:21 +0200278 }
279 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000280 .irq_set = &r100_irq_set,
281 .irq_process = &r100_irq_process,
282 .get_vblank_counter = &r100_get_vblank_counter,
Alex Deucher27cd7762012-02-23 17:53:42 -0500283 .copy = {
284 .blit = &r100_copy_blit,
285 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
286 .dma = &r200_copy_dma,
287 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
288 .copy = &r100_copy_blit,
289 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
290 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000291 .get_engine_clock = &radeon_legacy_get_engine_clock,
292 .set_engine_clock = &radeon_legacy_set_engine_clock,
293 .get_memory_clock = &radeon_legacy_get_memory_clock,
294 .set_memory_clock = NULL,
295 .get_pcie_lanes = &rv370_get_pcie_lanes,
296 .set_pcie_lanes = &rv370_set_pcie_lanes,
297 .set_clock_gating = &radeon_legacy_set_clock_gating,
298 .set_surface_reg = r100_set_surface_reg,
299 .clear_surface_reg = r100_clear_surface_reg,
300 .bandwidth_update = &r100_bandwidth_update,
Alex Deucher901ea572012-02-23 17:53:39 -0500301 .hpd = {
302 .init = &r100_hpd_init,
303 .fini = &r100_hpd_fini,
304 .sense = &r100_hpd_sense,
305 .set_polarity = &r100_hpd_set_polarity,
306 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000307 .ioctl_wait_idle = NULL,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400308 .gui_idle = &r100_gui_idle,
Alex Deuchera02fa392012-02-23 17:53:41 -0500309 .pm = {
310 .misc = &r100_pm_misc,
311 .prepare = &r100_pm_prepare,
312 .finish = &r100_pm_finish,
313 .init_profile = &r100_pm_init_profile,
314 .get_dynpm_state = &r100_pm_get_dynpm_state,
315 },
Alex Deucher0f9e0062012-02-23 17:53:40 -0500316 .pflip = {
317 .pre_page_flip = &r100_pre_page_flip,
318 .page_flip = &r100_page_flip,
319 .post_page_flip = &r100_post_page_flip,
320 },
Alex Deucher3ae19b72012-02-23 17:53:37 -0500321 .wait_for_vblank = &r100_wait_for_vblank,
Alex Deucher89e51812012-02-23 17:53:38 -0500322 .mc_wait_for_idle = &r300_mc_wait_for_idle,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000323};
324
325static struct radeon_asic r300_asic_pcie = {
326 .init = &r300_init,
327 .fini = &r300_fini,
328 .suspend = &r300_suspend,
329 .resume = &r300_resume,
330 .vga_set_state = &r100_vga_set_state,
Jerome Glisse225758d2010-03-09 14:45:10 +0000331 .gpu_is_lockup = &r300_gpu_is_lockup,
Jerome Glissea2d07b72010-03-09 14:45:11 +0000332 .asic_reset = &r300_asic_reset,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000333 .gart_tlb_flush = &rv370_pcie_gart_tlb_flush,
334 .gart_set_page = &rv370_pcie_gart_set_page,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000335 .ring_start = &r300_ring_start,
336 .ring_test = &r100_ring_test,
Christian König4c87bc22011-10-19 19:02:21 +0200337 .ring = {
338 [RADEON_RING_TYPE_GFX_INDEX] = {
339 .ib_execute = &r100_ring_ib_execute,
340 .emit_fence = &r300_fence_ring_emit,
341 .emit_semaphore = &r100_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +0100342 .cs_parse = &r300_cs_parse,
Christian König4c87bc22011-10-19 19:02:21 +0200343 }
344 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000345 .irq_set = &r100_irq_set,
346 .irq_process = &r100_irq_process,
347 .get_vblank_counter = &r100_get_vblank_counter,
Alex Deucher27cd7762012-02-23 17:53:42 -0500348 .copy = {
349 .blit = &r100_copy_blit,
350 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
351 .dma = &r200_copy_dma,
352 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
353 .copy = &r100_copy_blit,
354 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
355 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000356 .get_engine_clock = &radeon_legacy_get_engine_clock,
357 .set_engine_clock = &radeon_legacy_set_engine_clock,
358 .get_memory_clock = &radeon_legacy_get_memory_clock,
359 .set_memory_clock = NULL,
360 .set_pcie_lanes = &rv370_set_pcie_lanes,
361 .set_clock_gating = &radeon_legacy_set_clock_gating,
362 .set_surface_reg = r100_set_surface_reg,
363 .clear_surface_reg = r100_clear_surface_reg,
364 .bandwidth_update = &r100_bandwidth_update,
Alex Deucher901ea572012-02-23 17:53:39 -0500365 .hpd = {
366 .init = &r100_hpd_init,
367 .fini = &r100_hpd_fini,
368 .sense = &r100_hpd_sense,
369 .set_polarity = &r100_hpd_set_polarity,
370 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000371 .ioctl_wait_idle = NULL,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400372 .gui_idle = &r100_gui_idle,
Alex Deuchera02fa392012-02-23 17:53:41 -0500373 .pm = {
374 .misc = &r100_pm_misc,
375 .prepare = &r100_pm_prepare,
376 .finish = &r100_pm_finish,
377 .init_profile = &r100_pm_init_profile,
378 .get_dynpm_state = &r100_pm_get_dynpm_state,
379 },
Alex Deucher0f9e0062012-02-23 17:53:40 -0500380 .pflip = {
381 .pre_page_flip = &r100_pre_page_flip,
382 .page_flip = &r100_page_flip,
383 .post_page_flip = &r100_post_page_flip,
384 },
Alex Deucher3ae19b72012-02-23 17:53:37 -0500385 .wait_for_vblank = &r100_wait_for_vblank,
Alex Deucher89e51812012-02-23 17:53:38 -0500386 .mc_wait_for_idle = &r300_mc_wait_for_idle,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000387};
388
389static struct radeon_asic r420_asic = {
390 .init = &r420_init,
391 .fini = &r420_fini,
392 .suspend = &r420_suspend,
393 .resume = &r420_resume,
394 .vga_set_state = &r100_vga_set_state,
Jerome Glisse225758d2010-03-09 14:45:10 +0000395 .gpu_is_lockup = &r300_gpu_is_lockup,
Jerome Glissea2d07b72010-03-09 14:45:11 +0000396 .asic_reset = &r300_asic_reset,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000397 .gart_tlb_flush = &rv370_pcie_gart_tlb_flush,
398 .gart_set_page = &rv370_pcie_gart_set_page,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000399 .ring_start = &r300_ring_start,
400 .ring_test = &r100_ring_test,
Christian König4c87bc22011-10-19 19:02:21 +0200401 .ring = {
402 [RADEON_RING_TYPE_GFX_INDEX] = {
403 .ib_execute = &r100_ring_ib_execute,
404 .emit_fence = &r300_fence_ring_emit,
405 .emit_semaphore = &r100_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +0100406 .cs_parse = &r300_cs_parse,
Christian König4c87bc22011-10-19 19:02:21 +0200407 }
408 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000409 .irq_set = &r100_irq_set,
410 .irq_process = &r100_irq_process,
411 .get_vblank_counter = &r100_get_vblank_counter,
Alex Deucher27cd7762012-02-23 17:53:42 -0500412 .copy = {
413 .blit = &r100_copy_blit,
414 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
415 .dma = &r200_copy_dma,
416 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
417 .copy = &r100_copy_blit,
418 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
419 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000420 .get_engine_clock = &radeon_atom_get_engine_clock,
421 .set_engine_clock = &radeon_atom_set_engine_clock,
422 .get_memory_clock = &radeon_atom_get_memory_clock,
423 .set_memory_clock = &radeon_atom_set_memory_clock,
424 .get_pcie_lanes = &rv370_get_pcie_lanes,
425 .set_pcie_lanes = &rv370_set_pcie_lanes,
426 .set_clock_gating = &radeon_atom_set_clock_gating,
427 .set_surface_reg = r100_set_surface_reg,
428 .clear_surface_reg = r100_clear_surface_reg,
429 .bandwidth_update = &r100_bandwidth_update,
Alex Deucher901ea572012-02-23 17:53:39 -0500430 .hpd = {
431 .init = &r100_hpd_init,
432 .fini = &r100_hpd_fini,
433 .sense = &r100_hpd_sense,
434 .set_polarity = &r100_hpd_set_polarity,
435 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000436 .ioctl_wait_idle = NULL,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400437 .gui_idle = &r100_gui_idle,
Alex Deuchera02fa392012-02-23 17:53:41 -0500438 .pm = {
439 .misc = &r100_pm_misc,
440 .prepare = &r100_pm_prepare,
441 .finish = &r100_pm_finish,
442 .init_profile = &r420_pm_init_profile,
443 .get_dynpm_state = &r100_pm_get_dynpm_state,
444 },
Alex Deucher0f9e0062012-02-23 17:53:40 -0500445 .pflip = {
446 .pre_page_flip = &r100_pre_page_flip,
447 .page_flip = &r100_page_flip,
448 .post_page_flip = &r100_post_page_flip,
449 },
Alex Deucher3ae19b72012-02-23 17:53:37 -0500450 .wait_for_vblank = &r100_wait_for_vblank,
Alex Deucher89e51812012-02-23 17:53:38 -0500451 .mc_wait_for_idle = &r300_mc_wait_for_idle,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000452};
453
454static struct radeon_asic rs400_asic = {
455 .init = &rs400_init,
456 .fini = &rs400_fini,
457 .suspend = &rs400_suspend,
458 .resume = &rs400_resume,
459 .vga_set_state = &r100_vga_set_state,
Jerome Glisse225758d2010-03-09 14:45:10 +0000460 .gpu_is_lockup = &r300_gpu_is_lockup,
Jerome Glissea2d07b72010-03-09 14:45:11 +0000461 .asic_reset = &r300_asic_reset,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000462 .gart_tlb_flush = &rs400_gart_tlb_flush,
463 .gart_set_page = &rs400_gart_set_page,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000464 .ring_start = &r300_ring_start,
465 .ring_test = &r100_ring_test,
Christian König4c87bc22011-10-19 19:02:21 +0200466 .ring = {
467 [RADEON_RING_TYPE_GFX_INDEX] = {
468 .ib_execute = &r100_ring_ib_execute,
469 .emit_fence = &r300_fence_ring_emit,
470 .emit_semaphore = &r100_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +0100471 .cs_parse = &r300_cs_parse,
Christian König4c87bc22011-10-19 19:02:21 +0200472 }
473 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000474 .irq_set = &r100_irq_set,
475 .irq_process = &r100_irq_process,
476 .get_vblank_counter = &r100_get_vblank_counter,
Alex Deucher27cd7762012-02-23 17:53:42 -0500477 .copy = {
478 .blit = &r100_copy_blit,
479 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
480 .dma = &r200_copy_dma,
481 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
482 .copy = &r100_copy_blit,
483 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
484 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000485 .get_engine_clock = &radeon_legacy_get_engine_clock,
486 .set_engine_clock = &radeon_legacy_set_engine_clock,
487 .get_memory_clock = &radeon_legacy_get_memory_clock,
488 .set_memory_clock = NULL,
489 .get_pcie_lanes = NULL,
490 .set_pcie_lanes = NULL,
491 .set_clock_gating = &radeon_legacy_set_clock_gating,
492 .set_surface_reg = r100_set_surface_reg,
493 .clear_surface_reg = r100_clear_surface_reg,
494 .bandwidth_update = &r100_bandwidth_update,
Alex Deucher901ea572012-02-23 17:53:39 -0500495 .hpd = {
496 .init = &r100_hpd_init,
497 .fini = &r100_hpd_fini,
498 .sense = &r100_hpd_sense,
499 .set_polarity = &r100_hpd_set_polarity,
500 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000501 .ioctl_wait_idle = NULL,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400502 .gui_idle = &r100_gui_idle,
Alex Deuchera02fa392012-02-23 17:53:41 -0500503 .pm = {
504 .misc = &r100_pm_misc,
505 .prepare = &r100_pm_prepare,
506 .finish = &r100_pm_finish,
507 .init_profile = &r100_pm_init_profile,
508 .get_dynpm_state = &r100_pm_get_dynpm_state,
509 },
Alex Deucher0f9e0062012-02-23 17:53:40 -0500510 .pflip = {
511 .pre_page_flip = &r100_pre_page_flip,
512 .page_flip = &r100_page_flip,
513 .post_page_flip = &r100_post_page_flip,
514 },
Alex Deucher3ae19b72012-02-23 17:53:37 -0500515 .wait_for_vblank = &r100_wait_for_vblank,
Alex Deucher89e51812012-02-23 17:53:38 -0500516 .mc_wait_for_idle = &rs400_mc_wait_for_idle,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000517};
518
519static struct radeon_asic rs600_asic = {
520 .init = &rs600_init,
521 .fini = &rs600_fini,
522 .suspend = &rs600_suspend,
523 .resume = &rs600_resume,
524 .vga_set_state = &r100_vga_set_state,
Jerome Glisse225758d2010-03-09 14:45:10 +0000525 .gpu_is_lockup = &r300_gpu_is_lockup,
Jerome Glisse90aca4d2010-03-09 14:45:12 +0000526 .asic_reset = &rs600_asic_reset,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000527 .gart_tlb_flush = &rs600_gart_tlb_flush,
528 .gart_set_page = &rs600_gart_set_page,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000529 .ring_start = &r300_ring_start,
530 .ring_test = &r100_ring_test,
Christian König4c87bc22011-10-19 19:02:21 +0200531 .ring = {
532 [RADEON_RING_TYPE_GFX_INDEX] = {
533 .ib_execute = &r100_ring_ib_execute,
534 .emit_fence = &r300_fence_ring_emit,
535 .emit_semaphore = &r100_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +0100536 .cs_parse = &r300_cs_parse,
Christian König4c87bc22011-10-19 19:02:21 +0200537 }
538 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000539 .irq_set = &rs600_irq_set,
540 .irq_process = &rs600_irq_process,
541 .get_vblank_counter = &rs600_get_vblank_counter,
Alex Deucher27cd7762012-02-23 17:53:42 -0500542 .copy = {
543 .blit = &r100_copy_blit,
544 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
545 .dma = &r200_copy_dma,
546 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
547 .copy = &r100_copy_blit,
548 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
549 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000550 .get_engine_clock = &radeon_atom_get_engine_clock,
551 .set_engine_clock = &radeon_atom_set_engine_clock,
552 .get_memory_clock = &radeon_atom_get_memory_clock,
553 .set_memory_clock = &radeon_atom_set_memory_clock,
554 .get_pcie_lanes = NULL,
555 .set_pcie_lanes = NULL,
556 .set_clock_gating = &radeon_atom_set_clock_gating,
557 .set_surface_reg = r100_set_surface_reg,
558 .clear_surface_reg = r100_clear_surface_reg,
559 .bandwidth_update = &rs600_bandwidth_update,
Alex Deucher901ea572012-02-23 17:53:39 -0500560 .hpd = {
561 .init = &rs600_hpd_init,
562 .fini = &rs600_hpd_fini,
563 .sense = &rs600_hpd_sense,
564 .set_polarity = &rs600_hpd_set_polarity,
565 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000566 .ioctl_wait_idle = NULL,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400567 .gui_idle = &r100_gui_idle,
Alex Deuchera02fa392012-02-23 17:53:41 -0500568 .pm = {
569 .misc = &rs600_pm_misc,
570 .prepare = &rs600_pm_prepare,
571 .finish = &rs600_pm_finish,
572 .init_profile = &r420_pm_init_profile,
573 .get_dynpm_state = &r100_pm_get_dynpm_state,
574 },
Alex Deucher0f9e0062012-02-23 17:53:40 -0500575 .pflip = {
576 .pre_page_flip = &rs600_pre_page_flip,
577 .page_flip = &rs600_page_flip,
578 .post_page_flip = &rs600_post_page_flip,
579 },
Alex Deucher3ae19b72012-02-23 17:53:37 -0500580 .wait_for_vblank = &avivo_wait_for_vblank,
Alex Deucher89e51812012-02-23 17:53:38 -0500581 .mc_wait_for_idle = &rs600_mc_wait_for_idle,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000582};
583
584static struct radeon_asic rs690_asic = {
585 .init = &rs690_init,
586 .fini = &rs690_fini,
587 .suspend = &rs690_suspend,
588 .resume = &rs690_resume,
589 .vga_set_state = &r100_vga_set_state,
Jerome Glisse225758d2010-03-09 14:45:10 +0000590 .gpu_is_lockup = &r300_gpu_is_lockup,
Jerome Glisse90aca4d2010-03-09 14:45:12 +0000591 .asic_reset = &rs600_asic_reset,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000592 .gart_tlb_flush = &rs400_gart_tlb_flush,
593 .gart_set_page = &rs400_gart_set_page,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000594 .ring_start = &r300_ring_start,
595 .ring_test = &r100_ring_test,
Christian König4c87bc22011-10-19 19:02:21 +0200596 .ring = {
597 [RADEON_RING_TYPE_GFX_INDEX] = {
598 .ib_execute = &r100_ring_ib_execute,
599 .emit_fence = &r300_fence_ring_emit,
600 .emit_semaphore = &r100_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +0100601 .cs_parse = &r300_cs_parse,
Christian König4c87bc22011-10-19 19:02:21 +0200602 }
603 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000604 .irq_set = &rs600_irq_set,
605 .irq_process = &rs600_irq_process,
606 .get_vblank_counter = &rs600_get_vblank_counter,
Alex Deucher27cd7762012-02-23 17:53:42 -0500607 .copy = {
608 .blit = &r100_copy_blit,
609 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
610 .dma = &r200_copy_dma,
611 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
612 .copy = &r200_copy_dma,
613 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
614 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000615 .get_engine_clock = &radeon_atom_get_engine_clock,
616 .set_engine_clock = &radeon_atom_set_engine_clock,
617 .get_memory_clock = &radeon_atom_get_memory_clock,
618 .set_memory_clock = &radeon_atom_set_memory_clock,
619 .get_pcie_lanes = NULL,
620 .set_pcie_lanes = NULL,
621 .set_clock_gating = &radeon_atom_set_clock_gating,
622 .set_surface_reg = r100_set_surface_reg,
623 .clear_surface_reg = r100_clear_surface_reg,
624 .bandwidth_update = &rs690_bandwidth_update,
Alex Deucher901ea572012-02-23 17:53:39 -0500625 .hpd = {
626 .init = &rs600_hpd_init,
627 .fini = &rs600_hpd_fini,
628 .sense = &rs600_hpd_sense,
629 .set_polarity = &rs600_hpd_set_polarity,
630 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000631 .ioctl_wait_idle = NULL,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400632 .gui_idle = &r100_gui_idle,
Alex Deuchera02fa392012-02-23 17:53:41 -0500633 .pm = {
634 .misc = &rs600_pm_misc,
635 .prepare = &rs600_pm_prepare,
636 .finish = &rs600_pm_finish,
637 .init_profile = &r420_pm_init_profile,
638 .get_dynpm_state = &r100_pm_get_dynpm_state,
639 },
Alex Deucher0f9e0062012-02-23 17:53:40 -0500640 .pflip = {
641 .pre_page_flip = &rs600_pre_page_flip,
642 .page_flip = &rs600_page_flip,
643 .post_page_flip = &rs600_post_page_flip,
644 },
Alex Deucher3ae19b72012-02-23 17:53:37 -0500645 .wait_for_vblank = &avivo_wait_for_vblank,
Alex Deucher89e51812012-02-23 17:53:38 -0500646 .mc_wait_for_idle = &rs690_mc_wait_for_idle,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000647};
648
649static struct radeon_asic rv515_asic = {
650 .init = &rv515_init,
651 .fini = &rv515_fini,
652 .suspend = &rv515_suspend,
653 .resume = &rv515_resume,
654 .vga_set_state = &r100_vga_set_state,
Jerome Glisse225758d2010-03-09 14:45:10 +0000655 .gpu_is_lockup = &r300_gpu_is_lockup,
Jerome Glisse90aca4d2010-03-09 14:45:12 +0000656 .asic_reset = &rs600_asic_reset,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000657 .gart_tlb_flush = &rv370_pcie_gart_tlb_flush,
658 .gart_set_page = &rv370_pcie_gart_set_page,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000659 .ring_start = &rv515_ring_start,
660 .ring_test = &r100_ring_test,
Christian König4c87bc22011-10-19 19:02:21 +0200661 .ring = {
662 [RADEON_RING_TYPE_GFX_INDEX] = {
663 .ib_execute = &r100_ring_ib_execute,
664 .emit_fence = &r300_fence_ring_emit,
665 .emit_semaphore = &r100_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +0100666 .cs_parse = &r300_cs_parse,
Christian König4c87bc22011-10-19 19:02:21 +0200667 }
668 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000669 .irq_set = &rs600_irq_set,
670 .irq_process = &rs600_irq_process,
671 .get_vblank_counter = &rs600_get_vblank_counter,
Alex Deucher27cd7762012-02-23 17:53:42 -0500672 .copy = {
673 .blit = &r100_copy_blit,
674 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
675 .dma = &r200_copy_dma,
676 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
677 .copy = &r100_copy_blit,
678 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
679 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000680 .get_engine_clock = &radeon_atom_get_engine_clock,
681 .set_engine_clock = &radeon_atom_set_engine_clock,
682 .get_memory_clock = &radeon_atom_get_memory_clock,
683 .set_memory_clock = &radeon_atom_set_memory_clock,
684 .get_pcie_lanes = &rv370_get_pcie_lanes,
685 .set_pcie_lanes = &rv370_set_pcie_lanes,
686 .set_clock_gating = &radeon_atom_set_clock_gating,
687 .set_surface_reg = r100_set_surface_reg,
688 .clear_surface_reg = r100_clear_surface_reg,
689 .bandwidth_update = &rv515_bandwidth_update,
Alex Deucher901ea572012-02-23 17:53:39 -0500690 .hpd = {
691 .init = &rs600_hpd_init,
692 .fini = &rs600_hpd_fini,
693 .sense = &rs600_hpd_sense,
694 .set_polarity = &rs600_hpd_set_polarity,
695 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000696 .ioctl_wait_idle = NULL,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400697 .gui_idle = &r100_gui_idle,
Alex Deuchera02fa392012-02-23 17:53:41 -0500698 .pm = {
699 .misc = &rs600_pm_misc,
700 .prepare = &rs600_pm_prepare,
701 .finish = &rs600_pm_finish,
702 .init_profile = &r420_pm_init_profile,
703 .get_dynpm_state = &r100_pm_get_dynpm_state,
704 },
Alex Deucher0f9e0062012-02-23 17:53:40 -0500705 .pflip = {
706 .pre_page_flip = &rs600_pre_page_flip,
707 .page_flip = &rs600_page_flip,
708 .post_page_flip = &rs600_post_page_flip,
709 },
Alex Deucher3ae19b72012-02-23 17:53:37 -0500710 .wait_for_vblank = &avivo_wait_for_vblank,
Alex Deucher89e51812012-02-23 17:53:38 -0500711 .mc_wait_for_idle = &rv515_mc_wait_for_idle,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000712};
713
714static struct radeon_asic r520_asic = {
715 .init = &r520_init,
716 .fini = &rv515_fini,
717 .suspend = &rv515_suspend,
718 .resume = &r520_resume,
719 .vga_set_state = &r100_vga_set_state,
Jerome Glisse225758d2010-03-09 14:45:10 +0000720 .gpu_is_lockup = &r300_gpu_is_lockup,
Jerome Glisse90aca4d2010-03-09 14:45:12 +0000721 .asic_reset = &rs600_asic_reset,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000722 .gart_tlb_flush = &rv370_pcie_gart_tlb_flush,
723 .gart_set_page = &rv370_pcie_gart_set_page,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000724 .ring_start = &rv515_ring_start,
725 .ring_test = &r100_ring_test,
Christian König4c87bc22011-10-19 19:02:21 +0200726 .ring = {
727 [RADEON_RING_TYPE_GFX_INDEX] = {
728 .ib_execute = &r100_ring_ib_execute,
729 .emit_fence = &r300_fence_ring_emit,
730 .emit_semaphore = &r100_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +0100731 .cs_parse = &r300_cs_parse,
Christian König4c87bc22011-10-19 19:02:21 +0200732 }
733 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000734 .irq_set = &rs600_irq_set,
735 .irq_process = &rs600_irq_process,
736 .get_vblank_counter = &rs600_get_vblank_counter,
Alex Deucher27cd7762012-02-23 17:53:42 -0500737 .copy = {
738 .blit = &r100_copy_blit,
739 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
740 .dma = &r200_copy_dma,
741 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
742 .copy = &r100_copy_blit,
743 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
744 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000745 .get_engine_clock = &radeon_atom_get_engine_clock,
746 .set_engine_clock = &radeon_atom_set_engine_clock,
747 .get_memory_clock = &radeon_atom_get_memory_clock,
748 .set_memory_clock = &radeon_atom_set_memory_clock,
749 .get_pcie_lanes = &rv370_get_pcie_lanes,
750 .set_pcie_lanes = &rv370_set_pcie_lanes,
751 .set_clock_gating = &radeon_atom_set_clock_gating,
752 .set_surface_reg = r100_set_surface_reg,
753 .clear_surface_reg = r100_clear_surface_reg,
754 .bandwidth_update = &rv515_bandwidth_update,
Alex Deucher901ea572012-02-23 17:53:39 -0500755 .hpd = {
756 .init = &rs600_hpd_init,
757 .fini = &rs600_hpd_fini,
758 .sense = &rs600_hpd_sense,
759 .set_polarity = &rs600_hpd_set_polarity,
760 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000761 .ioctl_wait_idle = NULL,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400762 .gui_idle = &r100_gui_idle,
Alex Deuchera02fa392012-02-23 17:53:41 -0500763 .pm = {
764 .misc = &rs600_pm_misc,
765 .prepare = &rs600_pm_prepare,
766 .finish = &rs600_pm_finish,
767 .init_profile = &r420_pm_init_profile,
768 .get_dynpm_state = &r100_pm_get_dynpm_state,
769 },
Alex Deucher0f9e0062012-02-23 17:53:40 -0500770 .pflip = {
771 .pre_page_flip = &rs600_pre_page_flip,
772 .page_flip = &rs600_page_flip,
773 .post_page_flip = &rs600_post_page_flip,
774 },
Alex Deucher3ae19b72012-02-23 17:53:37 -0500775 .wait_for_vblank = &avivo_wait_for_vblank,
Alex Deucher89e51812012-02-23 17:53:38 -0500776 .mc_wait_for_idle = &r520_mc_wait_for_idle,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000777};
778
779static struct radeon_asic r600_asic = {
780 .init = &r600_init,
781 .fini = &r600_fini,
782 .suspend = &r600_suspend,
783 .resume = &r600_resume,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000784 .vga_set_state = &r600_vga_set_state,
Jerome Glisse225758d2010-03-09 14:45:10 +0000785 .gpu_is_lockup = &r600_gpu_is_lockup,
Jerome Glissea2d07b72010-03-09 14:45:11 +0000786 .asic_reset = &r600_asic_reset,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000787 .gart_tlb_flush = &r600_pcie_gart_tlb_flush,
788 .gart_set_page = &rs600_gart_set_page,
789 .ring_test = &r600_ring_test,
Christian König4c87bc22011-10-19 19:02:21 +0200790 .ring = {
791 [RADEON_RING_TYPE_GFX_INDEX] = {
792 .ib_execute = &r600_ring_ib_execute,
793 .emit_fence = &r600_fence_ring_emit,
794 .emit_semaphore = &r600_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +0100795 .cs_parse = &r600_cs_parse,
Christian König4c87bc22011-10-19 19:02:21 +0200796 }
797 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000798 .irq_set = &r600_irq_set,
799 .irq_process = &r600_irq_process,
800 .get_vblank_counter = &rs600_get_vblank_counter,
Alex Deucher27cd7762012-02-23 17:53:42 -0500801 .copy = {
802 .blit = &r600_copy_blit,
803 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
804 .dma = NULL,
805 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
806 .copy = &r600_copy_blit,
807 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
808 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000809 .get_engine_clock = &radeon_atom_get_engine_clock,
810 .set_engine_clock = &radeon_atom_set_engine_clock,
811 .get_memory_clock = &radeon_atom_get_memory_clock,
812 .set_memory_clock = &radeon_atom_set_memory_clock,
Alex Deucher3313e3d2011-01-06 18:49:34 -0500813 .get_pcie_lanes = &r600_get_pcie_lanes,
814 .set_pcie_lanes = &r600_set_pcie_lanes,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000815 .set_clock_gating = NULL,
816 .set_surface_reg = r600_set_surface_reg,
817 .clear_surface_reg = r600_clear_surface_reg,
818 .bandwidth_update = &rv515_bandwidth_update,
Alex Deucher901ea572012-02-23 17:53:39 -0500819 .hpd = {
820 .init = &r600_hpd_init,
821 .fini = &r600_hpd_fini,
822 .sense = &r600_hpd_sense,
823 .set_polarity = &r600_hpd_set_polarity,
824 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000825 .ioctl_wait_idle = r600_ioctl_wait_idle,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400826 .gui_idle = &r600_gui_idle,
Alex Deuchera02fa392012-02-23 17:53:41 -0500827 .pm = {
828 .misc = &r600_pm_misc,
829 .prepare = &rs600_pm_prepare,
830 .finish = &rs600_pm_finish,
831 .init_profile = &r600_pm_init_profile,
832 .get_dynpm_state = &r600_pm_get_dynpm_state,
833 },
Alex Deucher0f9e0062012-02-23 17:53:40 -0500834 .pflip = {
835 .pre_page_flip = &rs600_pre_page_flip,
836 .page_flip = &rs600_page_flip,
837 .post_page_flip = &rs600_post_page_flip,
838 },
Alex Deucher3ae19b72012-02-23 17:53:37 -0500839 .wait_for_vblank = &avivo_wait_for_vblank,
Alex Deucher89e51812012-02-23 17:53:38 -0500840 .mc_wait_for_idle = &r600_mc_wait_for_idle,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000841};
842
Alex Deucherf47299c2010-03-16 20:54:38 -0400843static struct radeon_asic rs780_asic = {
844 .init = &r600_init,
845 .fini = &r600_fini,
846 .suspend = &r600_suspend,
847 .resume = &r600_resume,
Jerome Glisse90aca4d2010-03-09 14:45:12 +0000848 .gpu_is_lockup = &r600_gpu_is_lockup,
Alex Deucherf47299c2010-03-16 20:54:38 -0400849 .vga_set_state = &r600_vga_set_state,
Jerome Glissea2d07b72010-03-09 14:45:11 +0000850 .asic_reset = &r600_asic_reset,
Alex Deucherf47299c2010-03-16 20:54:38 -0400851 .gart_tlb_flush = &r600_pcie_gart_tlb_flush,
852 .gart_set_page = &rs600_gart_set_page,
853 .ring_test = &r600_ring_test,
Christian König4c87bc22011-10-19 19:02:21 +0200854 .ring = {
855 [RADEON_RING_TYPE_GFX_INDEX] = {
856 .ib_execute = &r600_ring_ib_execute,
857 .emit_fence = &r600_fence_ring_emit,
858 .emit_semaphore = &r600_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +0100859 .cs_parse = &r600_cs_parse,
Christian König4c87bc22011-10-19 19:02:21 +0200860 }
861 },
Alex Deucherf47299c2010-03-16 20:54:38 -0400862 .irq_set = &r600_irq_set,
863 .irq_process = &r600_irq_process,
864 .get_vblank_counter = &rs600_get_vblank_counter,
Alex Deucher27cd7762012-02-23 17:53:42 -0500865 .copy = {
866 .blit = &r600_copy_blit,
867 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
868 .dma = NULL,
869 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
870 .copy = &r600_copy_blit,
871 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
872 },
Alex Deucherf47299c2010-03-16 20:54:38 -0400873 .get_engine_clock = &radeon_atom_get_engine_clock,
874 .set_engine_clock = &radeon_atom_set_engine_clock,
875 .get_memory_clock = NULL,
876 .set_memory_clock = NULL,
877 .get_pcie_lanes = NULL,
878 .set_pcie_lanes = NULL,
879 .set_clock_gating = NULL,
880 .set_surface_reg = r600_set_surface_reg,
881 .clear_surface_reg = r600_clear_surface_reg,
882 .bandwidth_update = &rs690_bandwidth_update,
Alex Deucher901ea572012-02-23 17:53:39 -0500883 .hpd = {
884 .init = &r600_hpd_init,
885 .fini = &r600_hpd_fini,
886 .sense = &r600_hpd_sense,
887 .set_polarity = &r600_hpd_set_polarity,
888 },
Alex Deucherf47299c2010-03-16 20:54:38 -0400889 .ioctl_wait_idle = r600_ioctl_wait_idle,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400890 .gui_idle = &r600_gui_idle,
Alex Deuchera02fa392012-02-23 17:53:41 -0500891 .pm = {
892 .misc = &r600_pm_misc,
893 .prepare = &rs600_pm_prepare,
894 .finish = &rs600_pm_finish,
895 .init_profile = &rs780_pm_init_profile,
896 .get_dynpm_state = &r600_pm_get_dynpm_state,
897 },
Alex Deucher0f9e0062012-02-23 17:53:40 -0500898 .pflip = {
899 .pre_page_flip = &rs600_pre_page_flip,
900 .page_flip = &rs600_page_flip,
901 .post_page_flip = &rs600_post_page_flip,
902 },
Alex Deucher3ae19b72012-02-23 17:53:37 -0500903 .wait_for_vblank = &avivo_wait_for_vblank,
Alex Deucher89e51812012-02-23 17:53:38 -0500904 .mc_wait_for_idle = &r600_mc_wait_for_idle,
Alex Deucherf47299c2010-03-16 20:54:38 -0400905};
906
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000907static struct radeon_asic rv770_asic = {
908 .init = &rv770_init,
909 .fini = &rv770_fini,
910 .suspend = &rv770_suspend,
911 .resume = &rv770_resume,
Jerome Glissea2d07b72010-03-09 14:45:11 +0000912 .asic_reset = &r600_asic_reset,
Jerome Glisse225758d2010-03-09 14:45:10 +0000913 .gpu_is_lockup = &r600_gpu_is_lockup,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000914 .vga_set_state = &r600_vga_set_state,
915 .gart_tlb_flush = &r600_pcie_gart_tlb_flush,
916 .gart_set_page = &rs600_gart_set_page,
917 .ring_test = &r600_ring_test,
Christian König4c87bc22011-10-19 19:02:21 +0200918 .ring = {
919 [RADEON_RING_TYPE_GFX_INDEX] = {
920 .ib_execute = &r600_ring_ib_execute,
921 .emit_fence = &r600_fence_ring_emit,
922 .emit_semaphore = &r600_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +0100923 .cs_parse = &r600_cs_parse,
Christian König4c87bc22011-10-19 19:02:21 +0200924 }
925 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000926 .irq_set = &r600_irq_set,
927 .irq_process = &r600_irq_process,
928 .get_vblank_counter = &rs600_get_vblank_counter,
Alex Deucher27cd7762012-02-23 17:53:42 -0500929 .copy = {
930 .blit = &r600_copy_blit,
931 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
932 .dma = NULL,
933 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
934 .copy = &r600_copy_blit,
935 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
936 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000937 .get_engine_clock = &radeon_atom_get_engine_clock,
938 .set_engine_clock = &radeon_atom_set_engine_clock,
939 .get_memory_clock = &radeon_atom_get_memory_clock,
940 .set_memory_clock = &radeon_atom_set_memory_clock,
Alex Deucher3313e3d2011-01-06 18:49:34 -0500941 .get_pcie_lanes = &r600_get_pcie_lanes,
942 .set_pcie_lanes = &r600_set_pcie_lanes,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000943 .set_clock_gating = &radeon_atom_set_clock_gating,
944 .set_surface_reg = r600_set_surface_reg,
945 .clear_surface_reg = r600_clear_surface_reg,
946 .bandwidth_update = &rv515_bandwidth_update,
Alex Deucher901ea572012-02-23 17:53:39 -0500947 .hpd = {
948 .init = &r600_hpd_init,
949 .fini = &r600_hpd_fini,
950 .sense = &r600_hpd_sense,
951 .set_polarity = &r600_hpd_set_polarity,
952 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000953 .ioctl_wait_idle = r600_ioctl_wait_idle,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400954 .gui_idle = &r600_gui_idle,
Alex Deuchera02fa392012-02-23 17:53:41 -0500955 .pm = {
956 .misc = &rv770_pm_misc,
957 .prepare = &rs600_pm_prepare,
958 .finish = &rs600_pm_finish,
959 .init_profile = &r600_pm_init_profile,
960 .get_dynpm_state = &r600_pm_get_dynpm_state,
961 },
Alex Deucher0f9e0062012-02-23 17:53:40 -0500962 .pflip = {
963 .pre_page_flip = &rs600_pre_page_flip,
964 .page_flip = &rv770_page_flip,
965 .post_page_flip = &rs600_post_page_flip,
966 },
Alex Deucher3ae19b72012-02-23 17:53:37 -0500967 .wait_for_vblank = &avivo_wait_for_vblank,
Alex Deucher89e51812012-02-23 17:53:38 -0500968 .mc_wait_for_idle = &r600_mc_wait_for_idle,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000969};
970
971static struct radeon_asic evergreen_asic = {
972 .init = &evergreen_init,
973 .fini = &evergreen_fini,
974 .suspend = &evergreen_suspend,
975 .resume = &evergreen_resume,
Jerome Glisse225758d2010-03-09 14:45:10 +0000976 .gpu_is_lockup = &evergreen_gpu_is_lockup,
Jerome Glissea2d07b72010-03-09 14:45:11 +0000977 .asic_reset = &evergreen_asic_reset,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000978 .vga_set_state = &r600_vga_set_state,
Alex Deucher0fcdb612010-03-24 13:20:41 -0400979 .gart_tlb_flush = &evergreen_pcie_gart_tlb_flush,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000980 .gart_set_page = &rs600_gart_set_page,
Alex Deucherfe251e22010-03-24 13:36:43 -0400981 .ring_test = &r600_ring_test,
Christian König4c87bc22011-10-19 19:02:21 +0200982 .ring = {
983 [RADEON_RING_TYPE_GFX_INDEX] = {
984 .ib_execute = &evergreen_ring_ib_execute,
985 .emit_fence = &r600_fence_ring_emit,
986 .emit_semaphore = &r600_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +0100987 .cs_parse = &evergreen_cs_parse,
Christian König4c87bc22011-10-19 19:02:21 +0200988 }
989 },
Alex Deucher45f9a392010-03-24 13:55:51 -0400990 .irq_set = &evergreen_irq_set,
991 .irq_process = &evergreen_irq_process,
992 .get_vblank_counter = &evergreen_get_vblank_counter,
Alex Deucher27cd7762012-02-23 17:53:42 -0500993 .copy = {
994 .blit = &r600_copy_blit,
995 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
996 .dma = NULL,
997 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
998 .copy = &r600_copy_blit,
999 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1000 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +00001001 .get_engine_clock = &radeon_atom_get_engine_clock,
1002 .set_engine_clock = &radeon_atom_set_engine_clock,
1003 .get_memory_clock = &radeon_atom_get_memory_clock,
1004 .set_memory_clock = &radeon_atom_set_memory_clock,
Alex Deucher3313e3d2011-01-06 18:49:34 -05001005 .get_pcie_lanes = &r600_get_pcie_lanes,
1006 .set_pcie_lanes = &r600_set_pcie_lanes,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +00001007 .set_clock_gating = NULL,
1008 .set_surface_reg = r600_set_surface_reg,
1009 .clear_surface_reg = r600_clear_surface_reg,
1010 .bandwidth_update = &evergreen_bandwidth_update,
Alex Deucher901ea572012-02-23 17:53:39 -05001011 .hpd = {
1012 .init = &evergreen_hpd_init,
1013 .fini = &evergreen_hpd_fini,
1014 .sense = &evergreen_hpd_sense,
1015 .set_polarity = &evergreen_hpd_set_polarity,
1016 },
Dave Airlie97bfd0a2011-05-19 14:14:43 +10001017 .ioctl_wait_idle = r600_ioctl_wait_idle,
Alex Deucherdef9ba92010-04-22 12:39:58 -04001018 .gui_idle = &r600_gui_idle,
Alex Deuchera02fa392012-02-23 17:53:41 -05001019 .pm = {
1020 .misc = &evergreen_pm_misc,
1021 .prepare = &evergreen_pm_prepare,
1022 .finish = &evergreen_pm_finish,
1023 .init_profile = &r600_pm_init_profile,
1024 .get_dynpm_state = &r600_pm_get_dynpm_state,
1025 },
Alex Deucher0f9e0062012-02-23 17:53:40 -05001026 .pflip = {
1027 .pre_page_flip = &evergreen_pre_page_flip,
1028 .page_flip = &evergreen_page_flip,
1029 .post_page_flip = &evergreen_post_page_flip,
1030 },
Alex Deucher3ae19b72012-02-23 17:53:37 -05001031 .wait_for_vblank = &dce4_wait_for_vblank,
Alex Deucher89e51812012-02-23 17:53:38 -05001032 .mc_wait_for_idle = &evergreen_mc_wait_for_idle,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +00001033};
1034
Alex Deucher958261d2010-11-22 17:56:30 -05001035static struct radeon_asic sumo_asic = {
1036 .init = &evergreen_init,
1037 .fini = &evergreen_fini,
1038 .suspend = &evergreen_suspend,
1039 .resume = &evergreen_resume,
Alex Deucher958261d2010-11-22 17:56:30 -05001040 .gpu_is_lockup = &evergreen_gpu_is_lockup,
1041 .asic_reset = &evergreen_asic_reset,
1042 .vga_set_state = &r600_vga_set_state,
1043 .gart_tlb_flush = &evergreen_pcie_gart_tlb_flush,
1044 .gart_set_page = &rs600_gart_set_page,
1045 .ring_test = &r600_ring_test,
Christian König4c87bc22011-10-19 19:02:21 +02001046 .ring = {
1047 [RADEON_RING_TYPE_GFX_INDEX] = {
1048 .ib_execute = &evergreen_ring_ib_execute,
1049 .emit_fence = &r600_fence_ring_emit,
1050 .emit_semaphore = &r600_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +01001051 .cs_parse = &evergreen_cs_parse,
1052 },
Christian König4c87bc22011-10-19 19:02:21 +02001053 },
Alex Deucher958261d2010-11-22 17:56:30 -05001054 .irq_set = &evergreen_irq_set,
1055 .irq_process = &evergreen_irq_process,
1056 .get_vblank_counter = &evergreen_get_vblank_counter,
Alex Deucher27cd7762012-02-23 17:53:42 -05001057 .copy = {
1058 .blit = &r600_copy_blit,
1059 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1060 .dma = NULL,
1061 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1062 .copy = &r600_copy_blit,
1063 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1064 },
Alex Deucher958261d2010-11-22 17:56:30 -05001065 .get_engine_clock = &radeon_atom_get_engine_clock,
1066 .set_engine_clock = &radeon_atom_set_engine_clock,
1067 .get_memory_clock = NULL,
1068 .set_memory_clock = NULL,
1069 .get_pcie_lanes = NULL,
1070 .set_pcie_lanes = NULL,
1071 .set_clock_gating = NULL,
1072 .set_surface_reg = r600_set_surface_reg,
1073 .clear_surface_reg = r600_clear_surface_reg,
1074 .bandwidth_update = &evergreen_bandwidth_update,
Alex Deucher901ea572012-02-23 17:53:39 -05001075 .hpd = {
1076 .init = &evergreen_hpd_init,
1077 .fini = &evergreen_hpd_fini,
1078 .sense = &evergreen_hpd_sense,
1079 .set_polarity = &evergreen_hpd_set_polarity,
1080 },
Dave Airlie97bfd0a2011-05-19 14:14:43 +10001081 .ioctl_wait_idle = r600_ioctl_wait_idle,
Alex Deucher958261d2010-11-22 17:56:30 -05001082 .gui_idle = &r600_gui_idle,
Alex Deuchera02fa392012-02-23 17:53:41 -05001083 .pm = {
1084 .misc = &evergreen_pm_misc,
1085 .prepare = &evergreen_pm_prepare,
1086 .finish = &evergreen_pm_finish,
1087 .init_profile = &sumo_pm_init_profile,
1088 .get_dynpm_state = &r600_pm_get_dynpm_state,
1089 },
Alex Deucher0f9e0062012-02-23 17:53:40 -05001090 .pflip = {
1091 .pre_page_flip = &evergreen_pre_page_flip,
1092 .page_flip = &evergreen_page_flip,
1093 .post_page_flip = &evergreen_post_page_flip,
1094 },
Alex Deucher3ae19b72012-02-23 17:53:37 -05001095 .wait_for_vblank = &dce4_wait_for_vblank,
Alex Deucher89e51812012-02-23 17:53:38 -05001096 .mc_wait_for_idle = &evergreen_mc_wait_for_idle,
Alex Deucher958261d2010-11-22 17:56:30 -05001097};
1098
Alex Deuchera43b7662011-01-06 21:19:33 -05001099static struct radeon_asic btc_asic = {
1100 .init = &evergreen_init,
1101 .fini = &evergreen_fini,
1102 .suspend = &evergreen_suspend,
1103 .resume = &evergreen_resume,
Alex Deuchera43b7662011-01-06 21:19:33 -05001104 .gpu_is_lockup = &evergreen_gpu_is_lockup,
1105 .asic_reset = &evergreen_asic_reset,
1106 .vga_set_state = &r600_vga_set_state,
1107 .gart_tlb_flush = &evergreen_pcie_gart_tlb_flush,
1108 .gart_set_page = &rs600_gart_set_page,
1109 .ring_test = &r600_ring_test,
Christian König4c87bc22011-10-19 19:02:21 +02001110 .ring = {
1111 [RADEON_RING_TYPE_GFX_INDEX] = {
1112 .ib_execute = &evergreen_ring_ib_execute,
1113 .emit_fence = &r600_fence_ring_emit,
1114 .emit_semaphore = &r600_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +01001115 .cs_parse = &evergreen_cs_parse,
Christian König4c87bc22011-10-19 19:02:21 +02001116 }
1117 },
Alex Deuchera43b7662011-01-06 21:19:33 -05001118 .irq_set = &evergreen_irq_set,
1119 .irq_process = &evergreen_irq_process,
1120 .get_vblank_counter = &evergreen_get_vblank_counter,
Alex Deucher27cd7762012-02-23 17:53:42 -05001121 .copy = {
1122 .blit = &r600_copy_blit,
1123 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1124 .dma = NULL,
1125 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1126 .copy = &r600_copy_blit,
1127 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1128 },
Alex Deuchera43b7662011-01-06 21:19:33 -05001129 .get_engine_clock = &radeon_atom_get_engine_clock,
1130 .set_engine_clock = &radeon_atom_set_engine_clock,
1131 .get_memory_clock = &radeon_atom_get_memory_clock,
1132 .set_memory_clock = &radeon_atom_set_memory_clock,
1133 .get_pcie_lanes = NULL,
1134 .set_pcie_lanes = NULL,
1135 .set_clock_gating = NULL,
1136 .set_surface_reg = r600_set_surface_reg,
1137 .clear_surface_reg = r600_clear_surface_reg,
1138 .bandwidth_update = &evergreen_bandwidth_update,
Alex Deucher901ea572012-02-23 17:53:39 -05001139 .hpd = {
1140 .init = &evergreen_hpd_init,
1141 .fini = &evergreen_hpd_fini,
1142 .sense = &evergreen_hpd_sense,
1143 .set_polarity = &evergreen_hpd_set_polarity,
1144 },
Dave Airlie97bfd0a2011-05-19 14:14:43 +10001145 .ioctl_wait_idle = r600_ioctl_wait_idle,
Alex Deuchera43b7662011-01-06 21:19:33 -05001146 .gui_idle = &r600_gui_idle,
Alex Deuchera02fa392012-02-23 17:53:41 -05001147 .pm = {
1148 .misc = &evergreen_pm_misc,
1149 .prepare = &evergreen_pm_prepare,
1150 .finish = &evergreen_pm_finish,
1151 .init_profile = &r600_pm_init_profile,
1152 .get_dynpm_state = &r600_pm_get_dynpm_state,
1153 },
Alex Deucher0f9e0062012-02-23 17:53:40 -05001154 .pflip = {
1155 .pre_page_flip = &evergreen_pre_page_flip,
1156 .page_flip = &evergreen_page_flip,
1157 .post_page_flip = &evergreen_post_page_flip,
1158 },
Alex Deucher3ae19b72012-02-23 17:53:37 -05001159 .wait_for_vblank = &dce4_wait_for_vblank,
Alex Deucher89e51812012-02-23 17:53:38 -05001160 .mc_wait_for_idle = &evergreen_mc_wait_for_idle,
Alex Deuchera43b7662011-01-06 21:19:33 -05001161};
1162
Jerome Glisse721604a2012-01-05 22:11:05 -05001163static const struct radeon_vm_funcs cayman_vm_funcs = {
1164 .init = &cayman_vm_init,
1165 .fini = &cayman_vm_fini,
1166 .bind = &cayman_vm_bind,
1167 .unbind = &cayman_vm_unbind,
1168 .tlb_flush = &cayman_vm_tlb_flush,
1169 .page_flags = &cayman_vm_page_flags,
1170 .set_page = &cayman_vm_set_page,
1171};
1172
Alex Deuchere3487622011-03-02 20:07:36 -05001173static struct radeon_asic cayman_asic = {
1174 .init = &cayman_init,
1175 .fini = &cayman_fini,
1176 .suspend = &cayman_suspend,
1177 .resume = &cayman_resume,
Alex Deuchere3487622011-03-02 20:07:36 -05001178 .gpu_is_lockup = &cayman_gpu_is_lockup,
1179 .asic_reset = &cayman_asic_reset,
1180 .vga_set_state = &r600_vga_set_state,
1181 .gart_tlb_flush = &cayman_pcie_gart_tlb_flush,
1182 .gart_set_page = &rs600_gart_set_page,
1183 .ring_test = &r600_ring_test,
Christian König4c87bc22011-10-19 19:02:21 +02001184 .ring = {
1185 [RADEON_RING_TYPE_GFX_INDEX] = {
Jerome Glisse721604a2012-01-05 22:11:05 -05001186 .ib_execute = &cayman_ring_ib_execute,
1187 .ib_parse = &evergreen_ib_parse,
Alex Deucherb40e7e12011-11-17 14:57:50 -05001188 .emit_fence = &cayman_fence_ring_emit,
Christian König4c87bc22011-10-19 19:02:21 +02001189 .emit_semaphore = &r600_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +01001190 .cs_parse = &evergreen_cs_parse,
Christian König4c87bc22011-10-19 19:02:21 +02001191 },
1192 [CAYMAN_RING_TYPE_CP1_INDEX] = {
Jerome Glisse721604a2012-01-05 22:11:05 -05001193 .ib_execute = &cayman_ring_ib_execute,
1194 .ib_parse = &evergreen_ib_parse,
Alex Deucherb40e7e12011-11-17 14:57:50 -05001195 .emit_fence = &cayman_fence_ring_emit,
Christian König4c87bc22011-10-19 19:02:21 +02001196 .emit_semaphore = &r600_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +01001197 .cs_parse = &evergreen_cs_parse,
Christian König4c87bc22011-10-19 19:02:21 +02001198 },
1199 [CAYMAN_RING_TYPE_CP2_INDEX] = {
Jerome Glisse721604a2012-01-05 22:11:05 -05001200 .ib_execute = &cayman_ring_ib_execute,
1201 .ib_parse = &evergreen_ib_parse,
Alex Deucherb40e7e12011-11-17 14:57:50 -05001202 .emit_fence = &cayman_fence_ring_emit,
Christian König4c87bc22011-10-19 19:02:21 +02001203 .emit_semaphore = &r600_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +01001204 .cs_parse = &evergreen_cs_parse,
Christian König4c87bc22011-10-19 19:02:21 +02001205 }
1206 },
Alex Deuchere3487622011-03-02 20:07:36 -05001207 .irq_set = &evergreen_irq_set,
1208 .irq_process = &evergreen_irq_process,
1209 .get_vblank_counter = &evergreen_get_vblank_counter,
Alex Deucher27cd7762012-02-23 17:53:42 -05001210 .copy = {
1211 .blit = &r600_copy_blit,
1212 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1213 .dma = NULL,
1214 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1215 .copy = &r600_copy_blit,
1216 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1217 },
Alex Deuchere3487622011-03-02 20:07:36 -05001218 .get_engine_clock = &radeon_atom_get_engine_clock,
1219 .set_engine_clock = &radeon_atom_set_engine_clock,
1220 .get_memory_clock = &radeon_atom_get_memory_clock,
1221 .set_memory_clock = &radeon_atom_set_memory_clock,
1222 .get_pcie_lanes = NULL,
1223 .set_pcie_lanes = NULL,
1224 .set_clock_gating = NULL,
1225 .set_surface_reg = r600_set_surface_reg,
1226 .clear_surface_reg = r600_clear_surface_reg,
1227 .bandwidth_update = &evergreen_bandwidth_update,
Alex Deucher901ea572012-02-23 17:53:39 -05001228 .hpd = {
1229 .init = &evergreen_hpd_init,
1230 .fini = &evergreen_hpd_fini,
1231 .sense = &evergreen_hpd_sense,
1232 .set_polarity = &evergreen_hpd_set_polarity,
1233 },
Dave Airlie97bfd0a2011-05-19 14:14:43 +10001234 .ioctl_wait_idle = r600_ioctl_wait_idle,
Alex Deuchere3487622011-03-02 20:07:36 -05001235 .gui_idle = &r600_gui_idle,
Alex Deuchera02fa392012-02-23 17:53:41 -05001236 .pm = {
1237 .misc = &evergreen_pm_misc,
1238 .prepare = &evergreen_pm_prepare,
1239 .finish = &evergreen_pm_finish,
1240 .init_profile = &r600_pm_init_profile,
1241 .get_dynpm_state = &r600_pm_get_dynpm_state,
1242 },
Alex Deucher0f9e0062012-02-23 17:53:40 -05001243 .pflip = {
1244 .pre_page_flip = &evergreen_pre_page_flip,
1245 .page_flip = &evergreen_page_flip,
1246 .post_page_flip = &evergreen_post_page_flip,
1247 },
Alex Deucher3ae19b72012-02-23 17:53:37 -05001248 .wait_for_vblank = &dce4_wait_for_vblank,
Alex Deucher89e51812012-02-23 17:53:38 -05001249 .mc_wait_for_idle = &evergreen_mc_wait_for_idle,
Alex Deuchere3487622011-03-02 20:07:36 -05001250};
1251
Daniel Vetter0a10c852010-03-11 21:19:14 +00001252int radeon_asic_init(struct radeon_device *rdev)
1253{
1254 radeon_register_accessor_init(rdev);
Alex Deucherba7e05e2011-06-16 18:14:22 +00001255
1256 /* set the number of crtcs */
1257 if (rdev->flags & RADEON_SINGLE_CRTC)
1258 rdev->num_crtc = 1;
1259 else
1260 rdev->num_crtc = 2;
1261
Daniel Vetter0a10c852010-03-11 21:19:14 +00001262 switch (rdev->family) {
1263 case CHIP_R100:
1264 case CHIP_RV100:
1265 case CHIP_RS100:
1266 case CHIP_RV200:
1267 case CHIP_RS200:
1268 rdev->asic = &r100_asic;
1269 break;
1270 case CHIP_R200:
1271 case CHIP_RV250:
1272 case CHIP_RS300:
1273 case CHIP_RV280:
1274 rdev->asic = &r200_asic;
1275 break;
1276 case CHIP_R300:
1277 case CHIP_R350:
1278 case CHIP_RV350:
1279 case CHIP_RV380:
1280 if (rdev->flags & RADEON_IS_PCIE)
1281 rdev->asic = &r300_asic_pcie;
1282 else
1283 rdev->asic = &r300_asic;
1284 break;
1285 case CHIP_R420:
1286 case CHIP_R423:
1287 case CHIP_RV410:
1288 rdev->asic = &r420_asic;
Alex Deucher07bb0842010-06-22 21:58:26 -04001289 /* handle macs */
1290 if (rdev->bios == NULL) {
1291 rdev->asic->get_engine_clock = &radeon_legacy_get_engine_clock;
1292 rdev->asic->set_engine_clock = &radeon_legacy_set_engine_clock;
1293 rdev->asic->get_memory_clock = &radeon_legacy_get_memory_clock;
1294 rdev->asic->set_memory_clock = NULL;
1295 }
Daniel Vetter0a10c852010-03-11 21:19:14 +00001296 break;
1297 case CHIP_RS400:
1298 case CHIP_RS480:
1299 rdev->asic = &rs400_asic;
1300 break;
1301 case CHIP_RS600:
1302 rdev->asic = &rs600_asic;
1303 break;
1304 case CHIP_RS690:
1305 case CHIP_RS740:
1306 rdev->asic = &rs690_asic;
1307 break;
1308 case CHIP_RV515:
1309 rdev->asic = &rv515_asic;
1310 break;
1311 case CHIP_R520:
1312 case CHIP_RV530:
1313 case CHIP_RV560:
1314 case CHIP_RV570:
1315 case CHIP_R580:
1316 rdev->asic = &r520_asic;
1317 break;
1318 case CHIP_R600:
1319 case CHIP_RV610:
1320 case CHIP_RV630:
1321 case CHIP_RV620:
1322 case CHIP_RV635:
1323 case CHIP_RV670:
Alex Deucherf47299c2010-03-16 20:54:38 -04001324 rdev->asic = &r600_asic;
1325 break;
Daniel Vetter0a10c852010-03-11 21:19:14 +00001326 case CHIP_RS780:
1327 case CHIP_RS880:
Alex Deucherf47299c2010-03-16 20:54:38 -04001328 rdev->asic = &rs780_asic;
Daniel Vetter0a10c852010-03-11 21:19:14 +00001329 break;
1330 case CHIP_RV770:
1331 case CHIP_RV730:
1332 case CHIP_RV710:
1333 case CHIP_RV740:
1334 rdev->asic = &rv770_asic;
1335 break;
1336 case CHIP_CEDAR:
1337 case CHIP_REDWOOD:
1338 case CHIP_JUNIPER:
1339 case CHIP_CYPRESS:
1340 case CHIP_HEMLOCK:
Alex Deucherba7e05e2011-06-16 18:14:22 +00001341 /* set num crtcs */
1342 if (rdev->family == CHIP_CEDAR)
1343 rdev->num_crtc = 4;
1344 else
1345 rdev->num_crtc = 6;
Daniel Vetter0a10c852010-03-11 21:19:14 +00001346 rdev->asic = &evergreen_asic;
1347 break;
Alex Deucher958261d2010-11-22 17:56:30 -05001348 case CHIP_PALM:
Alex Deucher89da5a32011-05-31 15:42:47 -04001349 case CHIP_SUMO:
1350 case CHIP_SUMO2:
Alex Deucher958261d2010-11-22 17:56:30 -05001351 rdev->asic = &sumo_asic;
1352 break;
Alex Deuchera43b7662011-01-06 21:19:33 -05001353 case CHIP_BARTS:
1354 case CHIP_TURKS:
1355 case CHIP_CAICOS:
Alex Deucherba7e05e2011-06-16 18:14:22 +00001356 /* set num crtcs */
1357 if (rdev->family == CHIP_CAICOS)
1358 rdev->num_crtc = 4;
1359 else
1360 rdev->num_crtc = 6;
Alex Deuchera43b7662011-01-06 21:19:33 -05001361 rdev->asic = &btc_asic;
1362 break;
Alex Deuchere3487622011-03-02 20:07:36 -05001363 case CHIP_CAYMAN:
1364 rdev->asic = &cayman_asic;
Alex Deucherba7e05e2011-06-16 18:14:22 +00001365 /* set num crtcs */
1366 rdev->num_crtc = 6;
Jerome Glisse721604a2012-01-05 22:11:05 -05001367 rdev->vm_manager.funcs = &cayman_vm_funcs;
Alex Deuchere3487622011-03-02 20:07:36 -05001368 break;
Daniel Vetter0a10c852010-03-11 21:19:14 +00001369 default:
1370 /* FIXME: not supported yet */
1371 return -EINVAL;
1372 }
1373
1374 if (rdev->flags & RADEON_IS_IGP) {
1375 rdev->asic->get_memory_clock = NULL;
1376 rdev->asic->set_memory_clock = NULL;
1377 }
1378
Daniel Vetter0a10c852010-03-11 21:19:14 +00001379 return 0;
1380}
1381