r100.c (c7eff978e0868ccad1ecbefcc342f6709f9f4789) | r100.c (48ef779ff32561c2ed780808fcd0ab4633df22bd) |
---|---|
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 --- 51 unchanged lines hidden (view full) --- 60MODULE_FIRMWARE(FIRMWARE_R300); 61MODULE_FIRMWARE(FIRMWARE_R420); 62MODULE_FIRMWARE(FIRMWARE_RS690); 63MODULE_FIRMWARE(FIRMWARE_RS600); 64MODULE_FIRMWARE(FIRMWARE_R520); 65 66#include "r100_track.h" 67 | 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 --- 51 unchanged lines hidden (view full) --- 60MODULE_FIRMWARE(FIRMWARE_R300); 61MODULE_FIRMWARE(FIRMWARE_R420); 62MODULE_FIRMWARE(FIRMWARE_RS690); 63MODULE_FIRMWARE(FIRMWARE_RS600); 64MODULE_FIRMWARE(FIRMWARE_R520); 65 66#include "r100_track.h" 67 |
68/* This files gather functions specifics to: 69 * r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280 70 * and others in some cases. 71 */ 72 73/** 74 * r100_wait_for_vblank - vblank wait asic callback. 75 * 76 * @rdev: radeon_device pointer 77 * @crtc: crtc to wait for vblank on 78 * 79 * Wait for vblank on the requested crtc (r1xx-r4xx). 80 */ |
|
68void r100_wait_for_vblank(struct radeon_device *rdev, int crtc) 69{ 70 struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc]; 71 int i; 72 73 if (radeon_crtc->crtc_id == 0) { 74 if (RREG32(RADEON_CRTC_GEN_CNTL) & RADEON_CRTC_EN) { 75 for (i = 0; i < rdev->usec_timeout; i++) { --- 18 unchanged lines hidden (view full) --- 94 if (RREG32(RADEON_CRTC2_STATUS) & RADEON_CRTC2_VBLANK_CUR) 95 break; 96 udelay(1); 97 } 98 } 99 } 100} 101 | 81void r100_wait_for_vblank(struct radeon_device *rdev, int crtc) 82{ 83 struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc]; 84 int i; 85 86 if (radeon_crtc->crtc_id == 0) { 87 if (RREG32(RADEON_CRTC_GEN_CNTL) & RADEON_CRTC_EN) { 88 for (i = 0; i < rdev->usec_timeout; i++) { --- 18 unchanged lines hidden (view full) --- 107 if (RREG32(RADEON_CRTC2_STATUS) & RADEON_CRTC2_VBLANK_CUR) 108 break; 109 udelay(1); 110 } 111 } 112 } 113} 114 |
102/* This files gather functions specifics to: 103 * r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280 | 115/** 116 * r100_pre_page_flip - pre-pageflip callback. 117 * 118 * @rdev: radeon_device pointer 119 * @crtc: crtc to prepare for pageflip on 120 * 121 * Pre-pageflip callback (r1xx-r4xx). 122 * Enables the pageflip irq (vblank irq). |
104 */ | 123 */ |
105 | |
106void r100_pre_page_flip(struct radeon_device *rdev, int crtc) 107{ 108 /* enable the pflip int */ 109 radeon_irq_kms_pflip_irq_get(rdev, crtc); 110} 111 | 124void r100_pre_page_flip(struct radeon_device *rdev, int crtc) 125{ 126 /* enable the pflip int */ 127 radeon_irq_kms_pflip_irq_get(rdev, crtc); 128} 129 |
130/** 131 * r100_post_page_flip - pos-pageflip callback. 132 * 133 * @rdev: radeon_device pointer 134 * @crtc: crtc to cleanup pageflip on 135 * 136 * Post-pageflip callback (r1xx-r4xx). 137 * Disables the pageflip irq (vblank irq). 138 */ |
|
112void r100_post_page_flip(struct radeon_device *rdev, int crtc) 113{ 114 /* disable the pflip int */ 115 radeon_irq_kms_pflip_irq_put(rdev, crtc); 116} 117 | 139void r100_post_page_flip(struct radeon_device *rdev, int crtc) 140{ 141 /* disable the pflip int */ 142 radeon_irq_kms_pflip_irq_put(rdev, crtc); 143} 144 |
145/** 146 * r100_page_flip - pageflip callback. 147 * 148 * @rdev: radeon_device pointer 149 * @crtc_id: crtc to cleanup pageflip on 150 * @crtc_base: new address of the crtc (GPU MC address) 151 * 152 * Does the actual pageflip (r1xx-r4xx). 153 * During vblank we take the crtc lock and wait for the update_pending 154 * bit to go high, when it does, we release the lock, and allow the 155 * double buffered update to take place. 156 * Returns the current update pending status. 157 */ |
|
118u32 r100_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base) 119{ 120 struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id]; 121 u32 tmp = ((u32)crtc_base) | RADEON_CRTC_OFFSET__OFFSET_LOCK; 122 int i; 123 124 /* Lock the graphics update lock */ 125 /* update the scanout addresses */ --- 10 unchanged lines hidden (view full) --- 136 /* Unlock the lock, so double-buffering can take place inside vblank */ 137 tmp &= ~RADEON_CRTC_OFFSET__OFFSET_LOCK; 138 WREG32(RADEON_CRTC_OFFSET + radeon_crtc->crtc_offset, tmp); 139 140 /* Return current update_pending status: */ 141 return RREG32(RADEON_CRTC_OFFSET + radeon_crtc->crtc_offset) & RADEON_CRTC_OFFSET__GUI_TRIG_OFFSET; 142} 143 | 158u32 r100_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base) 159{ 160 struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id]; 161 u32 tmp = ((u32)crtc_base) | RADEON_CRTC_OFFSET__OFFSET_LOCK; 162 int i; 163 164 /* Lock the graphics update lock */ 165 /* update the scanout addresses */ --- 10 unchanged lines hidden (view full) --- 176 /* Unlock the lock, so double-buffering can take place inside vblank */ 177 tmp &= ~RADEON_CRTC_OFFSET__OFFSET_LOCK; 178 WREG32(RADEON_CRTC_OFFSET + radeon_crtc->crtc_offset, tmp); 179 180 /* Return current update_pending status: */ 181 return RREG32(RADEON_CRTC_OFFSET + radeon_crtc->crtc_offset) & RADEON_CRTC_OFFSET__GUI_TRIG_OFFSET; 182} 183 |
184/** 185 * r100_pm_get_dynpm_state - look up dynpm power state callback. 186 * 187 * @rdev: radeon_device pointer 188 * 189 * Look up the optimal power state based on the 190 * current state of the GPU (r1xx-r5xx). 191 * Used for dynpm only. 192 */ |
|
144void r100_pm_get_dynpm_state(struct radeon_device *rdev) 145{ 146 int i; 147 rdev->pm.dynpm_can_upclock = true; 148 rdev->pm.dynpm_can_downclock = true; 149 150 switch (rdev->pm.dynpm_planned_action) { 151 case DYNPM_ACTION_MINIMUM: --- 66 unchanged lines hidden (view full) --- 218 rdev->pm.power_state[rdev->pm.requested_power_state_index]. 219 clock_info[rdev->pm.requested_clock_mode_index].sclk, 220 rdev->pm.power_state[rdev->pm.requested_power_state_index]. 221 clock_info[rdev->pm.requested_clock_mode_index].mclk, 222 rdev->pm.power_state[rdev->pm.requested_power_state_index]. 223 pcie_lanes); 224} 225 | 193void r100_pm_get_dynpm_state(struct radeon_device *rdev) 194{ 195 int i; 196 rdev->pm.dynpm_can_upclock = true; 197 rdev->pm.dynpm_can_downclock = true; 198 199 switch (rdev->pm.dynpm_planned_action) { 200 case DYNPM_ACTION_MINIMUM: --- 66 unchanged lines hidden (view full) --- 267 rdev->pm.power_state[rdev->pm.requested_power_state_index]. 268 clock_info[rdev->pm.requested_clock_mode_index].sclk, 269 rdev->pm.power_state[rdev->pm.requested_power_state_index]. 270 clock_info[rdev->pm.requested_clock_mode_index].mclk, 271 rdev->pm.power_state[rdev->pm.requested_power_state_index]. 272 pcie_lanes); 273} 274 |
275/** 276 * r100_pm_init_profile - Initialize power profiles callback. 277 * 278 * @rdev: radeon_device pointer 279 * 280 * Initialize the power states used in profile mode 281 * (r1xx-r3xx). 282 * Used for profile mode only. 283 */ |
|
226void r100_pm_init_profile(struct radeon_device *rdev) 227{ 228 /* default */ 229 rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index; 230 rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index; 231 rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_cm_idx = 0; 232 rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_cm_idx = 0; 233 /* low sh */ --- 23 unchanged lines hidden (view full) --- 257 rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_cm_idx = 0; 258 /* high mh */ 259 rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_ps_idx = 0; 260 rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index; 261 rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_cm_idx = 0; 262 rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx = 0; 263} 264 | 284void r100_pm_init_profile(struct radeon_device *rdev) 285{ 286 /* default */ 287 rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index; 288 rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index; 289 rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_cm_idx = 0; 290 rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_cm_idx = 0; 291 /* low sh */ --- 23 unchanged lines hidden (view full) --- 315 rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_cm_idx = 0; 316 /* high mh */ 317 rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_ps_idx = 0; 318 rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index; 319 rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_cm_idx = 0; 320 rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx = 0; 321} 322 |
323/** 324 * r100_pm_misc - set additional pm hw parameters callback. 325 * 326 * @rdev: radeon_device pointer 327 * 328 * Set non-clock parameters associated with a power state 329 * (voltage, pcie lanes, etc.) (r1xx-r4xx). 330 */ |
|
265void r100_pm_misc(struct radeon_device *rdev) 266{ 267 int requested_index = rdev->pm.requested_power_state_index; 268 struct radeon_power_state *ps = &rdev->pm.power_state[requested_index]; 269 struct radeon_voltage *voltage = &ps->clock_info[0].voltage; 270 u32 tmp, sclk_cntl, sclk_cntl2, sclk_more_cntl; 271 272 if ((voltage->type == VOLTAGE_GPIO) && (voltage->gpio.valid)) { --- 75 unchanged lines hidden (view full) --- 348 (ps->pcie_lanes != 349 rdev->pm.power_state[rdev->pm.current_power_state_index].pcie_lanes)) { 350 radeon_set_pcie_lanes(rdev, 351 ps->pcie_lanes); 352 DRM_DEBUG_DRIVER("Setting: p: %d\n", ps->pcie_lanes); 353 } 354} 355 | 331void r100_pm_misc(struct radeon_device *rdev) 332{ 333 int requested_index = rdev->pm.requested_power_state_index; 334 struct radeon_power_state *ps = &rdev->pm.power_state[requested_index]; 335 struct radeon_voltage *voltage = &ps->clock_info[0].voltage; 336 u32 tmp, sclk_cntl, sclk_cntl2, sclk_more_cntl; 337 338 if ((voltage->type == VOLTAGE_GPIO) && (voltage->gpio.valid)) { --- 75 unchanged lines hidden (view full) --- 414 (ps->pcie_lanes != 415 rdev->pm.power_state[rdev->pm.current_power_state_index].pcie_lanes)) { 416 radeon_set_pcie_lanes(rdev, 417 ps->pcie_lanes); 418 DRM_DEBUG_DRIVER("Setting: p: %d\n", ps->pcie_lanes); 419 } 420} 421 |
422/** 423 * r100_pm_prepare - pre-power state change callback. 424 * 425 * @rdev: radeon_device pointer 426 * 427 * Prepare for a power state change (r1xx-r4xx). 428 */ |
|
356void r100_pm_prepare(struct radeon_device *rdev) 357{ 358 struct drm_device *ddev = rdev->ddev; 359 struct drm_crtc *crtc; 360 struct radeon_crtc *radeon_crtc; 361 u32 tmp; 362 363 /* disable any active CRTCs */ --- 8 unchanged lines hidden (view full) --- 372 tmp = RREG32(RADEON_CRTC_GEN_CNTL); 373 tmp |= RADEON_CRTC_DISP_REQ_EN_B; 374 WREG32(RADEON_CRTC_GEN_CNTL, tmp); 375 } 376 } 377 } 378} 379 | 429void r100_pm_prepare(struct radeon_device *rdev) 430{ 431 struct drm_device *ddev = rdev->ddev; 432 struct drm_crtc *crtc; 433 struct radeon_crtc *radeon_crtc; 434 u32 tmp; 435 436 /* disable any active CRTCs */ --- 8 unchanged lines hidden (view full) --- 445 tmp = RREG32(RADEON_CRTC_GEN_CNTL); 446 tmp |= RADEON_CRTC_DISP_REQ_EN_B; 447 WREG32(RADEON_CRTC_GEN_CNTL, tmp); 448 } 449 } 450 } 451} 452 |
453/** 454 * r100_pm_finish - post-power state change callback. 455 * 456 * @rdev: radeon_device pointer 457 * 458 * Clean up after a power state change (r1xx-r4xx). 459 */ |
|
380void r100_pm_finish(struct radeon_device *rdev) 381{ 382 struct drm_device *ddev = rdev->ddev; 383 struct drm_crtc *crtc; 384 struct radeon_crtc *radeon_crtc; 385 u32 tmp; 386 387 /* enable any active CRTCs */ --- 8 unchanged lines hidden (view full) --- 396 tmp = RREG32(RADEON_CRTC_GEN_CNTL); 397 tmp &= ~RADEON_CRTC_DISP_REQ_EN_B; 398 WREG32(RADEON_CRTC_GEN_CNTL, tmp); 399 } 400 } 401 } 402} 403 | 460void r100_pm_finish(struct radeon_device *rdev) 461{ 462 struct drm_device *ddev = rdev->ddev; 463 struct drm_crtc *crtc; 464 struct radeon_crtc *radeon_crtc; 465 u32 tmp; 466 467 /* enable any active CRTCs */ --- 8 unchanged lines hidden (view full) --- 476 tmp = RREG32(RADEON_CRTC_GEN_CNTL); 477 tmp &= ~RADEON_CRTC_DISP_REQ_EN_B; 478 WREG32(RADEON_CRTC_GEN_CNTL, tmp); 479 } 480 } 481 } 482} 483 |
484/** 485 * r100_gui_idle - gui idle callback. 486 * 487 * @rdev: radeon_device pointer 488 * 489 * Check of the GUI (2D/3D engines) are idle (r1xx-r5xx). 490 * Returns true if idle, false if not. 491 */ |
|
404bool r100_gui_idle(struct radeon_device *rdev) 405{ 406 if (RREG32(RADEON_RBBM_STATUS) & RADEON_RBBM_ACTIVE) 407 return false; 408 else 409 return true; 410} 411 412/* hpd for digital panel detect/disconnect */ | 492bool r100_gui_idle(struct radeon_device *rdev) 493{ 494 if (RREG32(RADEON_RBBM_STATUS) & RADEON_RBBM_ACTIVE) 495 return false; 496 else 497 return true; 498} 499 500/* hpd for digital panel detect/disconnect */ |
501/** 502 * r100_hpd_sense - hpd sense callback. 503 * 504 * @rdev: radeon_device pointer 505 * @hpd: hpd (hotplug detect) pin 506 * 507 * Checks if a digital monitor is connected (r1xx-r4xx). 508 * Returns true if connected, false if not connected. 509 */ |
|
413bool r100_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd) 414{ 415 bool connected = false; 416 417 switch (hpd) { 418 case RADEON_HPD_1: 419 if (RREG32(RADEON_FP_GEN_CNTL) & RADEON_FP_DETECT_SENSE) 420 connected = true; 421 break; 422 case RADEON_HPD_2: 423 if (RREG32(RADEON_FP2_GEN_CNTL) & RADEON_FP2_DETECT_SENSE) 424 connected = true; 425 break; 426 default: 427 break; 428 } 429 return connected; 430} 431 | 510bool r100_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd) 511{ 512 bool connected = false; 513 514 switch (hpd) { 515 case RADEON_HPD_1: 516 if (RREG32(RADEON_FP_GEN_CNTL) & RADEON_FP_DETECT_SENSE) 517 connected = true; 518 break; 519 case RADEON_HPD_2: 520 if (RREG32(RADEON_FP2_GEN_CNTL) & RADEON_FP2_DETECT_SENSE) 521 connected = true; 522 break; 523 default: 524 break; 525 } 526 return connected; 527} 528 |
529/** 530 * r100_hpd_set_polarity - hpd set polarity callback. 531 * 532 * @rdev: radeon_device pointer 533 * @hpd: hpd (hotplug detect) pin 534 * 535 * Set the polarity of the hpd pin (r1xx-r4xx). 536 */ |
|
432void r100_hpd_set_polarity(struct radeon_device *rdev, 433 enum radeon_hpd_id hpd) 434{ 435 u32 tmp; 436 bool connected = r100_hpd_sense(rdev, hpd); 437 438 switch (hpd) { 439 case RADEON_HPD_1: --- 12 unchanged lines hidden (view full) --- 452 tmp |= RADEON_FP2_DETECT_INT_POL; 453 WREG32(RADEON_FP2_GEN_CNTL, tmp); 454 break; 455 default: 456 break; 457 } 458} 459 | 537void r100_hpd_set_polarity(struct radeon_device *rdev, 538 enum radeon_hpd_id hpd) 539{ 540 u32 tmp; 541 bool connected = r100_hpd_sense(rdev, hpd); 542 543 switch (hpd) { 544 case RADEON_HPD_1: --- 12 unchanged lines hidden (view full) --- 557 tmp |= RADEON_FP2_DETECT_INT_POL; 558 WREG32(RADEON_FP2_GEN_CNTL, tmp); 559 break; 560 default: 561 break; 562 } 563} 564 |
565/** 566 * r100_hpd_init - hpd setup callback. 567 * 568 * @rdev: radeon_device pointer 569 * 570 * Setup the hpd pins used by the card (r1xx-r4xx). 571 * Set the polarity, and enable the hpd interrupts. 572 */ |
|
460void r100_hpd_init(struct radeon_device *rdev) 461{ 462 struct drm_device *dev = rdev->ddev; 463 struct drm_connector *connector; 464 unsigned enable = 0; 465 466 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 467 struct radeon_connector *radeon_connector = to_radeon_connector(connector); 468 enable |= 1 << radeon_connector->hpd.hpd; 469 radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd); 470 } 471 radeon_irq_kms_enable_hpd(rdev, enable); 472} 473 | 573void r100_hpd_init(struct radeon_device *rdev) 574{ 575 struct drm_device *dev = rdev->ddev; 576 struct drm_connector *connector; 577 unsigned enable = 0; 578 579 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 580 struct radeon_connector *radeon_connector = to_radeon_connector(connector); 581 enable |= 1 << radeon_connector->hpd.hpd; 582 radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd); 583 } 584 radeon_irq_kms_enable_hpd(rdev, enable); 585} 586 |
587/** 588 * r100_hpd_fini - hpd tear down callback. 589 * 590 * @rdev: radeon_device pointer 591 * 592 * Tear down the hpd pins used by the card (r1xx-r4xx). 593 * Disable the hpd interrupts. 594 */ |
|
474void r100_hpd_fini(struct radeon_device *rdev) 475{ 476 struct drm_device *dev = rdev->ddev; 477 struct drm_connector *connector; 478 unsigned disable = 0; 479 480 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 481 struct radeon_connector *radeon_connector = to_radeon_connector(connector); --- 3632 unchanged lines hidden --- | 595void r100_hpd_fini(struct radeon_device *rdev) 596{ 597 struct drm_device *dev = rdev->ddev; 598 struct drm_connector *connector; 599 unsigned disable = 0; 600 601 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 602 struct radeon_connector *radeon_connector = to_radeon_connector(connector); --- 3632 unchanged lines hidden --- |