#define   GMBUS_PIN_DPB                5 /* SDVO, HDMIB */
 #define   GMBUS_PIN_DPD                6 /* HDMID */
 #define   GMBUS_PIN_RESERVED   7 /* 7 reserved */
+#define   GMBUS_PIN_1_BXT      1
+#define   GMBUS_PIN_2_BXT      2
+#define   GMBUS_PIN_3_BXT      3
 #define   GMBUS_NUM_PINS       7 /* including 0 */
 #define GMBUS1                 0x5104 /* command/status */
 #define   GMBUS_SW_CLR_INT     (1<<31)
 
 
        switch (port) {
        case PORT_B:
-               intel_hdmi->ddc_bus = GMBUS_PIN_DPB;
+               if (IS_BROXTON(dev_priv))
+                       intel_hdmi->ddc_bus = GMBUS_PIN_1_BXT;
+               else
+                       intel_hdmi->ddc_bus = GMBUS_PIN_DPB;
                intel_encoder->hpd_pin = HPD_PORT_B;
                break;
        case PORT_C:
-               intel_hdmi->ddc_bus = GMBUS_PIN_DPC;
+               if (IS_BROXTON(dev_priv))
+                       intel_hdmi->ddc_bus = GMBUS_PIN_2_BXT;
+               else
+                       intel_hdmi->ddc_bus = GMBUS_PIN_DPC;
                intel_encoder->hpd_pin = HPD_PORT_C;
                break;
        case PORT_D:
-               if (IS_CHERRYVIEW(dev))
+               if (WARN_ON(IS_BROXTON(dev_priv)))
+                       intel_hdmi->ddc_bus = GMBUS_PIN_DISABLED;
+               else if (IS_CHERRYVIEW(dev_priv))
                        intel_hdmi->ddc_bus = GMBUS_PIN_DPD_CHV;
                else
                        intel_hdmi->ddc_bus = GMBUS_PIN_DPD;
 
        [GMBUS_PIN_DPD] = { "dpd", GPIOF },
 };
 
+static const struct gmbus_pin gmbus_pins_bxt[] = {
+       [GMBUS_PIN_1_BXT] = { "dpb", PCH_GPIOB },
+       [GMBUS_PIN_2_BXT] = { "dpc", PCH_GPIOC },
+       [GMBUS_PIN_3_BXT] = { "misc", PCH_GPIOD },
+};
+
+/* pin is expected to be valid */
+static const struct gmbus_pin *get_gmbus_pin(struct drm_i915_private *dev_priv,
+                                            unsigned int pin)
+{
+       if (IS_BROXTON(dev_priv))
+               return &gmbus_pins_bxt[pin];
+       else
+               return &gmbus_pins[pin];
+}
+
 bool intel_gmbus_is_valid_pin(struct drm_i915_private *dev_priv,
                              unsigned int pin)
 {
-       return pin < ARRAY_SIZE(gmbus_pins) && gmbus_pins[pin].reg;
+       unsigned int size;
+
+       if (IS_BROXTON(dev_priv))
+               size = ARRAY_SIZE(gmbus_pins_bxt);
+       else
+               size = ARRAY_SIZE(gmbus_pins);
+
+       return pin < size && get_gmbus_pin(dev_priv, pin)->reg;
 }
 
 /* Intel GPIO access functions */
 
        algo = &bus->bit_algo;
 
-       bus->gpio_reg = dev_priv->gpio_mmio_base + gmbus_pins[pin].reg;
+       bus->gpio_reg = dev_priv->gpio_mmio_base +
+               get_gmbus_pin(dev_priv, pin)->reg;
 
        bus->adapter.algo_data = algo;
        algo->setsda = set_data;
                snprintf(bus->adapter.name,
                         sizeof(bus->adapter.name),
                         "i915 gmbus %s",
-                        gmbus_pins[pin].name);
+                        get_gmbus_pin(dev_priv, pin)->name);
 
                bus->adapter.dev.parent = &dev->pdev->dev;
                bus->dev_priv = dev_priv;