Skip to content

Commit

Permalink
drm/komeda: Adds output-color format support
Browse files Browse the repository at this point in the history
Sets output color format according to the connector formats and
display supported formats. Default value is RGB444 and only force
YUV format which must be YUV.

Signed-off-by: Lowry Li (Arm Technology China) <lowry.li@arm.com>
Reviewed-by: James Qian Wang (Arm Technology China) <james.qian.wang@arm.com>
Signed-off-by: james qian wang (Arm Technology China) <james.qian.wang@arm.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191015091019.26021-1-lowry.li@arm.com
  • Loading branch information
Lowry Li (Arm Technology China) authored and james qian wang (Arm Technology China) committed Oct 16, 2019
1 parent f9204ad commit f61714c
Show file tree
Hide file tree
Showing 6 changed files with 38 additions and 7 deletions.
14 changes: 13 additions & 1 deletion drivers/gpu/drm/arm/display/komeda/d71/d71_component.c
Original file line number Diff line number Diff line change
Expand Up @@ -1034,14 +1034,26 @@ static void d71_improc_update(struct komeda_component *c,
{
struct komeda_improc_state *st = to_improc_st(state);
u32 __iomem *reg = c->reg;
u32 index;
u32 index, mask = 0, ctrl = 0;

for_each_changed_input(state, index)
malidp_write32(reg, BLK_INPUT_ID0 + index * 4,
to_d71_input_id(state, index));

malidp_write32(reg, BLK_SIZE, HV_SIZE(st->hsize, st->vsize));
malidp_write32(reg, IPS_DEPTH, st->color_depth);

mask |= IPS_CTRL_YUV | IPS_CTRL_CHD422 | IPS_CTRL_CHD420;

/* config color format */
if (st->color_format == DRM_COLOR_FORMAT_YCRCB420)
ctrl |= IPS_CTRL_YUV | IPS_CTRL_CHD422 | IPS_CTRL_CHD420;
else if (st->color_format == DRM_COLOR_FORMAT_YCRCB422)
ctrl |= IPS_CTRL_YUV | IPS_CTRL_CHD422;
else if (st->color_format == DRM_COLOR_FORMAT_YCRCB444)
ctrl |= IPS_CTRL_YUV;

malidp_write32_mask(reg, BLK_CONTROL, mask, ctrl);
}

static void d71_improc_dump(struct komeda_component *c, struct seq_file *sf)
Expand Down
9 changes: 8 additions & 1 deletion drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,23 +18,30 @@
#include "komeda_kms.h"

void komeda_crtc_get_color_config(struct drm_crtc_state *crtc_st,
u32 *color_depths)
u32 *color_depths, u32 *color_formats)
{
struct drm_connector *conn;
struct drm_connector_state *conn_st;
u32 conn_color_formats = ~0u;
int i, min_bpc = 31, conn_bpc = 0;

for_each_new_connector_in_state(crtc_st->state, conn, conn_st, i) {
if (conn_st->crtc != crtc_st->crtc)
continue;

conn_bpc = conn->display_info.bpc ? conn->display_info.bpc : 8;
conn_color_formats &= conn->display_info.color_formats;

if (conn_bpc < min_bpc)
min_bpc = conn_bpc;
}

/* connector doesn't config any color_format, use RGB444 as default */
if (!conn_color_formats)
conn_color_formats = DRM_COLOR_FORMAT_RGB444;

*color_depths = GENMASK(min_bpc, 0);
*color_formats = conn_color_formats;
}

static void komeda_crtc_update_clock_ratio(struct komeda_crtc_state *kcrtc_st)
Expand Down
2 changes: 1 addition & 1 deletion drivers/gpu/drm/arm/display/komeda/komeda_kms.h
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ static inline bool has_flip_h(u32 rot)
}

void komeda_crtc_get_color_config(struct drm_crtc_state *crtc_st,
u32 *color_depths);
u32 *color_depths, u32 *color_formats);
unsigned long komeda_crtc_get_aclk(struct komeda_crtc_state *kcrtc_st);

int komeda_kms_setup_crtcs(struct komeda_kms_dev *kms, struct komeda_dev *mdev);
Expand Down
2 changes: 1 addition & 1 deletion drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h
Original file line number Diff line number Diff line change
Expand Up @@ -325,7 +325,7 @@ struct komeda_improc {

struct komeda_improc_state {
struct komeda_component_state base;
u8 color_depth;
u8 color_format, color_depth;
u16 hsize, vsize;
};

Expand Down
17 changes: 14 additions & 3 deletions drivers/gpu/drm/arm/display/komeda/komeda_pipeline_state.c
Original file line number Diff line number Diff line change
Expand Up @@ -775,10 +775,11 @@ komeda_improc_validate(struct komeda_improc *improc,
st->vsize = dflow->in_h;

if (drm_atomic_crtc_needs_modeset(crtc_st)) {
u32 output_depths;
u32 avail_depths;
u32 output_depths, output_formats;
u32 avail_depths, avail_formats;

komeda_crtc_get_color_config(crtc_st, &output_depths);
komeda_crtc_get_color_config(crtc_st, &output_depths,
&output_formats);

avail_depths = output_depths & improc->supported_color_depths;
if (avail_depths == 0) {
Expand All @@ -788,7 +789,17 @@ komeda_improc_validate(struct komeda_improc *improc,
return -EINVAL;
}

avail_formats = output_formats &
improc->supported_color_formats;
if (!avail_formats) {
DRM_DEBUG_ATOMIC("No available color_formats, conn formats 0x%x & display: 0x%x\n",
output_formats,
improc->supported_color_formats);
return -EINVAL;
}

st->color_depth = __fls(avail_depths);
st->color_format = BIT(__ffs(avail_formats));
}

komeda_component_add_input(&st->base, &dflow->input, 0);
Expand Down
1 change: 1 addition & 0 deletions drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,7 @@ static int komeda_wb_connector_add(struct komeda_kms_dev *kms,

info = &kwb_conn->base.base.display_info;
info->bpc = __fls(kcrtc->master->improc->supported_color_depths);
info->color_formats = kcrtc->master->improc->supported_color_formats;

kcrtc->wb_conn = kwb_conn;

Expand Down

0 comments on commit f61714c

Please sign in to comment.