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