From: John Harrison <John.C.Harrison@Intel.com>
To: Chris Wilson <chris@chris-wilson.co.uk>, intel-gfx@lists.freedesktop.org
Cc: Jani Nikula <jani.nikula@intel.com>
Subject: Re: [PATCH 19/21] drm/i915/dp: Markup pps lock power well
Date: Thu, 10 Jan 2019 16:16:16 -0800 [thread overview]
Message-ID: <f8bf0cd7-e997-49cf-7eff-6f28a07c5b4f@Intel.com> (raw)
In-Reply-To: <20190110101152.15651-20-chris@chris-wilson.co.uk>
On 1/10/2019 02:11, Chris Wilson wrote:
> Track where and when we acquire and release the power well for pps
> access along the dp aux link, with a view to detecting if we leak any
> wakerefs.
>
> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> Cc: Jani Nikula <jani.nikula@intel.com>
> ---
> drivers/gpu/drm/i915/intel_dp.c | 231 +++++++++++++++++---------------
> 1 file changed, 121 insertions(+), 110 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
> index fc85fd77a661..db0f3a4402f5 100644
> --- a/drivers/gpu/drm/i915/intel_dp.c
> +++ b/drivers/gpu/drm/i915/intel_dp.c
> @@ -601,30 +601,39 @@ intel_dp_init_panel_power_sequencer_registers(struct intel_dp *intel_dp,
> static void
> intel_dp_pps_init(struct intel_dp *intel_dp);
>
> -static void pps_lock(struct intel_dp *intel_dp)
> +static intel_wakeref_t
> +pps_lock(struct intel_dp *intel_dp)
> {
> struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
Any particular reason for leaving these as dev_priv when the earlier
patches converted everything in sight to i915?
Otherwise:
Reviewed-by: John Harrison <John.C.Harrison@Intel.com>
> + intel_wakeref_t wakeref;
>
> /*
> * See intel_power_sequencer_reset() why we need
> * a power domain reference here.
> */
> - intel_display_power_get(dev_priv,
> - intel_aux_power_domain(dp_to_dig_port(intel_dp)));
> + wakeref = intel_display_power_get(dev_priv,
> + intel_aux_power_domain(dp_to_dig_port(intel_dp)));
>
> mutex_lock(&dev_priv->pps_mutex);
> +
> + return wakeref;
> }
>
> -static void pps_unlock(struct intel_dp *intel_dp)
> +static intel_wakeref_t
> +pps_unlock(struct intel_dp *intel_dp, intel_wakeref_t wakeref)
> {
> struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
>
> mutex_unlock(&dev_priv->pps_mutex);
> -
> - intel_display_power_put_unchecked(dev_priv,
> - intel_aux_power_domain(dp_to_dig_port(intel_dp)));
> + intel_display_power_put(dev_priv,
> + intel_aux_power_domain(dp_to_dig_port(intel_dp)),
> + wakeref);
> + return 0;
> }
>
> +#define with_pps_lock(dp, wf) \
> + for (wf = pps_lock(dp); wf; wf = pps_unlock(dp, wf))
> +
> static void
> vlv_power_sequencer_kick(struct intel_dp *intel_dp)
> {
> @@ -973,30 +982,30 @@ static int edp_notify_handler(struct notifier_block *this, unsigned long code,
> struct intel_dp *intel_dp = container_of(this, typeof(* intel_dp),
> edp_notifier);
> struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
> + intel_wakeref_t wakeref;
>
> if (!intel_dp_is_edp(intel_dp) || code != SYS_RESTART)
> return 0;
>
> - pps_lock(intel_dp);
> -
> - if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
> - enum pipe pipe = vlv_power_sequencer_pipe(intel_dp);
> - i915_reg_t pp_ctrl_reg, pp_div_reg;
> - u32 pp_div;
> -
> - pp_ctrl_reg = PP_CONTROL(pipe);
> - pp_div_reg = PP_DIVISOR(pipe);
> - pp_div = I915_READ(pp_div_reg);
> - pp_div &= PP_REFERENCE_DIVIDER_MASK;
> -
> - /* 0x1F write to PP_DIV_REG sets max cycle delay */
> - I915_WRITE(pp_div_reg, pp_div | 0x1F);
> - I915_WRITE(pp_ctrl_reg, PANEL_UNLOCK_REGS | PANEL_POWER_OFF);
> - msleep(intel_dp->panel_power_cycle_delay);
> + with_pps_lock(intel_dp, wakeref) {
> + if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
> + enum pipe pipe = vlv_power_sequencer_pipe(intel_dp);
> + i915_reg_t pp_ctrl_reg, pp_div_reg;
> + u32 pp_div;
> +
> + pp_ctrl_reg = PP_CONTROL(pipe);
> + pp_div_reg = PP_DIVISOR(pipe);
> + pp_div = I915_READ(pp_div_reg);
> + pp_div &= PP_REFERENCE_DIVIDER_MASK;
> +
> + /* 0x1F write to PP_DIV_REG sets max cycle delay */
> + I915_WRITE(pp_div_reg, pp_div | 0x1F);
> + I915_WRITE(pp_ctrl_reg,
> + PANEL_UNLOCK_REGS | PANEL_POWER_OFF);
> + msleep(intel_dp->panel_power_cycle_delay);
> + }
> }
>
> - pps_unlock(intel_dp);
> -
> return 0;
> }
>
> @@ -1184,16 +1193,17 @@ intel_dp_aux_xfer(struct intel_dp *intel_dp,
> to_i915(intel_dig_port->base.base.dev);
> i915_reg_t ch_ctl, ch_data[5];
> uint32_t aux_clock_divider;
> + intel_wakeref_t wakeref;
> int i, ret, recv_bytes;
> - uint32_t status;
> int try, clock = 0;
> + uint32_t status;
> bool vdd;
>
> ch_ctl = intel_dp->aux_ch_ctl_reg(intel_dp);
> for (i = 0; i < ARRAY_SIZE(ch_data); i++)
> ch_data[i] = intel_dp->aux_ch_data_reg(intel_dp, i);
>
> - pps_lock(intel_dp);
> + wakeref = pps_lock(intel_dp);
>
> /*
> * We will be called with VDD already enabled for dpcd/edid/oui reads.
> @@ -1337,7 +1347,7 @@ intel_dp_aux_xfer(struct intel_dp *intel_dp,
> if (vdd)
> edp_panel_vdd_off(intel_dp, false);
>
> - pps_unlock(intel_dp);
> + pps_unlock(intel_dp, wakeref);
>
> return ret;
> }
> @@ -2464,15 +2474,15 @@ static bool edp_panel_vdd_on(struct intel_dp *intel_dp)
> */
> void intel_edp_panel_vdd_on(struct intel_dp *intel_dp)
> {
> + intel_wakeref_t wakeref;
> bool vdd;
>
> if (!intel_dp_is_edp(intel_dp))
> return;
>
> - pps_lock(intel_dp);
> - vdd = edp_panel_vdd_on(intel_dp);
> - pps_unlock(intel_dp);
> -
> + vdd = false;
> + with_pps_lock(intel_dp, wakeref)
> + vdd = edp_panel_vdd_on(intel_dp);
> I915_STATE_WARN(!vdd, "eDP port %c VDD already requested on\n",
> port_name(dp_to_dig_port(intel_dp)->base.port));
> }
> @@ -2517,13 +2527,15 @@ static void edp_panel_vdd_off_sync(struct intel_dp *intel_dp)
>
> static void edp_panel_vdd_work(struct work_struct *__work)
> {
> - struct intel_dp *intel_dp = container_of(to_delayed_work(__work),
> - struct intel_dp, panel_vdd_work);
> + struct intel_dp *intel_dp =
> + container_of(to_delayed_work(__work),
> + struct intel_dp, panel_vdd_work);
> + intel_wakeref_t wakeref;
>
> - pps_lock(intel_dp);
> - if (!intel_dp->want_panel_vdd)
> - edp_panel_vdd_off_sync(intel_dp);
> - pps_unlock(intel_dp);
> + with_pps_lock(intel_dp, wakeref) {
> + if (!intel_dp->want_panel_vdd)
> + edp_panel_vdd_off_sync(intel_dp);
> + }
> }
>
> static void edp_panel_vdd_schedule_off(struct intel_dp *intel_dp)
> @@ -2613,12 +2625,13 @@ static void edp_panel_on(struct intel_dp *intel_dp)
>
> void intel_edp_panel_on(struct intel_dp *intel_dp)
> {
> + intel_wakeref_t wakeref;
> +
> if (!intel_dp_is_edp(intel_dp))
> return;
>
> - pps_lock(intel_dp);
> - edp_panel_on(intel_dp);
> - pps_unlock(intel_dp);
> + with_pps_lock(intel_dp, wakeref)
> + edp_panel_on(intel_dp);
> }
>
>
> @@ -2662,20 +2675,20 @@ static void edp_panel_off(struct intel_dp *intel_dp)
>
> void intel_edp_panel_off(struct intel_dp *intel_dp)
> {
> + intel_wakeref_t wakeref;
> +
> if (!intel_dp_is_edp(intel_dp))
> return;
>
> - pps_lock(intel_dp);
> - edp_panel_off(intel_dp);
> - pps_unlock(intel_dp);
> + with_pps_lock(intel_dp, wakeref)
> + edp_panel_off(intel_dp);
> }
>
> /* Enable backlight in the panel power control. */
> static void _intel_edp_backlight_on(struct intel_dp *intel_dp)
> {
> struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
> - u32 pp;
> - i915_reg_t pp_ctrl_reg;
> + intel_wakeref_t wakeref;
>
> /*
> * If we enable the backlight right away following a panel power
> @@ -2685,17 +2698,16 @@ static void _intel_edp_backlight_on(struct intel_dp *intel_dp)
> */
> wait_backlight_on(intel_dp);
>
> - pps_lock(intel_dp);
> + with_pps_lock(intel_dp, wakeref) {
> + i915_reg_t pp_ctrl_reg = _pp_ctrl_reg(intel_dp);
> + u32 pp;
>
> - pp = ironlake_get_pp_control(intel_dp);
> - pp |= EDP_BLC_ENABLE;
> -
> - pp_ctrl_reg = _pp_ctrl_reg(intel_dp);
> -
> - I915_WRITE(pp_ctrl_reg, pp);
> - POSTING_READ(pp_ctrl_reg);
> + pp = ironlake_get_pp_control(intel_dp);
> + pp |= EDP_BLC_ENABLE;
>
> - pps_unlock(intel_dp);
> + I915_WRITE(pp_ctrl_reg, pp);
> + POSTING_READ(pp_ctrl_reg);
> + }
> }
>
> /* Enable backlight PWM and backlight PP control. */
> @@ -2717,23 +2729,21 @@ void intel_edp_backlight_on(const struct intel_crtc_state *crtc_state,
> static void _intel_edp_backlight_off(struct intel_dp *intel_dp)
> {
> struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
> - u32 pp;
> - i915_reg_t pp_ctrl_reg;
> + intel_wakeref_t wakeref;
>
> if (!intel_dp_is_edp(intel_dp))
> return;
>
> - pps_lock(intel_dp);
> -
> - pp = ironlake_get_pp_control(intel_dp);
> - pp &= ~EDP_BLC_ENABLE;
> -
> - pp_ctrl_reg = _pp_ctrl_reg(intel_dp);
> + with_pps_lock(intel_dp, wakeref) {
> + i915_reg_t pp_ctrl_reg = _pp_ctrl_reg(intel_dp);
> + u32 pp;
>
> - I915_WRITE(pp_ctrl_reg, pp);
> - POSTING_READ(pp_ctrl_reg);
> + pp = ironlake_get_pp_control(intel_dp);
> + pp &= ~EDP_BLC_ENABLE;
>
> - pps_unlock(intel_dp);
> + I915_WRITE(pp_ctrl_reg, pp);
> + POSTING_READ(pp_ctrl_reg);
> + }
>
> intel_dp->last_backlight_off = jiffies;
> edp_wait_backlight_off(intel_dp);
> @@ -2761,12 +2771,12 @@ static void intel_edp_backlight_power(struct intel_connector *connector,
> bool enable)
> {
> struct intel_dp *intel_dp = intel_attached_dp(&connector->base);
> + intel_wakeref_t wakeref;
> bool is_enabled;
>
> - pps_lock(intel_dp);
> - is_enabled = ironlake_get_pp_control(intel_dp) & EDP_BLC_ENABLE;
> - pps_unlock(intel_dp);
> -
> + is_enabled = false;
> + with_pps_lock(intel_dp, wakeref)
> + is_enabled = ironlake_get_pp_control(intel_dp) & EDP_BLC_ENABLE;
> if (is_enabled == enable)
> return;
>
> @@ -3276,22 +3286,21 @@ static void intel_enable_dp(struct intel_encoder *encoder,
> struct intel_crtc *crtc = to_intel_crtc(pipe_config->base.crtc);
> uint32_t dp_reg = I915_READ(intel_dp->output_reg);
> enum pipe pipe = crtc->pipe;
> + intel_wakeref_t wakeref;
>
> if (WARN_ON(dp_reg & DP_PORT_EN))
> return;
>
> - pps_lock(intel_dp);
> -
> - if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
> - vlv_init_panel_power_sequencer(encoder, pipe_config);
> -
> - intel_dp_enable_port(intel_dp, pipe_config);
> + with_pps_lock(intel_dp, wakeref) {
> + if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
> + vlv_init_panel_power_sequencer(encoder, pipe_config);
>
> - edp_panel_vdd_on(intel_dp);
> - edp_panel_on(intel_dp);
> - edp_panel_vdd_off(intel_dp, true);
> + intel_dp_enable_port(intel_dp, pipe_config);
>
> - pps_unlock(intel_dp);
> + edp_panel_vdd_on(intel_dp);
> + edp_panel_on(intel_dp);
> + edp_panel_vdd_off(intel_dp, true);
> + }
>
> if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
> unsigned int lane_mask = 0x0;
> @@ -3989,9 +3998,10 @@ intel_dp_link_down(struct intel_encoder *encoder,
> intel_dp->DP = DP;
>
> if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
> - pps_lock(intel_dp);
> - intel_dp->active_pipe = INVALID_PIPE;
> - pps_unlock(intel_dp);
> + intel_wakeref_t wakeref;
> +
> + with_pps_lock(intel_dp, wakeref)
> + intel_dp->active_pipe = INVALID_PIPE;
> }
> }
>
> @@ -5561,14 +5571,15 @@ void intel_dp_encoder_flush_work(struct drm_encoder *encoder)
>
> intel_dp_mst_encoder_cleanup(intel_dig_port);
> if (intel_dp_is_edp(intel_dp)) {
> + intel_wakeref_t wakeref;
> +
> cancel_delayed_work_sync(&intel_dp->panel_vdd_work);
> /*
> * vdd might still be enabled do to the delayed vdd off.
> * Make sure vdd is actually turned off here.
> */
> - pps_lock(intel_dp);
> - edp_panel_vdd_off_sync(intel_dp);
> - pps_unlock(intel_dp);
> + with_pps_lock(intel_dp, wakeref)
> + edp_panel_vdd_off_sync(intel_dp);
>
> if (intel_dp->edp_notifier.notifier_call) {
> unregister_reboot_notifier(&intel_dp->edp_notifier);
> @@ -5590,6 +5601,7 @@ static void intel_dp_encoder_destroy(struct drm_encoder *encoder)
> void intel_dp_encoder_suspend(struct intel_encoder *intel_encoder)
> {
> struct intel_dp *intel_dp = enc_to_intel_dp(&intel_encoder->base);
> + intel_wakeref_t wakeref;
>
> if (!intel_dp_is_edp(intel_dp))
> return;
> @@ -5599,9 +5611,8 @@ void intel_dp_encoder_suspend(struct intel_encoder *intel_encoder)
> * Make sure vdd is actually turned off here.
> */
> cancel_delayed_work_sync(&intel_dp->panel_vdd_work);
> - pps_lock(intel_dp);
> - edp_panel_vdd_off_sync(intel_dp);
> - pps_unlock(intel_dp);
> + with_pps_lock(intel_dp, wakeref)
> + edp_panel_vdd_off_sync(intel_dp);
> }
>
> static
> @@ -5882,6 +5893,7 @@ void intel_dp_encoder_reset(struct drm_encoder *encoder)
> struct drm_i915_private *dev_priv = to_i915(encoder->dev);
> struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
> struct intel_lspcon *lspcon = dp_to_lspcon(intel_dp);
> + intel_wakeref_t wakeref;
>
> if (!HAS_DDI(dev_priv))
> intel_dp->DP = I915_READ(intel_dp->output_reg);
> @@ -5891,18 +5903,19 @@ void intel_dp_encoder_reset(struct drm_encoder *encoder)
>
> intel_dp->reset_link_params = true;
>
> - pps_lock(intel_dp);
> -
> - if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
> - intel_dp->active_pipe = vlv_active_pipe(intel_dp);
> + with_pps_lock(intel_dp, wakeref) {
> + if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
> + intel_dp->active_pipe = vlv_active_pipe(intel_dp);
>
> - if (intel_dp_is_edp(intel_dp)) {
> - /* Reinit the power sequencer, in case BIOS did something with it. */
> - intel_dp_pps_init(intel_dp);
> - intel_edp_panel_vdd_sanitize(intel_dp);
> + if (intel_dp_is_edp(intel_dp)) {
> + /*
> + * Reinit the power sequencer, in case BIOS did
> + * something nasty with it.
> + */
> + intel_dp_pps_init(intel_dp);
> + intel_edp_panel_vdd_sanitize(intel_dp);
> + }
> }
> -
> - pps_unlock(intel_dp);
> }
>
> static const struct drm_connector_funcs intel_dp_connector_funcs = {
> @@ -6698,8 +6711,9 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
> struct drm_display_mode *downclock_mode = NULL;
> bool has_dpcd;
> struct drm_display_mode *scan;
> - struct edid *edid;
> enum pipe pipe = INVALID_PIPE;
> + intel_wakeref_t wakeref;
> + struct edid *edid;
>
> if (!intel_dp_is_edp(intel_dp))
> return true;
> @@ -6719,13 +6733,11 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
> return false;
> }
>
> - pps_lock(intel_dp);
> -
> - intel_dp_init_panel_power_timestamps(intel_dp);
> - intel_dp_pps_init(intel_dp);
> - intel_edp_panel_vdd_sanitize(intel_dp);
> -
> - pps_unlock(intel_dp);
> + with_pps_lock(intel_dp, wakeref) {
> + intel_dp_init_panel_power_timestamps(intel_dp);
> + intel_dp_pps_init(intel_dp);
> + intel_edp_panel_vdd_sanitize(intel_dp);
> + }
>
> /* Cache DPCD and EDID for edp. */
> has_dpcd = intel_edp_init_dpcd(intel_dp);
> @@ -6810,9 +6822,8 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
> * vdd might still be enabled do to the delayed vdd off.
> * Make sure vdd is actually turned off here.
> */
> - pps_lock(intel_dp);
> - edp_panel_vdd_off_sync(intel_dp);
> - pps_unlock(intel_dp);
> + with_pps_lock(intel_dp, wakeref)
> + edp_panel_vdd_off_sync(intel_dp);
>
> return false;
> }
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2019-01-11 0:16 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-01-10 10:11 Track rpm wakerefs to fix bugs Chris Wilson
2019-01-10 10:11 ` [PATCH 01/21] drm/i915: Track all held rpm wakerefs Chris Wilson
2019-01-10 10:11 ` [PATCH 02/21] drm/i915: Markup paired operations on wakerefs Chris Wilson
2019-01-10 10:20 ` Mika Kuoppala
2019-01-10 10:11 ` [PATCH 03/21] drm/i915: Track GT wakeref Chris Wilson
2019-01-10 10:11 ` [PATCH 04/21] drm/i915: Track the rpm wakerefs for error handling Chris Wilson
2019-01-10 10:11 ` [PATCH 05/21] drm/i915: Mark up sysfs with rpm wakeref tracking Chris Wilson
2019-01-10 10:11 ` [PATCH 06/21] drm/i915: Mark up debugfs " Chris Wilson
2019-01-10 10:11 ` [PATCH 07/21] drm/i915/perf: Track the rpm wakeref Chris Wilson
2019-01-10 10:11 ` [PATCH 08/21] drm/i915/pmu: Track " Chris Wilson
2019-01-10 10:11 ` [PATCH 09/21] drm/i915/guc: Track the " Chris Wilson
2019-01-10 10:11 ` [PATCH 10/21] drm/i915/gem: Track the rpm wakerefs Chris Wilson
2019-01-10 10:11 ` [PATCH 11/21] drm/i915/fb: Track " Chris Wilson
2019-01-10 10:11 ` [PATCH 12/21] drm/i915/hotplug: Track temporary rpm wakeref Chris Wilson
2019-01-10 10:11 ` [PATCH 13/21] drm/i915/panel: " Chris Wilson
2019-01-10 10:11 ` [PATCH 14/21] drm/i915/selftests: Mark up rpm wakerefs Chris Wilson
2019-01-10 10:11 ` [PATCH 15/21] drm/i915: Syntatic sugar for using intel_runtime_pm Chris Wilson
2019-01-10 10:11 ` [PATCH 16/21] drm/i915: Markup paired operations on display power domains Chris Wilson
2019-01-10 15:51 ` Mika Kuoppala
2019-01-10 16:21 ` Chris Wilson
2019-01-10 16:49 ` Mika Kuoppala
2019-01-10 10:11 ` [PATCH 17/21] drm/i915: Track the wakeref used to initialise " Chris Wilson
2019-01-10 23:15 ` John Harrison
2019-01-10 23:21 ` Chris Wilson
2019-01-11 13:09 ` Mika Kuoppala
2019-01-10 10:11 ` [PATCH 18/21] drm/i915: Combined gt.awake/gt.power wakerefs Chris Wilson
2019-01-14 14:20 ` Mika Kuoppala
2019-01-10 10:11 ` [PATCH 19/21] drm/i915/dp: Markup pps lock power well Chris Wilson
2019-01-11 0:16 ` John Harrison [this message]
2019-01-11 1:19 ` Chris Wilson
2019-01-10 10:11 ` [PATCH 20/21] drm/i915: Complain if hsw_get_pipe_config acquires the same power well twice Chris Wilson
2019-01-11 13:47 ` Mika Kuoppala
2019-01-10 10:11 ` [PATCH 21/21] drm/i915: Mark up Ironlake ips with rpm wakerefs Chris Wilson
2019-01-11 21:05 ` John Harrison
2019-01-14 15:01 ` Mika Kuoppala
2019-01-14 16:57 ` Chris Wilson
2019-01-10 11:47 ` ✗ Fi.CI.CHECKPATCH: warning for series starting with [01/21] drm/i915: Track all held " Patchwork
2019-01-10 11:54 ` ✗ Fi.CI.SPARSE: " Patchwork
2019-01-10 12:31 ` ✗ Fi.CI.BAT: failure " 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=f8bf0cd7-e997-49cf-7eff-6f28a07c5b4f@Intel.com \
--to=john.c.harrison@intel.com \
--cc=chris@chris-wilson.co.uk \
--cc=intel-gfx@lists.freedesktop.org \
--cc=jani.nikula@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.