aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/i915_perf.c1
-rw-r--r--drivers/gpu/drm/i915/i915_reg.h1
-rw-r--r--drivers/gpu/drm/i915/intel_csr.c18
-rw-r--r--drivers/gpu/drm/i915/intel_display.c14
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h1
-rw-r--r--drivers/gpu/drm/i915/intel_dsi_vbt.c11
-rw-r--r--drivers/gpu/drm/i915/intel_sdvo.c58
-rw-r--r--drivers/gpu/drm/i915/intel_sdvo_regs.h3
8 files changed, 91 insertions, 16 deletions
diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c
index 39a4804091d7..dc4ce694c06a 100644
--- a/drivers/gpu/drm/i915/i915_perf.c
+++ b/drivers/gpu/drm/i915/i915_perf.c
@@ -3005,6 +3005,7 @@ static bool gen8_is_valid_mux_addr(struct drm_i915_private *dev_priv, u32 addr)
3005static bool gen10_is_valid_mux_addr(struct drm_i915_private *dev_priv, u32 addr) 3005static bool gen10_is_valid_mux_addr(struct drm_i915_private *dev_priv, u32 addr)
3006{ 3006{
3007 return gen8_is_valid_mux_addr(dev_priv, addr) || 3007 return gen8_is_valid_mux_addr(dev_priv, addr) ||
3008 addr == i915_mmio_reg_offset(GEN10_NOA_WRITE_HIGH) ||
3008 (addr >= i915_mmio_reg_offset(OA_PERFCNT3_LO) && 3009 (addr >= i915_mmio_reg_offset(OA_PERFCNT3_LO) &&
3009 addr <= i915_mmio_reg_offset(OA_PERFCNT4_HI)); 3010 addr <= i915_mmio_reg_offset(OA_PERFCNT4_HI));
3010} 3011}
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 2aa69d347ec4..13d6bd4e17b2 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -1062,6 +1062,7 @@ static inline bool i915_mmio_reg_valid(i915_reg_t reg)
1062 1062
1063#define NOA_DATA _MMIO(0x986C) 1063#define NOA_DATA _MMIO(0x986C)
1064#define NOA_WRITE _MMIO(0x9888) 1064#define NOA_WRITE _MMIO(0x9888)
1065#define GEN10_NOA_WRITE_HIGH _MMIO(0x9884)
1065 1066
1066#define _GEN7_PIPEA_DE_LOAD_SL 0x70068 1067#define _GEN7_PIPEA_DE_LOAD_SL 0x70068
1067#define _GEN7_PIPEB_DE_LOAD_SL 0x71068 1068#define _GEN7_PIPEB_DE_LOAD_SL 0x71068
diff --git a/drivers/gpu/drm/i915/intel_csr.c b/drivers/gpu/drm/i915/intel_csr.c
index f43c2a2563a5..96618af47088 100644
--- a/drivers/gpu/drm/i915/intel_csr.c
+++ b/drivers/gpu/drm/i915/intel_csr.c
@@ -303,10 +303,17 @@ static u32 *parse_csr_fw(struct drm_i915_private *dev_priv,
303 u32 dmc_offset = CSR_DEFAULT_FW_OFFSET, readcount = 0, nbytes; 303 u32 dmc_offset = CSR_DEFAULT_FW_OFFSET, readcount = 0, nbytes;
304 u32 i; 304 u32 i;
305 u32 *dmc_payload; 305 u32 *dmc_payload;
306 size_t fsize;
306 307
307 if (!fw) 308 if (!fw)
308 return NULL; 309 return NULL;
309 310
311 fsize = sizeof(struct intel_css_header) +
312 sizeof(struct intel_package_header) +
313 sizeof(struct intel_dmc_header);
314 if (fsize > fw->size)
315 goto error_truncated;
316
310 /* Extract CSS Header information*/ 317 /* Extract CSS Header information*/
311 css_header = (struct intel_css_header *)fw->data; 318 css_header = (struct intel_css_header *)fw->data;
312 if (sizeof(struct intel_css_header) != 319 if (sizeof(struct intel_css_header) !=
@@ -366,6 +373,9 @@ static u32 *parse_csr_fw(struct drm_i915_private *dev_priv,
366 /* Convert dmc_offset into number of bytes. By default it is in dwords*/ 373 /* Convert dmc_offset into number of bytes. By default it is in dwords*/
367 dmc_offset *= 4; 374 dmc_offset *= 4;
368 readcount += dmc_offset; 375 readcount += dmc_offset;
376 fsize += dmc_offset;
377 if (fsize > fw->size)
378 goto error_truncated;
369 379
370 /* Extract dmc_header information. */ 380 /* Extract dmc_header information. */
371 dmc_header = (struct intel_dmc_header *)&fw->data[readcount]; 381 dmc_header = (struct intel_dmc_header *)&fw->data[readcount];
@@ -397,6 +407,10 @@ static u32 *parse_csr_fw(struct drm_i915_private *dev_priv,
397 407
398 /* fw_size is in dwords, so multiplied by 4 to convert into bytes. */ 408 /* fw_size is in dwords, so multiplied by 4 to convert into bytes. */
399 nbytes = dmc_header->fw_size * 4; 409 nbytes = dmc_header->fw_size * 4;
410 fsize += nbytes;
411 if (fsize > fw->size)
412 goto error_truncated;
413
400 if (nbytes > csr->max_fw_size) { 414 if (nbytes > csr->max_fw_size) {
401 DRM_ERROR("DMC FW too big (%u bytes)\n", nbytes); 415 DRM_ERROR("DMC FW too big (%u bytes)\n", nbytes);
402 return NULL; 416 return NULL;
@@ -410,6 +424,10 @@ static u32 *parse_csr_fw(struct drm_i915_private *dev_priv,
410 } 424 }
411 425
412 return memcpy(dmc_payload, &fw->data[readcount], nbytes); 426 return memcpy(dmc_payload, &fw->data[readcount], nbytes);
427
428error_truncated:
429 DRM_ERROR("Truncated DMC firmware, rejecting.\n");
430 return NULL;
413} 431}
414 432
415static void intel_csr_runtime_pm_get(struct drm_i915_private *dev_priv) 433static void intel_csr_runtime_pm_get(struct drm_i915_private *dev_priv)
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 5098228f1302..b69440cf41ea 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -2432,10 +2432,14 @@ static unsigned int intel_fb_modifier_to_tiling(u64 fb_modifier)
2432 * main surface. 2432 * main surface.
2433 */ 2433 */
2434static const struct drm_format_info ccs_formats[] = { 2434static const struct drm_format_info ccs_formats[] = {
2435 { .format = DRM_FORMAT_XRGB8888, .depth = 24, .num_planes = 2, .cpp = { 4, 1, }, .hsub = 8, .vsub = 16, }, 2435 { .format = DRM_FORMAT_XRGB8888, .depth = 24, .num_planes = 2,
2436 { .format = DRM_FORMAT_XBGR8888, .depth = 24, .num_planes = 2, .cpp = { 4, 1, }, .hsub = 8, .vsub = 16, }, 2436 .cpp = { 4, 1, }, .hsub = 8, .vsub = 16, },
2437 { .format = DRM_FORMAT_ARGB8888, .depth = 32, .num_planes = 2, .cpp = { 4, 1, }, .hsub = 8, .vsub = 16, }, 2437 { .format = DRM_FORMAT_XBGR8888, .depth = 24, .num_planes = 2,
2438 { .format = DRM_FORMAT_ABGR8888, .depth = 32, .num_planes = 2, .cpp = { 4, 1, }, .hsub = 8, .vsub = 16, }, 2438 .cpp = { 4, 1, }, .hsub = 8, .vsub = 16, },
2439 { .format = DRM_FORMAT_ARGB8888, .depth = 32, .num_planes = 2,
2440 .cpp = { 4, 1, }, .hsub = 8, .vsub = 16, .has_alpha = true, },
2441 { .format = DRM_FORMAT_ABGR8888, .depth = 32, .num_planes = 2,
2442 .cpp = { 4, 1, }, .hsub = 8, .vsub = 16, .has_alpha = true, },
2439}; 2443};
2440 2444
2441static const struct drm_format_info * 2445static const struct drm_format_info *
@@ -11942,7 +11946,7 @@ encoder_retry:
11942 return 0; 11946 return 0;
11943} 11947}
11944 11948
11945static bool intel_fuzzy_clock_check(int clock1, int clock2) 11949bool intel_fuzzy_clock_check(int clock1, int clock2)
11946{ 11950{
11947 int diff; 11951 int diff;
11948 11952
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index a38b9cff5cd0..e85cd377a652 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -1742,6 +1742,7 @@ int vlv_force_pll_on(struct drm_i915_private *dev_priv, enum pipe pipe,
1742 const struct dpll *dpll); 1742 const struct dpll *dpll);
1743void vlv_force_pll_off(struct drm_i915_private *dev_priv, enum pipe pipe); 1743void vlv_force_pll_off(struct drm_i915_private *dev_priv, enum pipe pipe);
1744int lpt_get_iclkip(struct drm_i915_private *dev_priv); 1744int lpt_get_iclkip(struct drm_i915_private *dev_priv);
1745bool intel_fuzzy_clock_check(int clock1, int clock2);
1745 1746
1746/* modesetting asserts */ 1747/* modesetting asserts */
1747void assert_panel_unlocked(struct drm_i915_private *dev_priv, 1748void assert_panel_unlocked(struct drm_i915_private *dev_priv,
diff --git a/drivers/gpu/drm/i915/intel_dsi_vbt.c b/drivers/gpu/drm/i915/intel_dsi_vbt.c
index 3074448446bc..4b8e48db1843 100644
--- a/drivers/gpu/drm/i915/intel_dsi_vbt.c
+++ b/drivers/gpu/drm/i915/intel_dsi_vbt.c
@@ -853,6 +853,17 @@ bool intel_dsi_vbt_init(struct intel_dsi *intel_dsi, u16 panel_id)
853 if (mipi_config->target_burst_mode_freq) { 853 if (mipi_config->target_burst_mode_freq) {
854 u32 bitrate = intel_dsi_bitrate(intel_dsi); 854 u32 bitrate = intel_dsi_bitrate(intel_dsi);
855 855
856 /*
857 * Sometimes the VBT contains a slightly lower clock,
858 * then the bitrate we have calculated, in this case
859 * just replace it with the calculated bitrate.
860 */
861 if (mipi_config->target_burst_mode_freq < bitrate &&
862 intel_fuzzy_clock_check(
863 mipi_config->target_burst_mode_freq,
864 bitrate))
865 mipi_config->target_burst_mode_freq = bitrate;
866
856 if (mipi_config->target_burst_mode_freq < bitrate) { 867 if (mipi_config->target_burst_mode_freq < bitrate) {
857 DRM_ERROR("Burst mode freq is less than computed\n"); 868 DRM_ERROR("Burst mode freq is less than computed\n");
858 return false; 869 return false;
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
index 0e3d91d9ef13..9ecfba0a54a1 100644
--- a/drivers/gpu/drm/i915/intel_sdvo.c
+++ b/drivers/gpu/drm/i915/intel_sdvo.c
@@ -916,6 +916,13 @@ static bool intel_sdvo_set_colorimetry(struct intel_sdvo *intel_sdvo,
916 return intel_sdvo_set_value(intel_sdvo, SDVO_CMD_SET_COLORIMETRY, &mode, 1); 916 return intel_sdvo_set_value(intel_sdvo, SDVO_CMD_SET_COLORIMETRY, &mode, 1);
917} 917}
918 918
919static bool intel_sdvo_set_audio_state(struct intel_sdvo *intel_sdvo,
920 u8 audio_state)
921{
922 return intel_sdvo_set_value(intel_sdvo, SDVO_CMD_SET_AUDIO_STAT,
923 &audio_state, 1);
924}
925
919#if 0 926#if 0
920static void intel_sdvo_dump_hdmi_buf(struct intel_sdvo *intel_sdvo) 927static void intel_sdvo_dump_hdmi_buf(struct intel_sdvo *intel_sdvo)
921{ 928{
@@ -1487,11 +1494,6 @@ static void intel_sdvo_pre_enable(struct intel_encoder *intel_encoder,
1487 else 1494 else
1488 sdvox |= SDVO_PIPE_SEL(crtc->pipe); 1495 sdvox |= SDVO_PIPE_SEL(crtc->pipe);
1489 1496
1490 if (crtc_state->has_audio) {
1491 WARN_ON_ONCE(INTEL_GEN(dev_priv) < 4);
1492 sdvox |= SDVO_AUDIO_ENABLE;
1493 }
1494
1495 if (INTEL_GEN(dev_priv) >= 4) { 1497 if (INTEL_GEN(dev_priv) >= 4) {
1496 /* done in crtc_mode_set as the dpll_md reg must be written early */ 1498 /* done in crtc_mode_set as the dpll_md reg must be written early */
1497 } else if (IS_I945G(dev_priv) || IS_I945GM(dev_priv) || 1499 } else if (IS_I945G(dev_priv) || IS_I945GM(dev_priv) ||
@@ -1635,8 +1637,13 @@ static void intel_sdvo_get_config(struct intel_encoder *encoder,
1635 if (sdvox & HDMI_COLOR_RANGE_16_235) 1637 if (sdvox & HDMI_COLOR_RANGE_16_235)
1636 pipe_config->limited_color_range = true; 1638 pipe_config->limited_color_range = true;
1637 1639
1638 if (sdvox & SDVO_AUDIO_ENABLE) 1640 if (intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_AUDIO_STAT,
1639 pipe_config->has_audio = true; 1641 &val, 1)) {
1642 u8 mask = SDVO_AUDIO_ELD_VALID | SDVO_AUDIO_PRESENCE_DETECT;
1643
1644 if ((val & mask) == mask)
1645 pipe_config->has_audio = true;
1646 }
1640 1647
1641 if (intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_ENCODE, 1648 if (intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_ENCODE,
1642 &val, 1)) { 1649 &val, 1)) {
@@ -1647,6 +1654,32 @@ static void intel_sdvo_get_config(struct intel_encoder *encoder,
1647 intel_sdvo_get_avi_infoframe(intel_sdvo, pipe_config); 1654 intel_sdvo_get_avi_infoframe(intel_sdvo, pipe_config);
1648} 1655}
1649 1656
1657static void intel_sdvo_disable_audio(struct intel_sdvo *intel_sdvo)
1658{
1659 intel_sdvo_set_audio_state(intel_sdvo, 0);
1660}
1661
1662static void intel_sdvo_enable_audio(struct intel_sdvo *intel_sdvo,
1663 const struct intel_crtc_state *crtc_state,
1664 const struct drm_connector_state *conn_state)
1665{
1666 const struct drm_display_mode *adjusted_mode =
1667 &crtc_state->base.adjusted_mode;
1668 struct drm_connector *connector = conn_state->connector;
1669 u8 *eld = connector->eld;
1670
1671 eld[6] = drm_av_sync_delay(connector, adjusted_mode) / 2;
1672
1673 intel_sdvo_set_audio_state(intel_sdvo, 0);
1674
1675 intel_sdvo_write_infoframe(intel_sdvo, SDVO_HBUF_INDEX_ELD,
1676 SDVO_HBUF_TX_DISABLED,
1677 eld, drm_eld_size(eld));
1678
1679 intel_sdvo_set_audio_state(intel_sdvo, SDVO_AUDIO_ELD_VALID |
1680 SDVO_AUDIO_PRESENCE_DETECT);
1681}
1682
1650static void intel_disable_sdvo(struct intel_encoder *encoder, 1683static void intel_disable_sdvo(struct intel_encoder *encoder,
1651 const struct intel_crtc_state *old_crtc_state, 1684 const struct intel_crtc_state *old_crtc_state,
1652 const struct drm_connector_state *conn_state) 1685 const struct drm_connector_state *conn_state)
@@ -1656,6 +1689,9 @@ static void intel_disable_sdvo(struct intel_encoder *encoder,
1656 struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->base.crtc); 1689 struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->base.crtc);
1657 u32 temp; 1690 u32 temp;
1658 1691
1692 if (old_crtc_state->has_audio)
1693 intel_sdvo_disable_audio(intel_sdvo);
1694
1659 intel_sdvo_set_active_outputs(intel_sdvo, 0); 1695 intel_sdvo_set_active_outputs(intel_sdvo, 0);
1660 if (0) 1696 if (0)
1661 intel_sdvo_set_encoder_power_state(intel_sdvo, 1697 intel_sdvo_set_encoder_power_state(intel_sdvo,
@@ -1741,6 +1777,9 @@ static void intel_enable_sdvo(struct intel_encoder *encoder,
1741 intel_sdvo_set_encoder_power_state(intel_sdvo, 1777 intel_sdvo_set_encoder_power_state(intel_sdvo,
1742 DRM_MODE_DPMS_ON); 1778 DRM_MODE_DPMS_ON);
1743 intel_sdvo_set_active_outputs(intel_sdvo, intel_sdvo->attached_output); 1779 intel_sdvo_set_active_outputs(intel_sdvo, intel_sdvo->attached_output);
1780
1781 if (pipe_config->has_audio)
1782 intel_sdvo_enable_audio(intel_sdvo, pipe_config, conn_state);
1744} 1783}
1745 1784
1746static enum drm_mode_status 1785static enum drm_mode_status
@@ -2603,7 +2642,6 @@ static bool
2603intel_sdvo_dvi_init(struct intel_sdvo *intel_sdvo, int device) 2642intel_sdvo_dvi_init(struct intel_sdvo *intel_sdvo, int device)
2604{ 2643{
2605 struct drm_encoder *encoder = &intel_sdvo->base.base; 2644 struct drm_encoder *encoder = &intel_sdvo->base.base;
2606 struct drm_i915_private *dev_priv = to_i915(encoder->dev);
2607 struct drm_connector *connector; 2645 struct drm_connector *connector;
2608 struct intel_encoder *intel_encoder = to_intel_encoder(encoder); 2646 struct intel_encoder *intel_encoder = to_intel_encoder(encoder);
2609 struct intel_connector *intel_connector; 2647 struct intel_connector *intel_connector;
@@ -2640,9 +2678,7 @@ intel_sdvo_dvi_init(struct intel_sdvo *intel_sdvo, int device)
2640 encoder->encoder_type = DRM_MODE_ENCODER_TMDS; 2678 encoder->encoder_type = DRM_MODE_ENCODER_TMDS;
2641 connector->connector_type = DRM_MODE_CONNECTOR_DVID; 2679 connector->connector_type = DRM_MODE_CONNECTOR_DVID;
2642 2680
2643 /* gen3 doesn't do the hdmi bits in the SDVO register */ 2681 if (intel_sdvo_is_hdmi_connector(intel_sdvo, device)) {
2644 if (INTEL_GEN(dev_priv) >= 4 &&
2645 intel_sdvo_is_hdmi_connector(intel_sdvo, device)) {
2646 connector->connector_type = DRM_MODE_CONNECTOR_HDMIA; 2682 connector->connector_type = DRM_MODE_CONNECTOR_HDMIA;
2647 intel_sdvo_connector->is_hdmi = true; 2683 intel_sdvo_connector->is_hdmi = true;
2648 } 2684 }
diff --git a/drivers/gpu/drm/i915/intel_sdvo_regs.h b/drivers/gpu/drm/i915/intel_sdvo_regs.h
index db0ed499268a..e9ba3b047f93 100644
--- a/drivers/gpu/drm/i915/intel_sdvo_regs.h
+++ b/drivers/gpu/drm/i915/intel_sdvo_regs.h
@@ -707,6 +707,9 @@ struct intel_sdvo_enhancements_arg {
707#define SDVO_CMD_GET_AUDIO_ENCRYPT_PREFER 0x90 707#define SDVO_CMD_GET_AUDIO_ENCRYPT_PREFER 0x90
708#define SDVO_CMD_SET_AUDIO_STAT 0x91 708#define SDVO_CMD_SET_AUDIO_STAT 0x91
709#define SDVO_CMD_GET_AUDIO_STAT 0x92 709#define SDVO_CMD_GET_AUDIO_STAT 0x92
710 #define SDVO_AUDIO_ELD_VALID (1 << 0)
711 #define SDVO_AUDIO_PRESENCE_DETECT (1 << 1)
712 #define SDVO_AUDIO_CP_READY (1 << 2)
710#define SDVO_CMD_SET_HBUF_INDEX 0x93 713#define SDVO_CMD_SET_HBUF_INDEX 0x93
711 #define SDVO_HBUF_INDEX_ELD 0 714 #define SDVO_HBUF_INDEX_ELD 0
712 #define SDVO_HBUF_INDEX_AVI_IF 1 715 #define SDVO_HBUF_INDEX_AVI_IF 1