diff options
author | Rodrigo Vivi <rodrigo.vivi@intel.com> | 2018-01-29 18:22:15 -0500 |
---|---|---|
committer | Rodrigo Vivi <rodrigo.vivi@intel.com> | 2018-01-30 13:24:14 -0500 |
commit | a324fcaca314cafccda77a68ef1f7f6a1355de2c (patch) | |
tree | 05a998521e9138e36ff84ac0505da5108c9133e0 | |
parent | 3f43031b169361fefe032c13ebf644d17f3d76d6 (diff) |
drm/i915/cnl: Add AUX-F support
On some Cannonlake SKUs we have a dedicated Aux for port F,
that is only the full split between port A and port E.
There is still no Aux E for Port E, as in previous platforms,
because port_E still means shared lanes with port A.
v2: Rebase.
v3: Add couple missed PORT_F cases on intel_dp.
v4: Rebase and fix commit message.
v5: Squash Imre's "drm/i915: Add missing AUX_F power well string"
v6: Rebase on top of display headers rework.
v7: s/IS_CANNONLAKE/IS_CNL_WITH_PORT_F (DK)
v8: Fix Aux bits for Port F (DK)
v9: Fix VBT definition of Port F (DK).
v10: Squash power well addition to this patch to avoid
warns as pointed by DK.
v11: Clean up squashed commit message. (David)
v12: Remove unnecessary handling for older platforms (DK)
Adding AUX_F to PG2 following other existent ones. (DK)
Cc: David Weinehall <david.weinehall@linux.intel.com>
Cc: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com>
Cc: Lucas De Marchi <lucas.demarchi@intel.com>
Cc: Imre Deak <imre.deak@intel.com>
Cc: Manasi Navare <manasi.d.navare@intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Reviewed-by: David Weinehall <david.weinehall@linux.intel.com>
Reviewed-by: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180129232223.766-2-rodrigo.vivi@intel.com
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_reg.h | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_runtime_pm.c | 22 |
6 files changed, 45 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 8b5c1a839655..d29f95d8999a 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -1255,6 +1255,7 @@ enum modeset_restore { | |||
1255 | #define DP_AUX_B 0x10 | 1255 | #define DP_AUX_B 0x10 |
1256 | #define DP_AUX_C 0x20 | 1256 | #define DP_AUX_C 0x20 |
1257 | #define DP_AUX_D 0x30 | 1257 | #define DP_AUX_D 0x30 |
1258 | #define DP_AUX_F 0x60 | ||
1258 | 1259 | ||
1259 | #define DDC_PIN_B 0x05 | 1260 | #define DDC_PIN_B 0x05 |
1260 | #define DDC_PIN_C 0x04 | 1261 | #define DDC_PIN_C 0x04 |
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 85c46a25265d..79fadb50ab69 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
@@ -2585,6 +2585,9 @@ gen8_de_irq_handler(struct drm_i915_private *dev_priv, u32 master_ctl) | |||
2585 | GEN9_AUX_CHANNEL_C | | 2585 | GEN9_AUX_CHANNEL_C | |
2586 | GEN9_AUX_CHANNEL_D; | 2586 | GEN9_AUX_CHANNEL_D; |
2587 | 2587 | ||
2588 | if (IS_CNL_WITH_PORT_F(dev_priv)) | ||
2589 | tmp_mask |= CNL_AUX_CHANNEL_F; | ||
2590 | |||
2588 | if (iir & tmp_mask) { | 2591 | if (iir & tmp_mask) { |
2589 | dp_aux_irq_handler(dev_priv); | 2592 | dp_aux_irq_handler(dev_priv); |
2590 | found = true; | 2593 | found = true; |
@@ -3617,6 +3620,9 @@ static void gen8_de_irq_postinstall(struct drm_i915_private *dev_priv) | |||
3617 | de_pipe_masked |= GEN8_DE_PIPE_IRQ_FAULT_ERRORS; | 3620 | de_pipe_masked |= GEN8_DE_PIPE_IRQ_FAULT_ERRORS; |
3618 | } | 3621 | } |
3619 | 3622 | ||
3623 | if (IS_CNL_WITH_PORT_F(dev_priv)) | ||
3624 | de_port_masked |= CNL_AUX_CHANNEL_F; | ||
3625 | |||
3620 | de_pipe_enables = de_pipe_masked | GEN8_PIPE_VBLANK | | 3626 | de_pipe_enables = de_pipe_masked | GEN8_PIPE_VBLANK | |
3621 | GEN8_PIPE_FIFO_UNDERRUN; | 3627 | GEN8_PIPE_FIFO_UNDERRUN; |
3622 | 3628 | ||
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index b06db954c79f..98b4d8357a4c 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
@@ -1312,6 +1312,7 @@ enum i915_power_well_id { | |||
1312 | CNL_DISP_PW_AUX_B = GLK_DISP_PW_AUX_B, | 1312 | CNL_DISP_PW_AUX_B = GLK_DISP_PW_AUX_B, |
1313 | CNL_DISP_PW_AUX_C = GLK_DISP_PW_AUX_C, | 1313 | CNL_DISP_PW_AUX_C = GLK_DISP_PW_AUX_C, |
1314 | CNL_DISP_PW_AUX_D, | 1314 | CNL_DISP_PW_AUX_D, |
1315 | CNL_DISP_PW_AUX_F, | ||
1315 | 1316 | ||
1316 | SKL_DISP_PW_1 = 14, | 1317 | SKL_DISP_PW_1 = 14, |
1317 | SKL_DISP_PW_2, | 1318 | SKL_DISP_PW_2, |
@@ -5283,6 +5284,13 @@ enum { | |||
5283 | #define _DPD_AUX_CH_DATA4 (dev_priv->info.display_mmio_offset + 0x64320) | 5284 | #define _DPD_AUX_CH_DATA4 (dev_priv->info.display_mmio_offset + 0x64320) |
5284 | #define _DPD_AUX_CH_DATA5 (dev_priv->info.display_mmio_offset + 0x64324) | 5285 | #define _DPD_AUX_CH_DATA5 (dev_priv->info.display_mmio_offset + 0x64324) |
5285 | 5286 | ||
5287 | #define _DPF_AUX_CH_CTL (dev_priv->info.display_mmio_offset + 0x64510) | ||
5288 | #define _DPF_AUX_CH_DATA1 (dev_priv->info.display_mmio_offset + 0x64514) | ||
5289 | #define _DPF_AUX_CH_DATA2 (dev_priv->info.display_mmio_offset + 0x64518) | ||
5290 | #define _DPF_AUX_CH_DATA3 (dev_priv->info.display_mmio_offset + 0x6451c) | ||
5291 | #define _DPF_AUX_CH_DATA4 (dev_priv->info.display_mmio_offset + 0x64520) | ||
5292 | #define _DPF_AUX_CH_DATA5 (dev_priv->info.display_mmio_offset + 0x64524) | ||
5293 | |||
5286 | #define DP_AUX_CH_CTL(port) _MMIO_PORT(port, _DPA_AUX_CH_CTL, _DPB_AUX_CH_CTL) | 5294 | #define DP_AUX_CH_CTL(port) _MMIO_PORT(port, _DPA_AUX_CH_CTL, _DPB_AUX_CH_CTL) |
5287 | #define DP_AUX_CH_DATA(port, i) _MMIO(_PORT(port, _DPA_AUX_CH_DATA1, _DPB_AUX_CH_DATA1) + (i) * 4) /* 5 registers */ | 5295 | #define DP_AUX_CH_DATA(port, i) _MMIO(_PORT(port, _DPA_AUX_CH_DATA1, _DPB_AUX_CH_DATA1) + (i) * 4) /* 5 registers */ |
5288 | 5296 | ||
@@ -6938,6 +6946,7 @@ enum { | |||
6938 | #define GEN8_DE_PORT_IMR _MMIO(0x44444) | 6946 | #define GEN8_DE_PORT_IMR _MMIO(0x44444) |
6939 | #define GEN8_DE_PORT_IIR _MMIO(0x44448) | 6947 | #define GEN8_DE_PORT_IIR _MMIO(0x44448) |
6940 | #define GEN8_DE_PORT_IER _MMIO(0x4444c) | 6948 | #define GEN8_DE_PORT_IER _MMIO(0x4444c) |
6949 | #define CNL_AUX_CHANNEL_F (1 << 28) | ||
6941 | #define GEN9_AUX_CHANNEL_D (1 << 27) | 6950 | #define GEN9_AUX_CHANNEL_D (1 << 27) |
6942 | #define GEN9_AUX_CHANNEL_C (1 << 26) | 6951 | #define GEN9_AUX_CHANNEL_C (1 << 26) |
6943 | #define GEN9_AUX_CHANNEL_B (1 << 25) | 6952 | #define GEN9_AUX_CHANNEL_B (1 << 25) |
diff --git a/drivers/gpu/drm/i915/intel_display.h b/drivers/gpu/drm/i915/intel_display.h index e47638931b51..30fa2041a45f 100644 --- a/drivers/gpu/drm/i915/intel_display.h +++ b/drivers/gpu/drm/i915/intel_display.h | |||
@@ -172,6 +172,7 @@ enum intel_display_power_domain { | |||
172 | POWER_DOMAIN_AUX_B, | 172 | POWER_DOMAIN_AUX_B, |
173 | POWER_DOMAIN_AUX_C, | 173 | POWER_DOMAIN_AUX_C, |
174 | POWER_DOMAIN_AUX_D, | 174 | POWER_DOMAIN_AUX_D, |
175 | POWER_DOMAIN_AUX_F, | ||
175 | POWER_DOMAIN_GMBUS, | 176 | POWER_DOMAIN_GMBUS, |
176 | POWER_DOMAIN_MODESET, | 177 | POWER_DOMAIN_MODESET, |
177 | POWER_DOMAIN_GT_IRQ, | 178 | POWER_DOMAIN_GT_IRQ, |
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 48342a85e500..ba0bbce742a5 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
@@ -1299,6 +1299,9 @@ static enum port intel_aux_port(struct drm_i915_private *dev_priv, | |||
1299 | case DP_AUX_D: | 1299 | case DP_AUX_D: |
1300 | aux_port = PORT_D; | 1300 | aux_port = PORT_D; |
1301 | break; | 1301 | break; |
1302 | case DP_AUX_F: | ||
1303 | aux_port = PORT_F; | ||
1304 | break; | ||
1302 | default: | 1305 | default: |
1303 | MISSING_CASE(info->alternate_aux_channel); | 1306 | MISSING_CASE(info->alternate_aux_channel); |
1304 | aux_port = PORT_A; | 1307 | aux_port = PORT_A; |
@@ -5998,6 +6001,9 @@ intel_dp_init_connector_port_info(struct intel_digital_port *intel_dig_port) | |||
5998 | /* FIXME: Check VBT for actual wiring of PORT E */ | 6001 | /* FIXME: Check VBT for actual wiring of PORT E */ |
5999 | intel_dp->aux_power_domain = POWER_DOMAIN_AUX_D; | 6002 | intel_dp->aux_power_domain = POWER_DOMAIN_AUX_D; |
6000 | break; | 6003 | break; |
6004 | case PORT_F: | ||
6005 | intel_dp->aux_power_domain = POWER_DOMAIN_AUX_F; | ||
6006 | break; | ||
6001 | default: | 6007 | default: |
6002 | MISSING_CASE(encoder->port); | 6008 | MISSING_CASE(encoder->port); |
6003 | } | 6009 | } |
diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c index 5b1aa4b9c72c..a274e930f045 100644 --- a/drivers/gpu/drm/i915/intel_runtime_pm.c +++ b/drivers/gpu/drm/i915/intel_runtime_pm.c | |||
@@ -124,6 +124,8 @@ intel_display_power_domain_str(enum intel_display_power_domain domain) | |||
124 | return "AUX_C"; | 124 | return "AUX_C"; |
125 | case POWER_DOMAIN_AUX_D: | 125 | case POWER_DOMAIN_AUX_D: |
126 | return "AUX_D"; | 126 | return "AUX_D"; |
127 | case POWER_DOMAIN_AUX_F: | ||
128 | return "AUX_F"; | ||
127 | case POWER_DOMAIN_GMBUS: | 129 | case POWER_DOMAIN_GMBUS: |
128 | return "GMBUS"; | 130 | return "GMBUS"; |
129 | case POWER_DOMAIN_INIT: | 131 | case POWER_DOMAIN_INIT: |
@@ -1828,6 +1830,7 @@ void intel_display_power_put(struct drm_i915_private *dev_priv, | |||
1828 | BIT_ULL(POWER_DOMAIN_AUX_B) | \ | 1830 | BIT_ULL(POWER_DOMAIN_AUX_B) | \ |
1829 | BIT_ULL(POWER_DOMAIN_AUX_C) | \ | 1831 | BIT_ULL(POWER_DOMAIN_AUX_C) | \ |
1830 | BIT_ULL(POWER_DOMAIN_AUX_D) | \ | 1832 | BIT_ULL(POWER_DOMAIN_AUX_D) | \ |
1833 | BIT_ULL(POWER_DOMAIN_AUX_F) | \ | ||
1831 | BIT_ULL(POWER_DOMAIN_AUDIO) | \ | 1834 | BIT_ULL(POWER_DOMAIN_AUDIO) | \ |
1832 | BIT_ULL(POWER_DOMAIN_VGA) | \ | 1835 | BIT_ULL(POWER_DOMAIN_VGA) | \ |
1833 | BIT_ULL(POWER_DOMAIN_INIT)) | 1836 | BIT_ULL(POWER_DOMAIN_INIT)) |
@@ -1855,6 +1858,9 @@ void intel_display_power_put(struct drm_i915_private *dev_priv, | |||
1855 | #define CNL_DISPLAY_AUX_D_POWER_DOMAINS ( \ | 1858 | #define CNL_DISPLAY_AUX_D_POWER_DOMAINS ( \ |
1856 | BIT_ULL(POWER_DOMAIN_AUX_D) | \ | 1859 | BIT_ULL(POWER_DOMAIN_AUX_D) | \ |
1857 | BIT_ULL(POWER_DOMAIN_INIT)) | 1860 | BIT_ULL(POWER_DOMAIN_INIT)) |
1861 | #define CNL_DISPLAY_AUX_F_POWER_DOMAINS ( \ | ||
1862 | BIT_ULL(POWER_DOMAIN_AUX_F) | \ | ||
1863 | BIT_ULL(POWER_DOMAIN_INIT)) | ||
1858 | #define CNL_DISPLAY_DC_OFF_POWER_DOMAINS ( \ | 1864 | #define CNL_DISPLAY_DC_OFF_POWER_DOMAINS ( \ |
1859 | CNL_DISPLAY_POWERWELL_2_POWER_DOMAINS | \ | 1865 | CNL_DISPLAY_POWERWELL_2_POWER_DOMAINS | \ |
1860 | BIT_ULL(POWER_DOMAIN_GT_IRQ) | \ | 1866 | BIT_ULL(POWER_DOMAIN_GT_IRQ) | \ |
@@ -2405,6 +2411,12 @@ static struct i915_power_well cnl_power_wells[] = { | |||
2405 | .ops = &hsw_power_well_ops, | 2411 | .ops = &hsw_power_well_ops, |
2406 | .id = SKL_DISP_PW_DDI_D, | 2412 | .id = SKL_DISP_PW_DDI_D, |
2407 | }, | 2413 | }, |
2414 | { | ||
2415 | .name = "AUX F", | ||
2416 | .domains = CNL_DISPLAY_AUX_F_POWER_DOMAINS, | ||
2417 | .ops = &hsw_power_well_ops, | ||
2418 | .id = CNL_DISP_PW_AUX_F, | ||
2419 | }, | ||
2408 | }; | 2420 | }; |
2409 | 2421 | ||
2410 | static int | 2422 | static int |
@@ -2520,6 +2532,16 @@ int intel_power_domains_init(struct drm_i915_private *dev_priv) | |||
2520 | set_power_wells(power_domains, skl_power_wells); | 2532 | set_power_wells(power_domains, skl_power_wells); |
2521 | } else if (IS_CANNONLAKE(dev_priv)) { | 2533 | } else if (IS_CANNONLAKE(dev_priv)) { |
2522 | set_power_wells(power_domains, cnl_power_wells); | 2534 | set_power_wells(power_domains, cnl_power_wells); |
2535 | |||
2536 | /* | ||
2537 | * Aux IO is getting enabled for all ports | ||
2538 | * regardless the presence or use. So, in order to avoid | ||
2539 | * timeouts, lets remove it from the list | ||
2540 | * for the SKUs without port F. | ||
2541 | */ | ||
2542 | if (!IS_CNL_WITH_PORT_F(dev_priv)) | ||
2543 | power_domains->power_well_count -= 1; | ||
2544 | |||
2523 | } else if (IS_BROXTON(dev_priv)) { | 2545 | } else if (IS_BROXTON(dev_priv)) { |
2524 | set_power_wells(power_domains, bxt_power_wells); | 2546 | set_power_wells(power_domains, bxt_power_wells); |
2525 | } else if (IS_GEMINILAKE(dev_priv)) { | 2547 | } else if (IS_GEMINILAKE(dev_priv)) { |