From: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
To: Lucas De Marchi <lucas.demarchi@intel.com>
Cc: intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH v2 09/25] drm/i915/tgl: Add power well support
Date: Tue, 9 Jul 2019 18:53:11 +0300 [thread overview]
Message-ID: <20190709155311.GX5942@intel.com> (raw)
In-Reply-To: <20190708231629.9296-10-lucas.demarchi@intel.com>
On Mon, Jul 08, 2019 at 04:16:13PM -0700, Lucas De Marchi wrote:
> From: Imre Deak <imre.deak@intel.com>
>
> The patch adds the new power wells introduced by TGL (GEN 12) and
> maps these to existing/new power domains. The changes for GEN 12 wrt
> to GEN 11 are the following:
>
> - Transcoder#EDP removed from power well#1 (Transcoder#A used in
> low-power mode instead)
> - Transcoder#A is now backed by power well#1 instead of power well#3
> - The DDI#B/C combo PHY ports are now backed by power well#1 instead of
> power well#3
> - New power well#5 added for pipe#D functionality (TODO)
> - 2 additional TC ports (TC#5-6) backed by power well#3, 2 port
> specific IO power wells (only for the non-TBT modes) and 4 port
> specific AUX power wells (2-2 for TBT vs. non-TBT modes)
> - Power well#2 backs now VDSC/joining for pipe#A instead of VDSC for
> eDP and MIPI DSI (TODO)
>
> On TGL Port DDI#C changed to be a combo PHY (native DP/HDMI) and
> BSpec has renamed ports DDI#D-F to TC#4-6 respectively. Thus on ICL we
> have the following naming for ports:
>
> - Combo PHYs (native DP/HDMI):
> DDI#A-B
> - TBT/non-TBT (TC altmode, native DP/HDMI) PHYs:
> DDI#C-F
>
> Starting from GEN 12 we have the following naming for ports:
> - Combo PHYs (native DP/HDMI):
> DDI#A-C
> - TBT/non-TBT (TC altmode, native DP/HDMI) PHYs:
> DDI TC#1-6
>
> To save some space in the power domain enum the power domain naming in
> the driver reflects the above change, that is power domains TC#1-3 are
> added as aliases for DDI#D-F and new power domains are reserved for
> TC#4-6.
>
> v2 (Lucas):
> - Separate out the bits and definitions for TGL from the ICL ones.
> Fix use of TRANSCODER_EDP_VDSC, that is now the correct define since
> we don't define TRANSCODER_A_VDSC power domain to spare a one bit in
> the bitmask (suggested by Ville)
>
> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Cc: Anusha Srivatsa <anusha.srivatsa@intel.com>
> Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
> Cc: José Roberto de Souza <jose.souza@intel.com>
> Signed-off-by: Imre Deak <imre.deak@intel.com>
> Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
> ---
> .../drm/i915/display/intel_display_power.c | 480 +++++++++++++++++-
> .../drm/i915/display/intel_display_power.h | 26 +-
> drivers/gpu/drm/i915/i915_debugfs.c | 3 +-
> drivers/gpu/drm/i915/i915_reg.h | 18 +
> 4 files changed, 508 insertions(+), 19 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display_power.c b/drivers/gpu/drm/i915/display/intel_display_power.c
> index 7437fc71d289..c3f42169831f 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_power.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_power.c
> @@ -23,8 +23,11 @@ bool intel_display_power_well_is_enabled(struct drm_i915_private *dev_priv,
> enum i915_power_well_id power_well_id);
>
> const char *
> -intel_display_power_domain_str(enum intel_display_power_domain domain)
> +intel_display_power_domain_str(struct drm_i915_private *i915,
> + enum intel_display_power_domain domain)
> {
> + bool ddi_tc_ports = IS_GEN(i915, 12);
> +
> switch (domain) {
> case POWER_DOMAIN_DISPLAY_CORE:
> return "DISPLAY_CORE";
> @@ -61,11 +64,23 @@ intel_display_power_domain_str(enum intel_display_power_domain domain)
> case POWER_DOMAIN_PORT_DDI_C_LANES:
> return "PORT_DDI_C_LANES";
> case POWER_DOMAIN_PORT_DDI_D_LANES:
> - return "PORT_DDI_D_LANES";
> + BUILD_BUG_ON(POWER_DOMAIN_PORT_DDI_D_LANES !=
> + POWER_DOMAIN_PORT_DDI_TC1_LANES);
> + return ddi_tc_ports ? "PORT_DDI_TC1_LANES" : "PORT_DDI_D_LANES";
> case POWER_DOMAIN_PORT_DDI_E_LANES:
> - return "PORT_DDI_E_LANES";
> + BUILD_BUG_ON(POWER_DOMAIN_PORT_DDI_E_LANES !=
> + POWER_DOMAIN_PORT_DDI_TC2_LANES);
> + return ddi_tc_ports ? "PORT_DDI_TC2_LANES" : "PORT_DDI_E_LANES";
> case POWER_DOMAIN_PORT_DDI_F_LANES:
> - return "PORT_DDI_F_LANES";
> + BUILD_BUG_ON(POWER_DOMAIN_PORT_DDI_F_LANES !=
> + POWER_DOMAIN_PORT_DDI_TC3_LANES);
> + return ddi_tc_ports ? "PORT_DDI_TC3_LANES" : "PORT_DDI_F_LANES";
> + case POWER_DOMAIN_PORT_DDI_TC4_LANES:
> + return "PORT_DDI_TC4_LANES";
> + case POWER_DOMAIN_PORT_DDI_TC5_LANES:
> + return "PORT_DDI_TC5_LANES";
> + case POWER_DOMAIN_PORT_DDI_TC6_LANES:
> + return "PORT_DDI_TC6_LANES";
> case POWER_DOMAIN_PORT_DDI_A_IO:
> return "PORT_DDI_A_IO";
> case POWER_DOMAIN_PORT_DDI_B_IO:
> @@ -73,11 +88,23 @@ intel_display_power_domain_str(enum intel_display_power_domain domain)
> case POWER_DOMAIN_PORT_DDI_C_IO:
> return "PORT_DDI_C_IO";
> case POWER_DOMAIN_PORT_DDI_D_IO:
> - return "PORT_DDI_D_IO";
> + BUILD_BUG_ON(POWER_DOMAIN_PORT_DDI_D_IO !=
> + POWER_DOMAIN_PORT_DDI_TC1_IO);
> + return ddi_tc_ports ? "PORT_DDI_TC1_IO" : "PORT_DDI_D_IO";
> case POWER_DOMAIN_PORT_DDI_E_IO:
> - return "PORT_DDI_E_IO";
> + BUILD_BUG_ON(POWER_DOMAIN_PORT_DDI_E_IO !=
> + POWER_DOMAIN_PORT_DDI_TC2_IO);
> + return ddi_tc_ports ? "PORT_DDI_TC2_IO" : "PORT_DDI_E_IO";
> case POWER_DOMAIN_PORT_DDI_F_IO:
> - return "PORT_DDI_F_IO";
> + BUILD_BUG_ON(POWER_DOMAIN_PORT_DDI_F_IO !=
> + POWER_DOMAIN_PORT_DDI_TC3_IO);
> + return ddi_tc_ports ? "PORT_DDI_TC3_IO" : "PORT_DDI_F_IO";
> + case POWER_DOMAIN_PORT_DDI_TC4_IO:
> + return "PORT_DDI_TC4_IO";
> + case POWER_DOMAIN_PORT_DDI_TC5_IO:
> + return "PORT_DDI_TC5_IO";
> + case POWER_DOMAIN_PORT_DDI_TC6_IO:
> + return "PORT_DDI_TC6_IO";
> case POWER_DOMAIN_PORT_DSI:
> return "PORT_DSI";
> case POWER_DOMAIN_PORT_CRT:
> @@ -95,11 +122,20 @@ intel_display_power_domain_str(enum intel_display_power_domain domain)
> case POWER_DOMAIN_AUX_C:
> return "AUX_C";
> case POWER_DOMAIN_AUX_D:
> - return "AUX_D";
> + BUILD_BUG_ON(POWER_DOMAIN_AUX_D != POWER_DOMAIN_AUX_TC1);
> + return ddi_tc_ports ? "AUX_TC1" : "AUX_D";
> case POWER_DOMAIN_AUX_E:
> - return "AUX_E";
> + BUILD_BUG_ON(POWER_DOMAIN_AUX_E != POWER_DOMAIN_AUX_TC2);
> + return ddi_tc_ports ? "AUX_TC2" : "AUX_E";
> case POWER_DOMAIN_AUX_F:
> - return "AUX_F";
> + BUILD_BUG_ON(POWER_DOMAIN_AUX_F != POWER_DOMAIN_AUX_TC3);
> + return ddi_tc_ports ? "AUX_TC3" : "AUX_F";
> + case POWER_DOMAIN_AUX_TC4:
> + return "AUX_TC4";
> + case POWER_DOMAIN_AUX_TC5:
> + return "AUX_TC5";
> + case POWER_DOMAIN_AUX_TC6:
> + return "AUX_TC6";
> case POWER_DOMAIN_AUX_IO_A:
> return "AUX_IO_A";
> case POWER_DOMAIN_AUX_TBT1:
> @@ -110,6 +146,10 @@ intel_display_power_domain_str(enum intel_display_power_domain domain)
> return "AUX_TBT3";
> case POWER_DOMAIN_AUX_TBT4:
> return "AUX_TBT4";
> + case POWER_DOMAIN_AUX_TBT5:
> + return "AUX_TBT5";
> + case POWER_DOMAIN_AUX_TBT6:
> + return "AUX_TBT6";
> case POWER_DOMAIN_GMBUS:
> return "GMBUS";
> case POWER_DOMAIN_INIT:
> @@ -1664,12 +1704,15 @@ __async_put_domains_state_ok(struct i915_power_domains *power_domains)
> static void print_power_domains(struct i915_power_domains *power_domains,
> const char *prefix, u64 mask)
> {
> + struct drm_i915_private *i915 =
> + container_of(power_domains, struct drm_i915_private,
> + power_domains);
> enum intel_display_power_domain domain;
>
> DRM_DEBUG_DRIVER("%s (%lu):\n", prefix, hweight64(mask));
> for_each_power_domain(domain, mask)
> DRM_DEBUG_DRIVER("%s use_count %d\n",
> - intel_display_power_domain_str(domain),
> + intel_display_power_domain_str(i915, domain),
> power_domains->domain_use_count[domain]);
> }
>
> @@ -1839,7 +1882,7 @@ __intel_display_power_put_domain(struct drm_i915_private *dev_priv,
> {
> struct i915_power_domains *power_domains;
> struct i915_power_well *power_well;
> - const char *name = intel_display_power_domain_str(domain);
> + const char *name = intel_display_power_domain_str(dev_priv, domain);
>
> power_domains = &dev_priv->power_domains;
>
> @@ -2408,11 +2451,11 @@ void intel_display_power_put(struct drm_i915_private *dev_priv,
> * - DDI_A
> * - FBC
> */
> +/* TODO: TGL_PW_5_POWER_DOMAINS: PIPE_D */
> #define ICL_PW_4_POWER_DOMAINS ( \
> BIT_ULL(POWER_DOMAIN_PIPE_C) | \
> BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \
> BIT_ULL(POWER_DOMAIN_INIT))
> - /* VDSC/joining */
> #define ICL_PW_3_POWER_DOMAINS ( \
> ICL_PW_4_POWER_DOMAINS | \
> BIT_ULL(POWER_DOMAIN_PIPE_B) | \
> @@ -2448,16 +2491,17 @@ void intel_display_power_put(struct drm_i915_private *dev_priv,
> */
> #define ICL_PW_2_POWER_DOMAINS ( \
> ICL_PW_3_POWER_DOMAINS | \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_EDP_VDSC) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_EDP_VDSC) | \
> BIT_ULL(POWER_DOMAIN_INIT))
> /*
> * - KVMR (HW control)
> + * - GEN 11: eDP/DSI VDSC
> */
> #define ICL_DISPLAY_DC_OFF_POWER_DOMAINS ( \
> ICL_PW_2_POWER_DOMAINS | \
> BIT_ULL(POWER_DOMAIN_MODESET) | \
> BIT_ULL(POWER_DOMAIN_AUX_A) | \
> - BIT_ULL(POWER_DOMAIN_DPLL_DC_OFF) | \
> + BIT_ULL(POWER_DOMAIN_DPLL_DC_OFF) | \
> BIT_ULL(POWER_DOMAIN_INIT))
>
> #define ICL_DDI_IO_A_POWER_DOMAINS ( \
> @@ -2495,6 +2539,87 @@ void intel_display_power_put(struct drm_i915_private *dev_priv,
> #define ICL_AUX_TBT4_IO_POWER_DOMAINS ( \
> BIT_ULL(POWER_DOMAIN_AUX_TBT4))
>
> +#define TGL_PW_4_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PIPE_C) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define TGL_PW_3_POWER_DOMAINS ( \
> + TGL_PW_4_POWER_DOMAINS | \
> + BIT_ULL(POWER_DOMAIN_PIPE_B) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \
> + /* TODO: TRANSCODER_D */ \
> + BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_TC1_LANES) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_TC1_IO) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_TC2_LANES) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_TC2_IO) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_TC3_LANES) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_TC3_IO) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_TC4_LANES) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_TC4_IO) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_TC5_LANES) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_TC5_IO) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_TC6_LANES) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_TC6_IO) | \
The IO power stuff shouln't be here I guess. But I already discussed
that with Imre, and I believe we have the same issue on icl. So I
guess we can sort it out later for both platforms.
Patch lgtm
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> + BIT_ULL(POWER_DOMAIN_AUX_TC1) | \
> + BIT_ULL(POWER_DOMAIN_AUX_TC2) | \
> + BIT_ULL(POWER_DOMAIN_AUX_TC3) | \
> + BIT_ULL(POWER_DOMAIN_AUX_TC4) | \
> + BIT_ULL(POWER_DOMAIN_AUX_TC5) | \
> + BIT_ULL(POWER_DOMAIN_AUX_TC6) | \
> + BIT_ULL(POWER_DOMAIN_AUX_TBT1) | \
> + BIT_ULL(POWER_DOMAIN_AUX_TBT2) | \
> + BIT_ULL(POWER_DOMAIN_AUX_TBT3) | \
> + BIT_ULL(POWER_DOMAIN_AUX_TBT4) | \
> + BIT_ULL(POWER_DOMAIN_AUX_TBT5) | \
> + BIT_ULL(POWER_DOMAIN_AUX_TBT6) | \
> + BIT_ULL(POWER_DOMAIN_VGA) | \
> + BIT_ULL(POWER_DOMAIN_AUDIO) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define TGL_PW_2_POWER_DOMAINS ( \
> + TGL_PW_3_POWER_DOMAINS | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_EDP_VDSC) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define TGL_DISPLAY_DC_OFF_POWER_DOMAINS ( \
> + TGL_PW_2_POWER_DOMAINS | \
> + BIT_ULL(POWER_DOMAIN_MODESET) | \
> + BIT_ULL(POWER_DOMAIN_AUX_A) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define TGL_DDI_IO_TC1_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_TC1_IO))
> +#define TGL_DDI_IO_TC2_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_TC2_IO))
> +#define TGL_DDI_IO_TC3_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_TC3_IO))
> +#define TGL_DDI_IO_TC4_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_TC4_IO))
> +#define TGL_DDI_IO_TC5_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_TC5_IO))
> +#define TGL_DDI_IO_TC6_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_TC6_IO))
> +
> +#define TGL_AUX_TC1_IO_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_AUX_TC1))
> +#define TGL_AUX_TC2_IO_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_AUX_TC2))
> +#define TGL_AUX_TC3_IO_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_AUX_TC3))
> +#define TGL_AUX_TC4_IO_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_AUX_TC4))
> +#define TGL_AUX_TC5_IO_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_AUX_TC5))
> +#define TGL_AUX_TC6_IO_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_AUX_TC6))
> +#define TGL_AUX_TBT5_IO_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_AUX_TBT5))
> +#define TGL_AUX_TBT6_IO_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_AUX_TBT6))
> +
> static const struct i915_power_well_ops i9xx_always_on_power_well_ops = {
> .sync_hw = i9xx_power_well_sync_hw_noop,
> .enable = i9xx_always_on_power_well_noop,
> @@ -3452,6 +3577,324 @@ static const struct i915_power_well_desc icl_power_wells[] = {
> },
> };
>
> +static const struct i915_power_well_desc tgl_power_wells[] = {
> + {
> + .name = "always-on",
> + .always_on = true,
> + .domains = POWER_DOMAIN_MASK,
> + .ops = &i9xx_always_on_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + },
> + {
> + .name = "power well 1",
> + /* Handled by the DMC firmware */
> + .always_on = true,
> + .domains = 0,
> + .ops = &hsw_power_well_ops,
> + .id = SKL_DISP_PW_1,
> + {
> + .hsw.regs = &hsw_power_well_regs,
> + .hsw.idx = ICL_PW_CTL_IDX_PW_1,
> + .hsw.has_fuses = true,
> + },
> + },
> + {
> + .name = "DC off",
> + .domains = TGL_DISPLAY_DC_OFF_POWER_DOMAINS,
> + .ops = &gen9_dc_off_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + },
> + {
> + .name = "power well 2",
> + .domains = TGL_PW_2_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = SKL_DISP_PW_2,
> + {
> + .hsw.regs = &hsw_power_well_regs,
> + .hsw.idx = ICL_PW_CTL_IDX_PW_2,
> + .hsw.has_fuses = true,
> + },
> + },
> + {
> + .name = "power well 3",
> + .domains = TGL_PW_3_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.regs = &hsw_power_well_regs,
> + .hsw.idx = ICL_PW_CTL_IDX_PW_3,
> + .hsw.irq_pipe_mask = BIT(PIPE_B),
> + .hsw.has_vga = true,
> + .hsw.has_fuses = true,
> + },
> + },
> + {
> + .name = "DDI A IO",
> + .domains = ICL_DDI_IO_A_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.regs = &icl_ddi_power_well_regs,
> + .hsw.idx = ICL_PW_CTL_IDX_DDI_A,
> + }
> + },
> + {
> + .name = "DDI B IO",
> + .domains = ICL_DDI_IO_B_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.regs = &icl_ddi_power_well_regs,
> + .hsw.idx = ICL_PW_CTL_IDX_DDI_B,
> + }
> + },
> + {
> + .name = "DDI C IO",
> + .domains = ICL_DDI_IO_C_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.regs = &icl_ddi_power_well_regs,
> + .hsw.idx = ICL_PW_CTL_IDX_DDI_C,
> + }
> + },
> + {
> + .name = "DDI TC1 IO",
> + .domains = TGL_DDI_IO_TC1_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.regs = &icl_ddi_power_well_regs,
> + .hsw.idx = TGL_PW_CTL_IDX_DDI_TC1,
> + },
> + },
> + {
> + .name = "DDI TC2 IO",
> + .domains = TGL_DDI_IO_TC2_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.regs = &icl_ddi_power_well_regs,
> + .hsw.idx = TGL_PW_CTL_IDX_DDI_TC2,
> + },
> + },
> + {
> + .name = "DDI TC3 IO",
> + .domains = TGL_DDI_IO_TC3_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.regs = &icl_ddi_power_well_regs,
> + .hsw.idx = TGL_PW_CTL_IDX_DDI_TC3,
> + },
> + },
> + {
> + .name = "DDI TC4 IO",
> + .domains = TGL_DDI_IO_TC4_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.regs = &icl_ddi_power_well_regs,
> + .hsw.idx = TGL_PW_CTL_IDX_DDI_TC4,
> + },
> + },
> + {
> + .name = "DDI TC5 IO",
> + .domains = TGL_DDI_IO_TC5_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.regs = &icl_ddi_power_well_regs,
> + .hsw.idx = TGL_PW_CTL_IDX_DDI_TC5,
> + },
> + },
> + {
> + .name = "DDI TC6 IO",
> + .domains = TGL_DDI_IO_TC6_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.regs = &icl_ddi_power_well_regs,
> + .hsw.idx = TGL_PW_CTL_IDX_DDI_TC6,
> + },
> + },
> + {
> + .name = "AUX A",
> + .domains = ICL_AUX_A_IO_POWER_DOMAINS,
> + .ops = &icl_combo_phy_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.regs = &icl_aux_power_well_regs,
> + .hsw.idx = ICL_PW_CTL_IDX_AUX_A,
> + },
> + },
> + {
> + .name = "AUX B",
> + .domains = ICL_AUX_B_IO_POWER_DOMAINS,
> + .ops = &icl_combo_phy_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.regs = &icl_aux_power_well_regs,
> + .hsw.idx = ICL_PW_CTL_IDX_AUX_B,
> + },
> + },
> + {
> + .name = "AUX C",
> + .domains = ICL_AUX_C_IO_POWER_DOMAINS,
> + .ops = &icl_combo_phy_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.regs = &icl_aux_power_well_regs,
> + .hsw.idx = ICL_PW_CTL_IDX_AUX_C,
> + },
> + },
> + {
> + .name = "AUX TC1",
> + .domains = TGL_AUX_TC1_IO_POWER_DOMAINS,
> + .ops = &icl_tc_phy_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.regs = &icl_aux_power_well_regs,
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TC1,
> + .hsw.is_tc_tbt = false,
> + },
> + },
> + {
> + .name = "AUX TC2",
> + .domains = TGL_AUX_TC2_IO_POWER_DOMAINS,
> + .ops = &icl_tc_phy_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.regs = &icl_aux_power_well_regs,
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TC2,
> + .hsw.is_tc_tbt = false,
> + },
> + },
> + {
> + .name = "AUX TC3",
> + .domains = TGL_AUX_TC3_IO_POWER_DOMAINS,
> + .ops = &icl_tc_phy_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.regs = &icl_aux_power_well_regs,
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TC3,
> + .hsw.is_tc_tbt = false,
> + },
> + },
> + {
> + .name = "AUX TC4",
> + .domains = TGL_AUX_TC4_IO_POWER_DOMAINS,
> + .ops = &icl_tc_phy_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.regs = &icl_aux_power_well_regs,
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TC4,
> + .hsw.is_tc_tbt = false,
> + },
> + },
> + {
> + .name = "AUX TC5",
> + .domains = TGL_AUX_TC5_IO_POWER_DOMAINS,
> + .ops = &icl_tc_phy_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.regs = &icl_aux_power_well_regs,
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TC5,
> + .hsw.is_tc_tbt = false,
> + },
> + },
> + {
> + .name = "AUX TC6",
> + .domains = TGL_AUX_TC6_IO_POWER_DOMAINS,
> + .ops = &icl_tc_phy_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.regs = &icl_aux_power_well_regs,
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TC6,
> + .hsw.is_tc_tbt = false,
> + },
> + },
> + {
> + .name = "AUX TBT1",
> + .domains = ICL_AUX_TBT1_IO_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.regs = &icl_aux_power_well_regs,
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT1,
> + .hsw.is_tc_tbt = true,
> + },
> + },
> + {
> + .name = "AUX TBT2",
> + .domains = ICL_AUX_TBT2_IO_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.regs = &icl_aux_power_well_regs,
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT2,
> + .hsw.is_tc_tbt = true,
> + },
> + },
> + {
> + .name = "AUX TBT3",
> + .domains = ICL_AUX_TBT3_IO_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.regs = &icl_aux_power_well_regs,
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT3,
> + .hsw.is_tc_tbt = true,
> + },
> + },
> + {
> + .name = "AUX TBT4",
> + .domains = ICL_AUX_TBT4_IO_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.regs = &icl_aux_power_well_regs,
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT4,
> + .hsw.is_tc_tbt = true,
> + },
> + },
> + {
> + .name = "AUX TBT5",
> + .domains = TGL_AUX_TBT5_IO_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.regs = &icl_aux_power_well_regs,
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT5,
> + .hsw.is_tc_tbt = true,
> + },
> + },
> + {
> + .name = "AUX TBT6",
> + .domains = TGL_AUX_TBT6_IO_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.regs = &icl_aux_power_well_regs,
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT6,
> + .hsw.is_tc_tbt = true,
> + },
> + },
> + {
> + .name = "power well 4",
> + .domains = ICL_PW_4_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.regs = &hsw_power_well_regs,
> + .hsw.idx = ICL_PW_CTL_IDX_PW_4,
> + .hsw.has_fuses = true,
> + .hsw.irq_pipe_mask = BIT(PIPE_C),
> + }
> + },
> + /* TODO: power well 5 for pipe D */
> +};
> +
> static int
> sanitize_disable_power_well_option(const struct drm_i915_private *dev_priv,
> int disable_power_well)
> @@ -3579,7 +4022,9 @@ int intel_power_domains_init(struct drm_i915_private *dev_priv)
> * The enabling order will be from lower to higher indexed wells,
> * the disabling order is reversed.
> */
> - if (IS_GEN(dev_priv, 11)) {
> + if (IS_GEN(dev_priv, 12)) {
> + err = set_power_wells(power_domains, tgl_power_wells);
> + } else if (IS_GEN(dev_priv, 11)) {
> err = set_power_wells(power_domains, icl_power_wells);
> } else if (IS_CANNONLAKE(dev_priv)) {
> err = set_power_wells(power_domains, cnl_power_wells);
> @@ -4643,7 +5088,8 @@ static void intel_power_domains_dump_info(struct drm_i915_private *i915)
>
> for_each_power_domain(domain, power_well->desc->domains)
> DRM_DEBUG_DRIVER(" %-23s %d\n",
> - intel_display_power_domain_str(domain),
> + intel_display_power_domain_str(i915,
> + domain),
> power_domains->domain_use_count[domain]);
> }
> }
> diff --git a/drivers/gpu/drm/i915/display/intel_display_power.h b/drivers/gpu/drm/i915/display/intel_display_power.h
> index 8f43f7051a16..86afd70c1fb2 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_power.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_power.h
> @@ -32,14 +32,29 @@ enum intel_display_power_domain {
> POWER_DOMAIN_PORT_DDI_B_LANES,
> POWER_DOMAIN_PORT_DDI_C_LANES,
> POWER_DOMAIN_PORT_DDI_D_LANES,
> + POWER_DOMAIN_PORT_DDI_TC1_LANES = POWER_DOMAIN_PORT_DDI_D_LANES,
> POWER_DOMAIN_PORT_DDI_E_LANES,
> + POWER_DOMAIN_PORT_DDI_TC2_LANES = POWER_DOMAIN_PORT_DDI_E_LANES,
> POWER_DOMAIN_PORT_DDI_F_LANES,
> + POWER_DOMAIN_PORT_DDI_TC3_LANES = POWER_DOMAIN_PORT_DDI_F_LANES,
> + POWER_DOMAIN_PORT_DDI_TC4_LANES,
> + POWER_DOMAIN_PORT_DDI_TC5_LANES,
> + POWER_DOMAIN_PORT_DDI_TC6_LANES,
> POWER_DOMAIN_PORT_DDI_A_IO,
> POWER_DOMAIN_PORT_DDI_B_IO,
> POWER_DOMAIN_PORT_DDI_C_IO,
> POWER_DOMAIN_PORT_DDI_D_IO,
> + POWER_DOMAIN_PORT_DDI_TC1_IO = POWER_DOMAIN_PORT_DDI_D_IO,
> POWER_DOMAIN_PORT_DDI_E_IO,
> + POWER_DOMAIN_PORT_DDI_TC2_IO = POWER_DOMAIN_PORT_DDI_E_IO,
> POWER_DOMAIN_PORT_DDI_F_IO,
> + POWER_DOMAIN_PORT_DDI_TC3_IO = POWER_DOMAIN_PORT_DDI_F_IO,
> + POWER_DOMAIN_PORT_DDI_G_IO,
> + POWER_DOMAIN_PORT_DDI_TC4_IO = POWER_DOMAIN_PORT_DDI_G_IO,
> + POWER_DOMAIN_PORT_DDI_H_IO,
> + POWER_DOMAIN_PORT_DDI_TC5_IO = POWER_DOMAIN_PORT_DDI_H_IO,
> + POWER_DOMAIN_PORT_DDI_I_IO,
> + POWER_DOMAIN_PORT_DDI_TC6_IO = POWER_DOMAIN_PORT_DDI_I_IO,
> POWER_DOMAIN_PORT_DSI,
> POWER_DOMAIN_PORT_CRT,
> POWER_DOMAIN_PORT_OTHER,
> @@ -49,13 +64,21 @@ enum intel_display_power_domain {
> POWER_DOMAIN_AUX_B,
> POWER_DOMAIN_AUX_C,
> POWER_DOMAIN_AUX_D,
> + POWER_DOMAIN_AUX_TC1 = POWER_DOMAIN_AUX_D,
> POWER_DOMAIN_AUX_E,
> + POWER_DOMAIN_AUX_TC2 = POWER_DOMAIN_AUX_E,
> POWER_DOMAIN_AUX_F,
> + POWER_DOMAIN_AUX_TC3 = POWER_DOMAIN_AUX_F,
> + POWER_DOMAIN_AUX_TC4,
> + POWER_DOMAIN_AUX_TC5,
> + POWER_DOMAIN_AUX_TC6,
> POWER_DOMAIN_AUX_IO_A,
> POWER_DOMAIN_AUX_TBT1,
> POWER_DOMAIN_AUX_TBT2,
> POWER_DOMAIN_AUX_TBT3,
> POWER_DOMAIN_AUX_TBT4,
> + POWER_DOMAIN_AUX_TBT5,
> + POWER_DOMAIN_AUX_TBT6,
> POWER_DOMAIN_GMBUS,
> POWER_DOMAIN_MODESET,
> POWER_DOMAIN_GT_IRQ,
> @@ -228,7 +251,8 @@ void bxt_display_core_init(struct drm_i915_private *dev_priv, bool resume);
> void bxt_display_core_uninit(struct drm_i915_private *dev_priv);
>
> const char *
> -intel_display_power_domain_str(enum intel_display_power_domain domain);
> +intel_display_power_domain_str(struct drm_i915_private *i915,
> + enum intel_display_power_domain domain);
>
> bool intel_display_power_is_enabled(struct drm_i915_private *dev_priv,
> enum intel_display_power_domain domain);
> diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
> index 3e4f58f19362..4d59972e9689 100644
> --- a/drivers/gpu/drm/i915/i915_debugfs.c
> +++ b/drivers/gpu/drm/i915/i915_debugfs.c
> @@ -2472,7 +2472,8 @@ static int i915_power_domain_info(struct seq_file *m, void *unused)
>
> for_each_power_domain(power_domain, power_well->desc->domains)
> seq_printf(m, " %-23s %d\n",
> - intel_display_power_domain_str(power_domain),
> + intel_display_power_domain_str(dev_priv,
> + power_domain),
> power_domains->domain_use_count[power_domain]);
> }
>
> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> index 08dc71e4b818..f59cb5c45c34 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -9156,13 +9156,25 @@ enum {
> #define ICL_PWR_WELL_CTL_AUX1 _MMIO(0x45440)
> #define ICL_PWR_WELL_CTL_AUX2 _MMIO(0x45444)
> #define ICL_PWR_WELL_CTL_AUX4 _MMIO(0x4544C)
> +#define TGL_PW_CTL_IDX_AUX_TBT6 14
> +#define TGL_PW_CTL_IDX_AUX_TBT5 13
> +#define TGL_PW_CTL_IDX_AUX_TBT4 12
> #define ICL_PW_CTL_IDX_AUX_TBT4 11
> +#define TGL_PW_CTL_IDX_AUX_TBT3 11
> #define ICL_PW_CTL_IDX_AUX_TBT3 10
> +#define TGL_PW_CTL_IDX_AUX_TBT2 10
> #define ICL_PW_CTL_IDX_AUX_TBT2 9
> +#define TGL_PW_CTL_IDX_AUX_TBT1 9
> #define ICL_PW_CTL_IDX_AUX_TBT1 8
> +#define TGL_PW_CTL_IDX_AUX_TC6 8
> +#define TGL_PW_CTL_IDX_AUX_TC5 7
> +#define TGL_PW_CTL_IDX_AUX_TC4 6
> #define ICL_PW_CTL_IDX_AUX_F 5
> +#define TGL_PW_CTL_IDX_AUX_TC3 5
> #define ICL_PW_CTL_IDX_AUX_E 4
> +#define TGL_PW_CTL_IDX_AUX_TC2 4
> #define ICL_PW_CTL_IDX_AUX_D 3
> +#define TGL_PW_CTL_IDX_AUX_TC1 3
> #define ICL_PW_CTL_IDX_AUX_C 2
> #define ICL_PW_CTL_IDX_AUX_B 1
> #define ICL_PW_CTL_IDX_AUX_A 0
> @@ -9170,9 +9182,15 @@ enum {
> #define ICL_PWR_WELL_CTL_DDI1 _MMIO(0x45450)
> #define ICL_PWR_WELL_CTL_DDI2 _MMIO(0x45454)
> #define ICL_PWR_WELL_CTL_DDI4 _MMIO(0x4545C)
> +#define TGL_PW_CTL_IDX_DDI_TC6 8
> +#define TGL_PW_CTL_IDX_DDI_TC5 7
> +#define TGL_PW_CTL_IDX_DDI_TC4 6
> #define ICL_PW_CTL_IDX_DDI_F 5
> +#define TGL_PW_CTL_IDX_DDI_TC3 5
> #define ICL_PW_CTL_IDX_DDI_E 4
> +#define TGL_PW_CTL_IDX_DDI_TC2 4
> #define ICL_PW_CTL_IDX_DDI_D 3
> +#define TGL_PW_CTL_IDX_DDI_TC1 3
> #define ICL_PW_CTL_IDX_DDI_C 2
> #define ICL_PW_CTL_IDX_DDI_B 1
> #define ICL_PW_CTL_IDX_DDI_A 0
> --
> 2.21.0
--
Ville Syrjälä
Intel
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2019-07-09 15:53 UTC|newest]
Thread overview: 73+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-07-08 23:16 [PATCH v2 00/25] Initial support for Tiger Lake Lucas De Marchi
2019-07-08 23:16 ` [PATCH v2 01/25] drm/i915: Add 4th pipe and transcoder Lucas De Marchi
2019-07-08 23:16 ` [PATCH v2 02/25] drm/i915/tgl: add initial Tiger Lake definitions Lucas De Marchi
2019-07-08 23:16 ` [PATCH v2 03/25] drm/i915/tgl: Introduce Tiger Lake PCH Lucas De Marchi
2019-07-09 12:04 ` Rodrigo Vivi
2019-07-08 23:16 ` [PATCH v2 04/25] drm/i915/tgl: Add TGL PCH detection in virtualized environment Lucas De Marchi
2019-07-08 23:16 ` [PATCH v2 05/25] drm/i915/tgl: Add TGL PCI IDs Lucas De Marchi
2019-07-09 11:52 ` Rodrigo Vivi
2019-07-09 12:26 ` Kahola, Mika
2019-07-08 23:16 ` [PATCH v2 06/25] x86/gpu: add TGL stolen memory support Lucas De Marchi
2019-07-08 23:16 ` [PATCH v2 07/25] drm/i915/tgl: Check if pipe D is fused Lucas De Marchi
2019-07-09 12:39 ` Kahola, Mika
2019-07-08 23:16 ` [PATCH v2 08/25] drm/i915/tgl: use TRANSCODER_EDP_VDSC on transcoder A Lucas De Marchi
2019-07-09 1:07 ` Souza, Jose
2019-07-09 16:01 ` Lucas De Marchi
2019-07-09 20:00 ` Manasi Navare
2019-07-10 19:49 ` [PATCH] drm/i915/tgl: rename TRANSCODER_EDP_VDSC to use " Lucas De Marchi
2019-07-10 23:40 ` Souza, Jose
2019-07-08 23:16 ` [PATCH v2 09/25] drm/i915/tgl: Add power well support Lucas De Marchi
2019-07-09 15:53 ` Ville Syrjälä [this message]
2019-07-10 19:54 ` [PATCH v3] " Lucas De Marchi
2019-07-08 23:16 ` [PATCH v2 10/25] drm/i915/tgl: Add power well to support 4th pipe Lucas De Marchi
2019-07-09 11:57 ` Rodrigo Vivi
2019-07-09 16:20 ` Lucas De Marchi
2019-07-10 11:04 ` Rodrigo Vivi
2019-07-10 16:02 ` Lucas De Marchi
2019-07-10 16:42 ` Rodrigo Vivi
2019-07-10 19:58 ` [PATCH v2] " Lucas De Marchi
2019-07-08 23:16 ` [PATCH v2 11/25] drm/i915/tgl: Add new pll ids Lucas De Marchi
2019-07-08 23:16 ` [PATCH v2 12/25] drm/i915/tgl: Add pll manager Lucas De Marchi
2019-07-09 12:14 ` Rodrigo Vivi
2019-07-08 23:16 ` [PATCH v2 13/25] drm/i915/tgl: Add additional ports for Tiger Lake Lucas De Marchi
2019-07-09 19:43 ` Souza, Jose
2019-07-08 23:16 ` [PATCH v2 14/25] drm/i915/tgl: update ddi/tc clock_off bits Lucas De Marchi
2019-07-09 19:49 ` Souza, Jose
2019-07-09 19:58 ` Lucas De Marchi
2019-07-08 23:16 ` [PATCH v2 15/25] drm/i915/tgl: Add gmbus gpio pin to port mapping Lucas De Marchi
2019-07-11 0:19 ` Souza, Jose
2019-07-08 23:16 ` [PATCH v2 16/25] drm/i915/tgl: port to ddc pin mapping Lucas De Marchi
2019-07-09 12:11 ` Rodrigo Vivi
2019-07-09 16:28 ` Lucas De Marchi
2019-07-09 17:00 ` [PATCH v3 " Lucas De Marchi
2019-07-10 11:01 ` Rodrigo Vivi
2019-07-08 23:16 ` [PATCH v2 17/25] drm/i915/tgl: select correct bit for port select Lucas De Marchi
2019-07-10 18:40 ` Ville Syrjälä
2019-07-10 22:52 ` Lucas De Marchi
2019-07-08 23:16 ` [PATCH v2 18/25] drm/i915/tgl: extend intel_port_is_combophy/tc Lucas De Marchi
2019-07-09 19:54 ` Souza, Jose
2019-07-08 23:16 ` [PATCH v2 19/25] drm/i915/tgl: init ddi port A-C for Tiger Lake Lucas De Marchi
2019-07-09 19:55 ` Souza, Jose
2019-07-08 23:16 ` [PATCH v2 20/25] drm/i915/tgl: Add vbt value mapping for DDC Bus pin Lucas De Marchi
2019-07-11 0:21 ` Souza, Jose
2019-07-08 23:16 ` [PATCH v2 21/25] drm/i915/tgl: apply Display WA #1178 to fix type C dongles Lucas De Marchi
2019-07-09 12:13 ` Rodrigo Vivi
2019-07-08 23:16 ` [PATCH v2 22/25] drm/i915/gen12: MBUS B credit change Lucas De Marchi
2019-07-09 15:58 ` Ville Syrjälä
2019-07-08 23:16 ` [PATCH v2 23/25] drm/i915/tgl: skip setting PORT_CL_DW12_* on initialization Lucas De Marchi
2019-07-09 20:10 ` Souza, Jose
2019-07-08 23:16 ` [PATCH v2 24/25] drm/i915/tgl: Add DPLL registers Lucas De Marchi
2019-07-09 12:56 ` Ville Syrjälä
2019-07-09 15:58 ` Lucas De Marchi
2019-07-10 18:43 ` Ville Syrjälä
2019-07-08 23:16 ` [PATCH v2 25/25] drm/i915/tgl: Update DPLL clock reference register Lucas De Marchi
2019-07-09 12:48 ` Ville Syrjälä
2019-07-08 23:29 ` ✗ Fi.CI.CHECKPATCH: warning for Initial support for Tiger Lake (rev2) Patchwork
2019-07-08 23:52 ` ✓ Fi.CI.BAT: success " Patchwork
2019-07-09 13:17 ` ✓ Fi.CI.IGT: " Patchwork
2019-07-09 18:24 ` ✗ Fi.CI.CHECKPATCH: warning for Initial support for Tiger Lake (rev3) Patchwork
2019-07-09 18:46 ` ✓ Fi.CI.BAT: success " Patchwork
2019-07-10 10:34 ` ✓ Fi.CI.IGT: " Patchwork
2019-07-10 20:32 ` ✗ Fi.CI.CHECKPATCH: warning for Initial support for Tiger Lake (rev6) Patchwork
2019-07-11 12:15 ` ✓ Fi.CI.BAT: success " Patchwork
2019-07-11 20:28 ` ✓ Fi.CI.IGT: " Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190709155311.GX5942@intel.com \
--to=ville.syrjala@linux.intel.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=lucas.demarchi@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.