* [PATCH 1/6] drm/i915: factor out compute_config from __intel_set_mode v2
@ 2014-10-30 18:53 Jesse Barnes
2014-10-30 18:54 ` [PATCH 2/6] drm/i915: use compute_config in set_config v2 Jesse Barnes
` (5 more replies)
0 siblings, 6 replies; 11+ messages in thread
From: Jesse Barnes @ 2014-10-30 18:53 UTC (permalink / raw)
To: intel-gfx; +Cc: shuang.he
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)
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
---
drivers/gpu/drm/i915/intel_display.c | 96 +++++++++++++++++++++++++-----------
1 file changed, 68 insertions(+), 28 deletions(-)
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 6e5bc3c..f9a0963 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -10910,45 +10910,61 @@ static void update_scanline_offset(struct intel_crtc *crtc)
crtc->scanline_offset = 1;
}
+static int 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;
+ int ret = 0;
+
+ intel_modeset_affected_pipes(crtc, modeset_pipes,
+ prepare_pipes, disable_pipes);
+
+ if (!modeset_pipes)
+ 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)) {
+ ret = PTR_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 ret;
+}
+
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,
+ unsigned disable_pipes,
+ unsigned prepare_pipes,
+ unsigned modeset_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
@@ -10973,6 +10989,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;
@@ -11042,19 +11062,22 @@ 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,
+ 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, modeset_pipes,
+ prepare_pipes, disable_pipes);
if (ret == 0)
intel_modeset_check_state(crtc->dev);
@@ -11062,6 +11085,23 @@ 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)
+{
+ unsigned modeset_pipes, prepare_pipes, disable_pipes;
+ int ret;
+
+ ret = intel_modeset_compute_config(crtc, mode, fb,
+ &modeset_pipes, &prepare_pipes,
+ &disable_pipes);
+ if (ret)
+ return ret;
+
+ return intel_set_mode_pipes(crtc, mode, x, y, fb, 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);
--
1.9.1
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 2/6] drm/i915: use compute_config in set_config v2
2014-10-30 18:53 [PATCH 1/6] drm/i915: factor out compute_config from __intel_set_mode v2 Jesse Barnes
@ 2014-10-30 18:54 ` Jesse Barnes
2014-10-30 18:54 ` [PATCH 3/6] drm/i915/hdmi: fetch infoframe status in get_config v2 Jesse Barnes
` (4 subsequent siblings)
5 siblings, 0 replies; 11+ messages in thread
From: Jesse Barnes @ 2014-10-30 18:54 UTC (permalink / raw)
To: intel-gfx; +Cc: shuang.he
This will allow us to consult more info before deciding whether to flip
or do a full mode set.
v2:
- don't use uninitialized or incorrect pipe masks in set_config
failure path (Ander)
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
---
drivers/gpu/drm/i915/intel_display.c | 30 ++++++++++++++++++++++++++----
1 file changed, 26 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index f9a0963..0f1952e 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -11430,6 +11430,7 @@ static int intel_crtc_set_config(struct drm_mode_set *set)
struct drm_device *dev;
struct drm_mode_set save_set;
struct intel_set_config *config;
+ unsigned modeset_pipes, prepare_pipes, disable_pipes;
int ret;
BUG_ON(!set);
@@ -11475,9 +11476,17 @@ static int intel_crtc_set_config(struct drm_mode_set *set)
if (ret)
goto fail;
+ ret = intel_modeset_compute_config(set->crtc, set->mode, set->fb,
+ &modeset_pipes, &prepare_pipes,
+ &disable_pipes);
+ if (ret)
+ goto fail;
+
if (config->mode_changed) {
- ret = intel_set_mode(set->crtc, set->mode,
- set->x, set->y, set->fb);
+ ret = intel_set_mode_pipes(set->crtc, set->mode,
+ set->x, set->y, set->fb,
+ modeset_pipes, prepare_pipes,
+ disable_pipes);
} else if (config->fb_changed) {
struct intel_crtc *intel_crtc = to_intel_crtc(set->crtc);
@@ -13412,14 +13421,27 @@ void intel_modeset_setup_hw_state(struct drm_device *dev,
for_each_pipe(dev_priv, pipe) {
struct drm_crtc *crtc =
dev_priv->pipe_to_crtc_mapping[pipe];
+ unsigned modeset_pipes, prepare_pipes, disable_pipes;
+ int ret;
+
+ ret = intel_modeset_compute_config(crtc, &crtc->mode,
+ crtc->primary->fb,
+ &modeset_pipes,
+ &prepare_pipes,
+ &disable_pipes);
+ if (ret) {
+ DRM_DEBUG_KMS("prepare failed\n");
+ goto out;
+ }
__intel_set_mode(crtc, &crtc->mode, crtc->x, crtc->y,
- crtc->primary->fb);
+ crtc->primary->fb, modeset_pipes,
+ prepare_pipes, disable_pipes);
}
} else {
intel_modeset_update_staged_output_state(dev);
}
-
+out:
intel_modeset_check_state(dev);
}
--
1.9.1
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 3/6] drm/i915/hdmi: fetch infoframe status in get_config v2
2014-10-30 18:53 [PATCH 1/6] drm/i915: factor out compute_config from __intel_set_mode v2 Jesse Barnes
2014-10-30 18:54 ` [PATCH 2/6] drm/i915: use compute_config in set_config v2 Jesse Barnes
@ 2014-10-30 18:54 ` Jesse Barnes
2014-10-30 18:54 ` [PATCH 4/6] drm/i915: check for audio and infoframe changes across mode sets Jesse Barnes
` (3 subsequent siblings)
5 siblings, 0 replies; 11+ messages in thread
From: Jesse Barnes @ 2014-10-30 18:54 UTC (permalink / raw)
To: intel-gfx; +Cc: shuang.he
This is useful for checking things later.
v2:
- fix hsw infoframe enabled check (Ander)
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
---
drivers/gpu/drm/i915/intel_drv.h | 4 +++
drivers/gpu/drm/i915/intel_hdmi.c | 62 +++++++++++++++++++++++++++++++++++++++
2 files changed, 66 insertions(+)
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 5ab813c..cdace63 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -290,6 +290,9 @@ struct intel_crtc_config {
* between pch encoders and cpu encoders. */
bool has_pch_encoder;
+ /* Are we sending infoframes on the attached port */
+ bool has_infoframe;
+
/* CPU Transcoder for the pipe. Currently this can only differ from the
* pipe on Haswell (where we have a special eDP transcoder). */
enum transcoder cpu_transcoder;
@@ -541,6 +544,7 @@ struct intel_hdmi {
void (*set_infoframes)(struct drm_encoder *encoder,
bool enable,
struct drm_display_mode *adjusted_mode);
+ bool (*infoframe_enabled)(struct drm_encoder *encoder);
};
struct intel_dp_mst_encoder;
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
index 8b5f3aa..d44c499 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -166,6 +166,15 @@ static void g4x_write_infoframe(struct drm_encoder *encoder,
POSTING_READ(VIDEO_DIP_CTL);
}
+static bool g4x_infoframe_enabled(struct drm_encoder *encoder)
+{
+ struct drm_device *dev = encoder->dev;
+ struct drm_i915_private *dev_priv = dev->dev_private;
+ u32 val = I915_READ(VIDEO_DIP_CTL);
+
+ return val & VIDEO_DIP_ENABLE;
+}
+
static void ibx_write_infoframe(struct drm_encoder *encoder,
enum hdmi_infoframe_type type,
const void *frame, ssize_t len)
@@ -204,6 +213,17 @@ static void ibx_write_infoframe(struct drm_encoder *encoder,
POSTING_READ(reg);
}
+static bool ibx_infoframe_enabled(struct drm_encoder *encoder)
+{
+ struct drm_device *dev = encoder->dev;
+ struct drm_i915_private *dev_priv = dev->dev_private;
+ struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
+ int reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
+ u32 val = I915_READ(reg);
+
+ return val & VIDEO_DIP_ENABLE;
+}
+
static void cpt_write_infoframe(struct drm_encoder *encoder,
enum hdmi_infoframe_type type,
const void *frame, ssize_t len)
@@ -245,6 +265,17 @@ static void cpt_write_infoframe(struct drm_encoder *encoder,
POSTING_READ(reg);
}
+static bool cpt_infoframe_enabled(struct drm_encoder *encoder)
+{
+ struct drm_device *dev = encoder->dev;
+ struct drm_i915_private *dev_priv = dev->dev_private;
+ struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
+ int reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
+ u32 val = I915_READ(reg);
+
+ return val & VIDEO_DIP_ENABLE;
+}
+
static void vlv_write_infoframe(struct drm_encoder *encoder,
enum hdmi_infoframe_type type,
const void *frame, ssize_t len)
@@ -283,6 +314,17 @@ static void vlv_write_infoframe(struct drm_encoder *encoder,
POSTING_READ(reg);
}
+static bool vlv_infoframe_enabled(struct drm_encoder *encoder)
+{
+ struct drm_device *dev = encoder->dev;
+ struct drm_i915_private *dev_priv = dev->dev_private;
+ struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
+ int reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
+ u32 val = I915_READ(reg);
+
+ return val & VIDEO_DIP_ENABLE;
+}
+
static void hsw_write_infoframe(struct drm_encoder *encoder,
enum hdmi_infoframe_type type,
const void *frame, ssize_t len)
@@ -320,6 +362,18 @@ static void hsw_write_infoframe(struct drm_encoder *encoder,
POSTING_READ(ctl_reg);
}
+static bool hsw_infoframe_enabled(struct drm_encoder *encoder)
+{
+ struct drm_device *dev = encoder->dev;
+ struct drm_i915_private *dev_priv = dev->dev_private;
+ struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
+ u32 ctl_reg = HSW_TVIDEO_DIP_CTL(intel_crtc->config.cpu_transcoder);
+ u32 val = I915_READ(ctl_reg);
+
+ return val & (VIDEO_DIP_ENABLE_AVI_HSW | VIDEO_DIP_ENABLE_SPD_HSW |
+ VIDEO_DIP_ENABLE_VS_HSW);
+}
+
/*
* The data we write to the DIP data buffer registers is 1 byte bigger than the
* HDMI infoframe size because of an ECC/reserved byte at position 3 (starting
@@ -732,6 +786,9 @@ static void intel_hdmi_get_config(struct intel_encoder *encoder,
if (tmp & HDMI_MODE_SELECT_HDMI)
pipe_config->has_hdmi_sink = true;
+ if (intel_hdmi->infoframe_enabled(&encoder->base))
+ pipe_config->has_infoframe = true;
+
if (tmp & SDVO_AUDIO_ENABLE)
pipe_config->has_audio = true;
@@ -1616,18 +1673,23 @@ void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
if (IS_VALLEYVIEW(dev)) {
intel_hdmi->write_infoframe = vlv_write_infoframe;
intel_hdmi->set_infoframes = vlv_set_infoframes;
+ intel_hdmi->infoframe_enabled = vlv_infoframe_enabled;
} else if (IS_G4X(dev)) {
intel_hdmi->write_infoframe = g4x_write_infoframe;
intel_hdmi->set_infoframes = g4x_set_infoframes;
+ intel_hdmi->infoframe_enabled = g4x_infoframe_enabled;
} else if (HAS_DDI(dev)) {
intel_hdmi->write_infoframe = hsw_write_infoframe;
intel_hdmi->set_infoframes = hsw_set_infoframes;
+ intel_hdmi->infoframe_enabled = hsw_infoframe_enabled;
} else if (HAS_PCH_IBX(dev)) {
intel_hdmi->write_infoframe = ibx_write_infoframe;
intel_hdmi->set_infoframes = ibx_set_infoframes;
+ intel_hdmi->infoframe_enabled = ibx_infoframe_enabled;
} else {
intel_hdmi->write_infoframe = cpt_write_infoframe;
intel_hdmi->set_infoframes = cpt_set_infoframes;
+ intel_hdmi->infoframe_enabled = cpt_infoframe_enabled;
}
if (HAS_DDI(dev))
--
1.9.1
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 4/6] drm/i915: check for audio and infoframe changes across mode sets
2014-10-30 18:53 [PATCH 1/6] drm/i915: factor out compute_config from __intel_set_mode v2 Jesse Barnes
2014-10-30 18:54 ` [PATCH 2/6] drm/i915: use compute_config in set_config v2 Jesse Barnes
2014-10-30 18:54 ` [PATCH 3/6] drm/i915/hdmi: fetch infoframe status in get_config v2 Jesse Barnes
@ 2014-10-30 18:54 ` Jesse Barnes
2014-10-30 18:54 ` [PATCH 5/6] drm/i915: update pipe size at set_config time Jesse Barnes
` (2 subsequent siblings)
5 siblings, 0 replies; 11+ messages in thread
From: Jesse Barnes @ 2014-10-30 18:54 UTC (permalink / raw)
To: intel-gfx; +Cc: shuang.he
If these change (e.g. after a modeset following a fastboot), we need to
do a full mode set.
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
---
drivers/gpu/drm/i915/intel_display.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 0f1952e..2199a9a 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -11482,6 +11482,16 @@ static int intel_crtc_set_config(struct drm_mode_set *set)
if (ret)
goto fail;
+ if (to_intel_crtc(set->crtc)->new_config->has_audio !=
+ to_intel_crtc(set->crtc)->config.has_audio)
+ config->mode_changed = true;
+
+ /* Force mode sets for any infoframe stuff */
+ if (to_intel_crtc(set->crtc)->new_config->has_infoframe ||
+ to_intel_crtc(set->crtc)->config.has_infoframe)
+ config->mode_changed = true;
+
+
if (config->mode_changed) {
ret = intel_set_mode_pipes(set->crtc, set->mode,
set->x, set->y, set->fb,
--
1.9.1
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 5/6] drm/i915: update pipe size at set_config time
2014-10-30 18:53 [PATCH 1/6] drm/i915: factor out compute_config from __intel_set_mode v2 Jesse Barnes
` (2 preceding siblings ...)
2014-10-30 18:54 ` [PATCH 4/6] drm/i915: check for audio and infoframe changes across mode sets Jesse Barnes
@ 2014-10-30 18:54 ` Jesse Barnes
2014-10-30 18:54 ` [PATCH 6/6] drm/i915: calculate pfit changes in set_config v2 Jesse Barnes
2014-10-31 22:48 ` [PATCH 1/6] drm/i915: factor out compute_config from __intel_set_mode v2 Jesse Barnes
5 siblings, 0 replies; 11+ messages in thread
From: Jesse Barnes @ 2014-10-30 18:54 UTC (permalink / raw)
To: intel-gfx; +Cc: shuang.he
This only affects the fastboot path as-is. In that case, we simply need
to make sure that we update the pipe size at the first mode set. Rather
than putting it off until we decide to flip (if indeed we do end up
flipping), update the pipe size as appropriate a bit earlier in the
set_config call.
This sets us up for better pipe tracking in later patches.
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
---
drivers/gpu/drm/i915/intel_display.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 2199a9a..470cdac 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -2902,8 +2902,6 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
return ret;
}
- intel_update_pipe_size(intel_crtc);
-
dev_priv->display.update_primary_plane(crtc, fb, x, y);
if (intel_crtc->active)
@@ -11491,6 +11489,7 @@ static int intel_crtc_set_config(struct drm_mode_set *set)
to_intel_crtc(set->crtc)->config.has_infoframe)
config->mode_changed = true;
+ intel_update_pipe_size(to_intel_crtc(set->crtc));
if (config->mode_changed) {
ret = intel_set_mode_pipes(set->crtc, set->mode,
--
1.9.1
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 6/6] drm/i915: calculate pfit changes in set_config v2
2014-10-30 18:53 [PATCH 1/6] drm/i915: factor out compute_config from __intel_set_mode v2 Jesse Barnes
` (3 preceding siblings ...)
2014-10-30 18:54 ` [PATCH 5/6] drm/i915: update pipe size at set_config time Jesse Barnes
@ 2014-10-30 18:54 ` Jesse Barnes
2014-10-31 9:35 ` Ander Conselvan de Oliveira
2014-10-31 22:48 ` [PATCH 1/6] drm/i915: factor out compute_config from __intel_set_mode v2 Jesse Barnes
5 siblings, 1 reply; 11+ messages in thread
From: Jesse Barnes @ 2014-10-30 18:54 UTC (permalink / raw)
To: intel-gfx; +Cc: shuang.he
This should allow us to avoid mode sets for some panel fitter config
changes.
v2:
- fixup pfit comment (Ander)
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
---
drivers/gpu/drm/i915/intel_display.c | 61 +++++++++++++++++++++++++++++-------
1 file changed, 50 insertions(+), 11 deletions(-)
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 470cdac..56154a1 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -2831,17 +2831,8 @@ static void intel_update_pipe_size(struct intel_crtc *crtc)
return;
/*
- * Update pipe size and adjust fitter if needed: the reason for this is
- * that in compute_mode_changes we check the native mode (not the pfit
- * mode) to see if we can flip rather than do a full mode set. In the
- * fastboot case, we'll flip, but if we don't update the pipesrc and
- * pfit state, we'll end up with a big fb scanned out into the wrong
- * sized surface.
- *
- * To fix this properly, we need to hoist the checks up into
- * compute_mode_changes (or above), check the actual pfit state and
- * whether the platform allows pfit disable with pipe active, and only
- * then update the pipesrc and pfit state, even on the flip path.
+ * See intel_pfit_changed for info on when we're allowed to
+ * do this w/o a pipe shutdown.
*/
adjusted_mode = &crtc->config.adjusted_mode;
@@ -11423,6 +11414,50 @@ static void disable_crtc_nofb(struct intel_crtc *crtc)
crtc->new_config = NULL;
}
+/* Do we need a mode set due to pfit changes? */
+static bool intel_pfit_changed(struct drm_device *dev,
+ struct intel_crtc_config *new_config,
+ struct intel_crtc_config *cur_config)
+{
+ bool ret = false;
+
+ if (HAS_DDI(dev) || HAS_PCH_SPLIT(dev)) {
+ /*
+ * On PCH platforms we can disable pfit w/o a pipe shutdown,
+ * otherwise we'll need a mode set.
+ */
+ if (new_config->pch_pfit.enabled &&
+ cur_config->pch_pfit.enabled)
+ ret = false;
+ else if (new_config->pch_pfit.enabled &&
+ !cur_config->pch_pfit.enabled)
+ ret = true;
+ else if (!new_config->pch_pfit.enabled &&
+ cur_config->pch_pfit.enabled)
+ ret = false;
+ else if (!new_config->pch_pfit.enabled &&
+ !cur_config->pch_pfit.enabled)
+ ret = false;
+ } else {
+ bool new_enabled, old_enabled;
+
+ new_enabled = !!(new_config->gmch_pfit.control & PFIT_ENABLE);
+ old_enabled = !!(cur_config->gmch_pfit.control & PFIT_ENABLE);
+
+ /* 9xx only needs a shutdown to disable pfit */
+ if (new_enabled && old_enabled)
+ ret = false;
+ else if (new_enabled && !old_enabled)
+ ret = false;
+ else if (!new_enabled && old_enabled)
+ ret = true;
+ else if (!new_enabled && !old_enabled)
+ ret = false;
+ }
+
+ return ret;
+}
+
static int intel_crtc_set_config(struct drm_mode_set *set)
{
struct drm_device *dev;
@@ -11489,6 +11524,10 @@ static int intel_crtc_set_config(struct drm_mode_set *set)
to_intel_crtc(set->crtc)->config.has_infoframe)
config->mode_changed = true;
+ if (intel_pfit_changed(dev, to_intel_crtc(set->crtc)->new_config,
+ &to_intel_crtc(set->crtc)->config))
+ config->mode_changed = true;
+
intel_update_pipe_size(to_intel_crtc(set->crtc));
if (config->mode_changed) {
--
1.9.1
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH 6/6] drm/i915: calculate pfit changes in set_config v2
2014-10-30 18:54 ` [PATCH 6/6] drm/i915: calculate pfit changes in set_config v2 Jesse Barnes
@ 2014-10-31 9:35 ` Ander Conselvan de Oliveira
0 siblings, 0 replies; 11+ messages in thread
From: Ander Conselvan de Oliveira @ 2014-10-31 9:35 UTC (permalink / raw)
To: Jesse Barnes, intel-gfx; +Cc: shuang.he
For the series,
Reviewed-by: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>
On 10/30/2014 08:54 PM, Jesse Barnes wrote:
> This should allow us to avoid mode sets for some panel fitter config
> changes.
>
> v2:
> - fixup pfit comment (Ander)
>
> Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
> ---
> drivers/gpu/drm/i915/intel_display.c | 61 +++++++++++++++++++++++++++++-------
> 1 file changed, 50 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index 470cdac..56154a1 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -2831,17 +2831,8 @@ static void intel_update_pipe_size(struct intel_crtc *crtc)
> return;
>
> /*
> - * Update pipe size and adjust fitter if needed: the reason for this is
> - * that in compute_mode_changes we check the native mode (not the pfit
> - * mode) to see if we can flip rather than do a full mode set. In the
> - * fastboot case, we'll flip, but if we don't update the pipesrc and
> - * pfit state, we'll end up with a big fb scanned out into the wrong
> - * sized surface.
> - *
> - * To fix this properly, we need to hoist the checks up into
> - * compute_mode_changes (or above), check the actual pfit state and
> - * whether the platform allows pfit disable with pipe active, and only
> - * then update the pipesrc and pfit state, even on the flip path.
> + * See intel_pfit_changed for info on when we're allowed to
> + * do this w/o a pipe shutdown.
> */
>
> adjusted_mode = &crtc->config.adjusted_mode;
> @@ -11423,6 +11414,50 @@ static void disable_crtc_nofb(struct intel_crtc *crtc)
> crtc->new_config = NULL;
> }
>
> +/* Do we need a mode set due to pfit changes? */
> +static bool intel_pfit_changed(struct drm_device *dev,
> + struct intel_crtc_config *new_config,
> + struct intel_crtc_config *cur_config)
> +{
> + bool ret = false;
> +
> + if (HAS_DDI(dev) || HAS_PCH_SPLIT(dev)) {
> + /*
> + * On PCH platforms we can disable pfit w/o a pipe shutdown,
> + * otherwise we'll need a mode set.
> + */
> + if (new_config->pch_pfit.enabled &&
> + cur_config->pch_pfit.enabled)
> + ret = false;
> + else if (new_config->pch_pfit.enabled &&
> + !cur_config->pch_pfit.enabled)
> + ret = true;
> + else if (!new_config->pch_pfit.enabled &&
> + cur_config->pch_pfit.enabled)
> + ret = false;
> + else if (!new_config->pch_pfit.enabled &&
> + !cur_config->pch_pfit.enabled)
> + ret = false;
> + } else {
> + bool new_enabled, old_enabled;
> +
> + new_enabled = !!(new_config->gmch_pfit.control & PFIT_ENABLE);
> + old_enabled = !!(cur_config->gmch_pfit.control & PFIT_ENABLE);
> +
> + /* 9xx only needs a shutdown to disable pfit */
> + if (new_enabled && old_enabled)
> + ret = false;
> + else if (new_enabled && !old_enabled)
> + ret = false;
> + else if (!new_enabled && old_enabled)
> + ret = true;
> + else if (!new_enabled && !old_enabled)
> + ret = false;
> + }
> +
> + return ret;
> +}
> +
> static int intel_crtc_set_config(struct drm_mode_set *set)
> {
> struct drm_device *dev;
> @@ -11489,6 +11524,10 @@ static int intel_crtc_set_config(struct drm_mode_set *set)
> to_intel_crtc(set->crtc)->config.has_infoframe)
> config->mode_changed = true;
>
> + if (intel_pfit_changed(dev, to_intel_crtc(set->crtc)->new_config,
> + &to_intel_crtc(set->crtc)->config))
> + config->mode_changed = true;
> +
> intel_update_pipe_size(to_intel_crtc(set->crtc));
>
> if (config->mode_changed) {
>
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/6] drm/i915: factor out compute_config from __intel_set_mode v2
2014-10-30 18:53 [PATCH 1/6] drm/i915: factor out compute_config from __intel_set_mode v2 Jesse Barnes
` (4 preceding siblings ...)
2014-10-30 18:54 ` [PATCH 6/6] drm/i915: calculate pfit changes in set_config v2 Jesse Barnes
@ 2014-10-31 22:48 ` Jesse Barnes
5 siblings, 0 replies; 11+ messages in thread
From: Jesse Barnes @ 2014-10-31 22:48 UTC (permalink / raw)
To: Jesse Barnes; +Cc: intel-gfx, shuang.he
Thanks for the review, Ander.
Daniel, in case you're tempted to merge this, don't just yet. Shaung's
test bot found an issue with the refactoring patch I'm still tracking
down. I'll post a v3 with the fix in reply to this...
Thanks,
Jesse
On Thu, 30 Oct 2014 11:53:59 -0700
Jesse Barnes <jbarnes@virtuousgeek.org> 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)
>
> Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
> ---
> drivers/gpu/drm/i915/intel_display.c | 96
> +++++++++++++++++++++++++----------- 1 file changed, 68
> insertions(+), 28 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_display.c
> b/drivers/gpu/drm/i915/intel_display.c index 6e5bc3c..f9a0963 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -10910,45 +10910,61 @@ static void update_scanline_offset(struct
> intel_crtc *crtc) crtc->scanline_offset = 1;
> }
>
> +static int 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;
> + int ret = 0;
> +
> + intel_modeset_affected_pipes(crtc, modeset_pipes,
> + prepare_pipes, disable_pipes);
> +
> + if (!modeset_pipes)
> + 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)) {
> + ret = PTR_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 ret;
> +}
> +
> 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,
> + unsigned disable_pipes,
> + unsigned prepare_pipes,
> + unsigned modeset_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
> @@ -10973,6 +10989,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;
> @@ -11042,19 +11062,22 @@ 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,
> + 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, modeset_pipes,
> + prepare_pipes, disable_pipes);
>
> if (ret == 0)
> intel_modeset_check_state(crtc->dev);
> @@ -11062,6 +11085,23 @@ 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)
> +{
> + unsigned modeset_pipes, prepare_pipes, disable_pipes;
> + int ret;
> +
> + ret = intel_modeset_compute_config(crtc, mode, fb,
> + &modeset_pipes,
> &prepare_pipes,
> + &disable_pipes);
> + if (ret)
> + return ret;
> +
> + return intel_set_mode_pipes(crtc, mode, x, y, fb,
> 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);
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 6/6] drm/i915: calculate pfit changes in set_config v2
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 ` Jesse Barnes
2014-11-10 16:20 ` Ander Conselvan de Oliveira
0 siblings, 1 reply; 11+ messages in thread
From: Jesse Barnes @ 2014-11-05 22:26 UTC (permalink / raw)
To: intel-gfx; +Cc: shuang.he
This should allow us to avoid mode sets for some panel fitter config
changes.
v2:
- fixup pfit comment (Ander)
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
---
drivers/gpu/drm/i915/intel_display.c | 61 +++++++++++++++++++++++++++++-------
1 file changed, 50 insertions(+), 11 deletions(-)
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 3f1515d..49281d7 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -2835,17 +2835,8 @@ static void intel_update_pipe_size(struct intel_crtc *crtc)
return;
/*
- * Update pipe size and adjust fitter if needed: the reason for this is
- * that in compute_mode_changes we check the native mode (not the pfit
- * mode) to see if we can flip rather than do a full mode set. In the
- * fastboot case, we'll flip, but if we don't update the pipesrc and
- * pfit state, we'll end up with a big fb scanned out into the wrong
- * sized surface.
- *
- * To fix this properly, we need to hoist the checks up into
- * compute_mode_changes (or above), check the actual pfit state and
- * whether the platform allows pfit disable with pipe active, and only
- * then update the pipesrc and pfit state, even on the flip path.
+ * See intel_pfit_changed for info on when we're allowed to
+ * do this w/o a pipe shutdown.
*/
adjusted_mode = &crtc->config.adjusted_mode;
@@ -11171,6 +11162,50 @@ static void disable_crtc_nofb(struct intel_crtc *crtc)
crtc->new_config = NULL;
}
+/* Do we need a mode set due to pfit changes? */
+static bool intel_pfit_changed(struct drm_device *dev,
+ struct intel_crtc_config *new_config,
+ struct intel_crtc_config *cur_config)
+{
+ bool ret = false;
+
+ if (HAS_DDI(dev) || HAS_PCH_SPLIT(dev)) {
+ /*
+ * On PCH platforms we can disable pfit w/o a pipe shutdown,
+ * otherwise we'll need a mode set.
+ */
+ if (new_config->pch_pfit.enabled &&
+ cur_config->pch_pfit.enabled)
+ ret = false;
+ else if (new_config->pch_pfit.enabled &&
+ !cur_config->pch_pfit.enabled)
+ ret = true;
+ else if (!new_config->pch_pfit.enabled &&
+ cur_config->pch_pfit.enabled)
+ ret = false;
+ else if (!new_config->pch_pfit.enabled &&
+ !cur_config->pch_pfit.enabled)
+ ret = false;
+ } else {
+ bool new_enabled, old_enabled;
+
+ new_enabled = !!(new_config->gmch_pfit.control & PFIT_ENABLE);
+ old_enabled = !!(cur_config->gmch_pfit.control & PFIT_ENABLE);
+
+ /* 9xx only needs a shutdown to disable pfit */
+ if (new_enabled && old_enabled)
+ ret = false;
+ else if (new_enabled && !old_enabled)
+ ret = false;
+ else if (!new_enabled && old_enabled)
+ ret = true;
+ else if (!new_enabled && !old_enabled)
+ ret = false;
+ }
+
+ return ret;
+}
+
static int intel_crtc_set_config(struct drm_mode_set *set)
{
struct drm_device *dev;
@@ -11239,6 +11274,10 @@ static int intel_crtc_set_config(struct drm_mode_set *set)
if (to_intel_crtc(set->crtc)->new_config->has_infoframe ||
to_intel_crtc(set->crtc)->config.has_infoframe)
config->mode_changed = true;
+
+ if (intel_pfit_changed(dev, to_intel_crtc(set->crtc)->new_config,
+ &to_intel_crtc(set->crtc)->config))
+ config->mode_changed = true;
}
/* set_mode will free it in the mode_changed case */
--
1.9.1
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH 6/6] drm/i915: calculate pfit changes in set_config v2
2014-11-05 22:26 ` [PATCH 6/6] drm/i915: calculate pfit changes in set_config v2 Jesse Barnes
@ 2014-11-10 16:20 ` Ander Conselvan de Oliveira
2014-11-10 16:32 ` Jesse Barnes
0 siblings, 1 reply; 11+ messages in thread
From: Ander Conselvan de Oliveira @ 2014-11-10 16:20 UTC (permalink / raw)
To: Jesse Barnes, intel-gfx; +Cc: shuang.he
On 11/06/2014 12:26 AM, Jesse Barnes wrote:
> This should allow us to avoid mode sets for some panel fitter config
> changes.
>
> v2:
> - fixup pfit comment (Ander)
>
> Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
> ---
> drivers/gpu/drm/i915/intel_display.c | 61 +++++++++++++++++++++++++++++-------
> 1 file changed, 50 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index 3f1515d..49281d7 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -2835,17 +2835,8 @@ static void intel_update_pipe_size(struct intel_crtc *crtc)
> return;
>
> /*
> - * Update pipe size and adjust fitter if needed: the reason for this is
> - * that in compute_mode_changes we check the native mode (not the pfit
> - * mode) to see if we can flip rather than do a full mode set. In the
> - * fastboot case, we'll flip, but if we don't update the pipesrc and
> - * pfit state, we'll end up with a big fb scanned out into the wrong
> - * sized surface.
> - *
> - * To fix this properly, we need to hoist the checks up into
> - * compute_mode_changes (or above), check the actual pfit state and
> - * whether the platform allows pfit disable with pipe active, and only
> - * then update the pipesrc and pfit state, even on the flip path.
> + * See intel_pfit_changed for info on when we're allowed to
> + * do this w/o a pipe shutdown.
> */
>
> adjusted_mode = &crtc->config.adjusted_mode;
> @@ -11171,6 +11162,50 @@ static void disable_crtc_nofb(struct intel_crtc *crtc)
> crtc->new_config = NULL;
> }
>
> +/* Do we need a mode set due to pfit changes? */
> +static bool intel_pfit_changed(struct drm_device *dev,
> + struct intel_crtc_config *new_config,
> + struct intel_crtc_config *cur_config)
> +{
> + bool ret = false;
> +
> + if (HAS_DDI(dev) || HAS_PCH_SPLIT(dev)) {
> + /*
> + * On PCH platforms we can disable pfit w/o a pipe shutdown,
> + * otherwise we'll need a mode set.
> + */
> + if (new_config->pch_pfit.enabled &&
> + cur_config->pch_pfit.enabled)
> + ret = false;
> + else if (new_config->pch_pfit.enabled &&
> + !cur_config->pch_pfit.enabled)
> + ret = true;
> + else if (!new_config->pch_pfit.enabled &&
> + cur_config->pch_pfit.enabled)
> + ret = false;
> + else if (!new_config->pch_pfit.enabled &&
> + !cur_config->pch_pfit.enabled)
> + ret = false;
> + } else {
> + bool new_enabled, old_enabled;
> +
> + new_enabled = !!(new_config->gmch_pfit.control & PFIT_ENABLE);
> + old_enabled = !!(cur_config->gmch_pfit.control & PFIT_ENABLE);
> +
> + /* 9xx only needs a shutdown to disable pfit */
> + if (new_enabled && old_enabled)
> + ret = false;
> + else if (new_enabled && !old_enabled)
> + ret = false;
> + else if (!new_enabled && old_enabled)
> + ret = true;
> + else if (!new_enabled && !old_enabled)
> + ret = false;
> + }
Maybe I missed something, but I couldn't find anything in the
documentation the supports the claim above. However, [1] and [2] read
that "[p]anel fitting should be enabled or disabled before the pipe is
enabled" on the documentation for the PFIT_CONTROL.
[1]
https://01.org/linuxgraphics/sites/default/files/documentation/g45_vol_3_register_0_0.pdf
[2]
https://01.org/linuxgraphics/sites/default/files/documentation/965_g35_vol_3_display_registers_updated_1.pdf
Ander
> +
> + return ret;
> +}
> +
> static int intel_crtc_set_config(struct drm_mode_set *set)
> {
> struct drm_device *dev;
> @@ -11239,6 +11274,10 @@ static int intel_crtc_set_config(struct drm_mode_set *set)
> if (to_intel_crtc(set->crtc)->new_config->has_infoframe ||
> to_intel_crtc(set->crtc)->config.has_infoframe)
> config->mode_changed = true;
> +
> + if (intel_pfit_changed(dev, to_intel_crtc(set->crtc)->new_config,
> + &to_intel_crtc(set->crtc)->config))
> + config->mode_changed = true;
> }
>
> /* set_mode will free it in the mode_changed case */
>
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 6/6] drm/i915: calculate pfit changes in set_config v2
2014-11-10 16:20 ` Ander Conselvan de Oliveira
@ 2014-11-10 16:32 ` Jesse Barnes
0 siblings, 0 replies; 11+ messages in thread
From: Jesse Barnes @ 2014-11-10 16:32 UTC (permalink / raw)
To: Ander Conselvan de Oliveira; +Cc: intel-gfx, shuang.he
On Mon, 10 Nov 2014 18:20:56 +0200
Ander Conselvan de Oliveira <conselvan2@gmail.com> wrote:
> On 11/06/2014 12:26 AM, Jesse Barnes wrote:
> > This should allow us to avoid mode sets for some panel fitter config
> > changes.
> >
> > v2:
> > - fixup pfit comment (Ander)
> >
> > Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
> > ---
> > drivers/gpu/drm/i915/intel_display.c | 61 +++++++++++++++++++++++++++++-------
> > 1 file changed, 50 insertions(+), 11 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> > index 3f1515d..49281d7 100644
> > --- a/drivers/gpu/drm/i915/intel_display.c
> > +++ b/drivers/gpu/drm/i915/intel_display.c
> > @@ -2835,17 +2835,8 @@ static void intel_update_pipe_size(struct intel_crtc *crtc)
> > return;
> >
> > /*
> > - * Update pipe size and adjust fitter if needed: the reason for this is
> > - * that in compute_mode_changes we check the native mode (not the pfit
> > - * mode) to see if we can flip rather than do a full mode set. In the
> > - * fastboot case, we'll flip, but if we don't update the pipesrc and
> > - * pfit state, we'll end up with a big fb scanned out into the wrong
> > - * sized surface.
> > - *
> > - * To fix this properly, we need to hoist the checks up into
> > - * compute_mode_changes (or above), check the actual pfit state and
> > - * whether the platform allows pfit disable with pipe active, and only
> > - * then update the pipesrc and pfit state, even on the flip path.
> > + * See intel_pfit_changed for info on when we're allowed to
> > + * do this w/o a pipe shutdown.
> > */
> >
> > adjusted_mode = &crtc->config.adjusted_mode;
> > @@ -11171,6 +11162,50 @@ static void disable_crtc_nofb(struct intel_crtc *crtc)
> > crtc->new_config = NULL;
> > }
> >
> > +/* Do we need a mode set due to pfit changes? */
> > +static bool intel_pfit_changed(struct drm_device *dev,
> > + struct intel_crtc_config *new_config,
> > + struct intel_crtc_config *cur_config)
> > +{
> > + bool ret = false;
> > +
> > + if (HAS_DDI(dev) || HAS_PCH_SPLIT(dev)) {
> > + /*
> > + * On PCH platforms we can disable pfit w/o a pipe shutdown,
> > + * otherwise we'll need a mode set.
> > + */
> > + if (new_config->pch_pfit.enabled &&
> > + cur_config->pch_pfit.enabled)
> > + ret = false;
> > + else if (new_config->pch_pfit.enabled &&
> > + !cur_config->pch_pfit.enabled)
> > + ret = true;
> > + else if (!new_config->pch_pfit.enabled &&
> > + cur_config->pch_pfit.enabled)
> > + ret = false;
> > + else if (!new_config->pch_pfit.enabled &&
> > + !cur_config->pch_pfit.enabled)
> > + ret = false;
> > + } else {
> > + bool new_enabled, old_enabled;
> > +
> > + new_enabled = !!(new_config->gmch_pfit.control & PFIT_ENABLE);
> > + old_enabled = !!(cur_config->gmch_pfit.control & PFIT_ENABLE);
> > +
> > + /* 9xx only needs a shutdown to disable pfit */
> > + if (new_enabled && old_enabled)
> > + ret = false;
> > + else if (new_enabled && !old_enabled)
> > + ret = false;
> > + else if (!new_enabled && old_enabled)
> > + ret = true;
> > + else if (!new_enabled && !old_enabled)
> > + ret = false;
> > + }
>
> Maybe I missed something, but I couldn't find anything in the
> documentation the supports the claim above. However, [1] and [2] read
> that "[p]anel fitting should be enabled or disabled before the pipe is
> enabled" on the documentation for the PFIT_CONTROL.
>
>
> [1]
> https://01.org/linuxgraphics/sites/default/files/documentation/g45_vol_3_register_0_0.pdf
> [2]
> https://01.org/linuxgraphics/sites/default/files/documentation/965_g35_vol_3_display_registers_updated_1.pdf
Yeah the docs are extra conservative on this. But from memory, this is
what 965 allowed. It would be good to do some extra testing though;
915/945 may allow both pfit enable and disable without a pipe shutdown.
--
Jesse Barnes, Intel Open Source Technology Center
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2014-11-10 16:32 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-10-30 18:53 [PATCH 1/6] drm/i915: factor out compute_config from __intel_set_mode v2 Jesse Barnes
2014-10-30 18:54 ` [PATCH 2/6] drm/i915: use compute_config in set_config v2 Jesse Barnes
2014-10-30 18:54 ` [PATCH 3/6] drm/i915/hdmi: fetch infoframe status in get_config v2 Jesse Barnes
2014-10-30 18:54 ` [PATCH 4/6] drm/i915: check for audio and infoframe changes across mode sets Jesse Barnes
2014-10-30 18:54 ` [PATCH 5/6] drm/i915: update pipe size at set_config time Jesse Barnes
2014-10-30 18:54 ` [PATCH 6/6] drm/i915: calculate pfit changes in set_config v2 Jesse Barnes
2014-10-31 9:35 ` Ander Conselvan de Oliveira
2014-10-31 22:48 ` [PATCH 1/6] drm/i915: factor out compute_config from __intel_set_mode v2 Jesse Barnes
-- strict thread matches above, loose matches on Subject: below --
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 6/6] drm/i915: calculate pfit changes in set_config v2 Jesse Barnes
2014-11-10 16:20 ` Ander Conselvan de Oliveira
2014-11-10 16:32 ` Jesse Barnes
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox