@@ -53,6 +53,41 @@ struct clrmgr_property gen6_pipe_color_corrections[] = {
},
};
+/*
+* Gen6 plane level properties:
+* - Contrast adjustment for all sprite planes.
+* - Brightness adjustment for all sprite planes.
+* - Hue and Saturation adjustment for all sprite planes.
+*/
+struct clrmgr_property gen6_plane_color_corrections[] = {
+
+ {
+ .tweak_id = contrast,
+ .type = DRM_MODE_PROP_RANGE,
+ .max = CLRMGR_PROP_RANGE_MAX,
+ .min = 0,
+ .len = VLV_CB_MAX_VALS,
+ .name = "contrast",
+ },
+ {
+ .tweak_id = brightness,
+ .type = DRM_MODE_PROP_RANGE,
+ .max = CLRMGR_PROP_RANGE_MAX,
+ .min = 0,
+ .len = VLV_CB_MAX_VALS,
+ .name = "brightness",
+ },
+ {
+ .tweak_id = hue_saturation,
+ .type = DRM_MODE_PROP_RANGE,
+ .max = CLRMGR_PROP_RANGE_MAX,
+ .min = 0,
+ .len = VLV_HS_MAX_VALS,
+ .name = "hue-saturation",
+ }
+};
+
+
struct drm_property *intel_clrmgr_register(struct drm_device *dev,
struct drm_mode_object *obj, struct clrmgr_property *cp)
{
@@ -92,6 +127,96 @@ error:
return NULL;
}
+bool intel_clrmgr_register_plane_property(struct intel_plane *intel_plane,
+ struct clrmgr_reg_request *features)
+{
+ u32 count = 0;
+ struct clrmgr_property *cp;
+ struct clrmgr_regd_prop *regd_property;
+ struct drm_property *property;
+ struct drm_device *dev = intel_plane->base.dev;
+ struct drm_mode_object *obj = &intel_plane->base.base;
+ struct clrmgr_status *status = intel_plane->color_status;
+
+ /* Color manager initialized? */
+ if (!status) {
+ DRM_ERROR("Register request without plane init ?\n");
+ return false;
+ }
+
+ /* Validate input */
+ if (!features || !features->no_of_properties) {
+ DRM_ERROR("Invalid input to register plane property\n");
+ return false;
+ }
+
+ /* Create drm property */
+ while (count < features->no_of_properties) {
+ cp = &features->cp[count++];
+ property = intel_clrmgr_register(dev, obj, cp);
+ if (!property) {
+ DRM_ERROR("Failed to register property %s\n",
+ property->name);
+ goto error;
+ }
+
+ /* Add the property in global pipe status */
+ regd_property = kzalloc(sizeof(struct clrmgr_regd_prop),
+ GFP_KERNEL);
+ regd_property->property = property;
+ regd_property->enabled = false;
+ regd_property->set_property = cp->set_property;
+ status->cp[status->no_of_properties++] = regd_property;
+ }
+
+ /* Successfully registered all */
+ DRM_DEBUG_DRIVER("Registered color properties on plane %d\n",
+ intel_plane->plane);
+ return true;
+
+error:
+ if (--count) {
+ DRM_ERROR("Can only register following properties:\n");
+ while (count--)
+ DRM_ERROR("%s", status->cp[count]->property->name);
+ } else
+ DRM_ERROR("Can not register any property\n");
+ return false;
+}
+
+void
+intel_attach_plane_color_correction(struct intel_plane *intel_plane)
+{
+ struct clrmgr_reg_request *features;
+
+ /* Color manager initialized? */
+ if (!intel_plane->color_status) {
+ DRM_ERROR("Color manager not initialized for plane %d\n",
+ intel_plane->plane);
+ return;
+ }
+
+ DRM_DEBUG_DRIVER("\n");
+ features = kzalloc(sizeof(struct clrmgr_reg_request), GFP_KERNEL);
+ if (!features) {
+ DRM_ERROR("No memory for plane color features\n");
+ return;
+ }
+
+ features->no_of_properties = ARRAY_SIZE(gen6_plane_color_corrections);
+ memcpy(features->cp, gen6_plane_color_corrections,
+ features->no_of_properties *
+ sizeof(struct clrmgr_property));
+
+ /* Register plane level color properties */
+ if (!intel_clrmgr_register_plane_property(intel_plane, features))
+ DRM_ERROR("Register plane color property failed\n");
+ else
+ DRM_DEBUG_DRIVER("Attached colot corrections for plane %d\n",
+ intel_plane->plane);
+ kfree(features);
+}
+
bool intel_clrmgr_register_pipe_property(struct intel_crtc *intel_crtc,
struct clrmgr_reg_request *features)
@@ -38,6 +38,8 @@
/* Framework defs */
#define CLRMGR_PROP_MAX 10
#define CLRMGR_PROP_NAME_MAX 128
+#define CLRMGR_PROP_RANGE_MAX 0xFFFFFFFFFFFFFFFF
+
/* CSC / Wide gamut */
#define VLV_CSC_MATRIX_MAX_VALS 9
@@ -48,6 +50,12 @@
#define VLV_10BIT_GAMMA_MAX_VALS (VLV_10BIT_GAMMA_MAX_INDEX + \
CLRMGR_GAMMA_GCMAX_VAL)
+/* Sprite Contrast and Brightness Registers */
+#define VLV_CB_MAX_VALS 1
+
+/* Sprite Hue and Saturation Registers */
+#define VLV_HS_MAX_VALS 1
+
/* Color manager features */
enum clrmgr_tweaks {
csc = 0,
@@ -474,6 +474,9 @@ struct intel_plane {
struct drm_intel_sprite_colorkey *key);
void (*get_colorkey)(struct drm_plane *plane,
struct drm_intel_sprite_colorkey *key);
+
+ /* color-correction */
+ struct clrmgr_status *color_status;
};
struct intel_watermark_params {