diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_display.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 1051 |
1 files changed, 864 insertions, 187 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 73e7b9cecac8..d6fce2133413 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -25,6 +25,7 @@ | |||
25 | */ | 25 | */ |
26 | 26 | ||
27 | #include <linux/i2c.h> | 27 | #include <linux/i2c.h> |
28 | #include <linux/kernel.h> | ||
28 | #include "drmP.h" | 29 | #include "drmP.h" |
29 | #include "intel_drv.h" | 30 | #include "intel_drv.h" |
30 | #include "i915_drm.h" | 31 | #include "i915_drm.h" |
@@ -33,7 +34,10 @@ | |||
33 | 34 | ||
34 | #include "drm_crtc_helper.h" | 35 | #include "drm_crtc_helper.h" |
35 | 36 | ||
37 | #define HAS_eDP (intel_pipe_has_type(crtc, INTEL_OUTPUT_EDP)) | ||
38 | |||
36 | bool intel_pipe_has_type (struct drm_crtc *crtc, int type); | 39 | bool intel_pipe_has_type (struct drm_crtc *crtc, int type); |
40 | static void intel_update_watermarks(struct drm_device *dev); | ||
37 | 41 | ||
38 | typedef struct { | 42 | typedef struct { |
39 | /* given values */ | 43 | /* given values */ |
@@ -86,7 +90,7 @@ struct intel_limit { | |||
86 | #define I8XX_P2_SLOW 4 | 90 | #define I8XX_P2_SLOW 4 |
87 | #define I8XX_P2_FAST 2 | 91 | #define I8XX_P2_FAST 2 |
88 | #define I8XX_P2_LVDS_SLOW 14 | 92 | #define I8XX_P2_LVDS_SLOW 14 |
89 | #define I8XX_P2_LVDS_FAST 14 /* No fast option */ | 93 | #define I8XX_P2_LVDS_FAST 7 |
90 | #define I8XX_P2_SLOW_LIMIT 165000 | 94 | #define I8XX_P2_SLOW_LIMIT 165000 |
91 | 95 | ||
92 | #define I9XX_DOT_MIN 20000 | 96 | #define I9XX_DOT_MIN 20000 |
@@ -266,6 +270,9 @@ intel_igdng_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc, | |||
266 | static bool | 270 | static bool |
267 | intel_find_pll_g4x_dp(const intel_limit_t *, struct drm_crtc *crtc, | 271 | intel_find_pll_g4x_dp(const intel_limit_t *, struct drm_crtc *crtc, |
268 | int target, int refclk, intel_clock_t *best_clock); | 272 | int target, int refclk, intel_clock_t *best_clock); |
273 | static bool | ||
274 | intel_find_pll_igdng_dp(const intel_limit_t *, struct drm_crtc *crtc, | ||
275 | int target, int refclk, intel_clock_t *best_clock); | ||
269 | 276 | ||
270 | static const intel_limit_t intel_limits_i8xx_dvo = { | 277 | static const intel_limit_t intel_limits_i8xx_dvo = { |
271 | .dot = { .min = I8XX_DOT_MIN, .max = I8XX_DOT_MAX }, | 278 | .dot = { .min = I8XX_DOT_MIN, .max = I8XX_DOT_MAX }, |
@@ -596,6 +603,23 @@ bool intel_pipe_has_type (struct drm_crtc *crtc, int type) | |||
596 | return false; | 603 | return false; |
597 | } | 604 | } |
598 | 605 | ||
606 | struct drm_connector * | ||
607 | intel_pipe_get_output (struct drm_crtc *crtc) | ||
608 | { | ||
609 | struct drm_device *dev = crtc->dev; | ||
610 | struct drm_mode_config *mode_config = &dev->mode_config; | ||
611 | struct drm_connector *l_entry, *ret = NULL; | ||
612 | |||
613 | list_for_each_entry(l_entry, &mode_config->connector_list, head) { | ||
614 | if (l_entry->encoder && | ||
615 | l_entry->encoder->crtc == crtc) { | ||
616 | ret = l_entry; | ||
617 | break; | ||
618 | } | ||
619 | } | ||
620 | return ret; | ||
621 | } | ||
622 | |||
599 | #define INTELPllInvalid(s) do { /* DRM_DEBUG(s); */ return false; } while (0) | 623 | #define INTELPllInvalid(s) do { /* DRM_DEBUG(s); */ return false; } while (0) |
600 | /** | 624 | /** |
601 | * Returns whether the given set of divisors are valid for a given refclk with | 625 | * Returns whether the given set of divisors are valid for a given refclk with |
@@ -643,7 +667,7 @@ intel_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc, | |||
643 | int err = target; | 667 | int err = target; |
644 | 668 | ||
645 | if (IS_I9XX(dev) && intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS) && | 669 | if (IS_I9XX(dev) && intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS) && |
646 | (I915_READ(LVDS) & LVDS_PORT_EN) != 0) { | 670 | (I915_READ(LVDS)) != 0) { |
647 | /* | 671 | /* |
648 | * For LVDS, if the panel is on, just rely on its current | 672 | * For LVDS, if the panel is on, just rely on its current |
649 | * settings for dual-channel. We haven't figured out how to | 673 | * settings for dual-channel. We haven't figured out how to |
@@ -750,6 +774,30 @@ intel_g4x_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc, | |||
750 | } | 774 | } |
751 | 775 | ||
752 | static bool | 776 | static bool |
777 | intel_find_pll_igdng_dp(const intel_limit_t *limit, struct drm_crtc *crtc, | ||
778 | int target, int refclk, intel_clock_t *best_clock) | ||
779 | { | ||
780 | struct drm_device *dev = crtc->dev; | ||
781 | intel_clock_t clock; | ||
782 | if (target < 200000) { | ||
783 | clock.n = 1; | ||
784 | clock.p1 = 2; | ||
785 | clock.p2 = 10; | ||
786 | clock.m1 = 12; | ||
787 | clock.m2 = 9; | ||
788 | } else { | ||
789 | clock.n = 2; | ||
790 | clock.p1 = 1; | ||
791 | clock.p2 = 10; | ||
792 | clock.m1 = 14; | ||
793 | clock.m2 = 8; | ||
794 | } | ||
795 | intel_clock(dev, refclk, &clock); | ||
796 | memcpy(best_clock, &clock, sizeof(intel_clock_t)); | ||
797 | return true; | ||
798 | } | ||
799 | |||
800 | static bool | ||
753 | intel_igdng_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc, | 801 | intel_igdng_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc, |
754 | int target, int refclk, intel_clock_t *best_clock) | 802 | int target, int refclk, intel_clock_t *best_clock) |
755 | { | 803 | { |
@@ -761,6 +809,14 @@ intel_igdng_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc, | |||
761 | int err_most = 47; | 809 | int err_most = 47; |
762 | found = false; | 810 | found = false; |
763 | 811 | ||
812 | /* eDP has only 2 clock choice, no n/m/p setting */ | ||
813 | if (HAS_eDP) | ||
814 | return true; | ||
815 | |||
816 | if (intel_pipe_has_type(crtc, INTEL_OUTPUT_DISPLAYPORT)) | ||
817 | return intel_find_pll_igdng_dp(limit, crtc, target, | ||
818 | refclk, best_clock); | ||
819 | |||
764 | if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) { | 820 | if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) { |
765 | if ((I915_READ(LVDS) & LVDS_CLKB_POWER_MASK) == | 821 | if ((I915_READ(LVDS) & LVDS_CLKB_POWER_MASK) == |
766 | LVDS_CLKB_POWER_UP) | 822 | LVDS_CLKB_POWER_UP) |
@@ -814,24 +870,21 @@ intel_find_pll_g4x_dp(const intel_limit_t *limit, struct drm_crtc *crtc, | |||
814 | { | 870 | { |
815 | intel_clock_t clock; | 871 | intel_clock_t clock; |
816 | if (target < 200000) { | 872 | if (target < 200000) { |
817 | clock.dot = 161670; | ||
818 | clock.p = 20; | ||
819 | clock.p1 = 2; | 873 | clock.p1 = 2; |
820 | clock.p2 = 10; | 874 | clock.p2 = 10; |
821 | clock.n = 0x01; | 875 | clock.n = 2; |
822 | clock.m = 97; | 876 | clock.m1 = 23; |
823 | clock.m1 = 0x10; | 877 | clock.m2 = 8; |
824 | clock.m2 = 0x05; | ||
825 | } else { | 878 | } else { |
826 | clock.dot = 270000; | ||
827 | clock.p = 10; | ||
828 | clock.p1 = 1; | 879 | clock.p1 = 1; |
829 | clock.p2 = 10; | 880 | clock.p2 = 10; |
830 | clock.n = 0x02; | 881 | clock.n = 1; |
831 | clock.m = 108; | 882 | clock.m1 = 14; |
832 | clock.m1 = 0x12; | 883 | clock.m2 = 2; |
833 | clock.m2 = 0x06; | ||
834 | } | 884 | } |
885 | clock.m = 5 * (clock.m1 + 2) + (clock.m2 + 2); | ||
886 | clock.p = (clock.p1 * clock.p2); | ||
887 | clock.dot = 96000 * clock.m / (clock.n + 2) / clock.p; | ||
835 | memcpy(best_clock, &clock, sizeof(intel_clock_t)); | 888 | memcpy(best_clock, &clock, sizeof(intel_clock_t)); |
836 | return true; | 889 | return true; |
837 | } | 890 | } |
@@ -999,13 +1052,97 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y, | |||
999 | return 0; | 1052 | return 0; |
1000 | } | 1053 | } |
1001 | 1054 | ||
1055 | /* Disable the VGA plane that we never use */ | ||
1056 | static void i915_disable_vga (struct drm_device *dev) | ||
1057 | { | ||
1058 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
1059 | u8 sr1; | ||
1060 | u32 vga_reg; | ||
1061 | |||
1062 | if (IS_IGDNG(dev)) | ||
1063 | vga_reg = CPU_VGACNTRL; | ||
1064 | else | ||
1065 | vga_reg = VGACNTRL; | ||
1066 | |||
1067 | if (I915_READ(vga_reg) & VGA_DISP_DISABLE) | ||
1068 | return; | ||
1069 | |||
1070 | I915_WRITE8(VGA_SR_INDEX, 1); | ||
1071 | sr1 = I915_READ8(VGA_SR_DATA); | ||
1072 | I915_WRITE8(VGA_SR_DATA, sr1 | (1 << 5)); | ||
1073 | udelay(100); | ||
1074 | |||
1075 | I915_WRITE(vga_reg, VGA_DISP_DISABLE); | ||
1076 | } | ||
1077 | |||
1078 | static void igdng_disable_pll_edp (struct drm_crtc *crtc) | ||
1079 | { | ||
1080 | struct drm_device *dev = crtc->dev; | ||
1081 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
1082 | u32 dpa_ctl; | ||
1083 | |||
1084 | DRM_DEBUG("\n"); | ||
1085 | dpa_ctl = I915_READ(DP_A); | ||
1086 | dpa_ctl &= ~DP_PLL_ENABLE; | ||
1087 | I915_WRITE(DP_A, dpa_ctl); | ||
1088 | } | ||
1089 | |||
1090 | static void igdng_enable_pll_edp (struct drm_crtc *crtc) | ||
1091 | { | ||
1092 | struct drm_device *dev = crtc->dev; | ||
1093 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
1094 | u32 dpa_ctl; | ||
1095 | |||
1096 | dpa_ctl = I915_READ(DP_A); | ||
1097 | dpa_ctl |= DP_PLL_ENABLE; | ||
1098 | I915_WRITE(DP_A, dpa_ctl); | ||
1099 | udelay(200); | ||
1100 | } | ||
1101 | |||
1102 | |||
1103 | static void igdng_set_pll_edp (struct drm_crtc *crtc, int clock) | ||
1104 | { | ||
1105 | struct drm_device *dev = crtc->dev; | ||
1106 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
1107 | u32 dpa_ctl; | ||
1108 | |||
1109 | DRM_DEBUG("eDP PLL enable for clock %d\n", clock); | ||
1110 | dpa_ctl = I915_READ(DP_A); | ||
1111 | dpa_ctl &= ~DP_PLL_FREQ_MASK; | ||
1112 | |||
1113 | if (clock < 200000) { | ||
1114 | u32 temp; | ||
1115 | dpa_ctl |= DP_PLL_FREQ_160MHZ; | ||
1116 | /* workaround for 160Mhz: | ||
1117 | 1) program 0x4600c bits 15:0 = 0x8124 | ||
1118 | 2) program 0x46010 bit 0 = 1 | ||
1119 | 3) program 0x46034 bit 24 = 1 | ||
1120 | 4) program 0x64000 bit 14 = 1 | ||
1121 | */ | ||
1122 | temp = I915_READ(0x4600c); | ||
1123 | temp &= 0xffff0000; | ||
1124 | I915_WRITE(0x4600c, temp | 0x8124); | ||
1125 | |||
1126 | temp = I915_READ(0x46010); | ||
1127 | I915_WRITE(0x46010, temp | 1); | ||
1128 | |||
1129 | temp = I915_READ(0x46034); | ||
1130 | I915_WRITE(0x46034, temp | (1 << 24)); | ||
1131 | } else { | ||
1132 | dpa_ctl |= DP_PLL_FREQ_270MHZ; | ||
1133 | } | ||
1134 | I915_WRITE(DP_A, dpa_ctl); | ||
1135 | |||
1136 | udelay(500); | ||
1137 | } | ||
1138 | |||
1002 | static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) | 1139 | static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) |
1003 | { | 1140 | { |
1004 | struct drm_device *dev = crtc->dev; | 1141 | struct drm_device *dev = crtc->dev; |
1005 | struct drm_i915_private *dev_priv = dev->dev_private; | 1142 | struct drm_i915_private *dev_priv = dev->dev_private; |
1006 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | 1143 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
1007 | int pipe = intel_crtc->pipe; | 1144 | int pipe = intel_crtc->pipe; |
1008 | int plane = intel_crtc->pipe; | 1145 | int plane = intel_crtc->plane; |
1009 | int pch_dpll_reg = (pipe == 0) ? PCH_DPLL_A : PCH_DPLL_B; | 1146 | int pch_dpll_reg = (pipe == 0) ? PCH_DPLL_A : PCH_DPLL_B; |
1010 | int pipeconf_reg = (pipe == 0) ? PIPEACONF : PIPEBCONF; | 1147 | int pipeconf_reg = (pipe == 0) ? PIPEACONF : PIPEBCONF; |
1011 | int dspcntr_reg = (plane == 0) ? DSPACNTR : DSPBCNTR; | 1148 | int dspcntr_reg = (plane == 0) ? DSPACNTR : DSPBCNTR; |
@@ -1016,6 +1153,7 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
1016 | int fdi_rx_imr_reg = (pipe == 0) ? FDI_RXA_IMR : FDI_RXB_IMR; | 1153 | int fdi_rx_imr_reg = (pipe == 0) ? FDI_RXA_IMR : FDI_RXB_IMR; |
1017 | int transconf_reg = (pipe == 0) ? TRANSACONF : TRANSBCONF; | 1154 | int transconf_reg = (pipe == 0) ? TRANSACONF : TRANSBCONF; |
1018 | int pf_ctl_reg = (pipe == 0) ? PFA_CTL_1 : PFB_CTL_1; | 1155 | int pf_ctl_reg = (pipe == 0) ? PFA_CTL_1 : PFB_CTL_1; |
1156 | int pf_win_size = (pipe == 0) ? PFA_WIN_SZ : PFB_WIN_SZ; | ||
1019 | int cpu_htot_reg = (pipe == 0) ? HTOTAL_A : HTOTAL_B; | 1157 | int cpu_htot_reg = (pipe == 0) ? HTOTAL_A : HTOTAL_B; |
1020 | int cpu_hblank_reg = (pipe == 0) ? HBLANK_A : HBLANK_B; | 1158 | int cpu_hblank_reg = (pipe == 0) ? HBLANK_A : HBLANK_B; |
1021 | int cpu_hsync_reg = (pipe == 0) ? HSYNC_A : HSYNC_B; | 1159 | int cpu_hsync_reg = (pipe == 0) ? HSYNC_A : HSYNC_B; |
@@ -1029,7 +1167,7 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
1029 | int trans_vblank_reg = (pipe == 0) ? TRANS_VBLANK_A : TRANS_VBLANK_B; | 1167 | int trans_vblank_reg = (pipe == 0) ? TRANS_VBLANK_A : TRANS_VBLANK_B; |
1030 | int trans_vsync_reg = (pipe == 0) ? TRANS_VSYNC_A : TRANS_VSYNC_B; | 1168 | int trans_vsync_reg = (pipe == 0) ? TRANS_VSYNC_A : TRANS_VSYNC_B; |
1031 | u32 temp; | 1169 | u32 temp; |
1032 | int tries = 5, j; | 1170 | int tries = 5, j, n; |
1033 | 1171 | ||
1034 | /* XXX: When our outputs are all unaware of DPMS modes other than off | 1172 | /* XXX: When our outputs are all unaware of DPMS modes other than off |
1035 | * and on, we should map those modes to DRM_MODE_DPMS_OFF in the CRTC. | 1173 | * and on, we should map those modes to DRM_MODE_DPMS_OFF in the CRTC. |
@@ -1039,27 +1177,32 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
1039 | case DRM_MODE_DPMS_STANDBY: | 1177 | case DRM_MODE_DPMS_STANDBY: |
1040 | case DRM_MODE_DPMS_SUSPEND: | 1178 | case DRM_MODE_DPMS_SUSPEND: |
1041 | DRM_DEBUG("crtc %d dpms on\n", pipe); | 1179 | DRM_DEBUG("crtc %d dpms on\n", pipe); |
1042 | /* enable PCH DPLL */ | 1180 | if (HAS_eDP) { |
1043 | temp = I915_READ(pch_dpll_reg); | 1181 | /* enable eDP PLL */ |
1044 | if ((temp & DPLL_VCO_ENABLE) == 0) { | 1182 | igdng_enable_pll_edp(crtc); |
1045 | I915_WRITE(pch_dpll_reg, temp | DPLL_VCO_ENABLE); | 1183 | } else { |
1046 | I915_READ(pch_dpll_reg); | 1184 | /* enable PCH DPLL */ |
1047 | } | 1185 | temp = I915_READ(pch_dpll_reg); |
1048 | 1186 | if ((temp & DPLL_VCO_ENABLE) == 0) { | |
1049 | /* enable PCH FDI RX PLL, wait warmup plus DMI latency */ | 1187 | I915_WRITE(pch_dpll_reg, temp | DPLL_VCO_ENABLE); |
1050 | temp = I915_READ(fdi_rx_reg); | 1188 | I915_READ(pch_dpll_reg); |
1051 | I915_WRITE(fdi_rx_reg, temp | FDI_RX_PLL_ENABLE | | 1189 | } |
1052 | FDI_SEL_PCDCLK | | ||
1053 | FDI_DP_PORT_WIDTH_X4); /* default 4 lanes */ | ||
1054 | I915_READ(fdi_rx_reg); | ||
1055 | udelay(200); | ||
1056 | 1190 | ||
1057 | /* Enable CPU FDI TX PLL, always on for IGDNG */ | 1191 | /* enable PCH FDI RX PLL, wait warmup plus DMI latency */ |
1058 | temp = I915_READ(fdi_tx_reg); | 1192 | temp = I915_READ(fdi_rx_reg); |
1059 | if ((temp & FDI_TX_PLL_ENABLE) == 0) { | 1193 | I915_WRITE(fdi_rx_reg, temp | FDI_RX_PLL_ENABLE | |
1060 | I915_WRITE(fdi_tx_reg, temp | FDI_TX_PLL_ENABLE); | 1194 | FDI_SEL_PCDCLK | |
1061 | I915_READ(fdi_tx_reg); | 1195 | FDI_DP_PORT_WIDTH_X4); /* default 4 lanes */ |
1062 | udelay(100); | 1196 | I915_READ(fdi_rx_reg); |
1197 | udelay(200); | ||
1198 | |||
1199 | /* Enable CPU FDI TX PLL, always on for IGDNG */ | ||
1200 | temp = I915_READ(fdi_tx_reg); | ||
1201 | if ((temp & FDI_TX_PLL_ENABLE) == 0) { | ||
1202 | I915_WRITE(fdi_tx_reg, temp | FDI_TX_PLL_ENABLE); | ||
1203 | I915_READ(fdi_tx_reg); | ||
1204 | udelay(100); | ||
1205 | } | ||
1063 | } | 1206 | } |
1064 | 1207 | ||
1065 | /* Enable CPU pipe */ | 1208 | /* Enable CPU pipe */ |
@@ -1078,122 +1221,126 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
1078 | I915_WRITE(dspbase_reg, I915_READ(dspbase_reg)); | 1221 | I915_WRITE(dspbase_reg, I915_READ(dspbase_reg)); |
1079 | } | 1222 | } |
1080 | 1223 | ||
1081 | /* enable CPU FDI TX and PCH FDI RX */ | 1224 | if (!HAS_eDP) { |
1082 | temp = I915_READ(fdi_tx_reg); | 1225 | /* enable CPU FDI TX and PCH FDI RX */ |
1083 | temp |= FDI_TX_ENABLE; | 1226 | temp = I915_READ(fdi_tx_reg); |
1084 | temp |= FDI_DP_PORT_WIDTH_X4; /* default */ | 1227 | temp |= FDI_TX_ENABLE; |
1085 | temp &= ~FDI_LINK_TRAIN_NONE; | 1228 | temp |= FDI_DP_PORT_WIDTH_X4; /* default */ |
1086 | temp |= FDI_LINK_TRAIN_PATTERN_1; | 1229 | temp &= ~FDI_LINK_TRAIN_NONE; |
1087 | I915_WRITE(fdi_tx_reg, temp); | 1230 | temp |= FDI_LINK_TRAIN_PATTERN_1; |
1088 | I915_READ(fdi_tx_reg); | 1231 | I915_WRITE(fdi_tx_reg, temp); |
1232 | I915_READ(fdi_tx_reg); | ||
1089 | 1233 | ||
1090 | temp = I915_READ(fdi_rx_reg); | 1234 | temp = I915_READ(fdi_rx_reg); |
1091 | temp &= ~FDI_LINK_TRAIN_NONE; | 1235 | temp &= ~FDI_LINK_TRAIN_NONE; |
1092 | temp |= FDI_LINK_TRAIN_PATTERN_1; | 1236 | temp |= FDI_LINK_TRAIN_PATTERN_1; |
1093 | I915_WRITE(fdi_rx_reg, temp | FDI_RX_ENABLE); | 1237 | I915_WRITE(fdi_rx_reg, temp | FDI_RX_ENABLE); |
1094 | I915_READ(fdi_rx_reg); | 1238 | I915_READ(fdi_rx_reg); |
1095 | 1239 | ||
1096 | udelay(150); | 1240 | udelay(150); |
1097 | 1241 | ||
1098 | /* Train FDI. */ | 1242 | /* Train FDI. */ |
1099 | /* umask FDI RX Interrupt symbol_lock and bit_lock bit | 1243 | /* umask FDI RX Interrupt symbol_lock and bit_lock bit |
1100 | for train result */ | 1244 | for train result */ |
1101 | temp = I915_READ(fdi_rx_imr_reg); | 1245 | temp = I915_READ(fdi_rx_imr_reg); |
1102 | temp &= ~FDI_RX_SYMBOL_LOCK; | 1246 | temp &= ~FDI_RX_SYMBOL_LOCK; |
1103 | temp &= ~FDI_RX_BIT_LOCK; | 1247 | temp &= ~FDI_RX_BIT_LOCK; |
1104 | I915_WRITE(fdi_rx_imr_reg, temp); | 1248 | I915_WRITE(fdi_rx_imr_reg, temp); |
1105 | I915_READ(fdi_rx_imr_reg); | 1249 | I915_READ(fdi_rx_imr_reg); |
1106 | udelay(150); | 1250 | udelay(150); |
1107 | 1251 | ||
1108 | temp = I915_READ(fdi_rx_iir_reg); | 1252 | temp = I915_READ(fdi_rx_iir_reg); |
1109 | DRM_DEBUG("FDI_RX_IIR 0x%x\n", temp); | 1253 | DRM_DEBUG("FDI_RX_IIR 0x%x\n", temp); |
1110 | 1254 | ||
1111 | if ((temp & FDI_RX_BIT_LOCK) == 0) { | 1255 | if ((temp & FDI_RX_BIT_LOCK) == 0) { |
1112 | for (j = 0; j < tries; j++) { | 1256 | for (j = 0; j < tries; j++) { |
1113 | temp = I915_READ(fdi_rx_iir_reg); | 1257 | temp = I915_READ(fdi_rx_iir_reg); |
1114 | DRM_DEBUG("FDI_RX_IIR 0x%x\n", temp); | 1258 | DRM_DEBUG("FDI_RX_IIR 0x%x\n", temp); |
1115 | if (temp & FDI_RX_BIT_LOCK) | 1259 | if (temp & FDI_RX_BIT_LOCK) |
1116 | break; | 1260 | break; |
1117 | udelay(200); | 1261 | udelay(200); |
1118 | } | 1262 | } |
1119 | if (j != tries) | 1263 | if (j != tries) |
1264 | I915_WRITE(fdi_rx_iir_reg, | ||
1265 | temp | FDI_RX_BIT_LOCK); | ||
1266 | else | ||
1267 | DRM_DEBUG("train 1 fail\n"); | ||
1268 | } else { | ||
1120 | I915_WRITE(fdi_rx_iir_reg, | 1269 | I915_WRITE(fdi_rx_iir_reg, |
1121 | temp | FDI_RX_BIT_LOCK); | 1270 | temp | FDI_RX_BIT_LOCK); |
1122 | else | 1271 | DRM_DEBUG("train 1 ok 2!\n"); |
1123 | DRM_DEBUG("train 1 fail\n"); | 1272 | } |
1124 | } else { | 1273 | temp = I915_READ(fdi_tx_reg); |
1125 | I915_WRITE(fdi_rx_iir_reg, | 1274 | temp &= ~FDI_LINK_TRAIN_NONE; |
1126 | temp | FDI_RX_BIT_LOCK); | 1275 | temp |= FDI_LINK_TRAIN_PATTERN_2; |
1127 | DRM_DEBUG("train 1 ok 2!\n"); | 1276 | I915_WRITE(fdi_tx_reg, temp); |
1128 | } | 1277 | |
1129 | temp = I915_READ(fdi_tx_reg); | 1278 | temp = I915_READ(fdi_rx_reg); |
1130 | temp &= ~FDI_LINK_TRAIN_NONE; | 1279 | temp &= ~FDI_LINK_TRAIN_NONE; |
1131 | temp |= FDI_LINK_TRAIN_PATTERN_2; | 1280 | temp |= FDI_LINK_TRAIN_PATTERN_2; |
1132 | I915_WRITE(fdi_tx_reg, temp); | 1281 | I915_WRITE(fdi_rx_reg, temp); |
1133 | |||
1134 | temp = I915_READ(fdi_rx_reg); | ||
1135 | temp &= ~FDI_LINK_TRAIN_NONE; | ||
1136 | temp |= FDI_LINK_TRAIN_PATTERN_2; | ||
1137 | I915_WRITE(fdi_rx_reg, temp); | ||
1138 | 1282 | ||
1139 | udelay(150); | 1283 | udelay(150); |
1140 | 1284 | ||
1141 | temp = I915_READ(fdi_rx_iir_reg); | 1285 | temp = I915_READ(fdi_rx_iir_reg); |
1142 | DRM_DEBUG("FDI_RX_IIR 0x%x\n", temp); | 1286 | DRM_DEBUG("FDI_RX_IIR 0x%x\n", temp); |
1143 | 1287 | ||
1144 | if ((temp & FDI_RX_SYMBOL_LOCK) == 0) { | 1288 | if ((temp & FDI_RX_SYMBOL_LOCK) == 0) { |
1145 | for (j = 0; j < tries; j++) { | 1289 | for (j = 0; j < tries; j++) { |
1146 | temp = I915_READ(fdi_rx_iir_reg); | 1290 | temp = I915_READ(fdi_rx_iir_reg); |
1147 | DRM_DEBUG("FDI_RX_IIR 0x%x\n", temp); | 1291 | DRM_DEBUG("FDI_RX_IIR 0x%x\n", temp); |
1148 | if (temp & FDI_RX_SYMBOL_LOCK) | 1292 | if (temp & FDI_RX_SYMBOL_LOCK) |
1149 | break; | 1293 | break; |
1150 | udelay(200); | 1294 | udelay(200); |
1151 | } | 1295 | } |
1152 | if (j != tries) { | 1296 | if (j != tries) { |
1297 | I915_WRITE(fdi_rx_iir_reg, | ||
1298 | temp | FDI_RX_SYMBOL_LOCK); | ||
1299 | DRM_DEBUG("train 2 ok 1!\n"); | ||
1300 | } else | ||
1301 | DRM_DEBUG("train 2 fail\n"); | ||
1302 | } else { | ||
1153 | I915_WRITE(fdi_rx_iir_reg, | 1303 | I915_WRITE(fdi_rx_iir_reg, |
1154 | temp | FDI_RX_SYMBOL_LOCK); | 1304 | temp | FDI_RX_SYMBOL_LOCK); |
1155 | DRM_DEBUG("train 2 ok 1!\n"); | 1305 | DRM_DEBUG("train 2 ok 2!\n"); |
1156 | } else | 1306 | } |
1157 | DRM_DEBUG("train 2 fail\n"); | 1307 | DRM_DEBUG("train done\n"); |
1158 | } else { | ||
1159 | I915_WRITE(fdi_rx_iir_reg, temp | FDI_RX_SYMBOL_LOCK); | ||
1160 | DRM_DEBUG("train 2 ok 2!\n"); | ||
1161 | } | ||
1162 | DRM_DEBUG("train done\n"); | ||
1163 | 1308 | ||
1164 | /* set transcoder timing */ | 1309 | /* set transcoder timing */ |
1165 | I915_WRITE(trans_htot_reg, I915_READ(cpu_htot_reg)); | 1310 | I915_WRITE(trans_htot_reg, I915_READ(cpu_htot_reg)); |
1166 | I915_WRITE(trans_hblank_reg, I915_READ(cpu_hblank_reg)); | 1311 | I915_WRITE(trans_hblank_reg, I915_READ(cpu_hblank_reg)); |
1167 | I915_WRITE(trans_hsync_reg, I915_READ(cpu_hsync_reg)); | 1312 | I915_WRITE(trans_hsync_reg, I915_READ(cpu_hsync_reg)); |
1168 | 1313 | ||
1169 | I915_WRITE(trans_vtot_reg, I915_READ(cpu_vtot_reg)); | 1314 | I915_WRITE(trans_vtot_reg, I915_READ(cpu_vtot_reg)); |
1170 | I915_WRITE(trans_vblank_reg, I915_READ(cpu_vblank_reg)); | 1315 | I915_WRITE(trans_vblank_reg, I915_READ(cpu_vblank_reg)); |
1171 | I915_WRITE(trans_vsync_reg, I915_READ(cpu_vsync_reg)); | 1316 | I915_WRITE(trans_vsync_reg, I915_READ(cpu_vsync_reg)); |
1172 | 1317 | ||
1173 | /* enable PCH transcoder */ | 1318 | /* enable PCH transcoder */ |
1174 | temp = I915_READ(transconf_reg); | 1319 | temp = I915_READ(transconf_reg); |
1175 | I915_WRITE(transconf_reg, temp | TRANS_ENABLE); | 1320 | I915_WRITE(transconf_reg, temp | TRANS_ENABLE); |
1176 | I915_READ(transconf_reg); | 1321 | I915_READ(transconf_reg); |
1177 | 1322 | ||
1178 | while ((I915_READ(transconf_reg) & TRANS_STATE_ENABLE) == 0) | 1323 | while ((I915_READ(transconf_reg) & TRANS_STATE_ENABLE) == 0) |
1179 | ; | 1324 | ; |
1180 | 1325 | ||
1181 | /* enable normal */ | 1326 | /* enable normal */ |
1182 | 1327 | ||
1183 | temp = I915_READ(fdi_tx_reg); | 1328 | temp = I915_READ(fdi_tx_reg); |
1184 | temp &= ~FDI_LINK_TRAIN_NONE; | 1329 | temp &= ~FDI_LINK_TRAIN_NONE; |
1185 | I915_WRITE(fdi_tx_reg, temp | FDI_LINK_TRAIN_NONE | | 1330 | I915_WRITE(fdi_tx_reg, temp | FDI_LINK_TRAIN_NONE | |
1186 | FDI_TX_ENHANCE_FRAME_ENABLE); | 1331 | FDI_TX_ENHANCE_FRAME_ENABLE); |
1187 | I915_READ(fdi_tx_reg); | 1332 | I915_READ(fdi_tx_reg); |
1188 | 1333 | ||
1189 | temp = I915_READ(fdi_rx_reg); | 1334 | temp = I915_READ(fdi_rx_reg); |
1190 | temp &= ~FDI_LINK_TRAIN_NONE; | 1335 | temp &= ~FDI_LINK_TRAIN_NONE; |
1191 | I915_WRITE(fdi_rx_reg, temp | FDI_LINK_TRAIN_NONE | | 1336 | I915_WRITE(fdi_rx_reg, temp | FDI_LINK_TRAIN_NONE | |
1192 | FDI_RX_ENHANCE_FRAME_ENABLE); | 1337 | FDI_RX_ENHANCE_FRAME_ENABLE); |
1193 | I915_READ(fdi_rx_reg); | 1338 | I915_READ(fdi_rx_reg); |
1194 | 1339 | ||
1195 | /* wait one idle pattern time */ | 1340 | /* wait one idle pattern time */ |
1196 | udelay(100); | 1341 | udelay(100); |
1342 | |||
1343 | } | ||
1197 | 1344 | ||
1198 | intel_crtc_load_lut(crtc); | 1345 | intel_crtc_load_lut(crtc); |
1199 | 1346 | ||
@@ -1201,8 +1348,7 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
1201 | case DRM_MODE_DPMS_OFF: | 1348 | case DRM_MODE_DPMS_OFF: |
1202 | DRM_DEBUG("crtc %d dpms off\n", pipe); | 1349 | DRM_DEBUG("crtc %d dpms off\n", pipe); |
1203 | 1350 | ||
1204 | /* Disable the VGA plane that we never use */ | 1351 | i915_disable_vga(dev); |
1205 | I915_WRITE(CPU_VGACNTRL, VGA_DISP_DISABLE); | ||
1206 | 1352 | ||
1207 | /* Disable display plane */ | 1353 | /* Disable display plane */ |
1208 | temp = I915_READ(dspcntr_reg); | 1354 | temp = I915_READ(dspcntr_reg); |
@@ -1218,17 +1364,23 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
1218 | if ((temp & PIPEACONF_ENABLE) != 0) { | 1364 | if ((temp & PIPEACONF_ENABLE) != 0) { |
1219 | I915_WRITE(pipeconf_reg, temp & ~PIPEACONF_ENABLE); | 1365 | I915_WRITE(pipeconf_reg, temp & ~PIPEACONF_ENABLE); |
1220 | I915_READ(pipeconf_reg); | 1366 | I915_READ(pipeconf_reg); |
1367 | n = 0; | ||
1221 | /* wait for cpu pipe off, pipe state */ | 1368 | /* wait for cpu pipe off, pipe state */ |
1222 | while ((I915_READ(pipeconf_reg) & I965_PIPECONF_ACTIVE) != 0) | 1369 | while ((I915_READ(pipeconf_reg) & I965_PIPECONF_ACTIVE) != 0) { |
1223 | ; | 1370 | n++; |
1371 | if (n < 60) { | ||
1372 | udelay(500); | ||
1373 | continue; | ||
1374 | } else { | ||
1375 | DRM_DEBUG("pipe %d off delay\n", pipe); | ||
1376 | break; | ||
1377 | } | ||
1378 | } | ||
1224 | } else | 1379 | } else |
1225 | DRM_DEBUG("crtc %d is disabled\n", pipe); | 1380 | DRM_DEBUG("crtc %d is disabled\n", pipe); |
1226 | 1381 | ||
1227 | /* IGDNG-A : disable cpu panel fitter ? */ | 1382 | if (HAS_eDP) { |
1228 | temp = I915_READ(pf_ctl_reg); | 1383 | igdng_disable_pll_edp(crtc); |
1229 | if ((temp & PF_ENABLE) != 0) { | ||
1230 | I915_WRITE(pf_ctl_reg, temp & ~PF_ENABLE); | ||
1231 | I915_READ(pf_ctl_reg); | ||
1232 | } | 1384 | } |
1233 | 1385 | ||
1234 | /* disable CPU FDI tx and PCH FDI rx */ | 1386 | /* disable CPU FDI tx and PCH FDI rx */ |
@@ -1240,6 +1392,8 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
1240 | I915_WRITE(fdi_rx_reg, temp & ~FDI_RX_ENABLE); | 1392 | I915_WRITE(fdi_rx_reg, temp & ~FDI_RX_ENABLE); |
1241 | I915_READ(fdi_rx_reg); | 1393 | I915_READ(fdi_rx_reg); |
1242 | 1394 | ||
1395 | udelay(100); | ||
1396 | |||
1243 | /* still set train pattern 1 */ | 1397 | /* still set train pattern 1 */ |
1244 | temp = I915_READ(fdi_tx_reg); | 1398 | temp = I915_READ(fdi_tx_reg); |
1245 | temp &= ~FDI_LINK_TRAIN_NONE; | 1399 | temp &= ~FDI_LINK_TRAIN_NONE; |
@@ -1251,14 +1405,25 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
1251 | temp |= FDI_LINK_TRAIN_PATTERN_1; | 1405 | temp |= FDI_LINK_TRAIN_PATTERN_1; |
1252 | I915_WRITE(fdi_rx_reg, temp); | 1406 | I915_WRITE(fdi_rx_reg, temp); |
1253 | 1407 | ||
1408 | udelay(100); | ||
1409 | |||
1254 | /* disable PCH transcoder */ | 1410 | /* disable PCH transcoder */ |
1255 | temp = I915_READ(transconf_reg); | 1411 | temp = I915_READ(transconf_reg); |
1256 | if ((temp & TRANS_ENABLE) != 0) { | 1412 | if ((temp & TRANS_ENABLE) != 0) { |
1257 | I915_WRITE(transconf_reg, temp & ~TRANS_ENABLE); | 1413 | I915_WRITE(transconf_reg, temp & ~TRANS_ENABLE); |
1258 | I915_READ(transconf_reg); | 1414 | I915_READ(transconf_reg); |
1415 | n = 0; | ||
1259 | /* wait for PCH transcoder off, transcoder state */ | 1416 | /* wait for PCH transcoder off, transcoder state */ |
1260 | while ((I915_READ(transconf_reg) & TRANS_STATE_ENABLE) != 0) | 1417 | while ((I915_READ(transconf_reg) & TRANS_STATE_ENABLE) != 0) { |
1261 | ; | 1418 | n++; |
1419 | if (n < 60) { | ||
1420 | udelay(500); | ||
1421 | continue; | ||
1422 | } else { | ||
1423 | DRM_DEBUG("transcoder %d off delay\n", pipe); | ||
1424 | break; | ||
1425 | } | ||
1426 | } | ||
1262 | } | 1427 | } |
1263 | 1428 | ||
1264 | /* disable PCH DPLL */ | 1429 | /* disable PCH DPLL */ |
@@ -1276,6 +1441,22 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
1276 | I915_READ(fdi_rx_reg); | 1441 | I915_READ(fdi_rx_reg); |
1277 | } | 1442 | } |
1278 | 1443 | ||
1444 | /* Disable CPU FDI TX PLL */ | ||
1445 | temp = I915_READ(fdi_tx_reg); | ||
1446 | if ((temp & FDI_TX_PLL_ENABLE) != 0) { | ||
1447 | I915_WRITE(fdi_tx_reg, temp & ~FDI_TX_PLL_ENABLE); | ||
1448 | I915_READ(fdi_tx_reg); | ||
1449 | udelay(100); | ||
1450 | } | ||
1451 | |||
1452 | /* Disable PF */ | ||
1453 | temp = I915_READ(pf_ctl_reg); | ||
1454 | if ((temp & PF_ENABLE) != 0) { | ||
1455 | I915_WRITE(pf_ctl_reg, temp & ~PF_ENABLE); | ||
1456 | I915_READ(pf_ctl_reg); | ||
1457 | } | ||
1458 | I915_WRITE(pf_win_size, 0); | ||
1459 | |||
1279 | /* Wait for the clocks to turn off. */ | 1460 | /* Wait for the clocks to turn off. */ |
1280 | udelay(150); | 1461 | udelay(150); |
1281 | break; | 1462 | break; |
@@ -1335,13 +1516,15 @@ static void i9xx_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
1335 | 1516 | ||
1336 | /* Give the overlay scaler a chance to enable if it's on this pipe */ | 1517 | /* Give the overlay scaler a chance to enable if it's on this pipe */ |
1337 | //intel_crtc_dpms_video(crtc, true); TODO | 1518 | //intel_crtc_dpms_video(crtc, true); TODO |
1519 | intel_update_watermarks(dev); | ||
1338 | break; | 1520 | break; |
1339 | case DRM_MODE_DPMS_OFF: | 1521 | case DRM_MODE_DPMS_OFF: |
1522 | intel_update_watermarks(dev); | ||
1340 | /* Give the overlay scaler a chance to disable if it's on this pipe */ | 1523 | /* Give the overlay scaler a chance to disable if it's on this pipe */ |
1341 | //intel_crtc_dpms_video(crtc, FALSE); TODO | 1524 | //intel_crtc_dpms_video(crtc, FALSE); TODO |
1342 | 1525 | ||
1343 | /* Disable the VGA plane that we never use */ | 1526 | /* Disable the VGA plane that we never use */ |
1344 | I915_WRITE(VGACNTRL, VGA_DISP_DISABLE); | 1527 | i915_disable_vga(dev); |
1345 | 1528 | ||
1346 | /* Disable display plane */ | 1529 | /* Disable display plane */ |
1347 | temp = I915_READ(dspcntr_reg); | 1530 | temp = I915_READ(dspcntr_reg); |
@@ -1515,7 +1698,6 @@ static int intel_get_core_clock_speed(struct drm_device *dev) | |||
1515 | return 0; /* Silence gcc warning */ | 1698 | return 0; /* Silence gcc warning */ |
1516 | } | 1699 | } |
1517 | 1700 | ||
1518 | |||
1519 | /** | 1701 | /** |
1520 | * Return the pipe currently connected to the panel fitter, | 1702 | * Return the pipe currently connected to the panel fitter, |
1521 | * or -1 if the panel fitter is not present or not in use | 1703 | * or -1 if the panel fitter is not present or not in use |
@@ -1574,7 +1756,7 @@ igdng_compute_m_n(int bytes_per_pixel, int nlanes, | |||
1574 | 1756 | ||
1575 | temp = (u64) DATA_N * pixel_clock; | 1757 | temp = (u64) DATA_N * pixel_clock; |
1576 | temp = div_u64(temp, link_clock); | 1758 | temp = div_u64(temp, link_clock); |
1577 | m_n->gmch_m = (temp * bytes_per_pixel) / nlanes; | 1759 | m_n->gmch_m = div_u64(temp * bytes_per_pixel, nlanes); |
1578 | m_n->gmch_n = DATA_N; | 1760 | m_n->gmch_n = DATA_N; |
1579 | fdi_reduce_ratio(&m_n->gmch_m, &m_n->gmch_n); | 1761 | fdi_reduce_ratio(&m_n->gmch_m, &m_n->gmch_n); |
1580 | 1762 | ||
@@ -1585,6 +1767,464 @@ igdng_compute_m_n(int bytes_per_pixel, int nlanes, | |||
1585 | } | 1767 | } |
1586 | 1768 | ||
1587 | 1769 | ||
1770 | struct intel_watermark_params { | ||
1771 | unsigned long fifo_size; | ||
1772 | unsigned long max_wm; | ||
1773 | unsigned long default_wm; | ||
1774 | unsigned long guard_size; | ||
1775 | unsigned long cacheline_size; | ||
1776 | }; | ||
1777 | |||
1778 | /* IGD has different values for various configs */ | ||
1779 | static struct intel_watermark_params igd_display_wm = { | ||
1780 | IGD_DISPLAY_FIFO, | ||
1781 | IGD_MAX_WM, | ||
1782 | IGD_DFT_WM, | ||
1783 | IGD_GUARD_WM, | ||
1784 | IGD_FIFO_LINE_SIZE | ||
1785 | }; | ||
1786 | static struct intel_watermark_params igd_display_hplloff_wm = { | ||
1787 | IGD_DISPLAY_FIFO, | ||
1788 | IGD_MAX_WM, | ||
1789 | IGD_DFT_HPLLOFF_WM, | ||
1790 | IGD_GUARD_WM, | ||
1791 | IGD_FIFO_LINE_SIZE | ||
1792 | }; | ||
1793 | static struct intel_watermark_params igd_cursor_wm = { | ||
1794 | IGD_CURSOR_FIFO, | ||
1795 | IGD_CURSOR_MAX_WM, | ||
1796 | IGD_CURSOR_DFT_WM, | ||
1797 | IGD_CURSOR_GUARD_WM, | ||
1798 | IGD_FIFO_LINE_SIZE, | ||
1799 | }; | ||
1800 | static struct intel_watermark_params igd_cursor_hplloff_wm = { | ||
1801 | IGD_CURSOR_FIFO, | ||
1802 | IGD_CURSOR_MAX_WM, | ||
1803 | IGD_CURSOR_DFT_WM, | ||
1804 | IGD_CURSOR_GUARD_WM, | ||
1805 | IGD_FIFO_LINE_SIZE | ||
1806 | }; | ||
1807 | static struct intel_watermark_params i945_wm_info = { | ||
1808 | I945_FIFO_SIZE, | ||
1809 | I915_MAX_WM, | ||
1810 | 1, | ||
1811 | 2, | ||
1812 | I915_FIFO_LINE_SIZE | ||
1813 | }; | ||
1814 | static struct intel_watermark_params i915_wm_info = { | ||
1815 | I915_FIFO_SIZE, | ||
1816 | I915_MAX_WM, | ||
1817 | 1, | ||
1818 | 2, | ||
1819 | I915_FIFO_LINE_SIZE | ||
1820 | }; | ||
1821 | static struct intel_watermark_params i855_wm_info = { | ||
1822 | I855GM_FIFO_SIZE, | ||
1823 | I915_MAX_WM, | ||
1824 | 1, | ||
1825 | 2, | ||
1826 | I830_FIFO_LINE_SIZE | ||
1827 | }; | ||
1828 | static struct intel_watermark_params i830_wm_info = { | ||
1829 | I830_FIFO_SIZE, | ||
1830 | I915_MAX_WM, | ||
1831 | 1, | ||
1832 | 2, | ||
1833 | I830_FIFO_LINE_SIZE | ||
1834 | }; | ||
1835 | |||
1836 | /** | ||
1837 | * intel_calculate_wm - calculate watermark level | ||
1838 | * @clock_in_khz: pixel clock | ||
1839 | * @wm: chip FIFO params | ||
1840 | * @pixel_size: display pixel size | ||
1841 | * @latency_ns: memory latency for the platform | ||
1842 | * | ||
1843 | * Calculate the watermark level (the level at which the display plane will | ||
1844 | * start fetching from memory again). Each chip has a different display | ||
1845 | * FIFO size and allocation, so the caller needs to figure that out and pass | ||
1846 | * in the correct intel_watermark_params structure. | ||
1847 | * | ||
1848 | * As the pixel clock runs, the FIFO will be drained at a rate that depends | ||
1849 | * on the pixel size. When it reaches the watermark level, it'll start | ||
1850 | * fetching FIFO line sized based chunks from memory until the FIFO fills | ||
1851 | * past the watermark point. If the FIFO drains completely, a FIFO underrun | ||
1852 | * will occur, and a display engine hang could result. | ||
1853 | */ | ||
1854 | static unsigned long intel_calculate_wm(unsigned long clock_in_khz, | ||
1855 | struct intel_watermark_params *wm, | ||
1856 | int pixel_size, | ||
1857 | unsigned long latency_ns) | ||
1858 | { | ||
1859 | long entries_required, wm_size; | ||
1860 | |||
1861 | entries_required = (clock_in_khz * pixel_size * latency_ns) / 1000000; | ||
1862 | entries_required /= wm->cacheline_size; | ||
1863 | |||
1864 | DRM_DEBUG("FIFO entries required for mode: %d\n", entries_required); | ||
1865 | |||
1866 | wm_size = wm->fifo_size - (entries_required + wm->guard_size); | ||
1867 | |||
1868 | DRM_DEBUG("FIFO watermark level: %d\n", wm_size); | ||
1869 | |||
1870 | /* Don't promote wm_size to unsigned... */ | ||
1871 | if (wm_size > (long)wm->max_wm) | ||
1872 | wm_size = wm->max_wm; | ||
1873 | if (wm_size <= 0) | ||
1874 | wm_size = wm->default_wm; | ||
1875 | return wm_size; | ||
1876 | } | ||
1877 | |||
1878 | struct cxsr_latency { | ||
1879 | int is_desktop; | ||
1880 | unsigned long fsb_freq; | ||
1881 | unsigned long mem_freq; | ||
1882 | unsigned long display_sr; | ||
1883 | unsigned long display_hpll_disable; | ||
1884 | unsigned long cursor_sr; | ||
1885 | unsigned long cursor_hpll_disable; | ||
1886 | }; | ||
1887 | |||
1888 | static struct cxsr_latency cxsr_latency_table[] = { | ||
1889 | {1, 800, 400, 3382, 33382, 3983, 33983}, /* DDR2-400 SC */ | ||
1890 | {1, 800, 667, 3354, 33354, 3807, 33807}, /* DDR2-667 SC */ | ||
1891 | {1, 800, 800, 3347, 33347, 3763, 33763}, /* DDR2-800 SC */ | ||
1892 | |||
1893 | {1, 667, 400, 3400, 33400, 4021, 34021}, /* DDR2-400 SC */ | ||
1894 | {1, 667, 667, 3372, 33372, 3845, 33845}, /* DDR2-667 SC */ | ||
1895 | {1, 667, 800, 3386, 33386, 3822, 33822}, /* DDR2-800 SC */ | ||
1896 | |||
1897 | {1, 400, 400, 3472, 33472, 4173, 34173}, /* DDR2-400 SC */ | ||
1898 | {1, 400, 667, 3443, 33443, 3996, 33996}, /* DDR2-667 SC */ | ||
1899 | {1, 400, 800, 3430, 33430, 3946, 33946}, /* DDR2-800 SC */ | ||
1900 | |||
1901 | {0, 800, 400, 3438, 33438, 4065, 34065}, /* DDR2-400 SC */ | ||
1902 | {0, 800, 667, 3410, 33410, 3889, 33889}, /* DDR2-667 SC */ | ||
1903 | {0, 800, 800, 3403, 33403, 3845, 33845}, /* DDR2-800 SC */ | ||
1904 | |||
1905 | {0, 667, 400, 3456, 33456, 4103, 34106}, /* DDR2-400 SC */ | ||
1906 | {0, 667, 667, 3428, 33428, 3927, 33927}, /* DDR2-667 SC */ | ||
1907 | {0, 667, 800, 3443, 33443, 3905, 33905}, /* DDR2-800 SC */ | ||
1908 | |||
1909 | {0, 400, 400, 3528, 33528, 4255, 34255}, /* DDR2-400 SC */ | ||
1910 | {0, 400, 667, 3500, 33500, 4079, 34079}, /* DDR2-667 SC */ | ||
1911 | {0, 400, 800, 3487, 33487, 4029, 34029}, /* DDR2-800 SC */ | ||
1912 | }; | ||
1913 | |||
1914 | static struct cxsr_latency *intel_get_cxsr_latency(int is_desktop, int fsb, | ||
1915 | int mem) | ||
1916 | { | ||
1917 | int i; | ||
1918 | struct cxsr_latency *latency; | ||
1919 | |||
1920 | if (fsb == 0 || mem == 0) | ||
1921 | return NULL; | ||
1922 | |||
1923 | for (i = 0; i < ARRAY_SIZE(cxsr_latency_table); i++) { | ||
1924 | latency = &cxsr_latency_table[i]; | ||
1925 | if (is_desktop == latency->is_desktop && | ||
1926 | fsb == latency->fsb_freq && mem == latency->mem_freq) | ||
1927 | break; | ||
1928 | } | ||
1929 | if (i >= ARRAY_SIZE(cxsr_latency_table)) { | ||
1930 | DRM_DEBUG("Unknown FSB/MEM found, disable CxSR\n"); | ||
1931 | return NULL; | ||
1932 | } | ||
1933 | return latency; | ||
1934 | } | ||
1935 | |||
1936 | static void igd_disable_cxsr(struct drm_device *dev) | ||
1937 | { | ||
1938 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
1939 | u32 reg; | ||
1940 | |||
1941 | /* deactivate cxsr */ | ||
1942 | reg = I915_READ(DSPFW3); | ||
1943 | reg &= ~(IGD_SELF_REFRESH_EN); | ||
1944 | I915_WRITE(DSPFW3, reg); | ||
1945 | DRM_INFO("Big FIFO is disabled\n"); | ||
1946 | } | ||
1947 | |||
1948 | static void igd_enable_cxsr(struct drm_device *dev, unsigned long clock, | ||
1949 | int pixel_size) | ||
1950 | { | ||
1951 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
1952 | u32 reg; | ||
1953 | unsigned long wm; | ||
1954 | struct cxsr_latency *latency; | ||
1955 | |||
1956 | latency = intel_get_cxsr_latency(IS_IGDG(dev), dev_priv->fsb_freq, | ||
1957 | dev_priv->mem_freq); | ||
1958 | if (!latency) { | ||
1959 | DRM_DEBUG("Unknown FSB/MEM found, disable CxSR\n"); | ||
1960 | igd_disable_cxsr(dev); | ||
1961 | return; | ||
1962 | } | ||
1963 | |||
1964 | /* Display SR */ | ||
1965 | wm = intel_calculate_wm(clock, &igd_display_wm, pixel_size, | ||
1966 | latency->display_sr); | ||
1967 | reg = I915_READ(DSPFW1); | ||
1968 | reg &= 0x7fffff; | ||
1969 | reg |= wm << 23; | ||
1970 | I915_WRITE(DSPFW1, reg); | ||
1971 | DRM_DEBUG("DSPFW1 register is %x\n", reg); | ||
1972 | |||
1973 | /* cursor SR */ | ||
1974 | wm = intel_calculate_wm(clock, &igd_cursor_wm, pixel_size, | ||
1975 | latency->cursor_sr); | ||
1976 | reg = I915_READ(DSPFW3); | ||
1977 | reg &= ~(0x3f << 24); | ||
1978 | reg |= (wm & 0x3f) << 24; | ||
1979 | I915_WRITE(DSPFW3, reg); | ||
1980 | |||
1981 | /* Display HPLL off SR */ | ||
1982 | wm = intel_calculate_wm(clock, &igd_display_hplloff_wm, | ||
1983 | latency->display_hpll_disable, I915_FIFO_LINE_SIZE); | ||
1984 | reg = I915_READ(DSPFW3); | ||
1985 | reg &= 0xfffffe00; | ||
1986 | reg |= wm & 0x1ff; | ||
1987 | I915_WRITE(DSPFW3, reg); | ||
1988 | |||
1989 | /* cursor HPLL off SR */ | ||
1990 | wm = intel_calculate_wm(clock, &igd_cursor_hplloff_wm, pixel_size, | ||
1991 | latency->cursor_hpll_disable); | ||
1992 | reg = I915_READ(DSPFW3); | ||
1993 | reg &= ~(0x3f << 16); | ||
1994 | reg |= (wm & 0x3f) << 16; | ||
1995 | I915_WRITE(DSPFW3, reg); | ||
1996 | DRM_DEBUG("DSPFW3 register is %x\n", reg); | ||
1997 | |||
1998 | /* activate cxsr */ | ||
1999 | reg = I915_READ(DSPFW3); | ||
2000 | reg |= IGD_SELF_REFRESH_EN; | ||
2001 | I915_WRITE(DSPFW3, reg); | ||
2002 | |||
2003 | DRM_INFO("Big FIFO is enabled\n"); | ||
2004 | |||
2005 | return; | ||
2006 | } | ||
2007 | |||
2008 | const static int latency_ns = 3000; /* default for non-igd platforms */ | ||
2009 | |||
2010 | static int intel_get_fifo_size(struct drm_device *dev, int plane) | ||
2011 | { | ||
2012 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
2013 | uint32_t dsparb = I915_READ(DSPARB); | ||
2014 | int size; | ||
2015 | |||
2016 | if (IS_I9XX(dev)) { | ||
2017 | if (plane == 0) | ||
2018 | size = dsparb & 0x7f; | ||
2019 | else | ||
2020 | size = ((dsparb >> DSPARB_CSTART_SHIFT) & 0x7f) - | ||
2021 | (dsparb & 0x7f); | ||
2022 | } else if (IS_I85X(dev)) { | ||
2023 | if (plane == 0) | ||
2024 | size = dsparb & 0x1ff; | ||
2025 | else | ||
2026 | size = ((dsparb >> DSPARB_BEND_SHIFT) & 0x1ff) - | ||
2027 | (dsparb & 0x1ff); | ||
2028 | size >>= 1; /* Convert to cachelines */ | ||
2029 | } else if (IS_845G(dev)) { | ||
2030 | size = dsparb & 0x7f; | ||
2031 | size >>= 2; /* Convert to cachelines */ | ||
2032 | } else { | ||
2033 | size = dsparb & 0x7f; | ||
2034 | size >>= 1; /* Convert to cachelines */ | ||
2035 | } | ||
2036 | |||
2037 | DRM_DEBUG("FIFO size - (0x%08x) %s: %d\n", dsparb, plane ? "B" : "A", | ||
2038 | size); | ||
2039 | |||
2040 | return size; | ||
2041 | } | ||
2042 | |||
2043 | static void i965_update_wm(struct drm_device *dev) | ||
2044 | { | ||
2045 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
2046 | |||
2047 | DRM_DEBUG("Setting FIFO watermarks - A: 8, B: 8, C: 8, SR 8\n"); | ||
2048 | |||
2049 | /* 965 has limitations... */ | ||
2050 | I915_WRITE(DSPFW1, (8 << 16) | (8 << 8) | (8 << 0)); | ||
2051 | I915_WRITE(DSPFW2, (8 << 8) | (8 << 0)); | ||
2052 | } | ||
2053 | |||
2054 | static void i9xx_update_wm(struct drm_device *dev, int planea_clock, | ||
2055 | int planeb_clock, int sr_hdisplay, int pixel_size) | ||
2056 | { | ||
2057 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
2058 | uint32_t fwater_lo; | ||
2059 | uint32_t fwater_hi; | ||
2060 | int total_size, cacheline_size, cwm, srwm = 1; | ||
2061 | int planea_wm, planeb_wm; | ||
2062 | struct intel_watermark_params planea_params, planeb_params; | ||
2063 | unsigned long line_time_us; | ||
2064 | int sr_clock, sr_entries = 0; | ||
2065 | |||
2066 | /* Create copies of the base settings for each pipe */ | ||
2067 | if (IS_I965GM(dev) || IS_I945GM(dev)) | ||
2068 | planea_params = planeb_params = i945_wm_info; | ||
2069 | else if (IS_I9XX(dev)) | ||
2070 | planea_params = planeb_params = i915_wm_info; | ||
2071 | else | ||
2072 | planea_params = planeb_params = i855_wm_info; | ||
2073 | |||
2074 | /* Grab a couple of global values before we overwrite them */ | ||
2075 | total_size = planea_params.fifo_size; | ||
2076 | cacheline_size = planea_params.cacheline_size; | ||
2077 | |||
2078 | /* Update per-plane FIFO sizes */ | ||
2079 | planea_params.fifo_size = intel_get_fifo_size(dev, 0); | ||
2080 | planeb_params.fifo_size = intel_get_fifo_size(dev, 1); | ||
2081 | |||
2082 | planea_wm = intel_calculate_wm(planea_clock, &planea_params, | ||
2083 | pixel_size, latency_ns); | ||
2084 | planeb_wm = intel_calculate_wm(planeb_clock, &planeb_params, | ||
2085 | pixel_size, latency_ns); | ||
2086 | DRM_DEBUG("FIFO watermarks - A: %d, B: %d\n", planea_wm, planeb_wm); | ||
2087 | |||
2088 | /* | ||
2089 | * Overlay gets an aggressive default since video jitter is bad. | ||
2090 | */ | ||
2091 | cwm = 2; | ||
2092 | |||
2093 | /* Calc sr entries for one plane configs */ | ||
2094 | if (sr_hdisplay && (!planea_clock || !planeb_clock)) { | ||
2095 | /* self-refresh has much higher latency */ | ||
2096 | const static int sr_latency_ns = 6000; | ||
2097 | |||
2098 | sr_clock = planea_clock ? planea_clock : planeb_clock; | ||
2099 | line_time_us = ((sr_hdisplay * 1000) / sr_clock); | ||
2100 | |||
2101 | /* Use ns/us then divide to preserve precision */ | ||
2102 | sr_entries = (((sr_latency_ns / line_time_us) + 1) * | ||
2103 | pixel_size * sr_hdisplay) / 1000; | ||
2104 | sr_entries = roundup(sr_entries / cacheline_size, 1); | ||
2105 | DRM_DEBUG("self-refresh entries: %d\n", sr_entries); | ||
2106 | srwm = total_size - sr_entries; | ||
2107 | if (srwm < 0) | ||
2108 | srwm = 1; | ||
2109 | if (IS_I9XX(dev)) | ||
2110 | I915_WRITE(FW_BLC_SELF, (srwm & 0x3f)); | ||
2111 | } | ||
2112 | |||
2113 | DRM_DEBUG("Setting FIFO watermarks - A: %d, B: %d, C: %d, SR %d\n", | ||
2114 | planea_wm, planeb_wm, cwm, srwm); | ||
2115 | |||
2116 | fwater_lo = ((planeb_wm & 0x3f) << 16) | (planea_wm & 0x3f); | ||
2117 | fwater_hi = (cwm & 0x1f); | ||
2118 | |||
2119 | /* Set request length to 8 cachelines per fetch */ | ||
2120 | fwater_lo = fwater_lo | (1 << 24) | (1 << 8); | ||
2121 | fwater_hi = fwater_hi | (1 << 8); | ||
2122 | |||
2123 | I915_WRITE(FW_BLC, fwater_lo); | ||
2124 | I915_WRITE(FW_BLC2, fwater_hi); | ||
2125 | } | ||
2126 | |||
2127 | static void i830_update_wm(struct drm_device *dev, int planea_clock, | ||
2128 | int pixel_size) | ||
2129 | { | ||
2130 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
2131 | uint32_t fwater_lo = I915_READ(FW_BLC) & ~0xfff; | ||
2132 | int planea_wm; | ||
2133 | |||
2134 | i830_wm_info.fifo_size = intel_get_fifo_size(dev, 0); | ||
2135 | |||
2136 | planea_wm = intel_calculate_wm(planea_clock, &i830_wm_info, | ||
2137 | pixel_size, latency_ns); | ||
2138 | fwater_lo |= (3<<8) | planea_wm; | ||
2139 | |||
2140 | DRM_DEBUG("Setting FIFO watermarks - A: %d\n", planea_wm); | ||
2141 | |||
2142 | I915_WRITE(FW_BLC, fwater_lo); | ||
2143 | } | ||
2144 | |||
2145 | /** | ||
2146 | * intel_update_watermarks - update FIFO watermark values based on current modes | ||
2147 | * | ||
2148 | * Calculate watermark values for the various WM regs based on current mode | ||
2149 | * and plane configuration. | ||
2150 | * | ||
2151 | * There are several cases to deal with here: | ||
2152 | * - normal (i.e. non-self-refresh) | ||
2153 | * - self-refresh (SR) mode | ||
2154 | * - lines are large relative to FIFO size (buffer can hold up to 2) | ||
2155 | * - lines are small relative to FIFO size (buffer can hold more than 2 | ||
2156 | * lines), so need to account for TLB latency | ||
2157 | * | ||
2158 | * The normal calculation is: | ||
2159 | * watermark = dotclock * bytes per pixel * latency | ||
2160 | * where latency is platform & configuration dependent (we assume pessimal | ||
2161 | * values here). | ||
2162 | * | ||
2163 | * The SR calculation is: | ||
2164 | * watermark = (trunc(latency/line time)+1) * surface width * | ||
2165 | * bytes per pixel | ||
2166 | * where | ||
2167 | * line time = htotal / dotclock | ||
2168 | * and latency is assumed to be high, as above. | ||
2169 | * | ||
2170 | * The final value programmed to the register should always be rounded up, | ||
2171 | * and include an extra 2 entries to account for clock crossings. | ||
2172 | * | ||
2173 | * We don't use the sprite, so we can ignore that. And on Crestline we have | ||
2174 | * to set the non-SR watermarks to 8. | ||
2175 | */ | ||
2176 | static void intel_update_watermarks(struct drm_device *dev) | ||
2177 | { | ||
2178 | struct drm_crtc *crtc; | ||
2179 | struct intel_crtc *intel_crtc; | ||
2180 | int sr_hdisplay = 0; | ||
2181 | unsigned long planea_clock = 0, planeb_clock = 0, sr_clock = 0; | ||
2182 | int enabled = 0, pixel_size = 0; | ||
2183 | |||
2184 | if (DSPARB_HWCONTROL(dev)) | ||
2185 | return; | ||
2186 | |||
2187 | /* Get the clock config from both planes */ | ||
2188 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { | ||
2189 | intel_crtc = to_intel_crtc(crtc); | ||
2190 | if (crtc->enabled) { | ||
2191 | enabled++; | ||
2192 | if (intel_crtc->plane == 0) { | ||
2193 | DRM_DEBUG("plane A (pipe %d) clock: %d\n", | ||
2194 | intel_crtc->pipe, crtc->mode.clock); | ||
2195 | planea_clock = crtc->mode.clock; | ||
2196 | } else { | ||
2197 | DRM_DEBUG("plane B (pipe %d) clock: %d\n", | ||
2198 | intel_crtc->pipe, crtc->mode.clock); | ||
2199 | planeb_clock = crtc->mode.clock; | ||
2200 | } | ||
2201 | sr_hdisplay = crtc->mode.hdisplay; | ||
2202 | sr_clock = crtc->mode.clock; | ||
2203 | if (crtc->fb) | ||
2204 | pixel_size = crtc->fb->bits_per_pixel / 8; | ||
2205 | else | ||
2206 | pixel_size = 4; /* by default */ | ||
2207 | } | ||
2208 | } | ||
2209 | |||
2210 | if (enabled <= 0) | ||
2211 | return; | ||
2212 | |||
2213 | /* Single plane configs can enable self refresh */ | ||
2214 | if (enabled == 1 && IS_IGD(dev)) | ||
2215 | igd_enable_cxsr(dev, sr_clock, pixel_size); | ||
2216 | else if (IS_IGD(dev)) | ||
2217 | igd_disable_cxsr(dev); | ||
2218 | |||
2219 | if (IS_I965G(dev)) | ||
2220 | i965_update_wm(dev); | ||
2221 | else if (IS_I9XX(dev) || IS_MOBILE(dev)) | ||
2222 | i9xx_update_wm(dev, planea_clock, planeb_clock, sr_hdisplay, | ||
2223 | pixel_size); | ||
2224 | else | ||
2225 | i830_update_wm(dev, planea_clock, pixel_size); | ||
2226 | } | ||
2227 | |||
1588 | static int intel_crtc_mode_set(struct drm_crtc *crtc, | 2228 | static int intel_crtc_mode_set(struct drm_crtc *crtc, |
1589 | struct drm_display_mode *mode, | 2229 | struct drm_display_mode *mode, |
1590 | struct drm_display_mode *adjusted_mode, | 2230 | struct drm_display_mode *adjusted_mode, |
@@ -1614,6 +2254,7 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, | |||
1614 | u32 dpll = 0, fp = 0, dspcntr, pipeconf; | 2254 | u32 dpll = 0, fp = 0, dspcntr, pipeconf; |
1615 | bool ok, is_sdvo = false, is_dvo = false; | 2255 | bool ok, is_sdvo = false, is_dvo = false; |
1616 | bool is_crt = false, is_lvds = false, is_tv = false, is_dp = false; | 2256 | bool is_crt = false, is_lvds = false, is_tv = false, is_dp = false; |
2257 | bool is_edp = false; | ||
1617 | struct drm_mode_config *mode_config = &dev->mode_config; | 2258 | struct drm_mode_config *mode_config = &dev->mode_config; |
1618 | struct drm_connector *connector; | 2259 | struct drm_connector *connector; |
1619 | const intel_limit_t *limit; | 2260 | const intel_limit_t *limit; |
@@ -1629,6 +2270,7 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, | |||
1629 | int lvds_reg = LVDS; | 2270 | int lvds_reg = LVDS; |
1630 | u32 temp; | 2271 | u32 temp; |
1631 | int sdvo_pixel_multiply; | 2272 | int sdvo_pixel_multiply; |
2273 | int target_clock; | ||
1632 | 2274 | ||
1633 | drm_vblank_pre_modeset(dev, pipe); | 2275 | drm_vblank_pre_modeset(dev, pipe); |
1634 | 2276 | ||
@@ -1660,6 +2302,9 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, | |||
1660 | case INTEL_OUTPUT_DISPLAYPORT: | 2302 | case INTEL_OUTPUT_DISPLAYPORT: |
1661 | is_dp = true; | 2303 | is_dp = true; |
1662 | break; | 2304 | break; |
2305 | case INTEL_OUTPUT_EDP: | ||
2306 | is_edp = true; | ||
2307 | break; | ||
1663 | } | 2308 | } |
1664 | 2309 | ||
1665 | num_outputs++; | 2310 | num_outputs++; |
@@ -1711,11 +2356,29 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, | |||
1711 | } | 2356 | } |
1712 | 2357 | ||
1713 | /* FDI link */ | 2358 | /* FDI link */ |
1714 | if (IS_IGDNG(dev)) | 2359 | if (IS_IGDNG(dev)) { |
1715 | igdng_compute_m_n(3, 4, /* lane num 4 */ | 2360 | int lane, link_bw; |
1716 | adjusted_mode->clock, | 2361 | /* eDP doesn't require FDI link, so just set DP M/N |
1717 | 270000, /* lane clock */ | 2362 | according to current link config */ |
1718 | &m_n); | 2363 | if (is_edp) { |
2364 | struct drm_connector *edp; | ||
2365 | target_clock = mode->clock; | ||
2366 | edp = intel_pipe_get_output(crtc); | ||
2367 | intel_edp_link_config(to_intel_output(edp), | ||
2368 | &lane, &link_bw); | ||
2369 | } else { | ||
2370 | /* DP over FDI requires target mode clock | ||
2371 | instead of link clock */ | ||
2372 | if (is_dp) | ||
2373 | target_clock = mode->clock; | ||
2374 | else | ||
2375 | target_clock = adjusted_mode->clock; | ||
2376 | lane = 4; | ||
2377 | link_bw = 270000; | ||
2378 | } | ||
2379 | igdng_compute_m_n(3, lane, target_clock, | ||
2380 | link_bw, &m_n); | ||
2381 | } | ||
1719 | 2382 | ||
1720 | if (IS_IGD(dev)) | 2383 | if (IS_IGD(dev)) |
1721 | fp = (1 << clock.n) << 16 | clock.m1 << 8 | clock.m2; | 2384 | fp = (1 << clock.n) << 16 | clock.m1 << 8 | clock.m2; |
@@ -1836,29 +2499,15 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, | |||
1836 | dpll_reg = pch_dpll_reg; | 2499 | dpll_reg = pch_dpll_reg; |
1837 | } | 2500 | } |
1838 | 2501 | ||
1839 | if (dpll & DPLL_VCO_ENABLE) { | 2502 | if (is_edp) { |
2503 | igdng_disable_pll_edp(crtc); | ||
2504 | } else if ((dpll & DPLL_VCO_ENABLE)) { | ||
1840 | I915_WRITE(fp_reg, fp); | 2505 | I915_WRITE(fp_reg, fp); |
1841 | I915_WRITE(dpll_reg, dpll & ~DPLL_VCO_ENABLE); | 2506 | I915_WRITE(dpll_reg, dpll & ~DPLL_VCO_ENABLE); |
1842 | I915_READ(dpll_reg); | 2507 | I915_READ(dpll_reg); |
1843 | udelay(150); | 2508 | udelay(150); |
1844 | } | 2509 | } |
1845 | 2510 | ||
1846 | if (IS_IGDNG(dev)) { | ||
1847 | /* enable PCH clock reference source */ | ||
1848 | /* XXX need to change the setting for other outputs */ | ||
1849 | u32 temp; | ||
1850 | temp = I915_READ(PCH_DREF_CONTROL); | ||
1851 | temp &= ~DREF_NONSPREAD_SOURCE_MASK; | ||
1852 | temp |= DREF_NONSPREAD_CK505_ENABLE; | ||
1853 | temp &= ~DREF_SSC_SOURCE_MASK; | ||
1854 | temp |= DREF_SSC_SOURCE_ENABLE; | ||
1855 | temp &= ~DREF_SSC1_ENABLE; | ||
1856 | /* if no eDP, disable source output to CPU */ | ||
1857 | temp &= ~DREF_CPU_SOURCE_OUTPUT_MASK; | ||
1858 | temp |= DREF_CPU_SOURCE_OUTPUT_DISABLE; | ||
1859 | I915_WRITE(PCH_DREF_CONTROL, temp); | ||
1860 | } | ||
1861 | |||
1862 | /* The LVDS pin pair needs to be on before the DPLLs are enabled. | 2511 | /* The LVDS pin pair needs to be on before the DPLLs are enabled. |
1863 | * This is an exception to the general rule that mode_set doesn't turn | 2512 | * This is an exception to the general rule that mode_set doesn't turn |
1864 | * things on. | 2513 | * things on. |
@@ -1890,23 +2539,25 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, | |||
1890 | if (is_dp) | 2539 | if (is_dp) |
1891 | intel_dp_set_m_n(crtc, mode, adjusted_mode); | 2540 | intel_dp_set_m_n(crtc, mode, adjusted_mode); |
1892 | 2541 | ||
1893 | I915_WRITE(fp_reg, fp); | 2542 | if (!is_edp) { |
1894 | I915_WRITE(dpll_reg, dpll); | 2543 | I915_WRITE(fp_reg, fp); |
1895 | I915_READ(dpll_reg); | ||
1896 | /* Wait for the clocks to stabilize. */ | ||
1897 | udelay(150); | ||
1898 | |||
1899 | if (IS_I965G(dev) && !IS_IGDNG(dev)) { | ||
1900 | sdvo_pixel_multiply = adjusted_mode->clock / mode->clock; | ||
1901 | I915_WRITE(dpll_md_reg, (0 << DPLL_MD_UDI_DIVIDER_SHIFT) | | ||
1902 | ((sdvo_pixel_multiply - 1) << DPLL_MD_UDI_MULTIPLIER_SHIFT)); | ||
1903 | } else { | ||
1904 | /* write it again -- the BIOS does, after all */ | ||
1905 | I915_WRITE(dpll_reg, dpll); | 2544 | I915_WRITE(dpll_reg, dpll); |
2545 | I915_READ(dpll_reg); | ||
2546 | /* Wait for the clocks to stabilize. */ | ||
2547 | udelay(150); | ||
2548 | |||
2549 | if (IS_I965G(dev) && !IS_IGDNG(dev)) { | ||
2550 | sdvo_pixel_multiply = adjusted_mode->clock / mode->clock; | ||
2551 | I915_WRITE(dpll_md_reg, (0 << DPLL_MD_UDI_DIVIDER_SHIFT) | | ||
2552 | ((sdvo_pixel_multiply - 1) << DPLL_MD_UDI_MULTIPLIER_SHIFT)); | ||
2553 | } else { | ||
2554 | /* write it again -- the BIOS does, after all */ | ||
2555 | I915_WRITE(dpll_reg, dpll); | ||
2556 | } | ||
2557 | I915_READ(dpll_reg); | ||
2558 | /* Wait for the clocks to stabilize. */ | ||
2559 | udelay(150); | ||
1906 | } | 2560 | } |
1907 | I915_READ(dpll_reg); | ||
1908 | /* Wait for the clocks to stabilize. */ | ||
1909 | udelay(150); | ||
1910 | 2561 | ||
1911 | I915_WRITE(htot_reg, (adjusted_mode->crtc_hdisplay - 1) | | 2562 | I915_WRITE(htot_reg, (adjusted_mode->crtc_hdisplay - 1) | |
1912 | ((adjusted_mode->crtc_htotal - 1) << 16)); | 2563 | ((adjusted_mode->crtc_htotal - 1) << 16)); |
@@ -1936,10 +2587,14 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, | |||
1936 | I915_WRITE(link_m1_reg, m_n.link_m); | 2587 | I915_WRITE(link_m1_reg, m_n.link_m); |
1937 | I915_WRITE(link_n1_reg, m_n.link_n); | 2588 | I915_WRITE(link_n1_reg, m_n.link_n); |
1938 | 2589 | ||
1939 | /* enable FDI RX PLL too */ | 2590 | if (is_edp) { |
1940 | temp = I915_READ(fdi_rx_reg); | 2591 | igdng_set_pll_edp(crtc, adjusted_mode->clock); |
1941 | I915_WRITE(fdi_rx_reg, temp | FDI_RX_PLL_ENABLE); | 2592 | } else { |
1942 | udelay(200); | 2593 | /* enable FDI RX PLL too */ |
2594 | temp = I915_READ(fdi_rx_reg); | ||
2595 | I915_WRITE(fdi_rx_reg, temp | FDI_RX_PLL_ENABLE); | ||
2596 | udelay(200); | ||
2597 | } | ||
1943 | } | 2598 | } |
1944 | 2599 | ||
1945 | I915_WRITE(pipeconf_reg, pipeconf); | 2600 | I915_WRITE(pipeconf_reg, pipeconf); |
@@ -1951,6 +2606,9 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, | |||
1951 | 2606 | ||
1952 | /* Flush the plane changes */ | 2607 | /* Flush the plane changes */ |
1953 | ret = intel_pipe_set_base(crtc, x, y, old_fb); | 2608 | ret = intel_pipe_set_base(crtc, x, y, old_fb); |
2609 | |||
2610 | intel_update_watermarks(dev); | ||
2611 | |||
1954 | drm_vblank_post_modeset(dev, pipe); | 2612 | drm_vblank_post_modeset(dev, pipe); |
1955 | 2613 | ||
1956 | return ret; | 2614 | return ret; |
@@ -2439,6 +3097,7 @@ static void intel_crtc_init(struct drm_device *dev, int pipe) | |||
2439 | 3097 | ||
2440 | drm_mode_crtc_set_gamma_size(&intel_crtc->base, 256); | 3098 | drm_mode_crtc_set_gamma_size(&intel_crtc->base, 256); |
2441 | intel_crtc->pipe = pipe; | 3099 | intel_crtc->pipe = pipe; |
3100 | intel_crtc->plane = pipe; | ||
2442 | for (i = 0; i < 256; i++) { | 3101 | for (i = 0; i < 256; i++) { |
2443 | intel_crtc->lut_r[i] = i; | 3102 | intel_crtc->lut_r[i] = i; |
2444 | intel_crtc->lut_g[i] = i; | 3103 | intel_crtc->lut_g[i] = i; |
@@ -2533,12 +3192,17 @@ static void intel_setup_outputs(struct drm_device *dev) | |||
2533 | if (IS_IGDNG(dev)) { | 3192 | if (IS_IGDNG(dev)) { |
2534 | int found; | 3193 | int found; |
2535 | 3194 | ||
3195 | if (IS_MOBILE(dev) && (I915_READ(DP_A) & DP_DETECTED)) | ||
3196 | intel_dp_init(dev, DP_A); | ||
3197 | |||
2536 | if (I915_READ(HDMIB) & PORT_DETECTED) { | 3198 | if (I915_READ(HDMIB) & PORT_DETECTED) { |
2537 | /* check SDVOB */ | 3199 | /* check SDVOB */ |
2538 | /* found = intel_sdvo_init(dev, HDMIB); */ | 3200 | /* found = intel_sdvo_init(dev, HDMIB); */ |
2539 | found = 0; | 3201 | found = 0; |
2540 | if (!found) | 3202 | if (!found) |
2541 | intel_hdmi_init(dev, HDMIB); | 3203 | intel_hdmi_init(dev, HDMIB); |
3204 | if (!found && (I915_READ(PCH_DP_B) & DP_DETECTED)) | ||
3205 | intel_dp_init(dev, PCH_DP_B); | ||
2542 | } | 3206 | } |
2543 | 3207 | ||
2544 | if (I915_READ(HDMIC) & PORT_DETECTED) | 3208 | if (I915_READ(HDMIC) & PORT_DETECTED) |
@@ -2547,6 +3211,12 @@ static void intel_setup_outputs(struct drm_device *dev) | |||
2547 | if (I915_READ(HDMID) & PORT_DETECTED) | 3211 | if (I915_READ(HDMID) & PORT_DETECTED) |
2548 | intel_hdmi_init(dev, HDMID); | 3212 | intel_hdmi_init(dev, HDMID); |
2549 | 3213 | ||
3214 | if (I915_READ(PCH_DP_C) & DP_DETECTED) | ||
3215 | intel_dp_init(dev, PCH_DP_C); | ||
3216 | |||
3217 | if (I915_READ(PCH_DP_D) & DP_DETECTED) | ||
3218 | intel_dp_init(dev, PCH_DP_D); | ||
3219 | |||
2550 | } else if (IS_I9XX(dev)) { | 3220 | } else if (IS_I9XX(dev)) { |
2551 | int found; | 3221 | int found; |
2552 | u32 reg; | 3222 | u32 reg; |
@@ -2621,6 +3291,10 @@ static void intel_setup_outputs(struct drm_device *dev) | |||
2621 | (1 << 1)); | 3291 | (1 << 1)); |
2622 | clone_mask = (1 << INTEL_OUTPUT_DISPLAYPORT); | 3292 | clone_mask = (1 << INTEL_OUTPUT_DISPLAYPORT); |
2623 | break; | 3293 | break; |
3294 | case INTEL_OUTPUT_EDP: | ||
3295 | crtc_mask = (1 << 1); | ||
3296 | clone_mask = (1 << INTEL_OUTPUT_EDP); | ||
3297 | break; | ||
2624 | } | 3298 | } |
2625 | encoder->possible_crtcs = crtc_mask; | 3299 | encoder->possible_crtcs = crtc_mask; |
2626 | encoder->possible_clones = intel_connector_clones(dev, clone_mask); | 3300 | encoder->possible_clones = intel_connector_clones(dev, clone_mask); |
@@ -2730,6 +3404,9 @@ void intel_modeset_init(struct drm_device *dev) | |||
2730 | if (IS_I965G(dev)) { | 3404 | if (IS_I965G(dev)) { |
2731 | dev->mode_config.max_width = 8192; | 3405 | dev->mode_config.max_width = 8192; |
2732 | dev->mode_config.max_height = 8192; | 3406 | dev->mode_config.max_height = 8192; |
3407 | } else if (IS_I9XX(dev)) { | ||
3408 | dev->mode_config.max_width = 4096; | ||
3409 | dev->mode_config.max_height = 4096; | ||
2733 | } else { | 3410 | } else { |
2734 | dev->mode_config.max_width = 2048; | 3411 | dev->mode_config.max_width = 2048; |
2735 | dev->mode_config.max_height = 2048; | 3412 | dev->mode_config.max_height = 2048; |