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