1 /* 2 * Copyright 2008 Advanced Micro Devices, Inc. 3 * Copyright 2008 Red Hat Inc. 4 * Copyright 2009 Jerome Glisse. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the "Software"), 8 * to deal in the Software without restriction, including without limitation 9 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10 * and/or sell copies of the Software, and to permit persons to whom the 11 * Software is furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included in 14 * all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 * OTHER DEALINGS IN THE SOFTWARE. 23 * 24 * Authors: Dave Airlie 25 * Alex Deucher 26 * Jerome Glisse 27 */ 28 29 #include <linux/console.h> 30 #include <drm/drmP.h> 31 #include <drm/drm_crtc_helper.h> 32 #include <drm/radeon_drm.h> 33 #include <linux/vgaarb.h> 34 #include <linux/vga_switcheroo.h> 35 #include "radeon_reg.h" 36 #include "radeon.h" 37 #include "radeon_asic.h" 38 #include "atom.h" 39 40 /* 41 * Registers accessors functions. 42 */ 43 static uint32_t radeon_invalid_rreg(struct radeon_device *rdev, uint32_t reg) 44 { 45 DRM_ERROR("Invalid callback to read register 0x%04X\n", reg); 46 BUG_ON(1); 47 return 0; 48 } 49 50 static void radeon_invalid_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) 51 { 52 DRM_ERROR("Invalid callback to write register 0x%04X with 0x%08X\n", 53 reg, v); 54 BUG_ON(1); 55 } 56 57 static void radeon_register_accessor_init(struct radeon_device *rdev) 58 { 59 rdev->mc_rreg = &radeon_invalid_rreg; 60 rdev->mc_wreg = &radeon_invalid_wreg; 61 rdev->pll_rreg = &radeon_invalid_rreg; 62 rdev->pll_wreg = &radeon_invalid_wreg; 63 rdev->pciep_rreg = &radeon_invalid_rreg; 64 rdev->pciep_wreg = &radeon_invalid_wreg; 65 66 /* Don't change order as we are overridding accessor. */ 67 if (rdev->family < CHIP_RV515) { 68 rdev->pcie_reg_mask = 0xff; 69 } else { 70 rdev->pcie_reg_mask = 0x7ff; 71 } 72 /* FIXME: not sure here */ 73 if (rdev->family <= CHIP_R580) { 74 rdev->pll_rreg = &r100_pll_rreg; 75 rdev->pll_wreg = &r100_pll_wreg; 76 } 77 if (rdev->family >= CHIP_R420) { 78 rdev->mc_rreg = &r420_mc_rreg; 79 rdev->mc_wreg = &r420_mc_wreg; 80 } 81 if (rdev->family >= CHIP_RV515) { 82 rdev->mc_rreg = &rv515_mc_rreg; 83 rdev->mc_wreg = &rv515_mc_wreg; 84 } 85 if (rdev->family == CHIP_RS400 || rdev->family == CHIP_RS480) { 86 rdev->mc_rreg = &rs400_mc_rreg; 87 rdev->mc_wreg = &rs400_mc_wreg; 88 } 89 if (rdev->family == CHIP_RS690 || rdev->family == CHIP_RS740) { 90 rdev->mc_rreg = &rs690_mc_rreg; 91 rdev->mc_wreg = &rs690_mc_wreg; 92 } 93 if (rdev->family == CHIP_RS600) { 94 rdev->mc_rreg = &rs600_mc_rreg; 95 rdev->mc_wreg = &rs600_mc_wreg; 96 } 97 if (rdev->family >= CHIP_R600) { 98 rdev->pciep_rreg = &r600_pciep_rreg; 99 rdev->pciep_wreg = &r600_pciep_wreg; 100 } 101 } 102 103 104 /* helper to disable agp */ 105 void radeon_agp_disable(struct radeon_device *rdev) 106 { 107 rdev->flags &= ~RADEON_IS_AGP; 108 if (rdev->family >= CHIP_R600) { 109 DRM_INFO("Forcing AGP to PCIE mode\n"); 110 rdev->flags |= RADEON_IS_PCIE; 111 } else if (rdev->family >= CHIP_RV515 || 112 rdev->family == CHIP_RV380 || 113 rdev->family == CHIP_RV410 || 114 rdev->family == CHIP_R423) { 115 DRM_INFO("Forcing AGP to PCIE mode\n"); 116 rdev->flags |= RADEON_IS_PCIE; 117 rdev->asic->gart.tlb_flush = &rv370_pcie_gart_tlb_flush; 118 rdev->asic->gart.set_page = &rv370_pcie_gart_set_page; 119 } else { 120 DRM_INFO("Forcing AGP to PCI mode\n"); 121 rdev->flags |= RADEON_IS_PCI; 122 rdev->asic->gart.tlb_flush = &r100_pci_gart_tlb_flush; 123 rdev->asic->gart.set_page = &r100_pci_gart_set_page; 124 } 125 rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024; 126 } 127 128 /* 129 * ASIC 130 */ 131 static struct radeon_asic r100_asic = { 132 .init = &r100_init, 133 .fini = &r100_fini, 134 .suspend = &r100_suspend, 135 .resume = &r100_resume, 136 .vga_set_state = &r100_vga_set_state, 137 .gpu_is_lockup = &r100_gpu_is_lockup, 138 .asic_reset = &r100_asic_reset, 139 .ioctl_wait_idle = NULL, 140 .gui_idle = &r100_gui_idle, 141 .mc_wait_for_idle = &r100_mc_wait_for_idle, 142 .gart = { 143 .tlb_flush = &r100_pci_gart_tlb_flush, 144 .set_page = &r100_pci_gart_set_page, 145 }, 146 .ring = { 147 [RADEON_RING_TYPE_GFX_INDEX] = { 148 .ib_execute = &r100_ring_ib_execute, 149 .emit_fence = &r100_fence_ring_emit, 150 .emit_semaphore = &r100_semaphore_ring_emit, 151 .cs_parse = &r100_cs_parse, 152 .ring_start = &r100_ring_start, 153 .ring_test = &r100_ring_test, 154 .ib_test = &r100_ib_test, 155 } 156 }, 157 .irq = { 158 .set = &r100_irq_set, 159 .process = &r100_irq_process, 160 }, 161 .display = { 162 .bandwidth_update = &r100_bandwidth_update, 163 .get_vblank_counter = &r100_get_vblank_counter, 164 .wait_for_vblank = &r100_wait_for_vblank, 165 }, 166 .copy = { 167 .blit = &r100_copy_blit, 168 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, 169 .dma = NULL, 170 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX, 171 .copy = &r100_copy_blit, 172 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX, 173 }, 174 .surface = { 175 .set_reg = r100_set_surface_reg, 176 .clear_reg = r100_clear_surface_reg, 177 }, 178 .hpd = { 179 .init = &r100_hpd_init, 180 .fini = &r100_hpd_fini, 181 .sense = &r100_hpd_sense, 182 .set_polarity = &r100_hpd_set_polarity, 183 }, 184 .pm = { 185 .misc = &r100_pm_misc, 186 .prepare = &r100_pm_prepare, 187 .finish = &r100_pm_finish, 188 .init_profile = &r100_pm_init_profile, 189 .get_dynpm_state = &r100_pm_get_dynpm_state, 190 .get_engine_clock = &radeon_legacy_get_engine_clock, 191 .set_engine_clock = &radeon_legacy_set_engine_clock, 192 .get_memory_clock = &radeon_legacy_get_memory_clock, 193 .set_memory_clock = NULL, 194 .get_pcie_lanes = NULL, 195 .set_pcie_lanes = NULL, 196 .set_clock_gating = &radeon_legacy_set_clock_gating, 197 }, 198 .pflip = { 199 .pre_page_flip = &r100_pre_page_flip, 200 .page_flip = &r100_page_flip, 201 .post_page_flip = &r100_post_page_flip, 202 }, 203 }; 204 205 static struct radeon_asic r200_asic = { 206 .init = &r100_init, 207 .fini = &r100_fini, 208 .suspend = &r100_suspend, 209 .resume = &r100_resume, 210 .vga_set_state = &r100_vga_set_state, 211 .gpu_is_lockup = &r100_gpu_is_lockup, 212 .asic_reset = &r100_asic_reset, 213 .ioctl_wait_idle = NULL, 214 .gui_idle = &r100_gui_idle, 215 .mc_wait_for_idle = &r100_mc_wait_for_idle, 216 .gart = { 217 .tlb_flush = &r100_pci_gart_tlb_flush, 218 .set_page = &r100_pci_gart_set_page, 219 }, 220 .ring = { 221 [RADEON_RING_TYPE_GFX_INDEX] = { 222 .ib_execute = &r100_ring_ib_execute, 223 .emit_fence = &r100_fence_ring_emit, 224 .emit_semaphore = &r100_semaphore_ring_emit, 225 .cs_parse = &r100_cs_parse, 226 .ring_start = &r100_ring_start, 227 .ring_test = &r100_ring_test, 228 .ib_test = &r100_ib_test, 229 } 230 }, 231 .irq = { 232 .set = &r100_irq_set, 233 .process = &r100_irq_process, 234 }, 235 .display = { 236 .bandwidth_update = &r100_bandwidth_update, 237 .get_vblank_counter = &r100_get_vblank_counter, 238 .wait_for_vblank = &r100_wait_for_vblank, 239 }, 240 .copy = { 241 .blit = &r100_copy_blit, 242 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, 243 .dma = &r200_copy_dma, 244 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX, 245 .copy = &r100_copy_blit, 246 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX, 247 }, 248 .surface = { 249 .set_reg = r100_set_surface_reg, 250 .clear_reg = r100_clear_surface_reg, 251 }, 252 .hpd = { 253 .init = &r100_hpd_init, 254 .fini = &r100_hpd_fini, 255 .sense = &r100_hpd_sense, 256 .set_polarity = &r100_hpd_set_polarity, 257 }, 258 .pm = { 259 .misc = &r100_pm_misc, 260 .prepare = &r100_pm_prepare, 261 .finish = &r100_pm_finish, 262 .init_profile = &r100_pm_init_profile, 263 .get_dynpm_state = &r100_pm_get_dynpm_state, 264 .get_engine_clock = &radeon_legacy_get_engine_clock, 265 .set_engine_clock = &radeon_legacy_set_engine_clock, 266 .get_memory_clock = &radeon_legacy_get_memory_clock, 267 .set_memory_clock = NULL, 268 .get_pcie_lanes = NULL, 269 .set_pcie_lanes = NULL, 270 .set_clock_gating = &radeon_legacy_set_clock_gating, 271 }, 272 .pflip = { 273 .pre_page_flip = &r100_pre_page_flip, 274 .page_flip = &r100_page_flip, 275 .post_page_flip = &r100_post_page_flip, 276 }, 277 }; 278 279 static struct radeon_asic r300_asic = { 280 .init = &r300_init, 281 .fini = &r300_fini, 282 .suspend = &r300_suspend, 283 .resume = &r300_resume, 284 .vga_set_state = &r100_vga_set_state, 285 .gpu_is_lockup = &r300_gpu_is_lockup, 286 .asic_reset = &r300_asic_reset, 287 .ioctl_wait_idle = NULL, 288 .gui_idle = &r100_gui_idle, 289 .mc_wait_for_idle = &r300_mc_wait_for_idle, 290 .gart = { 291 .tlb_flush = &r100_pci_gart_tlb_flush, 292 .set_page = &r100_pci_gart_set_page, 293 }, 294 .ring = { 295 [RADEON_RING_TYPE_GFX_INDEX] = { 296 .ib_execute = &r100_ring_ib_execute, 297 .emit_fence = &r300_fence_ring_emit, 298 .emit_semaphore = &r100_semaphore_ring_emit, 299 .cs_parse = &r300_cs_parse, 300 .ring_start = &r300_ring_start, 301 .ring_test = &r100_ring_test, 302 .ib_test = &r100_ib_test, 303 } 304 }, 305 .irq = { 306 .set = &r100_irq_set, 307 .process = &r100_irq_process, 308 }, 309 .display = { 310 .bandwidth_update = &r100_bandwidth_update, 311 .get_vblank_counter = &r100_get_vblank_counter, 312 .wait_for_vblank = &r100_wait_for_vblank, 313 }, 314 .copy = { 315 .blit = &r100_copy_blit, 316 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, 317 .dma = &r200_copy_dma, 318 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX, 319 .copy = &r100_copy_blit, 320 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX, 321 }, 322 .surface = { 323 .set_reg = r100_set_surface_reg, 324 .clear_reg = r100_clear_surface_reg, 325 }, 326 .hpd = { 327 .init = &r100_hpd_init, 328 .fini = &r100_hpd_fini, 329 .sense = &r100_hpd_sense, 330 .set_polarity = &r100_hpd_set_polarity, 331 }, 332 .pm = { 333 .misc = &r100_pm_misc, 334 .prepare = &r100_pm_prepare, 335 .finish = &r100_pm_finish, 336 .init_profile = &r100_pm_init_profile, 337 .get_dynpm_state = &r100_pm_get_dynpm_state, 338 .get_engine_clock = &radeon_legacy_get_engine_clock, 339 .set_engine_clock = &radeon_legacy_set_engine_clock, 340 .get_memory_clock = &radeon_legacy_get_memory_clock, 341 .set_memory_clock = NULL, 342 .get_pcie_lanes = &rv370_get_pcie_lanes, 343 .set_pcie_lanes = &rv370_set_pcie_lanes, 344 .set_clock_gating = &radeon_legacy_set_clock_gating, 345 }, 346 .pflip = { 347 .pre_page_flip = &r100_pre_page_flip, 348 .page_flip = &r100_page_flip, 349 .post_page_flip = &r100_post_page_flip, 350 }, 351 }; 352 353 static struct radeon_asic r300_asic_pcie = { 354 .init = &r300_init, 355 .fini = &r300_fini, 356 .suspend = &r300_suspend, 357 .resume = &r300_resume, 358 .vga_set_state = &r100_vga_set_state, 359 .gpu_is_lockup = &r300_gpu_is_lockup, 360 .asic_reset = &r300_asic_reset, 361 .ioctl_wait_idle = NULL, 362 .gui_idle = &r100_gui_idle, 363 .mc_wait_for_idle = &r300_mc_wait_for_idle, 364 .gart = { 365 .tlb_flush = &rv370_pcie_gart_tlb_flush, 366 .set_page = &rv370_pcie_gart_set_page, 367 }, 368 .ring = { 369 [RADEON_RING_TYPE_GFX_INDEX] = { 370 .ib_execute = &r100_ring_ib_execute, 371 .emit_fence = &r300_fence_ring_emit, 372 .emit_semaphore = &r100_semaphore_ring_emit, 373 .cs_parse = &r300_cs_parse, 374 .ring_start = &r300_ring_start, 375 .ring_test = &r100_ring_test, 376 .ib_test = &r100_ib_test, 377 } 378 }, 379 .irq = { 380 .set = &r100_irq_set, 381 .process = &r100_irq_process, 382 }, 383 .display = { 384 .bandwidth_update = &r100_bandwidth_update, 385 .get_vblank_counter = &r100_get_vblank_counter, 386 .wait_for_vblank = &r100_wait_for_vblank, 387 }, 388 .copy = { 389 .blit = &r100_copy_blit, 390 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, 391 .dma = &r200_copy_dma, 392 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX, 393 .copy = &r100_copy_blit, 394 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX, 395 }, 396 .surface = { 397 .set_reg = r100_set_surface_reg, 398 .clear_reg = r100_clear_surface_reg, 399 }, 400 .hpd = { 401 .init = &r100_hpd_init, 402 .fini = &r100_hpd_fini, 403 .sense = &r100_hpd_sense, 404 .set_polarity = &r100_hpd_set_polarity, 405 }, 406 .pm = { 407 .misc = &r100_pm_misc, 408 .prepare = &r100_pm_prepare, 409 .finish = &r100_pm_finish, 410 .init_profile = &r100_pm_init_profile, 411 .get_dynpm_state = &r100_pm_get_dynpm_state, 412 .get_engine_clock = &radeon_legacy_get_engine_clock, 413 .set_engine_clock = &radeon_legacy_set_engine_clock, 414 .get_memory_clock = &radeon_legacy_get_memory_clock, 415 .set_memory_clock = NULL, 416 .get_pcie_lanes = &rv370_get_pcie_lanes, 417 .set_pcie_lanes = &rv370_set_pcie_lanes, 418 .set_clock_gating = &radeon_legacy_set_clock_gating, 419 }, 420 .pflip = { 421 .pre_page_flip = &r100_pre_page_flip, 422 .page_flip = &r100_page_flip, 423 .post_page_flip = &r100_post_page_flip, 424 }, 425 }; 426 427 static struct radeon_asic r420_asic = { 428 .init = &r420_init, 429 .fini = &r420_fini, 430 .suspend = &r420_suspend, 431 .resume = &r420_resume, 432 .vga_set_state = &r100_vga_set_state, 433 .gpu_is_lockup = &r300_gpu_is_lockup, 434 .asic_reset = &r300_asic_reset, 435 .ioctl_wait_idle = NULL, 436 .gui_idle = &r100_gui_idle, 437 .mc_wait_for_idle = &r300_mc_wait_for_idle, 438 .gart = { 439 .tlb_flush = &rv370_pcie_gart_tlb_flush, 440 .set_page = &rv370_pcie_gart_set_page, 441 }, 442 .ring = { 443 [RADEON_RING_TYPE_GFX_INDEX] = { 444 .ib_execute = &r100_ring_ib_execute, 445 .emit_fence = &r300_fence_ring_emit, 446 .emit_semaphore = &r100_semaphore_ring_emit, 447 .cs_parse = &r300_cs_parse, 448 .ring_start = &r300_ring_start, 449 .ring_test = &r100_ring_test, 450 .ib_test = &r100_ib_test, 451 } 452 }, 453 .irq = { 454 .set = &r100_irq_set, 455 .process = &r100_irq_process, 456 }, 457 .display = { 458 .bandwidth_update = &r100_bandwidth_update, 459 .get_vblank_counter = &r100_get_vblank_counter, 460 .wait_for_vblank = &r100_wait_for_vblank, 461 }, 462 .copy = { 463 .blit = &r100_copy_blit, 464 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, 465 .dma = &r200_copy_dma, 466 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX, 467 .copy = &r100_copy_blit, 468 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX, 469 }, 470 .surface = { 471 .set_reg = r100_set_surface_reg, 472 .clear_reg = r100_clear_surface_reg, 473 }, 474 .hpd = { 475 .init = &r100_hpd_init, 476 .fini = &r100_hpd_fini, 477 .sense = &r100_hpd_sense, 478 .set_polarity = &r100_hpd_set_polarity, 479 }, 480 .pm = { 481 .misc = &r100_pm_misc, 482 .prepare = &r100_pm_prepare, 483 .finish = &r100_pm_finish, 484 .init_profile = &r420_pm_init_profile, 485 .get_dynpm_state = &r100_pm_get_dynpm_state, 486 .get_engine_clock = &radeon_atom_get_engine_clock, 487 .set_engine_clock = &radeon_atom_set_engine_clock, 488 .get_memory_clock = &radeon_atom_get_memory_clock, 489 .set_memory_clock = &radeon_atom_set_memory_clock, 490 .get_pcie_lanes = &rv370_get_pcie_lanes, 491 .set_pcie_lanes = &rv370_set_pcie_lanes, 492 .set_clock_gating = &radeon_atom_set_clock_gating, 493 }, 494 .pflip = { 495 .pre_page_flip = &r100_pre_page_flip, 496 .page_flip = &r100_page_flip, 497 .post_page_flip = &r100_post_page_flip, 498 }, 499 }; 500 501 static struct radeon_asic rs400_asic = { 502 .init = &rs400_init, 503 .fini = &rs400_fini, 504 .suspend = &rs400_suspend, 505 .resume = &rs400_resume, 506 .vga_set_state = &r100_vga_set_state, 507 .gpu_is_lockup = &r300_gpu_is_lockup, 508 .asic_reset = &r300_asic_reset, 509 .ioctl_wait_idle = NULL, 510 .gui_idle = &r100_gui_idle, 511 .mc_wait_for_idle = &rs400_mc_wait_for_idle, 512 .gart = { 513 .tlb_flush = &rs400_gart_tlb_flush, 514 .set_page = &rs400_gart_set_page, 515 }, 516 .ring = { 517 [RADEON_RING_TYPE_GFX_INDEX] = { 518 .ib_execute = &r100_ring_ib_execute, 519 .emit_fence = &r300_fence_ring_emit, 520 .emit_semaphore = &r100_semaphore_ring_emit, 521 .cs_parse = &r300_cs_parse, 522 .ring_start = &r300_ring_start, 523 .ring_test = &r100_ring_test, 524 .ib_test = &r100_ib_test, 525 } 526 }, 527 .irq = { 528 .set = &r100_irq_set, 529 .process = &r100_irq_process, 530 }, 531 .display = { 532 .bandwidth_update = &r100_bandwidth_update, 533 .get_vblank_counter = &r100_get_vblank_counter, 534 .wait_for_vblank = &r100_wait_for_vblank, 535 }, 536 .copy = { 537 .blit = &r100_copy_blit, 538 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, 539 .dma = &r200_copy_dma, 540 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX, 541 .copy = &r100_copy_blit, 542 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX, 543 }, 544 .surface = { 545 .set_reg = r100_set_surface_reg, 546 .clear_reg = r100_clear_surface_reg, 547 }, 548 .hpd = { 549 .init = &r100_hpd_init, 550 .fini = &r100_hpd_fini, 551 .sense = &r100_hpd_sense, 552 .set_polarity = &r100_hpd_set_polarity, 553 }, 554 .pm = { 555 .misc = &r100_pm_misc, 556 .prepare = &r100_pm_prepare, 557 .finish = &r100_pm_finish, 558 .init_profile = &r100_pm_init_profile, 559 .get_dynpm_state = &r100_pm_get_dynpm_state, 560 .get_engine_clock = &radeon_legacy_get_engine_clock, 561 .set_engine_clock = &radeon_legacy_set_engine_clock, 562 .get_memory_clock = &radeon_legacy_get_memory_clock, 563 .set_memory_clock = NULL, 564 .get_pcie_lanes = NULL, 565 .set_pcie_lanes = NULL, 566 .set_clock_gating = &radeon_legacy_set_clock_gating, 567 }, 568 .pflip = { 569 .pre_page_flip = &r100_pre_page_flip, 570 .page_flip = &r100_page_flip, 571 .post_page_flip = &r100_post_page_flip, 572 }, 573 }; 574 575 static struct radeon_asic rs600_asic = { 576 .init = &rs600_init, 577 .fini = &rs600_fini, 578 .suspend = &rs600_suspend, 579 .resume = &rs600_resume, 580 .vga_set_state = &r100_vga_set_state, 581 .gpu_is_lockup = &r300_gpu_is_lockup, 582 .asic_reset = &rs600_asic_reset, 583 .ioctl_wait_idle = NULL, 584 .gui_idle = &r100_gui_idle, 585 .mc_wait_for_idle = &rs600_mc_wait_for_idle, 586 .gart = { 587 .tlb_flush = &rs600_gart_tlb_flush, 588 .set_page = &rs600_gart_set_page, 589 }, 590 .ring = { 591 [RADEON_RING_TYPE_GFX_INDEX] = { 592 .ib_execute = &r100_ring_ib_execute, 593 .emit_fence = &r300_fence_ring_emit, 594 .emit_semaphore = &r100_semaphore_ring_emit, 595 .cs_parse = &r300_cs_parse, 596 .ring_start = &r300_ring_start, 597 .ring_test = &r100_ring_test, 598 .ib_test = &r100_ib_test, 599 } 600 }, 601 .irq = { 602 .set = &rs600_irq_set, 603 .process = &rs600_irq_process, 604 }, 605 .display = { 606 .bandwidth_update = &rs600_bandwidth_update, 607 .get_vblank_counter = &rs600_get_vblank_counter, 608 .wait_for_vblank = &avivo_wait_for_vblank, 609 }, 610 .copy = { 611 .blit = &r100_copy_blit, 612 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, 613 .dma = &r200_copy_dma, 614 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX, 615 .copy = &r100_copy_blit, 616 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX, 617 }, 618 .surface = { 619 .set_reg = r100_set_surface_reg, 620 .clear_reg = r100_clear_surface_reg, 621 }, 622 .hpd = { 623 .init = &rs600_hpd_init, 624 .fini = &rs600_hpd_fini, 625 .sense = &rs600_hpd_sense, 626 .set_polarity = &rs600_hpd_set_polarity, 627 }, 628 .pm = { 629 .misc = &rs600_pm_misc, 630 .prepare = &rs600_pm_prepare, 631 .finish = &rs600_pm_finish, 632 .init_profile = &r420_pm_init_profile, 633 .get_dynpm_state = &r100_pm_get_dynpm_state, 634 .get_engine_clock = &radeon_atom_get_engine_clock, 635 .set_engine_clock = &radeon_atom_set_engine_clock, 636 .get_memory_clock = &radeon_atom_get_memory_clock, 637 .set_memory_clock = &radeon_atom_set_memory_clock, 638 .get_pcie_lanes = NULL, 639 .set_pcie_lanes = NULL, 640 .set_clock_gating = &radeon_atom_set_clock_gating, 641 }, 642 .pflip = { 643 .pre_page_flip = &rs600_pre_page_flip, 644 .page_flip = &rs600_page_flip, 645 .post_page_flip = &rs600_post_page_flip, 646 }, 647 }; 648 649 static struct radeon_asic rs690_asic = { 650 .init = &rs690_init, 651 .fini = &rs690_fini, 652 .suspend = &rs690_suspend, 653 .resume = &rs690_resume, 654 .vga_set_state = &r100_vga_set_state, 655 .gpu_is_lockup = &r300_gpu_is_lockup, 656 .asic_reset = &rs600_asic_reset, 657 .ioctl_wait_idle = NULL, 658 .gui_idle = &r100_gui_idle, 659 .mc_wait_for_idle = &rs690_mc_wait_for_idle, 660 .gart = { 661 .tlb_flush = &rs400_gart_tlb_flush, 662 .set_page = &rs400_gart_set_page, 663 }, 664 .ring = { 665 [RADEON_RING_TYPE_GFX_INDEX] = { 666 .ib_execute = &r100_ring_ib_execute, 667 .emit_fence = &r300_fence_ring_emit, 668 .emit_semaphore = &r100_semaphore_ring_emit, 669 .cs_parse = &r300_cs_parse, 670 .ring_start = &r300_ring_start, 671 .ring_test = &r100_ring_test, 672 .ib_test = &r100_ib_test, 673 } 674 }, 675 .irq = { 676 .set = &rs600_irq_set, 677 .process = &rs600_irq_process, 678 }, 679 .display = { 680 .get_vblank_counter = &rs600_get_vblank_counter, 681 .bandwidth_update = &rs690_bandwidth_update, 682 .wait_for_vblank = &avivo_wait_for_vblank, 683 }, 684 .copy = { 685 .blit = &r100_copy_blit, 686 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, 687 .dma = &r200_copy_dma, 688 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX, 689 .copy = &r200_copy_dma, 690 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX, 691 }, 692 .surface = { 693 .set_reg = r100_set_surface_reg, 694 .clear_reg = r100_clear_surface_reg, 695 }, 696 .hpd = { 697 .init = &rs600_hpd_init, 698 .fini = &rs600_hpd_fini, 699 .sense = &rs600_hpd_sense, 700 .set_polarity = &rs600_hpd_set_polarity, 701 }, 702 .pm = { 703 .misc = &rs600_pm_misc, 704 .prepare = &rs600_pm_prepare, 705 .finish = &rs600_pm_finish, 706 .init_profile = &r420_pm_init_profile, 707 .get_dynpm_state = &r100_pm_get_dynpm_state, 708 .get_engine_clock = &radeon_atom_get_engine_clock, 709 .set_engine_clock = &radeon_atom_set_engine_clock, 710 .get_memory_clock = &radeon_atom_get_memory_clock, 711 .set_memory_clock = &radeon_atom_set_memory_clock, 712 .get_pcie_lanes = NULL, 713 .set_pcie_lanes = NULL, 714 .set_clock_gating = &radeon_atom_set_clock_gating, 715 }, 716 .pflip = { 717 .pre_page_flip = &rs600_pre_page_flip, 718 .page_flip = &rs600_page_flip, 719 .post_page_flip = &rs600_post_page_flip, 720 }, 721 }; 722 723 static struct radeon_asic rv515_asic = { 724 .init = &rv515_init, 725 .fini = &rv515_fini, 726 .suspend = &rv515_suspend, 727 .resume = &rv515_resume, 728 .vga_set_state = &r100_vga_set_state, 729 .gpu_is_lockup = &r300_gpu_is_lockup, 730 .asic_reset = &rs600_asic_reset, 731 .ioctl_wait_idle = NULL, 732 .gui_idle = &r100_gui_idle, 733 .mc_wait_for_idle = &rv515_mc_wait_for_idle, 734 .gart = { 735 .tlb_flush = &rv370_pcie_gart_tlb_flush, 736 .set_page = &rv370_pcie_gart_set_page, 737 }, 738 .ring = { 739 [RADEON_RING_TYPE_GFX_INDEX] = { 740 .ib_execute = &r100_ring_ib_execute, 741 .emit_fence = &r300_fence_ring_emit, 742 .emit_semaphore = &r100_semaphore_ring_emit, 743 .cs_parse = &r300_cs_parse, 744 .ring_start = &rv515_ring_start, 745 .ring_test = &r100_ring_test, 746 .ib_test = &r100_ib_test, 747 } 748 }, 749 .irq = { 750 .set = &rs600_irq_set, 751 .process = &rs600_irq_process, 752 }, 753 .display = { 754 .get_vblank_counter = &rs600_get_vblank_counter, 755 .bandwidth_update = &rv515_bandwidth_update, 756 .wait_for_vblank = &avivo_wait_for_vblank, 757 }, 758 .copy = { 759 .blit = &r100_copy_blit, 760 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, 761 .dma = &r200_copy_dma, 762 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX, 763 .copy = &r100_copy_blit, 764 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX, 765 }, 766 .surface = { 767 .set_reg = r100_set_surface_reg, 768 .clear_reg = r100_clear_surface_reg, 769 }, 770 .hpd = { 771 .init = &rs600_hpd_init, 772 .fini = &rs600_hpd_fini, 773 .sense = &rs600_hpd_sense, 774 .set_polarity = &rs600_hpd_set_polarity, 775 }, 776 .pm = { 777 .misc = &rs600_pm_misc, 778 .prepare = &rs600_pm_prepare, 779 .finish = &rs600_pm_finish, 780 .init_profile = &r420_pm_init_profile, 781 .get_dynpm_state = &r100_pm_get_dynpm_state, 782 .get_engine_clock = &radeon_atom_get_engine_clock, 783 .set_engine_clock = &radeon_atom_set_engine_clock, 784 .get_memory_clock = &radeon_atom_get_memory_clock, 785 .set_memory_clock = &radeon_atom_set_memory_clock, 786 .get_pcie_lanes = &rv370_get_pcie_lanes, 787 .set_pcie_lanes = &rv370_set_pcie_lanes, 788 .set_clock_gating = &radeon_atom_set_clock_gating, 789 }, 790 .pflip = { 791 .pre_page_flip = &rs600_pre_page_flip, 792 .page_flip = &rs600_page_flip, 793 .post_page_flip = &rs600_post_page_flip, 794 }, 795 }; 796 797 static struct radeon_asic r520_asic = { 798 .init = &r520_init, 799 .fini = &rv515_fini, 800 .suspend = &rv515_suspend, 801 .resume = &r520_resume, 802 .vga_set_state = &r100_vga_set_state, 803 .gpu_is_lockup = &r300_gpu_is_lockup, 804 .asic_reset = &rs600_asic_reset, 805 .ioctl_wait_idle = NULL, 806 .gui_idle = &r100_gui_idle, 807 .mc_wait_for_idle = &r520_mc_wait_for_idle, 808 .gart = { 809 .tlb_flush = &rv370_pcie_gart_tlb_flush, 810 .set_page = &rv370_pcie_gart_set_page, 811 }, 812 .ring = { 813 [RADEON_RING_TYPE_GFX_INDEX] = { 814 .ib_execute = &r100_ring_ib_execute, 815 .emit_fence = &r300_fence_ring_emit, 816 .emit_semaphore = &r100_semaphore_ring_emit, 817 .cs_parse = &r300_cs_parse, 818 .ring_start = &rv515_ring_start, 819 .ring_test = &r100_ring_test, 820 .ib_test = &r100_ib_test, 821 } 822 }, 823 .irq = { 824 .set = &rs600_irq_set, 825 .process = &rs600_irq_process, 826 }, 827 .display = { 828 .bandwidth_update = &rv515_bandwidth_update, 829 .get_vblank_counter = &rs600_get_vblank_counter, 830 .wait_for_vblank = &avivo_wait_for_vblank, 831 }, 832 .copy = { 833 .blit = &r100_copy_blit, 834 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, 835 .dma = &r200_copy_dma, 836 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX, 837 .copy = &r100_copy_blit, 838 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX, 839 }, 840 .surface = { 841 .set_reg = r100_set_surface_reg, 842 .clear_reg = r100_clear_surface_reg, 843 }, 844 .hpd = { 845 .init = &rs600_hpd_init, 846 .fini = &rs600_hpd_fini, 847 .sense = &rs600_hpd_sense, 848 .set_polarity = &rs600_hpd_set_polarity, 849 }, 850 .pm = { 851 .misc = &rs600_pm_misc, 852 .prepare = &rs600_pm_prepare, 853 .finish = &rs600_pm_finish, 854 .init_profile = &r420_pm_init_profile, 855 .get_dynpm_state = &r100_pm_get_dynpm_state, 856 .get_engine_clock = &radeon_atom_get_engine_clock, 857 .set_engine_clock = &radeon_atom_set_engine_clock, 858 .get_memory_clock = &radeon_atom_get_memory_clock, 859 .set_memory_clock = &radeon_atom_set_memory_clock, 860 .get_pcie_lanes = &rv370_get_pcie_lanes, 861 .set_pcie_lanes = &rv370_set_pcie_lanes, 862 .set_clock_gating = &radeon_atom_set_clock_gating, 863 }, 864 .pflip = { 865 .pre_page_flip = &rs600_pre_page_flip, 866 .page_flip = &rs600_page_flip, 867 .post_page_flip = &rs600_post_page_flip, 868 }, 869 }; 870 871 static struct radeon_asic r600_asic = { 872 .init = &r600_init, 873 .fini = &r600_fini, 874 .suspend = &r600_suspend, 875 .resume = &r600_resume, 876 .vga_set_state = &r600_vga_set_state, 877 .gpu_is_lockup = &r600_gpu_is_lockup, 878 .asic_reset = &r600_asic_reset, 879 .ioctl_wait_idle = r600_ioctl_wait_idle, 880 .gui_idle = &r600_gui_idle, 881 .mc_wait_for_idle = &r600_mc_wait_for_idle, 882 .gart = { 883 .tlb_flush = &r600_pcie_gart_tlb_flush, 884 .set_page = &rs600_gart_set_page, 885 }, 886 .ring = { 887 [RADEON_RING_TYPE_GFX_INDEX] = { 888 .ib_execute = &r600_ring_ib_execute, 889 .emit_fence = &r600_fence_ring_emit, 890 .emit_semaphore = &r600_semaphore_ring_emit, 891 .cs_parse = &r600_cs_parse, 892 .ring_test = &r600_ring_test, 893 .ib_test = &r600_ib_test, 894 } 895 }, 896 .irq = { 897 .set = &r600_irq_set, 898 .process = &r600_irq_process, 899 }, 900 .display = { 901 .bandwidth_update = &rv515_bandwidth_update, 902 .get_vblank_counter = &rs600_get_vblank_counter, 903 .wait_for_vblank = &avivo_wait_for_vblank, 904 }, 905 .copy = { 906 .blit = &r600_copy_blit, 907 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, 908 .dma = NULL, 909 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX, 910 .copy = &r600_copy_blit, 911 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX, 912 }, 913 .surface = { 914 .set_reg = r600_set_surface_reg, 915 .clear_reg = r600_clear_surface_reg, 916 }, 917 .hpd = { 918 .init = &r600_hpd_init, 919 .fini = &r600_hpd_fini, 920 .sense = &r600_hpd_sense, 921 .set_polarity = &r600_hpd_set_polarity, 922 }, 923 .pm = { 924 .misc = &r600_pm_misc, 925 .prepare = &rs600_pm_prepare, 926 .finish = &rs600_pm_finish, 927 .init_profile = &r600_pm_init_profile, 928 .get_dynpm_state = &r600_pm_get_dynpm_state, 929 .get_engine_clock = &radeon_atom_get_engine_clock, 930 .set_engine_clock = &radeon_atom_set_engine_clock, 931 .get_memory_clock = &radeon_atom_get_memory_clock, 932 .set_memory_clock = &radeon_atom_set_memory_clock, 933 .get_pcie_lanes = &r600_get_pcie_lanes, 934 .set_pcie_lanes = &r600_set_pcie_lanes, 935 .set_clock_gating = NULL, 936 }, 937 .pflip = { 938 .pre_page_flip = &rs600_pre_page_flip, 939 .page_flip = &rs600_page_flip, 940 .post_page_flip = &rs600_post_page_flip, 941 }, 942 }; 943 944 static struct radeon_asic rs780_asic = { 945 .init = &r600_init, 946 .fini = &r600_fini, 947 .suspend = &r600_suspend, 948 .resume = &r600_resume, 949 .gpu_is_lockup = &r600_gpu_is_lockup, 950 .vga_set_state = &r600_vga_set_state, 951 .asic_reset = &r600_asic_reset, 952 .ioctl_wait_idle = r600_ioctl_wait_idle, 953 .gui_idle = &r600_gui_idle, 954 .mc_wait_for_idle = &r600_mc_wait_for_idle, 955 .gart = { 956 .tlb_flush = &r600_pcie_gart_tlb_flush, 957 .set_page = &rs600_gart_set_page, 958 }, 959 .ring = { 960 [RADEON_RING_TYPE_GFX_INDEX] = { 961 .ib_execute = &r600_ring_ib_execute, 962 .emit_fence = &r600_fence_ring_emit, 963 .emit_semaphore = &r600_semaphore_ring_emit, 964 .cs_parse = &r600_cs_parse, 965 .ring_test = &r600_ring_test, 966 .ib_test = &r600_ib_test, 967 } 968 }, 969 .irq = { 970 .set = &r600_irq_set, 971 .process = &r600_irq_process, 972 }, 973 .display = { 974 .bandwidth_update = &rs690_bandwidth_update, 975 .get_vblank_counter = &rs600_get_vblank_counter, 976 .wait_for_vblank = &avivo_wait_for_vblank, 977 }, 978 .copy = { 979 .blit = &r600_copy_blit, 980 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, 981 .dma = NULL, 982 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX, 983 .copy = &r600_copy_blit, 984 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX, 985 }, 986 .surface = { 987 .set_reg = r600_set_surface_reg, 988 .clear_reg = r600_clear_surface_reg, 989 }, 990 .hpd = { 991 .init = &r600_hpd_init, 992 .fini = &r600_hpd_fini, 993 .sense = &r600_hpd_sense, 994 .set_polarity = &r600_hpd_set_polarity, 995 }, 996 .pm = { 997 .misc = &r600_pm_misc, 998 .prepare = &rs600_pm_prepare, 999 .finish = &rs600_pm_finish, 1000 .init_profile = &rs780_pm_init_profile, 1001 .get_dynpm_state = &r600_pm_get_dynpm_state, 1002 .get_engine_clock = &radeon_atom_get_engine_clock, 1003 .set_engine_clock = &radeon_atom_set_engine_clock, 1004 .get_memory_clock = NULL, 1005 .set_memory_clock = NULL, 1006 .get_pcie_lanes = NULL, 1007 .set_pcie_lanes = NULL, 1008 .set_clock_gating = NULL, 1009 }, 1010 .pflip = { 1011 .pre_page_flip = &rs600_pre_page_flip, 1012 .page_flip = &rs600_page_flip, 1013 .post_page_flip = &rs600_post_page_flip, 1014 }, 1015 }; 1016 1017 static struct radeon_asic rv770_asic = { 1018 .init = &rv770_init, 1019 .fini = &rv770_fini, 1020 .suspend = &rv770_suspend, 1021 .resume = &rv770_resume, 1022 .asic_reset = &r600_asic_reset, 1023 .gpu_is_lockup = &r600_gpu_is_lockup, 1024 .vga_set_state = &r600_vga_set_state, 1025 .ioctl_wait_idle = r600_ioctl_wait_idle, 1026 .gui_idle = &r600_gui_idle, 1027 .mc_wait_for_idle = &r600_mc_wait_for_idle, 1028 .gart = { 1029 .tlb_flush = &r600_pcie_gart_tlb_flush, 1030 .set_page = &rs600_gart_set_page, 1031 }, 1032 .ring = { 1033 [RADEON_RING_TYPE_GFX_INDEX] = { 1034 .ib_execute = &r600_ring_ib_execute, 1035 .emit_fence = &r600_fence_ring_emit, 1036 .emit_semaphore = &r600_semaphore_ring_emit, 1037 .cs_parse = &r600_cs_parse, 1038 .ring_test = &r600_ring_test, 1039 .ib_test = &r600_ib_test, 1040 } 1041 }, 1042 .irq = { 1043 .set = &r600_irq_set, 1044 .process = &r600_irq_process, 1045 }, 1046 .display = { 1047 .bandwidth_update = &rv515_bandwidth_update, 1048 .get_vblank_counter = &rs600_get_vblank_counter, 1049 .wait_for_vblank = &avivo_wait_for_vblank, 1050 }, 1051 .copy = { 1052 .blit = &r600_copy_blit, 1053 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, 1054 .dma = NULL, 1055 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX, 1056 .copy = &r600_copy_blit, 1057 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX, 1058 }, 1059 .surface = { 1060 .set_reg = r600_set_surface_reg, 1061 .clear_reg = r600_clear_surface_reg, 1062 }, 1063 .hpd = { 1064 .init = &r600_hpd_init, 1065 .fini = &r600_hpd_fini, 1066 .sense = &r600_hpd_sense, 1067 .set_polarity = &r600_hpd_set_polarity, 1068 }, 1069 .pm = { 1070 .misc = &rv770_pm_misc, 1071 .prepare = &rs600_pm_prepare, 1072 .finish = &rs600_pm_finish, 1073 .init_profile = &r600_pm_init_profile, 1074 .get_dynpm_state = &r600_pm_get_dynpm_state, 1075 .get_engine_clock = &radeon_atom_get_engine_clock, 1076 .set_engine_clock = &radeon_atom_set_engine_clock, 1077 .get_memory_clock = &radeon_atom_get_memory_clock, 1078 .set_memory_clock = &radeon_atom_set_memory_clock, 1079 .get_pcie_lanes = &r600_get_pcie_lanes, 1080 .set_pcie_lanes = &r600_set_pcie_lanes, 1081 .set_clock_gating = &radeon_atom_set_clock_gating, 1082 }, 1083 .pflip = { 1084 .pre_page_flip = &rs600_pre_page_flip, 1085 .page_flip = &rv770_page_flip, 1086 .post_page_flip = &rs600_post_page_flip, 1087 }, 1088 }; 1089 1090 static struct radeon_asic evergreen_asic = { 1091 .init = &evergreen_init, 1092 .fini = &evergreen_fini, 1093 .suspend = &evergreen_suspend, 1094 .resume = &evergreen_resume, 1095 .gpu_is_lockup = &evergreen_gpu_is_lockup, 1096 .asic_reset = &evergreen_asic_reset, 1097 .vga_set_state = &r600_vga_set_state, 1098 .ioctl_wait_idle = r600_ioctl_wait_idle, 1099 .gui_idle = &r600_gui_idle, 1100 .mc_wait_for_idle = &evergreen_mc_wait_for_idle, 1101 .gart = { 1102 .tlb_flush = &evergreen_pcie_gart_tlb_flush, 1103 .set_page = &rs600_gart_set_page, 1104 }, 1105 .ring = { 1106 [RADEON_RING_TYPE_GFX_INDEX] = { 1107 .ib_execute = &evergreen_ring_ib_execute, 1108 .emit_fence = &r600_fence_ring_emit, 1109 .emit_semaphore = &r600_semaphore_ring_emit, 1110 .cs_parse = &evergreen_cs_parse, 1111 .ring_test = &r600_ring_test, 1112 .ib_test = &r600_ib_test, 1113 } 1114 }, 1115 .irq = { 1116 .set = &evergreen_irq_set, 1117 .process = &evergreen_irq_process, 1118 }, 1119 .display = { 1120 .bandwidth_update = &evergreen_bandwidth_update, 1121 .get_vblank_counter = &evergreen_get_vblank_counter, 1122 .wait_for_vblank = &dce4_wait_for_vblank, 1123 }, 1124 .copy = { 1125 .blit = &r600_copy_blit, 1126 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, 1127 .dma = NULL, 1128 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX, 1129 .copy = &r600_copy_blit, 1130 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX, 1131 }, 1132 .surface = { 1133 .set_reg = r600_set_surface_reg, 1134 .clear_reg = r600_clear_surface_reg, 1135 }, 1136 .hpd = { 1137 .init = &evergreen_hpd_init, 1138 .fini = &evergreen_hpd_fini, 1139 .sense = &evergreen_hpd_sense, 1140 .set_polarity = &evergreen_hpd_set_polarity, 1141 }, 1142 .pm = { 1143 .misc = &evergreen_pm_misc, 1144 .prepare = &evergreen_pm_prepare, 1145 .finish = &evergreen_pm_finish, 1146 .init_profile = &r600_pm_init_profile, 1147 .get_dynpm_state = &r600_pm_get_dynpm_state, 1148 .get_engine_clock = &radeon_atom_get_engine_clock, 1149 .set_engine_clock = &radeon_atom_set_engine_clock, 1150 .get_memory_clock = &radeon_atom_get_memory_clock, 1151 .set_memory_clock = &radeon_atom_set_memory_clock, 1152 .get_pcie_lanes = &r600_get_pcie_lanes, 1153 .set_pcie_lanes = &r600_set_pcie_lanes, 1154 .set_clock_gating = NULL, 1155 }, 1156 .pflip = { 1157 .pre_page_flip = &evergreen_pre_page_flip, 1158 .page_flip = &evergreen_page_flip, 1159 .post_page_flip = &evergreen_post_page_flip, 1160 }, 1161 }; 1162 1163 static struct radeon_asic sumo_asic = { 1164 .init = &evergreen_init, 1165 .fini = &evergreen_fini, 1166 .suspend = &evergreen_suspend, 1167 .resume = &evergreen_resume, 1168 .gpu_is_lockup = &evergreen_gpu_is_lockup, 1169 .asic_reset = &evergreen_asic_reset, 1170 .vga_set_state = &r600_vga_set_state, 1171 .ioctl_wait_idle = r600_ioctl_wait_idle, 1172 .gui_idle = &r600_gui_idle, 1173 .mc_wait_for_idle = &evergreen_mc_wait_for_idle, 1174 .gart = { 1175 .tlb_flush = &evergreen_pcie_gart_tlb_flush, 1176 .set_page = &rs600_gart_set_page, 1177 }, 1178 .ring = { 1179 [RADEON_RING_TYPE_GFX_INDEX] = { 1180 .ib_execute = &evergreen_ring_ib_execute, 1181 .emit_fence = &r600_fence_ring_emit, 1182 .emit_semaphore = &r600_semaphore_ring_emit, 1183 .cs_parse = &evergreen_cs_parse, 1184 .ring_test = &r600_ring_test, 1185 .ib_test = &r600_ib_test, 1186 }, 1187 }, 1188 .irq = { 1189 .set = &evergreen_irq_set, 1190 .process = &evergreen_irq_process, 1191 }, 1192 .display = { 1193 .bandwidth_update = &evergreen_bandwidth_update, 1194 .get_vblank_counter = &evergreen_get_vblank_counter, 1195 .wait_for_vblank = &dce4_wait_for_vblank, 1196 }, 1197 .copy = { 1198 .blit = &r600_copy_blit, 1199 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, 1200 .dma = NULL, 1201 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX, 1202 .copy = &r600_copy_blit, 1203 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX, 1204 }, 1205 .surface = { 1206 .set_reg = r600_set_surface_reg, 1207 .clear_reg = r600_clear_surface_reg, 1208 }, 1209 .hpd = { 1210 .init = &evergreen_hpd_init, 1211 .fini = &evergreen_hpd_fini, 1212 .sense = &evergreen_hpd_sense, 1213 .set_polarity = &evergreen_hpd_set_polarity, 1214 }, 1215 .pm = { 1216 .misc = &evergreen_pm_misc, 1217 .prepare = &evergreen_pm_prepare, 1218 .finish = &evergreen_pm_finish, 1219 .init_profile = &sumo_pm_init_profile, 1220 .get_dynpm_state = &r600_pm_get_dynpm_state, 1221 .get_engine_clock = &radeon_atom_get_engine_clock, 1222 .set_engine_clock = &radeon_atom_set_engine_clock, 1223 .get_memory_clock = NULL, 1224 .set_memory_clock = NULL, 1225 .get_pcie_lanes = NULL, 1226 .set_pcie_lanes = NULL, 1227 .set_clock_gating = NULL, 1228 }, 1229 .pflip = { 1230 .pre_page_flip = &evergreen_pre_page_flip, 1231 .page_flip = &evergreen_page_flip, 1232 .post_page_flip = &evergreen_post_page_flip, 1233 }, 1234 }; 1235 1236 static struct radeon_asic btc_asic = { 1237 .init = &evergreen_init, 1238 .fini = &evergreen_fini, 1239 .suspend = &evergreen_suspend, 1240 .resume = &evergreen_resume, 1241 .gpu_is_lockup = &evergreen_gpu_is_lockup, 1242 .asic_reset = &evergreen_asic_reset, 1243 .vga_set_state = &r600_vga_set_state, 1244 .ioctl_wait_idle = r600_ioctl_wait_idle, 1245 .gui_idle = &r600_gui_idle, 1246 .mc_wait_for_idle = &evergreen_mc_wait_for_idle, 1247 .gart = { 1248 .tlb_flush = &evergreen_pcie_gart_tlb_flush, 1249 .set_page = &rs600_gart_set_page, 1250 }, 1251 .ring = { 1252 [RADEON_RING_TYPE_GFX_INDEX] = { 1253 .ib_execute = &evergreen_ring_ib_execute, 1254 .emit_fence = &r600_fence_ring_emit, 1255 .emit_semaphore = &r600_semaphore_ring_emit, 1256 .cs_parse = &evergreen_cs_parse, 1257 .ring_test = &r600_ring_test, 1258 .ib_test = &r600_ib_test, 1259 } 1260 }, 1261 .irq = { 1262 .set = &evergreen_irq_set, 1263 .process = &evergreen_irq_process, 1264 }, 1265 .display = { 1266 .bandwidth_update = &evergreen_bandwidth_update, 1267 .get_vblank_counter = &evergreen_get_vblank_counter, 1268 .wait_for_vblank = &dce4_wait_for_vblank, 1269 }, 1270 .copy = { 1271 .blit = &r600_copy_blit, 1272 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, 1273 .dma = NULL, 1274 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX, 1275 .copy = &r600_copy_blit, 1276 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX, 1277 }, 1278 .surface = { 1279 .set_reg = r600_set_surface_reg, 1280 .clear_reg = r600_clear_surface_reg, 1281 }, 1282 .hpd = { 1283 .init = &evergreen_hpd_init, 1284 .fini = &evergreen_hpd_fini, 1285 .sense = &evergreen_hpd_sense, 1286 .set_polarity = &evergreen_hpd_set_polarity, 1287 }, 1288 .pm = { 1289 .misc = &evergreen_pm_misc, 1290 .prepare = &evergreen_pm_prepare, 1291 .finish = &evergreen_pm_finish, 1292 .init_profile = &r600_pm_init_profile, 1293 .get_dynpm_state = &r600_pm_get_dynpm_state, 1294 .get_engine_clock = &radeon_atom_get_engine_clock, 1295 .set_engine_clock = &radeon_atom_set_engine_clock, 1296 .get_memory_clock = &radeon_atom_get_memory_clock, 1297 .set_memory_clock = &radeon_atom_set_memory_clock, 1298 .get_pcie_lanes = NULL, 1299 .set_pcie_lanes = NULL, 1300 .set_clock_gating = NULL, 1301 }, 1302 .pflip = { 1303 .pre_page_flip = &evergreen_pre_page_flip, 1304 .page_flip = &evergreen_page_flip, 1305 .post_page_flip = &evergreen_post_page_flip, 1306 }, 1307 }; 1308 1309 static const struct radeon_vm_funcs cayman_vm_funcs = { 1310 .init = &cayman_vm_init, 1311 .fini = &cayman_vm_fini, 1312 .bind = &cayman_vm_bind, 1313 .unbind = &cayman_vm_unbind, 1314 .tlb_flush = &cayman_vm_tlb_flush, 1315 .page_flags = &cayman_vm_page_flags, 1316 .set_page = &cayman_vm_set_page, 1317 }; 1318 1319 static struct radeon_asic cayman_asic = { 1320 .init = &cayman_init, 1321 .fini = &cayman_fini, 1322 .suspend = &cayman_suspend, 1323 .resume = &cayman_resume, 1324 .gpu_is_lockup = &cayman_gpu_is_lockup, 1325 .asic_reset = &cayman_asic_reset, 1326 .vga_set_state = &r600_vga_set_state, 1327 .ioctl_wait_idle = r600_ioctl_wait_idle, 1328 .gui_idle = &r600_gui_idle, 1329 .mc_wait_for_idle = &evergreen_mc_wait_for_idle, 1330 .gart = { 1331 .tlb_flush = &cayman_pcie_gart_tlb_flush, 1332 .set_page = &rs600_gart_set_page, 1333 }, 1334 .ring = { 1335 [RADEON_RING_TYPE_GFX_INDEX] = { 1336 .ib_execute = &cayman_ring_ib_execute, 1337 .ib_parse = &evergreen_ib_parse, 1338 .emit_fence = &cayman_fence_ring_emit, 1339 .emit_semaphore = &r600_semaphore_ring_emit, 1340 .cs_parse = &evergreen_cs_parse, 1341 .ring_test = &r600_ring_test, 1342 .ib_test = &r600_ib_test, 1343 }, 1344 [CAYMAN_RING_TYPE_CP1_INDEX] = { 1345 .ib_execute = &cayman_ring_ib_execute, 1346 .ib_parse = &evergreen_ib_parse, 1347 .emit_fence = &cayman_fence_ring_emit, 1348 .emit_semaphore = &r600_semaphore_ring_emit, 1349 .cs_parse = &evergreen_cs_parse, 1350 .ring_test = &r600_ring_test, 1351 .ib_test = &r600_ib_test, 1352 }, 1353 [CAYMAN_RING_TYPE_CP2_INDEX] = { 1354 .ib_execute = &cayman_ring_ib_execute, 1355 .ib_parse = &evergreen_ib_parse, 1356 .emit_fence = &cayman_fence_ring_emit, 1357 .emit_semaphore = &r600_semaphore_ring_emit, 1358 .cs_parse = &evergreen_cs_parse, 1359 .ring_test = &r600_ring_test, 1360 .ib_test = &r600_ib_test, 1361 } 1362 }, 1363 .irq = { 1364 .set = &evergreen_irq_set, 1365 .process = &evergreen_irq_process, 1366 }, 1367 .display = { 1368 .bandwidth_update = &evergreen_bandwidth_update, 1369 .get_vblank_counter = &evergreen_get_vblank_counter, 1370 .wait_for_vblank = &dce4_wait_for_vblank, 1371 }, 1372 .copy = { 1373 .blit = &r600_copy_blit, 1374 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, 1375 .dma = NULL, 1376 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX, 1377 .copy = &r600_copy_blit, 1378 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX, 1379 }, 1380 .surface = { 1381 .set_reg = r600_set_surface_reg, 1382 .clear_reg = r600_clear_surface_reg, 1383 }, 1384 .hpd = { 1385 .init = &evergreen_hpd_init, 1386 .fini = &evergreen_hpd_fini, 1387 .sense = &evergreen_hpd_sense, 1388 .set_polarity = &evergreen_hpd_set_polarity, 1389 }, 1390 .pm = { 1391 .misc = &evergreen_pm_misc, 1392 .prepare = &evergreen_pm_prepare, 1393 .finish = &evergreen_pm_finish, 1394 .init_profile = &r600_pm_init_profile, 1395 .get_dynpm_state = &r600_pm_get_dynpm_state, 1396 .get_engine_clock = &radeon_atom_get_engine_clock, 1397 .set_engine_clock = &radeon_atom_set_engine_clock, 1398 .get_memory_clock = &radeon_atom_get_memory_clock, 1399 .set_memory_clock = &radeon_atom_set_memory_clock, 1400 .get_pcie_lanes = NULL, 1401 .set_pcie_lanes = NULL, 1402 .set_clock_gating = NULL, 1403 }, 1404 .pflip = { 1405 .pre_page_flip = &evergreen_pre_page_flip, 1406 .page_flip = &evergreen_page_flip, 1407 .post_page_flip = &evergreen_post_page_flip, 1408 }, 1409 }; 1410 1411 static struct radeon_asic trinity_asic = { 1412 .init = &cayman_init, 1413 .fini = &cayman_fini, 1414 .suspend = &cayman_suspend, 1415 .resume = &cayman_resume, 1416 .gpu_is_lockup = &cayman_gpu_is_lockup, 1417 .asic_reset = &cayman_asic_reset, 1418 .vga_set_state = &r600_vga_set_state, 1419 .ioctl_wait_idle = r600_ioctl_wait_idle, 1420 .gui_idle = &r600_gui_idle, 1421 .mc_wait_for_idle = &evergreen_mc_wait_for_idle, 1422 .gart = { 1423 .tlb_flush = &cayman_pcie_gart_tlb_flush, 1424 .set_page = &rs600_gart_set_page, 1425 }, 1426 .ring = { 1427 [RADEON_RING_TYPE_GFX_INDEX] = { 1428 .ib_execute = &cayman_ring_ib_execute, 1429 .ib_parse = &evergreen_ib_parse, 1430 .emit_fence = &cayman_fence_ring_emit, 1431 .emit_semaphore = &r600_semaphore_ring_emit, 1432 .cs_parse = &evergreen_cs_parse, 1433 .ring_test = &r600_ring_test, 1434 .ib_test = &r600_ib_test, 1435 }, 1436 [CAYMAN_RING_TYPE_CP1_INDEX] = { 1437 .ib_execute = &cayman_ring_ib_execute, 1438 .ib_parse = &evergreen_ib_parse, 1439 .emit_fence = &cayman_fence_ring_emit, 1440 .emit_semaphore = &r600_semaphore_ring_emit, 1441 .cs_parse = &evergreen_cs_parse, 1442 .ring_test = &r600_ring_test, 1443 .ib_test = &r600_ib_test, 1444 }, 1445 [CAYMAN_RING_TYPE_CP2_INDEX] = { 1446 .ib_execute = &cayman_ring_ib_execute, 1447 .ib_parse = &evergreen_ib_parse, 1448 .emit_fence = &cayman_fence_ring_emit, 1449 .emit_semaphore = &r600_semaphore_ring_emit, 1450 .cs_parse = &evergreen_cs_parse, 1451 .ring_test = &r600_ring_test, 1452 .ib_test = &r600_ib_test, 1453 } 1454 }, 1455 .irq = { 1456 .set = &evergreen_irq_set, 1457 .process = &evergreen_irq_process, 1458 }, 1459 .display = { 1460 .bandwidth_update = &dce6_bandwidth_update, 1461 .get_vblank_counter = &evergreen_get_vblank_counter, 1462 .wait_for_vblank = &dce4_wait_for_vblank, 1463 }, 1464 .copy = { 1465 .blit = &r600_copy_blit, 1466 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, 1467 .dma = NULL, 1468 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX, 1469 .copy = &r600_copy_blit, 1470 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX, 1471 }, 1472 .surface = { 1473 .set_reg = r600_set_surface_reg, 1474 .clear_reg = r600_clear_surface_reg, 1475 }, 1476 .hpd = { 1477 .init = &evergreen_hpd_init, 1478 .fini = &evergreen_hpd_fini, 1479 .sense = &evergreen_hpd_sense, 1480 .set_polarity = &evergreen_hpd_set_polarity, 1481 }, 1482 .pm = { 1483 .misc = &evergreen_pm_misc, 1484 .prepare = &evergreen_pm_prepare, 1485 .finish = &evergreen_pm_finish, 1486 .init_profile = &sumo_pm_init_profile, 1487 .get_dynpm_state = &r600_pm_get_dynpm_state, 1488 .get_engine_clock = &radeon_atom_get_engine_clock, 1489 .set_engine_clock = &radeon_atom_set_engine_clock, 1490 .get_memory_clock = NULL, 1491 .set_memory_clock = NULL, 1492 .get_pcie_lanes = NULL, 1493 .set_pcie_lanes = NULL, 1494 .set_clock_gating = NULL, 1495 }, 1496 .pflip = { 1497 .pre_page_flip = &evergreen_pre_page_flip, 1498 .page_flip = &evergreen_page_flip, 1499 .post_page_flip = &evergreen_post_page_flip, 1500 }, 1501 }; 1502 1503 static const struct radeon_vm_funcs si_vm_funcs = { 1504 .init = &si_vm_init, 1505 .fini = &si_vm_fini, 1506 .bind = &si_vm_bind, 1507 .unbind = &si_vm_unbind, 1508 .tlb_flush = &si_vm_tlb_flush, 1509 .page_flags = &cayman_vm_page_flags, 1510 .set_page = &cayman_vm_set_page, 1511 }; 1512 1513 static struct radeon_asic si_asic = { 1514 .init = &si_init, 1515 .fini = &si_fini, 1516 .suspend = &si_suspend, 1517 .resume = &si_resume, 1518 .gpu_is_lockup = &si_gpu_is_lockup, 1519 .asic_reset = &si_asic_reset, 1520 .vga_set_state = &r600_vga_set_state, 1521 .ioctl_wait_idle = r600_ioctl_wait_idle, 1522 .gui_idle = &r600_gui_idle, 1523 .mc_wait_for_idle = &evergreen_mc_wait_for_idle, 1524 .gart = { 1525 .tlb_flush = &si_pcie_gart_tlb_flush, 1526 .set_page = &rs600_gart_set_page, 1527 }, 1528 .ring = { 1529 [RADEON_RING_TYPE_GFX_INDEX] = { 1530 .ib_execute = &si_ring_ib_execute, 1531 .ib_parse = &si_ib_parse, 1532 .emit_fence = &si_fence_ring_emit, 1533 .emit_semaphore = &r600_semaphore_ring_emit, 1534 .cs_parse = NULL, 1535 .ring_test = &r600_ring_test, 1536 .ib_test = &r600_ib_test, 1537 }, 1538 [CAYMAN_RING_TYPE_CP1_INDEX] = { 1539 .ib_execute = &si_ring_ib_execute, 1540 .ib_parse = &si_ib_parse, 1541 .emit_fence = &si_fence_ring_emit, 1542 .emit_semaphore = &r600_semaphore_ring_emit, 1543 .cs_parse = NULL, 1544 .ring_test = &r600_ring_test, 1545 .ib_test = &r600_ib_test, 1546 }, 1547 [CAYMAN_RING_TYPE_CP2_INDEX] = { 1548 .ib_execute = &si_ring_ib_execute, 1549 .ib_parse = &si_ib_parse, 1550 .emit_fence = &si_fence_ring_emit, 1551 .emit_semaphore = &r600_semaphore_ring_emit, 1552 .cs_parse = NULL, 1553 .ring_test = &r600_ring_test, 1554 .ib_test = &r600_ib_test, 1555 } 1556 }, 1557 .irq = { 1558 .set = &si_irq_set, 1559 .process = &si_irq_process, 1560 }, 1561 .display = { 1562 .bandwidth_update = &dce6_bandwidth_update, 1563 .get_vblank_counter = &evergreen_get_vblank_counter, 1564 .wait_for_vblank = &dce4_wait_for_vblank, 1565 }, 1566 .copy = { 1567 .blit = NULL, 1568 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, 1569 .dma = NULL, 1570 .dma_ring_index = RADEON_RING_TYPE_GFX_INDEX, 1571 .copy = NULL, 1572 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX, 1573 }, 1574 .surface = { 1575 .set_reg = r600_set_surface_reg, 1576 .clear_reg = r600_clear_surface_reg, 1577 }, 1578 .hpd = { 1579 .init = &evergreen_hpd_init, 1580 .fini = &evergreen_hpd_fini, 1581 .sense = &evergreen_hpd_sense, 1582 .set_polarity = &evergreen_hpd_set_polarity, 1583 }, 1584 .pm = { 1585 .misc = &evergreen_pm_misc, 1586 .prepare = &evergreen_pm_prepare, 1587 .finish = &evergreen_pm_finish, 1588 .init_profile = &sumo_pm_init_profile, 1589 .get_dynpm_state = &r600_pm_get_dynpm_state, 1590 .get_engine_clock = &radeon_atom_get_engine_clock, 1591 .set_engine_clock = &radeon_atom_set_engine_clock, 1592 .get_memory_clock = &radeon_atom_get_memory_clock, 1593 .set_memory_clock = &radeon_atom_set_memory_clock, 1594 .get_pcie_lanes = NULL, 1595 .set_pcie_lanes = NULL, 1596 .set_clock_gating = NULL, 1597 }, 1598 .pflip = { 1599 .pre_page_flip = &evergreen_pre_page_flip, 1600 .page_flip = &evergreen_page_flip, 1601 .post_page_flip = &evergreen_post_page_flip, 1602 }, 1603 }; 1604 1605 int radeon_asic_init(struct radeon_device *rdev) 1606 { 1607 radeon_register_accessor_init(rdev); 1608 1609 /* set the number of crtcs */ 1610 if (rdev->flags & RADEON_SINGLE_CRTC) 1611 rdev->num_crtc = 1; 1612 else 1613 rdev->num_crtc = 2; 1614 1615 switch (rdev->family) { 1616 case CHIP_R100: 1617 case CHIP_RV100: 1618 case CHIP_RS100: 1619 case CHIP_RV200: 1620 case CHIP_RS200: 1621 rdev->asic = &r100_asic; 1622 break; 1623 case CHIP_R200: 1624 case CHIP_RV250: 1625 case CHIP_RS300: 1626 case CHIP_RV280: 1627 rdev->asic = &r200_asic; 1628 break; 1629 case CHIP_R300: 1630 case CHIP_R350: 1631 case CHIP_RV350: 1632 case CHIP_RV380: 1633 if (rdev->flags & RADEON_IS_PCIE) 1634 rdev->asic = &r300_asic_pcie; 1635 else 1636 rdev->asic = &r300_asic; 1637 break; 1638 case CHIP_R420: 1639 case CHIP_R423: 1640 case CHIP_RV410: 1641 rdev->asic = &r420_asic; 1642 /* handle macs */ 1643 if (rdev->bios == NULL) { 1644 rdev->asic->pm.get_engine_clock = &radeon_legacy_get_engine_clock; 1645 rdev->asic->pm.set_engine_clock = &radeon_legacy_set_engine_clock; 1646 rdev->asic->pm.get_memory_clock = &radeon_legacy_get_memory_clock; 1647 rdev->asic->pm.set_memory_clock = NULL; 1648 } 1649 break; 1650 case CHIP_RS400: 1651 case CHIP_RS480: 1652 rdev->asic = &rs400_asic; 1653 break; 1654 case CHIP_RS600: 1655 rdev->asic = &rs600_asic; 1656 break; 1657 case CHIP_RS690: 1658 case CHIP_RS740: 1659 rdev->asic = &rs690_asic; 1660 break; 1661 case CHIP_RV515: 1662 rdev->asic = &rv515_asic; 1663 break; 1664 case CHIP_R520: 1665 case CHIP_RV530: 1666 case CHIP_RV560: 1667 case CHIP_RV570: 1668 case CHIP_R580: 1669 rdev->asic = &r520_asic; 1670 break; 1671 case CHIP_R600: 1672 case CHIP_RV610: 1673 case CHIP_RV630: 1674 case CHIP_RV620: 1675 case CHIP_RV635: 1676 case CHIP_RV670: 1677 rdev->asic = &r600_asic; 1678 break; 1679 case CHIP_RS780: 1680 case CHIP_RS880: 1681 rdev->asic = &rs780_asic; 1682 break; 1683 case CHIP_RV770: 1684 case CHIP_RV730: 1685 case CHIP_RV710: 1686 case CHIP_RV740: 1687 rdev->asic = &rv770_asic; 1688 break; 1689 case CHIP_CEDAR: 1690 case CHIP_REDWOOD: 1691 case CHIP_JUNIPER: 1692 case CHIP_CYPRESS: 1693 case CHIP_HEMLOCK: 1694 /* set num crtcs */ 1695 if (rdev->family == CHIP_CEDAR) 1696 rdev->num_crtc = 4; 1697 else 1698 rdev->num_crtc = 6; 1699 rdev->asic = &evergreen_asic; 1700 break; 1701 case CHIP_PALM: 1702 case CHIP_SUMO: 1703 case CHIP_SUMO2: 1704 rdev->asic = &sumo_asic; 1705 break; 1706 case CHIP_BARTS: 1707 case CHIP_TURKS: 1708 case CHIP_CAICOS: 1709 /* set num crtcs */ 1710 if (rdev->family == CHIP_CAICOS) 1711 rdev->num_crtc = 4; 1712 else 1713 rdev->num_crtc = 6; 1714 rdev->asic = &btc_asic; 1715 break; 1716 case CHIP_CAYMAN: 1717 rdev->asic = &cayman_asic; 1718 /* set num crtcs */ 1719 rdev->num_crtc = 6; 1720 rdev->vm_manager.funcs = &cayman_vm_funcs; 1721 break; 1722 case CHIP_ARUBA: 1723 rdev->asic = &trinity_asic; 1724 /* set num crtcs */ 1725 rdev->num_crtc = 4; 1726 rdev->vm_manager.funcs = &cayman_vm_funcs; 1727 break; 1728 case CHIP_TAHITI: 1729 case CHIP_PITCAIRN: 1730 case CHIP_VERDE: 1731 rdev->asic = &si_asic; 1732 /* set num crtcs */ 1733 rdev->num_crtc = 6; 1734 rdev->vm_manager.funcs = &si_vm_funcs; 1735 break; 1736 default: 1737 /* FIXME: not supported yet */ 1738 return -EINVAL; 1739 } 1740 1741 if (rdev->flags & RADEON_IS_IGP) { 1742 rdev->asic->pm.get_memory_clock = NULL; 1743 rdev->asic->pm.set_memory_clock = NULL; 1744 } 1745 1746 return 0; 1747 } 1748 1749