From: Ander Conselvan de Oliveira <conselvan2@gmail.com>
To: Jesse Barnes <jbarnes@virtuousgeek.org>, intel-gfx@lists.freedesktop.org
Cc: shuang.he@linux.intel.com
Subject: Re: [PATCH 1/6] drm/i915: factor out compute_config from __intel_set_mode v3
Date: Mon, 10 Nov 2014 18:08:42 +0200 [thread overview]
Message-ID: <5460E30A.20906@gmail.com> (raw)
In-Reply-To: <1415226371-1880-1-git-send-email-jbarnes@virtuousgeek.org>
Reviewed-by: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>
On 11/06/2014 12:26 AM, Jesse Barnes wrote:
> This allows us to calculate the full pipe config before we do any mode
> setting work.
>
> v2:
> - clarify comments about global vs. per-crtc mode set (Ander)
> - clean up unnecessary pipe_config = NULL setting (Ander)
> v3:
> - fix pipe_config handling (alloc in compute_config, free in set_mode) (Jesse)
> - fix arg order in set_mode (Jesse)
> - fix failure path of set_config (Ander)
>
> Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
> ---
> drivers/gpu/drm/i915/intel_display.c | 105 ++++++++++++++++++++++++-----------
> 1 file changed, 74 insertions(+), 31 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index a9df85f..a3ebab8 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -10656,45 +10656,60 @@ static void update_scanline_offset(struct intel_crtc *crtc)
> crtc->scanline_offset = 1;
> }
>
> +static struct intel_crtc_config *
> +intel_modeset_compute_config(struct drm_crtc *crtc,
> + struct drm_display_mode *mode,
> + struct drm_framebuffer *fb,
> + unsigned *modeset_pipes,
> + unsigned *prepare_pipes,
> + unsigned *disable_pipes)
> +{
> + struct intel_crtc_config *pipe_config = NULL;
> +
> + intel_modeset_affected_pipes(crtc, modeset_pipes,
> + prepare_pipes, disable_pipes);
> +
> + if ((*modeset_pipes) == 0)
> + goto out;
> +
> + /*
> + * Note this needs changes when we start tracking multiple modes
> + * and crtcs. At that point we'll need to compute the whole config
> + * (i.e. one pipe_config for each crtc) rather than just the one
> + * for this crtc.
> + */
> + pipe_config = intel_modeset_pipe_config(crtc, fb, mode);
> + if (IS_ERR(pipe_config)) {
> + goto out;
> + }
> + intel_dump_pipe_config(to_intel_crtc(crtc), pipe_config,
> + "[modeset]");
> + to_intel_crtc(crtc)->new_config = pipe_config;
> +
> +out:
> + return pipe_config;
> +}
> +
> static int __intel_set_mode(struct drm_crtc *crtc,
> struct drm_display_mode *mode,
> - int x, int y, struct drm_framebuffer *fb)
> + int x, int y, struct drm_framebuffer *fb,
> + struct intel_crtc_config *pipe_config,
> + unsigned modeset_pipes,
> + unsigned prepare_pipes,
> + unsigned disable_pipes)
> {
> struct drm_device *dev = crtc->dev;
> struct drm_i915_private *dev_priv = dev->dev_private;
> struct drm_display_mode *saved_mode;
> - struct intel_crtc_config *pipe_config = NULL;
> struct intel_crtc *intel_crtc;
> - unsigned disable_pipes, prepare_pipes, modeset_pipes;
> int ret = 0;
>
> saved_mode = kmalloc(sizeof(*saved_mode), GFP_KERNEL);
> if (!saved_mode)
> return -ENOMEM;
>
> - intel_modeset_affected_pipes(crtc, &modeset_pipes,
> - &prepare_pipes, &disable_pipes);
> -
> *saved_mode = crtc->mode;
>
> - /* Hack: Because we don't (yet) support global modeset on multiple
> - * crtcs, we don't keep track of the new mode for more than one crtc.
> - * Hence simply check whether any bit is set in modeset_pipes in all the
> - * pieces of code that are not yet converted to deal with mutliple crtcs
> - * changing their mode at the same time. */
> - if (modeset_pipes) {
> - pipe_config = intel_modeset_pipe_config(crtc, fb, mode);
> - if (IS_ERR(pipe_config)) {
> - ret = PTR_ERR(pipe_config);
> - pipe_config = NULL;
> -
> - goto out;
> - }
> - intel_dump_pipe_config(to_intel_crtc(crtc), pipe_config,
> - "[modeset]");
> - to_intel_crtc(crtc)->new_config = pipe_config;
> - }
> -
> /*
> * See if the config requires any additional preparation, e.g.
> * to adjust global state with pipes off. We need to do this
> @@ -10719,6 +10734,10 @@ static int __intel_set_mode(struct drm_crtc *crtc,
>
> /* crtc->mode is already used by the ->mode_set callbacks, hence we need
> * to set it here already despite that we pass it down the callchain.
> + *
> + * Note we'll need to fix this up when we start tracking multiple
> + * pipes; here we assume a single modeset_pipe and only track the
> + * single crtc and mode.
> */
> if (modeset_pipes) {
> crtc->mode = *mode;
> @@ -10787,19 +10806,23 @@ done:
> if (ret && crtc->enabled)
> crtc->mode = *saved_mode;
>
> -out:
> kfree(pipe_config);
> kfree(saved_mode);
> return ret;
> }
>
> -static int intel_set_mode(struct drm_crtc *crtc,
> - struct drm_display_mode *mode,
> - int x, int y, struct drm_framebuffer *fb)
> +static int intel_set_mode_pipes(struct drm_crtc *crtc,
> + struct drm_display_mode *mode,
> + int x, int y, struct drm_framebuffer *fb,
> + struct intel_crtc_config *pipe_config,
> + unsigned modeset_pipes,
> + unsigned prepare_pipes,
> + unsigned disable_pipes)
> {
> int ret;
>
> - ret = __intel_set_mode(crtc, mode, x, y, fb);
> + ret = __intel_set_mode(crtc, mode, x, y, fb, pipe_config, modeset_pipes,
> + prepare_pipes, disable_pipes);
>
> if (ret == 0)
> intel_modeset_check_state(crtc->dev);
> @@ -10807,6 +10830,26 @@ static int intel_set_mode(struct drm_crtc *crtc,
> return ret;
> }
>
> +static int intel_set_mode(struct drm_crtc *crtc,
> + struct drm_display_mode *mode,
> + int x, int y, struct drm_framebuffer *fb)
> +{
> + struct intel_crtc_config *pipe_config;
> + unsigned modeset_pipes, prepare_pipes, disable_pipes;
> +
> + pipe_config = intel_modeset_compute_config(crtc, mode, fb,
> + &modeset_pipes,
> + &prepare_pipes,
> + &disable_pipes);
> +
> + if (IS_ERR(pipe_config))
> + return PTR_ERR(pipe_config);
> +
> + return intel_set_mode_pipes(crtc, mode, x, y, fb, pipe_config,
> + modeset_pipes, prepare_pipes,
> + disable_pipes);
> +}
> +
> void intel_crtc_restore_mode(struct drm_crtc *crtc)
> {
> intel_set_mode(crtc, &crtc->mode, crtc->x, crtc->y, crtc->primary->fb);
> @@ -13156,8 +13199,8 @@ void intel_modeset_setup_hw_state(struct drm_device *dev,
> struct drm_crtc *crtc =
> dev_priv->pipe_to_crtc_mapping[pipe];
>
> - __intel_set_mode(crtc, &crtc->mode, crtc->x, crtc->y,
> - crtc->primary->fb);
> + intel_set_mode(crtc, &crtc->mode, crtc->x, crtc->y,
> + crtc->primary->fb);
> }
> } else {
> intel_modeset_update_staged_output_state(dev);
>
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
prev parent reply other threads:[~2014-11-10 16:10 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-05 22:26 [PATCH 1/6] drm/i915: factor out compute_config from __intel_set_mode v3 Jesse Barnes
2014-11-05 22:26 ` [PATCH 2/6] drm/i915: use compute_config in set_config v3 Jesse Barnes
2014-11-07 9:41 ` Ander Conselvan de Oliveira
2014-11-07 16:59 ` Jesse Barnes
2014-11-07 21:11 ` [PATCH] drm/i915: use compute_config in set_config v4 Jesse Barnes
2014-11-10 16:09 ` Ander Conselvan de Oliveira
2014-11-05 22:26 ` [PATCH 3/6] drm/i915/hdmi: fetch infoframe status in get_config v2 Jesse Barnes
2014-11-10 16:09 ` Ander Conselvan de Oliveira
2014-11-11 15:00 ` Daniel Vetter
2014-11-11 15:19 ` Ville Syrjälä
2014-11-11 15:23 ` Daniel Vetter
2014-11-11 15:59 ` Jesse Barnes
2014-11-05 22:26 ` [PATCH 4/6] drm/i915: check for audio and infoframe changes across mode sets v2 Jesse Barnes
2014-11-10 16:09 ` Ander Conselvan de Oliveira
2014-12-01 10:25 ` Jani Nikula
2014-12-01 16:04 ` Jesse Barnes
2014-12-01 16:09 ` Chris Wilson
2014-12-01 16:30 ` Daniel Vetter
2014-12-01 16:37 ` Chris Wilson
2014-12-01 17:23 ` Daniel Vetter
2014-12-01 17:35 ` Jani Nikula
2014-12-01 19:26 ` Daniel Vetter
2014-12-01 16:16 ` Daniel Vetter
2014-12-01 17:22 ` Jesse Barnes
2014-11-05 22:26 ` [PATCH 5/6] drm/i915: update pipe size at set_config time Jesse Barnes
2014-11-10 16:09 ` Ander Conselvan de Oliveira
2014-11-11 15:08 ` Daniel Vetter
2014-11-05 22:26 ` [PATCH 6/6] drm/i915: calculate pfit changes in set_config v2 Jesse Barnes
2014-11-06 8:43 ` [PATCH 6/6] drm/i915: calculate pfit changes in shuang.he
2014-11-10 16:20 ` [PATCH 6/6] drm/i915: calculate pfit changes in set_config v2 Ander Conselvan de Oliveira
2014-11-10 16:32 ` Jesse Barnes
2014-11-06 9:04 ` [PATCH 1/6] drm/i915: factor out compute_config from __intel_set_mode v3 Chris Wilson
2014-11-06 14:34 ` Daniel Vetter
2014-11-10 16:08 ` Ander Conselvan de Oliveira [this message]
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=5460E30A.20906@gmail.com \
--to=conselvan2@gmail.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=jbarnes@virtuousgeek.org \
--cc=shuang.he@linux.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox