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