diff options
| -rw-r--r-- | drivers/gpu/drm/i915/i915_perf.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_reg.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_csr.c | 18 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 14 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_drv.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dsi_vbt.c | 11 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_sdvo.c | 58 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_sdvo_regs.h | 3 |
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) | |||
| 3005 | static bool gen10_is_valid_mux_addr(struct drm_i915_private *dev_priv, u32 addr) | 3005 | static 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 | |||
| 428 | error_truncated: | ||
| 429 | DRM_ERROR("Truncated DMC firmware, rejecting.\n"); | ||
| 430 | return NULL; | ||
| 413 | } | 431 | } |
| 414 | 432 | ||
| 415 | static void intel_csr_runtime_pm_get(struct drm_i915_private *dev_priv) | 433 | static 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 | */ |
| 2434 | static const struct drm_format_info ccs_formats[] = { | 2434 | static 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 | ||
| 2441 | static const struct drm_format_info * | 2445 | static const struct drm_format_info * |
| @@ -11942,7 +11946,7 @@ encoder_retry: | |||
| 11942 | return 0; | 11946 | return 0; |
| 11943 | } | 11947 | } |
| 11944 | 11948 | ||
| 11945 | static bool intel_fuzzy_clock_check(int clock1, int clock2) | 11949 | bool 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); |
| 1743 | void vlv_force_pll_off(struct drm_i915_private *dev_priv, enum pipe pipe); | 1743 | void vlv_force_pll_off(struct drm_i915_private *dev_priv, enum pipe pipe); |
| 1744 | int lpt_get_iclkip(struct drm_i915_private *dev_priv); | 1744 | int lpt_get_iclkip(struct drm_i915_private *dev_priv); |
| 1745 | bool intel_fuzzy_clock_check(int clock1, int clock2); | ||
| 1745 | 1746 | ||
| 1746 | /* modesetting asserts */ | 1747 | /* modesetting asserts */ |
| 1747 | void assert_panel_unlocked(struct drm_i915_private *dev_priv, | 1748 | void 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 | ||
| 919 | static 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 |
| 920 | static void intel_sdvo_dump_hdmi_buf(struct intel_sdvo *intel_sdvo) | 927 | static 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 | ||
| 1657 | static void intel_sdvo_disable_audio(struct intel_sdvo *intel_sdvo) | ||
| 1658 | { | ||
| 1659 | intel_sdvo_set_audio_state(intel_sdvo, 0); | ||
| 1660 | } | ||
| 1661 | |||
| 1662 | static 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 | |||
| 1650 | static void intel_disable_sdvo(struct intel_encoder *encoder, | 1683 | static 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 | ||
| 1746 | static enum drm_mode_status | 1785 | static enum drm_mode_status |
| @@ -2603,7 +2642,6 @@ static bool | |||
| 2603 | intel_sdvo_dvi_init(struct intel_sdvo *intel_sdvo, int device) | 2642 | intel_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 |
