diff options
Diffstat (limited to 'drivers/gpu/drm/radeon')
29 files changed, 139 insertions, 103 deletions
diff --git a/drivers/gpu/drm/radeon/atom.c b/drivers/gpu/drm/radeon/atom.c index 258fa5e7a2d9..d71d375149f8 100644 --- a/drivers/gpu/drm/radeon/atom.c +++ b/drivers/gpu/drm/radeon/atom.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include "atom.h" | 32 | #include "atom.h" |
33 | #include "atom-names.h" | 33 | #include "atom-names.h" |
34 | #include "atom-bits.h" | 34 | #include "atom-bits.h" |
35 | #include "radeon.h" | ||
35 | 36 | ||
36 | #define ATOM_COND_ABOVE 0 | 37 | #define ATOM_COND_ABOVE 0 |
37 | #define ATOM_COND_ABOVEOREQUAL 1 | 38 | #define ATOM_COND_ABOVEOREQUAL 1 |
@@ -101,7 +102,9 @@ static void debug_print_spaces(int n) | |||
101 | static uint32_t atom_iio_execute(struct atom_context *ctx, int base, | 102 | static uint32_t atom_iio_execute(struct atom_context *ctx, int base, |
102 | uint32_t index, uint32_t data) | 103 | uint32_t index, uint32_t data) |
103 | { | 104 | { |
105 | struct radeon_device *rdev = ctx->card->dev->dev_private; | ||
104 | uint32_t temp = 0xCDCDCDCD; | 106 | uint32_t temp = 0xCDCDCDCD; |
107 | |||
105 | while (1) | 108 | while (1) |
106 | switch (CU8(base)) { | 109 | switch (CU8(base)) { |
107 | case ATOM_IIO_NOP: | 110 | case ATOM_IIO_NOP: |
@@ -112,7 +115,8 @@ static uint32_t atom_iio_execute(struct atom_context *ctx, int base, | |||
112 | base += 3; | 115 | base += 3; |
113 | break; | 116 | break; |
114 | case ATOM_IIO_WRITE: | 117 | case ATOM_IIO_WRITE: |
115 | (void)ctx->card->ioreg_read(ctx->card, CU16(base + 1)); | 118 | if (rdev->family == CHIP_RV515) |
119 | (void)ctx->card->ioreg_read(ctx->card, CU16(base + 1)); | ||
116 | ctx->card->ioreg_write(ctx->card, CU16(base + 1), temp); | 120 | ctx->card->ioreg_write(ctx->card, CU16(base + 1), temp); |
117 | base += 3; | 121 | base += 3; |
118 | break; | 122 | break; |
diff --git a/drivers/gpu/drm/radeon/atombios.h b/drivers/gpu/drm/radeon/atombios.h index 04b269d14a59..7fd88497b930 100644 --- a/drivers/gpu/drm/radeon/atombios.h +++ b/drivers/gpu/drm/radeon/atombios.h | |||
@@ -738,13 +738,13 @@ typedef struct _ATOM_DIG_ENCODER_CONFIG_V3 | |||
738 | { | 738 | { |
739 | #if ATOM_BIG_ENDIAN | 739 | #if ATOM_BIG_ENDIAN |
740 | UCHAR ucReserved1:1; | 740 | UCHAR ucReserved1:1; |
741 | UCHAR ucDigSel:3; // =0/1/2/3/4/5: DIG0/1/2/3/4/5 (In register spec also refered as DIGA/B/C/D/E/F) | 741 | UCHAR ucDigSel:3; // =0/1/2/3/4/5: DIG0/1/2/3/4/5 (In register spec also referred as DIGA/B/C/D/E/F) |
742 | UCHAR ucReserved:3; | 742 | UCHAR ucReserved:3; |
743 | UCHAR ucDPLinkRate:1; // =0: 1.62Ghz, =1: 2.7Ghz | 743 | UCHAR ucDPLinkRate:1; // =0: 1.62Ghz, =1: 2.7Ghz |
744 | #else | 744 | #else |
745 | UCHAR ucDPLinkRate:1; // =0: 1.62Ghz, =1: 2.7Ghz | 745 | UCHAR ucDPLinkRate:1; // =0: 1.62Ghz, =1: 2.7Ghz |
746 | UCHAR ucReserved:3; | 746 | UCHAR ucReserved:3; |
747 | UCHAR ucDigSel:3; // =0/1/2/3/4/5: DIG0/1/2/3/4/5 (In register spec also refered as DIGA/B/C/D/E/F) | 747 | UCHAR ucDigSel:3; // =0/1/2/3/4/5: DIG0/1/2/3/4/5 (In register spec also referred as DIGA/B/C/D/E/F) |
748 | UCHAR ucReserved1:1; | 748 | UCHAR ucReserved1:1; |
749 | #endif | 749 | #endif |
750 | }ATOM_DIG_ENCODER_CONFIG_V3; | 750 | }ATOM_DIG_ENCODER_CONFIG_V3; |
@@ -785,13 +785,13 @@ typedef struct _ATOM_DIG_ENCODER_CONFIG_V4 | |||
785 | { | 785 | { |
786 | #if ATOM_BIG_ENDIAN | 786 | #if ATOM_BIG_ENDIAN |
787 | UCHAR ucReserved1:1; | 787 | UCHAR ucReserved1:1; |
788 | UCHAR ucDigSel:3; // =0/1/2/3/4/5: DIG0/1/2/3/4/5 (In register spec also refered as DIGA/B/C/D/E/F) | 788 | UCHAR ucDigSel:3; // =0/1/2/3/4/5: DIG0/1/2/3/4/5 (In register spec also referred as DIGA/B/C/D/E/F) |
789 | UCHAR ucReserved:2; | 789 | UCHAR ucReserved:2; |
790 | UCHAR ucDPLinkRate:2; // =0: 1.62Ghz, =1: 2.7Ghz, 2=5.4Ghz <= Changed comparing to previous version | 790 | UCHAR ucDPLinkRate:2; // =0: 1.62Ghz, =1: 2.7Ghz, 2=5.4Ghz <= Changed comparing to previous version |
791 | #else | 791 | #else |
792 | UCHAR ucDPLinkRate:2; // =0: 1.62Ghz, =1: 2.7Ghz, 2=5.4Ghz <= Changed comparing to previous version | 792 | UCHAR ucDPLinkRate:2; // =0: 1.62Ghz, =1: 2.7Ghz, 2=5.4Ghz <= Changed comparing to previous version |
793 | UCHAR ucReserved:2; | 793 | UCHAR ucReserved:2; |
794 | UCHAR ucDigSel:3; // =0/1/2/3/4/5: DIG0/1/2/3/4/5 (In register spec also refered as DIGA/B/C/D/E/F) | 794 | UCHAR ucDigSel:3; // =0/1/2/3/4/5: DIG0/1/2/3/4/5 (In register spec also referred as DIGA/B/C/D/E/F) |
795 | UCHAR ucReserved1:1; | 795 | UCHAR ucReserved1:1; |
796 | #endif | 796 | #endif |
797 | }ATOM_DIG_ENCODER_CONFIG_V4; | 797 | }ATOM_DIG_ENCODER_CONFIG_V4; |
@@ -2126,7 +2126,7 @@ typedef struct _ATOM_MULTIMEDIA_CONFIG_INFO | |||
2126 | // Structures used in FirmwareInfoTable | 2126 | // Structures used in FirmwareInfoTable |
2127 | /****************************************************************************/ | 2127 | /****************************************************************************/ |
2128 | 2128 | ||
2129 | // usBIOSCapability Defintion: | 2129 | // usBIOSCapability Definition: |
2130 | // Bit 0 = 0: Bios image is not Posted, =1:Bios image is Posted; | 2130 | // Bit 0 = 0: Bios image is not Posted, =1:Bios image is Posted; |
2131 | // Bit 1 = 0: Dual CRTC is not supported, =1: Dual CRTC is supported; | 2131 | // Bit 1 = 0: Dual CRTC is not supported, =1: Dual CRTC is supported; |
2132 | // Bit 2 = 0: Extended Desktop is not supported, =1: Extended Desktop is supported; | 2132 | // Bit 2 = 0: Extended Desktop is not supported, =1: Extended Desktop is supported; |
@@ -3341,7 +3341,7 @@ typedef struct _ATOM_SPREAD_SPECTRUM_INFO | |||
3341 | /****************************************************************************/ | 3341 | /****************************************************************************/ |
3342 | // Structure used in AnalogTV_InfoTable (Top level) | 3342 | // Structure used in AnalogTV_InfoTable (Top level) |
3343 | /****************************************************************************/ | 3343 | /****************************************************************************/ |
3344 | //ucTVBootUpDefaultStd definiton: | 3344 | //ucTVBootUpDefaultStd definition: |
3345 | 3345 | ||
3346 | //ATOM_TV_NTSC 1 | 3346 | //ATOM_TV_NTSC 1 |
3347 | //ATOM_TV_NTSCJ 2 | 3347 | //ATOM_TV_NTSCJ 2 |
@@ -3816,7 +3816,7 @@ typedef struct _ATOM_EXTERNAL_DISPLAY_CONNECTION_INFO | |||
3816 | UCHAR Reserved [6]; // for potential expansion | 3816 | UCHAR Reserved [6]; // for potential expansion |
3817 | }ATOM_EXTERNAL_DISPLAY_CONNECTION_INFO; | 3817 | }ATOM_EXTERNAL_DISPLAY_CONNECTION_INFO; |
3818 | 3818 | ||
3819 | //Related definitions, all records are differnt but they have a commond header | 3819 | //Related definitions, all records are different but they have a commond header |
3820 | typedef struct _ATOM_COMMON_RECORD_HEADER | 3820 | typedef struct _ATOM_COMMON_RECORD_HEADER |
3821 | { | 3821 | { |
3822 | UCHAR ucRecordType; //An emun to indicate the record type | 3822 | UCHAR ucRecordType; //An emun to indicate the record type |
@@ -4365,14 +4365,14 @@ ucUMAChannelNumber: System memory channel numbers. | |||
4365 | ulCSR_M3_ARB_CNTL_DEFAULT[10]: Arrays with values for CSR M3 arbiter for default | 4365 | ulCSR_M3_ARB_CNTL_DEFAULT[10]: Arrays with values for CSR M3 arbiter for default |
4366 | ulCSR_M3_ARB_CNTL_UVD[10]: Arrays with values for CSR M3 arbiter for UVD playback. | 4366 | ulCSR_M3_ARB_CNTL_UVD[10]: Arrays with values for CSR M3 arbiter for UVD playback. |
4367 | ulCSR_M3_ARB_CNTL_FS3D[10]: Arrays with values for CSR M3 arbiter for Full Screen 3D applications. | 4367 | ulCSR_M3_ARB_CNTL_FS3D[10]: Arrays with values for CSR M3 arbiter for Full Screen 3D applications. |
4368 | sAvail_SCLK[5]: Arrays to provide availabe list of SLCK and corresponding voltage, order from low to high | 4368 | sAvail_SCLK[5]: Arrays to provide available list of SLCK and corresponding voltage, order from low to high |
4369 | ulGMCRestoreResetTime: GMC power restore and GMC reset time to calculate data reconnection latency. Unit in ns. | 4369 | ulGMCRestoreResetTime: GMC power restore and GMC reset time to calculate data reconnection latency. Unit in ns. |
4370 | ulMinimumNClk: Minimum NCLK speed among all NB-Pstates to calcualte data reconnection latency. Unit in 10kHz. | 4370 | ulMinimumNClk: Minimum NCLK speed among all NB-Pstates to calcualte data reconnection latency. Unit in 10kHz. |
4371 | ulIdleNClk: NCLK speed while memory runs in self-refresh state. Unit in 10kHz. | 4371 | ulIdleNClk: NCLK speed while memory runs in self-refresh state. Unit in 10kHz. |
4372 | ulDDR_DLL_PowerUpTime: DDR PHY DLL power up time. Unit in ns. | 4372 | ulDDR_DLL_PowerUpTime: DDR PHY DLL power up time. Unit in ns. |
4373 | ulDDR_PLL_PowerUpTime: DDR PHY PLL power up time. Unit in ns. | 4373 | ulDDR_PLL_PowerUpTime: DDR PHY PLL power up time. Unit in ns. |
4374 | usPCIEClkSSPercentage: PCIE Clock Spred Spectrum Percentage in unit 0.01%; 100 mean 1%. | 4374 | usPCIEClkSSPercentage: PCIE Clock Spread Spectrum Percentage in unit 0.01%; 100 mean 1%. |
4375 | usPCIEClkSSType: PCIE Clock Spred Spectrum Type. 0 for Down spread(default); 1 for Center spread. | 4375 | usPCIEClkSSType: PCIE Clock Spread Spectrum Type. 0 for Down spread(default); 1 for Center spread. |
4376 | usLvdsSSPercentage: LVDS panel ( not include eDP ) Spread Spectrum Percentage in unit of 0.01%, =0, use VBIOS default setting. | 4376 | usLvdsSSPercentage: LVDS panel ( not include eDP ) Spread Spectrum Percentage in unit of 0.01%, =0, use VBIOS default setting. |
4377 | usLvdsSSpreadRateIn10Hz: LVDS panel ( not include eDP ) Spread Spectrum frequency in unit of 10Hz, =0, use VBIOS default setting. | 4377 | usLvdsSSpreadRateIn10Hz: LVDS panel ( not include eDP ) Spread Spectrum frequency in unit of 10Hz, =0, use VBIOS default setting. |
4378 | usHDMISSPercentage: HDMI Spread Spectrum Percentage in unit 0.01%; 100 mean 1%, =0, use VBIOS default setting. | 4378 | usHDMISSPercentage: HDMI Spread Spectrum Percentage in unit 0.01%; 100 mean 1%, =0, use VBIOS default setting. |
@@ -4555,7 +4555,7 @@ typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 | |||
4555 | #define ATOM_S0_SYSTEM_POWER_STATE_VALUE_LITEAC 3 | 4555 | #define ATOM_S0_SYSTEM_POWER_STATE_VALUE_LITEAC 3 |
4556 | #define ATOM_S0_SYSTEM_POWER_STATE_VALUE_LIT2AC 4 | 4556 | #define ATOM_S0_SYSTEM_POWER_STATE_VALUE_LIT2AC 4 |
4557 | 4557 | ||
4558 | //Byte aligned defintion for BIOS usage | 4558 | //Byte aligned definition for BIOS usage |
4559 | #define ATOM_S0_CRT1_MONOb0 0x01 | 4559 | #define ATOM_S0_CRT1_MONOb0 0x01 |
4560 | #define ATOM_S0_CRT1_COLORb0 0x02 | 4560 | #define ATOM_S0_CRT1_COLORb0 0x02 |
4561 | #define ATOM_S0_CRT1_MASKb0 (ATOM_S0_CRT1_MONOb0+ATOM_S0_CRT1_COLORb0) | 4561 | #define ATOM_S0_CRT1_MASKb0 (ATOM_S0_CRT1_MONOb0+ATOM_S0_CRT1_COLORb0) |
@@ -4621,7 +4621,7 @@ typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 | |||
4621 | #define ATOM_S2_DISPLAY_ROTATION_ANGLE_MASK 0xC0000000L | 4621 | #define ATOM_S2_DISPLAY_ROTATION_ANGLE_MASK 0xC0000000L |
4622 | 4622 | ||
4623 | 4623 | ||
4624 | //Byte aligned defintion for BIOS usage | 4624 | //Byte aligned definition for BIOS usage |
4625 | #define ATOM_S2_TV1_STANDARD_MASKb0 0x0F | 4625 | #define ATOM_S2_TV1_STANDARD_MASKb0 0x0F |
4626 | #define ATOM_S2_CURRENT_BL_LEVEL_MASKb1 0xFF | 4626 | #define ATOM_S2_CURRENT_BL_LEVEL_MASKb1 0xFF |
4627 | #define ATOM_S2_DEVICE_DPMS_STATEb2 0x01 | 4627 | #define ATOM_S2_DEVICE_DPMS_STATEb2 0x01 |
@@ -4671,7 +4671,7 @@ typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 | |||
4671 | #define ATOM_S3_ALLOW_FAST_PWR_SWITCH 0x40000000L | 4671 | #define ATOM_S3_ALLOW_FAST_PWR_SWITCH 0x40000000L |
4672 | #define ATOM_S3_RQST_GPU_USE_MIN_PWR 0x80000000L | 4672 | #define ATOM_S3_RQST_GPU_USE_MIN_PWR 0x80000000L |
4673 | 4673 | ||
4674 | //Byte aligned defintion for BIOS usage | 4674 | //Byte aligned definition for BIOS usage |
4675 | #define ATOM_S3_CRT1_ACTIVEb0 0x01 | 4675 | #define ATOM_S3_CRT1_ACTIVEb0 0x01 |
4676 | #define ATOM_S3_LCD1_ACTIVEb0 0x02 | 4676 | #define ATOM_S3_LCD1_ACTIVEb0 0x02 |
4677 | #define ATOM_S3_TV1_ACTIVEb0 0x04 | 4677 | #define ATOM_S3_TV1_ACTIVEb0 0x04 |
@@ -4707,7 +4707,7 @@ typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 | |||
4707 | #define ATOM_S4_LCD1_REFRESH_MASK 0x0000FF00L | 4707 | #define ATOM_S4_LCD1_REFRESH_MASK 0x0000FF00L |
4708 | #define ATOM_S4_LCD1_REFRESH_SHIFT 8 | 4708 | #define ATOM_S4_LCD1_REFRESH_SHIFT 8 |
4709 | 4709 | ||
4710 | //Byte aligned defintion for BIOS usage | 4710 | //Byte aligned definition for BIOS usage |
4711 | #define ATOM_S4_LCD1_PANEL_ID_MASKb0 0x0FF | 4711 | #define ATOM_S4_LCD1_PANEL_ID_MASKb0 0x0FF |
4712 | #define ATOM_S4_LCD1_REFRESH_MASKb1 ATOM_S4_LCD1_PANEL_ID_MASKb0 | 4712 | #define ATOM_S4_LCD1_REFRESH_MASKb1 ATOM_S4_LCD1_PANEL_ID_MASKb0 |
4713 | #define ATOM_S4_VRAM_INFO_MASKb2 ATOM_S4_LCD1_PANEL_ID_MASKb0 | 4713 | #define ATOM_S4_VRAM_INFO_MASKb2 ATOM_S4_LCD1_PANEL_ID_MASKb0 |
@@ -4786,7 +4786,7 @@ typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 | |||
4786 | #define ATOM_S6_VRI_BRIGHTNESS_CHANGE 0x40000000L | 4786 | #define ATOM_S6_VRI_BRIGHTNESS_CHANGE 0x40000000L |
4787 | #define ATOM_S6_CONFIG_DISPLAY_CHANGE_MASK 0x80000000L | 4787 | #define ATOM_S6_CONFIG_DISPLAY_CHANGE_MASK 0x80000000L |
4788 | 4788 | ||
4789 | //Byte aligned defintion for BIOS usage | 4789 | //Byte aligned definition for BIOS usage |
4790 | #define ATOM_S6_DEVICE_CHANGEb0 0x01 | 4790 | #define ATOM_S6_DEVICE_CHANGEb0 0x01 |
4791 | #define ATOM_S6_SCALER_CHANGEb0 0x02 | 4791 | #define ATOM_S6_SCALER_CHANGEb0 0x02 |
4792 | #define ATOM_S6_LID_CHANGEb0 0x04 | 4792 | #define ATOM_S6_LID_CHANGEb0 0x04 |
@@ -5027,7 +5027,7 @@ typedef struct _ENABLE_GRAPH_SURFACE_PS_ALLOCATION | |||
5027 | 5027 | ||
5028 | typedef struct _MEMORY_CLEAN_UP_PARAMETERS | 5028 | typedef struct _MEMORY_CLEAN_UP_PARAMETERS |
5029 | { | 5029 | { |
5030 | USHORT usMemoryStart; //in 8Kb boundry, offset from memory base address | 5030 | USHORT usMemoryStart; //in 8Kb boundary, offset from memory base address |
5031 | USHORT usMemorySize; //8Kb blocks aligned | 5031 | USHORT usMemorySize; //8Kb blocks aligned |
5032 | }MEMORY_CLEAN_UP_PARAMETERS; | 5032 | }MEMORY_CLEAN_UP_PARAMETERS; |
5033 | #define MEMORY_CLEAN_UP_PS_ALLOCATION MEMORY_CLEAN_UP_PARAMETERS | 5033 | #define MEMORY_CLEAN_UP_PS_ALLOCATION MEMORY_CLEAN_UP_PARAMETERS |
@@ -6855,7 +6855,7 @@ typedef struct _ATOM_PPLIB_Clock_Voltage_Limit_Table | |||
6855 | /**************************************************************************/ | 6855 | /**************************************************************************/ |
6856 | 6856 | ||
6857 | 6857 | ||
6858 | // Following definitions are for compatiblity issue in different SW components. | 6858 | // Following definitions are for compatibility issue in different SW components. |
6859 | #define ATOM_MASTER_DATA_TABLE_REVISION 0x01 | 6859 | #define ATOM_MASTER_DATA_TABLE_REVISION 0x01 |
6860 | #define Object_Info Object_Header | 6860 | #define Object_Info Object_Header |
6861 | #define AdjustARB_SEQ MC_InitParameter | 6861 | #define AdjustARB_SEQ MC_InitParameter |
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index 10e41af6b026..9d516a8c4dfa 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | |||
@@ -531,6 +531,12 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc, | |||
531 | pll->flags |= RADEON_PLL_PREFER_HIGH_FB_DIV; | 531 | pll->flags |= RADEON_PLL_PREFER_HIGH_FB_DIV; |
532 | else | 532 | else |
533 | pll->flags |= RADEON_PLL_PREFER_LOW_REF_DIV; | 533 | pll->flags |= RADEON_PLL_PREFER_LOW_REF_DIV; |
534 | |||
535 | if ((rdev->family == CHIP_R600) || | ||
536 | (rdev->family == CHIP_RV610) || | ||
537 | (rdev->family == CHIP_RV630) || | ||
538 | (rdev->family == CHIP_RV670)) | ||
539 | pll->flags |= RADEON_PLL_PREFER_MINM_OVER_MAXP; | ||
534 | } else { | 540 | } else { |
535 | pll->flags |= RADEON_PLL_LEGACY; | 541 | pll->flags |= RADEON_PLL_LEGACY; |
536 | 542 | ||
@@ -1009,6 +1015,7 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc, | |||
1009 | uint64_t fb_location; | 1015 | uint64_t fb_location; |
1010 | uint32_t fb_format, fb_pitch_pixels, tiling_flags; | 1016 | uint32_t fb_format, fb_pitch_pixels, tiling_flags; |
1011 | u32 fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_NONE); | 1017 | u32 fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_NONE); |
1018 | u32 tmp; | ||
1012 | int r; | 1019 | int r; |
1013 | 1020 | ||
1014 | /* no fb bound */ | 1021 | /* no fb bound */ |
@@ -1137,6 +1144,15 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc, | |||
1137 | WREG32(EVERGREEN_VIEWPORT_SIZE + radeon_crtc->crtc_offset, | 1144 | WREG32(EVERGREEN_VIEWPORT_SIZE + radeon_crtc->crtc_offset, |
1138 | (crtc->mode.hdisplay << 16) | crtc->mode.vdisplay); | 1145 | (crtc->mode.hdisplay << 16) | crtc->mode.vdisplay); |
1139 | 1146 | ||
1147 | /* pageflip setup */ | ||
1148 | /* make sure flip is at vb rather than hb */ | ||
1149 | tmp = RREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset); | ||
1150 | tmp &= ~EVERGREEN_GRPH_SURFACE_UPDATE_H_RETRACE_EN; | ||
1151 | WREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, tmp); | ||
1152 | |||
1153 | /* set pageflip to happen anywhere in vblank interval */ | ||
1154 | WREG32(EVERGREEN_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 0); | ||
1155 | |||
1140 | if (!atomic && fb && fb != crtc->fb) { | 1156 | if (!atomic && fb && fb != crtc->fb) { |
1141 | radeon_fb = to_radeon_framebuffer(fb); | 1157 | radeon_fb = to_radeon_framebuffer(fb); |
1142 | rbo = gem_to_radeon_bo(radeon_fb->obj); | 1158 | rbo = gem_to_radeon_bo(radeon_fb->obj); |
@@ -1167,6 +1183,7 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc, | |||
1167 | uint64_t fb_location; | 1183 | uint64_t fb_location; |
1168 | uint32_t fb_format, fb_pitch_pixels, tiling_flags; | 1184 | uint32_t fb_format, fb_pitch_pixels, tiling_flags; |
1169 | u32 fb_swap = R600_D1GRPH_SWAP_ENDIAN_NONE; | 1185 | u32 fb_swap = R600_D1GRPH_SWAP_ENDIAN_NONE; |
1186 | u32 tmp; | ||
1170 | int r; | 1187 | int r; |
1171 | 1188 | ||
1172 | /* no fb bound */ | 1189 | /* no fb bound */ |
@@ -1294,6 +1311,15 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc, | |||
1294 | WREG32(AVIVO_D1MODE_VIEWPORT_SIZE + radeon_crtc->crtc_offset, | 1311 | WREG32(AVIVO_D1MODE_VIEWPORT_SIZE + radeon_crtc->crtc_offset, |
1295 | (crtc->mode.hdisplay << 16) | crtc->mode.vdisplay); | 1312 | (crtc->mode.hdisplay << 16) | crtc->mode.vdisplay); |
1296 | 1313 | ||
1314 | /* pageflip setup */ | ||
1315 | /* make sure flip is at vb rather than hb */ | ||
1316 | tmp = RREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset); | ||
1317 | tmp &= ~AVIVO_D1GRPH_SURFACE_UPDATE_H_RETRACE_EN; | ||
1318 | WREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, tmp); | ||
1319 | |||
1320 | /* set pageflip to happen anywhere in vblank interval */ | ||
1321 | WREG32(AVIVO_D1MODE_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 0); | ||
1322 | |||
1297 | if (!atomic && fb && fb != crtc->fb) { | 1323 | if (!atomic && fb && fb != crtc->fb) { |
1298 | radeon_fb = to_radeon_framebuffer(fb); | 1324 | radeon_fb = to_radeon_framebuffer(fb); |
1299 | rbo = gem_to_radeon_bo(radeon_fb->obj); | 1325 | rbo = gem_to_radeon_bo(radeon_fb->obj); |
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 941080a77940..3453910ee0f3 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
@@ -43,17 +43,6 @@ static void evergreen_pcie_gen2_enable(struct radeon_device *rdev); | |||
43 | 43 | ||
44 | void evergreen_pre_page_flip(struct radeon_device *rdev, int crtc) | 44 | void evergreen_pre_page_flip(struct radeon_device *rdev, int crtc) |
45 | { | 45 | { |
46 | struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc]; | ||
47 | u32 tmp; | ||
48 | |||
49 | /* make sure flip is at vb rather than hb */ | ||
50 | tmp = RREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset); | ||
51 | tmp &= ~EVERGREEN_GRPH_SURFACE_UPDATE_H_RETRACE_EN; | ||
52 | WREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, tmp); | ||
53 | |||
54 | /* set pageflip to happen anywhere in vblank interval */ | ||
55 | WREG32(EVERGREEN_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 0); | ||
56 | |||
57 | /* enable the pflip int */ | 46 | /* enable the pflip int */ |
58 | radeon_irq_kms_pflip_irq_get(rdev, crtc); | 47 | radeon_irq_kms_pflip_irq_get(rdev, crtc); |
59 | } | 48 | } |
@@ -131,11 +120,16 @@ void evergreen_pm_misc(struct radeon_device *rdev) | |||
131 | struct radeon_power_state *ps = &rdev->pm.power_state[req_ps_idx]; | 120 | struct radeon_power_state *ps = &rdev->pm.power_state[req_ps_idx]; |
132 | struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage; | 121 | struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage; |
133 | 122 | ||
134 | if ((voltage->type == VOLTAGE_SW) && voltage->voltage) { | 123 | if (voltage->type == VOLTAGE_SW) { |
135 | if (voltage->voltage != rdev->pm.current_vddc) { | 124 | if (voltage->voltage && (voltage->voltage != rdev->pm.current_vddc)) { |
136 | radeon_atom_set_voltage(rdev, voltage->voltage); | 125 | radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC); |
137 | rdev->pm.current_vddc = voltage->voltage; | 126 | rdev->pm.current_vddc = voltage->voltage; |
138 | DRM_DEBUG("Setting: v: %d\n", voltage->voltage); | 127 | DRM_DEBUG("Setting: vddc: %d\n", voltage->voltage); |
128 | } | ||
129 | if (voltage->vddci && (voltage->vddci != rdev->pm.current_vddci)) { | ||
130 | radeon_atom_set_voltage(rdev, voltage->vddci, SET_VOLTAGE_TYPE_ASIC_VDDCI); | ||
131 | rdev->pm.current_vddci = voltage->vddci; | ||
132 | DRM_DEBUG("Setting: vddci: %d\n", voltage->vddci); | ||
139 | } | 133 | } |
140 | } | 134 | } |
141 | } | 135 | } |
@@ -3047,9 +3041,6 @@ int evergreen_init(struct radeon_device *rdev) | |||
3047 | { | 3041 | { |
3048 | int r; | 3042 | int r; |
3049 | 3043 | ||
3050 | r = radeon_dummy_page_init(rdev); | ||
3051 | if (r) | ||
3052 | return r; | ||
3053 | /* This don't do much */ | 3044 | /* This don't do much */ |
3054 | r = radeon_gem_init(rdev); | 3045 | r = radeon_gem_init(rdev); |
3055 | if (r) | 3046 | if (r) |
@@ -3161,7 +3152,6 @@ void evergreen_fini(struct radeon_device *rdev) | |||
3161 | radeon_atombios_fini(rdev); | 3152 | radeon_atombios_fini(rdev); |
3162 | kfree(rdev->bios); | 3153 | kfree(rdev->bios); |
3163 | rdev->bios = NULL; | 3154 | rdev->bios = NULL; |
3164 | radeon_dummy_page_fini(rdev); | ||
3165 | } | 3155 | } |
3166 | 3156 | ||
3167 | static void evergreen_pcie_gen2_enable(struct radeon_device *rdev) | 3157 | static void evergreen_pcie_gen2_enable(struct radeon_device *rdev) |
diff --git a/drivers/gpu/drm/radeon/evergreen_cs.c b/drivers/gpu/drm/radeon/evergreen_cs.c index edde90b37554..23d36417158d 100644 --- a/drivers/gpu/drm/radeon/evergreen_cs.c +++ b/drivers/gpu/drm/radeon/evergreen_cs.c | |||
@@ -442,7 +442,7 @@ static inline int evergreen_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u3 | |||
442 | } | 442 | } |
443 | ib = p->ib->ptr; | 443 | ib = p->ib->ptr; |
444 | switch (reg) { | 444 | switch (reg) { |
445 | /* force following reg to 0 in an attemp to disable out buffer | 445 | /* force following reg to 0 in an attempt to disable out buffer |
446 | * which will need us to better understand how it works to perform | 446 | * which will need us to better understand how it works to perform |
447 | * security check on it (Jerome) | 447 | * security check on it (Jerome) |
448 | */ | 448 | */ |
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c index 8713731fa014..55a7f190027e 100644 --- a/drivers/gpu/drm/radeon/r300.c +++ b/drivers/gpu/drm/radeon/r300.c | |||
@@ -437,7 +437,7 @@ int r300_asic_reset(struct radeon_device *rdev) | |||
437 | status = RREG32(R_000E40_RBBM_STATUS); | 437 | status = RREG32(R_000E40_RBBM_STATUS); |
438 | dev_info(rdev->dev, "(%s:%d) RBBM_STATUS=0x%08X\n", __func__, __LINE__, status); | 438 | dev_info(rdev->dev, "(%s:%d) RBBM_STATUS=0x%08X\n", __func__, __LINE__, status); |
439 | /* resetting the CP seems to be problematic sometimes it end up | 439 | /* resetting the CP seems to be problematic sometimes it end up |
440 | * hard locking the computer, but it's necessary for successfull | 440 | * hard locking the computer, but it's necessary for successful |
441 | * reset more test & playing is needed on R3XX/R4XX to find a | 441 | * reset more test & playing is needed on R3XX/R4XX to find a |
442 | * reliable (if any solution) | 442 | * reliable (if any solution) |
443 | */ | 443 | */ |
diff --git a/drivers/gpu/drm/radeon/r300_reg.h b/drivers/gpu/drm/radeon/r300_reg.h index f0bce399c9f3..00c0d2ba22d3 100644 --- a/drivers/gpu/drm/radeon/r300_reg.h +++ b/drivers/gpu/drm/radeon/r300_reg.h | |||
@@ -608,7 +608,7 @@ | |||
608 | * My guess is that there are two bits for each zbias primitive | 608 | * My guess is that there are two bits for each zbias primitive |
609 | * (FILL, LINE, POINT). | 609 | * (FILL, LINE, POINT). |
610 | * One to enable depth test and one for depth write. | 610 | * One to enable depth test and one for depth write. |
611 | * Yet this doesnt explain why depth writes work ... | 611 | * Yet this doesn't explain why depth writes work ... |
612 | */ | 612 | */ |
613 | #define R300_RE_OCCLUSION_CNTL 0x42B4 | 613 | #define R300_RE_OCCLUSION_CNTL 0x42B4 |
614 | # define R300_OCCLUSION_ON (1<<1) | 614 | # define R300_OCCLUSION_ON (1<<1) |
@@ -817,7 +817,7 @@ | |||
817 | # define R300_TX_MIN_FILTER_LINEAR_MIP_NEAREST (6 << 11) | 817 | # define R300_TX_MIN_FILTER_LINEAR_MIP_NEAREST (6 << 11) |
818 | # define R300_TX_MIN_FILTER_LINEAR_MIP_LINEAR (10 << 11) | 818 | # define R300_TX_MIN_FILTER_LINEAR_MIP_LINEAR (10 << 11) |
819 | 819 | ||
820 | /* NOTE: NEAREST doesnt seem to exist. | 820 | /* NOTE: NEAREST doesn't seem to exist. |
821 | * Im not seting MAG_FILTER_MASK and (3 << 11) on for all | 821 | * Im not seting MAG_FILTER_MASK and (3 << 11) on for all |
822 | * anisotropy modes because that would void selected mag filter | 822 | * anisotropy modes because that would void selected mag filter |
823 | */ | 823 | */ |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index be271c42de4d..15d58292677a 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
@@ -587,7 +587,7 @@ void r600_pm_misc(struct radeon_device *rdev) | |||
587 | 587 | ||
588 | if ((voltage->type == VOLTAGE_SW) && voltage->voltage) { | 588 | if ((voltage->type == VOLTAGE_SW) && voltage->voltage) { |
589 | if (voltage->voltage != rdev->pm.current_vddc) { | 589 | if (voltage->voltage != rdev->pm.current_vddc) { |
590 | radeon_atom_set_voltage(rdev, voltage->voltage); | 590 | radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC); |
591 | rdev->pm.current_vddc = voltage->voltage; | 591 | rdev->pm.current_vddc = voltage->voltage; |
592 | DRM_DEBUG_DRIVER("Setting: v: %d\n", voltage->voltage); | 592 | DRM_DEBUG_DRIVER("Setting: v: %d\n", voltage->voltage); |
593 | } | 593 | } |
@@ -2509,9 +2509,6 @@ int r600_init(struct radeon_device *rdev) | |||
2509 | { | 2509 | { |
2510 | int r; | 2510 | int r; |
2511 | 2511 | ||
2512 | r = radeon_dummy_page_init(rdev); | ||
2513 | if (r) | ||
2514 | return r; | ||
2515 | if (r600_debugfs_mc_info_init(rdev)) { | 2512 | if (r600_debugfs_mc_info_init(rdev)) { |
2516 | DRM_ERROR("Failed to register debugfs file for mc !\n"); | 2513 | DRM_ERROR("Failed to register debugfs file for mc !\n"); |
2517 | } | 2514 | } |
@@ -2625,7 +2622,6 @@ void r600_fini(struct radeon_device *rdev) | |||
2625 | radeon_atombios_fini(rdev); | 2622 | radeon_atombios_fini(rdev); |
2626 | kfree(rdev->bios); | 2623 | kfree(rdev->bios); |
2627 | rdev->bios = NULL; | 2624 | rdev->bios = NULL; |
2628 | radeon_dummy_page_fini(rdev); | ||
2629 | } | 2625 | } |
2630 | 2626 | ||
2631 | 2627 | ||
diff --git a/drivers/gpu/drm/radeon/r600_cs.c b/drivers/gpu/drm/radeon/r600_cs.c index 3324620b2db6..fd18be9871ab 100644 --- a/drivers/gpu/drm/radeon/r600_cs.c +++ b/drivers/gpu/drm/radeon/r600_cs.c | |||
@@ -921,7 +921,7 @@ static inline int r600_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx | |||
921 | return 0; | 921 | return 0; |
922 | ib = p->ib->ptr; | 922 | ib = p->ib->ptr; |
923 | switch (reg) { | 923 | switch (reg) { |
924 | /* force following reg to 0 in an attemp to disable out buffer | 924 | /* force following reg to 0 in an attempt to disable out buffer |
925 | * which will need us to better understand how it works to perform | 925 | * which will need us to better understand how it works to perform |
926 | * security check on it (Jerome) | 926 | * security check on it (Jerome) |
927 | */ | 927 | */ |
diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c index 50db6d62eec2..f5ac7e788d81 100644 --- a/drivers/gpu/drm/radeon/r600_hdmi.c +++ b/drivers/gpu/drm/radeon/r600_hdmi.c | |||
@@ -334,7 +334,7 @@ void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mod | |||
334 | r600_hdmi_videoinfoframe(encoder, RGB, 0, 0, 0, 0, | 334 | r600_hdmi_videoinfoframe(encoder, RGB, 0, 0, 0, 0, |
335 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); | 335 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); |
336 | 336 | ||
337 | /* it's unknown what these bits do excatly, but it's indeed quite usefull for debugging */ | 337 | /* it's unknown what these bits do excatly, but it's indeed quite useful for debugging */ |
338 | WREG32(offset+R600_HDMI_AUDIO_DEBUG_0, 0x00FFFFFF); | 338 | WREG32(offset+R600_HDMI_AUDIO_DEBUG_0, 0x00FFFFFF); |
339 | WREG32(offset+R600_HDMI_AUDIO_DEBUG_1, 0x007FFFFF); | 339 | WREG32(offset+R600_HDMI_AUDIO_DEBUG_1, 0x007FFFFF); |
340 | WREG32(offset+R600_HDMI_AUDIO_DEBUG_2, 0x00000001); | 340 | WREG32(offset+R600_HDMI_AUDIO_DEBUG_2, 0x00000001); |
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index cfe3af1a7935..ba643b576054 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
@@ -177,7 +177,7 @@ void radeon_pm_suspend(struct radeon_device *rdev); | |||
177 | void radeon_pm_resume(struct radeon_device *rdev); | 177 | void radeon_pm_resume(struct radeon_device *rdev); |
178 | void radeon_combios_get_power_modes(struct radeon_device *rdev); | 178 | void radeon_combios_get_power_modes(struct radeon_device *rdev); |
179 | void radeon_atombios_get_power_modes(struct radeon_device *rdev); | 179 | void radeon_atombios_get_power_modes(struct radeon_device *rdev); |
180 | void radeon_atom_set_voltage(struct radeon_device *rdev, u16 level); | 180 | void radeon_atom_set_voltage(struct radeon_device *rdev, u16 voltage_level, u8 voltage_type); |
181 | void rs690_pm_info(struct radeon_device *rdev); | 181 | void rs690_pm_info(struct radeon_device *rdev); |
182 | extern int rv6xx_get_temp(struct radeon_device *rdev); | 182 | extern int rv6xx_get_temp(struct radeon_device *rdev); |
183 | extern int rv770_get_temp(struct radeon_device *rdev); | 183 | extern int rv770_get_temp(struct radeon_device *rdev); |
@@ -679,11 +679,11 @@ struct radeon_wb { | |||
679 | * @sideport_bandwidth: sideport bandwidth the gpu has (MByte/s) (IGP) | 679 | * @sideport_bandwidth: sideport bandwidth the gpu has (MByte/s) (IGP) |
680 | * @ht_bandwidth: ht bandwidth the gpu has (MByte/s) (IGP) | 680 | * @ht_bandwidth: ht bandwidth the gpu has (MByte/s) (IGP) |
681 | * @core_bandwidth: core GPU bandwidth the gpu has (MByte/s) (IGP) | 681 | * @core_bandwidth: core GPU bandwidth the gpu has (MByte/s) (IGP) |
682 | * @sclk: GPU clock Mhz (core bandwith depends of this clock) | 682 | * @sclk: GPU clock Mhz (core bandwidth depends of this clock) |
683 | * @needed_bandwidth: current bandwidth needs | 683 | * @needed_bandwidth: current bandwidth needs |
684 | * | 684 | * |
685 | * It keeps track of various data needed to take powermanagement decision. | 685 | * It keeps track of various data needed to take powermanagement decision. |
686 | * Bandwith need is used to determine minimun clock of the GPU and memory. | 686 | * Bandwidth need is used to determine minimun clock of the GPU and memory. |
687 | * Equation between gpu/memory clock and available bandwidth is hw dependent | 687 | * Equation between gpu/memory clock and available bandwidth is hw dependent |
688 | * (type of memory, bus size, efficiency, ...) | 688 | * (type of memory, bus size, efficiency, ...) |
689 | */ | 689 | */ |
@@ -767,7 +767,9 @@ struct radeon_voltage { | |||
767 | u8 vddci_id; /* index into vddci voltage table */ | 767 | u8 vddci_id; /* index into vddci voltage table */ |
768 | bool vddci_enabled; | 768 | bool vddci_enabled; |
769 | /* r6xx+ sw */ | 769 | /* r6xx+ sw */ |
770 | u32 voltage; | 770 | u16 voltage; |
771 | /* evergreen+ vddci */ | ||
772 | u16 vddci; | ||
771 | }; | 773 | }; |
772 | 774 | ||
773 | /* clock mode flags */ | 775 | /* clock mode flags */ |
@@ -835,10 +837,12 @@ struct radeon_pm { | |||
835 | int default_power_state_index; | 837 | int default_power_state_index; |
836 | u32 current_sclk; | 838 | u32 current_sclk; |
837 | u32 current_mclk; | 839 | u32 current_mclk; |
838 | u32 current_vddc; | 840 | u16 current_vddc; |
841 | u16 current_vddci; | ||
839 | u32 default_sclk; | 842 | u32 default_sclk; |
840 | u32 default_mclk; | 843 | u32 default_mclk; |
841 | u32 default_vddc; | 844 | u16 default_vddc; |
845 | u16 default_vddci; | ||
842 | struct radeon_i2c_chan *i2c_bus; | 846 | struct radeon_i2c_chan *i2c_bus; |
843 | /* selected pm method */ | 847 | /* selected pm method */ |
844 | enum radeon_pm_method pm_method; | 848 | enum radeon_pm_method pm_method; |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c index eb888ee5f674..ca576191d058 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.c +++ b/drivers/gpu/drm/radeon/radeon_asic.c | |||
@@ -94,7 +94,7 @@ static void radeon_register_accessor_init(struct radeon_device *rdev) | |||
94 | rdev->mc_rreg = &rs600_mc_rreg; | 94 | rdev->mc_rreg = &rs600_mc_rreg; |
95 | rdev->mc_wreg = &rs600_mc_wreg; | 95 | rdev->mc_wreg = &rs600_mc_wreg; |
96 | } | 96 | } |
97 | if ((rdev->family >= CHIP_R600) && (rdev->family <= CHIP_HEMLOCK)) { | 97 | if (rdev->family >= CHIP_R600) { |
98 | rdev->pciep_rreg = &r600_pciep_rreg; | 98 | rdev->pciep_rreg = &r600_pciep_rreg; |
99 | rdev->pciep_wreg = &r600_pciep_wreg; | 99 | rdev->pciep_wreg = &r600_pciep_wreg; |
100 | } | 100 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c index 02d5c415f499..f5d12fb103fa 100644 --- a/drivers/gpu/drm/radeon/radeon_atombios.c +++ b/drivers/gpu/drm/radeon/radeon_atombios.c | |||
@@ -675,7 +675,8 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev) | |||
675 | ATOM_ENCODER_CAP_RECORD *cap_record; | 675 | ATOM_ENCODER_CAP_RECORD *cap_record; |
676 | u16 caps = 0; | 676 | u16 caps = 0; |
677 | 677 | ||
678 | while (record->ucRecordType > 0 && | 678 | while (record->ucRecordSize > 0 && |
679 | record->ucRecordType > 0 && | ||
679 | record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) { | 680 | record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) { |
680 | switch (record->ucRecordType) { | 681 | switch (record->ucRecordType) { |
681 | case ATOM_ENCODER_CAP_RECORD_TYPE: | 682 | case ATOM_ENCODER_CAP_RECORD_TYPE: |
@@ -720,7 +721,8 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev) | |||
720 | break; | 721 | break; |
721 | } | 722 | } |
722 | 723 | ||
723 | while (record->ucRecordType > 0 && | 724 | while (record->ucRecordSize > 0 && |
725 | record->ucRecordType > 0 && | ||
724 | record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) { | 726 | record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) { |
725 | switch (record->ucRecordType) { | 727 | switch (record->ucRecordType) { |
726 | case ATOM_I2C_RECORD_TYPE: | 728 | case ATOM_I2C_RECORD_TYPE: |
@@ -782,10 +784,9 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev) | |||
782 | ATOM_HPD_INT_RECORD *hpd_record; | 784 | ATOM_HPD_INT_RECORD *hpd_record; |
783 | ATOM_I2C_ID_CONFIG_ACCESS *i2c_config; | 785 | ATOM_I2C_ID_CONFIG_ACCESS *i2c_config; |
784 | 786 | ||
785 | while (record->ucRecordType > 0 | 787 | while (record->ucRecordSize > 0 && |
786 | && record-> | 788 | record->ucRecordType > 0 && |
787 | ucRecordType <= | 789 | record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) { |
788 | ATOM_MAX_OBJECT_RECORD_NUMBER) { | ||
789 | switch (record->ucRecordType) { | 790 | switch (record->ucRecordType) { |
790 | case ATOM_I2C_RECORD_TYPE: | 791 | case ATOM_I2C_RECORD_TYPE: |
791 | i2c_record = | 792 | i2c_record = |
@@ -2175,24 +2176,27 @@ static void radeon_atombios_add_pplib_thermal_controller(struct radeon_device *r | |||
2175 | } | 2176 | } |
2176 | } | 2177 | } |
2177 | 2178 | ||
2178 | static u16 radeon_atombios_get_default_vddc(struct radeon_device *rdev) | 2179 | static void radeon_atombios_get_default_voltages(struct radeon_device *rdev, |
2180 | u16 *vddc, u16 *vddci) | ||
2179 | { | 2181 | { |
2180 | struct radeon_mode_info *mode_info = &rdev->mode_info; | 2182 | struct radeon_mode_info *mode_info = &rdev->mode_info; |
2181 | int index = GetIndexIntoMasterTable(DATA, FirmwareInfo); | 2183 | int index = GetIndexIntoMasterTable(DATA, FirmwareInfo); |
2182 | u8 frev, crev; | 2184 | u8 frev, crev; |
2183 | u16 data_offset; | 2185 | u16 data_offset; |
2184 | union firmware_info *firmware_info; | 2186 | union firmware_info *firmware_info; |
2185 | u16 vddc = 0; | 2187 | |
2188 | *vddc = 0; | ||
2189 | *vddci = 0; | ||
2186 | 2190 | ||
2187 | if (atom_parse_data_header(mode_info->atom_context, index, NULL, | 2191 | if (atom_parse_data_header(mode_info->atom_context, index, NULL, |
2188 | &frev, &crev, &data_offset)) { | 2192 | &frev, &crev, &data_offset)) { |
2189 | firmware_info = | 2193 | firmware_info = |
2190 | (union firmware_info *)(mode_info->atom_context->bios + | 2194 | (union firmware_info *)(mode_info->atom_context->bios + |
2191 | data_offset); | 2195 | data_offset); |
2192 | vddc = le16_to_cpu(firmware_info->info_14.usBootUpVDDCVoltage); | 2196 | *vddc = le16_to_cpu(firmware_info->info_14.usBootUpVDDCVoltage); |
2197 | if ((frev == 2) && (crev >= 2)) | ||
2198 | *vddci = le16_to_cpu(firmware_info->info_22.usBootUpVDDCIVoltage); | ||
2193 | } | 2199 | } |
2194 | |||
2195 | return vddc; | ||
2196 | } | 2200 | } |
2197 | 2201 | ||
2198 | static void radeon_atombios_parse_pplib_non_clock_info(struct radeon_device *rdev, | 2202 | static void radeon_atombios_parse_pplib_non_clock_info(struct radeon_device *rdev, |
@@ -2202,7 +2206,9 @@ static void radeon_atombios_parse_pplib_non_clock_info(struct radeon_device *rde | |||
2202 | int j; | 2206 | int j; |
2203 | u32 misc = le32_to_cpu(non_clock_info->ulCapsAndSettings); | 2207 | u32 misc = le32_to_cpu(non_clock_info->ulCapsAndSettings); |
2204 | u32 misc2 = le16_to_cpu(non_clock_info->usClassification); | 2208 | u32 misc2 = le16_to_cpu(non_clock_info->usClassification); |
2205 | u16 vddc = radeon_atombios_get_default_vddc(rdev); | 2209 | u16 vddc, vddci; |
2210 | |||
2211 | radeon_atombios_get_default_voltages(rdev, &vddc, &vddci); | ||
2206 | 2212 | ||
2207 | rdev->pm.power_state[state_index].misc = misc; | 2213 | rdev->pm.power_state[state_index].misc = misc; |
2208 | rdev->pm.power_state[state_index].misc2 = misc2; | 2214 | rdev->pm.power_state[state_index].misc2 = misc2; |
@@ -2243,6 +2249,7 @@ static void radeon_atombios_parse_pplib_non_clock_info(struct radeon_device *rde | |||
2243 | rdev->pm.default_sclk = rdev->pm.power_state[state_index].clock_info[0].sclk; | 2249 | rdev->pm.default_sclk = rdev->pm.power_state[state_index].clock_info[0].sclk; |
2244 | rdev->pm.default_mclk = rdev->pm.power_state[state_index].clock_info[0].mclk; | 2250 | rdev->pm.default_mclk = rdev->pm.power_state[state_index].clock_info[0].mclk; |
2245 | rdev->pm.default_vddc = rdev->pm.power_state[state_index].clock_info[0].voltage.voltage; | 2251 | rdev->pm.default_vddc = rdev->pm.power_state[state_index].clock_info[0].voltage.voltage; |
2252 | rdev->pm.default_vddci = rdev->pm.power_state[state_index].clock_info[0].voltage.vddci; | ||
2246 | } else { | 2253 | } else { |
2247 | /* patch the table values with the default slck/mclk from firmware info */ | 2254 | /* patch the table values with the default slck/mclk from firmware info */ |
2248 | for (j = 0; j < mode_index; j++) { | 2255 | for (j = 0; j < mode_index; j++) { |
@@ -2285,6 +2292,8 @@ static bool radeon_atombios_parse_pplib_clock_info(struct radeon_device *rdev, | |||
2285 | VOLTAGE_SW; | 2292 | VOLTAGE_SW; |
2286 | rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage = | 2293 | rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage = |
2287 | le16_to_cpu(clock_info->evergreen.usVDDC); | 2294 | le16_to_cpu(clock_info->evergreen.usVDDC); |
2295 | rdev->pm.power_state[state_index].clock_info[mode_index].voltage.vddci = | ||
2296 | le16_to_cpu(clock_info->evergreen.usVDDCI); | ||
2288 | } else { | 2297 | } else { |
2289 | sclk = le16_to_cpu(clock_info->r600.usEngineClockLow); | 2298 | sclk = le16_to_cpu(clock_info->r600.usEngineClockLow); |
2290 | sclk |= clock_info->r600.ucEngineClockHigh << 16; | 2299 | sclk |= clock_info->r600.ucEngineClockHigh << 16; |
@@ -2576,25 +2585,25 @@ union set_voltage { | |||
2576 | struct _SET_VOLTAGE_PARAMETERS_V2 v2; | 2585 | struct _SET_VOLTAGE_PARAMETERS_V2 v2; |
2577 | }; | 2586 | }; |
2578 | 2587 | ||
2579 | void radeon_atom_set_voltage(struct radeon_device *rdev, u16 level) | 2588 | void radeon_atom_set_voltage(struct radeon_device *rdev, u16 voltage_level, u8 voltage_type) |
2580 | { | 2589 | { |
2581 | union set_voltage args; | 2590 | union set_voltage args; |
2582 | int index = GetIndexIntoMasterTable(COMMAND, SetVoltage); | 2591 | int index = GetIndexIntoMasterTable(COMMAND, SetVoltage); |
2583 | u8 frev, crev, volt_index = level; | 2592 | u8 frev, crev, volt_index = voltage_level; |
2584 | 2593 | ||
2585 | if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev)) | 2594 | if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev)) |
2586 | return; | 2595 | return; |
2587 | 2596 | ||
2588 | switch (crev) { | 2597 | switch (crev) { |
2589 | case 1: | 2598 | case 1: |
2590 | args.v1.ucVoltageType = SET_VOLTAGE_TYPE_ASIC_VDDC; | 2599 | args.v1.ucVoltageType = voltage_type; |
2591 | args.v1.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_ALL_SOURCE; | 2600 | args.v1.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_ALL_SOURCE; |
2592 | args.v1.ucVoltageIndex = volt_index; | 2601 | args.v1.ucVoltageIndex = volt_index; |
2593 | break; | 2602 | break; |
2594 | case 2: | 2603 | case 2: |
2595 | args.v2.ucVoltageType = SET_VOLTAGE_TYPE_ASIC_VDDC; | 2604 | args.v2.ucVoltageType = voltage_type; |
2596 | args.v2.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_SET_VOLTAGE; | 2605 | args.v2.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_SET_VOLTAGE; |
2597 | args.v2.usVoltageLevel = cpu_to_le16(level); | 2606 | args.v2.usVoltageLevel = cpu_to_le16(voltage_level); |
2598 | break; | 2607 | break; |
2599 | default: | 2608 | default: |
2600 | DRM_ERROR("Unknown table version %d, %d\n", frev, crev); | 2609 | DRM_ERROR("Unknown table version %d, %d\n", frev, crev); |
diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c index cf602e2d0718..8caf546c8e92 100644 --- a/drivers/gpu/drm/radeon/radeon_combios.c +++ b/drivers/gpu/drm/radeon/radeon_combios.c | |||
@@ -2079,6 +2079,19 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) | |||
2079 | DRM_MODE_CONNECTOR_DVII, &ddc_i2c, | 2079 | DRM_MODE_CONNECTOR_DVII, &ddc_i2c, |
2080 | CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I, | 2080 | CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I, |
2081 | &hpd); | 2081 | &hpd); |
2082 | /* TV - TV DAC */ | ||
2083 | ddc_i2c.valid = false; | ||
2084 | hpd.hpd = RADEON_HPD_NONE; | ||
2085 | radeon_add_legacy_encoder(dev, | ||
2086 | radeon_get_encoder_enum(dev, | ||
2087 | ATOM_DEVICE_TV1_SUPPORT, | ||
2088 | 2), | ||
2089 | ATOM_DEVICE_TV1_SUPPORT); | ||
2090 | radeon_add_legacy_connector(dev, 2, ATOM_DEVICE_TV1_SUPPORT, | ||
2091 | DRM_MODE_CONNECTOR_SVIDEO, | ||
2092 | &ddc_i2c, | ||
2093 | CONNECTOR_OBJECT_ID_SVIDEO, | ||
2094 | &hpd); | ||
2082 | break; | 2095 | break; |
2083 | default: | 2096 | default: |
2084 | DRM_INFO("Connector table: %d (invalid)\n", | 2097 | DRM_INFO("Connector table: %d (invalid)\n", |
diff --git a/drivers/gpu/drm/radeon/radeon_cp.c b/drivers/gpu/drm/radeon/radeon_cp.c index 3d599e33b9cc..75867792a4e2 100644 --- a/drivers/gpu/drm/radeon/radeon_cp.c +++ b/drivers/gpu/drm/radeon/radeon_cp.c | |||
@@ -244,7 +244,7 @@ void radeon_write_agp_base(drm_radeon_private_t *dev_priv, u64 agp_base) | |||
244 | u32 agp_base_lo = agp_base & 0xffffffff; | 244 | u32 agp_base_lo = agp_base & 0xffffffff; |
245 | u32 r6xx_agp_base = (agp_base >> 22) & 0x3ffff; | 245 | u32 r6xx_agp_base = (agp_base >> 22) & 0x3ffff; |
246 | 246 | ||
247 | /* R6xx/R7xx must be aligned to a 4MB boundry */ | 247 | /* R6xx/R7xx must be aligned to a 4MB boundary */ |
248 | if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RV770) | 248 | if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RV770) |
249 | RADEON_WRITE(R700_MC_VM_AGP_BASE, r6xx_agp_base); | 249 | RADEON_WRITE(R700_MC_VM_AGP_BASE, r6xx_agp_base); |
250 | else if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600) | 250 | else if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600) |
diff --git a/drivers/gpu/drm/radeon/radeon_cursor.c b/drivers/gpu/drm/radeon/radeon_cursor.c index 017ac54920fb..bdf2fa1189ae 100644 --- a/drivers/gpu/drm/radeon/radeon_cursor.c +++ b/drivers/gpu/drm/radeon/radeon_cursor.c | |||
@@ -226,7 +226,7 @@ int radeon_crtc_cursor_move(struct drm_crtc *crtc, | |||
226 | y += crtc->y; | 226 | y += crtc->y; |
227 | DRM_DEBUG("x %d y %d c->x %d c->y %d\n", x, y, crtc->x, crtc->y); | 227 | DRM_DEBUG("x %d y %d c->x %d c->y %d\n", x, y, crtc->x, crtc->y); |
228 | 228 | ||
229 | /* avivo cursor image can't end on 128 pixel boundry or | 229 | /* avivo cursor image can't end on 128 pixel boundary or |
230 | * go past the end of the frame if both crtcs are enabled | 230 | * go past the end of the frame if both crtcs are enabled |
231 | */ | 231 | */ |
232 | list_for_each_entry(crtc_p, &crtc->dev->mode_config.crtc_list, head) { | 232 | list_for_each_entry(crtc_p, &crtc->dev->mode_config.crtc_list, head) { |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index f0209be7a34b..890217e678d3 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
@@ -262,7 +262,7 @@ int radeon_wb_init(struct radeon_device *rdev) | |||
262 | * Note: GTT start, end, size should be initialized before calling this | 262 | * Note: GTT start, end, size should be initialized before calling this |
263 | * function on AGP platform. | 263 | * function on AGP platform. |
264 | * | 264 | * |
265 | * Note: We don't explictly enforce VRAM start to be aligned on VRAM size, | 265 | * Note: We don't explicitly enforce VRAM start to be aligned on VRAM size, |
266 | * this shouldn't be a problem as we are using the PCI aperture as a reference. | 266 | * this shouldn't be a problem as we are using the PCI aperture as a reference. |
267 | * Otherwise this would be needed for rv280, all r3xx, and all r4xx, but | 267 | * Otherwise this would be needed for rv280, all r3xx, and all r4xx, but |
268 | * not IGP. | 268 | * not IGP. |
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index 4be58793dc17..bdbab5c43bdc 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c | |||
@@ -1492,7 +1492,7 @@ bool radeon_crtc_scaling_mode_fixup(struct drm_crtc *crtc, | |||
1492 | * | 1492 | * |
1493 | * \return Flags, or'ed together as follows: | 1493 | * \return Flags, or'ed together as follows: |
1494 | * | 1494 | * |
1495 | * DRM_SCANOUTPOS_VALID = Query successfull. | 1495 | * DRM_SCANOUTPOS_VALID = Query successful. |
1496 | * DRM_SCANOUTPOS_INVBL = Inside vblank. | 1496 | * DRM_SCANOUTPOS_INVBL = Inside vblank. |
1497 | * DRM_SCANOUTPOS_ACCURATE = Returned position is accurate. A lack of | 1497 | * DRM_SCANOUTPOS_ACCURATE = Returned position is accurate. A lack of |
1498 | * this flag means that returned position may be offset by a constant but | 1498 | * this flag means that returned position may be offset by a constant but |
diff --git a/drivers/gpu/drm/radeon/radeon_drv.h b/drivers/gpu/drm/radeon/radeon_drv.h index 5cba46b9779a..a1b59ca96d01 100644 --- a/drivers/gpu/drm/radeon/radeon_drv.h +++ b/drivers/gpu/drm/radeon/radeon_drv.h | |||
@@ -271,7 +271,7 @@ typedef struct drm_radeon_private { | |||
271 | 271 | ||
272 | int have_z_offset; | 272 | int have_z_offset; |
273 | 273 | ||
274 | /* starting from here on, data is preserved accross an open */ | 274 | /* starting from here on, data is preserved across an open */ |
275 | uint32_t flags; /* see radeon_chip_flags */ | 275 | uint32_t flags; /* see radeon_chip_flags */ |
276 | resource_size_t fb_aper_offset; | 276 | resource_size_t fb_aper_offset; |
277 | 277 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_fence.c b/drivers/gpu/drm/radeon/radeon_fence.c index 9e59868d354e..bbcd1dd7bac0 100644 --- a/drivers/gpu/drm/radeon/radeon_fence.c +++ b/drivers/gpu/drm/radeon/radeon_fence.c | |||
@@ -79,7 +79,7 @@ static bool radeon_fence_poll_locked(struct radeon_device *rdev) | |||
79 | scratch_index = R600_WB_EVENT_OFFSET + rdev->fence_drv.scratch_reg - rdev->scratch.reg_base; | 79 | scratch_index = R600_WB_EVENT_OFFSET + rdev->fence_drv.scratch_reg - rdev->scratch.reg_base; |
80 | else | 80 | else |
81 | scratch_index = RADEON_WB_SCRATCH_OFFSET + rdev->fence_drv.scratch_reg - rdev->scratch.reg_base; | 81 | scratch_index = RADEON_WB_SCRATCH_OFFSET + rdev->fence_drv.scratch_reg - rdev->scratch.reg_base; |
82 | seq = rdev->wb.wb[scratch_index/4]; | 82 | seq = le32_to_cpu(rdev->wb.wb[scratch_index/4]); |
83 | } else | 83 | } else |
84 | seq = RREG32(rdev->fence_drv.scratch_reg); | 84 | seq = RREG32(rdev->fence_drv.scratch_reg); |
85 | if (seq != rdev->fence_drv.last_seq) { | 85 | if (seq != rdev->fence_drv.last_seq) { |
diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c index f0534ef2f331..8a955bbdb608 100644 --- a/drivers/gpu/drm/radeon/radeon_gart.c +++ b/drivers/gpu/drm/radeon/radeon_gart.c | |||
@@ -285,4 +285,6 @@ void radeon_gart_fini(struct radeon_device *rdev) | |||
285 | rdev->gart.pages = NULL; | 285 | rdev->gart.pages = NULL; |
286 | rdev->gart.pages_addr = NULL; | 286 | rdev->gart.pages_addr = NULL; |
287 | rdev->gart.ttm_alloced = NULL; | 287 | rdev->gart.ttm_alloced = NULL; |
288 | |||
289 | radeon_dummy_page_fini(rdev); | ||
288 | } | 290 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_i2c.c b/drivers/gpu/drm/radeon/radeon_i2c.c index ded2a45bc95c..ccbabf734a61 100644 --- a/drivers/gpu/drm/radeon/radeon_i2c.c +++ b/drivers/gpu/drm/radeon/radeon_i2c.c | |||
@@ -1062,7 +1062,7 @@ void radeon_i2c_get_byte(struct radeon_i2c_chan *i2c_bus, | |||
1062 | *val = in_buf[0]; | 1062 | *val = in_buf[0]; |
1063 | DRM_DEBUG("val = 0x%02x\n", *val); | 1063 | DRM_DEBUG("val = 0x%02x\n", *val); |
1064 | } else { | 1064 | } else { |
1065 | DRM_ERROR("i2c 0x%02x 0x%02x read failed\n", | 1065 | DRM_DEBUG("i2c 0x%02x 0x%02x read failed\n", |
1066 | addr, *val); | 1066 | addr, *val); |
1067 | } | 1067 | } |
1068 | } | 1068 | } |
@@ -1084,7 +1084,7 @@ void radeon_i2c_put_byte(struct radeon_i2c_chan *i2c_bus, | |||
1084 | out_buf[1] = val; | 1084 | out_buf[1] = val; |
1085 | 1085 | ||
1086 | if (i2c_transfer(&i2c_bus->adapter, &msg, 1) != 1) | 1086 | if (i2c_transfer(&i2c_bus->adapter, &msg, 1) != 1) |
1087 | DRM_ERROR("i2c 0x%02x 0x%02x write failed\n", | 1087 | DRM_DEBUG("i2c 0x%02x 0x%02x write failed\n", |
1088 | addr, val); | 1088 | addr, val); |
1089 | } | 1089 | } |
1090 | 1090 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c index 5b54268ed6b2..2f46e0c8df53 100644 --- a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c | |||
@@ -269,7 +269,7 @@ static const struct drm_encoder_helper_funcs radeon_legacy_lvds_helper_funcs = { | |||
269 | .disable = radeon_legacy_encoder_disable, | 269 | .disable = radeon_legacy_encoder_disable, |
270 | }; | 270 | }; |
271 | 271 | ||
272 | #ifdef CONFIG_BACKLIGHT_CLASS_DEVICE | 272 | #if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) || defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE) |
273 | 273 | ||
274 | #define MAX_RADEON_LEVEL 0xFF | 274 | #define MAX_RADEON_LEVEL 0xFF |
275 | 275 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_object.h b/drivers/gpu/drm/radeon/radeon_object.h index 7f8e778dba46..ede6c13628f2 100644 --- a/drivers/gpu/drm/radeon/radeon_object.h +++ b/drivers/gpu/drm/radeon/radeon_object.h | |||
@@ -87,7 +87,7 @@ static inline void radeon_bo_unreserve(struct radeon_bo *bo) | |||
87 | * Returns current GPU offset of the object. | 87 | * Returns current GPU offset of the object. |
88 | * | 88 | * |
89 | * Note: object should either be pinned or reserved when calling this | 89 | * Note: object should either be pinned or reserved when calling this |
90 | * function, it might be usefull to add check for this for debugging. | 90 | * function, it might be useful to add check for this for debugging. |
91 | */ | 91 | */ |
92 | static inline u64 radeon_bo_gpu_offset(struct radeon_bo *bo) | 92 | static inline u64 radeon_bo_gpu_offset(struct radeon_bo *bo) |
93 | { | 93 | { |
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c index 08de669e025a..86eda1ea94df 100644 --- a/drivers/gpu/drm/radeon/radeon_pm.c +++ b/drivers/gpu/drm/radeon/radeon_pm.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include "drmP.h" | 23 | #include "drmP.h" |
24 | #include "radeon.h" | 24 | #include "radeon.h" |
25 | #include "avivod.h" | 25 | #include "avivod.h" |
26 | #include "atom.h" | ||
26 | #ifdef CONFIG_ACPI | 27 | #ifdef CONFIG_ACPI |
27 | #include <linux/acpi.h> | 28 | #include <linux/acpi.h> |
28 | #endif | 29 | #endif |
@@ -535,7 +536,11 @@ void radeon_pm_resume(struct radeon_device *rdev) | |||
535 | /* set up the default clocks if the MC ucode is loaded */ | 536 | /* set up the default clocks if the MC ucode is loaded */ |
536 | if (ASIC_IS_DCE5(rdev) && rdev->mc_fw) { | 537 | if (ASIC_IS_DCE5(rdev) && rdev->mc_fw) { |
537 | if (rdev->pm.default_vddc) | 538 | if (rdev->pm.default_vddc) |
538 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddc); | 539 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddc, |
540 | SET_VOLTAGE_TYPE_ASIC_VDDC); | ||
541 | if (rdev->pm.default_vddci) | ||
542 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddci, | ||
543 | SET_VOLTAGE_TYPE_ASIC_VDDCI); | ||
539 | if (rdev->pm.default_sclk) | 544 | if (rdev->pm.default_sclk) |
540 | radeon_set_engine_clock(rdev, rdev->pm.default_sclk); | 545 | radeon_set_engine_clock(rdev, rdev->pm.default_sclk); |
541 | if (rdev->pm.default_mclk) | 546 | if (rdev->pm.default_mclk) |
@@ -548,6 +553,7 @@ void radeon_pm_resume(struct radeon_device *rdev) | |||
548 | rdev->pm.current_sclk = rdev->pm.default_sclk; | 553 | rdev->pm.current_sclk = rdev->pm.default_sclk; |
549 | rdev->pm.current_mclk = rdev->pm.default_mclk; | 554 | rdev->pm.current_mclk = rdev->pm.default_mclk; |
550 | rdev->pm.current_vddc = rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.voltage; | 555 | rdev->pm.current_vddc = rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.voltage; |
556 | rdev->pm.current_vddci = rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.vddci; | ||
551 | if (rdev->pm.pm_method == PM_METHOD_DYNPM | 557 | if (rdev->pm.pm_method == PM_METHOD_DYNPM |
552 | && rdev->pm.dynpm_state == DYNPM_STATE_SUSPENDED) { | 558 | && rdev->pm.dynpm_state == DYNPM_STATE_SUSPENDED) { |
553 | rdev->pm.dynpm_state = DYNPM_STATE_ACTIVE; | 559 | rdev->pm.dynpm_state = DYNPM_STATE_ACTIVE; |
@@ -585,7 +591,8 @@ int radeon_pm_init(struct radeon_device *rdev) | |||
585 | /* set up the default clocks if the MC ucode is loaded */ | 591 | /* set up the default clocks if the MC ucode is loaded */ |
586 | if (ASIC_IS_DCE5(rdev) && rdev->mc_fw) { | 592 | if (ASIC_IS_DCE5(rdev) && rdev->mc_fw) { |
587 | if (rdev->pm.default_vddc) | 593 | if (rdev->pm.default_vddc) |
588 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddc); | 594 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddc, |
595 | SET_VOLTAGE_TYPE_ASIC_VDDC); | ||
589 | if (rdev->pm.default_sclk) | 596 | if (rdev->pm.default_sclk) |
590 | radeon_set_engine_clock(rdev, rdev->pm.default_sclk); | 597 | radeon_set_engine_clock(rdev, rdev->pm.default_sclk); |
591 | if (rdev->pm.default_mclk) | 598 | if (rdev->pm.default_mclk) |
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c index bbc9cd823334..c6776e48fdde 100644 --- a/drivers/gpu/drm/radeon/radeon_ring.c +++ b/drivers/gpu/drm/radeon/radeon_ring.c | |||
@@ -248,7 +248,7 @@ void radeon_ib_pool_fini(struct radeon_device *rdev) | |||
248 | void radeon_ring_free_size(struct radeon_device *rdev) | 248 | void radeon_ring_free_size(struct radeon_device *rdev) |
249 | { | 249 | { |
250 | if (rdev->wb.enabled) | 250 | if (rdev->wb.enabled) |
251 | rdev->cp.rptr = rdev->wb.wb[RADEON_WB_CP_RPTR_OFFSET/4]; | 251 | rdev->cp.rptr = le32_to_cpu(rdev->wb.wb[RADEON_WB_CP_RPTR_OFFSET/4]); |
252 | else { | 252 | else { |
253 | if (rdev->family >= CHIP_R600) | 253 | if (rdev->family >= CHIP_R600) |
254 | rdev->cp.rptr = RREG32(R600_CP_RB_RPTR); | 254 | rdev->cp.rptr = RREG32(R600_CP_RB_RPTR); |
diff --git a/drivers/gpu/drm/radeon/radeon_state.c b/drivers/gpu/drm/radeon/radeon_state.c index 4ae5a3d1074e..92e7ea73b7c5 100644 --- a/drivers/gpu/drm/radeon/radeon_state.c +++ b/drivers/gpu/drm/radeon/radeon_state.c | |||
@@ -980,7 +980,7 @@ static void radeon_cp_dispatch_clear(struct drm_device * dev, | |||
980 | } | 980 | } |
981 | 981 | ||
982 | /* hyper z clear */ | 982 | /* hyper z clear */ |
983 | /* no docs available, based on reverse engeneering by Stephane Marchesin */ | 983 | /* no docs available, based on reverse engineering by Stephane Marchesin */ |
984 | if ((flags & (RADEON_DEPTH | RADEON_STENCIL)) | 984 | if ((flags & (RADEON_DEPTH | RADEON_STENCIL)) |
985 | && (flags & RADEON_CLEAR_FASTZ)) { | 985 | && (flags & RADEON_CLEAR_FASTZ)) { |
986 | 986 | ||
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c index 19763f5df5e1..6e3b11e5abbe 100644 --- a/drivers/gpu/drm/radeon/rs600.c +++ b/drivers/gpu/drm/radeon/rs600.c | |||
@@ -48,17 +48,6 @@ int rs600_mc_wait_for_idle(struct radeon_device *rdev); | |||
48 | 48 | ||
49 | void rs600_pre_page_flip(struct radeon_device *rdev, int crtc) | 49 | void rs600_pre_page_flip(struct radeon_device *rdev, int crtc) |
50 | { | 50 | { |
51 | struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc]; | ||
52 | u32 tmp; | ||
53 | |||
54 | /* make sure flip is at vb rather than hb */ | ||
55 | tmp = RREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset); | ||
56 | tmp &= ~AVIVO_D1GRPH_SURFACE_UPDATE_H_RETRACE_EN; | ||
57 | WREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, tmp); | ||
58 | |||
59 | /* set pageflip to happen anywhere in vblank interval */ | ||
60 | WREG32(AVIVO_D1MODE_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 0); | ||
61 | |||
62 | /* enable the pflip int */ | 51 | /* enable the pflip int */ |
63 | radeon_irq_kms_pflip_irq_get(rdev, crtc); | 52 | radeon_irq_kms_pflip_irq_get(rdev, crtc); |
64 | } | 53 | } |
@@ -125,7 +114,7 @@ void rs600_pm_misc(struct radeon_device *rdev) | |||
125 | udelay(voltage->delay); | 114 | udelay(voltage->delay); |
126 | } | 115 | } |
127 | } else if (voltage->type == VOLTAGE_VDDC) | 116 | } else if (voltage->type == VOLTAGE_VDDC) |
128 | radeon_atom_set_voltage(rdev, voltage->vddc_id); | 117 | radeon_atom_set_voltage(rdev, voltage->vddc_id, SET_VOLTAGE_TYPE_ASIC_VDDC); |
129 | 118 | ||
130 | dyn_pwrmgt_sclk_length = RREG32_PLL(DYN_PWRMGT_SCLK_LENGTH); | 119 | dyn_pwrmgt_sclk_length = RREG32_PLL(DYN_PWRMGT_SCLK_LENGTH); |
131 | dyn_pwrmgt_sclk_length &= ~REDUCED_POWER_SCLK_HILEN(0xf); | 120 | dyn_pwrmgt_sclk_length &= ~REDUCED_POWER_SCLK_HILEN(0xf); |
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index b974ac7df8df..ef8a5babe9f7 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c | |||
@@ -106,7 +106,7 @@ void rv770_pm_misc(struct radeon_device *rdev) | |||
106 | 106 | ||
107 | if ((voltage->type == VOLTAGE_SW) && voltage->voltage) { | 107 | if ((voltage->type == VOLTAGE_SW) && voltage->voltage) { |
108 | if (voltage->voltage != rdev->pm.current_vddc) { | 108 | if (voltage->voltage != rdev->pm.current_vddc) { |
109 | radeon_atom_set_voltage(rdev, voltage->voltage); | 109 | radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC); |
110 | rdev->pm.current_vddc = voltage->voltage; | 110 | rdev->pm.current_vddc = voltage->voltage; |
111 | DRM_DEBUG("Setting: v: %d\n", voltage->voltage); | 111 | DRM_DEBUG("Setting: v: %d\n", voltage->voltage); |
112 | } | 112 | } |
@@ -1255,9 +1255,6 @@ int rv770_init(struct radeon_device *rdev) | |||
1255 | { | 1255 | { |
1256 | int r; | 1256 | int r; |
1257 | 1257 | ||
1258 | r = radeon_dummy_page_init(rdev); | ||
1259 | if (r) | ||
1260 | return r; | ||
1261 | /* This don't do much */ | 1258 | /* This don't do much */ |
1262 | r = radeon_gem_init(rdev); | 1259 | r = radeon_gem_init(rdev); |
1263 | if (r) | 1260 | if (r) |
@@ -1372,7 +1369,6 @@ void rv770_fini(struct radeon_device *rdev) | |||
1372 | radeon_atombios_fini(rdev); | 1369 | radeon_atombios_fini(rdev); |
1373 | kfree(rdev->bios); | 1370 | kfree(rdev->bios); |
1374 | rdev->bios = NULL; | 1371 | rdev->bios = NULL; |
1375 | radeon_dummy_page_fini(rdev); | ||
1376 | } | 1372 | } |
1377 | 1373 | ||
1378 | static void rv770_pcie_gen2_enable(struct radeon_device *rdev) | 1374 | static void rv770_pcie_gen2_enable(struct radeon_device *rdev) |