drm/komeda: Add image enhancement support
Besides scaling, Arm display scaler also can support image enhancement. For support it, Add a new property "img_enhancement" to plane, then user can turn on/off it by this property, and kernel follow user's requirement to maitain the state and enable/disable the real HW image enhancement. v2: Rebase and rename "needs_img_enhancement" to "en_img_enhancement" Signed-off-by: James Qian Wang (Arm Technology China) <james.qian.wang@arm.com> Signed-off-by: Liviu Dudau <liviu.dudau@arm.com>
This commit is contained in:
parent
1f7f9ab790
commit
42b6f118f6
|
@ -610,6 +610,7 @@ static void d71_scaler_update(struct komeda_component *c,
|
|||
ctrl = 0;
|
||||
ctrl |= st->en_scaling ? SC_CTRL_SCL : 0;
|
||||
ctrl |= st->en_alpha ? SC_CTRL_AP : 0;
|
||||
ctrl |= st->en_img_enhancement ? SC_CTRL_IENH : 0;
|
||||
|
||||
malidp_write32(reg, BLK_CONTROL, ctrl);
|
||||
malidp_write32(reg, BLK_INPUT_ID0, to_d71_input_id(&state->inputs[0]));
|
||||
|
|
|
@ -32,6 +32,9 @@ struct komeda_plane {
|
|||
* Layers with same capabilities.
|
||||
*/
|
||||
struct komeda_layer *layer;
|
||||
|
||||
/** @prop_img_enhancement: for on/off image enhancement */
|
||||
struct drm_property *prop_img_enhancement;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -44,7 +47,8 @@ struct komeda_plane_state {
|
|||
/** @base: &drm_plane_state */
|
||||
struct drm_plane_state base;
|
||||
|
||||
/* private properties */
|
||||
/* @img_enhancement: on/off image enhancement */
|
||||
u8 img_enhancement : 1;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -254,7 +254,8 @@ struct komeda_scaler_state {
|
|||
u16 hsize_in, vsize_in;
|
||||
u16 hsize_out, vsize_out;
|
||||
u8 en_scaling : 1,
|
||||
en_alpha : 1; /* enable alpha processing */
|
||||
en_alpha : 1, /* enable alpha processing */
|
||||
en_img_enhancement : 1;
|
||||
};
|
||||
|
||||
struct komeda_compiz {
|
||||
|
@ -313,7 +314,8 @@ struct komeda_data_flow_cfg {
|
|||
u32 rot;
|
||||
int blending_zorder;
|
||||
u8 pixel_blend_mode, layer_alpha;
|
||||
u8 en_scaling : 1;
|
||||
u8 en_scaling : 1,
|
||||
en_img_enhancement : 1;
|
||||
};
|
||||
|
||||
struct komeda_pipeline_funcs {
|
||||
|
|
|
@ -457,7 +457,7 @@ komeda_scaler_validate(void *user,
|
|||
struct komeda_scaler *scaler;
|
||||
int err = 0;
|
||||
|
||||
if (!dflow->en_scaling)
|
||||
if (!(dflow->en_scaling || dflow->en_img_enhancement))
|
||||
return 0;
|
||||
|
||||
scaler = komeda_component_get_avail_scaler(dflow->input.component,
|
||||
|
@ -482,9 +482,11 @@ komeda_scaler_validate(void *user,
|
|||
st->vsize_in = dflow->in_h;
|
||||
st->hsize_out = dflow->out_w;
|
||||
st->vsize_out = dflow->out_h;
|
||||
st->en_scaling = dflow->en_scaling;
|
||||
|
||||
/* Enable alpha processing if the next stage needs the pixel alpha */
|
||||
st->en_alpha = dflow->pixel_blend_mode != DRM_MODE_BLEND_PIXEL_NONE;
|
||||
st->en_scaling = dflow->en_scaling;
|
||||
st->en_img_enhancement = dflow->en_img_enhancement;
|
||||
|
||||
komeda_component_add_input(&st->base, &dflow->input, 0);
|
||||
komeda_component_set_output(&dflow->input, &scaler->base, 0);
|
||||
|
|
|
@ -15,6 +15,7 @@ static int
|
|||
komeda_plane_init_data_flow(struct drm_plane_state *st,
|
||||
struct komeda_data_flow_cfg *dflow)
|
||||
{
|
||||
struct komeda_plane_state *kplane_st = to_kplane_st(st);
|
||||
struct drm_framebuffer *fb = st->fb;
|
||||
|
||||
memset(dflow, 0, sizeof(*dflow));
|
||||
|
@ -36,6 +37,8 @@ komeda_plane_init_data_flow(struct drm_plane_state *st,
|
|||
dflow->in_w = st->src_w >> 16;
|
||||
dflow->in_h = st->src_h >> 16;
|
||||
|
||||
dflow->en_img_enhancement = kplane_st->img_enhancement;
|
||||
|
||||
komeda_complete_data_flow_cfg(dflow);
|
||||
|
||||
return 0;
|
||||
|
@ -131,7 +134,7 @@ static void komeda_plane_reset(struct drm_plane *plane)
|
|||
static struct drm_plane_state *
|
||||
komeda_plane_atomic_duplicate_state(struct drm_plane *plane)
|
||||
{
|
||||
struct komeda_plane_state *new;
|
||||
struct komeda_plane_state *new, *old;
|
||||
|
||||
if (WARN_ON(!plane->state))
|
||||
return NULL;
|
||||
|
@ -142,6 +145,10 @@ komeda_plane_atomic_duplicate_state(struct drm_plane *plane)
|
|||
|
||||
__drm_atomic_helper_plane_duplicate_state(plane, &new->base);
|
||||
|
||||
old = to_kplane_st(plane->state);
|
||||
|
||||
new->img_enhancement = old->img_enhancement;
|
||||
|
||||
return &new->base;
|
||||
}
|
||||
|
||||
|
@ -153,6 +160,40 @@ komeda_plane_atomic_destroy_state(struct drm_plane *plane,
|
|||
kfree(to_kplane_st(state));
|
||||
}
|
||||
|
||||
static int
|
||||
komeda_plane_atomic_get_property(struct drm_plane *plane,
|
||||
const struct drm_plane_state *state,
|
||||
struct drm_property *property,
|
||||
uint64_t *val)
|
||||
{
|
||||
struct komeda_plane *kplane = to_kplane(plane);
|
||||
struct komeda_plane_state *st = to_kplane_st(state);
|
||||
|
||||
if (property == kplane->prop_img_enhancement)
|
||||
*val = st->img_enhancement;
|
||||
else
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
komeda_plane_atomic_set_property(struct drm_plane *plane,
|
||||
struct drm_plane_state *state,
|
||||
struct drm_property *property,
|
||||
uint64_t val)
|
||||
{
|
||||
struct komeda_plane *kplane = to_kplane(plane);
|
||||
struct komeda_plane_state *st = to_kplane_st(state);
|
||||
|
||||
if (property == kplane->prop_img_enhancement)
|
||||
st->img_enhancement = !!val;
|
||||
else
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool
|
||||
komeda_plane_format_mod_supported(struct drm_plane *plane,
|
||||
u32 format, u64 modifier)
|
||||
|
@ -172,9 +213,33 @@ static const struct drm_plane_funcs komeda_plane_funcs = {
|
|||
.reset = komeda_plane_reset,
|
||||
.atomic_duplicate_state = komeda_plane_atomic_duplicate_state,
|
||||
.atomic_destroy_state = komeda_plane_atomic_destroy_state,
|
||||
.atomic_get_property = komeda_plane_atomic_get_property,
|
||||
.atomic_set_property = komeda_plane_atomic_set_property,
|
||||
.format_mod_supported = komeda_plane_format_mod_supported,
|
||||
};
|
||||
|
||||
static int
|
||||
komeda_plane_create_layer_properties(struct komeda_plane *kplane,
|
||||
struct komeda_layer *layer)
|
||||
{
|
||||
struct drm_device *drm = kplane->base.dev;
|
||||
struct drm_plane *plane = &kplane->base;
|
||||
struct drm_property *prop = NULL;
|
||||
|
||||
/* property: layer image_enhancement */
|
||||
if (layer->base.supported_outputs & KOMEDA_PIPELINE_SCALERS) {
|
||||
prop = drm_property_create_bool(drm, DRM_MODE_PROP_ATOMIC,
|
||||
"img_enhancement");
|
||||
if (!prop)
|
||||
return -ENOMEM;
|
||||
|
||||
drm_object_attach_property(&plane->base, prop, 0);
|
||||
kplane->prop_img_enhancement = prop;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* for komeda, which is pipeline can be share between crtcs */
|
||||
static u32 get_possible_crtcs(struct komeda_kms_dev *kms,
|
||||
struct komeda_pipeline *pipe)
|
||||
|
@ -236,6 +301,10 @@ static int komeda_plane_add(struct komeda_kms_dev *kms,
|
|||
|
||||
drm_plane_helper_add(plane, &komeda_plane_helper_funcs);
|
||||
|
||||
err = komeda_plane_create_layer_properties(kplane, layer);
|
||||
if (err)
|
||||
goto cleanup;
|
||||
|
||||
return 0;
|
||||
cleanup:
|
||||
komeda_plane_destroy(plane);
|
||||
|
|
Loading…
Reference in New Issue