summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/msm/sde/sde_encoder_phys.h2
-rw-r--r--drivers/gpu/drm/msm/sde/sde_encoder_phys_wb.c54
-rw-r--r--drivers/gpu/drm/msm/sde/sde_wb.c2
3 files changed, 43 insertions, 15 deletions
diff --git a/drivers/gpu/drm/msm/sde/sde_encoder_phys.h b/drivers/gpu/drm/msm/sde/sde_encoder_phys.h
index e17486c6e934..026c6118a4de 100644
--- a/drivers/gpu/drm/msm/sde/sde_encoder_phys.h
+++ b/drivers/gpu/drm/msm/sde/sde_encoder_phys.h
@@ -131,7 +131,6 @@ enum sde_enc_enable_state {
* @hw_ctl: Hardware interface to the ctl registers
* @hw_cdm: Hardware interface to the cdm registers
* @cdm_cfg: Chroma-down hardware configuration
- * @needs_cdm: Whether the mode / fmt require a CDM to function
* @sde_kms: Pointer to the sde_kms top level
* @cached_mode: DRM mode cached at mode_set time, acted on in enable
* @enabled: Whether the encoder has enabled and running a mode
@@ -147,7 +146,6 @@ struct sde_encoder_phys {
struct sde_encoder_virt_ops parent_ops;
struct sde_hw_mdp *hw_mdptop;
struct sde_hw_ctl *hw_ctl;
- bool needs_cdm;
struct sde_hw_cdm *hw_cdm;
struct sde_hw_cdm_cfg cdm_cfg;
struct sde_kms *sde_kms;
diff --git a/drivers/gpu/drm/msm/sde/sde_encoder_phys_wb.c b/drivers/gpu/drm/msm/sde/sde_encoder_phys_wb.c
index e3310b9ab7ec..54de5df638b0 100644
--- a/drivers/gpu/drm/msm/sde/sde_encoder_phys_wb.c
+++ b/drivers/gpu/drm/msm/sde/sde_encoder_phys_wb.c
@@ -12,7 +12,7 @@
*
*/
-#define pr_fmt(fmt) "sde-wb:[%s] " fmt, __func__
+#define pr_fmt(fmt) "[drm:%s:%d] " fmt, __func__, __LINE__
#include <linux/jiffies.h>
#include <linux/debugfs.h>
@@ -292,6 +292,16 @@ static int sde_encoder_phys_wb_atomic_check(
hw_wb->idx - WB_0, mode->base.id, mode->name,
mode->hdisplay, mode->vdisplay);
+ if (!conn_state || !conn_state->connector) {
+ SDE_ERROR("invalid connector state\n");
+ return -EINVAL;
+ } else if (conn_state->connector->status !=
+ connector_status_connected) {
+ SDE_ERROR("connector not connected %d\n",
+ conn_state->connector->status);
+ return -EINVAL;
+ }
+
memset(&wb_roi, 0, sizeof(struct sde_rect));
rc = sde_wb_connector_state_get_output_roi(conn_state, &wb_roi);
@@ -315,7 +325,7 @@ static int sde_encoder_phys_wb_atomic_check(
fmt = sde_get_sde_format_ext(fb->pixel_format, fb->modifier,
drm_format_num_planes(fb->pixel_format));
if (!fmt) {
- SDE_ERROR("unsupported output pixel format:%d\n",
+ SDE_ERROR("unsupported output pixel format:%x\n",
fb->pixel_format);
return -EINVAL;
}
@@ -335,7 +345,8 @@ static int sde_encoder_phys_wb_atomic_check(
return -EINVAL;
}
- phys_enc->needs_cdm = SDE_FORMAT_IS_YUV(fmt);
+ if (SDE_FORMAT_IS_YUV(fmt) != !!phys_enc->hw_cdm)
+ crtc_state->mode_changed = true;
if (wb_roi.w && wb_roi.h) {
if (wb_roi.w != mode->hdisplay) {
@@ -597,6 +608,9 @@ static void sde_encoder_phys_wb_mode_set(
hw_wb->idx - WB_0, mode->base.id,
mode->name, mode->hdisplay, mode->vdisplay);
+ phys_enc->hw_ctl = NULL;
+ phys_enc->hw_cdm = NULL;
+
/* Retrieve previously allocated HW Resources. CTL shouldn't fail */
sde_rm_init_hw_iter(&iter, phys_enc->parent->base.id, SDE_HW_BLK_CTL);
for (i = 0; i <= instance; i++) {
@@ -619,13 +633,10 @@ static void sde_encoder_phys_wb_mode_set(
phys_enc->hw_cdm = (struct sde_hw_cdm *) iter.hw;
}
- if (IS_ERR_OR_NULL(phys_enc->hw_cdm)) {
- if (phys_enc->needs_cdm) {
- SDE_ERROR("CDM required but not allocated: %ld\n",
- PTR_ERR(phys_enc->hw_cdm));
- phys_enc->hw_ctl = NULL;
- }
- phys_enc->hw_cdm = NULL;
+ if (IS_ERR(phys_enc->hw_cdm)) {
+ SDE_ERROR("CDM required but not allocated: %ld\n",
+ PTR_ERR(phys_enc->hw_cdm));
+ phys_enc->hw_ctl = NULL;
}
}
@@ -816,15 +827,34 @@ static void sde_encoder_phys_wb_get_hw_resources(
{
struct sde_encoder_phys_wb *wb_enc = to_sde_encoder_phys_wb(phys_enc);
struct sde_hw_wb *hw_wb;
+ struct drm_framebuffer *fb;
+ const struct sde_format *fmt;
if (!phys_enc) {
SDE_ERROR("invalid encoder\n");
return;
}
+
+ fb = sde_wb_connector_state_get_output_fb(conn_state);
+ if (!fb) {
+ SDE_ERROR("no output framebuffer\n");
+ return;
+ }
+
+ fmt = sde_get_sde_format_ext(fb->pixel_format, fb->modifier,
+ drm_format_num_planes(fb->pixel_format));
+ if (!fmt) {
+ SDE_ERROR("unsupported output pixel format:%d\n",
+ fb->pixel_format);
+ return;
+ }
+
hw_wb = wb_enc->hw_wb;
- SDE_DEBUG("[wb:%d]\n", hw_wb->idx - WB_0);
hw_res->wbs[hw_wb->idx - WB_0] = phys_enc->intf_mode;
- hw_res->needs_cdm = phys_enc->needs_cdm;
+ hw_res->needs_cdm = SDE_FORMAT_IS_YUV(fmt);
+ SDE_DEBUG("[wb:%d] intf_mode=%d needs_cdm=%d\n", hw_wb->idx - WB_0,
+ hw_res->wbs[hw_wb->idx - WB_0],
+ hw_res->needs_cdm);
}
/**
diff --git a/drivers/gpu/drm/msm/sde/sde_wb.c b/drivers/gpu/drm/msm/sde/sde_wb.c
index ae01d33130ab..1778721cf2a9 100644
--- a/drivers/gpu/drm/msm/sde/sde_wb.c
+++ b/drivers/gpu/drm/msm/sde/sde_wb.c
@@ -11,7 +11,7 @@
* GNU General Public License for more details.
*/
-#define pr_fmt(fmt) "sde-wb:[%s] " fmt, __func__
+#define pr_fmt(fmt) "[drm:%s:%d] " fmt, __func__, __LINE__
#include "msm_kms.h"
#include "sde_kms.h"