blob: 85e13502e80f0cb489f842da5144853161533df5 [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,
Christian König4c87bc22011-10-19 19:02:21 +0200141 .ring = {
142 [RADEON_RING_TYPE_GFX_INDEX] = {
143 .ib_execute = &r100_ring_ib_execute,
144 .emit_fence = &r100_fence_ring_emit,
145 .emit_semaphore = &r100_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +0100146 .cs_parse = &r100_cs_parse,
Alex Deucherf7128122012-02-23 17:53:45 -0500147 .ring_start = &r100_ring_start,
148 .ring_test = &r100_ring_test,
149 .ib_test = &r100_ib_test,
Christian König4c87bc22011-10-19 19:02:21 +0200150 }
151 },
Alex Deucherb35ea4a2012-02-23 17:53:43 -0500152 .irq = {
153 .set = &r100_irq_set,
154 .process = &r100_irq_process,
155 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000156 .get_vblank_counter = &r100_get_vblank_counter,
Alex Deucher27cd7762012-02-23 17:53:42 -0500157 .copy = {
158 .blit = &r100_copy_blit,
159 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
160 .dma = NULL,
161 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
162 .copy = &r100_copy_blit,
163 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
164 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000165 .get_engine_clock = &radeon_legacy_get_engine_clock,
166 .set_engine_clock = &radeon_legacy_set_engine_clock,
167 .get_memory_clock = &radeon_legacy_get_memory_clock,
168 .set_memory_clock = NULL,
169 .get_pcie_lanes = NULL,
170 .set_pcie_lanes = NULL,
171 .set_clock_gating = &radeon_legacy_set_clock_gating,
172 .set_surface_reg = r100_set_surface_reg,
173 .clear_surface_reg = r100_clear_surface_reg,
174 .bandwidth_update = &r100_bandwidth_update,
Alex Deucher901ea572012-02-23 17:53:39 -0500175 .hpd = {
176 .init = &r100_hpd_init,
177 .fini = &r100_hpd_fini,
178 .sense = &r100_hpd_sense,
179 .set_polarity = &r100_hpd_set_polarity,
180 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000181 .ioctl_wait_idle = NULL,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400182 .gui_idle = &r100_gui_idle,
Alex Deuchera02fa392012-02-23 17:53:41 -0500183 .pm = {
184 .misc = &r100_pm_misc,
185 .prepare = &r100_pm_prepare,
186 .finish = &r100_pm_finish,
187 .init_profile = &r100_pm_init_profile,
188 .get_dynpm_state = &r100_pm_get_dynpm_state,
189 },
Alex Deucher0f9e0062012-02-23 17:53:40 -0500190 .pflip = {
191 .pre_page_flip = &r100_pre_page_flip,
192 .page_flip = &r100_page_flip,
193 .post_page_flip = &r100_post_page_flip,
194 },
Alex Deucher3ae19b72012-02-23 17:53:37 -0500195 .wait_for_vblank = &r100_wait_for_vblank,
Alex Deucher89e51812012-02-23 17:53:38 -0500196 .mc_wait_for_idle = &r100_mc_wait_for_idle,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000197};
198
199static struct radeon_asic r200_asic = {
200 .init = &r100_init,
201 .fini = &r100_fini,
202 .suspend = &r100_suspend,
203 .resume = &r100_resume,
204 .vga_set_state = &r100_vga_set_state,
Jerome Glisse225758d2010-03-09 14:45:10 +0000205 .gpu_is_lockup = &r100_gpu_is_lockup,
Jerome Glissea2d07b72010-03-09 14:45:11 +0000206 .asic_reset = &r100_asic_reset,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000207 .gart_tlb_flush = &r100_pci_gart_tlb_flush,
208 .gart_set_page = &r100_pci_gart_set_page,
Christian König4c87bc22011-10-19 19:02:21 +0200209 .ring = {
210 [RADEON_RING_TYPE_GFX_INDEX] = {
211 .ib_execute = &r100_ring_ib_execute,
212 .emit_fence = &r100_fence_ring_emit,
213 .emit_semaphore = &r100_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +0100214 .cs_parse = &r100_cs_parse,
Alex Deucherf7128122012-02-23 17:53:45 -0500215 .ring_start = &r100_ring_start,
216 .ring_test = &r100_ring_test,
217 .ib_test = &r100_ib_test,
Christian König4c87bc22011-10-19 19:02:21 +0200218 }
219 },
Alex Deucherb35ea4a2012-02-23 17:53:43 -0500220 .irq = {
221 .set = &r100_irq_set,
222 .process = &r100_irq_process,
223 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000224 .get_vblank_counter = &r100_get_vblank_counter,
Alex Deucher27cd7762012-02-23 17:53:42 -0500225 .copy = {
226 .blit = &r100_copy_blit,
227 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
228 .dma = &r200_copy_dma,
229 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
230 .copy = &r100_copy_blit,
231 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
232 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000233 .get_engine_clock = &radeon_legacy_get_engine_clock,
234 .set_engine_clock = &radeon_legacy_set_engine_clock,
235 .get_memory_clock = &radeon_legacy_get_memory_clock,
236 .set_memory_clock = NULL,
237 .set_pcie_lanes = NULL,
238 .set_clock_gating = &radeon_legacy_set_clock_gating,
239 .set_surface_reg = r100_set_surface_reg,
240 .clear_surface_reg = r100_clear_surface_reg,
241 .bandwidth_update = &r100_bandwidth_update,
Alex Deucher901ea572012-02-23 17:53:39 -0500242 .hpd = {
243 .init = &r100_hpd_init,
244 .fini = &r100_hpd_fini,
245 .sense = &r100_hpd_sense,
246 .set_polarity = &r100_hpd_set_polarity,
247 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000248 .ioctl_wait_idle = NULL,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400249 .gui_idle = &r100_gui_idle,
Alex Deuchera02fa392012-02-23 17:53:41 -0500250 .pm = {
251 .misc = &r100_pm_misc,
252 .prepare = &r100_pm_prepare,
253 .finish = &r100_pm_finish,
254 .init_profile = &r100_pm_init_profile,
255 .get_dynpm_state = &r100_pm_get_dynpm_state,
256 },
Alex Deucher0f9e0062012-02-23 17:53:40 -0500257 .pflip = {
258 .pre_page_flip = &r100_pre_page_flip,
259 .page_flip = &r100_page_flip,
260 .post_page_flip = &r100_post_page_flip,
261 },
Alex Deucher3ae19b72012-02-23 17:53:37 -0500262 .wait_for_vblank = &r100_wait_for_vblank,
Alex Deucher89e51812012-02-23 17:53:38 -0500263 .mc_wait_for_idle = &r100_mc_wait_for_idle,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000264};
265
266static struct radeon_asic r300_asic = {
267 .init = &r300_init,
268 .fini = &r300_fini,
269 .suspend = &r300_suspend,
270 .resume = &r300_resume,
271 .vga_set_state = &r100_vga_set_state,
Jerome Glisse225758d2010-03-09 14:45:10 +0000272 .gpu_is_lockup = &r300_gpu_is_lockup,
Jerome Glissea2d07b72010-03-09 14:45:11 +0000273 .asic_reset = &r300_asic_reset,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000274 .gart_tlb_flush = &r100_pci_gart_tlb_flush,
275 .gart_set_page = &r100_pci_gart_set_page,
Christian König4c87bc22011-10-19 19:02:21 +0200276 .ring = {
277 [RADEON_RING_TYPE_GFX_INDEX] = {
278 .ib_execute = &r100_ring_ib_execute,
279 .emit_fence = &r300_fence_ring_emit,
280 .emit_semaphore = &r100_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +0100281 .cs_parse = &r300_cs_parse,
Alex Deucherf7128122012-02-23 17:53:45 -0500282 .ring_start = &r300_ring_start,
283 .ring_test = &r100_ring_test,
284 .ib_test = &r100_ib_test,
Christian König4c87bc22011-10-19 19:02:21 +0200285 }
286 },
Alex Deucherb35ea4a2012-02-23 17:53:43 -0500287 .irq = {
288 .set = &r100_irq_set,
289 .process = &r100_irq_process,
290 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000291 .get_vblank_counter = &r100_get_vblank_counter,
Alex Deucher27cd7762012-02-23 17:53:42 -0500292 .copy = {
293 .blit = &r100_copy_blit,
294 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
295 .dma = &r200_copy_dma,
296 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
297 .copy = &r100_copy_blit,
298 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
299 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000300 .get_engine_clock = &radeon_legacy_get_engine_clock,
301 .set_engine_clock = &radeon_legacy_set_engine_clock,
302 .get_memory_clock = &radeon_legacy_get_memory_clock,
303 .set_memory_clock = NULL,
304 .get_pcie_lanes = &rv370_get_pcie_lanes,
305 .set_pcie_lanes = &rv370_set_pcie_lanes,
306 .set_clock_gating = &radeon_legacy_set_clock_gating,
307 .set_surface_reg = r100_set_surface_reg,
308 .clear_surface_reg = r100_clear_surface_reg,
309 .bandwidth_update = &r100_bandwidth_update,
Alex Deucher901ea572012-02-23 17:53:39 -0500310 .hpd = {
311 .init = &r100_hpd_init,
312 .fini = &r100_hpd_fini,
313 .sense = &r100_hpd_sense,
314 .set_polarity = &r100_hpd_set_polarity,
315 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000316 .ioctl_wait_idle = NULL,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400317 .gui_idle = &r100_gui_idle,
Alex Deuchera02fa392012-02-23 17:53:41 -0500318 .pm = {
319 .misc = &r100_pm_misc,
320 .prepare = &r100_pm_prepare,
321 .finish = &r100_pm_finish,
322 .init_profile = &r100_pm_init_profile,
323 .get_dynpm_state = &r100_pm_get_dynpm_state,
324 },
Alex Deucher0f9e0062012-02-23 17:53:40 -0500325 .pflip = {
326 .pre_page_flip = &r100_pre_page_flip,
327 .page_flip = &r100_page_flip,
328 .post_page_flip = &r100_post_page_flip,
329 },
Alex Deucher3ae19b72012-02-23 17:53:37 -0500330 .wait_for_vblank = &r100_wait_for_vblank,
Alex Deucher89e51812012-02-23 17:53:38 -0500331 .mc_wait_for_idle = &r300_mc_wait_for_idle,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000332};
333
334static struct radeon_asic r300_asic_pcie = {
335 .init = &r300_init,
336 .fini = &r300_fini,
337 .suspend = &r300_suspend,
338 .resume = &r300_resume,
339 .vga_set_state = &r100_vga_set_state,
Jerome Glisse225758d2010-03-09 14:45:10 +0000340 .gpu_is_lockup = &r300_gpu_is_lockup,
Jerome Glissea2d07b72010-03-09 14:45:11 +0000341 .asic_reset = &r300_asic_reset,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000342 .gart_tlb_flush = &rv370_pcie_gart_tlb_flush,
343 .gart_set_page = &rv370_pcie_gart_set_page,
Christian König4c87bc22011-10-19 19:02:21 +0200344 .ring = {
345 [RADEON_RING_TYPE_GFX_INDEX] = {
346 .ib_execute = &r100_ring_ib_execute,
347 .emit_fence = &r300_fence_ring_emit,
348 .emit_semaphore = &r100_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +0100349 .cs_parse = &r300_cs_parse,
Alex Deucherf7128122012-02-23 17:53:45 -0500350 .ring_start = &r300_ring_start,
351 .ring_test = &r100_ring_test,
352 .ib_test = &r100_ib_test,
Christian König4c87bc22011-10-19 19:02:21 +0200353 }
354 },
Alex Deucherb35ea4a2012-02-23 17:53:43 -0500355 .irq = {
356 .set = &r100_irq_set,
357 .process = &r100_irq_process,
358 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000359 .get_vblank_counter = &r100_get_vblank_counter,
Alex Deucher27cd7762012-02-23 17:53:42 -0500360 .copy = {
361 .blit = &r100_copy_blit,
362 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
363 .dma = &r200_copy_dma,
364 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
365 .copy = &r100_copy_blit,
366 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
367 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000368 .get_engine_clock = &radeon_legacy_get_engine_clock,
369 .set_engine_clock = &radeon_legacy_set_engine_clock,
370 .get_memory_clock = &radeon_legacy_get_memory_clock,
371 .set_memory_clock = NULL,
372 .set_pcie_lanes = &rv370_set_pcie_lanes,
373 .set_clock_gating = &radeon_legacy_set_clock_gating,
374 .set_surface_reg = r100_set_surface_reg,
375 .clear_surface_reg = r100_clear_surface_reg,
376 .bandwidth_update = &r100_bandwidth_update,
Alex Deucher901ea572012-02-23 17:53:39 -0500377 .hpd = {
378 .init = &r100_hpd_init,
379 .fini = &r100_hpd_fini,
380 .sense = &r100_hpd_sense,
381 .set_polarity = &r100_hpd_set_polarity,
382 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000383 .ioctl_wait_idle = NULL,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400384 .gui_idle = &r100_gui_idle,
Alex Deuchera02fa392012-02-23 17:53:41 -0500385 .pm = {
386 .misc = &r100_pm_misc,
387 .prepare = &r100_pm_prepare,
388 .finish = &r100_pm_finish,
389 .init_profile = &r100_pm_init_profile,
390 .get_dynpm_state = &r100_pm_get_dynpm_state,
391 },
Alex Deucher0f9e0062012-02-23 17:53:40 -0500392 .pflip = {
393 .pre_page_flip = &r100_pre_page_flip,
394 .page_flip = &r100_page_flip,
395 .post_page_flip = &r100_post_page_flip,
396 },
Alex Deucher3ae19b72012-02-23 17:53:37 -0500397 .wait_for_vblank = &r100_wait_for_vblank,
Alex Deucher89e51812012-02-23 17:53:38 -0500398 .mc_wait_for_idle = &r300_mc_wait_for_idle,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000399};
400
401static struct radeon_asic r420_asic = {
402 .init = &r420_init,
403 .fini = &r420_fini,
404 .suspend = &r420_suspend,
405 .resume = &r420_resume,
406 .vga_set_state = &r100_vga_set_state,
Jerome Glisse225758d2010-03-09 14:45:10 +0000407 .gpu_is_lockup = &r300_gpu_is_lockup,
Jerome Glissea2d07b72010-03-09 14:45:11 +0000408 .asic_reset = &r300_asic_reset,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000409 .gart_tlb_flush = &rv370_pcie_gart_tlb_flush,
410 .gart_set_page = &rv370_pcie_gart_set_page,
Christian König4c87bc22011-10-19 19:02:21 +0200411 .ring = {
412 [RADEON_RING_TYPE_GFX_INDEX] = {
413 .ib_execute = &r100_ring_ib_execute,
414 .emit_fence = &r300_fence_ring_emit,
415 .emit_semaphore = &r100_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +0100416 .cs_parse = &r300_cs_parse,
Alex Deucherf7128122012-02-23 17:53:45 -0500417 .ring_start = &r300_ring_start,
418 .ring_test = &r100_ring_test,
419 .ib_test = &r100_ib_test,
Christian König4c87bc22011-10-19 19:02:21 +0200420 }
421 },
Alex Deucherb35ea4a2012-02-23 17:53:43 -0500422 .irq = {
423 .set = &r100_irq_set,
424 .process = &r100_irq_process,
425 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000426 .get_vblank_counter = &r100_get_vblank_counter,
Alex Deucher27cd7762012-02-23 17:53:42 -0500427 .copy = {
428 .blit = &r100_copy_blit,
429 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
430 .dma = &r200_copy_dma,
431 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
432 .copy = &r100_copy_blit,
433 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
434 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000435 .get_engine_clock = &radeon_atom_get_engine_clock,
436 .set_engine_clock = &radeon_atom_set_engine_clock,
437 .get_memory_clock = &radeon_atom_get_memory_clock,
438 .set_memory_clock = &radeon_atom_set_memory_clock,
439 .get_pcie_lanes = &rv370_get_pcie_lanes,
440 .set_pcie_lanes = &rv370_set_pcie_lanes,
441 .set_clock_gating = &radeon_atom_set_clock_gating,
442 .set_surface_reg = r100_set_surface_reg,
443 .clear_surface_reg = r100_clear_surface_reg,
444 .bandwidth_update = &r100_bandwidth_update,
Alex Deucher901ea572012-02-23 17:53:39 -0500445 .hpd = {
446 .init = &r100_hpd_init,
447 .fini = &r100_hpd_fini,
448 .sense = &r100_hpd_sense,
449 .set_polarity = &r100_hpd_set_polarity,
450 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000451 .ioctl_wait_idle = NULL,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400452 .gui_idle = &r100_gui_idle,
Alex Deuchera02fa392012-02-23 17:53:41 -0500453 .pm = {
454 .misc = &r100_pm_misc,
455 .prepare = &r100_pm_prepare,
456 .finish = &r100_pm_finish,
457 .init_profile = &r420_pm_init_profile,
458 .get_dynpm_state = &r100_pm_get_dynpm_state,
459 },
Alex Deucher0f9e0062012-02-23 17:53:40 -0500460 .pflip = {
461 .pre_page_flip = &r100_pre_page_flip,
462 .page_flip = &r100_page_flip,
463 .post_page_flip = &r100_post_page_flip,
464 },
Alex Deucher3ae19b72012-02-23 17:53:37 -0500465 .wait_for_vblank = &r100_wait_for_vblank,
Alex Deucher89e51812012-02-23 17:53:38 -0500466 .mc_wait_for_idle = &r300_mc_wait_for_idle,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000467};
468
469static struct radeon_asic rs400_asic = {
470 .init = &rs400_init,
471 .fini = &rs400_fini,
472 .suspend = &rs400_suspend,
473 .resume = &rs400_resume,
474 .vga_set_state = &r100_vga_set_state,
Jerome Glisse225758d2010-03-09 14:45:10 +0000475 .gpu_is_lockup = &r300_gpu_is_lockup,
Jerome Glissea2d07b72010-03-09 14:45:11 +0000476 .asic_reset = &r300_asic_reset,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000477 .gart_tlb_flush = &rs400_gart_tlb_flush,
478 .gart_set_page = &rs400_gart_set_page,
Christian König4c87bc22011-10-19 19:02:21 +0200479 .ring = {
480 [RADEON_RING_TYPE_GFX_INDEX] = {
481 .ib_execute = &r100_ring_ib_execute,
482 .emit_fence = &r300_fence_ring_emit,
483 .emit_semaphore = &r100_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +0100484 .cs_parse = &r300_cs_parse,
Alex Deucherf7128122012-02-23 17:53:45 -0500485 .ring_start = &r300_ring_start,
486 .ring_test = &r100_ring_test,
487 .ib_test = &r100_ib_test,
Christian König4c87bc22011-10-19 19:02:21 +0200488 }
489 },
Alex Deucherb35ea4a2012-02-23 17:53:43 -0500490 .irq = {
491 .set = &r100_irq_set,
492 .process = &r100_irq_process,
493 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000494 .get_vblank_counter = &r100_get_vblank_counter,
Alex Deucher27cd7762012-02-23 17:53:42 -0500495 .copy = {
496 .blit = &r100_copy_blit,
497 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
498 .dma = &r200_copy_dma,
499 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
500 .copy = &r100_copy_blit,
501 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
502 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000503 .get_engine_clock = &radeon_legacy_get_engine_clock,
504 .set_engine_clock = &radeon_legacy_set_engine_clock,
505 .get_memory_clock = &radeon_legacy_get_memory_clock,
506 .set_memory_clock = NULL,
507 .get_pcie_lanes = NULL,
508 .set_pcie_lanes = NULL,
509 .set_clock_gating = &radeon_legacy_set_clock_gating,
510 .set_surface_reg = r100_set_surface_reg,
511 .clear_surface_reg = r100_clear_surface_reg,
512 .bandwidth_update = &r100_bandwidth_update,
Alex Deucher901ea572012-02-23 17:53:39 -0500513 .hpd = {
514 .init = &r100_hpd_init,
515 .fini = &r100_hpd_fini,
516 .sense = &r100_hpd_sense,
517 .set_polarity = &r100_hpd_set_polarity,
518 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000519 .ioctl_wait_idle = NULL,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400520 .gui_idle = &r100_gui_idle,
Alex Deuchera02fa392012-02-23 17:53:41 -0500521 .pm = {
522 .misc = &r100_pm_misc,
523 .prepare = &r100_pm_prepare,
524 .finish = &r100_pm_finish,
525 .init_profile = &r100_pm_init_profile,
526 .get_dynpm_state = &r100_pm_get_dynpm_state,
527 },
Alex Deucher0f9e0062012-02-23 17:53:40 -0500528 .pflip = {
529 .pre_page_flip = &r100_pre_page_flip,
530 .page_flip = &r100_page_flip,
531 .post_page_flip = &r100_post_page_flip,
532 },
Alex Deucher3ae19b72012-02-23 17:53:37 -0500533 .wait_for_vblank = &r100_wait_for_vblank,
Alex Deucher89e51812012-02-23 17:53:38 -0500534 .mc_wait_for_idle = &rs400_mc_wait_for_idle,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000535};
536
537static struct radeon_asic rs600_asic = {
538 .init = &rs600_init,
539 .fini = &rs600_fini,
540 .suspend = &rs600_suspend,
541 .resume = &rs600_resume,
542 .vga_set_state = &r100_vga_set_state,
Jerome Glisse225758d2010-03-09 14:45:10 +0000543 .gpu_is_lockup = &r300_gpu_is_lockup,
Jerome Glisse90aca4d2010-03-09 14:45:12 +0000544 .asic_reset = &rs600_asic_reset,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000545 .gart_tlb_flush = &rs600_gart_tlb_flush,
546 .gart_set_page = &rs600_gart_set_page,
Christian König4c87bc22011-10-19 19:02:21 +0200547 .ring = {
548 [RADEON_RING_TYPE_GFX_INDEX] = {
549 .ib_execute = &r100_ring_ib_execute,
550 .emit_fence = &r300_fence_ring_emit,
551 .emit_semaphore = &r100_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +0100552 .cs_parse = &r300_cs_parse,
Alex Deucherf7128122012-02-23 17:53:45 -0500553 .ring_start = &r300_ring_start,
554 .ring_test = &r100_ring_test,
555 .ib_test = &r100_ib_test,
Christian König4c87bc22011-10-19 19:02:21 +0200556 }
557 },
Alex Deucherb35ea4a2012-02-23 17:53:43 -0500558 .irq = {
559 .set = &rs600_irq_set,
560 .process = &rs600_irq_process,
561 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000562 .get_vblank_counter = &rs600_get_vblank_counter,
Alex Deucher27cd7762012-02-23 17:53:42 -0500563 .copy = {
564 .blit = &r100_copy_blit,
565 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
566 .dma = &r200_copy_dma,
567 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
568 .copy = &r100_copy_blit,
569 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
570 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000571 .get_engine_clock = &radeon_atom_get_engine_clock,
572 .set_engine_clock = &radeon_atom_set_engine_clock,
573 .get_memory_clock = &radeon_atom_get_memory_clock,
574 .set_memory_clock = &radeon_atom_set_memory_clock,
575 .get_pcie_lanes = NULL,
576 .set_pcie_lanes = NULL,
577 .set_clock_gating = &radeon_atom_set_clock_gating,
578 .set_surface_reg = r100_set_surface_reg,
579 .clear_surface_reg = r100_clear_surface_reg,
580 .bandwidth_update = &rs600_bandwidth_update,
Alex Deucher901ea572012-02-23 17:53:39 -0500581 .hpd = {
582 .init = &rs600_hpd_init,
583 .fini = &rs600_hpd_fini,
584 .sense = &rs600_hpd_sense,
585 .set_polarity = &rs600_hpd_set_polarity,
586 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000587 .ioctl_wait_idle = NULL,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400588 .gui_idle = &r100_gui_idle,
Alex Deuchera02fa392012-02-23 17:53:41 -0500589 .pm = {
590 .misc = &rs600_pm_misc,
591 .prepare = &rs600_pm_prepare,
592 .finish = &rs600_pm_finish,
593 .init_profile = &r420_pm_init_profile,
594 .get_dynpm_state = &r100_pm_get_dynpm_state,
595 },
Alex Deucher0f9e0062012-02-23 17:53:40 -0500596 .pflip = {
597 .pre_page_flip = &rs600_pre_page_flip,
598 .page_flip = &rs600_page_flip,
599 .post_page_flip = &rs600_post_page_flip,
600 },
Alex Deucher3ae19b72012-02-23 17:53:37 -0500601 .wait_for_vblank = &avivo_wait_for_vblank,
Alex Deucher89e51812012-02-23 17:53:38 -0500602 .mc_wait_for_idle = &rs600_mc_wait_for_idle,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000603};
604
605static struct radeon_asic rs690_asic = {
606 .init = &rs690_init,
607 .fini = &rs690_fini,
608 .suspend = &rs690_suspend,
609 .resume = &rs690_resume,
610 .vga_set_state = &r100_vga_set_state,
Jerome Glisse225758d2010-03-09 14:45:10 +0000611 .gpu_is_lockup = &r300_gpu_is_lockup,
Jerome Glisse90aca4d2010-03-09 14:45:12 +0000612 .asic_reset = &rs600_asic_reset,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000613 .gart_tlb_flush = &rs400_gart_tlb_flush,
614 .gart_set_page = &rs400_gart_set_page,
Christian König4c87bc22011-10-19 19:02:21 +0200615 .ring = {
616 [RADEON_RING_TYPE_GFX_INDEX] = {
617 .ib_execute = &r100_ring_ib_execute,
618 .emit_fence = &r300_fence_ring_emit,
619 .emit_semaphore = &r100_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +0100620 .cs_parse = &r300_cs_parse,
Alex Deucherf7128122012-02-23 17:53:45 -0500621 .ring_start = &r300_ring_start,
622 .ring_test = &r100_ring_test,
623 .ib_test = &r100_ib_test,
Christian König4c87bc22011-10-19 19:02:21 +0200624 }
625 },
Alex Deucherb35ea4a2012-02-23 17:53:43 -0500626 .irq = {
627 .set = &rs600_irq_set,
628 .process = &rs600_irq_process,
629 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000630 .get_vblank_counter = &rs600_get_vblank_counter,
Alex Deucher27cd7762012-02-23 17:53:42 -0500631 .copy = {
632 .blit = &r100_copy_blit,
633 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
634 .dma = &r200_copy_dma,
635 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
636 .copy = &r200_copy_dma,
637 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
638 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000639 .get_engine_clock = &radeon_atom_get_engine_clock,
640 .set_engine_clock = &radeon_atom_set_engine_clock,
641 .get_memory_clock = &radeon_atom_get_memory_clock,
642 .set_memory_clock = &radeon_atom_set_memory_clock,
643 .get_pcie_lanes = NULL,
644 .set_pcie_lanes = NULL,
645 .set_clock_gating = &radeon_atom_set_clock_gating,
646 .set_surface_reg = r100_set_surface_reg,
647 .clear_surface_reg = r100_clear_surface_reg,
648 .bandwidth_update = &rs690_bandwidth_update,
Alex Deucher901ea572012-02-23 17:53:39 -0500649 .hpd = {
650 .init = &rs600_hpd_init,
651 .fini = &rs600_hpd_fini,
652 .sense = &rs600_hpd_sense,
653 .set_polarity = &rs600_hpd_set_polarity,
654 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000655 .ioctl_wait_idle = NULL,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400656 .gui_idle = &r100_gui_idle,
Alex Deuchera02fa392012-02-23 17:53:41 -0500657 .pm = {
658 .misc = &rs600_pm_misc,
659 .prepare = &rs600_pm_prepare,
660 .finish = &rs600_pm_finish,
661 .init_profile = &r420_pm_init_profile,
662 .get_dynpm_state = &r100_pm_get_dynpm_state,
663 },
Alex Deucher0f9e0062012-02-23 17:53:40 -0500664 .pflip = {
665 .pre_page_flip = &rs600_pre_page_flip,
666 .page_flip = &rs600_page_flip,
667 .post_page_flip = &rs600_post_page_flip,
668 },
Alex Deucher3ae19b72012-02-23 17:53:37 -0500669 .wait_for_vblank = &avivo_wait_for_vblank,
Alex Deucher89e51812012-02-23 17:53:38 -0500670 .mc_wait_for_idle = &rs690_mc_wait_for_idle,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000671};
672
673static struct radeon_asic rv515_asic = {
674 .init = &rv515_init,
675 .fini = &rv515_fini,
676 .suspend = &rv515_suspend,
677 .resume = &rv515_resume,
678 .vga_set_state = &r100_vga_set_state,
Jerome Glisse225758d2010-03-09 14:45:10 +0000679 .gpu_is_lockup = &r300_gpu_is_lockup,
Jerome Glisse90aca4d2010-03-09 14:45:12 +0000680 .asic_reset = &rs600_asic_reset,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000681 .gart_tlb_flush = &rv370_pcie_gart_tlb_flush,
682 .gart_set_page = &rv370_pcie_gart_set_page,
Christian König4c87bc22011-10-19 19:02:21 +0200683 .ring = {
684 [RADEON_RING_TYPE_GFX_INDEX] = {
685 .ib_execute = &r100_ring_ib_execute,
686 .emit_fence = &r300_fence_ring_emit,
687 .emit_semaphore = &r100_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +0100688 .cs_parse = &r300_cs_parse,
Alex Deucherf7128122012-02-23 17:53:45 -0500689 .ring_start = &rv515_ring_start,
690 .ring_test = &r100_ring_test,
691 .ib_test = &r100_ib_test,
Christian König4c87bc22011-10-19 19:02:21 +0200692 }
693 },
Alex Deucherb35ea4a2012-02-23 17:53:43 -0500694 .irq = {
695 .set = &rs600_irq_set,
696 .process = &rs600_irq_process,
697 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000698 .get_vblank_counter = &rs600_get_vblank_counter,
Alex Deucher27cd7762012-02-23 17:53:42 -0500699 .copy = {
700 .blit = &r100_copy_blit,
701 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
702 .dma = &r200_copy_dma,
703 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
704 .copy = &r100_copy_blit,
705 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
706 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000707 .get_engine_clock = &radeon_atom_get_engine_clock,
708 .set_engine_clock = &radeon_atom_set_engine_clock,
709 .get_memory_clock = &radeon_atom_get_memory_clock,
710 .set_memory_clock = &radeon_atom_set_memory_clock,
711 .get_pcie_lanes = &rv370_get_pcie_lanes,
712 .set_pcie_lanes = &rv370_set_pcie_lanes,
713 .set_clock_gating = &radeon_atom_set_clock_gating,
714 .set_surface_reg = r100_set_surface_reg,
715 .clear_surface_reg = r100_clear_surface_reg,
716 .bandwidth_update = &rv515_bandwidth_update,
Alex Deucher901ea572012-02-23 17:53:39 -0500717 .hpd = {
718 .init = &rs600_hpd_init,
719 .fini = &rs600_hpd_fini,
720 .sense = &rs600_hpd_sense,
721 .set_polarity = &rs600_hpd_set_polarity,
722 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000723 .ioctl_wait_idle = NULL,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400724 .gui_idle = &r100_gui_idle,
Alex Deuchera02fa392012-02-23 17:53:41 -0500725 .pm = {
726 .misc = &rs600_pm_misc,
727 .prepare = &rs600_pm_prepare,
728 .finish = &rs600_pm_finish,
729 .init_profile = &r420_pm_init_profile,
730 .get_dynpm_state = &r100_pm_get_dynpm_state,
731 },
Alex Deucher0f9e0062012-02-23 17:53:40 -0500732 .pflip = {
733 .pre_page_flip = &rs600_pre_page_flip,
734 .page_flip = &rs600_page_flip,
735 .post_page_flip = &rs600_post_page_flip,
736 },
Alex Deucher3ae19b72012-02-23 17:53:37 -0500737 .wait_for_vblank = &avivo_wait_for_vblank,
Alex Deucher89e51812012-02-23 17:53:38 -0500738 .mc_wait_for_idle = &rv515_mc_wait_for_idle,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000739};
740
741static struct radeon_asic r520_asic = {
742 .init = &r520_init,
743 .fini = &rv515_fini,
744 .suspend = &rv515_suspend,
745 .resume = &r520_resume,
746 .vga_set_state = &r100_vga_set_state,
Jerome Glisse225758d2010-03-09 14:45:10 +0000747 .gpu_is_lockup = &r300_gpu_is_lockup,
Jerome Glisse90aca4d2010-03-09 14:45:12 +0000748 .asic_reset = &rs600_asic_reset,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000749 .gart_tlb_flush = &rv370_pcie_gart_tlb_flush,
750 .gart_set_page = &rv370_pcie_gart_set_page,
Christian König4c87bc22011-10-19 19:02:21 +0200751 .ring = {
752 [RADEON_RING_TYPE_GFX_INDEX] = {
753 .ib_execute = &r100_ring_ib_execute,
754 .emit_fence = &r300_fence_ring_emit,
755 .emit_semaphore = &r100_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +0100756 .cs_parse = &r300_cs_parse,
Alex Deucherf7128122012-02-23 17:53:45 -0500757 .ring_start = &rv515_ring_start,
758 .ring_test = &r100_ring_test,
759 .ib_test = &r100_ib_test,
Christian König4c87bc22011-10-19 19:02:21 +0200760 }
761 },
Alex Deucherb35ea4a2012-02-23 17:53:43 -0500762 .irq = {
763 .set = &rs600_irq_set,
764 .process = &rs600_irq_process,
765 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000766 .get_vblank_counter = &rs600_get_vblank_counter,
Alex Deucher27cd7762012-02-23 17:53:42 -0500767 .copy = {
768 .blit = &r100_copy_blit,
769 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
770 .dma = &r200_copy_dma,
771 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
772 .copy = &r100_copy_blit,
773 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
774 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000775 .get_engine_clock = &radeon_atom_get_engine_clock,
776 .set_engine_clock = &radeon_atom_set_engine_clock,
777 .get_memory_clock = &radeon_atom_get_memory_clock,
778 .set_memory_clock = &radeon_atom_set_memory_clock,
779 .get_pcie_lanes = &rv370_get_pcie_lanes,
780 .set_pcie_lanes = &rv370_set_pcie_lanes,
781 .set_clock_gating = &radeon_atom_set_clock_gating,
782 .set_surface_reg = r100_set_surface_reg,
783 .clear_surface_reg = r100_clear_surface_reg,
784 .bandwidth_update = &rv515_bandwidth_update,
Alex Deucher901ea572012-02-23 17:53:39 -0500785 .hpd = {
786 .init = &rs600_hpd_init,
787 .fini = &rs600_hpd_fini,
788 .sense = &rs600_hpd_sense,
789 .set_polarity = &rs600_hpd_set_polarity,
790 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000791 .ioctl_wait_idle = NULL,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400792 .gui_idle = &r100_gui_idle,
Alex Deuchera02fa392012-02-23 17:53:41 -0500793 .pm = {
794 .misc = &rs600_pm_misc,
795 .prepare = &rs600_pm_prepare,
796 .finish = &rs600_pm_finish,
797 .init_profile = &r420_pm_init_profile,
798 .get_dynpm_state = &r100_pm_get_dynpm_state,
799 },
Alex Deucher0f9e0062012-02-23 17:53:40 -0500800 .pflip = {
801 .pre_page_flip = &rs600_pre_page_flip,
802 .page_flip = &rs600_page_flip,
803 .post_page_flip = &rs600_post_page_flip,
804 },
Alex Deucher3ae19b72012-02-23 17:53:37 -0500805 .wait_for_vblank = &avivo_wait_for_vblank,
Alex Deucher89e51812012-02-23 17:53:38 -0500806 .mc_wait_for_idle = &r520_mc_wait_for_idle,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000807};
808
809static struct radeon_asic r600_asic = {
810 .init = &r600_init,
811 .fini = &r600_fini,
812 .suspend = &r600_suspend,
813 .resume = &r600_resume,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000814 .vga_set_state = &r600_vga_set_state,
Jerome Glisse225758d2010-03-09 14:45:10 +0000815 .gpu_is_lockup = &r600_gpu_is_lockup,
Jerome Glissea2d07b72010-03-09 14:45:11 +0000816 .asic_reset = &r600_asic_reset,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000817 .gart_tlb_flush = &r600_pcie_gart_tlb_flush,
818 .gart_set_page = &rs600_gart_set_page,
Christian König4c87bc22011-10-19 19:02:21 +0200819 .ring = {
820 [RADEON_RING_TYPE_GFX_INDEX] = {
821 .ib_execute = &r600_ring_ib_execute,
822 .emit_fence = &r600_fence_ring_emit,
823 .emit_semaphore = &r600_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +0100824 .cs_parse = &r600_cs_parse,
Alex Deucherf7128122012-02-23 17:53:45 -0500825 .ring_test = &r600_ring_test,
826 .ib_test = &r600_ib_test,
Christian König4c87bc22011-10-19 19:02:21 +0200827 }
828 },
Alex Deucherb35ea4a2012-02-23 17:53:43 -0500829 .irq = {
830 .set = &r600_irq_set,
831 .process = &r600_irq_process,
832 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000833 .get_vblank_counter = &rs600_get_vblank_counter,
Alex Deucher27cd7762012-02-23 17:53:42 -0500834 .copy = {
835 .blit = &r600_copy_blit,
836 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
837 .dma = NULL,
838 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
839 .copy = &r600_copy_blit,
840 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
841 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000842 .get_engine_clock = &radeon_atom_get_engine_clock,
843 .set_engine_clock = &radeon_atom_set_engine_clock,
844 .get_memory_clock = &radeon_atom_get_memory_clock,
845 .set_memory_clock = &radeon_atom_set_memory_clock,
Alex Deucher3313e3d2011-01-06 18:49:34 -0500846 .get_pcie_lanes = &r600_get_pcie_lanes,
847 .set_pcie_lanes = &r600_set_pcie_lanes,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000848 .set_clock_gating = NULL,
849 .set_surface_reg = r600_set_surface_reg,
850 .clear_surface_reg = r600_clear_surface_reg,
851 .bandwidth_update = &rv515_bandwidth_update,
Alex Deucher901ea572012-02-23 17:53:39 -0500852 .hpd = {
853 .init = &r600_hpd_init,
854 .fini = &r600_hpd_fini,
855 .sense = &r600_hpd_sense,
856 .set_polarity = &r600_hpd_set_polarity,
857 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000858 .ioctl_wait_idle = r600_ioctl_wait_idle,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400859 .gui_idle = &r600_gui_idle,
Alex Deuchera02fa392012-02-23 17:53:41 -0500860 .pm = {
861 .misc = &r600_pm_misc,
862 .prepare = &rs600_pm_prepare,
863 .finish = &rs600_pm_finish,
864 .init_profile = &r600_pm_init_profile,
865 .get_dynpm_state = &r600_pm_get_dynpm_state,
866 },
Alex Deucher0f9e0062012-02-23 17:53:40 -0500867 .pflip = {
868 .pre_page_flip = &rs600_pre_page_flip,
869 .page_flip = &rs600_page_flip,
870 .post_page_flip = &rs600_post_page_flip,
871 },
Alex Deucher3ae19b72012-02-23 17:53:37 -0500872 .wait_for_vblank = &avivo_wait_for_vblank,
Alex Deucher89e51812012-02-23 17:53:38 -0500873 .mc_wait_for_idle = &r600_mc_wait_for_idle,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000874};
875
Alex Deucherf47299c2010-03-16 20:54:38 -0400876static struct radeon_asic rs780_asic = {
877 .init = &r600_init,
878 .fini = &r600_fini,
879 .suspend = &r600_suspend,
880 .resume = &r600_resume,
Jerome Glisse90aca4d2010-03-09 14:45:12 +0000881 .gpu_is_lockup = &r600_gpu_is_lockup,
Alex Deucherf47299c2010-03-16 20:54:38 -0400882 .vga_set_state = &r600_vga_set_state,
Jerome Glissea2d07b72010-03-09 14:45:11 +0000883 .asic_reset = &r600_asic_reset,
Alex Deucherf47299c2010-03-16 20:54:38 -0400884 .gart_tlb_flush = &r600_pcie_gart_tlb_flush,
885 .gart_set_page = &rs600_gart_set_page,
Christian König4c87bc22011-10-19 19:02:21 +0200886 .ring = {
887 [RADEON_RING_TYPE_GFX_INDEX] = {
888 .ib_execute = &r600_ring_ib_execute,
889 .emit_fence = &r600_fence_ring_emit,
890 .emit_semaphore = &r600_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +0100891 .cs_parse = &r600_cs_parse,
Alex Deucherf7128122012-02-23 17:53:45 -0500892 .ring_test = &r600_ring_test,
893 .ib_test = &r600_ib_test,
Christian König4c87bc22011-10-19 19:02:21 +0200894 }
895 },
Alex Deucherb35ea4a2012-02-23 17:53:43 -0500896 .irq = {
897 .set = &r600_irq_set,
898 .process = &r600_irq_process,
899 },
Alex Deucherf47299c2010-03-16 20:54:38 -0400900 .get_vblank_counter = &rs600_get_vblank_counter,
Alex Deucher27cd7762012-02-23 17:53:42 -0500901 .copy = {
902 .blit = &r600_copy_blit,
903 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
904 .dma = NULL,
905 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
906 .copy = &r600_copy_blit,
907 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
908 },
Alex Deucherf47299c2010-03-16 20:54:38 -0400909 .get_engine_clock = &radeon_atom_get_engine_clock,
910 .set_engine_clock = &radeon_atom_set_engine_clock,
911 .get_memory_clock = NULL,
912 .set_memory_clock = NULL,
913 .get_pcie_lanes = NULL,
914 .set_pcie_lanes = NULL,
915 .set_clock_gating = NULL,
916 .set_surface_reg = r600_set_surface_reg,
917 .clear_surface_reg = r600_clear_surface_reg,
918 .bandwidth_update = &rs690_bandwidth_update,
Alex Deucher901ea572012-02-23 17:53:39 -0500919 .hpd = {
920 .init = &r600_hpd_init,
921 .fini = &r600_hpd_fini,
922 .sense = &r600_hpd_sense,
923 .set_polarity = &r600_hpd_set_polarity,
924 },
Alex Deucherf47299c2010-03-16 20:54:38 -0400925 .ioctl_wait_idle = r600_ioctl_wait_idle,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400926 .gui_idle = &r600_gui_idle,
Alex Deuchera02fa392012-02-23 17:53:41 -0500927 .pm = {
928 .misc = &r600_pm_misc,
929 .prepare = &rs600_pm_prepare,
930 .finish = &rs600_pm_finish,
931 .init_profile = &rs780_pm_init_profile,
932 .get_dynpm_state = &r600_pm_get_dynpm_state,
933 },
Alex Deucher0f9e0062012-02-23 17:53:40 -0500934 .pflip = {
935 .pre_page_flip = &rs600_pre_page_flip,
936 .page_flip = &rs600_page_flip,
937 .post_page_flip = &rs600_post_page_flip,
938 },
Alex Deucher3ae19b72012-02-23 17:53:37 -0500939 .wait_for_vblank = &avivo_wait_for_vblank,
Alex Deucher89e51812012-02-23 17:53:38 -0500940 .mc_wait_for_idle = &r600_mc_wait_for_idle,
Alex Deucherf47299c2010-03-16 20:54:38 -0400941};
942
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000943static struct radeon_asic rv770_asic = {
944 .init = &rv770_init,
945 .fini = &rv770_fini,
946 .suspend = &rv770_suspend,
947 .resume = &rv770_resume,
Jerome Glissea2d07b72010-03-09 14:45:11 +0000948 .asic_reset = &r600_asic_reset,
Jerome Glisse225758d2010-03-09 14:45:10 +0000949 .gpu_is_lockup = &r600_gpu_is_lockup,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000950 .vga_set_state = &r600_vga_set_state,
951 .gart_tlb_flush = &r600_pcie_gart_tlb_flush,
952 .gart_set_page = &rs600_gart_set_page,
Christian König4c87bc22011-10-19 19:02:21 +0200953 .ring = {
954 [RADEON_RING_TYPE_GFX_INDEX] = {
955 .ib_execute = &r600_ring_ib_execute,
956 .emit_fence = &r600_fence_ring_emit,
957 .emit_semaphore = &r600_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +0100958 .cs_parse = &r600_cs_parse,
Alex Deucherf7128122012-02-23 17:53:45 -0500959 .ring_test = &r600_ring_test,
960 .ib_test = &r600_ib_test,
Christian König4c87bc22011-10-19 19:02:21 +0200961 }
962 },
Alex Deucherb35ea4a2012-02-23 17:53:43 -0500963 .irq = {
964 .set = &r600_irq_set,
965 .process = &r600_irq_process,
966 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000967 .get_vblank_counter = &rs600_get_vblank_counter,
Alex Deucher27cd7762012-02-23 17:53:42 -0500968 .copy = {
969 .blit = &r600_copy_blit,
970 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
971 .dma = NULL,
972 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
973 .copy = &r600_copy_blit,
974 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
975 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000976 .get_engine_clock = &radeon_atom_get_engine_clock,
977 .set_engine_clock = &radeon_atom_set_engine_clock,
978 .get_memory_clock = &radeon_atom_get_memory_clock,
979 .set_memory_clock = &radeon_atom_set_memory_clock,
Alex Deucher3313e3d2011-01-06 18:49:34 -0500980 .get_pcie_lanes = &r600_get_pcie_lanes,
981 .set_pcie_lanes = &r600_set_pcie_lanes,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000982 .set_clock_gating = &radeon_atom_set_clock_gating,
983 .set_surface_reg = r600_set_surface_reg,
984 .clear_surface_reg = r600_clear_surface_reg,
985 .bandwidth_update = &rv515_bandwidth_update,
Alex Deucher901ea572012-02-23 17:53:39 -0500986 .hpd = {
987 .init = &r600_hpd_init,
988 .fini = &r600_hpd_fini,
989 .sense = &r600_hpd_sense,
990 .set_polarity = &r600_hpd_set_polarity,
991 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000992 .ioctl_wait_idle = r600_ioctl_wait_idle,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400993 .gui_idle = &r600_gui_idle,
Alex Deuchera02fa392012-02-23 17:53:41 -0500994 .pm = {
995 .misc = &rv770_pm_misc,
996 .prepare = &rs600_pm_prepare,
997 .finish = &rs600_pm_finish,
998 .init_profile = &r600_pm_init_profile,
999 .get_dynpm_state = &r600_pm_get_dynpm_state,
1000 },
Alex Deucher0f9e0062012-02-23 17:53:40 -05001001 .pflip = {
1002 .pre_page_flip = &rs600_pre_page_flip,
1003 .page_flip = &rv770_page_flip,
1004 .post_page_flip = &rs600_post_page_flip,
1005 },
Alex Deucher3ae19b72012-02-23 17:53:37 -05001006 .wait_for_vblank = &avivo_wait_for_vblank,
Alex Deucher89e51812012-02-23 17:53:38 -05001007 .mc_wait_for_idle = &r600_mc_wait_for_idle,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +00001008};
1009
1010static struct radeon_asic evergreen_asic = {
1011 .init = &evergreen_init,
1012 .fini = &evergreen_fini,
1013 .suspend = &evergreen_suspend,
1014 .resume = &evergreen_resume,
Jerome Glisse225758d2010-03-09 14:45:10 +00001015 .gpu_is_lockup = &evergreen_gpu_is_lockup,
Jerome Glissea2d07b72010-03-09 14:45:11 +00001016 .asic_reset = &evergreen_asic_reset,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +00001017 .vga_set_state = &r600_vga_set_state,
Alex Deucher0fcdb612010-03-24 13:20:41 -04001018 .gart_tlb_flush = &evergreen_pcie_gart_tlb_flush,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +00001019 .gart_set_page = &rs600_gart_set_page,
Christian König4c87bc22011-10-19 19:02:21 +02001020 .ring = {
1021 [RADEON_RING_TYPE_GFX_INDEX] = {
1022 .ib_execute = &evergreen_ring_ib_execute,
1023 .emit_fence = &r600_fence_ring_emit,
1024 .emit_semaphore = &r600_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +01001025 .cs_parse = &evergreen_cs_parse,
Alex Deucherf7128122012-02-23 17:53:45 -05001026 .ring_test = &r600_ring_test,
1027 .ib_test = &r600_ib_test,
Christian König4c87bc22011-10-19 19:02:21 +02001028 }
1029 },
Alex Deucherb35ea4a2012-02-23 17:53:43 -05001030 .irq = {
1031 .set = &evergreen_irq_set,
1032 .process = &evergreen_irq_process,
1033 },
Alex Deucher45f9a392010-03-24 13:55:51 -04001034 .get_vblank_counter = &evergreen_get_vblank_counter,
Alex Deucher27cd7762012-02-23 17:53:42 -05001035 .copy = {
1036 .blit = &r600_copy_blit,
1037 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1038 .dma = NULL,
1039 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1040 .copy = &r600_copy_blit,
1041 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1042 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +00001043 .get_engine_clock = &radeon_atom_get_engine_clock,
1044 .set_engine_clock = &radeon_atom_set_engine_clock,
1045 .get_memory_clock = &radeon_atom_get_memory_clock,
1046 .set_memory_clock = &radeon_atom_set_memory_clock,
Alex Deucher3313e3d2011-01-06 18:49:34 -05001047 .get_pcie_lanes = &r600_get_pcie_lanes,
1048 .set_pcie_lanes = &r600_set_pcie_lanes,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +00001049 .set_clock_gating = NULL,
1050 .set_surface_reg = r600_set_surface_reg,
1051 .clear_surface_reg = r600_clear_surface_reg,
1052 .bandwidth_update = &evergreen_bandwidth_update,
Alex Deucher901ea572012-02-23 17:53:39 -05001053 .hpd = {
1054 .init = &evergreen_hpd_init,
1055 .fini = &evergreen_hpd_fini,
1056 .sense = &evergreen_hpd_sense,
1057 .set_polarity = &evergreen_hpd_set_polarity,
1058 },
Dave Airlie97bfd0a2011-05-19 14:14:43 +10001059 .ioctl_wait_idle = r600_ioctl_wait_idle,
Alex Deucherdef9ba92010-04-22 12:39:58 -04001060 .gui_idle = &r600_gui_idle,
Alex Deuchera02fa392012-02-23 17:53:41 -05001061 .pm = {
1062 .misc = &evergreen_pm_misc,
1063 .prepare = &evergreen_pm_prepare,
1064 .finish = &evergreen_pm_finish,
1065 .init_profile = &r600_pm_init_profile,
1066 .get_dynpm_state = &r600_pm_get_dynpm_state,
1067 },
Alex Deucher0f9e0062012-02-23 17:53:40 -05001068 .pflip = {
1069 .pre_page_flip = &evergreen_pre_page_flip,
1070 .page_flip = &evergreen_page_flip,
1071 .post_page_flip = &evergreen_post_page_flip,
1072 },
Alex Deucher3ae19b72012-02-23 17:53:37 -05001073 .wait_for_vblank = &dce4_wait_for_vblank,
Alex Deucher89e51812012-02-23 17:53:38 -05001074 .mc_wait_for_idle = &evergreen_mc_wait_for_idle,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +00001075};
1076
Alex Deucher958261d2010-11-22 17:56:30 -05001077static struct radeon_asic sumo_asic = {
1078 .init = &evergreen_init,
1079 .fini = &evergreen_fini,
1080 .suspend = &evergreen_suspend,
1081 .resume = &evergreen_resume,
Alex Deucher958261d2010-11-22 17:56:30 -05001082 .gpu_is_lockup = &evergreen_gpu_is_lockup,
1083 .asic_reset = &evergreen_asic_reset,
1084 .vga_set_state = &r600_vga_set_state,
1085 .gart_tlb_flush = &evergreen_pcie_gart_tlb_flush,
1086 .gart_set_page = &rs600_gart_set_page,
Christian König4c87bc22011-10-19 19:02:21 +02001087 .ring = {
1088 [RADEON_RING_TYPE_GFX_INDEX] = {
1089 .ib_execute = &evergreen_ring_ib_execute,
1090 .emit_fence = &r600_fence_ring_emit,
1091 .emit_semaphore = &r600_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +01001092 .cs_parse = &evergreen_cs_parse,
Alex Deucherf7128122012-02-23 17:53:45 -05001093 .ring_test = &r600_ring_test,
1094 .ib_test = &r600_ib_test,
Christian Königeb0c19c2012-02-23 15:18:44 +01001095 },
Christian König4c87bc22011-10-19 19:02:21 +02001096 },
Alex Deucherb35ea4a2012-02-23 17:53:43 -05001097 .irq = {
1098 .set = &evergreen_irq_set,
1099 .process = &evergreen_irq_process,
1100 },
Alex Deucher958261d2010-11-22 17:56:30 -05001101 .get_vblank_counter = &evergreen_get_vblank_counter,
Alex Deucher27cd7762012-02-23 17:53:42 -05001102 .copy = {
1103 .blit = &r600_copy_blit,
1104 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1105 .dma = NULL,
1106 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1107 .copy = &r600_copy_blit,
1108 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1109 },
Alex Deucher958261d2010-11-22 17:56:30 -05001110 .get_engine_clock = &radeon_atom_get_engine_clock,
1111 .set_engine_clock = &radeon_atom_set_engine_clock,
1112 .get_memory_clock = NULL,
1113 .set_memory_clock = NULL,
1114 .get_pcie_lanes = NULL,
1115 .set_pcie_lanes = NULL,
1116 .set_clock_gating = NULL,
1117 .set_surface_reg = r600_set_surface_reg,
1118 .clear_surface_reg = r600_clear_surface_reg,
1119 .bandwidth_update = &evergreen_bandwidth_update,
Alex Deucher901ea572012-02-23 17:53:39 -05001120 .hpd = {
1121 .init = &evergreen_hpd_init,
1122 .fini = &evergreen_hpd_fini,
1123 .sense = &evergreen_hpd_sense,
1124 .set_polarity = &evergreen_hpd_set_polarity,
1125 },
Dave Airlie97bfd0a2011-05-19 14:14:43 +10001126 .ioctl_wait_idle = r600_ioctl_wait_idle,
Alex Deucher958261d2010-11-22 17:56:30 -05001127 .gui_idle = &r600_gui_idle,
Alex Deuchera02fa392012-02-23 17:53:41 -05001128 .pm = {
1129 .misc = &evergreen_pm_misc,
1130 .prepare = &evergreen_pm_prepare,
1131 .finish = &evergreen_pm_finish,
1132 .init_profile = &sumo_pm_init_profile,
1133 .get_dynpm_state = &r600_pm_get_dynpm_state,
1134 },
Alex Deucher0f9e0062012-02-23 17:53:40 -05001135 .pflip = {
1136 .pre_page_flip = &evergreen_pre_page_flip,
1137 .page_flip = &evergreen_page_flip,
1138 .post_page_flip = &evergreen_post_page_flip,
1139 },
Alex Deucher3ae19b72012-02-23 17:53:37 -05001140 .wait_for_vblank = &dce4_wait_for_vblank,
Alex Deucher89e51812012-02-23 17:53:38 -05001141 .mc_wait_for_idle = &evergreen_mc_wait_for_idle,
Alex Deucher958261d2010-11-22 17:56:30 -05001142};
1143
Alex Deuchera43b7662011-01-06 21:19:33 -05001144static struct radeon_asic btc_asic = {
1145 .init = &evergreen_init,
1146 .fini = &evergreen_fini,
1147 .suspend = &evergreen_suspend,
1148 .resume = &evergreen_resume,
Alex Deuchera43b7662011-01-06 21:19:33 -05001149 .gpu_is_lockup = &evergreen_gpu_is_lockup,
1150 .asic_reset = &evergreen_asic_reset,
1151 .vga_set_state = &r600_vga_set_state,
1152 .gart_tlb_flush = &evergreen_pcie_gart_tlb_flush,
1153 .gart_set_page = &rs600_gart_set_page,
Christian König4c87bc22011-10-19 19:02:21 +02001154 .ring = {
1155 [RADEON_RING_TYPE_GFX_INDEX] = {
1156 .ib_execute = &evergreen_ring_ib_execute,
1157 .emit_fence = &r600_fence_ring_emit,
1158 .emit_semaphore = &r600_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +01001159 .cs_parse = &evergreen_cs_parse,
Alex Deucherf7128122012-02-23 17:53:45 -05001160 .ring_test = &r600_ring_test,
1161 .ib_test = &r600_ib_test,
Christian König4c87bc22011-10-19 19:02:21 +02001162 }
1163 },
Alex Deucherb35ea4a2012-02-23 17:53:43 -05001164 .irq = {
1165 .set = &evergreen_irq_set,
1166 .process = &evergreen_irq_process,
1167 },
Alex Deuchera43b7662011-01-06 21:19:33 -05001168 .get_vblank_counter = &evergreen_get_vblank_counter,
Alex Deucher27cd7762012-02-23 17:53:42 -05001169 .copy = {
1170 .blit = &r600_copy_blit,
1171 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1172 .dma = NULL,
1173 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1174 .copy = &r600_copy_blit,
1175 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1176 },
Alex Deuchera43b7662011-01-06 21:19:33 -05001177 .get_engine_clock = &radeon_atom_get_engine_clock,
1178 .set_engine_clock = &radeon_atom_set_engine_clock,
1179 .get_memory_clock = &radeon_atom_get_memory_clock,
1180 .set_memory_clock = &radeon_atom_set_memory_clock,
1181 .get_pcie_lanes = NULL,
1182 .set_pcie_lanes = NULL,
1183 .set_clock_gating = NULL,
1184 .set_surface_reg = r600_set_surface_reg,
1185 .clear_surface_reg = r600_clear_surface_reg,
1186 .bandwidth_update = &evergreen_bandwidth_update,
Alex Deucher901ea572012-02-23 17:53:39 -05001187 .hpd = {
1188 .init = &evergreen_hpd_init,
1189 .fini = &evergreen_hpd_fini,
1190 .sense = &evergreen_hpd_sense,
1191 .set_polarity = &evergreen_hpd_set_polarity,
1192 },
Dave Airlie97bfd0a2011-05-19 14:14:43 +10001193 .ioctl_wait_idle = r600_ioctl_wait_idle,
Alex Deuchera43b7662011-01-06 21:19:33 -05001194 .gui_idle = &r600_gui_idle,
Alex Deuchera02fa392012-02-23 17:53:41 -05001195 .pm = {
1196 .misc = &evergreen_pm_misc,
1197 .prepare = &evergreen_pm_prepare,
1198 .finish = &evergreen_pm_finish,
1199 .init_profile = &r600_pm_init_profile,
1200 .get_dynpm_state = &r600_pm_get_dynpm_state,
1201 },
Alex Deucher0f9e0062012-02-23 17:53:40 -05001202 .pflip = {
1203 .pre_page_flip = &evergreen_pre_page_flip,
1204 .page_flip = &evergreen_page_flip,
1205 .post_page_flip = &evergreen_post_page_flip,
1206 },
Alex Deucher3ae19b72012-02-23 17:53:37 -05001207 .wait_for_vblank = &dce4_wait_for_vblank,
Alex Deucher89e51812012-02-23 17:53:38 -05001208 .mc_wait_for_idle = &evergreen_mc_wait_for_idle,
Alex Deuchera43b7662011-01-06 21:19:33 -05001209};
1210
Jerome Glisse721604a2012-01-05 22:11:05 -05001211static const struct radeon_vm_funcs cayman_vm_funcs = {
1212 .init = &cayman_vm_init,
1213 .fini = &cayman_vm_fini,
1214 .bind = &cayman_vm_bind,
1215 .unbind = &cayman_vm_unbind,
1216 .tlb_flush = &cayman_vm_tlb_flush,
1217 .page_flags = &cayman_vm_page_flags,
1218 .set_page = &cayman_vm_set_page,
1219};
1220
Alex Deuchere3487622011-03-02 20:07:36 -05001221static struct radeon_asic cayman_asic = {
1222 .init = &cayman_init,
1223 .fini = &cayman_fini,
1224 .suspend = &cayman_suspend,
1225 .resume = &cayman_resume,
Alex Deuchere3487622011-03-02 20:07:36 -05001226 .gpu_is_lockup = &cayman_gpu_is_lockup,
1227 .asic_reset = &cayman_asic_reset,
1228 .vga_set_state = &r600_vga_set_state,
1229 .gart_tlb_flush = &cayman_pcie_gart_tlb_flush,
1230 .gart_set_page = &rs600_gart_set_page,
Christian König4c87bc22011-10-19 19:02:21 +02001231 .ring = {
1232 [RADEON_RING_TYPE_GFX_INDEX] = {
Jerome Glisse721604a2012-01-05 22:11:05 -05001233 .ib_execute = &cayman_ring_ib_execute,
1234 .ib_parse = &evergreen_ib_parse,
Alex Deucherb40e7e12011-11-17 14:57:50 -05001235 .emit_fence = &cayman_fence_ring_emit,
Christian König4c87bc22011-10-19 19:02:21 +02001236 .emit_semaphore = &r600_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +01001237 .cs_parse = &evergreen_cs_parse,
Alex Deucherf7128122012-02-23 17:53:45 -05001238 .ring_test = &r600_ring_test,
1239 .ib_test = &r600_ib_test,
Christian König4c87bc22011-10-19 19:02:21 +02001240 },
1241 [CAYMAN_RING_TYPE_CP1_INDEX] = {
Jerome Glisse721604a2012-01-05 22:11:05 -05001242 .ib_execute = &cayman_ring_ib_execute,
1243 .ib_parse = &evergreen_ib_parse,
Alex Deucherb40e7e12011-11-17 14:57:50 -05001244 .emit_fence = &cayman_fence_ring_emit,
Christian König4c87bc22011-10-19 19:02:21 +02001245 .emit_semaphore = &r600_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +01001246 .cs_parse = &evergreen_cs_parse,
Alex Deucherf7128122012-02-23 17:53:45 -05001247 .ring_test = &r600_ring_test,
1248 .ib_test = &r600_ib_test,
Christian König4c87bc22011-10-19 19:02:21 +02001249 },
1250 [CAYMAN_RING_TYPE_CP2_INDEX] = {
Jerome Glisse721604a2012-01-05 22:11:05 -05001251 .ib_execute = &cayman_ring_ib_execute,
1252 .ib_parse = &evergreen_ib_parse,
Alex Deucherb40e7e12011-11-17 14:57:50 -05001253 .emit_fence = &cayman_fence_ring_emit,
Christian König4c87bc22011-10-19 19:02:21 +02001254 .emit_semaphore = &r600_semaphore_ring_emit,
Christian Königeb0c19c2012-02-23 15:18:44 +01001255 .cs_parse = &evergreen_cs_parse,
Alex Deucherf7128122012-02-23 17:53:45 -05001256 .ring_test = &r600_ring_test,
1257 .ib_test = &r600_ib_test,
Christian König4c87bc22011-10-19 19:02:21 +02001258 }
1259 },
Alex Deucherb35ea4a2012-02-23 17:53:43 -05001260 .irq = {
1261 .set = &evergreen_irq_set,
1262 .process = &evergreen_irq_process,
1263 },
Alex Deuchere3487622011-03-02 20:07:36 -05001264 .get_vblank_counter = &evergreen_get_vblank_counter,
Alex Deucher27cd7762012-02-23 17:53:42 -05001265 .copy = {
1266 .blit = &r600_copy_blit,
1267 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1268 .dma = NULL,
1269 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1270 .copy = &r600_copy_blit,
1271 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1272 },
Alex Deuchere3487622011-03-02 20:07:36 -05001273 .get_engine_clock = &radeon_atom_get_engine_clock,
1274 .set_engine_clock = &radeon_atom_set_engine_clock,
1275 .get_memory_clock = &radeon_atom_get_memory_clock,
1276 .set_memory_clock = &radeon_atom_set_memory_clock,
1277 .get_pcie_lanes = NULL,
1278 .set_pcie_lanes = NULL,
1279 .set_clock_gating = NULL,
1280 .set_surface_reg = r600_set_surface_reg,
1281 .clear_surface_reg = r600_clear_surface_reg,
1282 .bandwidth_update = &evergreen_bandwidth_update,
Alex Deucher901ea572012-02-23 17:53:39 -05001283 .hpd = {
1284 .init = &evergreen_hpd_init,
1285 .fini = &evergreen_hpd_fini,
1286 .sense = &evergreen_hpd_sense,
1287 .set_polarity = &evergreen_hpd_set_polarity,
1288 },
Dave Airlie97bfd0a2011-05-19 14:14:43 +10001289 .ioctl_wait_idle = r600_ioctl_wait_idle,
Alex Deuchere3487622011-03-02 20:07:36 -05001290 .gui_idle = &r600_gui_idle,
Alex Deuchera02fa392012-02-23 17:53:41 -05001291 .pm = {
1292 .misc = &evergreen_pm_misc,
1293 .prepare = &evergreen_pm_prepare,
1294 .finish = &evergreen_pm_finish,
1295 .init_profile = &r600_pm_init_profile,
1296 .get_dynpm_state = &r600_pm_get_dynpm_state,
1297 },
Alex Deucher0f9e0062012-02-23 17:53:40 -05001298 .pflip = {
1299 .pre_page_flip = &evergreen_pre_page_flip,
1300 .page_flip = &evergreen_page_flip,
1301 .post_page_flip = &evergreen_post_page_flip,
1302 },
Alex Deucher3ae19b72012-02-23 17:53:37 -05001303 .wait_for_vblank = &dce4_wait_for_vblank,
Alex Deucher89e51812012-02-23 17:53:38 -05001304 .mc_wait_for_idle = &evergreen_mc_wait_for_idle,
Alex Deuchere3487622011-03-02 20:07:36 -05001305};
1306
Daniel Vetter0a10c852010-03-11 21:19:14 +00001307int radeon_asic_init(struct radeon_device *rdev)
1308{
1309 radeon_register_accessor_init(rdev);
Alex Deucherba7e05e2011-06-16 18:14:22 +00001310
1311 /* set the number of crtcs */
1312 if (rdev->flags & RADEON_SINGLE_CRTC)
1313 rdev->num_crtc = 1;
1314 else
1315 rdev->num_crtc = 2;
1316
Daniel Vetter0a10c852010-03-11 21:19:14 +00001317 switch (rdev->family) {
1318 case CHIP_R100:
1319 case CHIP_RV100:
1320 case CHIP_RS100:
1321 case CHIP_RV200:
1322 case CHIP_RS200:
1323 rdev->asic = &r100_asic;
1324 break;
1325 case CHIP_R200:
1326 case CHIP_RV250:
1327 case CHIP_RS300:
1328 case CHIP_RV280:
1329 rdev->asic = &r200_asic;
1330 break;
1331 case CHIP_R300:
1332 case CHIP_R350:
1333 case CHIP_RV350:
1334 case CHIP_RV380:
1335 if (rdev->flags & RADEON_IS_PCIE)
1336 rdev->asic = &r300_asic_pcie;
1337 else
1338 rdev->asic = &r300_asic;
1339 break;
1340 case CHIP_R420:
1341 case CHIP_R423:
1342 case CHIP_RV410:
1343 rdev->asic = &r420_asic;
Alex Deucher07bb0842010-06-22 21:58:26 -04001344 /* handle macs */
1345 if (rdev->bios == NULL) {
1346 rdev->asic->get_engine_clock = &radeon_legacy_get_engine_clock;
1347 rdev->asic->set_engine_clock = &radeon_legacy_set_engine_clock;
1348 rdev->asic->get_memory_clock = &radeon_legacy_get_memory_clock;
1349 rdev->asic->set_memory_clock = NULL;
1350 }
Daniel Vetter0a10c852010-03-11 21:19:14 +00001351 break;
1352 case CHIP_RS400:
1353 case CHIP_RS480:
1354 rdev->asic = &rs400_asic;
1355 break;
1356 case CHIP_RS600:
1357 rdev->asic = &rs600_asic;
1358 break;
1359 case CHIP_RS690:
1360 case CHIP_RS740:
1361 rdev->asic = &rs690_asic;
1362 break;
1363 case CHIP_RV515:
1364 rdev->asic = &rv515_asic;
1365 break;
1366 case CHIP_R520:
1367 case CHIP_RV530:
1368 case CHIP_RV560:
1369 case CHIP_RV570:
1370 case CHIP_R580:
1371 rdev->asic = &r520_asic;
1372 break;
1373 case CHIP_R600:
1374 case CHIP_RV610:
1375 case CHIP_RV630:
1376 case CHIP_RV620:
1377 case CHIP_RV635:
1378 case CHIP_RV670:
Alex Deucherf47299c2010-03-16 20:54:38 -04001379 rdev->asic = &r600_asic;
1380 break;
Daniel Vetter0a10c852010-03-11 21:19:14 +00001381 case CHIP_RS780:
1382 case CHIP_RS880:
Alex Deucherf47299c2010-03-16 20:54:38 -04001383 rdev->asic = &rs780_asic;
Daniel Vetter0a10c852010-03-11 21:19:14 +00001384 break;
1385 case CHIP_RV770:
1386 case CHIP_RV730:
1387 case CHIP_RV710:
1388 case CHIP_RV740:
1389 rdev->asic = &rv770_asic;
1390 break;
1391 case CHIP_CEDAR:
1392 case CHIP_REDWOOD:
1393 case CHIP_JUNIPER:
1394 case CHIP_CYPRESS:
1395 case CHIP_HEMLOCK:
Alex Deucherba7e05e2011-06-16 18:14:22 +00001396 /* set num crtcs */
1397 if (rdev->family == CHIP_CEDAR)
1398 rdev->num_crtc = 4;
1399 else
1400 rdev->num_crtc = 6;
Daniel Vetter0a10c852010-03-11 21:19:14 +00001401 rdev->asic = &evergreen_asic;
1402 break;
Alex Deucher958261d2010-11-22 17:56:30 -05001403 case CHIP_PALM:
Alex Deucher89da5a32011-05-31 15:42:47 -04001404 case CHIP_SUMO:
1405 case CHIP_SUMO2:
Alex Deucher958261d2010-11-22 17:56:30 -05001406 rdev->asic = &sumo_asic;
1407 break;
Alex Deuchera43b7662011-01-06 21:19:33 -05001408 case CHIP_BARTS:
1409 case CHIP_TURKS:
1410 case CHIP_CAICOS:
Alex Deucherba7e05e2011-06-16 18:14:22 +00001411 /* set num crtcs */
1412 if (rdev->family == CHIP_CAICOS)
1413 rdev->num_crtc = 4;
1414 else
1415 rdev->num_crtc = 6;
Alex Deuchera43b7662011-01-06 21:19:33 -05001416 rdev->asic = &btc_asic;
1417 break;
Alex Deuchere3487622011-03-02 20:07:36 -05001418 case CHIP_CAYMAN:
1419 rdev->asic = &cayman_asic;
Alex Deucherba7e05e2011-06-16 18:14:22 +00001420 /* set num crtcs */
1421 rdev->num_crtc = 6;
Jerome Glisse721604a2012-01-05 22:11:05 -05001422 rdev->vm_manager.funcs = &cayman_vm_funcs;
Alex Deuchere3487622011-03-02 20:07:36 -05001423 break;
Daniel Vetter0a10c852010-03-11 21:19:14 +00001424 default:
1425 /* FIXME: not supported yet */
1426 return -EINVAL;
1427 }
1428
1429 if (rdev->flags & RADEON_IS_IGP) {
1430 rdev->asic->get_memory_clock = NULL;
1431 rdev->asic->set_memory_clock = NULL;
1432 }
1433
Daniel Vetter0a10c852010-03-11 21:19:14 +00001434 return 0;
1435}
1436