mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 20:07:46 +09:00
drm: merge commit related to gamma [1/1]
PD#SWPL-11059 Problem: gamma setting in DRM Solution: merge commit related to gamma Author: Ao Xu <ao.xu@amlogic.com> Date: Tue Oct 30 19:18:21 2018 +0800 drm: add meson private property gamma_lut When setting CTM, gamma is also set again. Setting gamma frequently will lead to visual glitches. Add a private value to record whether gamma_lut blob is changed. Bug: b/113682067 Test: Ran on device and changed gamma to verify there are no glitches Author: Fergus Simpson <afergs@google.com> Date: Fri Aug 10 13:18:36 2018 -0700 [Estelle] Enable top/bottom color clamping Modifies amvecm's color clipping to allow either the lower or upper limit to be set. This sets clipping registers that hold the top and bottom 10-bit clipping values for each color channel. This does not cause the artifacts that we've been seeing while trying enable the gamma tables. Usage (set a clip of 32/255): echo 20080020 > /sys/class/amvecm/color_bottom Bug: 109942195 Test: Flashed to device and tested with a internal changes that use the registers. Author: Frank Chen <frank.chen@amlogic.com> Date: Wed Aug 8 15:21:17 2018 +0800 remove gamma_enable in am_meson_crtc_create Verify: verify by u200 Change-Id: I4221b3b4671516e7afd4dea14ce3cd71b4b66433 Signed-off-by: Dezhi Kong <dezhi.kong@amlogic.com>
This commit is contained in:
@@ -194,7 +194,7 @@ static void am_meson_crtc_atomic_flush(struct drm_crtc *crtc,
|
||||
struct drm_color_lut *lut;
|
||||
struct am_meson_crtc *amcrtc = to_am_meson_crtc(crtc);
|
||||
struct drm_atomic_state *old_atomic_state = old_state->state;
|
||||
|
||||
struct meson_drm *priv = amcrtc->priv;
|
||||
struct meson_vpu_pipeline *pipeline = amcrtc->pipeline;
|
||||
#ifdef CONFIG_AMLOGIC_MEDIA_ENHANCEMENT
|
||||
int gamma_lut_size = 0;
|
||||
@@ -209,15 +209,32 @@ static void am_meson_crtc_atomic_flush(struct drm_crtc *crtc,
|
||||
#ifdef CONFIG_AMLOGIC_MEDIA_ENHANCEMENT
|
||||
am_meson_ctm_set(0, ctm);
|
||||
#endif
|
||||
} else {
|
||||
DRM_DEBUG("%s Disable CTM!\n", __func__);
|
||||
#ifdef CONFIG_AMLOGIC_MEDIA_ENHANCEMENT
|
||||
am_meson_ctm_disable();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
if (crtc->state->gamma_lut != priv->gamma_lut_blob) {
|
||||
DRM_DEBUG("%s GAMMA LUT blob changed!\n", __func__);
|
||||
drm_property_unreference_blob(priv->gamma_lut_blob);
|
||||
priv->gamma_lut_blob = NULL;
|
||||
if (crtc->state->gamma_lut) {
|
||||
DRM_INFO("%s color_mgmt_changed 2!\n", __func__);
|
||||
DRM_INFO("%s Set GAMMA\n", __func__);
|
||||
priv->gamma_lut_blob = drm_property_reference_blob(
|
||||
crtc->state->gamma_lut);
|
||||
lut = (struct drm_color_lut *)
|
||||
crtc->state->gamma_lut->data;
|
||||
#ifdef CONFIG_AMLOGIC_MEDIA_ENHANCEMENT
|
||||
gamma_lut_size = amvecm_drm_get_gamma_size(0);
|
||||
amvecm_drm_gamma_set(0, lut, gamma_lut_size);
|
||||
#endif
|
||||
} else {
|
||||
DRM_DEBUG("%s Disable GAMMA!\n", __func__);
|
||||
#ifdef CONFIG_AMLOGIC_MEDIA_ENHANCEMENT
|
||||
amvecm_drm_gamma_disable(0);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -258,7 +275,6 @@ int am_meson_crtc_create(struct am_meson_crtc *amcrtc)
|
||||
|
||||
#ifdef CONFIG_AMLOGIC_MEDIA_ENHANCEMENT
|
||||
amvecm_drm_init(0);
|
||||
amvecm_drm_gamma_enable(0);
|
||||
gamma_lut_size = amvecm_drm_get_gamma_size(0);
|
||||
drm_mode_crtc_set_gamma_size(crtc, gamma_lut_size);
|
||||
drm_crtc_enable_color_mgmt(crtc, 0, true, gamma_lut_size);
|
||||
|
||||
@@ -51,6 +51,7 @@ struct meson_drm {
|
||||
struct drm_gem_object *fbdev_bo;
|
||||
struct drm_plane *primary_plane;
|
||||
struct drm_plane *cursor_plane;
|
||||
struct drm_property_blob *gamma_lut_blob;
|
||||
|
||||
#ifdef CONFIG_DRM_MESON_USE_ION
|
||||
struct ion_client *gem_client;
|
||||
|
||||
@@ -4489,6 +4489,47 @@ static int cm2_luma_array[color_mode_idx][2];
|
||||
static int cm2_sat_array[color_mode_idx][2];
|
||||
static int cm2_hue_by_hs_array[color_mode_idx][2];
|
||||
|
||||
#define MAX_CLIP_VAL ((1<<30)-1)
|
||||
static ssize_t amvecm_clamp_color_top_show(struct class *cla,
|
||||
struct class_attribute *attr, char *buf)
|
||||
{
|
||||
return sprintf(buf, "0x%08x\n", READ_VPP_REG(VPP_CLIP_MISC0));
|
||||
}
|
||||
static ssize_t amvecm_clamp_color_top_store(struct class *cla,
|
||||
struct class_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
size_t r;
|
||||
uint32_t val;
|
||||
|
||||
r = sscanf(buf, "%x\n", &val);
|
||||
if ((r != 1) || (val > MAX_CLIP_VAL))
|
||||
return -EINVAL;
|
||||
|
||||
WRITE_VPP_REG(VPP_CLIP_MISC0, val);
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t amvecm_clamp_color_bottom_show(struct class *cla,
|
||||
struct class_attribute *attr, char *buf)
|
||||
{
|
||||
return sprintf(buf, "0x%08x\n", READ_VPP_REG(VPP_CLIP_MISC1));
|
||||
}
|
||||
static ssize_t amvecm_clamp_color_bottom_store(struct class *cla,
|
||||
struct class_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
size_t r;
|
||||
uint32_t val;
|
||||
|
||||
r = sscanf(buf, "%x\n", &val);
|
||||
if ((r != 1) || (val > MAX_CLIP_VAL))
|
||||
return -EINVAL;
|
||||
|
||||
WRITE_VPP_REG(VPP_CLIP_MISC1, val);
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t amvecm_cm2_hue_show(struct class *cla,
|
||||
struct class_attribute *attr, char *buf)
|
||||
{
|
||||
@@ -5752,6 +5793,11 @@ static struct class_attribute amvecm_class_attrs[] = {
|
||||
__ATTR(lc, 0644,
|
||||
amvecm_lc_show,
|
||||
amvecm_lc_store),
|
||||
__ATTR(color_top, 0644,
|
||||
amvecm_clamp_color_top_show, amvecm_clamp_color_top_store),
|
||||
__ATTR(color_bottom, 0644,
|
||||
amvecm_clamp_color_bottom_show,
|
||||
amvecm_clamp_color_bottom_store),
|
||||
__ATTR_NULL
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user