aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2016-10-11 13:52:46 -0400
committerVille Syrjälä <ville.syrjala@linux.intel.com>2016-10-21 08:43:40 -0400
commite4ab73a13291fc844c9e24d5c347bd95818544d2 (patch)
treec9e00d3aa7169c20d55c7f12d3bd35ef66adfcfa
parent8f7ce038f1178057733b7e765bf9160a2f9be14b (diff)
drm/i915: Respect alternate_ddc_pin for all DDI ports
The VBT provides the platform a way to mix and match the DDI ports vs. GMBUS pins. Currently we only trust the VBT for DDI E, which I suppose has no standard GMBUS pin assignment. However, there are machines out there that use a non-standard mapping for the other ports as well. Let's start trusting the VBT on this one for all ports on DDI platforms. I've structured the code such that other platforms could easily start using this as well, by simply filling in the ddi_port_info. IIRC there may be CHV system that might actually need this. v2: Include a commit message, include a debug message during init Cc: stable@vger.kernel.org Cc: Maarten Maathuis <madman2003@gmail.com> Tested-by: Maarten Maathuis <madman2003@gmail.com> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97877 Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1476208368-5710-3-git-send-email-ville.syrjala@linux.intel.com Reviewed-by: Jim Bride <jim.bride@linux.intel.com>
-rw-r--r--drivers/gpu/drm/i915/intel_hdmi.c84
1 files changed, 48 insertions, 36 deletions
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
index 501334242d38..af8715f31807 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -1800,6 +1800,50 @@ intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *c
1800 intel_hdmi->aspect_ratio = HDMI_PICTURE_ASPECT_NONE; 1800 intel_hdmi->aspect_ratio = HDMI_PICTURE_ASPECT_NONE;
1801} 1801}
1802 1802
1803static u8 intel_hdmi_ddc_pin(struct drm_i915_private *dev_priv,
1804 enum port port)
1805{
1806 const struct ddi_vbt_port_info *info =
1807 &dev_priv->vbt.ddi_port_info[port];
1808 u8 ddc_pin;
1809
1810 if (info->alternate_ddc_pin) {
1811 DRM_DEBUG_KMS("Using DDC pin 0x%x for port %c (VBT)\n",
1812 info->alternate_ddc_pin, port_name(port));
1813 return info->alternate_ddc_pin;
1814 }
1815
1816 switch (port) {
1817 case PORT_B:
1818 if (IS_BROXTON(dev_priv))
1819 ddc_pin = GMBUS_PIN_1_BXT;
1820 else
1821 ddc_pin = GMBUS_PIN_DPB;
1822 break;
1823 case PORT_C:
1824 if (IS_BROXTON(dev_priv))
1825 ddc_pin = GMBUS_PIN_2_BXT;
1826 else
1827 ddc_pin = GMBUS_PIN_DPC;
1828 break;
1829 case PORT_D:
1830 if (IS_CHERRYVIEW(dev_priv))
1831 ddc_pin = GMBUS_PIN_DPD_CHV;
1832 else
1833 ddc_pin = GMBUS_PIN_DPD;
1834 break;
1835 default:
1836 MISSING_CASE(port);
1837 ddc_pin = GMBUS_PIN_DPB;
1838 break;
1839 }
1840
1841 DRM_DEBUG_KMS("Using DDC pin 0x%x for port %c (platform default)\n",
1842 ddc_pin, port_name(port));
1843
1844 return ddc_pin;
1845}
1846
1803void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port, 1847void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
1804 struct intel_connector *intel_connector) 1848 struct intel_connector *intel_connector)
1805{ 1849{
@@ -1809,7 +1853,6 @@ void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
1809 struct drm_device *dev = intel_encoder->base.dev; 1853 struct drm_device *dev = intel_encoder->base.dev;
1810 struct drm_i915_private *dev_priv = to_i915(dev); 1854 struct drm_i915_private *dev_priv = to_i915(dev);
1811 enum port port = intel_dig_port->port; 1855 enum port port = intel_dig_port->port;
1812 uint8_t alternate_ddc_pin;
1813 1856
1814 DRM_DEBUG_KMS("Adding HDMI connector on port %c\n", 1857 DRM_DEBUG_KMS("Adding HDMI connector on port %c\n",
1815 port_name(port)); 1858 port_name(port));
@@ -1827,12 +1870,10 @@ void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
1827 connector->doublescan_allowed = 0; 1870 connector->doublescan_allowed = 0;
1828 connector->stereo_allowed = 1; 1871 connector->stereo_allowed = 1;
1829 1872
1873 intel_hdmi->ddc_bus = intel_hdmi_ddc_pin(dev_priv, port);
1874
1830 switch (port) { 1875 switch (port) {
1831 case PORT_B: 1876 case PORT_B:
1832 if (IS_BROXTON(dev_priv))
1833 intel_hdmi->ddc_bus = GMBUS_PIN_1_BXT;
1834 else
1835 intel_hdmi->ddc_bus = GMBUS_PIN_DPB;
1836 /* 1877 /*
1837 * On BXT A0/A1, sw needs to activate DDIA HPD logic and 1878 * On BXT A0/A1, sw needs to activate DDIA HPD logic and
1838 * interrupts to check the external panel connection. 1879 * interrupts to check the external panel connection.
@@ -1843,46 +1884,17 @@ void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
1843 intel_encoder->hpd_pin = HPD_PORT_B; 1884 intel_encoder->hpd_pin = HPD_PORT_B;
1844 break; 1885 break;
1845 case PORT_C: 1886 case PORT_C:
1846 if (IS_BROXTON(dev_priv))
1847 intel_hdmi->ddc_bus = GMBUS_PIN_2_BXT;
1848 else
1849 intel_hdmi->ddc_bus = GMBUS_PIN_DPC;
1850 intel_encoder->hpd_pin = HPD_PORT_C; 1887 intel_encoder->hpd_pin = HPD_PORT_C;
1851 break; 1888 break;
1852 case PORT_D: 1889 case PORT_D:
1853 if (WARN_ON(IS_BROXTON(dev_priv)))
1854 intel_hdmi->ddc_bus = GMBUS_PIN_DISABLED;
1855 else if (IS_CHERRYVIEW(dev_priv))
1856 intel_hdmi->ddc_bus = GMBUS_PIN_DPD_CHV;
1857 else
1858 intel_hdmi->ddc_bus = GMBUS_PIN_DPD;
1859 intel_encoder->hpd_pin = HPD_PORT_D; 1890 intel_encoder->hpd_pin = HPD_PORT_D;
1860 break; 1891 break;
1861 case PORT_E: 1892 case PORT_E:
1862 /* On SKL PORT E doesn't have seperate GMBUS pin
1863 * We rely on VBT to set a proper alternate GMBUS pin. */
1864 alternate_ddc_pin =
1865 dev_priv->vbt.ddi_port_info[PORT_E].alternate_ddc_pin;
1866 switch (alternate_ddc_pin) {
1867 case DDC_PIN_B:
1868 intel_hdmi->ddc_bus = GMBUS_PIN_DPB;
1869 break;
1870 case DDC_PIN_C:
1871 intel_hdmi->ddc_bus = GMBUS_PIN_DPC;
1872 break;
1873 case DDC_PIN_D:
1874 intel_hdmi->ddc_bus = GMBUS_PIN_DPD;
1875 break;
1876 default:
1877 MISSING_CASE(alternate_ddc_pin);
1878 }
1879 intel_encoder->hpd_pin = HPD_PORT_E; 1893 intel_encoder->hpd_pin = HPD_PORT_E;
1880 break; 1894 break;
1881 case PORT_A:
1882 intel_encoder->hpd_pin = HPD_PORT_A;
1883 /* Internal port only for eDP. */
1884 default: 1895 default:
1885 BUG(); 1896 MISSING_CASE(port);
1897 return;
1886 } 1898 }
1887 1899
1888 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) { 1900 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {