blob: c6636085996196a2a407c8d1e0b1b06e93623a9b [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,
148 }
149 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000150 .irq_set = &r100_irq_set,
151 .irq_process = &r100_irq_process,
152 .get_vblank_counter = &r100_get_vblank_counter,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000153 .cs_parse = &r100_cs_parse,
154 .copy_blit = &r100_copy_blit,
155 .copy_dma = NULL,
156 .copy = &r100_copy_blit,
157 .get_engine_clock = &radeon_legacy_get_engine_clock,
158 .set_engine_clock = &radeon_legacy_set_engine_clock,
159 .get_memory_clock = &radeon_legacy_get_memory_clock,
160 .set_memory_clock = NULL,
161 .get_pcie_lanes = NULL,
162 .set_pcie_lanes = NULL,
163 .set_clock_gating = &radeon_legacy_set_clock_gating,
164 .set_surface_reg = r100_set_surface_reg,
165 .clear_surface_reg = r100_clear_surface_reg,
166 .bandwidth_update = &r100_bandwidth_update,
167 .hpd_init = &r100_hpd_init,
168 .hpd_fini = &r100_hpd_fini,
169 .hpd_sense = &r100_hpd_sense,
170 .hpd_set_polarity = &r100_hpd_set_polarity,
171 .ioctl_wait_idle = NULL,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400172 .gui_idle = &r100_gui_idle,
Alex Deucher49e02b72010-04-23 17:57:27 -0400173 .pm_misc = &r100_pm_misc,
174 .pm_prepare = &r100_pm_prepare,
175 .pm_finish = &r100_pm_finish,
Alex Deucherce8f5372010-05-07 15:10:16 -0400176 .pm_init_profile = &r100_pm_init_profile,
177 .pm_get_dynpm_state = &r100_pm_get_dynpm_state,
Alex Deucher6f34be52010-11-21 10:59:01 -0500178 .pre_page_flip = &r100_pre_page_flip,
179 .page_flip = &r100_page_flip,
180 .post_page_flip = &r100_post_page_flip,
Alex Deucher3ae19b72012-02-23 17:53:37 -0500181 .wait_for_vblank = &r100_wait_for_vblank,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000182};
183
184static struct radeon_asic r200_asic = {
185 .init = &r100_init,
186 .fini = &r100_fini,
187 .suspend = &r100_suspend,
188 .resume = &r100_resume,
189 .vga_set_state = &r100_vga_set_state,
Jerome Glisse225758d2010-03-09 14:45:10 +0000190 .gpu_is_lockup = &r100_gpu_is_lockup,
Jerome Glissea2d07b72010-03-09 14:45:11 +0000191 .asic_reset = &r100_asic_reset,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000192 .gart_tlb_flush = &r100_pci_gart_tlb_flush,
193 .gart_set_page = &r100_pci_gart_set_page,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000194 .ring_start = &r100_ring_start,
195 .ring_test = &r100_ring_test,
Christian König4c87bc22011-10-19 19:02:21 +0200196 .ring = {
197 [RADEON_RING_TYPE_GFX_INDEX] = {
198 .ib_execute = &r100_ring_ib_execute,
199 .emit_fence = &r100_fence_ring_emit,
200 .emit_semaphore = &r100_semaphore_ring_emit,
201 }
202 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000203 .irq_set = &r100_irq_set,
204 .irq_process = &r100_irq_process,
205 .get_vblank_counter = &r100_get_vblank_counter,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000206 .cs_parse = &r100_cs_parse,
207 .copy_blit = &r100_copy_blit,
208 .copy_dma = &r200_copy_dma,
209 .copy = &r100_copy_blit,
210 .get_engine_clock = &radeon_legacy_get_engine_clock,
211 .set_engine_clock = &radeon_legacy_set_engine_clock,
212 .get_memory_clock = &radeon_legacy_get_memory_clock,
213 .set_memory_clock = NULL,
214 .set_pcie_lanes = NULL,
215 .set_clock_gating = &radeon_legacy_set_clock_gating,
216 .set_surface_reg = r100_set_surface_reg,
217 .clear_surface_reg = r100_clear_surface_reg,
218 .bandwidth_update = &r100_bandwidth_update,
219 .hpd_init = &r100_hpd_init,
220 .hpd_fini = &r100_hpd_fini,
221 .hpd_sense = &r100_hpd_sense,
222 .hpd_set_polarity = &r100_hpd_set_polarity,
223 .ioctl_wait_idle = NULL,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400224 .gui_idle = &r100_gui_idle,
Alex Deucher49e02b72010-04-23 17:57:27 -0400225 .pm_misc = &r100_pm_misc,
226 .pm_prepare = &r100_pm_prepare,
227 .pm_finish = &r100_pm_finish,
Alex Deucherce8f5372010-05-07 15:10:16 -0400228 .pm_init_profile = &r100_pm_init_profile,
229 .pm_get_dynpm_state = &r100_pm_get_dynpm_state,
Alex Deucher6f34be52010-11-21 10:59:01 -0500230 .pre_page_flip = &r100_pre_page_flip,
231 .page_flip = &r100_page_flip,
232 .post_page_flip = &r100_post_page_flip,
Alex Deucher3ae19b72012-02-23 17:53:37 -0500233 .wait_for_vblank = &r100_wait_for_vblank,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000234};
235
236static struct radeon_asic r300_asic = {
237 .init = &r300_init,
238 .fini = &r300_fini,
239 .suspend = &r300_suspend,
240 .resume = &r300_resume,
241 .vga_set_state = &r100_vga_set_state,
Jerome Glisse225758d2010-03-09 14:45:10 +0000242 .gpu_is_lockup = &r300_gpu_is_lockup,
Jerome Glissea2d07b72010-03-09 14:45:11 +0000243 .asic_reset = &r300_asic_reset,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000244 .gart_tlb_flush = &r100_pci_gart_tlb_flush,
245 .gart_set_page = &r100_pci_gart_set_page,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000246 .ring_start = &r300_ring_start,
247 .ring_test = &r100_ring_test,
Christian König4c87bc22011-10-19 19:02:21 +0200248 .ring = {
249 [RADEON_RING_TYPE_GFX_INDEX] = {
250 .ib_execute = &r100_ring_ib_execute,
251 .emit_fence = &r300_fence_ring_emit,
252 .emit_semaphore = &r100_semaphore_ring_emit,
253 }
254 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000255 .irq_set = &r100_irq_set,
256 .irq_process = &r100_irq_process,
257 .get_vblank_counter = &r100_get_vblank_counter,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000258 .cs_parse = &r300_cs_parse,
259 .copy_blit = &r100_copy_blit,
260 .copy_dma = &r200_copy_dma,
261 .copy = &r100_copy_blit,
262 .get_engine_clock = &radeon_legacy_get_engine_clock,
263 .set_engine_clock = &radeon_legacy_set_engine_clock,
264 .get_memory_clock = &radeon_legacy_get_memory_clock,
265 .set_memory_clock = NULL,
266 .get_pcie_lanes = &rv370_get_pcie_lanes,
267 .set_pcie_lanes = &rv370_set_pcie_lanes,
268 .set_clock_gating = &radeon_legacy_set_clock_gating,
269 .set_surface_reg = r100_set_surface_reg,
270 .clear_surface_reg = r100_clear_surface_reg,
271 .bandwidth_update = &r100_bandwidth_update,
272 .hpd_init = &r100_hpd_init,
273 .hpd_fini = &r100_hpd_fini,
274 .hpd_sense = &r100_hpd_sense,
275 .hpd_set_polarity = &r100_hpd_set_polarity,
276 .ioctl_wait_idle = NULL,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400277 .gui_idle = &r100_gui_idle,
Alex Deucher49e02b72010-04-23 17:57:27 -0400278 .pm_misc = &r100_pm_misc,
279 .pm_prepare = &r100_pm_prepare,
280 .pm_finish = &r100_pm_finish,
Alex Deucherce8f5372010-05-07 15:10:16 -0400281 .pm_init_profile = &r100_pm_init_profile,
282 .pm_get_dynpm_state = &r100_pm_get_dynpm_state,
Alex Deucher6f34be52010-11-21 10:59:01 -0500283 .pre_page_flip = &r100_pre_page_flip,
284 .page_flip = &r100_page_flip,
285 .post_page_flip = &r100_post_page_flip,
Alex Deucher3ae19b72012-02-23 17:53:37 -0500286 .wait_for_vblank = &r100_wait_for_vblank,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000287};
288
289static struct radeon_asic r300_asic_pcie = {
290 .init = &r300_init,
291 .fini = &r300_fini,
292 .suspend = &r300_suspend,
293 .resume = &r300_resume,
294 .vga_set_state = &r100_vga_set_state,
Jerome Glisse225758d2010-03-09 14:45:10 +0000295 .gpu_is_lockup = &r300_gpu_is_lockup,
Jerome Glissea2d07b72010-03-09 14:45:11 +0000296 .asic_reset = &r300_asic_reset,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000297 .gart_tlb_flush = &rv370_pcie_gart_tlb_flush,
298 .gart_set_page = &rv370_pcie_gart_set_page,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000299 .ring_start = &r300_ring_start,
300 .ring_test = &r100_ring_test,
Christian König4c87bc22011-10-19 19:02:21 +0200301 .ring = {
302 [RADEON_RING_TYPE_GFX_INDEX] = {
303 .ib_execute = &r100_ring_ib_execute,
304 .emit_fence = &r300_fence_ring_emit,
305 .emit_semaphore = &r100_semaphore_ring_emit,
306 }
307 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000308 .irq_set = &r100_irq_set,
309 .irq_process = &r100_irq_process,
310 .get_vblank_counter = &r100_get_vblank_counter,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000311 .cs_parse = &r300_cs_parse,
312 .copy_blit = &r100_copy_blit,
313 .copy_dma = &r200_copy_dma,
314 .copy = &r100_copy_blit,
315 .get_engine_clock = &radeon_legacy_get_engine_clock,
316 .set_engine_clock = &radeon_legacy_set_engine_clock,
317 .get_memory_clock = &radeon_legacy_get_memory_clock,
318 .set_memory_clock = NULL,
319 .set_pcie_lanes = &rv370_set_pcie_lanes,
320 .set_clock_gating = &radeon_legacy_set_clock_gating,
321 .set_surface_reg = r100_set_surface_reg,
322 .clear_surface_reg = r100_clear_surface_reg,
323 .bandwidth_update = &r100_bandwidth_update,
324 .hpd_init = &r100_hpd_init,
325 .hpd_fini = &r100_hpd_fini,
326 .hpd_sense = &r100_hpd_sense,
327 .hpd_set_polarity = &r100_hpd_set_polarity,
328 .ioctl_wait_idle = NULL,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400329 .gui_idle = &r100_gui_idle,
Alex Deucher49e02b72010-04-23 17:57:27 -0400330 .pm_misc = &r100_pm_misc,
331 .pm_prepare = &r100_pm_prepare,
332 .pm_finish = &r100_pm_finish,
Alex Deucherce8f5372010-05-07 15:10:16 -0400333 .pm_init_profile = &r100_pm_init_profile,
334 .pm_get_dynpm_state = &r100_pm_get_dynpm_state,
Alex Deucher6f34be52010-11-21 10:59:01 -0500335 .pre_page_flip = &r100_pre_page_flip,
336 .page_flip = &r100_page_flip,
337 .post_page_flip = &r100_post_page_flip,
Alex Deucher3ae19b72012-02-23 17:53:37 -0500338 .wait_for_vblank = &r100_wait_for_vblank,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000339};
340
341static struct radeon_asic r420_asic = {
342 .init = &r420_init,
343 .fini = &r420_fini,
344 .suspend = &r420_suspend,
345 .resume = &r420_resume,
346 .vga_set_state = &r100_vga_set_state,
Jerome Glisse225758d2010-03-09 14:45:10 +0000347 .gpu_is_lockup = &r300_gpu_is_lockup,
Jerome Glissea2d07b72010-03-09 14:45:11 +0000348 .asic_reset = &r300_asic_reset,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000349 .gart_tlb_flush = &rv370_pcie_gart_tlb_flush,
350 .gart_set_page = &rv370_pcie_gart_set_page,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000351 .ring_start = &r300_ring_start,
352 .ring_test = &r100_ring_test,
Christian König4c87bc22011-10-19 19:02:21 +0200353 .ring = {
354 [RADEON_RING_TYPE_GFX_INDEX] = {
355 .ib_execute = &r100_ring_ib_execute,
356 .emit_fence = &r300_fence_ring_emit,
357 .emit_semaphore = &r100_semaphore_ring_emit,
358 }
359 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000360 .irq_set = &r100_irq_set,
361 .irq_process = &r100_irq_process,
362 .get_vblank_counter = &r100_get_vblank_counter,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000363 .cs_parse = &r300_cs_parse,
364 .copy_blit = &r100_copy_blit,
365 .copy_dma = &r200_copy_dma,
366 .copy = &r100_copy_blit,
367 .get_engine_clock = &radeon_atom_get_engine_clock,
368 .set_engine_clock = &radeon_atom_set_engine_clock,
369 .get_memory_clock = &radeon_atom_get_memory_clock,
370 .set_memory_clock = &radeon_atom_set_memory_clock,
371 .get_pcie_lanes = &rv370_get_pcie_lanes,
372 .set_pcie_lanes = &rv370_set_pcie_lanes,
373 .set_clock_gating = &radeon_atom_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,
377 .hpd_init = &r100_hpd_init,
378 .hpd_fini = &r100_hpd_fini,
379 .hpd_sense = &r100_hpd_sense,
380 .hpd_set_polarity = &r100_hpd_set_polarity,
381 .ioctl_wait_idle = NULL,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400382 .gui_idle = &r100_gui_idle,
Alex Deucher49e02b72010-04-23 17:57:27 -0400383 .pm_misc = &r100_pm_misc,
384 .pm_prepare = &r100_pm_prepare,
385 .pm_finish = &r100_pm_finish,
Alex Deucherce8f5372010-05-07 15:10:16 -0400386 .pm_init_profile = &r420_pm_init_profile,
387 .pm_get_dynpm_state = &r100_pm_get_dynpm_state,
Alex Deucher6f34be52010-11-21 10:59:01 -0500388 .pre_page_flip = &r100_pre_page_flip,
389 .page_flip = &r100_page_flip,
390 .post_page_flip = &r100_post_page_flip,
Alex Deucher3ae19b72012-02-23 17:53:37 -0500391 .wait_for_vblank = &r100_wait_for_vblank,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000392};
393
394static struct radeon_asic rs400_asic = {
395 .init = &rs400_init,
396 .fini = &rs400_fini,
397 .suspend = &rs400_suspend,
398 .resume = &rs400_resume,
399 .vga_set_state = &r100_vga_set_state,
Jerome Glisse225758d2010-03-09 14:45:10 +0000400 .gpu_is_lockup = &r300_gpu_is_lockup,
Jerome Glissea2d07b72010-03-09 14:45:11 +0000401 .asic_reset = &r300_asic_reset,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000402 .gart_tlb_flush = &rs400_gart_tlb_flush,
403 .gart_set_page = &rs400_gart_set_page,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000404 .ring_start = &r300_ring_start,
405 .ring_test = &r100_ring_test,
Christian König4c87bc22011-10-19 19:02:21 +0200406 .ring = {
407 [RADEON_RING_TYPE_GFX_INDEX] = {
408 .ib_execute = &r100_ring_ib_execute,
409 .emit_fence = &r300_fence_ring_emit,
410 .emit_semaphore = &r100_semaphore_ring_emit,
411 }
412 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000413 .irq_set = &r100_irq_set,
414 .irq_process = &r100_irq_process,
415 .get_vblank_counter = &r100_get_vblank_counter,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000416 .cs_parse = &r300_cs_parse,
417 .copy_blit = &r100_copy_blit,
418 .copy_dma = &r200_copy_dma,
419 .copy = &r100_copy_blit,
420 .get_engine_clock = &radeon_legacy_get_engine_clock,
421 .set_engine_clock = &radeon_legacy_set_engine_clock,
422 .get_memory_clock = &radeon_legacy_get_memory_clock,
423 .set_memory_clock = NULL,
424 .get_pcie_lanes = NULL,
425 .set_pcie_lanes = NULL,
426 .set_clock_gating = &radeon_legacy_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,
430 .hpd_init = &r100_hpd_init,
431 .hpd_fini = &r100_hpd_fini,
432 .hpd_sense = &r100_hpd_sense,
433 .hpd_set_polarity = &r100_hpd_set_polarity,
434 .ioctl_wait_idle = NULL,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400435 .gui_idle = &r100_gui_idle,
Alex Deucher49e02b72010-04-23 17:57:27 -0400436 .pm_misc = &r100_pm_misc,
437 .pm_prepare = &r100_pm_prepare,
438 .pm_finish = &r100_pm_finish,
Alex Deucherce8f5372010-05-07 15:10:16 -0400439 .pm_init_profile = &r100_pm_init_profile,
440 .pm_get_dynpm_state = &r100_pm_get_dynpm_state,
Alex Deucher6f34be52010-11-21 10:59:01 -0500441 .pre_page_flip = &r100_pre_page_flip,
442 .page_flip = &r100_page_flip,
443 .post_page_flip = &r100_post_page_flip,
Alex Deucher3ae19b72012-02-23 17:53:37 -0500444 .wait_for_vblank = &r100_wait_for_vblank,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000445};
446
447static struct radeon_asic rs600_asic = {
448 .init = &rs600_init,
449 .fini = &rs600_fini,
450 .suspend = &rs600_suspend,
451 .resume = &rs600_resume,
452 .vga_set_state = &r100_vga_set_state,
Jerome Glisse225758d2010-03-09 14:45:10 +0000453 .gpu_is_lockup = &r300_gpu_is_lockup,
Jerome Glisse90aca4d2010-03-09 14:45:12 +0000454 .asic_reset = &rs600_asic_reset,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000455 .gart_tlb_flush = &rs600_gart_tlb_flush,
456 .gart_set_page = &rs600_gart_set_page,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000457 .ring_start = &r300_ring_start,
458 .ring_test = &r100_ring_test,
Christian König4c87bc22011-10-19 19:02:21 +0200459 .ring = {
460 [RADEON_RING_TYPE_GFX_INDEX] = {
461 .ib_execute = &r100_ring_ib_execute,
462 .emit_fence = &r300_fence_ring_emit,
463 .emit_semaphore = &r100_semaphore_ring_emit,
464 }
465 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000466 .irq_set = &rs600_irq_set,
467 .irq_process = &rs600_irq_process,
468 .get_vblank_counter = &rs600_get_vblank_counter,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000469 .cs_parse = &r300_cs_parse,
470 .copy_blit = &r100_copy_blit,
471 .copy_dma = &r200_copy_dma,
472 .copy = &r100_copy_blit,
473 .get_engine_clock = &radeon_atom_get_engine_clock,
474 .set_engine_clock = &radeon_atom_set_engine_clock,
475 .get_memory_clock = &radeon_atom_get_memory_clock,
476 .set_memory_clock = &radeon_atom_set_memory_clock,
477 .get_pcie_lanes = NULL,
478 .set_pcie_lanes = NULL,
479 .set_clock_gating = &radeon_atom_set_clock_gating,
480 .set_surface_reg = r100_set_surface_reg,
481 .clear_surface_reg = r100_clear_surface_reg,
482 .bandwidth_update = &rs600_bandwidth_update,
483 .hpd_init = &rs600_hpd_init,
484 .hpd_fini = &rs600_hpd_fini,
485 .hpd_sense = &rs600_hpd_sense,
486 .hpd_set_polarity = &rs600_hpd_set_polarity,
487 .ioctl_wait_idle = NULL,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400488 .gui_idle = &r100_gui_idle,
Alex Deucher49e02b72010-04-23 17:57:27 -0400489 .pm_misc = &rs600_pm_misc,
490 .pm_prepare = &rs600_pm_prepare,
491 .pm_finish = &rs600_pm_finish,
Alex Deucherce8f5372010-05-07 15:10:16 -0400492 .pm_init_profile = &r420_pm_init_profile,
493 .pm_get_dynpm_state = &r100_pm_get_dynpm_state,
Alex Deucher6f34be52010-11-21 10:59:01 -0500494 .pre_page_flip = &rs600_pre_page_flip,
495 .page_flip = &rs600_page_flip,
496 .post_page_flip = &rs600_post_page_flip,
Alex Deucher3ae19b72012-02-23 17:53:37 -0500497 .wait_for_vblank = &avivo_wait_for_vblank,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000498};
499
500static struct radeon_asic rs690_asic = {
501 .init = &rs690_init,
502 .fini = &rs690_fini,
503 .suspend = &rs690_suspend,
504 .resume = &rs690_resume,
505 .vga_set_state = &r100_vga_set_state,
Jerome Glisse225758d2010-03-09 14:45:10 +0000506 .gpu_is_lockup = &r300_gpu_is_lockup,
Jerome Glisse90aca4d2010-03-09 14:45:12 +0000507 .asic_reset = &rs600_asic_reset,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000508 .gart_tlb_flush = &rs400_gart_tlb_flush,
509 .gart_set_page = &rs400_gart_set_page,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000510 .ring_start = &r300_ring_start,
511 .ring_test = &r100_ring_test,
Christian König4c87bc22011-10-19 19:02:21 +0200512 .ring = {
513 [RADEON_RING_TYPE_GFX_INDEX] = {
514 .ib_execute = &r100_ring_ib_execute,
515 .emit_fence = &r300_fence_ring_emit,
516 .emit_semaphore = &r100_semaphore_ring_emit,
517 }
518 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000519 .irq_set = &rs600_irq_set,
520 .irq_process = &rs600_irq_process,
521 .get_vblank_counter = &rs600_get_vblank_counter,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000522 .cs_parse = &r300_cs_parse,
523 .copy_blit = &r100_copy_blit,
524 .copy_dma = &r200_copy_dma,
525 .copy = &r200_copy_dma,
526 .get_engine_clock = &radeon_atom_get_engine_clock,
527 .set_engine_clock = &radeon_atom_set_engine_clock,
528 .get_memory_clock = &radeon_atom_get_memory_clock,
529 .set_memory_clock = &radeon_atom_set_memory_clock,
530 .get_pcie_lanes = NULL,
531 .set_pcie_lanes = NULL,
532 .set_clock_gating = &radeon_atom_set_clock_gating,
533 .set_surface_reg = r100_set_surface_reg,
534 .clear_surface_reg = r100_clear_surface_reg,
535 .bandwidth_update = &rs690_bandwidth_update,
536 .hpd_init = &rs600_hpd_init,
537 .hpd_fini = &rs600_hpd_fini,
538 .hpd_sense = &rs600_hpd_sense,
539 .hpd_set_polarity = &rs600_hpd_set_polarity,
540 .ioctl_wait_idle = NULL,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400541 .gui_idle = &r100_gui_idle,
Alex Deucher49e02b72010-04-23 17:57:27 -0400542 .pm_misc = &rs600_pm_misc,
543 .pm_prepare = &rs600_pm_prepare,
544 .pm_finish = &rs600_pm_finish,
Alex Deucherce8f5372010-05-07 15:10:16 -0400545 .pm_init_profile = &r420_pm_init_profile,
546 .pm_get_dynpm_state = &r100_pm_get_dynpm_state,
Alex Deucher6f34be52010-11-21 10:59:01 -0500547 .pre_page_flip = &rs600_pre_page_flip,
548 .page_flip = &rs600_page_flip,
549 .post_page_flip = &rs600_post_page_flip,
Alex Deucher3ae19b72012-02-23 17:53:37 -0500550 .wait_for_vblank = &avivo_wait_for_vblank,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000551};
552
553static struct radeon_asic rv515_asic = {
554 .init = &rv515_init,
555 .fini = &rv515_fini,
556 .suspend = &rv515_suspend,
557 .resume = &rv515_resume,
558 .vga_set_state = &r100_vga_set_state,
Jerome Glisse225758d2010-03-09 14:45:10 +0000559 .gpu_is_lockup = &r300_gpu_is_lockup,
Jerome Glisse90aca4d2010-03-09 14:45:12 +0000560 .asic_reset = &rs600_asic_reset,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000561 .gart_tlb_flush = &rv370_pcie_gart_tlb_flush,
562 .gart_set_page = &rv370_pcie_gart_set_page,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000563 .ring_start = &rv515_ring_start,
564 .ring_test = &r100_ring_test,
Christian König4c87bc22011-10-19 19:02:21 +0200565 .ring = {
566 [RADEON_RING_TYPE_GFX_INDEX] = {
567 .ib_execute = &r100_ring_ib_execute,
568 .emit_fence = &r300_fence_ring_emit,
569 .emit_semaphore = &r100_semaphore_ring_emit,
570 }
571 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000572 .irq_set = &rs600_irq_set,
573 .irq_process = &rs600_irq_process,
574 .get_vblank_counter = &rs600_get_vblank_counter,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000575 .cs_parse = &r300_cs_parse,
576 .copy_blit = &r100_copy_blit,
577 .copy_dma = &r200_copy_dma,
578 .copy = &r100_copy_blit,
579 .get_engine_clock = &radeon_atom_get_engine_clock,
580 .set_engine_clock = &radeon_atom_set_engine_clock,
581 .get_memory_clock = &radeon_atom_get_memory_clock,
582 .set_memory_clock = &radeon_atom_set_memory_clock,
583 .get_pcie_lanes = &rv370_get_pcie_lanes,
584 .set_pcie_lanes = &rv370_set_pcie_lanes,
585 .set_clock_gating = &radeon_atom_set_clock_gating,
586 .set_surface_reg = r100_set_surface_reg,
587 .clear_surface_reg = r100_clear_surface_reg,
588 .bandwidth_update = &rv515_bandwidth_update,
589 .hpd_init = &rs600_hpd_init,
590 .hpd_fini = &rs600_hpd_fini,
591 .hpd_sense = &rs600_hpd_sense,
592 .hpd_set_polarity = &rs600_hpd_set_polarity,
593 .ioctl_wait_idle = NULL,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400594 .gui_idle = &r100_gui_idle,
Alex Deucher49e02b72010-04-23 17:57:27 -0400595 .pm_misc = &rs600_pm_misc,
596 .pm_prepare = &rs600_pm_prepare,
597 .pm_finish = &rs600_pm_finish,
Alex Deucherce8f5372010-05-07 15:10:16 -0400598 .pm_init_profile = &r420_pm_init_profile,
599 .pm_get_dynpm_state = &r100_pm_get_dynpm_state,
Alex Deucher6f34be52010-11-21 10:59:01 -0500600 .pre_page_flip = &rs600_pre_page_flip,
601 .page_flip = &rs600_page_flip,
602 .post_page_flip = &rs600_post_page_flip,
Alex Deucher3ae19b72012-02-23 17:53:37 -0500603 .wait_for_vblank = &avivo_wait_for_vblank,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000604};
605
606static struct radeon_asic r520_asic = {
607 .init = &r520_init,
608 .fini = &rv515_fini,
609 .suspend = &rv515_suspend,
610 .resume = &r520_resume,
611 .vga_set_state = &r100_vga_set_state,
Jerome Glisse225758d2010-03-09 14:45:10 +0000612 .gpu_is_lockup = &r300_gpu_is_lockup,
Jerome Glisse90aca4d2010-03-09 14:45:12 +0000613 .asic_reset = &rs600_asic_reset,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000614 .gart_tlb_flush = &rv370_pcie_gart_tlb_flush,
615 .gart_set_page = &rv370_pcie_gart_set_page,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000616 .ring_start = &rv515_ring_start,
617 .ring_test = &r100_ring_test,
Christian König4c87bc22011-10-19 19:02:21 +0200618 .ring = {
619 [RADEON_RING_TYPE_GFX_INDEX] = {
620 .ib_execute = &r100_ring_ib_execute,
621 .emit_fence = &r300_fence_ring_emit,
622 .emit_semaphore = &r100_semaphore_ring_emit,
623 }
624 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000625 .irq_set = &rs600_irq_set,
626 .irq_process = &rs600_irq_process,
627 .get_vblank_counter = &rs600_get_vblank_counter,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000628 .cs_parse = &r300_cs_parse,
629 .copy_blit = &r100_copy_blit,
630 .copy_dma = &r200_copy_dma,
631 .copy = &r100_copy_blit,
632 .get_engine_clock = &radeon_atom_get_engine_clock,
633 .set_engine_clock = &radeon_atom_set_engine_clock,
634 .get_memory_clock = &radeon_atom_get_memory_clock,
635 .set_memory_clock = &radeon_atom_set_memory_clock,
636 .get_pcie_lanes = &rv370_get_pcie_lanes,
637 .set_pcie_lanes = &rv370_set_pcie_lanes,
638 .set_clock_gating = &radeon_atom_set_clock_gating,
639 .set_surface_reg = r100_set_surface_reg,
640 .clear_surface_reg = r100_clear_surface_reg,
641 .bandwidth_update = &rv515_bandwidth_update,
642 .hpd_init = &rs600_hpd_init,
643 .hpd_fini = &rs600_hpd_fini,
644 .hpd_sense = &rs600_hpd_sense,
645 .hpd_set_polarity = &rs600_hpd_set_polarity,
646 .ioctl_wait_idle = NULL,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400647 .gui_idle = &r100_gui_idle,
Alex Deucher49e02b72010-04-23 17:57:27 -0400648 .pm_misc = &rs600_pm_misc,
649 .pm_prepare = &rs600_pm_prepare,
650 .pm_finish = &rs600_pm_finish,
Alex Deucherce8f5372010-05-07 15:10:16 -0400651 .pm_init_profile = &r420_pm_init_profile,
652 .pm_get_dynpm_state = &r100_pm_get_dynpm_state,
Alex Deucher6f34be52010-11-21 10:59:01 -0500653 .pre_page_flip = &rs600_pre_page_flip,
654 .page_flip = &rs600_page_flip,
655 .post_page_flip = &rs600_post_page_flip,
Alex Deucher3ae19b72012-02-23 17:53:37 -0500656 .wait_for_vblank = &avivo_wait_for_vblank,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000657};
658
659static struct radeon_asic r600_asic = {
660 .init = &r600_init,
661 .fini = &r600_fini,
662 .suspend = &r600_suspend,
663 .resume = &r600_resume,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000664 .vga_set_state = &r600_vga_set_state,
Jerome Glisse225758d2010-03-09 14:45:10 +0000665 .gpu_is_lockup = &r600_gpu_is_lockup,
Jerome Glissea2d07b72010-03-09 14:45:11 +0000666 .asic_reset = &r600_asic_reset,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000667 .gart_tlb_flush = &r600_pcie_gart_tlb_flush,
668 .gart_set_page = &rs600_gart_set_page,
669 .ring_test = &r600_ring_test,
Christian König4c87bc22011-10-19 19:02:21 +0200670 .ring = {
671 [RADEON_RING_TYPE_GFX_INDEX] = {
672 .ib_execute = &r600_ring_ib_execute,
673 .emit_fence = &r600_fence_ring_emit,
674 .emit_semaphore = &r600_semaphore_ring_emit,
675 }
676 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000677 .irq_set = &r600_irq_set,
678 .irq_process = &r600_irq_process,
679 .get_vblank_counter = &rs600_get_vblank_counter,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000680 .cs_parse = &r600_cs_parse,
681 .copy_blit = &r600_copy_blit,
Alex Deucher20633442011-06-13 21:33:39 +0000682 .copy_dma = NULL,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000683 .copy = &r600_copy_blit,
684 .get_engine_clock = &radeon_atom_get_engine_clock,
685 .set_engine_clock = &radeon_atom_set_engine_clock,
686 .get_memory_clock = &radeon_atom_get_memory_clock,
687 .set_memory_clock = &radeon_atom_set_memory_clock,
Alex Deucher3313e3d2011-01-06 18:49:34 -0500688 .get_pcie_lanes = &r600_get_pcie_lanes,
689 .set_pcie_lanes = &r600_set_pcie_lanes,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000690 .set_clock_gating = NULL,
691 .set_surface_reg = r600_set_surface_reg,
692 .clear_surface_reg = r600_clear_surface_reg,
693 .bandwidth_update = &rv515_bandwidth_update,
694 .hpd_init = &r600_hpd_init,
695 .hpd_fini = &r600_hpd_fini,
696 .hpd_sense = &r600_hpd_sense,
697 .hpd_set_polarity = &r600_hpd_set_polarity,
698 .ioctl_wait_idle = r600_ioctl_wait_idle,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400699 .gui_idle = &r600_gui_idle,
Alex Deucher49e02b72010-04-23 17:57:27 -0400700 .pm_misc = &r600_pm_misc,
701 .pm_prepare = &rs600_pm_prepare,
702 .pm_finish = &rs600_pm_finish,
Alex Deucherce8f5372010-05-07 15:10:16 -0400703 .pm_init_profile = &r600_pm_init_profile,
704 .pm_get_dynpm_state = &r600_pm_get_dynpm_state,
Alex Deucher6f34be52010-11-21 10:59:01 -0500705 .pre_page_flip = &rs600_pre_page_flip,
706 .page_flip = &rs600_page_flip,
707 .post_page_flip = &rs600_post_page_flip,
Alex Deucher3ae19b72012-02-23 17:53:37 -0500708 .wait_for_vblank = &avivo_wait_for_vblank,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000709};
710
Alex Deucherf47299c2010-03-16 20:54:38 -0400711static struct radeon_asic rs780_asic = {
712 .init = &r600_init,
713 .fini = &r600_fini,
714 .suspend = &r600_suspend,
715 .resume = &r600_resume,
Jerome Glisse90aca4d2010-03-09 14:45:12 +0000716 .gpu_is_lockup = &r600_gpu_is_lockup,
Alex Deucherf47299c2010-03-16 20:54:38 -0400717 .vga_set_state = &r600_vga_set_state,
Jerome Glissea2d07b72010-03-09 14:45:11 +0000718 .asic_reset = &r600_asic_reset,
Alex Deucherf47299c2010-03-16 20:54:38 -0400719 .gart_tlb_flush = &r600_pcie_gart_tlb_flush,
720 .gart_set_page = &rs600_gart_set_page,
721 .ring_test = &r600_ring_test,
Christian König4c87bc22011-10-19 19:02:21 +0200722 .ring = {
723 [RADEON_RING_TYPE_GFX_INDEX] = {
724 .ib_execute = &r600_ring_ib_execute,
725 .emit_fence = &r600_fence_ring_emit,
726 .emit_semaphore = &r600_semaphore_ring_emit,
727 }
728 },
Alex Deucherf47299c2010-03-16 20:54:38 -0400729 .irq_set = &r600_irq_set,
730 .irq_process = &r600_irq_process,
731 .get_vblank_counter = &rs600_get_vblank_counter,
Alex Deucherf47299c2010-03-16 20:54:38 -0400732 .cs_parse = &r600_cs_parse,
733 .copy_blit = &r600_copy_blit,
Alex Deucher20633442011-06-13 21:33:39 +0000734 .copy_dma = NULL,
Alex Deucherf47299c2010-03-16 20:54:38 -0400735 .copy = &r600_copy_blit,
736 .get_engine_clock = &radeon_atom_get_engine_clock,
737 .set_engine_clock = &radeon_atom_set_engine_clock,
738 .get_memory_clock = NULL,
739 .set_memory_clock = NULL,
740 .get_pcie_lanes = NULL,
741 .set_pcie_lanes = NULL,
742 .set_clock_gating = NULL,
743 .set_surface_reg = r600_set_surface_reg,
744 .clear_surface_reg = r600_clear_surface_reg,
745 .bandwidth_update = &rs690_bandwidth_update,
746 .hpd_init = &r600_hpd_init,
747 .hpd_fini = &r600_hpd_fini,
748 .hpd_sense = &r600_hpd_sense,
749 .hpd_set_polarity = &r600_hpd_set_polarity,
750 .ioctl_wait_idle = r600_ioctl_wait_idle,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400751 .gui_idle = &r600_gui_idle,
Alex Deucher49e02b72010-04-23 17:57:27 -0400752 .pm_misc = &r600_pm_misc,
753 .pm_prepare = &rs600_pm_prepare,
754 .pm_finish = &rs600_pm_finish,
Alex Deucherce8f5372010-05-07 15:10:16 -0400755 .pm_init_profile = &rs780_pm_init_profile,
756 .pm_get_dynpm_state = &r600_pm_get_dynpm_state,
Alex Deucher6f34be52010-11-21 10:59:01 -0500757 .pre_page_flip = &rs600_pre_page_flip,
758 .page_flip = &rs600_page_flip,
759 .post_page_flip = &rs600_post_page_flip,
Alex Deucher3ae19b72012-02-23 17:53:37 -0500760 .wait_for_vblank = &avivo_wait_for_vblank,
Alex Deucherf47299c2010-03-16 20:54:38 -0400761};
762
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000763static struct radeon_asic rv770_asic = {
764 .init = &rv770_init,
765 .fini = &rv770_fini,
766 .suspend = &rv770_suspend,
767 .resume = &rv770_resume,
Jerome Glissea2d07b72010-03-09 14:45:11 +0000768 .asic_reset = &r600_asic_reset,
Jerome Glisse225758d2010-03-09 14:45:10 +0000769 .gpu_is_lockup = &r600_gpu_is_lockup,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000770 .vga_set_state = &r600_vga_set_state,
771 .gart_tlb_flush = &r600_pcie_gart_tlb_flush,
772 .gart_set_page = &rs600_gart_set_page,
773 .ring_test = &r600_ring_test,
Christian König4c87bc22011-10-19 19:02:21 +0200774 .ring = {
775 [RADEON_RING_TYPE_GFX_INDEX] = {
776 .ib_execute = &r600_ring_ib_execute,
777 .emit_fence = &r600_fence_ring_emit,
778 .emit_semaphore = &r600_semaphore_ring_emit,
779 }
780 },
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000781 .irq_set = &r600_irq_set,
782 .irq_process = &r600_irq_process,
783 .get_vblank_counter = &rs600_get_vblank_counter,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000784 .cs_parse = &r600_cs_parse,
785 .copy_blit = &r600_copy_blit,
Alex Deucher20633442011-06-13 21:33:39 +0000786 .copy_dma = NULL,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000787 .copy = &r600_copy_blit,
788 .get_engine_clock = &radeon_atom_get_engine_clock,
789 .set_engine_clock = &radeon_atom_set_engine_clock,
790 .get_memory_clock = &radeon_atom_get_memory_clock,
791 .set_memory_clock = &radeon_atom_set_memory_clock,
Alex Deucher3313e3d2011-01-06 18:49:34 -0500792 .get_pcie_lanes = &r600_get_pcie_lanes,
793 .set_pcie_lanes = &r600_set_pcie_lanes,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000794 .set_clock_gating = &radeon_atom_set_clock_gating,
795 .set_surface_reg = r600_set_surface_reg,
796 .clear_surface_reg = r600_clear_surface_reg,
797 .bandwidth_update = &rv515_bandwidth_update,
798 .hpd_init = &r600_hpd_init,
799 .hpd_fini = &r600_hpd_fini,
800 .hpd_sense = &r600_hpd_sense,
801 .hpd_set_polarity = &r600_hpd_set_polarity,
802 .ioctl_wait_idle = r600_ioctl_wait_idle,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400803 .gui_idle = &r600_gui_idle,
Alex Deucher49e02b72010-04-23 17:57:27 -0400804 .pm_misc = &rv770_pm_misc,
805 .pm_prepare = &rs600_pm_prepare,
806 .pm_finish = &rs600_pm_finish,
Alex Deucherce8f5372010-05-07 15:10:16 -0400807 .pm_init_profile = &r600_pm_init_profile,
808 .pm_get_dynpm_state = &r600_pm_get_dynpm_state,
Alex Deucher6f34be52010-11-21 10:59:01 -0500809 .pre_page_flip = &rs600_pre_page_flip,
810 .page_flip = &rv770_page_flip,
811 .post_page_flip = &rs600_post_page_flip,
Alex Deucher3ae19b72012-02-23 17:53:37 -0500812 .wait_for_vblank = &avivo_wait_for_vblank,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000813};
814
815static struct radeon_asic evergreen_asic = {
816 .init = &evergreen_init,
817 .fini = &evergreen_fini,
818 .suspend = &evergreen_suspend,
819 .resume = &evergreen_resume,
Jerome Glisse225758d2010-03-09 14:45:10 +0000820 .gpu_is_lockup = &evergreen_gpu_is_lockup,
Jerome Glissea2d07b72010-03-09 14:45:11 +0000821 .asic_reset = &evergreen_asic_reset,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000822 .vga_set_state = &r600_vga_set_state,
Alex Deucher0fcdb612010-03-24 13:20:41 -0400823 .gart_tlb_flush = &evergreen_pcie_gart_tlb_flush,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000824 .gart_set_page = &rs600_gart_set_page,
Alex Deucherfe251e22010-03-24 13:36:43 -0400825 .ring_test = &r600_ring_test,
Christian König4c87bc22011-10-19 19:02:21 +0200826 .ring = {
827 [RADEON_RING_TYPE_GFX_INDEX] = {
828 .ib_execute = &evergreen_ring_ib_execute,
829 .emit_fence = &r600_fence_ring_emit,
830 .emit_semaphore = &r600_semaphore_ring_emit,
831 }
832 },
Alex Deucher45f9a392010-03-24 13:55:51 -0400833 .irq_set = &evergreen_irq_set,
834 .irq_process = &evergreen_irq_process,
835 .get_vblank_counter = &evergreen_get_vblank_counter,
Alex Deuchercb5fcbd2010-05-28 19:01:35 -0400836 .cs_parse = &evergreen_cs_parse,
Ilija Hadzicfb3d9e92011-10-12 23:29:41 -0400837 .copy_blit = &r600_copy_blit,
Alex Deucher20633442011-06-13 21:33:39 +0000838 .copy_dma = NULL,
Ilija Hadzicfb3d9e92011-10-12 23:29:41 -0400839 .copy = &r600_copy_blit,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000840 .get_engine_clock = &radeon_atom_get_engine_clock,
841 .set_engine_clock = &radeon_atom_set_engine_clock,
842 .get_memory_clock = &radeon_atom_get_memory_clock,
843 .set_memory_clock = &radeon_atom_set_memory_clock,
Alex Deucher3313e3d2011-01-06 18:49:34 -0500844 .get_pcie_lanes = &r600_get_pcie_lanes,
845 .set_pcie_lanes = &r600_set_pcie_lanes,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000846 .set_clock_gating = NULL,
847 .set_surface_reg = r600_set_surface_reg,
848 .clear_surface_reg = r600_clear_surface_reg,
849 .bandwidth_update = &evergreen_bandwidth_update,
850 .hpd_init = &evergreen_hpd_init,
851 .hpd_fini = &evergreen_hpd_fini,
852 .hpd_sense = &evergreen_hpd_sense,
853 .hpd_set_polarity = &evergreen_hpd_set_polarity,
Dave Airlie97bfd0a2011-05-19 14:14:43 +1000854 .ioctl_wait_idle = r600_ioctl_wait_idle,
Alex Deucherdef9ba92010-04-22 12:39:58 -0400855 .gui_idle = &r600_gui_idle,
Alex Deucher49e02b72010-04-23 17:57:27 -0400856 .pm_misc = &evergreen_pm_misc,
857 .pm_prepare = &evergreen_pm_prepare,
858 .pm_finish = &evergreen_pm_finish,
Alex Deucherce8f5372010-05-07 15:10:16 -0400859 .pm_init_profile = &r600_pm_init_profile,
860 .pm_get_dynpm_state = &r600_pm_get_dynpm_state,
Alex Deucher6f34be52010-11-21 10:59:01 -0500861 .pre_page_flip = &evergreen_pre_page_flip,
862 .page_flip = &evergreen_page_flip,
863 .post_page_flip = &evergreen_post_page_flip,
Alex Deucher3ae19b72012-02-23 17:53:37 -0500864 .wait_for_vblank = &dce4_wait_for_vblank,
Daniel Vetter48e7a5f2010-03-11 21:19:15 +0000865};
866
Alex Deucher958261d2010-11-22 17:56:30 -0500867static struct radeon_asic sumo_asic = {
868 .init = &evergreen_init,
869 .fini = &evergreen_fini,
870 .suspend = &evergreen_suspend,
871 .resume = &evergreen_resume,
Alex Deucher958261d2010-11-22 17:56:30 -0500872 .gpu_is_lockup = &evergreen_gpu_is_lockup,
873 .asic_reset = &evergreen_asic_reset,
874 .vga_set_state = &r600_vga_set_state,
875 .gart_tlb_flush = &evergreen_pcie_gart_tlb_flush,
876 .gart_set_page = &rs600_gart_set_page,
877 .ring_test = &r600_ring_test,
Christian König4c87bc22011-10-19 19:02:21 +0200878 .ring = {
879 [RADEON_RING_TYPE_GFX_INDEX] = {
880 .ib_execute = &evergreen_ring_ib_execute,
881 .emit_fence = &r600_fence_ring_emit,
882 .emit_semaphore = &r600_semaphore_ring_emit,
883 }
884 },
Alex Deucher958261d2010-11-22 17:56:30 -0500885 .irq_set = &evergreen_irq_set,
886 .irq_process = &evergreen_irq_process,
887 .get_vblank_counter = &evergreen_get_vblank_counter,
Alex Deucher958261d2010-11-22 17:56:30 -0500888 .cs_parse = &evergreen_cs_parse,
Ilija Hadzicfb3d9e92011-10-12 23:29:41 -0400889 .copy_blit = &r600_copy_blit,
Alex Deucher20633442011-06-13 21:33:39 +0000890 .copy_dma = NULL,
Ilija Hadzicfb3d9e92011-10-12 23:29:41 -0400891 .copy = &r600_copy_blit,
Alex Deucher958261d2010-11-22 17:56:30 -0500892 .get_engine_clock = &radeon_atom_get_engine_clock,
893 .set_engine_clock = &radeon_atom_set_engine_clock,
894 .get_memory_clock = NULL,
895 .set_memory_clock = NULL,
896 .get_pcie_lanes = NULL,
897 .set_pcie_lanes = NULL,
898 .set_clock_gating = NULL,
899 .set_surface_reg = r600_set_surface_reg,
900 .clear_surface_reg = r600_clear_surface_reg,
901 .bandwidth_update = &evergreen_bandwidth_update,
902 .hpd_init = &evergreen_hpd_init,
903 .hpd_fini = &evergreen_hpd_fini,
904 .hpd_sense = &evergreen_hpd_sense,
905 .hpd_set_polarity = &evergreen_hpd_set_polarity,
Dave Airlie97bfd0a2011-05-19 14:14:43 +1000906 .ioctl_wait_idle = r600_ioctl_wait_idle,
Alex Deucher958261d2010-11-22 17:56:30 -0500907 .gui_idle = &r600_gui_idle,
908 .pm_misc = &evergreen_pm_misc,
909 .pm_prepare = &evergreen_pm_prepare,
910 .pm_finish = &evergreen_pm_finish,
Alex Deuchera4c9e2e2011-11-04 10:09:41 -0400911 .pm_init_profile = &sumo_pm_init_profile,
Alex Deucher958261d2010-11-22 17:56:30 -0500912 .pm_get_dynpm_state = &r600_pm_get_dynpm_state,
Dave Airliefdc315a2011-03-11 10:04:23 +1000913 .pre_page_flip = &evergreen_pre_page_flip,
914 .page_flip = &evergreen_page_flip,
915 .post_page_flip = &evergreen_post_page_flip,
Alex Deucher3ae19b72012-02-23 17:53:37 -0500916 .wait_for_vblank = &dce4_wait_for_vblank,
Alex Deucher958261d2010-11-22 17:56:30 -0500917};
918
Alex Deuchera43b7662011-01-06 21:19:33 -0500919static struct radeon_asic btc_asic = {
920 .init = &evergreen_init,
921 .fini = &evergreen_fini,
922 .suspend = &evergreen_suspend,
923 .resume = &evergreen_resume,
Alex Deuchera43b7662011-01-06 21:19:33 -0500924 .gpu_is_lockup = &evergreen_gpu_is_lockup,
925 .asic_reset = &evergreen_asic_reset,
926 .vga_set_state = &r600_vga_set_state,
927 .gart_tlb_flush = &evergreen_pcie_gart_tlb_flush,
928 .gart_set_page = &rs600_gart_set_page,
929 .ring_test = &r600_ring_test,
Christian König4c87bc22011-10-19 19:02:21 +0200930 .ring = {
931 [RADEON_RING_TYPE_GFX_INDEX] = {
932 .ib_execute = &evergreen_ring_ib_execute,
933 .emit_fence = &r600_fence_ring_emit,
934 .emit_semaphore = &r600_semaphore_ring_emit,
935 }
936 },
Alex Deuchera43b7662011-01-06 21:19:33 -0500937 .irq_set = &evergreen_irq_set,
938 .irq_process = &evergreen_irq_process,
939 .get_vblank_counter = &evergreen_get_vblank_counter,
Alex Deuchera43b7662011-01-06 21:19:33 -0500940 .cs_parse = &evergreen_cs_parse,
Ilija Hadzicfb3d9e92011-10-12 23:29:41 -0400941 .copy_blit = &r600_copy_blit,
Alex Deucher20633442011-06-13 21:33:39 +0000942 .copy_dma = NULL,
Ilija Hadzicfb3d9e92011-10-12 23:29:41 -0400943 .copy = &r600_copy_blit,
Alex Deuchera43b7662011-01-06 21:19:33 -0500944 .get_engine_clock = &radeon_atom_get_engine_clock,
945 .set_engine_clock = &radeon_atom_set_engine_clock,
946 .get_memory_clock = &radeon_atom_get_memory_clock,
947 .set_memory_clock = &radeon_atom_set_memory_clock,
948 .get_pcie_lanes = NULL,
949 .set_pcie_lanes = NULL,
950 .set_clock_gating = NULL,
951 .set_surface_reg = r600_set_surface_reg,
952 .clear_surface_reg = r600_clear_surface_reg,
953 .bandwidth_update = &evergreen_bandwidth_update,
954 .hpd_init = &evergreen_hpd_init,
955 .hpd_fini = &evergreen_hpd_fini,
956 .hpd_sense = &evergreen_hpd_sense,
957 .hpd_set_polarity = &evergreen_hpd_set_polarity,
Dave Airlie97bfd0a2011-05-19 14:14:43 +1000958 .ioctl_wait_idle = r600_ioctl_wait_idle,
Alex Deuchera43b7662011-01-06 21:19:33 -0500959 .gui_idle = &r600_gui_idle,
960 .pm_misc = &evergreen_pm_misc,
961 .pm_prepare = &evergreen_pm_prepare,
962 .pm_finish = &evergreen_pm_finish,
963 .pm_init_profile = &r600_pm_init_profile,
964 .pm_get_dynpm_state = &r600_pm_get_dynpm_state,
965 .pre_page_flip = &evergreen_pre_page_flip,
966 .page_flip = &evergreen_page_flip,
967 .post_page_flip = &evergreen_post_page_flip,
Alex Deucher3ae19b72012-02-23 17:53:37 -0500968 .wait_for_vblank = &dce4_wait_for_vblank,
Alex Deuchera43b7662011-01-06 21:19:33 -0500969};
970
Jerome Glisse721604a2012-01-05 22:11:05 -0500971static const struct radeon_vm_funcs cayman_vm_funcs = {
972 .init = &cayman_vm_init,
973 .fini = &cayman_vm_fini,
974 .bind = &cayman_vm_bind,
975 .unbind = &cayman_vm_unbind,
976 .tlb_flush = &cayman_vm_tlb_flush,
977 .page_flags = &cayman_vm_page_flags,
978 .set_page = &cayman_vm_set_page,
979};
980
Alex Deuchere3487622011-03-02 20:07:36 -0500981static struct radeon_asic cayman_asic = {
982 .init = &cayman_init,
983 .fini = &cayman_fini,
984 .suspend = &cayman_suspend,
985 .resume = &cayman_resume,
Alex Deuchere3487622011-03-02 20:07:36 -0500986 .gpu_is_lockup = &cayman_gpu_is_lockup,
987 .asic_reset = &cayman_asic_reset,
988 .vga_set_state = &r600_vga_set_state,
989 .gart_tlb_flush = &cayman_pcie_gart_tlb_flush,
990 .gart_set_page = &rs600_gart_set_page,
991 .ring_test = &r600_ring_test,
Christian König4c87bc22011-10-19 19:02:21 +0200992 .ring = {
993 [RADEON_RING_TYPE_GFX_INDEX] = {
Jerome Glisse721604a2012-01-05 22:11:05 -0500994 .ib_execute = &cayman_ring_ib_execute,
995 .ib_parse = &evergreen_ib_parse,
Alex Deucherb40e7e12011-11-17 14:57:50 -0500996 .emit_fence = &cayman_fence_ring_emit,
Christian König4c87bc22011-10-19 19:02:21 +0200997 .emit_semaphore = &r600_semaphore_ring_emit,
998 },
999 [CAYMAN_RING_TYPE_CP1_INDEX] = {
Jerome Glisse721604a2012-01-05 22:11:05 -05001000 .ib_execute = &cayman_ring_ib_execute,
1001 .ib_parse = &evergreen_ib_parse,
Alex Deucherb40e7e12011-11-17 14:57:50 -05001002 .emit_fence = &cayman_fence_ring_emit,
Christian König4c87bc22011-10-19 19:02:21 +02001003 .emit_semaphore = &r600_semaphore_ring_emit,
1004 },
1005 [CAYMAN_RING_TYPE_CP2_INDEX] = {
Jerome Glisse721604a2012-01-05 22:11:05 -05001006 .ib_execute = &cayman_ring_ib_execute,
1007 .ib_parse = &evergreen_ib_parse,
Alex Deucherb40e7e12011-11-17 14:57:50 -05001008 .emit_fence = &cayman_fence_ring_emit,
Christian König4c87bc22011-10-19 19:02:21 +02001009 .emit_semaphore = &r600_semaphore_ring_emit,
1010 }
1011 },
Alex Deuchere3487622011-03-02 20:07:36 -05001012 .irq_set = &evergreen_irq_set,
1013 .irq_process = &evergreen_irq_process,
1014 .get_vblank_counter = &evergreen_get_vblank_counter,
Alex Deuchere3487622011-03-02 20:07:36 -05001015 .cs_parse = &evergreen_cs_parse,
Ilija Hadzicfb3d9e92011-10-12 23:29:41 -04001016 .copy_blit = &r600_copy_blit,
Alex Deucher20633442011-06-13 21:33:39 +00001017 .copy_dma = NULL,
Ilija Hadzicfb3d9e92011-10-12 23:29:41 -04001018 .copy = &r600_copy_blit,
Alex Deuchere3487622011-03-02 20:07:36 -05001019 .get_engine_clock = &radeon_atom_get_engine_clock,
1020 .set_engine_clock = &radeon_atom_set_engine_clock,
1021 .get_memory_clock = &radeon_atom_get_memory_clock,
1022 .set_memory_clock = &radeon_atom_set_memory_clock,
1023 .get_pcie_lanes = NULL,
1024 .set_pcie_lanes = NULL,
1025 .set_clock_gating = NULL,
1026 .set_surface_reg = r600_set_surface_reg,
1027 .clear_surface_reg = r600_clear_surface_reg,
1028 .bandwidth_update = &evergreen_bandwidth_update,
1029 .hpd_init = &evergreen_hpd_init,
1030 .hpd_fini = &evergreen_hpd_fini,
1031 .hpd_sense = &evergreen_hpd_sense,
1032 .hpd_set_polarity = &evergreen_hpd_set_polarity,
Dave Airlie97bfd0a2011-05-19 14:14:43 +10001033 .ioctl_wait_idle = r600_ioctl_wait_idle,
Alex Deuchere3487622011-03-02 20:07:36 -05001034 .gui_idle = &r600_gui_idle,
1035 .pm_misc = &evergreen_pm_misc,
1036 .pm_prepare = &evergreen_pm_prepare,
1037 .pm_finish = &evergreen_pm_finish,
1038 .pm_init_profile = &r600_pm_init_profile,
1039 .pm_get_dynpm_state = &r600_pm_get_dynpm_state,
1040 .pre_page_flip = &evergreen_pre_page_flip,
1041 .page_flip = &evergreen_page_flip,
1042 .post_page_flip = &evergreen_post_page_flip,
Alex Deucher3ae19b72012-02-23 17:53:37 -05001043 .wait_for_vblank = &dce4_wait_for_vblank,
Alex Deuchere3487622011-03-02 20:07:36 -05001044};
1045
Daniel Vetter0a10c852010-03-11 21:19:14 +00001046int radeon_asic_init(struct radeon_device *rdev)
1047{
1048 radeon_register_accessor_init(rdev);
Alex Deucherba7e05e2011-06-16 18:14:22 +00001049
1050 /* set the number of crtcs */
1051 if (rdev->flags & RADEON_SINGLE_CRTC)
1052 rdev->num_crtc = 1;
1053 else
1054 rdev->num_crtc = 2;
1055
Alex Deucher3000bf32012-01-05 22:11:07 -05001056 /* set the ring used for bo copies */
1057 rdev->copy_ring = RADEON_RING_TYPE_GFX_INDEX;
1058
Daniel Vetter0a10c852010-03-11 21:19:14 +00001059 switch (rdev->family) {
1060 case CHIP_R100:
1061 case CHIP_RV100:
1062 case CHIP_RS100:
1063 case CHIP_RV200:
1064 case CHIP_RS200:
1065 rdev->asic = &r100_asic;
1066 break;
1067 case CHIP_R200:
1068 case CHIP_RV250:
1069 case CHIP_RS300:
1070 case CHIP_RV280:
1071 rdev->asic = &r200_asic;
1072 break;
1073 case CHIP_R300:
1074 case CHIP_R350:
1075 case CHIP_RV350:
1076 case CHIP_RV380:
1077 if (rdev->flags & RADEON_IS_PCIE)
1078 rdev->asic = &r300_asic_pcie;
1079 else
1080 rdev->asic = &r300_asic;
1081 break;
1082 case CHIP_R420:
1083 case CHIP_R423:
1084 case CHIP_RV410:
1085 rdev->asic = &r420_asic;
Alex Deucher07bb0842010-06-22 21:58:26 -04001086 /* handle macs */
1087 if (rdev->bios == NULL) {
1088 rdev->asic->get_engine_clock = &radeon_legacy_get_engine_clock;
1089 rdev->asic->set_engine_clock = &radeon_legacy_set_engine_clock;
1090 rdev->asic->get_memory_clock = &radeon_legacy_get_memory_clock;
1091 rdev->asic->set_memory_clock = NULL;
1092 }
Daniel Vetter0a10c852010-03-11 21:19:14 +00001093 break;
1094 case CHIP_RS400:
1095 case CHIP_RS480:
1096 rdev->asic = &rs400_asic;
1097 break;
1098 case CHIP_RS600:
1099 rdev->asic = &rs600_asic;
1100 break;
1101 case CHIP_RS690:
1102 case CHIP_RS740:
1103 rdev->asic = &rs690_asic;
1104 break;
1105 case CHIP_RV515:
1106 rdev->asic = &rv515_asic;
1107 break;
1108 case CHIP_R520:
1109 case CHIP_RV530:
1110 case CHIP_RV560:
1111 case CHIP_RV570:
1112 case CHIP_R580:
1113 rdev->asic = &r520_asic;
1114 break;
1115 case CHIP_R600:
1116 case CHIP_RV610:
1117 case CHIP_RV630:
1118 case CHIP_RV620:
1119 case CHIP_RV635:
1120 case CHIP_RV670:
Alex Deucherf47299c2010-03-16 20:54:38 -04001121 rdev->asic = &r600_asic;
1122 break;
Daniel Vetter0a10c852010-03-11 21:19:14 +00001123 case CHIP_RS780:
1124 case CHIP_RS880:
Alex Deucherf47299c2010-03-16 20:54:38 -04001125 rdev->asic = &rs780_asic;
Daniel Vetter0a10c852010-03-11 21:19:14 +00001126 break;
1127 case CHIP_RV770:
1128 case CHIP_RV730:
1129 case CHIP_RV710:
1130 case CHIP_RV740:
1131 rdev->asic = &rv770_asic;
1132 break;
1133 case CHIP_CEDAR:
1134 case CHIP_REDWOOD:
1135 case CHIP_JUNIPER:
1136 case CHIP_CYPRESS:
1137 case CHIP_HEMLOCK:
Alex Deucherba7e05e2011-06-16 18:14:22 +00001138 /* set num crtcs */
1139 if (rdev->family == CHIP_CEDAR)
1140 rdev->num_crtc = 4;
1141 else
1142 rdev->num_crtc = 6;
Daniel Vetter0a10c852010-03-11 21:19:14 +00001143 rdev->asic = &evergreen_asic;
1144 break;
Alex Deucher958261d2010-11-22 17:56:30 -05001145 case CHIP_PALM:
Alex Deucher89da5a32011-05-31 15:42:47 -04001146 case CHIP_SUMO:
1147 case CHIP_SUMO2:
Alex Deucher958261d2010-11-22 17:56:30 -05001148 rdev->asic = &sumo_asic;
1149 break;
Alex Deuchera43b7662011-01-06 21:19:33 -05001150 case CHIP_BARTS:
1151 case CHIP_TURKS:
1152 case CHIP_CAICOS:
Alex Deucherba7e05e2011-06-16 18:14:22 +00001153 /* set num crtcs */
1154 if (rdev->family == CHIP_CAICOS)
1155 rdev->num_crtc = 4;
1156 else
1157 rdev->num_crtc = 6;
Alex Deuchera43b7662011-01-06 21:19:33 -05001158 rdev->asic = &btc_asic;
1159 break;
Alex Deuchere3487622011-03-02 20:07:36 -05001160 case CHIP_CAYMAN:
1161 rdev->asic = &cayman_asic;
Alex Deucherba7e05e2011-06-16 18:14:22 +00001162 /* set num crtcs */
1163 rdev->num_crtc = 6;
Jerome Glisse721604a2012-01-05 22:11:05 -05001164 rdev->vm_manager.funcs = &cayman_vm_funcs;
Alex Deuchere3487622011-03-02 20:07:36 -05001165 break;
Daniel Vetter0a10c852010-03-11 21:19:14 +00001166 default:
1167 /* FIXME: not supported yet */
1168 return -EINVAL;
1169 }
1170
1171 if (rdev->flags & RADEON_IS_IGP) {
1172 rdev->asic->get_memory_clock = NULL;
1173 rdev->asic->set_memory_clock = NULL;
1174 }
1175
Daniel Vetter0a10c852010-03-11 21:19:14 +00001176 return 0;
1177}
1178