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>
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;
#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
}
}
#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);
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;
static int cm2_sat_array[eCM2ColorMd_max][2];
static int cm2_hue_by_hs_array[eCM2ColorMd_max][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)
{
__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
};