1/*	$NetBSD: radeon_asic.c,v 1.5 2021/12/18 23:45:43 riastradh Exp $	*/
2
3/*
4 * Copyright 2008 Advanced Micro Devices, Inc.
5 * Copyright 2008 Red Hat Inc.
6 * Copyright 2009 Jerome Glisse.
7 *
8 * Permission is hereby granted, free of charge, to any person obtaining a
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice shall be included in
16 * all copies or substantial portions of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
21 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
22 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
23 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
24 * OTHER DEALINGS IN THE SOFTWARE.
25 *
26 * Authors: Dave Airlie
27 *          Alex Deucher
28 *          Jerome Glisse
29 */
30
31#include <sys/cdefs.h>
32__KERNEL_RCSID(0, "$NetBSD: radeon_asic.c,v 1.5 2021/12/18 23:45:43 riastradh Exp $");
33
34#include <linux/console.h>
35#include <linux/pci.h>
36#include <linux/vgaarb.h>
37
38#include <drm/drm_crtc_helper.h>
39#include <drm/radeon_drm.h>
40
41#include "atom.h"
42#include "radeon.h"
43#include "radeon_asic.h"
44#include "radeon_reg.h"
45
46/*
47 * Registers accessors functions.
48 */
49/**
50 * radeon_invalid_rreg - dummy reg read function
51 *
52 * @rdev: radeon device pointer
53 * @reg: offset of register
54 *
55 * Dummy register read function.  Used for register blocks
56 * that certain asics don't have (all asics).
57 * Returns the value in the register.
58 */
59static uint32_t radeon_invalid_rreg(struct radeon_device *rdev, uint32_t reg)
60{
61	DRM_ERROR("Invalid callback to read register 0x%04X\n", reg);
62	BUG_ON(1);
63	return 0;
64}
65
66/**
67 * radeon_invalid_wreg - dummy reg write function
68 *
69 * @rdev: radeon device pointer
70 * @reg: offset of register
71 * @v: value to write to the register
72 *
73 * Dummy register read function.  Used for register blocks
74 * that certain asics don't have (all asics).
75 */
76static void radeon_invalid_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v)
77{
78	DRM_ERROR("Invalid callback to write register 0x%04X with 0x%08X\n",
79		  reg, v);
80	BUG_ON(1);
81}
82
83/**
84 * radeon_register_accessor_init - sets up the register accessor callbacks
85 *
86 * @rdev: radeon device pointer
87 *
88 * Sets up the register accessor callbacks for various register
89 * apertures.  Not all asics have all apertures (all asics).
90 */
91static void radeon_register_accessor_init(struct radeon_device *rdev)
92{
93	rdev->mc_rreg = &radeon_invalid_rreg;
94	rdev->mc_wreg = &radeon_invalid_wreg;
95	rdev->pll_rreg = &radeon_invalid_rreg;
96	rdev->pll_wreg = &radeon_invalid_wreg;
97	rdev->pciep_rreg = &radeon_invalid_rreg;
98	rdev->pciep_wreg = &radeon_invalid_wreg;
99
100	/* Don't change order as we are overridding accessor. */
101	if (rdev->family < CHIP_RV515) {
102		rdev->pcie_reg_mask = 0xff;
103	} else {
104		rdev->pcie_reg_mask = 0x7ff;
105	}
106	/* FIXME: not sure here */
107	if (rdev->family <= CHIP_R580) {
108		rdev->pll_rreg = &r100_pll_rreg;
109		rdev->pll_wreg = &r100_pll_wreg;
110	}
111	if (rdev->family >= CHIP_R420) {
112		rdev->mc_rreg = &r420_mc_rreg;
113		rdev->mc_wreg = &r420_mc_wreg;
114	}
115	if (rdev->family >= CHIP_RV515) {
116		rdev->mc_rreg = &rv515_mc_rreg;
117		rdev->mc_wreg = &rv515_mc_wreg;
118	}
119	if (rdev->family == CHIP_RS400 || rdev->family == CHIP_RS480) {
120		rdev->mc_rreg = &rs400_mc_rreg;
121		rdev->mc_wreg = &rs400_mc_wreg;
122	}
123	if (rdev->family == CHIP_RS690 || rdev->family == CHIP_RS740) {
124		rdev->mc_rreg = &rs690_mc_rreg;
125		rdev->mc_wreg = &rs690_mc_wreg;
126	}
127	if (rdev->family == CHIP_RS600) {
128		rdev->mc_rreg = &rs600_mc_rreg;
129		rdev->mc_wreg = &rs600_mc_wreg;
130	}
131	if (rdev->family == CHIP_RS780 || rdev->family == CHIP_RS880) {
132		rdev->mc_rreg = &rs780_mc_rreg;
133		rdev->mc_wreg = &rs780_mc_wreg;
134	}
135
136	if (rdev->family >= CHIP_BONAIRE) {
137		rdev->pciep_rreg = &cik_pciep_rreg;
138		rdev->pciep_wreg = &cik_pciep_wreg;
139	} else if (rdev->family >= CHIP_R600) {
140		rdev->pciep_rreg = &r600_pciep_rreg;
141		rdev->pciep_wreg = &r600_pciep_wreg;
142	}
143}
144
145static int radeon_invalid_get_allowed_info_register(struct radeon_device *rdev,
146						    u32 reg, u32 *val)
147{
148	return -EINVAL;
149}
150
151/* helper to disable agp */
152/**
153 * radeon_agp_disable - AGP disable helper function
154 *
155 * @rdev: radeon device pointer
156 *
157 * Removes AGP flags and changes the gart callbacks on AGP
158 * cards when using the internal gart rather than AGP (all asics).
159 */
160void radeon_agp_disable(struct radeon_device *rdev)
161{
162	rdev->flags &= ~RADEON_IS_AGP;
163	if (rdev->family >= CHIP_R600) {
164		DRM_INFO("Forcing AGP to PCIE mode\n");
165		rdev->flags |= RADEON_IS_PCIE;
166	} else if (rdev->family >= CHIP_RV515 ||
167			rdev->family == CHIP_RV380 ||
168			rdev->family == CHIP_RV410 ||
169			rdev->family == CHIP_R423) {
170		DRM_INFO("Forcing AGP to PCIE mode\n");
171		rdev->flags |= RADEON_IS_PCIE;
172		rdev->asic->gart.tlb_flush = &rv370_pcie_gart_tlb_flush;
173		rdev->asic->gart.get_page_entry = &rv370_pcie_gart_get_page_entry;
174		rdev->asic->gart.set_page = &rv370_pcie_gart_set_page;
175	} else {
176		DRM_INFO("Forcing AGP to PCI mode\n");
177		rdev->flags |= RADEON_IS_PCI;
178		rdev->asic->gart.tlb_flush = &r100_pci_gart_tlb_flush;
179		rdev->asic->gart.get_page_entry = &r100_pci_gart_get_page_entry;
180		rdev->asic->gart.set_page = &r100_pci_gart_set_page;
181	}
182	rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024;
183}
184
185/*
186 * ASIC
187 */
188
189static const struct radeon_asic_ring r100_gfx_ring = {
190	.ib_execute = &r100_ring_ib_execute,
191	.emit_fence = &r100_fence_ring_emit,
192	.emit_semaphore = &r100_semaphore_ring_emit,
193	.cs_parse = &r100_cs_parse,
194	.ring_start = &r100_ring_start,
195	.ring_test = &r100_ring_test,
196	.ib_test = &r100_ib_test,
197	.is_lockup = &r100_gpu_is_lockup,
198	.get_rptr = &r100_gfx_get_rptr,
199	.get_wptr = &r100_gfx_get_wptr,
200	.set_wptr = &r100_gfx_set_wptr,
201};
202
203static struct radeon_asic r100_asic = {
204	.init = &r100_init,
205	.fini = &r100_fini,
206	.suspend = &r100_suspend,
207	.resume = &r100_resume,
208	.vga_set_state = &r100_vga_set_state,
209	.asic_reset = &r100_asic_reset,
210	.mmio_hdp_flush = NULL,
211	.gui_idle = &r100_gui_idle,
212	.mc_wait_for_idle = &r100_mc_wait_for_idle,
213	.get_allowed_info_register = radeon_invalid_get_allowed_info_register,
214	.gart = {
215		.tlb_flush = &r100_pci_gart_tlb_flush,
216		.get_page_entry = &r100_pci_gart_get_page_entry,
217		.set_page = &r100_pci_gart_set_page,
218	},
219	.ring = {
220		[RADEON_RING_TYPE_GFX_INDEX] = &r100_gfx_ring
221	},
222	.irq = {
223		.set = &r100_irq_set,
224		.process = &r100_irq_process,
225	},
226	.display = {
227		.bandwidth_update = &r100_bandwidth_update,
228		.get_vblank_counter = &r100_get_vblank_counter,
229		.wait_for_vblank = &r100_wait_for_vblank,
230		.set_backlight_level = &radeon_legacy_set_backlight_level,
231		.get_backlight_level = &radeon_legacy_get_backlight_level,
232	},
233	.copy = {
234		.blit = &r100_copy_blit,
235		.blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
236		.dma = NULL,
237		.dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
238		.copy = &r100_copy_blit,
239		.copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
240	},
241	.surface = {
242		.set_reg = r100_set_surface_reg,
243		.clear_reg = r100_clear_surface_reg,
244	},
245	.hpd = {
246		.init = &r100_hpd_init,
247		.fini = &r100_hpd_fini,
248		.sense = &r100_hpd_sense,
249		.set_polarity = &r100_hpd_set_polarity,
250	},
251	.pm = {
252		.misc = &r100_pm_misc,
253		.prepare = &r100_pm_prepare,
254		.finish = &r100_pm_finish,
255		.init_profile = &r100_pm_init_profile,
256		.get_dynpm_state = &r100_pm_get_dynpm_state,
257		.get_engine_clock = &radeon_legacy_get_engine_clock,
258		.set_engine_clock = &radeon_legacy_set_engine_clock,
259		.get_memory_clock = &radeon_legacy_get_memory_clock,
260		.set_memory_clock = NULL,
261		.get_pcie_lanes = NULL,
262		.set_pcie_lanes = NULL,
263		.set_clock_gating = &radeon_legacy_set_clock_gating,
264	},
265	.pflip = {
266		.page_flip = &r100_page_flip,
267		.page_flip_pending = &r100_page_flip_pending,
268	},
269};
270
271static struct radeon_asic r200_asic = {
272	.init = &r100_init,
273	.fini = &r100_fini,
274	.suspend = &r100_suspend,
275	.resume = &r100_resume,
276	.vga_set_state = &r100_vga_set_state,
277	.asic_reset = &r100_asic_reset,
278	.mmio_hdp_flush = NULL,
279	.gui_idle = &r100_gui_idle,
280	.mc_wait_for_idle = &r100_mc_wait_for_idle,
281	.get_allowed_info_register = radeon_invalid_get_allowed_info_register,
282	.gart = {
283		.tlb_flush = &r100_pci_gart_tlb_flush,
284		.get_page_entry = &r100_pci_gart_get_page_entry,
285		.set_page = &r100_pci_gart_set_page,
286	},
287	.ring = {
288		[RADEON_RING_TYPE_GFX_INDEX] = &r100_gfx_ring
289	},
290	.irq = {
291		.set = &r100_irq_set,
292		.process = &r100_irq_process,
293	},
294	.display = {
295		.bandwidth_update = &r100_bandwidth_update,
296		.get_vblank_counter = &r100_get_vblank_counter,
297		.wait_for_vblank = &r100_wait_for_vblank,
298		.set_backlight_level = &radeon_legacy_set_backlight_level,
299		.get_backlight_level = &radeon_legacy_get_backlight_level,
300	},
301	.copy = {
302		.blit = &r100_copy_blit,
303		.blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
304		.dma = &r200_copy_dma,
305		.dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
306		.copy = &r100_copy_blit,
307		.copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
308	},
309	.surface = {
310		.set_reg = r100_set_surface_reg,
311		.clear_reg = r100_clear_surface_reg,
312	},
313	.hpd = {
314		.init = &r100_hpd_init,
315		.fini = &r100_hpd_fini,
316		.sense = &r100_hpd_sense,
317		.set_polarity = &r100_hpd_set_polarity,
318	},
319	.pm = {
320		.misc = &r100_pm_misc,
321		.prepare = &r100_pm_prepare,
322		.finish = &r100_pm_finish,
323		.init_profile = &r100_pm_init_profile,
324		.get_dynpm_state = &r100_pm_get_dynpm_state,
325		.get_engine_clock = &radeon_legacy_get_engine_clock,
326		.set_engine_clock = &radeon_legacy_set_engine_clock,
327		.get_memory_clock = &radeon_legacy_get_memory_clock,
328		.set_memory_clock = NULL,
329		.get_pcie_lanes = NULL,
330		.set_pcie_lanes = NULL,
331		.set_clock_gating = &radeon_legacy_set_clock_gating,
332	},
333	.pflip = {
334		.page_flip = &r100_page_flip,
335		.page_flip_pending = &r100_page_flip_pending,
336	},
337};
338
339static const struct radeon_asic_ring r300_gfx_ring = {
340	.ib_execute = &r100_ring_ib_execute,
341	.emit_fence = &r300_fence_ring_emit,
342	.emit_semaphore = &r100_semaphore_ring_emit,
343	.cs_parse = &r300_cs_parse,
344	.ring_start = &r300_ring_start,
345	.ring_test = &r100_ring_test,
346	.ib_test = &r100_ib_test,
347	.is_lockup = &r100_gpu_is_lockup,
348	.get_rptr = &r100_gfx_get_rptr,
349	.get_wptr = &r100_gfx_get_wptr,
350	.set_wptr = &r100_gfx_set_wptr,
351};
352
353static const struct radeon_asic_ring rv515_gfx_ring = {
354	.ib_execute = &r100_ring_ib_execute,
355	.emit_fence = &r300_fence_ring_emit,
356	.emit_semaphore = &r100_semaphore_ring_emit,
357	.cs_parse = &r300_cs_parse,
358	.ring_start = &rv515_ring_start,
359	.ring_test = &r100_ring_test,
360	.ib_test = &r100_ib_test,
361	.is_lockup = &r100_gpu_is_lockup,
362	.get_rptr = &r100_gfx_get_rptr,
363	.get_wptr = &r100_gfx_get_wptr,
364	.set_wptr = &r100_gfx_set_wptr,
365};
366
367static struct radeon_asic r300_asic = {
368	.init = &r300_init,
369	.fini = &r300_fini,
370	.suspend = &r300_suspend,
371	.resume = &r300_resume,
372	.vga_set_state = &r100_vga_set_state,
373	.asic_reset = &r300_asic_reset,
374	.mmio_hdp_flush = NULL,
375	.gui_idle = &r100_gui_idle,
376	.mc_wait_for_idle = &r300_mc_wait_for_idle,
377	.get_allowed_info_register = radeon_invalid_get_allowed_info_register,
378	.gart = {
379		.tlb_flush = &r100_pci_gart_tlb_flush,
380		.get_page_entry = &r100_pci_gart_get_page_entry,
381		.set_page = &r100_pci_gart_set_page,
382	},
383	.ring = {
384		[RADEON_RING_TYPE_GFX_INDEX] = &r300_gfx_ring
385	},
386	.irq = {
387		.set = &r100_irq_set,
388		.process = &r100_irq_process,
389	},
390	.display = {
391		.bandwidth_update = &r100_bandwidth_update,
392		.get_vblank_counter = &r100_get_vblank_counter,
393		.wait_for_vblank = &r100_wait_for_vblank,
394		.set_backlight_level = &radeon_legacy_set_backlight_level,
395		.get_backlight_level = &radeon_legacy_get_backlight_level,
396	},
397	.copy = {
398		.blit = &r100_copy_blit,
399		.blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
400		.dma = &r200_copy_dma,
401		.dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
402		.copy = &r100_copy_blit,
403		.copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
404	},
405	.surface = {
406		.set_reg = r100_set_surface_reg,
407		.clear_reg = r100_clear_surface_reg,
408	},
409	.hpd = {
410		.init = &r100_hpd_init,
411		.fini = &r100_hpd_fini,
412		.sense = &r100_hpd_sense,
413		.set_polarity = &r100_hpd_set_polarity,
414	},
415	.pm = {
416		.misc = &r100_pm_misc,
417		.prepare = &r100_pm_prepare,
418		.finish = &r100_pm_finish,
419		.init_profile = &r100_pm_init_profile,
420		.get_dynpm_state = &r100_pm_get_dynpm_state,
421		.get_engine_clock = &radeon_legacy_get_engine_clock,
422		.set_engine_clock = &radeon_legacy_set_engine_clock,
423		.get_memory_clock = &radeon_legacy_get_memory_clock,
424		.set_memory_clock = NULL,
425		.get_pcie_lanes = &rv370_get_pcie_lanes,
426		.set_pcie_lanes = &rv370_set_pcie_lanes,
427		.set_clock_gating = &radeon_legacy_set_clock_gating,
428	},
429	.pflip = {
430		.page_flip = &r100_page_flip,
431		.page_flip_pending = &r100_page_flip_pending,
432	},
433};
434
435static struct radeon_asic r300_asic_pcie = {
436	.init = &r300_init,
437	.fini = &r300_fini,
438	.suspend = &r300_suspend,
439	.resume = &r300_resume,
440	.vga_set_state = &r100_vga_set_state,
441	.asic_reset = &r300_asic_reset,
442	.mmio_hdp_flush = NULL,
443	.gui_idle = &r100_gui_idle,
444	.mc_wait_for_idle = &r300_mc_wait_for_idle,
445	.get_allowed_info_register = radeon_invalid_get_allowed_info_register,
446	.gart = {
447		.tlb_flush = &rv370_pcie_gart_tlb_flush,
448		.get_page_entry = &rv370_pcie_gart_get_page_entry,
449		.set_page = &rv370_pcie_gart_set_page,
450	},
451	.ring = {
452		[RADEON_RING_TYPE_GFX_INDEX] = &r300_gfx_ring
453	},
454	.irq = {
455		.set = &r100_irq_set,
456		.process = &r100_irq_process,
457	},
458	.display = {
459		.bandwidth_update = &r100_bandwidth_update,
460		.get_vblank_counter = &r100_get_vblank_counter,
461		.wait_for_vblank = &r100_wait_for_vblank,
462		.set_backlight_level = &radeon_legacy_set_backlight_level,
463		.get_backlight_level = &radeon_legacy_get_backlight_level,
464	},
465	.copy = {
466		.blit = &r100_copy_blit,
467		.blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
468		.dma = &r200_copy_dma,
469		.dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
470		.copy = &r100_copy_blit,
471		.copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
472	},
473	.surface = {
474		.set_reg = r100_set_surface_reg,
475		.clear_reg = r100_clear_surface_reg,
476	},
477	.hpd = {
478		.init = &r100_hpd_init,
479		.fini = &r100_hpd_fini,
480		.sense = &r100_hpd_sense,
481		.set_polarity = &r100_hpd_set_polarity,
482	},
483	.pm = {
484		.misc = &r100_pm_misc,
485		.prepare = &r100_pm_prepare,
486		.finish = &r100_pm_finish,
487		.init_profile = &r100_pm_init_profile,
488		.get_dynpm_state = &r100_pm_get_dynpm_state,
489		.get_engine_clock = &radeon_legacy_get_engine_clock,
490		.set_engine_clock = &radeon_legacy_set_engine_clock,
491		.get_memory_clock = &radeon_legacy_get_memory_clock,
492		.set_memory_clock = NULL,
493		.get_pcie_lanes = &rv370_get_pcie_lanes,
494		.set_pcie_lanes = &rv370_set_pcie_lanes,
495		.set_clock_gating = &radeon_legacy_set_clock_gating,
496	},
497	.pflip = {
498		.page_flip = &r100_page_flip,
499		.page_flip_pending = &r100_page_flip_pending,
500	},
501};
502
503static struct radeon_asic r420_asic = {
504	.init = &r420_init,
505	.fini = &r420_fini,
506	.suspend = &r420_suspend,
507	.resume = &r420_resume,
508	.vga_set_state = &r100_vga_set_state,
509	.asic_reset = &r300_asic_reset,
510	.mmio_hdp_flush = NULL,
511	.gui_idle = &r100_gui_idle,
512	.mc_wait_for_idle = &r300_mc_wait_for_idle,
513	.get_allowed_info_register = radeon_invalid_get_allowed_info_register,
514	.gart = {
515		.tlb_flush = &rv370_pcie_gart_tlb_flush,
516		.get_page_entry = &rv370_pcie_gart_get_page_entry,
517		.set_page = &rv370_pcie_gart_set_page,
518	},
519	.ring = {
520		[RADEON_RING_TYPE_GFX_INDEX] = &r300_gfx_ring
521	},
522	.irq = {
523		.set = &r100_irq_set,
524		.process = &r100_irq_process,
525	},
526	.display = {
527		.bandwidth_update = &r100_bandwidth_update,
528		.get_vblank_counter = &r100_get_vblank_counter,
529		.wait_for_vblank = &r100_wait_for_vblank,
530		.set_backlight_level = &atombios_set_backlight_level,
531		.get_backlight_level = &atombios_get_backlight_level,
532	},
533	.copy = {
534		.blit = &r100_copy_blit,
535		.blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
536		.dma = &r200_copy_dma,
537		.dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
538		.copy = &r100_copy_blit,
539		.copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
540	},
541	.surface = {
542		.set_reg = r100_set_surface_reg,
543		.clear_reg = r100_clear_surface_reg,
544	},
545	.hpd = {
546		.init = &r100_hpd_init,
547		.fini = &r100_hpd_fini,
548		.sense = &r100_hpd_sense,
549		.set_polarity = &r100_hpd_set_polarity,
550	},
551	.pm = {
552		.misc = &r100_pm_misc,
553		.prepare = &r100_pm_prepare,
554		.finish = &r100_pm_finish,
555		.init_profile = &r420_pm_init_profile,
556		.get_dynpm_state = &r100_pm_get_dynpm_state,
557		.get_engine_clock = &radeon_atom_get_engine_clock,
558		.set_engine_clock = &radeon_atom_set_engine_clock,
559		.get_memory_clock = &radeon_atom_get_memory_clock,
560		.set_memory_clock = &radeon_atom_set_memory_clock,
561		.get_pcie_lanes = &rv370_get_pcie_lanes,
562		.set_pcie_lanes = &rv370_set_pcie_lanes,
563		.set_clock_gating = &radeon_atom_set_clock_gating,
564	},
565	.pflip = {
566		.page_flip = &r100_page_flip,
567		.page_flip_pending = &r100_page_flip_pending,
568	},
569};
570
571static struct radeon_asic rs400_asic = {
572	.init = &rs400_init,
573	.fini = &rs400_fini,
574	.suspend = &rs400_suspend,
575	.resume = &rs400_resume,
576	.vga_set_state = &r100_vga_set_state,
577	.asic_reset = &r300_asic_reset,
578	.mmio_hdp_flush = NULL,
579	.gui_idle = &r100_gui_idle,
580	.mc_wait_for_idle = &rs400_mc_wait_for_idle,
581	.get_allowed_info_register = radeon_invalid_get_allowed_info_register,
582	.gart = {
583		.tlb_flush = &rs400_gart_tlb_flush,
584		.get_page_entry = &rs400_gart_get_page_entry,
585		.set_page = &rs400_gart_set_page,
586	},
587	.ring = {
588		[RADEON_RING_TYPE_GFX_INDEX] = &r300_gfx_ring
589	},
590	.irq = {
591		.set = &r100_irq_set,
592		.process = &r100_irq_process,
593	},
594	.display = {
595		.bandwidth_update = &r100_bandwidth_update,
596		.get_vblank_counter = &r100_get_vblank_counter,
597		.wait_for_vblank = &r100_wait_for_vblank,
598		.set_backlight_level = &radeon_legacy_set_backlight_level,
599		.get_backlight_level = &radeon_legacy_get_backlight_level,
600	},
601	.copy = {
602		.blit = &r100_copy_blit,
603		.blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
604		.dma = &r200_copy_dma,
605		.dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
606		.copy = &r100_copy_blit,
607		.copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
608	},
609	.surface = {
610		.set_reg = r100_set_surface_reg,
611		.clear_reg = r100_clear_surface_reg,
612	},
613	.hpd = {
614		.init = &r100_hpd_init,
615		.fini = &r100_hpd_fini,
616		.sense = &r100_hpd_sense,
617		.set_polarity = &r100_hpd_set_polarity,
618	},
619	.pm = {
620		.misc = &r100_pm_misc,
621		.prepare = &r100_pm_prepare,
622		.finish = &r100_pm_finish,
623		.init_profile = &r100_pm_init_profile,
624		.get_dynpm_state = &r100_pm_get_dynpm_state,
625		.get_engine_clock = &radeon_legacy_get_engine_clock,
626		.set_engine_clock = &radeon_legacy_set_engine_clock,
627		.get_memory_clock = &radeon_legacy_get_memory_clock,
628		.set_memory_clock = NULL,
629		.get_pcie_lanes = NULL,
630		.set_pcie_lanes = NULL,
631		.set_clock_gating = &radeon_legacy_set_clock_gating,
632	},
633	.pflip = {
634		.page_flip = &r100_page_flip,
635		.page_flip_pending = &r100_page_flip_pending,
636	},
637};
638
639static struct radeon_asic rs600_asic = {
640	.init = &rs600_init,
641	.fini = &rs600_fini,
642	.suspend = &rs600_suspend,
643	.resume = &rs600_resume,
644	.vga_set_state = &r100_vga_set_state,
645	.asic_reset = &rs600_asic_reset,
646	.mmio_hdp_flush = NULL,
647	.gui_idle = &r100_gui_idle,
648	.mc_wait_for_idle = &rs600_mc_wait_for_idle,
649	.get_allowed_info_register = radeon_invalid_get_allowed_info_register,
650	.gart = {
651		.tlb_flush = &rs600_gart_tlb_flush,
652		.get_page_entry = &rs600_gart_get_page_entry,
653		.set_page = &rs600_gart_set_page,
654	},
655	.ring = {
656		[RADEON_RING_TYPE_GFX_INDEX] = &r300_gfx_ring
657	},
658	.irq = {
659		.set = &rs600_irq_set,
660		.process = &rs600_irq_process,
661	},
662	.display = {
663		.bandwidth_update = &rs600_bandwidth_update,
664		.get_vblank_counter = &rs600_get_vblank_counter,
665		.wait_for_vblank = &avivo_wait_for_vblank,
666		.set_backlight_level = &atombios_set_backlight_level,
667		.get_backlight_level = &atombios_get_backlight_level,
668	},
669	.copy = {
670		.blit = &r100_copy_blit,
671		.blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
672		.dma = &r200_copy_dma,
673		.dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
674		.copy = &r100_copy_blit,
675		.copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
676	},
677	.surface = {
678		.set_reg = r100_set_surface_reg,
679		.clear_reg = r100_clear_surface_reg,
680	},
681	.hpd = {
682		.init = &rs600_hpd_init,
683		.fini = &rs600_hpd_fini,
684		.sense = &rs600_hpd_sense,
685		.set_polarity = &rs600_hpd_set_polarity,
686	},
687	.pm = {
688		.misc = &rs600_pm_misc,
689		.prepare = &rs600_pm_prepare,
690		.finish = &rs600_pm_finish,
691		.init_profile = &r420_pm_init_profile,
692		.get_dynpm_state = &r100_pm_get_dynpm_state,
693		.get_engine_clock = &radeon_atom_get_engine_clock,
694		.set_engine_clock = &radeon_atom_set_engine_clock,
695		.get_memory_clock = &radeon_atom_get_memory_clock,
696		.set_memory_clock = &radeon_atom_set_memory_clock,
697		.get_pcie_lanes = NULL,
698		.set_pcie_lanes = NULL,
699		.set_clock_gating = &radeon_atom_set_clock_gating,
700	},
701	.pflip = {
702		.page_flip = &rs600_page_flip,
703		.page_flip_pending = &rs600_page_flip_pending,
704	},
705};
706
707static struct radeon_asic rs690_asic = {
708	.init = &rs690_init,
709	.fini = &rs690_fini,
710	.suspend = &rs690_suspend,
711	.resume = &rs690_resume,
712	.vga_set_state = &r100_vga_set_state,
713	.asic_reset = &rs600_asic_reset,
714	.mmio_hdp_flush = NULL,
715	.gui_idle = &r100_gui_idle,
716	.mc_wait_for_idle = &rs690_mc_wait_for_idle,
717	.get_allowed_info_register = radeon_invalid_get_allowed_info_register,
718	.gart = {
719		.tlb_flush = &rs400_gart_tlb_flush,
720		.get_page_entry = &rs400_gart_get_page_entry,
721		.set_page = &rs400_gart_set_page,
722	},
723	.ring = {
724		[RADEON_RING_TYPE_GFX_INDEX] = &r300_gfx_ring
725	},
726	.irq = {
727		.set = &rs600_irq_set,
728		.process = &rs600_irq_process,
729	},
730	.display = {
731		.get_vblank_counter = &rs600_get_vblank_counter,
732		.bandwidth_update = &rs690_bandwidth_update,
733		.wait_for_vblank = &avivo_wait_for_vblank,
734		.set_backlight_level = &atombios_set_backlight_level,
735		.get_backlight_level = &atombios_get_backlight_level,
736	},
737	.copy = {
738		.blit = &r100_copy_blit,
739		.blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
740		.dma = &r200_copy_dma,
741		.dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
742		.copy = &r200_copy_dma,
743		.copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
744	},
745	.surface = {
746		.set_reg = r100_set_surface_reg,
747		.clear_reg = r100_clear_surface_reg,
748	},
749	.hpd = {
750		.init = &rs600_hpd_init,
751		.fini = &rs600_hpd_fini,
752		.sense = &rs600_hpd_sense,
753		.set_polarity = &rs600_hpd_set_polarity,
754	},
755	.pm = {
756		.misc = &rs600_pm_misc,
757		.prepare = &rs600_pm_prepare,
758		.finish = &rs600_pm_finish,
759		.init_profile = &r420_pm_init_profile,
760		.get_dynpm_state = &r100_pm_get_dynpm_state,
761		.get_engine_clock = &radeon_atom_get_engine_clock,
762		.set_engine_clock = &radeon_atom_set_engine_clock,
763		.get_memory_clock = &radeon_atom_get_memory_clock,
764		.set_memory_clock = &radeon_atom_set_memory_clock,
765		.get_pcie_lanes = NULL,
766		.set_pcie_lanes = NULL,
767		.set_clock_gating = &radeon_atom_set_clock_gating,
768	},
769	.pflip = {
770		.page_flip = &rs600_page_flip,
771		.page_flip_pending = &rs600_page_flip_pending,
772	},
773};
774
775static struct radeon_asic rv515_asic = {
776	.init = &rv515_init,
777	.fini = &rv515_fini,
778	.suspend = &rv515_suspend,
779	.resume = &rv515_resume,
780	.vga_set_state = &r100_vga_set_state,
781	.asic_reset = &rs600_asic_reset,
782	.mmio_hdp_flush = NULL,
783	.gui_idle = &r100_gui_idle,
784	.mc_wait_for_idle = &rv515_mc_wait_for_idle,
785	.get_allowed_info_register = radeon_invalid_get_allowed_info_register,
786	.gart = {
787		.tlb_flush = &rv370_pcie_gart_tlb_flush,
788		.get_page_entry = &rv370_pcie_gart_get_page_entry,
789		.set_page = &rv370_pcie_gart_set_page,
790	},
791	.ring = {
792		[RADEON_RING_TYPE_GFX_INDEX] = &rv515_gfx_ring
793	},
794	.irq = {
795		.set = &rs600_irq_set,
796		.process = &rs600_irq_process,
797	},
798	.display = {
799		.get_vblank_counter = &rs600_get_vblank_counter,
800		.bandwidth_update = &rv515_bandwidth_update,
801		.wait_for_vblank = &avivo_wait_for_vblank,
802		.set_backlight_level = &atombios_set_backlight_level,
803		.get_backlight_level = &atombios_get_backlight_level,
804	},
805	.copy = {
806		.blit = &r100_copy_blit,
807		.blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
808		.dma = &r200_copy_dma,
809		.dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
810		.copy = &r100_copy_blit,
811		.copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
812	},
813	.surface = {
814		.set_reg = r100_set_surface_reg,
815		.clear_reg = r100_clear_surface_reg,
816	},
817	.hpd = {
818		.init = &rs600_hpd_init,
819		.fini = &rs600_hpd_fini,
820		.sense = &rs600_hpd_sense,
821		.set_polarity = &rs600_hpd_set_polarity,
822	},
823	.pm = {
824		.misc = &rs600_pm_misc,
825		.prepare = &rs600_pm_prepare,
826		.finish = &rs600_pm_finish,
827		.init_profile = &r420_pm_init_profile,
828		.get_dynpm_state = &r100_pm_get_dynpm_state,
829		.get_engine_clock = &radeon_atom_get_engine_clock,
830		.set_engine_clock = &radeon_atom_set_engine_clock,
831		.get_memory_clock = &radeon_atom_get_memory_clock,
832		.set_memory_clock = &radeon_atom_set_memory_clock,
833		.get_pcie_lanes = &rv370_get_pcie_lanes,
834		.set_pcie_lanes = &rv370_set_pcie_lanes,
835		.set_clock_gating = &radeon_atom_set_clock_gating,
836	},
837	.pflip = {
838		.page_flip = &rs600_page_flip,
839		.page_flip_pending = &rs600_page_flip_pending,
840	},
841};
842
843static struct radeon_asic r520_asic = {
844	.init = &r520_init,
845	.fini = &rv515_fini,
846	.suspend = &rv515_suspend,
847	.resume = &r520_resume,
848	.vga_set_state = &r100_vga_set_state,
849	.asic_reset = &rs600_asic_reset,
850	.mmio_hdp_flush = NULL,
851	.gui_idle = &r100_gui_idle,
852	.mc_wait_for_idle = &r520_mc_wait_for_idle,
853	.get_allowed_info_register = radeon_invalid_get_allowed_info_register,
854	.gart = {
855		.tlb_flush = &rv370_pcie_gart_tlb_flush,
856		.get_page_entry = &rv370_pcie_gart_get_page_entry,
857		.set_page = &rv370_pcie_gart_set_page,
858	},
859	.ring = {
860		[RADEON_RING_TYPE_GFX_INDEX] = &rv515_gfx_ring
861	},
862	.irq = {
863		.set = &rs600_irq_set,
864		.process = &rs600_irq_process,
865	},
866	.display = {
867		.bandwidth_update = &rv515_bandwidth_update,
868		.get_vblank_counter = &rs600_get_vblank_counter,
869		.wait_for_vblank = &avivo_wait_for_vblank,
870		.set_backlight_level = &atombios_set_backlight_level,
871		.get_backlight_level = &atombios_get_backlight_level,
872	},
873	.copy = {
874		.blit = &r100_copy_blit,
875		.blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
876		.dma = &r200_copy_dma,
877		.dma_ring_index = RADEON_RING_TYPE_GFX_INDEX,
878		.copy = &r100_copy_blit,
879		.copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
880	},
881	.surface = {
882		.set_reg = r100_set_surface_reg,
883		.clear_reg = r100_clear_surface_reg,
884	},
885	.hpd = {
886		.init = &rs600_hpd_init,
887		.fini = &rs600_hpd_fini,
888		.sense = &rs600_hpd_sense,
889		.set_polarity = &rs600_hpd_set_polarity,
890	},
891	.pm = {
892		.misc = &rs600_pm_misc,
893		.prepare = &rs600_pm_prepare,
894		.finish = &rs600_pm_finish,
895		.init_profile = &r420_pm_init_profile,
896		.get_dynpm_state = &r100_pm_get_dynpm_state,
897		.get_engine_clock = &radeon_atom_get_engine_clock,
898		.set_engine_clock = &radeon_atom_set_engine_clock,
899		.get_memory_clock = &radeon_atom_get_memory_clock,
900		.set_memory_clock = &radeon_atom_set_memory_clock,
901		.get_pcie_lanes = &rv370_get_pcie_lanes,
902		.set_pcie_lanes = &rv370_set_pcie_lanes,
903		.set_clock_gating = &radeon_atom_set_clock_gating,
904	},
905	.pflip = {
906		.page_flip = &rs600_page_flip,
907		.page_flip_pending = &rs600_page_flip_pending,
908	},
909};
910
911static const struct radeon_asic_ring r600_gfx_ring = {
912	.ib_execute = &r600_ring_ib_execute,
913	.emit_fence = &r600_fence_ring_emit,
914	.emit_semaphore = &r600_semaphore_ring_emit,
915	.cs_parse = &r600_cs_parse,
916	.ring_test = &r600_ring_test,
917	.ib_test = &r600_ib_test,
918	.is_lockup = &r600_gfx_is_lockup,
919	.get_rptr = &r600_gfx_get_rptr,
920	.get_wptr = &r600_gfx_get_wptr,
921	.set_wptr = &r600_gfx_set_wptr,
922};
923
924static const struct radeon_asic_ring r600_dma_ring = {
925	.ib_execute = &r600_dma_ring_ib_execute,
926	.emit_fence = &r600_dma_fence_ring_emit,
927	.emit_semaphore = &r600_dma_semaphore_ring_emit,
928	.cs_parse = &r600_dma_cs_parse,
929	.ring_test = &r600_dma_ring_test,
930	.ib_test = &r600_dma_ib_test,
931	.is_lockup = &r600_dma_is_lockup,
932	.get_rptr = &r600_dma_get_rptr,
933	.get_wptr = &r600_dma_get_wptr,
934	.set_wptr = &r600_dma_set_wptr,
935};
936
937static struct radeon_asic r600_asic = {
938	.init = &r600_init,
939	.fini = &r600_fini,
940	.suspend = &r600_suspend,
941	.resume = &r600_resume,
942	.vga_set_state = &r600_vga_set_state,
943	.asic_reset = &r600_asic_reset,
944	.mmio_hdp_flush = r600_mmio_hdp_flush,
945	.gui_idle = &r600_gui_idle,
946	.mc_wait_for_idle = &r600_mc_wait_for_idle,
947	.get_xclk = &r600_get_xclk,
948	.get_gpu_clock_counter = &r600_get_gpu_clock_counter,
949	.get_allowed_info_register = r600_get_allowed_info_register,
950	.gart = {
951		.tlb_flush = &r600_pcie_gart_tlb_flush,
952		.get_page_entry = &rs600_gart_get_page_entry,
953		.set_page = &rs600_gart_set_page,
954	},
955	.ring = {
956		[RADEON_RING_TYPE_GFX_INDEX] = &r600_gfx_ring,
957		[R600_RING_TYPE_DMA_INDEX] = &r600_dma_ring,
958	},
959	.irq = {
960		.set = &r600_irq_set,
961		.process = &r600_irq_process,
962	},
963	.display = {
964		.bandwidth_update = &rv515_bandwidth_update,
965		.get_vblank_counter = &rs600_get_vblank_counter,
966		.wait_for_vblank = &avivo_wait_for_vblank,
967		.set_backlight_level = &atombios_set_backlight_level,
968		.get_backlight_level = &atombios_get_backlight_level,
969	},
970	.copy = {
971		.blit = &r600_copy_cpdma,
972		.blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
973		.dma = &r600_copy_dma,
974		.dma_ring_index = R600_RING_TYPE_DMA_INDEX,
975		.copy = &r600_copy_cpdma,
976		.copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
977	},
978	.surface = {
979		.set_reg = r600_set_surface_reg,
980		.clear_reg = r600_clear_surface_reg,
981	},
982	.hpd = {
983		.init = &r600_hpd_init,
984		.fini = &r600_hpd_fini,
985		.sense = &r600_hpd_sense,
986		.set_polarity = &r600_hpd_set_polarity,
987	},
988	.pm = {
989		.misc = &r600_pm_misc,
990		.prepare = &rs600_pm_prepare,
991		.finish = &rs600_pm_finish,
992		.init_profile = &r600_pm_init_profile,
993		.get_dynpm_state = &r600_pm_get_dynpm_state,
994		.get_engine_clock = &radeon_atom_get_engine_clock,
995		.set_engine_clock = &radeon_atom_set_engine_clock,
996		.get_memory_clock = &radeon_atom_get_memory_clock,
997		.set_memory_clock = &radeon_atom_set_memory_clock,
998		.get_pcie_lanes = &r600_get_pcie_lanes,
999		.set_pcie_lanes = &r600_set_pcie_lanes,
1000		.set_clock_gating = NULL,
1001		.get_temperature = &rv6xx_get_temp,
1002	},
1003	.pflip = {
1004		.page_flip = &rs600_page_flip,
1005		.page_flip_pending = &rs600_page_flip_pending,
1006	},
1007};
1008
1009static const struct radeon_asic_ring rv6xx_uvd_ring = {
1010	.ib_execute = &uvd_v1_0_ib_execute,
1011	.emit_fence = &uvd_v1_0_fence_emit,
1012	.emit_semaphore = &uvd_v1_0_semaphore_emit,
1013	.cs_parse = &radeon_uvd_cs_parse,
1014	.ring_test = &uvd_v1_0_ring_test,
1015	.ib_test = &uvd_v1_0_ib_test,
1016	.is_lockup = &radeon_ring_test_lockup,
1017	.get_rptr = &uvd_v1_0_get_rptr,
1018	.get_wptr = &uvd_v1_0_get_wptr,
1019	.set_wptr = &uvd_v1_0_set_wptr,
1020};
1021
1022static struct radeon_asic rv6xx_asic = {
1023	.init = &r600_init,
1024	.fini = &r600_fini,
1025	.suspend = &r600_suspend,
1026	.resume = &r600_resume,
1027	.vga_set_state = &r600_vga_set_state,
1028	.asic_reset = &r600_asic_reset,
1029	.mmio_hdp_flush = r600_mmio_hdp_flush,
1030	.gui_idle = &r600_gui_idle,
1031	.mc_wait_for_idle = &r600_mc_wait_for_idle,
1032	.get_xclk = &r600_get_xclk,
1033	.get_gpu_clock_counter = &r600_get_gpu_clock_counter,
1034	.get_allowed_info_register = r600_get_allowed_info_register,
1035	.gart = {
1036		.tlb_flush = &r600_pcie_gart_tlb_flush,
1037		.get_page_entry = &rs600_gart_get_page_entry,
1038		.set_page = &rs600_gart_set_page,
1039	},
1040	.ring = {
1041		[RADEON_RING_TYPE_GFX_INDEX] = &r600_gfx_ring,
1042		[R600_RING_TYPE_DMA_INDEX] = &r600_dma_ring,
1043		[R600_RING_TYPE_UVD_INDEX] = &rv6xx_uvd_ring,
1044	},
1045	.irq = {
1046		.set = &r600_irq_set,
1047		.process = &r600_irq_process,
1048	},
1049	.display = {
1050		.bandwidth_update = &rv515_bandwidth_update,
1051		.get_vblank_counter = &rs600_get_vblank_counter,
1052		.wait_for_vblank = &avivo_wait_for_vblank,
1053		.set_backlight_level = &atombios_set_backlight_level,
1054		.get_backlight_level = &atombios_get_backlight_level,
1055	},
1056	.copy = {
1057		.blit = &r600_copy_cpdma,
1058		.blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1059		.dma = &r600_copy_dma,
1060		.dma_ring_index = R600_RING_TYPE_DMA_INDEX,
1061		.copy = &r600_copy_cpdma,
1062		.copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1063	},
1064	.surface = {
1065		.set_reg = r600_set_surface_reg,
1066		.clear_reg = r600_clear_surface_reg,
1067	},
1068	.hpd = {
1069		.init = &r600_hpd_init,
1070		.fini = &r600_hpd_fini,
1071		.sense = &r600_hpd_sense,
1072		.set_polarity = &r600_hpd_set_polarity,
1073	},
1074	.pm = {
1075		.misc = &r600_pm_misc,
1076		.prepare = &rs600_pm_prepare,
1077		.finish = &rs600_pm_finish,
1078		.init_profile = &r600_pm_init_profile,
1079		.get_dynpm_state = &r600_pm_get_dynpm_state,
1080		.get_engine_clock = &radeon_atom_get_engine_clock,
1081		.set_engine_clock = &radeon_atom_set_engine_clock,
1082		.get_memory_clock = &radeon_atom_get_memory_clock,
1083		.set_memory_clock = &radeon_atom_set_memory_clock,
1084		.get_pcie_lanes = &r600_get_pcie_lanes,
1085		.set_pcie_lanes = &r600_set_pcie_lanes,
1086		.set_clock_gating = NULL,
1087		.get_temperature = &rv6xx_get_temp,
1088		.set_uvd_clocks = &r600_set_uvd_clocks,
1089	},
1090	.dpm = {
1091		.init = &rv6xx_dpm_init,
1092		.setup_asic = &rv6xx_setup_asic,
1093		.enable = &rv6xx_dpm_enable,
1094		.late_enable = &r600_dpm_late_enable,
1095		.disable = &rv6xx_dpm_disable,
1096		.pre_set_power_state = &r600_dpm_pre_set_power_state,
1097		.set_power_state = &rv6xx_dpm_set_power_state,
1098		.post_set_power_state = &r600_dpm_post_set_power_state,
1099		.display_configuration_changed = &rv6xx_dpm_display_configuration_changed,
1100		.fini = &rv6xx_dpm_fini,
1101		.get_sclk = &rv6xx_dpm_get_sclk,
1102		.get_mclk = &rv6xx_dpm_get_mclk,
1103		.print_power_state = &rv6xx_dpm_print_power_state,
1104#ifdef CONFIG_DEBUG_FS
1105		.debugfs_print_current_performance_level = &rv6xx_dpm_debugfs_print_current_performance_level,
1106#endif
1107		.force_performance_level = &rv6xx_dpm_force_performance_level,
1108		.get_current_sclk = &rv6xx_dpm_get_current_sclk,
1109		.get_current_mclk = &rv6xx_dpm_get_current_mclk,
1110	},
1111	.pflip = {
1112		.page_flip = &rs600_page_flip,
1113		.page_flip_pending = &rs600_page_flip_pending,
1114	},
1115};
1116
1117static struct radeon_asic rs780_asic = {
1118	.init = &r600_init,
1119	.fini = &r600_fini,
1120	.suspend = &r600_suspend,
1121	.resume = &r600_resume,
1122	.vga_set_state = &r600_vga_set_state,
1123	.asic_reset = &r600_asic_reset,
1124	.mmio_hdp_flush = r600_mmio_hdp_flush,
1125	.gui_idle = &r600_gui_idle,
1126	.mc_wait_for_idle = &r600_mc_wait_for_idle,
1127	.get_xclk = &r600_get_xclk,
1128	.get_gpu_clock_counter = &r600_get_gpu_clock_counter,
1129	.get_allowed_info_register = r600_get_allowed_info_register,
1130	.gart = {
1131		.tlb_flush = &r600_pcie_gart_tlb_flush,
1132		.get_page_entry = &rs600_gart_get_page_entry,
1133		.set_page = &rs600_gart_set_page,
1134	},
1135	.ring = {
1136		[RADEON_RING_TYPE_GFX_INDEX] = &r600_gfx_ring,
1137		[R600_RING_TYPE_DMA_INDEX] = &r600_dma_ring,
1138		[R600_RING_TYPE_UVD_INDEX] = &rv6xx_uvd_ring,
1139	},
1140	.irq = {
1141		.set = &r600_irq_set,
1142		.process = &r600_irq_process,
1143	},
1144	.display = {
1145		.bandwidth_update = &rs690_bandwidth_update,
1146		.get_vblank_counter = &rs600_get_vblank_counter,
1147		.wait_for_vblank = &avivo_wait_for_vblank,
1148		.set_backlight_level = &atombios_set_backlight_level,
1149		.get_backlight_level = &atombios_get_backlight_level,
1150	},
1151	.copy = {
1152		.blit = &r600_copy_cpdma,
1153		.blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1154		.dma = &r600_copy_dma,
1155		.dma_ring_index = R600_RING_TYPE_DMA_INDEX,
1156		.copy = &r600_copy_cpdma,
1157		.copy_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1158	},
1159	.surface = {
1160		.set_reg = r600_set_surface_reg,
1161		.clear_reg = r600_clear_surface_reg,
1162	},
1163	.hpd = {
1164		.init = &r600_hpd_init,
1165		.fini = &r600_hpd_fini,
1166		.sense = &r600_hpd_sense,
1167		.set_polarity = &r600_hpd_set_polarity,
1168	},
1169	.pm = {
1170		.misc = &r600_pm_misc,
1171		.prepare = &rs600_pm_prepare,
1172		.finish = &rs600_pm_finish,
1173		.init_profile = &rs780_pm_init_profile,
1174		.get_dynpm_state = &r600_pm_get_dynpm_state,
1175		.get_engine_clock = &radeon_atom_get_engine_clock,
1176		.set_engine_clock = &radeon_atom_set_engine_clock,
1177		.get_memory_clock = NULL,
1178		.set_memory_clock = NULL,
1179		.get_pcie_lanes = NULL,
1180		.set_pcie_lanes = NULL,
1181		.set_clock_gating = NULL,
1182		.get_temperature = &rv6xx_get_temp,
1183		.set_uvd_clocks = &r600_set_uvd_clocks,
1184	},
1185	.dpm = {
1186		.init = &rs780_dpm_init,
1187		.setup_asic = &rs780_dpm_setup_asic,
1188		.enable = &rs780_dpm_enable,
1189		.late_enable = &r600_dpm_late_enable,
1190		.disable = &rs780_dpm_disable,
1191		.pre_set_power_state = &r600_dpm_pre_set_power_state,
1192		.set_power_state = &rs780_dpm_set_power_state,
1193		.post_set_power_state = &r600_dpm_post_set_power_state,
1194		.display_configuration_changed = &rs780_dpm_display_configuration_changed,
1195		.fini = &rs780_dpm_fini,
1196		.get_sclk = &rs780_dpm_get_sclk,
1197		.get_mclk = &rs780_dpm_get_mclk,
1198		.print_power_state = &rs780_dpm_print_power_state,
1199#ifdef CONFIG_DEBUG_FS
1200		.debugfs_print_current_performance_level = &rs780_dpm_debugfs_print_current_performance_level,
1201#endif
1202		.force_performance_level = &rs780_dpm_force_performance_level,
1203		.get_current_sclk = &rs780_dpm_get_current_sclk,
1204		.get_current_mclk = &rs780_dpm_get_current_mclk,
1205	},
1206	.pflip = {
1207		.page_flip = &rs600_page_flip,
1208		.page_flip_pending = &rs600_page_flip_pending,
1209	},
1210};
1211
1212static const struct radeon_asic_ring rv770_uvd_ring = {
1213	.ib_execute = &uvd_v1_0_ib_execute,
1214	.emit_fence = &uvd_v2_2_fence_emit,
1215	.emit_semaphore = &uvd_v2_2_semaphore_emit,
1216	.cs_parse = &radeon_uvd_cs_parse,
1217	.ring_test = &uvd_v1_0_ring_test,
1218	.ib_test = &uvd_v1_0_ib_test,
1219	.is_lockup = &radeon_ring_test_lockup,
1220	.get_rptr = &uvd_v1_0_get_rptr,
1221	.get_wptr = &uvd_v1_0_get_wptr,
1222	.set_wptr = &uvd_v1_0_set_wptr,
1223};
1224
1225static struct radeon_asic rv770_asic = {
1226	.init = &rv770_init,
1227	.fini = &rv770_fini,
1228	.suspend = &rv770_suspend,
1229	.resume = &rv770_resume,
1230	.asic_reset = &r600_asic_reset,
1231	.vga_set_state = &r600_vga_set_state,
1232	.mmio_hdp_flush = r600_mmio_hdp_flush,
1233	.gui_idle = &r600_gui_idle,
1234	.mc_wait_for_idle = &r600_mc_wait_for_idle,
1235	.get_xclk = &rv770_get_xclk,
1236	.get_gpu_clock_counter = &r600_get_gpu_clock_counter,
1237	.get_allowed_info_register = r600_get_allowed_info_register,
1238	.gart = {
1239		.tlb_flush = &r600_pcie_gart_tlb_flush,
1240		.get_page_entry = &rs600_gart_get_page_entry,
1241		.set_page = &rs600_gart_set_page,
1242	},
1243	.ring = {
1244		[RADEON_RING_TYPE_GFX_INDEX] = &r600_gfx_ring,
1245		[R600_RING_TYPE_DMA_INDEX] = &r600_dma_ring,
1246		[R600_RING_TYPE_UVD_INDEX] = &rv770_uvd_ring,
1247	},
1248	.irq = {
1249		.set = &r600_irq_set,
1250		.process = &r600_irq_process,
1251	},
1252	.display = {
1253		.bandwidth_update = &rv515_bandwidth_update,
1254		.get_vblank_counter = &rs600_get_vblank_counter,
1255		.wait_for_vblank = &avivo_wait_for_vblank,
1256		.set_backlight_level = &atombios_set_backlight_level,
1257		.get_backlight_level = &atombios_get_backlight_level,
1258	},
1259	.copy = {
1260		.blit = &r600_copy_cpdma,
1261		.blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1262		.dma = &rv770_copy_dma,
1263		.dma_ring_index = R600_RING_TYPE_DMA_INDEX,
1264		.copy = &rv770_copy_dma,
1265		.copy_ring_index = R600_RING_TYPE_DMA_INDEX,
1266	},
1267	.surface = {
1268		.set_reg = r600_set_surface_reg,
1269		.clear_reg = r600_clear_surface_reg,
1270	},
1271	.hpd = {
1272		.init = &r600_hpd_init,
1273		.fini = &r600_hpd_fini,
1274		.sense = &r600_hpd_sense,
1275		.set_polarity = &r600_hpd_set_polarity,
1276	},
1277	.pm = {
1278		.misc = &rv770_pm_misc,
1279		.prepare = &rs600_pm_prepare,
1280		.finish = &rs600_pm_finish,
1281		.init_profile = &r600_pm_init_profile,
1282		.get_dynpm_state = &r600_pm_get_dynpm_state,
1283		.get_engine_clock = &radeon_atom_get_engine_clock,
1284		.set_engine_clock = &radeon_atom_set_engine_clock,
1285		.get_memory_clock = &radeon_atom_get_memory_clock,
1286		.set_memory_clock = &radeon_atom_set_memory_clock,
1287		.get_pcie_lanes = &r600_get_pcie_lanes,
1288		.set_pcie_lanes = &r600_set_pcie_lanes,
1289		.set_clock_gating = &radeon_atom_set_clock_gating,
1290		.set_uvd_clocks = &rv770_set_uvd_clocks,
1291		.get_temperature = &rv770_get_temp,
1292	},
1293	.dpm = {
1294		.init = &rv770_dpm_init,
1295		.setup_asic = &rv770_dpm_setup_asic,
1296		.enable = &rv770_dpm_enable,
1297		.late_enable = &rv770_dpm_late_enable,
1298		.disable = &rv770_dpm_disable,
1299		.pre_set_power_state = &r600_dpm_pre_set_power_state,
1300		.set_power_state = &rv770_dpm_set_power_state,
1301		.post_set_power_state = &r600_dpm_post_set_power_state,
1302		.display_configuration_changed = &rv770_dpm_display_configuration_changed,
1303		.fini = &rv770_dpm_fini,
1304		.get_sclk = &rv770_dpm_get_sclk,
1305		.get_mclk = &rv770_dpm_get_mclk,
1306		.print_power_state = &rv770_dpm_print_power_state,
1307#ifdef CONFIG_DEBUG_FS
1308		.debugfs_print_current_performance_level = &rv770_dpm_debugfs_print_current_performance_level,
1309#endif
1310		.force_performance_level = &rv770_dpm_force_performance_level,
1311		.vblank_too_short = &rv770_dpm_vblank_too_short,
1312		.get_current_sclk = &rv770_dpm_get_current_sclk,
1313		.get_current_mclk = &rv770_dpm_get_current_mclk,
1314	},
1315	.pflip = {
1316		.page_flip = &rv770_page_flip,
1317		.page_flip_pending = &rv770_page_flip_pending,
1318	},
1319};
1320
1321static const struct radeon_asic_ring evergreen_gfx_ring = {
1322	.ib_execute = &evergreen_ring_ib_execute,
1323	.emit_fence = &r600_fence_ring_emit,
1324	.emit_semaphore = &r600_semaphore_ring_emit,
1325	.cs_parse = &evergreen_cs_parse,
1326	.ring_test = &r600_ring_test,
1327	.ib_test = &r600_ib_test,
1328	.is_lockup = &evergreen_gfx_is_lockup,
1329	.get_rptr = &r600_gfx_get_rptr,
1330	.get_wptr = &r600_gfx_get_wptr,
1331	.set_wptr = &r600_gfx_set_wptr,
1332};
1333
1334static const struct radeon_asic_ring evergreen_dma_ring = {
1335	.ib_execute = &evergreen_dma_ring_ib_execute,
1336	.emit_fence = &evergreen_dma_fence_ring_emit,
1337	.emit_semaphore = &r600_dma_semaphore_ring_emit,
1338	.cs_parse = &evergreen_dma_cs_parse,
1339	.ring_test = &r600_dma_ring_test,
1340	.ib_test = &r600_dma_ib_test,
1341	.is_lockup = &evergreen_dma_is_lockup,
1342	.get_rptr = &r600_dma_get_rptr,
1343	.get_wptr = &r600_dma_get_wptr,
1344	.set_wptr = &r600_dma_set_wptr,
1345};
1346
1347static struct radeon_asic evergreen_asic = {
1348	.init = &evergreen_init,
1349	.fini = &evergreen_fini,
1350	.suspend = &evergreen_suspend,
1351	.resume = &evergreen_resume,
1352	.asic_reset = &evergreen_asic_reset,
1353	.vga_set_state = &r600_vga_set_state,
1354	.mmio_hdp_flush = r600_mmio_hdp_flush,
1355	.gui_idle = &r600_gui_idle,
1356	.mc_wait_for_idle = &evergreen_mc_wait_for_idle,
1357	.get_xclk = &rv770_get_xclk,
1358	.get_gpu_clock_counter = &r600_get_gpu_clock_counter,
1359	.get_allowed_info_register = evergreen_get_allowed_info_register,
1360	.gart = {
1361		.tlb_flush = &evergreen_pcie_gart_tlb_flush,
1362		.get_page_entry = &rs600_gart_get_page_entry,
1363		.set_page = &rs600_gart_set_page,
1364	},
1365	.ring = {
1366		[RADEON_RING_TYPE_GFX_INDEX] = &evergreen_gfx_ring,
1367		[R600_RING_TYPE_DMA_INDEX] = &evergreen_dma_ring,
1368		[R600_RING_TYPE_UVD_INDEX] = &rv770_uvd_ring,
1369	},
1370	.irq = {
1371		.set = &evergreen_irq_set,
1372		.process = &evergreen_irq_process,
1373	},
1374	.display = {
1375		.bandwidth_update = &evergreen_bandwidth_update,
1376		.get_vblank_counter = &evergreen_get_vblank_counter,
1377		.wait_for_vblank = &dce4_wait_for_vblank,
1378		.set_backlight_level = &atombios_set_backlight_level,
1379		.get_backlight_level = &atombios_get_backlight_level,
1380	},
1381	.copy = {
1382		.blit = &r600_copy_cpdma,
1383		.blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1384		.dma = &evergreen_copy_dma,
1385		.dma_ring_index = R600_RING_TYPE_DMA_INDEX,
1386		.copy = &evergreen_copy_dma,
1387		.copy_ring_index = R600_RING_TYPE_DMA_INDEX,
1388	},
1389	.surface = {
1390		.set_reg = r600_set_surface_reg,
1391		.clear_reg = r600_clear_surface_reg,
1392	},
1393	.hpd = {
1394		.init = &evergreen_hpd_init,
1395		.fini = &evergreen_hpd_fini,
1396		.sense = &evergreen_hpd_sense,
1397		.set_polarity = &evergreen_hpd_set_polarity,
1398	},
1399	.pm = {
1400		.misc = &evergreen_pm_misc,
1401		.prepare = &evergreen_pm_prepare,
1402		.finish = &evergreen_pm_finish,
1403		.init_profile = &r600_pm_init_profile,
1404		.get_dynpm_state = &r600_pm_get_dynpm_state,
1405		.get_engine_clock = &radeon_atom_get_engine_clock,
1406		.set_engine_clock = &radeon_atom_set_engine_clock,
1407		.get_memory_clock = &radeon_atom_get_memory_clock,
1408		.set_memory_clock = &radeon_atom_set_memory_clock,
1409		.get_pcie_lanes = &r600_get_pcie_lanes,
1410		.set_pcie_lanes = &r600_set_pcie_lanes,
1411		.set_clock_gating = NULL,
1412		.set_uvd_clocks = &evergreen_set_uvd_clocks,
1413		.get_temperature = &evergreen_get_temp,
1414	},
1415	.dpm = {
1416		.init = &cypress_dpm_init,
1417		.setup_asic = &cypress_dpm_setup_asic,
1418		.enable = &cypress_dpm_enable,
1419		.late_enable = &rv770_dpm_late_enable,
1420		.disable = &cypress_dpm_disable,
1421		.pre_set_power_state = &r600_dpm_pre_set_power_state,
1422		.set_power_state = &cypress_dpm_set_power_state,
1423		.post_set_power_state = &r600_dpm_post_set_power_state,
1424		.display_configuration_changed = &cypress_dpm_display_configuration_changed,
1425		.fini = &cypress_dpm_fini,
1426		.get_sclk = &rv770_dpm_get_sclk,
1427		.get_mclk = &rv770_dpm_get_mclk,
1428		.print_power_state = &rv770_dpm_print_power_state,
1429#ifdef CONFIG_DEBUG_FS
1430		.debugfs_print_current_performance_level = &rv770_dpm_debugfs_print_current_performance_level,
1431#endif
1432		.force_performance_level = &rv770_dpm_force_performance_level,
1433		.vblank_too_short = &cypress_dpm_vblank_too_short,
1434		.get_current_sclk = &rv770_dpm_get_current_sclk,
1435		.get_current_mclk = &rv770_dpm_get_current_mclk,
1436	},
1437	.pflip = {
1438		.page_flip = &evergreen_page_flip,
1439		.page_flip_pending = &evergreen_page_flip_pending,
1440	},
1441};
1442
1443static struct radeon_asic sumo_asic = {
1444	.init = &evergreen_init,
1445	.fini = &evergreen_fini,
1446	.suspend = &evergreen_suspend,
1447	.resume = &evergreen_resume,
1448	.asic_reset = &evergreen_asic_reset,
1449	.vga_set_state = &r600_vga_set_state,
1450	.mmio_hdp_flush = r600_mmio_hdp_flush,
1451	.gui_idle = &r600_gui_idle,
1452	.mc_wait_for_idle = &evergreen_mc_wait_for_idle,
1453	.get_xclk = &r600_get_xclk,
1454	.get_gpu_clock_counter = &r600_get_gpu_clock_counter,
1455	.get_allowed_info_register = evergreen_get_allowed_info_register,
1456	.gart = {
1457		.tlb_flush = &evergreen_pcie_gart_tlb_flush,
1458		.get_page_entry = &rs600_gart_get_page_entry,
1459		.set_page = &rs600_gart_set_page,
1460	},
1461	.ring = {
1462		[RADEON_RING_TYPE_GFX_INDEX] = &evergreen_gfx_ring,
1463		[R600_RING_TYPE_DMA_INDEX] = &evergreen_dma_ring,
1464		[R600_RING_TYPE_UVD_INDEX] = &rv770_uvd_ring,
1465	},
1466	.irq = {
1467		.set = &evergreen_irq_set,
1468		.process = &evergreen_irq_process,
1469	},
1470	.display = {
1471		.bandwidth_update = &evergreen_bandwidth_update,
1472		.get_vblank_counter = &evergreen_get_vblank_counter,
1473		.wait_for_vblank = &dce4_wait_for_vblank,
1474		.set_backlight_level = &atombios_set_backlight_level,
1475		.get_backlight_level = &atombios_get_backlight_level,
1476	},
1477	.copy = {
1478		.blit = &r600_copy_cpdma,
1479		.blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1480		.dma = &evergreen_copy_dma,
1481		.dma_ring_index = R600_RING_TYPE_DMA_INDEX,
1482		.copy = &evergreen_copy_dma,
1483		.copy_ring_index = R600_RING_TYPE_DMA_INDEX,
1484	},
1485	.surface = {
1486		.set_reg = r600_set_surface_reg,
1487		.clear_reg = r600_clear_surface_reg,
1488	},
1489	.hpd = {
1490		.init = &evergreen_hpd_init,
1491		.fini = &evergreen_hpd_fini,
1492		.sense = &evergreen_hpd_sense,
1493		.set_polarity = &evergreen_hpd_set_polarity,
1494	},
1495	.pm = {
1496		.misc = &evergreen_pm_misc,
1497		.prepare = &evergreen_pm_prepare,
1498		.finish = &evergreen_pm_finish,
1499		.init_profile = &sumo_pm_init_profile,
1500		.get_dynpm_state = &r600_pm_get_dynpm_state,
1501		.get_engine_clock = &radeon_atom_get_engine_clock,
1502		.set_engine_clock = &radeon_atom_set_engine_clock,
1503		.get_memory_clock = NULL,
1504		.set_memory_clock = NULL,
1505		.get_pcie_lanes = NULL,
1506		.set_pcie_lanes = NULL,
1507		.set_clock_gating = NULL,
1508		.set_uvd_clocks = &sumo_set_uvd_clocks,
1509		.get_temperature = &sumo_get_temp,
1510	},
1511	.dpm = {
1512		.init = &sumo_dpm_init,
1513		.setup_asic = &sumo_dpm_setup_asic,
1514		.enable = &sumo_dpm_enable,
1515		.late_enable = &sumo_dpm_late_enable,
1516		.disable = &sumo_dpm_disable,
1517		.pre_set_power_state = &sumo_dpm_pre_set_power_state,
1518		.set_power_state = &sumo_dpm_set_power_state,
1519		.post_set_power_state = &sumo_dpm_post_set_power_state,
1520		.display_configuration_changed = &sumo_dpm_display_configuration_changed,
1521		.fini = &sumo_dpm_fini,
1522		.get_sclk = &sumo_dpm_get_sclk,
1523		.get_mclk = &sumo_dpm_get_mclk,
1524		.print_power_state = &sumo_dpm_print_power_state,
1525#ifdef CONFIG_DEBUG_FS
1526		.debugfs_print_current_performance_level = &sumo_dpm_debugfs_print_current_performance_level,
1527#endif
1528		.force_performance_level = &sumo_dpm_force_performance_level,
1529		.get_current_sclk = &sumo_dpm_get_current_sclk,
1530		.get_current_mclk = &sumo_dpm_get_current_mclk,
1531	},
1532	.pflip = {
1533		.page_flip = &evergreen_page_flip,
1534		.page_flip_pending = &evergreen_page_flip_pending,
1535	},
1536};
1537
1538static struct radeon_asic btc_asic = {
1539	.init = &evergreen_init,
1540	.fini = &evergreen_fini,
1541	.suspend = &evergreen_suspend,
1542	.resume = &evergreen_resume,
1543	.asic_reset = &evergreen_asic_reset,
1544	.vga_set_state = &r600_vga_set_state,
1545	.mmio_hdp_flush = r600_mmio_hdp_flush,
1546	.gui_idle = &r600_gui_idle,
1547	.mc_wait_for_idle = &evergreen_mc_wait_for_idle,
1548	.get_xclk = &rv770_get_xclk,
1549	.get_gpu_clock_counter = &r600_get_gpu_clock_counter,
1550	.get_allowed_info_register = evergreen_get_allowed_info_register,
1551	.gart = {
1552		.tlb_flush = &evergreen_pcie_gart_tlb_flush,
1553		.get_page_entry = &rs600_gart_get_page_entry,
1554		.set_page = &rs600_gart_set_page,
1555	},
1556	.ring = {
1557		[RADEON_RING_TYPE_GFX_INDEX] = &evergreen_gfx_ring,
1558		[R600_RING_TYPE_DMA_INDEX] = &evergreen_dma_ring,
1559		[R600_RING_TYPE_UVD_INDEX] = &rv770_uvd_ring,
1560	},
1561	.irq = {
1562		.set = &evergreen_irq_set,
1563		.process = &evergreen_irq_process,
1564	},
1565	.display = {
1566		.bandwidth_update = &evergreen_bandwidth_update,
1567		.get_vblank_counter = &evergreen_get_vblank_counter,
1568		.wait_for_vblank = &dce4_wait_for_vblank,
1569		.set_backlight_level = &atombios_set_backlight_level,
1570		.get_backlight_level = &atombios_get_backlight_level,
1571	},
1572	.copy = {
1573		.blit = &r600_copy_cpdma,
1574		.blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1575		.dma = &evergreen_copy_dma,
1576		.dma_ring_index = R600_RING_TYPE_DMA_INDEX,
1577		.copy = &evergreen_copy_dma,
1578		.copy_ring_index = R600_RING_TYPE_DMA_INDEX,
1579	},
1580	.surface = {
1581		.set_reg = r600_set_surface_reg,
1582		.clear_reg = r600_clear_surface_reg,
1583	},
1584	.hpd = {
1585		.init = &evergreen_hpd_init,
1586		.fini = &evergreen_hpd_fini,
1587		.sense = &evergreen_hpd_sense,
1588		.set_polarity = &evergreen_hpd_set_polarity,
1589	},
1590	.pm = {
1591		.misc = &evergreen_pm_misc,
1592		.prepare = &evergreen_pm_prepare,
1593		.finish = &evergreen_pm_finish,
1594		.init_profile = &btc_pm_init_profile,
1595		.get_dynpm_state = &r600_pm_get_dynpm_state,
1596		.get_engine_clock = &radeon_atom_get_engine_clock,
1597		.set_engine_clock = &radeon_atom_set_engine_clock,
1598		.get_memory_clock = &radeon_atom_get_memory_clock,
1599		.set_memory_clock = &radeon_atom_set_memory_clock,
1600		.get_pcie_lanes = &r600_get_pcie_lanes,
1601		.set_pcie_lanes = &r600_set_pcie_lanes,
1602		.set_clock_gating = NULL,
1603		.set_uvd_clocks = &evergreen_set_uvd_clocks,
1604		.get_temperature = &evergreen_get_temp,
1605	},
1606	.dpm = {
1607		.init = &btc_dpm_init,
1608		.setup_asic = &btc_dpm_setup_asic,
1609		.enable = &btc_dpm_enable,
1610		.late_enable = &rv770_dpm_late_enable,
1611		.disable = &btc_dpm_disable,
1612		.pre_set_power_state = &btc_dpm_pre_set_power_state,
1613		.set_power_state = &btc_dpm_set_power_state,
1614		.post_set_power_state = &btc_dpm_post_set_power_state,
1615		.display_configuration_changed = &cypress_dpm_display_configuration_changed,
1616		.fini = &btc_dpm_fini,
1617		.get_sclk = &btc_dpm_get_sclk,
1618		.get_mclk = &btc_dpm_get_mclk,
1619		.print_power_state = &rv770_dpm_print_power_state,
1620#ifdef CONFIG_DEBUG_FS
1621		.debugfs_print_current_performance_level = &btc_dpm_debugfs_print_current_performance_level,
1622#endif
1623		.force_performance_level = &rv770_dpm_force_performance_level,
1624		.vblank_too_short = &btc_dpm_vblank_too_short,
1625		.get_current_sclk = &btc_dpm_get_current_sclk,
1626		.get_current_mclk = &btc_dpm_get_current_mclk,
1627	},
1628	.pflip = {
1629		.page_flip = &evergreen_page_flip,
1630		.page_flip_pending = &evergreen_page_flip_pending,
1631	},
1632};
1633
1634static const struct radeon_asic_ring cayman_gfx_ring = {
1635	.ib_execute = &cayman_ring_ib_execute,
1636	.ib_parse = &evergreen_ib_parse,
1637	.emit_fence = &cayman_fence_ring_emit,
1638	.emit_semaphore = &r600_semaphore_ring_emit,
1639	.cs_parse = &evergreen_cs_parse,
1640	.ring_test = &r600_ring_test,
1641	.ib_test = &r600_ib_test,
1642	.is_lockup = &cayman_gfx_is_lockup,
1643	.vm_flush = &cayman_vm_flush,
1644	.get_rptr = &cayman_gfx_get_rptr,
1645	.get_wptr = &cayman_gfx_get_wptr,
1646	.set_wptr = &cayman_gfx_set_wptr,
1647};
1648
1649static const struct radeon_asic_ring cayman_dma_ring = {
1650	.ib_execute = &cayman_dma_ring_ib_execute,
1651	.ib_parse = &evergreen_dma_ib_parse,
1652	.emit_fence = &evergreen_dma_fence_ring_emit,
1653	.emit_semaphore = &r600_dma_semaphore_ring_emit,
1654	.cs_parse = &evergreen_dma_cs_parse,
1655	.ring_test = &r600_dma_ring_test,
1656	.ib_test = &r600_dma_ib_test,
1657	.is_lockup = &cayman_dma_is_lockup,
1658	.vm_flush = &cayman_dma_vm_flush,
1659	.get_rptr = &cayman_dma_get_rptr,
1660	.get_wptr = &cayman_dma_get_wptr,
1661	.set_wptr = &cayman_dma_set_wptr
1662};
1663
1664static const struct radeon_asic_ring cayman_uvd_ring = {
1665	.ib_execute = &uvd_v1_0_ib_execute,
1666	.emit_fence = &uvd_v2_2_fence_emit,
1667	.emit_semaphore = &uvd_v3_1_semaphore_emit,
1668	.cs_parse = &radeon_uvd_cs_parse,
1669	.ring_test = &uvd_v1_0_ring_test,
1670	.ib_test = &uvd_v1_0_ib_test,
1671	.is_lockup = &radeon_ring_test_lockup,
1672	.get_rptr = &uvd_v1_0_get_rptr,
1673	.get_wptr = &uvd_v1_0_get_wptr,
1674	.set_wptr = &uvd_v1_0_set_wptr,
1675};
1676
1677static struct radeon_asic cayman_asic = {
1678	.init = &cayman_init,
1679	.fini = &cayman_fini,
1680	.suspend = &cayman_suspend,
1681	.resume = &cayman_resume,
1682	.asic_reset = &cayman_asic_reset,
1683	.vga_set_state = &r600_vga_set_state,
1684	.mmio_hdp_flush = r600_mmio_hdp_flush,
1685	.gui_idle = &r600_gui_idle,
1686	.mc_wait_for_idle = &evergreen_mc_wait_for_idle,
1687	.get_xclk = &rv770_get_xclk,
1688	.get_gpu_clock_counter = &r600_get_gpu_clock_counter,
1689	.get_allowed_info_register = cayman_get_allowed_info_register,
1690	.gart = {
1691		.tlb_flush = &cayman_pcie_gart_tlb_flush,
1692		.get_page_entry = &rs600_gart_get_page_entry,
1693		.set_page = &rs600_gart_set_page,
1694	},
1695	.vm = {
1696		.init = &cayman_vm_init,
1697		.fini = &cayman_vm_fini,
1698		.copy_pages = &cayman_dma_vm_copy_pages,
1699		.write_pages = &cayman_dma_vm_write_pages,
1700		.set_pages = &cayman_dma_vm_set_pages,
1701		.pad_ib = &cayman_dma_vm_pad_ib,
1702	},
1703	.ring = {
1704		[RADEON_RING_TYPE_GFX_INDEX] = &cayman_gfx_ring,
1705		[CAYMAN_RING_TYPE_CP1_INDEX] = &cayman_gfx_ring,
1706		[CAYMAN_RING_TYPE_CP2_INDEX] = &cayman_gfx_ring,
1707		[R600_RING_TYPE_DMA_INDEX] = &cayman_dma_ring,
1708		[CAYMAN_RING_TYPE_DMA1_INDEX] = &cayman_dma_ring,
1709		[R600_RING_TYPE_UVD_INDEX] = &cayman_uvd_ring,
1710	},
1711	.irq = {
1712		.set = &evergreen_irq_set,
1713		.process = &evergreen_irq_process,
1714	},
1715	.display = {
1716		.bandwidth_update = &evergreen_bandwidth_update,
1717		.get_vblank_counter = &evergreen_get_vblank_counter,
1718		.wait_for_vblank = &dce4_wait_for_vblank,
1719		.set_backlight_level = &atombios_set_backlight_level,
1720		.get_backlight_level = &atombios_get_backlight_level,
1721	},
1722	.copy = {
1723		.blit = &r600_copy_cpdma,
1724		.blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1725		.dma = &evergreen_copy_dma,
1726		.dma_ring_index = R600_RING_TYPE_DMA_INDEX,
1727		.copy = &evergreen_copy_dma,
1728		.copy_ring_index = R600_RING_TYPE_DMA_INDEX,
1729	},
1730	.surface = {
1731		.set_reg = r600_set_surface_reg,
1732		.clear_reg = r600_clear_surface_reg,
1733	},
1734	.hpd = {
1735		.init = &evergreen_hpd_init,
1736		.fini = &evergreen_hpd_fini,
1737		.sense = &evergreen_hpd_sense,
1738		.set_polarity = &evergreen_hpd_set_polarity,
1739	},
1740	.pm = {
1741		.misc = &evergreen_pm_misc,
1742		.prepare = &evergreen_pm_prepare,
1743		.finish = &evergreen_pm_finish,
1744		.init_profile = &btc_pm_init_profile,
1745		.get_dynpm_state = &r600_pm_get_dynpm_state,
1746		.get_engine_clock = &radeon_atom_get_engine_clock,
1747		.set_engine_clock = &radeon_atom_set_engine_clock,
1748		.get_memory_clock = &radeon_atom_get_memory_clock,
1749		.set_memory_clock = &radeon_atom_set_memory_clock,
1750		.get_pcie_lanes = &r600_get_pcie_lanes,
1751		.set_pcie_lanes = &r600_set_pcie_lanes,
1752		.set_clock_gating = NULL,
1753		.set_uvd_clocks = &evergreen_set_uvd_clocks,
1754		.get_temperature = &evergreen_get_temp,
1755	},
1756	.dpm = {
1757		.init = &ni_dpm_init,
1758		.setup_asic = &ni_dpm_setup_asic,
1759		.enable = &ni_dpm_enable,
1760		.late_enable = &rv770_dpm_late_enable,
1761		.disable = &ni_dpm_disable,
1762		.pre_set_power_state = &ni_dpm_pre_set_power_state,
1763		.set_power_state = &ni_dpm_set_power_state,
1764		.post_set_power_state = &ni_dpm_post_set_power_state,
1765		.display_configuration_changed = &cypress_dpm_display_configuration_changed,
1766		.fini = &ni_dpm_fini,
1767		.get_sclk = &ni_dpm_get_sclk,
1768		.get_mclk = &ni_dpm_get_mclk,
1769		.print_power_state = &ni_dpm_print_power_state,
1770#ifdef CONFIG_DEBUG_FS
1771		.debugfs_print_current_performance_level = &ni_dpm_debugfs_print_current_performance_level,
1772#endif
1773		.force_performance_level = &ni_dpm_force_performance_level,
1774		.vblank_too_short = &ni_dpm_vblank_too_short,
1775		.get_current_sclk = &ni_dpm_get_current_sclk,
1776		.get_current_mclk = &ni_dpm_get_current_mclk,
1777	},
1778	.pflip = {
1779		.page_flip = &evergreen_page_flip,
1780		.page_flip_pending = &evergreen_page_flip_pending,
1781	},
1782};
1783
1784static const struct radeon_asic_ring trinity_vce_ring = {
1785	.ib_execute = &radeon_vce_ib_execute,
1786	.emit_fence = &radeon_vce_fence_emit,
1787	.emit_semaphore = &radeon_vce_semaphore_emit,
1788	.cs_parse = &radeon_vce_cs_parse,
1789	.ring_test = &radeon_vce_ring_test,
1790	.ib_test = &radeon_vce_ib_test,
1791	.is_lockup = &radeon_ring_test_lockup,
1792	.get_rptr = &vce_v1_0_get_rptr,
1793	.get_wptr = &vce_v1_0_get_wptr,
1794	.set_wptr = &vce_v1_0_set_wptr,
1795};
1796
1797static struct radeon_asic trinity_asic = {
1798	.init = &cayman_init,
1799	.fini = &cayman_fini,
1800	.suspend = &cayman_suspend,
1801	.resume = &cayman_resume,
1802	.asic_reset = &cayman_asic_reset,
1803	.vga_set_state = &r600_vga_set_state,
1804	.mmio_hdp_flush = r600_mmio_hdp_flush,
1805	.gui_idle = &r600_gui_idle,
1806	.mc_wait_for_idle = &evergreen_mc_wait_for_idle,
1807	.get_xclk = &r600_get_xclk,
1808	.get_gpu_clock_counter = &r600_get_gpu_clock_counter,
1809	.get_allowed_info_register = cayman_get_allowed_info_register,
1810	.gart = {
1811		.tlb_flush = &cayman_pcie_gart_tlb_flush,
1812		.get_page_entry = &rs600_gart_get_page_entry,
1813		.set_page = &rs600_gart_set_page,
1814	},
1815	.vm = {
1816		.init = &cayman_vm_init,
1817		.fini = &cayman_vm_fini,
1818		.copy_pages = &cayman_dma_vm_copy_pages,
1819		.write_pages = &cayman_dma_vm_write_pages,
1820		.set_pages = &cayman_dma_vm_set_pages,
1821		.pad_ib = &cayman_dma_vm_pad_ib,
1822	},
1823	.ring = {
1824		[RADEON_RING_TYPE_GFX_INDEX] = &cayman_gfx_ring,
1825		[CAYMAN_RING_TYPE_CP1_INDEX] = &cayman_gfx_ring,
1826		[CAYMAN_RING_TYPE_CP2_INDEX] = &cayman_gfx_ring,
1827		[R600_RING_TYPE_DMA_INDEX] = &cayman_dma_ring,
1828		[CAYMAN_RING_TYPE_DMA1_INDEX] = &cayman_dma_ring,
1829		[R600_RING_TYPE_UVD_INDEX] = &cayman_uvd_ring,
1830		[TN_RING_TYPE_VCE1_INDEX] = &trinity_vce_ring,
1831		[TN_RING_TYPE_VCE2_INDEX] = &trinity_vce_ring,
1832	},
1833	.irq = {
1834		.set = &evergreen_irq_set,
1835		.process = &evergreen_irq_process,
1836	},
1837	.display = {
1838		.bandwidth_update = &dce6_bandwidth_update,
1839		.get_vblank_counter = &evergreen_get_vblank_counter,
1840		.wait_for_vblank = &dce4_wait_for_vblank,
1841		.set_backlight_level = &atombios_set_backlight_level,
1842		.get_backlight_level = &atombios_get_backlight_level,
1843	},
1844	.copy = {
1845		.blit = &r600_copy_cpdma,
1846		.blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1847		.dma = &evergreen_copy_dma,
1848		.dma_ring_index = R600_RING_TYPE_DMA_INDEX,
1849		.copy = &evergreen_copy_dma,
1850		.copy_ring_index = R600_RING_TYPE_DMA_INDEX,
1851	},
1852	.surface = {
1853		.set_reg = r600_set_surface_reg,
1854		.clear_reg = r600_clear_surface_reg,
1855	},
1856	.hpd = {
1857		.init = &evergreen_hpd_init,
1858		.fini = &evergreen_hpd_fini,
1859		.sense = &evergreen_hpd_sense,
1860		.set_polarity = &evergreen_hpd_set_polarity,
1861	},
1862	.pm = {
1863		.misc = &evergreen_pm_misc,
1864		.prepare = &evergreen_pm_prepare,
1865		.finish = &evergreen_pm_finish,
1866		.init_profile = &sumo_pm_init_profile,
1867		.get_dynpm_state = &r600_pm_get_dynpm_state,
1868		.get_engine_clock = &radeon_atom_get_engine_clock,
1869		.set_engine_clock = &radeon_atom_set_engine_clock,
1870		.get_memory_clock = NULL,
1871		.set_memory_clock = NULL,
1872		.get_pcie_lanes = NULL,
1873		.set_pcie_lanes = NULL,
1874		.set_clock_gating = NULL,
1875		.set_uvd_clocks = &sumo_set_uvd_clocks,
1876		.set_vce_clocks = &tn_set_vce_clocks,
1877		.get_temperature = &tn_get_temp,
1878	},
1879	.dpm = {
1880		.init = &trinity_dpm_init,
1881		.setup_asic = &trinity_dpm_setup_asic,
1882		.enable = &trinity_dpm_enable,
1883		.late_enable = &trinity_dpm_late_enable,
1884		.disable = &trinity_dpm_disable,
1885		.pre_set_power_state = &trinity_dpm_pre_set_power_state,
1886		.set_power_state = &trinity_dpm_set_power_state,
1887		.post_set_power_state = &trinity_dpm_post_set_power_state,
1888		.display_configuration_changed = &trinity_dpm_display_configuration_changed,
1889		.fini = &trinity_dpm_fini,
1890		.get_sclk = &trinity_dpm_get_sclk,
1891		.get_mclk = &trinity_dpm_get_mclk,
1892		.print_power_state = &trinity_dpm_print_power_state,
1893#ifdef CONFIG_DEBUG_FS
1894		.debugfs_print_current_performance_level = &trinity_dpm_debugfs_print_current_performance_level,
1895#endif
1896		.force_performance_level = &trinity_dpm_force_performance_level,
1897		.enable_bapm = &trinity_dpm_enable_bapm,
1898		.get_current_sclk = &trinity_dpm_get_current_sclk,
1899		.get_current_mclk = &trinity_dpm_get_current_mclk,
1900	},
1901	.pflip = {
1902		.page_flip = &evergreen_page_flip,
1903		.page_flip_pending = &evergreen_page_flip_pending,
1904	},
1905};
1906
1907static const struct radeon_asic_ring si_gfx_ring = {
1908	.ib_execute = &si_ring_ib_execute,
1909	.ib_parse = &si_ib_parse,
1910	.emit_fence = &si_fence_ring_emit,
1911	.emit_semaphore = &r600_semaphore_ring_emit,
1912	.cs_parse = NULL,
1913	.ring_test = &r600_ring_test,
1914	.ib_test = &r600_ib_test,
1915	.is_lockup = &si_gfx_is_lockup,
1916	.vm_flush = &si_vm_flush,
1917	.get_rptr = &cayman_gfx_get_rptr,
1918	.get_wptr = &cayman_gfx_get_wptr,
1919	.set_wptr = &cayman_gfx_set_wptr,
1920};
1921
1922static const struct radeon_asic_ring si_dma_ring = {
1923	.ib_execute = &cayman_dma_ring_ib_execute,
1924	.ib_parse = &evergreen_dma_ib_parse,
1925	.emit_fence = &evergreen_dma_fence_ring_emit,
1926	.emit_semaphore = &r600_dma_semaphore_ring_emit,
1927	.cs_parse = NULL,
1928	.ring_test = &r600_dma_ring_test,
1929	.ib_test = &r600_dma_ib_test,
1930	.is_lockup = &si_dma_is_lockup,
1931	.vm_flush = &si_dma_vm_flush,
1932	.get_rptr = &cayman_dma_get_rptr,
1933	.get_wptr = &cayman_dma_get_wptr,
1934	.set_wptr = &cayman_dma_set_wptr,
1935};
1936
1937static struct radeon_asic si_asic = {
1938	.init = &si_init,
1939	.fini = &si_fini,
1940	.suspend = &si_suspend,
1941	.resume = &si_resume,
1942	.asic_reset = &si_asic_reset,
1943	.vga_set_state = &r600_vga_set_state,
1944	.mmio_hdp_flush = r600_mmio_hdp_flush,
1945	.gui_idle = &r600_gui_idle,
1946	.mc_wait_for_idle = &evergreen_mc_wait_for_idle,
1947	.get_xclk = &si_get_xclk,
1948	.get_gpu_clock_counter = &si_get_gpu_clock_counter,
1949	.get_allowed_info_register = si_get_allowed_info_register,
1950	.gart = {
1951		.tlb_flush = &si_pcie_gart_tlb_flush,
1952		.get_page_entry = &rs600_gart_get_page_entry,
1953		.set_page = &rs600_gart_set_page,
1954	},
1955	.vm = {
1956		.init = &si_vm_init,
1957		.fini = &si_vm_fini,
1958		.copy_pages = &si_dma_vm_copy_pages,
1959		.write_pages = &si_dma_vm_write_pages,
1960		.set_pages = &si_dma_vm_set_pages,
1961		.pad_ib = &cayman_dma_vm_pad_ib,
1962	},
1963	.ring = {
1964		[RADEON_RING_TYPE_GFX_INDEX] = &si_gfx_ring,
1965		[CAYMAN_RING_TYPE_CP1_INDEX] = &si_gfx_ring,
1966		[CAYMAN_RING_TYPE_CP2_INDEX] = &si_gfx_ring,
1967		[R600_RING_TYPE_DMA_INDEX] = &si_dma_ring,
1968		[CAYMAN_RING_TYPE_DMA1_INDEX] = &si_dma_ring,
1969		[R600_RING_TYPE_UVD_INDEX] = &cayman_uvd_ring,
1970		[TN_RING_TYPE_VCE1_INDEX] = &trinity_vce_ring,
1971		[TN_RING_TYPE_VCE2_INDEX] = &trinity_vce_ring,
1972	},
1973	.irq = {
1974		.set = &si_irq_set,
1975		.process = &si_irq_process,
1976	},
1977	.display = {
1978		.bandwidth_update = &dce6_bandwidth_update,
1979		.get_vblank_counter = &evergreen_get_vblank_counter,
1980		.wait_for_vblank = &dce4_wait_for_vblank,
1981		.set_backlight_level = &atombios_set_backlight_level,
1982		.get_backlight_level = &atombios_get_backlight_level,
1983	},
1984	.copy = {
1985		.blit = &r600_copy_cpdma,
1986		.blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1987		.dma = &si_copy_dma,
1988		.dma_ring_index = R600_RING_TYPE_DMA_INDEX,
1989		.copy = &si_copy_dma,
1990		.copy_ring_index = R600_RING_TYPE_DMA_INDEX,
1991	},
1992	.surface = {
1993		.set_reg = r600_set_surface_reg,
1994		.clear_reg = r600_clear_surface_reg,
1995	},
1996	.hpd = {
1997		.init = &evergreen_hpd_init,
1998		.fini = &evergreen_hpd_fini,
1999		.sense = &evergreen_hpd_sense,
2000		.set_polarity = &evergreen_hpd_set_polarity,
2001	},
2002	.pm = {
2003		.misc = &evergreen_pm_misc,
2004		.prepare = &evergreen_pm_prepare,
2005		.finish = &evergreen_pm_finish,
2006		.init_profile = &sumo_pm_init_profile,
2007		.get_dynpm_state = &r600_pm_get_dynpm_state,
2008		.get_engine_clock = &radeon_atom_get_engine_clock,
2009		.set_engine_clock = &radeon_atom_set_engine_clock,
2010		.get_memory_clock = &radeon_atom_get_memory_clock,
2011		.set_memory_clock = &radeon_atom_set_memory_clock,
2012		.get_pcie_lanes = &r600_get_pcie_lanes,
2013		.set_pcie_lanes = &r600_set_pcie_lanes,
2014		.set_clock_gating = NULL,
2015		.set_uvd_clocks = &si_set_uvd_clocks,
2016		.set_vce_clocks = &si_set_vce_clocks,
2017		.get_temperature = &si_get_temp,
2018	},
2019	.dpm = {
2020		.init = &si_dpm_init,
2021		.setup_asic = &si_dpm_setup_asic,
2022		.enable = &si_dpm_enable,
2023		.late_enable = &si_dpm_late_enable,
2024		.disable = &si_dpm_disable,
2025		.pre_set_power_state = &si_dpm_pre_set_power_state,
2026		.set_power_state = &si_dpm_set_power_state,
2027		.post_set_power_state = &si_dpm_post_set_power_state,
2028		.display_configuration_changed = &si_dpm_display_configuration_changed,
2029		.fini = &si_dpm_fini,
2030		.get_sclk = &ni_dpm_get_sclk,
2031		.get_mclk = &ni_dpm_get_mclk,
2032		.print_power_state = &ni_dpm_print_power_state,
2033#ifdef CONFIG_DEBUG_FS
2034		.debugfs_print_current_performance_level = &si_dpm_debugfs_print_current_performance_level,
2035#endif
2036		.force_performance_level = &si_dpm_force_performance_level,
2037		.vblank_too_short = &ni_dpm_vblank_too_short,
2038		.fan_ctrl_set_mode = &si_fan_ctrl_set_mode,
2039		.fan_ctrl_get_mode = &si_fan_ctrl_get_mode,
2040		.get_fan_speed_percent = &si_fan_ctrl_get_fan_speed_percent,
2041		.set_fan_speed_percent = &si_fan_ctrl_set_fan_speed_percent,
2042		.get_current_sclk = &si_dpm_get_current_sclk,
2043		.get_current_mclk = &si_dpm_get_current_mclk,
2044	},
2045	.pflip = {
2046		.page_flip = &evergreen_page_flip,
2047		.page_flip_pending = &evergreen_page_flip_pending,
2048	},
2049};
2050
2051static const struct radeon_asic_ring ci_gfx_ring = {
2052	.ib_execute = &cik_ring_ib_execute,
2053	.ib_parse = &cik_ib_parse,
2054	.emit_fence = &cik_fence_gfx_ring_emit,
2055	.emit_semaphore = &cik_semaphore_ring_emit,
2056	.cs_parse = NULL,
2057	.ring_test = &cik_ring_test,
2058	.ib_test = &cik_ib_test,
2059	.is_lockup = &cik_gfx_is_lockup,
2060	.vm_flush = &cik_vm_flush,
2061	.get_rptr = &cik_gfx_get_rptr,
2062	.get_wptr = &cik_gfx_get_wptr,
2063	.set_wptr = &cik_gfx_set_wptr,
2064};
2065
2066static const struct radeon_asic_ring ci_cp_ring = {
2067	.ib_execute = &cik_ring_ib_execute,
2068	.ib_parse = &cik_ib_parse,
2069	.emit_fence = &cik_fence_compute_ring_emit,
2070	.emit_semaphore = &cik_semaphore_ring_emit,
2071	.cs_parse = NULL,
2072	.ring_test = &cik_ring_test,
2073	.ib_test = &cik_ib_test,
2074	.is_lockup = &cik_gfx_is_lockup,
2075	.vm_flush = &cik_vm_flush,
2076	.get_rptr = &cik_compute_get_rptr,
2077	.get_wptr = &cik_compute_get_wptr,
2078	.set_wptr = &cik_compute_set_wptr,
2079};
2080
2081static const struct radeon_asic_ring ci_dma_ring = {
2082	.ib_execute = &cik_sdma_ring_ib_execute,
2083	.ib_parse = &cik_ib_parse,
2084	.emit_fence = &cik_sdma_fence_ring_emit,
2085	.emit_semaphore = &cik_sdma_semaphore_ring_emit,
2086	.cs_parse = NULL,
2087	.ring_test = &cik_sdma_ring_test,
2088	.ib_test = &cik_sdma_ib_test,
2089	.is_lockup = &cik_sdma_is_lockup,
2090	.vm_flush = &cik_dma_vm_flush,
2091	.get_rptr = &cik_sdma_get_rptr,
2092	.get_wptr = &cik_sdma_get_wptr,
2093	.set_wptr = &cik_sdma_set_wptr,
2094};
2095
2096static const struct radeon_asic_ring ci_vce_ring = {
2097	.ib_execute = &radeon_vce_ib_execute,
2098	.emit_fence = &radeon_vce_fence_emit,
2099	.emit_semaphore = &radeon_vce_semaphore_emit,
2100	.cs_parse = &radeon_vce_cs_parse,
2101	.ring_test = &radeon_vce_ring_test,
2102	.ib_test = &radeon_vce_ib_test,
2103	.is_lockup = &radeon_ring_test_lockup,
2104	.get_rptr = &vce_v1_0_get_rptr,
2105	.get_wptr = &vce_v1_0_get_wptr,
2106	.set_wptr = &vce_v1_0_set_wptr,
2107};
2108
2109static struct radeon_asic ci_asic = {
2110	.init = &cik_init,
2111	.fini = &cik_fini,
2112	.suspend = &cik_suspend,
2113	.resume = &cik_resume,
2114	.asic_reset = &cik_asic_reset,
2115	.vga_set_state = &r600_vga_set_state,
2116	.mmio_hdp_flush = &r600_mmio_hdp_flush,
2117	.gui_idle = &r600_gui_idle,
2118	.mc_wait_for_idle = &evergreen_mc_wait_for_idle,
2119	.get_xclk = &cik_get_xclk,
2120	.get_gpu_clock_counter = &cik_get_gpu_clock_counter,
2121	.get_allowed_info_register = cik_get_allowed_info_register,
2122	.gart = {
2123		.tlb_flush = &cik_pcie_gart_tlb_flush,
2124		.get_page_entry = &rs600_gart_get_page_entry,
2125		.set_page = &rs600_gart_set_page,
2126	},
2127	.vm = {
2128		.init = &cik_vm_init,
2129		.fini = &cik_vm_fini,
2130		.copy_pages = &cik_sdma_vm_copy_pages,
2131		.write_pages = &cik_sdma_vm_write_pages,
2132		.set_pages = &cik_sdma_vm_set_pages,
2133		.pad_ib = &cik_sdma_vm_pad_ib,
2134	},
2135	.ring = {
2136		[RADEON_RING_TYPE_GFX_INDEX] = &ci_gfx_ring,
2137		[CAYMAN_RING_TYPE_CP1_INDEX] = &ci_cp_ring,
2138		[CAYMAN_RING_TYPE_CP2_INDEX] = &ci_cp_ring,
2139		[R600_RING_TYPE_DMA_INDEX] = &ci_dma_ring,
2140		[CAYMAN_RING_TYPE_DMA1_INDEX] = &ci_dma_ring,
2141		[R600_RING_TYPE_UVD_INDEX] = &cayman_uvd_ring,
2142		[TN_RING_TYPE_VCE1_INDEX] = &ci_vce_ring,
2143		[TN_RING_TYPE_VCE2_INDEX] = &ci_vce_ring,
2144	},
2145	.irq = {
2146		.set = &cik_irq_set,
2147		.process = &cik_irq_process,
2148	},
2149	.display = {
2150		.bandwidth_update = &dce8_bandwidth_update,
2151		.get_vblank_counter = &evergreen_get_vblank_counter,
2152		.wait_for_vblank = &dce4_wait_for_vblank,
2153		.set_backlight_level = &atombios_set_backlight_level,
2154		.get_backlight_level = &atombios_get_backlight_level,
2155	},
2156	.copy = {
2157		.blit = &cik_copy_cpdma,
2158		.blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
2159		.dma = &cik_copy_dma,
2160		.dma_ring_index = R600_RING_TYPE_DMA_INDEX,
2161		.copy = &cik_copy_dma,
2162		.copy_ring_index = R600_RING_TYPE_DMA_INDEX,
2163	},
2164	.surface = {
2165		.set_reg = r600_set_surface_reg,
2166		.clear_reg = r600_clear_surface_reg,
2167	},
2168	.hpd = {
2169		.init = &evergreen_hpd_init,
2170		.fini = &evergreen_hpd_fini,
2171		.sense = &evergreen_hpd_sense,
2172		.set_polarity = &evergreen_hpd_set_polarity,
2173	},
2174	.pm = {
2175		.misc = &evergreen_pm_misc,
2176		.prepare = &evergreen_pm_prepare,
2177		.finish = &evergreen_pm_finish,
2178		.init_profile = &sumo_pm_init_profile,
2179		.get_dynpm_state = &r600_pm_get_dynpm_state,
2180		.get_engine_clock = &radeon_atom_get_engine_clock,
2181		.set_engine_clock = &radeon_atom_set_engine_clock,
2182		.get_memory_clock = &radeon_atom_get_memory_clock,
2183		.set_memory_clock = &radeon_atom_set_memory_clock,
2184		.get_pcie_lanes = NULL,
2185		.set_pcie_lanes = NULL,
2186		.set_clock_gating = NULL,
2187		.set_uvd_clocks = &cik_set_uvd_clocks,
2188		.set_vce_clocks = &cik_set_vce_clocks,
2189		.get_temperature = &ci_get_temp,
2190	},
2191	.dpm = {
2192		.init = &ci_dpm_init,
2193		.setup_asic = &ci_dpm_setup_asic,
2194		.enable = &ci_dpm_enable,
2195		.late_enable = &ci_dpm_late_enable,
2196		.disable = &ci_dpm_disable,
2197		.pre_set_power_state = &ci_dpm_pre_set_power_state,
2198		.set_power_state = &ci_dpm_set_power_state,
2199		.post_set_power_state = &ci_dpm_post_set_power_state,
2200		.display_configuration_changed = &ci_dpm_display_configuration_changed,
2201		.fini = &ci_dpm_fini,
2202		.get_sclk = &ci_dpm_get_sclk,
2203		.get_mclk = &ci_dpm_get_mclk,
2204		.print_power_state = &ci_dpm_print_power_state,
2205#ifdef CONFIG_DEBUG_FS
2206		.debugfs_print_current_performance_level = &ci_dpm_debugfs_print_current_performance_level,
2207#endif
2208		.force_performance_level = &ci_dpm_force_performance_level,
2209		.vblank_too_short = &ci_dpm_vblank_too_short,
2210		.powergate_uvd = &ci_dpm_powergate_uvd,
2211		.fan_ctrl_set_mode = &ci_fan_ctrl_set_mode,
2212		.fan_ctrl_get_mode = &ci_fan_ctrl_get_mode,
2213		.get_fan_speed_percent = &ci_fan_ctrl_get_fan_speed_percent,
2214		.set_fan_speed_percent = &ci_fan_ctrl_set_fan_speed_percent,
2215		.get_current_sclk = &ci_dpm_get_current_sclk,
2216		.get_current_mclk = &ci_dpm_get_current_mclk,
2217	},
2218	.pflip = {
2219		.page_flip = &evergreen_page_flip,
2220		.page_flip_pending = &evergreen_page_flip_pending,
2221	},
2222};
2223
2224static struct radeon_asic kv_asic = {
2225	.init = &cik_init,
2226	.fini = &cik_fini,
2227	.suspend = &cik_suspend,
2228	.resume = &cik_resume,
2229	.asic_reset = &cik_asic_reset,
2230	.vga_set_state = &r600_vga_set_state,
2231	.mmio_hdp_flush = &r600_mmio_hdp_flush,
2232	.gui_idle = &r600_gui_idle,
2233	.mc_wait_for_idle = &evergreen_mc_wait_for_idle,
2234	.get_xclk = &cik_get_xclk,
2235	.get_gpu_clock_counter = &cik_get_gpu_clock_counter,
2236	.get_allowed_info_register = cik_get_allowed_info_register,
2237	.gart = {
2238		.tlb_flush = &cik_pcie_gart_tlb_flush,
2239		.get_page_entry = &rs600_gart_get_page_entry,
2240		.set_page = &rs600_gart_set_page,
2241	},
2242	.vm = {
2243		.init = &cik_vm_init,
2244		.fini = &cik_vm_fini,
2245		.copy_pages = &cik_sdma_vm_copy_pages,
2246		.write_pages = &cik_sdma_vm_write_pages,
2247		.set_pages = &cik_sdma_vm_set_pages,
2248		.pad_ib = &cik_sdma_vm_pad_ib,
2249	},
2250	.ring = {
2251		[RADEON_RING_TYPE_GFX_INDEX] = &ci_gfx_ring,
2252		[CAYMAN_RING_TYPE_CP1_INDEX] = &ci_cp_ring,
2253		[CAYMAN_RING_TYPE_CP2_INDEX] = &ci_cp_ring,
2254		[R600_RING_TYPE_DMA_INDEX] = &ci_dma_ring,
2255		[CAYMAN_RING_TYPE_DMA1_INDEX] = &ci_dma_ring,
2256		[R600_RING_TYPE_UVD_INDEX] = &cayman_uvd_ring,
2257		[TN_RING_TYPE_VCE1_INDEX] = &ci_vce_ring,
2258		[TN_RING_TYPE_VCE2_INDEX] = &ci_vce_ring,
2259	},
2260	.irq = {
2261		.set = &cik_irq_set,
2262		.process = &cik_irq_process,
2263	},
2264	.display = {
2265		.bandwidth_update = &dce8_bandwidth_update,
2266		.get_vblank_counter = &evergreen_get_vblank_counter,
2267		.wait_for_vblank = &dce4_wait_for_vblank,
2268		.set_backlight_level = &atombios_set_backlight_level,
2269		.get_backlight_level = &atombios_get_backlight_level,
2270	},
2271	.copy = {
2272		.blit = &cik_copy_cpdma,
2273		.blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
2274		.dma = &cik_copy_dma,
2275		.dma_ring_index = R600_RING_TYPE_DMA_INDEX,
2276		.copy = &cik_copy_dma,
2277		.copy_ring_index = R600_RING_TYPE_DMA_INDEX,
2278	},
2279	.surface = {
2280		.set_reg = r600_set_surface_reg,
2281		.clear_reg = r600_clear_surface_reg,
2282	},
2283	.hpd = {
2284		.init = &evergreen_hpd_init,
2285		.fini = &evergreen_hpd_fini,
2286		.sense = &evergreen_hpd_sense,
2287		.set_polarity = &evergreen_hpd_set_polarity,
2288	},
2289	.pm = {
2290		.misc = &evergreen_pm_misc,
2291		.prepare = &evergreen_pm_prepare,
2292		.finish = &evergreen_pm_finish,
2293		.init_profile = &sumo_pm_init_profile,
2294		.get_dynpm_state = &r600_pm_get_dynpm_state,
2295		.get_engine_clock = &radeon_atom_get_engine_clock,
2296		.set_engine_clock = &radeon_atom_set_engine_clock,
2297		.get_memory_clock = &radeon_atom_get_memory_clock,
2298		.set_memory_clock = &radeon_atom_set_memory_clock,
2299		.get_pcie_lanes = NULL,
2300		.set_pcie_lanes = NULL,
2301		.set_clock_gating = NULL,
2302		.set_uvd_clocks = &cik_set_uvd_clocks,
2303		.set_vce_clocks = &cik_set_vce_clocks,
2304		.get_temperature = &kv_get_temp,
2305	},
2306	.dpm = {
2307		.init = &kv_dpm_init,
2308		.setup_asic = &kv_dpm_setup_asic,
2309		.enable = &kv_dpm_enable,
2310		.late_enable = &kv_dpm_late_enable,
2311		.disable = &kv_dpm_disable,
2312		.pre_set_power_state = &kv_dpm_pre_set_power_state,
2313		.set_power_state = &kv_dpm_set_power_state,
2314		.post_set_power_state = &kv_dpm_post_set_power_state,
2315		.display_configuration_changed = &kv_dpm_display_configuration_changed,
2316		.fini = &kv_dpm_fini,
2317		.get_sclk = &kv_dpm_get_sclk,
2318		.get_mclk = &kv_dpm_get_mclk,
2319		.print_power_state = &kv_dpm_print_power_state,
2320#ifdef CONFIG_DEBUG_FS
2321		.debugfs_print_current_performance_level = &kv_dpm_debugfs_print_current_performance_level,
2322#endif
2323		.force_performance_level = &kv_dpm_force_performance_level,
2324		.powergate_uvd = &kv_dpm_powergate_uvd,
2325		.enable_bapm = &kv_dpm_enable_bapm,
2326		.get_current_sclk = &kv_dpm_get_current_sclk,
2327		.get_current_mclk = &kv_dpm_get_current_mclk,
2328	},
2329	.pflip = {
2330		.page_flip = &evergreen_page_flip,
2331		.page_flip_pending = &evergreen_page_flip_pending,
2332	},
2333};
2334
2335/**
2336 * radeon_asic_init - register asic specific callbacks
2337 *
2338 * @rdev: radeon device pointer
2339 *
2340 * Registers the appropriate asic specific callbacks for each
2341 * chip family.  Also sets other asics specific info like the number
2342 * of crtcs and the register aperture accessors (all asics).
2343 * Returns 0 for success.
2344 */
2345int radeon_asic_init(struct radeon_device *rdev)
2346{
2347	radeon_register_accessor_init(rdev);
2348
2349	/* set the number of crtcs */
2350	if (rdev->flags & RADEON_SINGLE_CRTC)
2351		rdev->num_crtc = 1;
2352	else
2353		rdev->num_crtc = 2;
2354
2355	rdev->has_uvd = false;
2356	rdev->has_vce = false;
2357
2358	switch (rdev->family) {
2359	case CHIP_R100:
2360	case CHIP_RV100:
2361	case CHIP_RS100:
2362	case CHIP_RV200:
2363	case CHIP_RS200:
2364		rdev->asic = &r100_asic;
2365		break;
2366	case CHIP_R200:
2367	case CHIP_RV250:
2368	case CHIP_RS300:
2369	case CHIP_RV280:
2370		rdev->asic = &r200_asic;
2371		break;
2372	case CHIP_R300:
2373	case CHIP_R350:
2374	case CHIP_RV350:
2375	case CHIP_RV380:
2376		if (rdev->flags & RADEON_IS_PCIE)
2377			rdev->asic = &r300_asic_pcie;
2378		else
2379			rdev->asic = &r300_asic;
2380		break;
2381	case CHIP_R420:
2382	case CHIP_R423:
2383	case CHIP_RV410:
2384		rdev->asic = &r420_asic;
2385		/* handle macs */
2386		if (rdev->bios == NULL) {
2387			rdev->asic->pm.get_engine_clock = &radeon_legacy_get_engine_clock;
2388			rdev->asic->pm.set_engine_clock = &radeon_legacy_set_engine_clock;
2389			rdev->asic->pm.get_memory_clock = &radeon_legacy_get_memory_clock;
2390			rdev->asic->pm.set_memory_clock = NULL;
2391			rdev->asic->display.set_backlight_level = &radeon_legacy_set_backlight_level;
2392		}
2393		break;
2394	case CHIP_RS400:
2395	case CHIP_RS480:
2396		rdev->asic = &rs400_asic;
2397		break;
2398	case CHIP_RS600:
2399		rdev->asic = &rs600_asic;
2400		break;
2401	case CHIP_RS690:
2402	case CHIP_RS740:
2403		rdev->asic = &rs690_asic;
2404		break;
2405	case CHIP_RV515:
2406		rdev->asic = &rv515_asic;
2407		break;
2408	case CHIP_R520:
2409	case CHIP_RV530:
2410	case CHIP_RV560:
2411	case CHIP_RV570:
2412	case CHIP_R580:
2413		rdev->asic = &r520_asic;
2414		break;
2415	case CHIP_R600:
2416		rdev->asic = &r600_asic;
2417		break;
2418	case CHIP_RV610:
2419	case CHIP_RV630:
2420	case CHIP_RV620:
2421	case CHIP_RV635:
2422	case CHIP_RV670:
2423		rdev->asic = &rv6xx_asic;
2424		rdev->has_uvd = true;
2425		break;
2426	case CHIP_RS780:
2427	case CHIP_RS880:
2428		rdev->asic = &rs780_asic;
2429		/* 760G/780V/880V don't have UVD */
2430		if ((rdev->pdev->device == 0x9616)||
2431		    (rdev->pdev->device == 0x9611)||
2432		    (rdev->pdev->device == 0x9613)||
2433		    (rdev->pdev->device == 0x9711)||
2434		    (rdev->pdev->device == 0x9713))
2435			rdev->has_uvd = false;
2436		else
2437			rdev->has_uvd = true;
2438		break;
2439	case CHIP_RV770:
2440	case CHIP_RV730:
2441	case CHIP_RV710:
2442	case CHIP_RV740:
2443		rdev->asic = &rv770_asic;
2444		rdev->has_uvd = true;
2445		break;
2446	case CHIP_CEDAR:
2447	case CHIP_REDWOOD:
2448	case CHIP_JUNIPER:
2449	case CHIP_CYPRESS:
2450	case CHIP_HEMLOCK:
2451		/* set num crtcs */
2452		if (rdev->family == CHIP_CEDAR)
2453			rdev->num_crtc = 4;
2454		else
2455			rdev->num_crtc = 6;
2456		rdev->asic = &evergreen_asic;
2457		rdev->has_uvd = true;
2458		break;
2459	case CHIP_PALM:
2460	case CHIP_SUMO:
2461	case CHIP_SUMO2:
2462		rdev->asic = &sumo_asic;
2463		rdev->has_uvd = true;
2464		break;
2465	case CHIP_BARTS:
2466	case CHIP_TURKS:
2467	case CHIP_CAICOS:
2468		/* set num crtcs */
2469		if (rdev->family == CHIP_CAICOS)
2470			rdev->num_crtc = 4;
2471		else
2472			rdev->num_crtc = 6;
2473		rdev->asic = &btc_asic;
2474		rdev->has_uvd = true;
2475		break;
2476	case CHIP_CAYMAN:
2477		rdev->asic = &cayman_asic;
2478		/* set num crtcs */
2479		rdev->num_crtc = 6;
2480		rdev->has_uvd = true;
2481		break;
2482	case CHIP_ARUBA:
2483		rdev->asic = &trinity_asic;
2484		/* set num crtcs */
2485		rdev->num_crtc = 4;
2486		rdev->has_uvd = true;
2487		rdev->has_vce = true;
2488		rdev->cg_flags =
2489			RADEON_CG_SUPPORT_VCE_MGCG;
2490		break;
2491	case CHIP_TAHITI:
2492	case CHIP_PITCAIRN:
2493	case CHIP_VERDE:
2494	case CHIP_OLAND:
2495	case CHIP_HAINAN:
2496		rdev->asic = &si_asic;
2497		/* set num crtcs */
2498		if (rdev->family == CHIP_HAINAN)
2499			rdev->num_crtc = 0;
2500		else if (rdev->family == CHIP_OLAND)
2501			rdev->num_crtc = 2;
2502		else
2503			rdev->num_crtc = 6;
2504		if (rdev->family == CHIP_HAINAN) {
2505			rdev->has_uvd = false;
2506			rdev->has_vce = false;
2507		} else {
2508			rdev->has_uvd = true;
2509			rdev->has_vce = true;
2510		}
2511		switch (rdev->family) {
2512		case CHIP_TAHITI:
2513			rdev->cg_flags =
2514				RADEON_CG_SUPPORT_GFX_MGCG |
2515				RADEON_CG_SUPPORT_GFX_MGLS |
2516				/*RADEON_CG_SUPPORT_GFX_CGCG |*/
2517				RADEON_CG_SUPPORT_GFX_CGLS |
2518				RADEON_CG_SUPPORT_GFX_CGTS |
2519				RADEON_CG_SUPPORT_GFX_CP_LS |
2520				RADEON_CG_SUPPORT_MC_MGCG |
2521				RADEON_CG_SUPPORT_SDMA_MGCG |
2522				RADEON_CG_SUPPORT_BIF_LS |
2523				RADEON_CG_SUPPORT_VCE_MGCG |
2524				RADEON_CG_SUPPORT_UVD_MGCG |
2525				RADEON_CG_SUPPORT_HDP_LS |
2526				RADEON_CG_SUPPORT_HDP_MGCG;
2527			rdev->pg_flags = 0;
2528			break;
2529		case CHIP_PITCAIRN:
2530			rdev->cg_flags =
2531				RADEON_CG_SUPPORT_GFX_MGCG |
2532				RADEON_CG_SUPPORT_GFX_MGLS |
2533				/*RADEON_CG_SUPPORT_GFX_CGCG |*/
2534				RADEON_CG_SUPPORT_GFX_CGLS |
2535				RADEON_CG_SUPPORT_GFX_CGTS |
2536				RADEON_CG_SUPPORT_GFX_CP_LS |
2537				RADEON_CG_SUPPORT_GFX_RLC_LS |
2538				RADEON_CG_SUPPORT_MC_LS |
2539				RADEON_CG_SUPPORT_MC_MGCG |
2540				RADEON_CG_SUPPORT_SDMA_MGCG |
2541				RADEON_CG_SUPPORT_BIF_LS |
2542				RADEON_CG_SUPPORT_VCE_MGCG |
2543				RADEON_CG_SUPPORT_UVD_MGCG |
2544				RADEON_CG_SUPPORT_HDP_LS |
2545				RADEON_CG_SUPPORT_HDP_MGCG;
2546			rdev->pg_flags = 0;
2547			break;
2548		case CHIP_VERDE:
2549			rdev->cg_flags =
2550				RADEON_CG_SUPPORT_GFX_MGCG |
2551				RADEON_CG_SUPPORT_GFX_MGLS |
2552				/*RADEON_CG_SUPPORT_GFX_CGCG |*/
2553				RADEON_CG_SUPPORT_GFX_CGLS |
2554				RADEON_CG_SUPPORT_GFX_CGTS |
2555				RADEON_CG_SUPPORT_GFX_CP_LS |
2556				RADEON_CG_SUPPORT_GFX_RLC_LS |
2557				RADEON_CG_SUPPORT_MC_LS |
2558				RADEON_CG_SUPPORT_MC_MGCG |
2559				RADEON_CG_SUPPORT_SDMA_MGCG |
2560				RADEON_CG_SUPPORT_BIF_LS |
2561				RADEON_CG_SUPPORT_VCE_MGCG |
2562				RADEON_CG_SUPPORT_UVD_MGCG |
2563				RADEON_CG_SUPPORT_HDP_LS |
2564				RADEON_CG_SUPPORT_HDP_MGCG;
2565			rdev->pg_flags = 0 |
2566				/*RADEON_PG_SUPPORT_GFX_PG | */
2567				RADEON_PG_SUPPORT_SDMA;
2568			break;
2569		case CHIP_OLAND:
2570			rdev->cg_flags =
2571				RADEON_CG_SUPPORT_GFX_MGCG |
2572				RADEON_CG_SUPPORT_GFX_MGLS |
2573				/*RADEON_CG_SUPPORT_GFX_CGCG |*/
2574				RADEON_CG_SUPPORT_GFX_CGLS |
2575				RADEON_CG_SUPPORT_GFX_CGTS |
2576				RADEON_CG_SUPPORT_GFX_CP_LS |
2577				RADEON_CG_SUPPORT_GFX_RLC_LS |
2578				RADEON_CG_SUPPORT_MC_LS |
2579				RADEON_CG_SUPPORT_MC_MGCG |
2580				RADEON_CG_SUPPORT_SDMA_MGCG |
2581				RADEON_CG_SUPPORT_BIF_LS |
2582				RADEON_CG_SUPPORT_UVD_MGCG |
2583				RADEON_CG_SUPPORT_HDP_LS |
2584				RADEON_CG_SUPPORT_HDP_MGCG;
2585			rdev->pg_flags = 0;
2586			break;
2587		case CHIP_HAINAN:
2588			rdev->cg_flags =
2589				RADEON_CG_SUPPORT_GFX_MGCG |
2590				RADEON_CG_SUPPORT_GFX_MGLS |
2591				/*RADEON_CG_SUPPORT_GFX_CGCG |*/
2592				RADEON_CG_SUPPORT_GFX_CGLS |
2593				RADEON_CG_SUPPORT_GFX_CGTS |
2594				RADEON_CG_SUPPORT_GFX_CP_LS |
2595				RADEON_CG_SUPPORT_GFX_RLC_LS |
2596				RADEON_CG_SUPPORT_MC_LS |
2597				RADEON_CG_SUPPORT_MC_MGCG |
2598				RADEON_CG_SUPPORT_SDMA_MGCG |
2599				RADEON_CG_SUPPORT_BIF_LS |
2600				RADEON_CG_SUPPORT_HDP_LS |
2601				RADEON_CG_SUPPORT_HDP_MGCG;
2602			rdev->pg_flags = 0;
2603			break;
2604		default:
2605			rdev->cg_flags = 0;
2606			rdev->pg_flags = 0;
2607			break;
2608		}
2609		break;
2610	case CHIP_BONAIRE:
2611	case CHIP_HAWAII:
2612		rdev->asic = &ci_asic;
2613		rdev->num_crtc = 6;
2614		rdev->has_uvd = true;
2615		rdev->has_vce = true;
2616		if (rdev->family == CHIP_BONAIRE) {
2617			rdev->cg_flags =
2618				RADEON_CG_SUPPORT_GFX_MGCG |
2619				RADEON_CG_SUPPORT_GFX_MGLS |
2620				/*RADEON_CG_SUPPORT_GFX_CGCG |*/
2621				RADEON_CG_SUPPORT_GFX_CGLS |
2622				RADEON_CG_SUPPORT_GFX_CGTS |
2623				RADEON_CG_SUPPORT_GFX_CGTS_LS |
2624				RADEON_CG_SUPPORT_GFX_CP_LS |
2625				RADEON_CG_SUPPORT_MC_LS |
2626				RADEON_CG_SUPPORT_MC_MGCG |
2627				RADEON_CG_SUPPORT_SDMA_MGCG |
2628				RADEON_CG_SUPPORT_SDMA_LS |
2629				RADEON_CG_SUPPORT_BIF_LS |
2630				RADEON_CG_SUPPORT_VCE_MGCG |
2631				RADEON_CG_SUPPORT_UVD_MGCG |
2632				RADEON_CG_SUPPORT_HDP_LS |
2633				RADEON_CG_SUPPORT_HDP_MGCG;
2634			rdev->pg_flags = 0;
2635		} else {
2636			rdev->cg_flags =
2637				RADEON_CG_SUPPORT_GFX_MGCG |
2638				RADEON_CG_SUPPORT_GFX_MGLS |
2639				/*RADEON_CG_SUPPORT_GFX_CGCG |*/
2640				RADEON_CG_SUPPORT_GFX_CGLS |
2641				RADEON_CG_SUPPORT_GFX_CGTS |
2642				RADEON_CG_SUPPORT_GFX_CP_LS |
2643				RADEON_CG_SUPPORT_MC_LS |
2644				RADEON_CG_SUPPORT_MC_MGCG |
2645				RADEON_CG_SUPPORT_SDMA_MGCG |
2646				RADEON_CG_SUPPORT_SDMA_LS |
2647				RADEON_CG_SUPPORT_BIF_LS |
2648				RADEON_CG_SUPPORT_VCE_MGCG |
2649				RADEON_CG_SUPPORT_UVD_MGCG |
2650				RADEON_CG_SUPPORT_HDP_LS |
2651				RADEON_CG_SUPPORT_HDP_MGCG;
2652			rdev->pg_flags = 0;
2653		}
2654		break;
2655	case CHIP_KAVERI:
2656	case CHIP_KABINI:
2657	case CHIP_MULLINS:
2658		rdev->asic = &kv_asic;
2659		/* set num crtcs */
2660		if (rdev->family == CHIP_KAVERI) {
2661			rdev->num_crtc = 4;
2662			rdev->cg_flags =
2663				RADEON_CG_SUPPORT_GFX_MGCG |
2664				RADEON_CG_SUPPORT_GFX_MGLS |
2665				/*RADEON_CG_SUPPORT_GFX_CGCG |*/
2666				RADEON_CG_SUPPORT_GFX_CGLS |
2667				RADEON_CG_SUPPORT_GFX_CGTS |
2668				RADEON_CG_SUPPORT_GFX_CGTS_LS |
2669				RADEON_CG_SUPPORT_GFX_CP_LS |
2670				RADEON_CG_SUPPORT_SDMA_MGCG |
2671				RADEON_CG_SUPPORT_SDMA_LS |
2672				RADEON_CG_SUPPORT_BIF_LS |
2673				RADEON_CG_SUPPORT_VCE_MGCG |
2674				RADEON_CG_SUPPORT_UVD_MGCG |
2675				RADEON_CG_SUPPORT_HDP_LS |
2676				RADEON_CG_SUPPORT_HDP_MGCG;
2677			rdev->pg_flags = 0;
2678				/*RADEON_PG_SUPPORT_GFX_PG |
2679				RADEON_PG_SUPPORT_GFX_SMG |
2680				RADEON_PG_SUPPORT_GFX_DMG |
2681				RADEON_PG_SUPPORT_UVD |
2682				RADEON_PG_SUPPORT_VCE |
2683				RADEON_PG_SUPPORT_CP |
2684				RADEON_PG_SUPPORT_GDS |
2685				RADEON_PG_SUPPORT_RLC_SMU_HS |
2686				RADEON_PG_SUPPORT_ACP |
2687				RADEON_PG_SUPPORT_SAMU;*/
2688		} else {
2689			rdev->num_crtc = 2;
2690			rdev->cg_flags =
2691				RADEON_CG_SUPPORT_GFX_MGCG |
2692				RADEON_CG_SUPPORT_GFX_MGLS |
2693				/*RADEON_CG_SUPPORT_GFX_CGCG |*/
2694				RADEON_CG_SUPPORT_GFX_CGLS |
2695				RADEON_CG_SUPPORT_GFX_CGTS |
2696				RADEON_CG_SUPPORT_GFX_CGTS_LS |
2697				RADEON_CG_SUPPORT_GFX_CP_LS |
2698				RADEON_CG_SUPPORT_SDMA_MGCG |
2699				RADEON_CG_SUPPORT_SDMA_LS |
2700				RADEON_CG_SUPPORT_BIF_LS |
2701				RADEON_CG_SUPPORT_VCE_MGCG |
2702				RADEON_CG_SUPPORT_UVD_MGCG |
2703				RADEON_CG_SUPPORT_HDP_LS |
2704				RADEON_CG_SUPPORT_HDP_MGCG;
2705			rdev->pg_flags = 0;
2706				/*RADEON_PG_SUPPORT_GFX_PG |
2707				RADEON_PG_SUPPORT_GFX_SMG |
2708				RADEON_PG_SUPPORT_UVD |
2709				RADEON_PG_SUPPORT_VCE |
2710				RADEON_PG_SUPPORT_CP |
2711				RADEON_PG_SUPPORT_GDS |
2712				RADEON_PG_SUPPORT_RLC_SMU_HS |
2713				RADEON_PG_SUPPORT_SAMU;*/
2714		}
2715		rdev->has_uvd = true;
2716		rdev->has_vce = true;
2717		break;
2718	default:
2719		/* FIXME: not supported yet */
2720		return -EINVAL;
2721	}
2722
2723	if (rdev->flags & RADEON_IS_IGP) {
2724		rdev->asic->pm.get_memory_clock = NULL;
2725		rdev->asic->pm.set_memory_clock = NULL;
2726	}
2727
2728	if (!radeon_uvd)
2729		rdev->has_uvd = false;
2730	if (!radeon_vce)
2731		rdev->has_vce = false;
2732
2733	return 0;
2734}
2735
2736