@@ -612,6 +612,8 @@ static int drm_atomic_plane_set_property(struct drm_plane *plane,
&replaced);
state->color_mgmt_changed |= replaced;
return ret;
+ } else if (property == plane->gamma_mode_property) {
+ state->gamma_mode = val;
} else if (property == config->prop_fb_damage_clips) {
ret = drm_atomic_replace_property_blob_from_id(dev,
&state->fb_damage_clips,
@@ -685,6 +687,8 @@ drm_atomic_plane_get_property(struct drm_plane *plane,
state->degamma_lut->base.id : 0;
} else if (property == plane->ctm_property) {
*val = (state->ctm) ? state->ctm->base.id : 0;
+ } else if (property == plane->gamma_mode_property) {
+ *val = state->gamma_mode;
} else if (property == config->prop_fb_damage_clips) {
*val = (state->fb_damage_clips) ?
state->fb_damage_clips->base.id : 0;
@@ -606,6 +606,13 @@ EXPORT_SYMBOL(drm_plane_create_color_properties);
* Blob property which allows a userspace to provide CTM coefficients
* to do color space conversion or any other enhancement by doing a
* matrix multiplication using the h/w CTM processing engine
+ *
+ * gamma_mode_property:
+ * Blob property which advertizes the possible gamma modes and
+ * lut ranges supported by the platform. This allows userspace
+ * to query and get the plane gamma color caps and choose the
+ * appropriate gamma mode and create lut values accordingly
+ *
*/
int drm_plane_create_color_mgmt_properties(struct drm_device *dev,
struct drm_plane *plane,
@@ -634,6 +641,13 @@ int drm_plane_create_color_mgmt_properties(struct drm_device *dev,
plane->ctm_property = prop;
+ prop = drm_property_create(dev, DRM_MODE_PROP_ENUM,
+ "PLANE_GAMMA_MODE", num_values);
+ if (!prop)
+ return -ENOMEM;
+
+ plane->gamma_mode_property = prop;
+
return 0;
}
EXPORT_SYMBOL(drm_plane_create_color_mgmt_properties);
@@ -664,6 +678,16 @@ void drm_plane_attach_ctm_property(struct drm_plane *plane)
}
EXPORT_SYMBOL(drm_plane_attach_ctm_property);
+void drm_plane_attach_gamma_properties(struct drm_plane *plane)
+{
+ if (!plane->gamma_mode_property)
+ return;
+
+ drm_object_attach_property(&plane->base,
+ plane->gamma_mode_property, 0);
+}
+EXPORT_SYMBOL(drm_plane_attach_gamma_properties);
+
int drm_plane_color_add_gamma_degamma_mode_range(struct drm_plane *plane,
const char *name,
const struct drm_color_lut_range *ranges,
@@ -676,6 +700,8 @@ int drm_plane_color_add_gamma_degamma_mode_range(struct drm_plane *plane,
if (type == LUT_TYPE_DEGAMMA)
prop = plane->degamma_mode_property;
+ else
+ prop = plane->gamma_mode_property;
if (!prop)
return -EINVAL;
@@ -260,6 +260,13 @@ struct drm_plane_state {
*/
struct drm_property_blob *ctm;
+ /**
+ * @gamma_mode: This is a blob_id and exposes the platform capabilities
+ * wrt to various gamma modes and the respective lut ranges. This also
+ * helps user select a gamma mode amongst the supported ones.
+ */
+ u32 gamma_mode;
+
u8 color_mgmt_changed : 1;
};
@@ -791,6 +798,12 @@ struct drm_plane {
* degamma LUT.
*/
struct drm_property *ctm_property;
+
+ /**
+ * @gamma_mode_property: Optional Plane property to set the LUT
+ * used to convert the framebuffer's colors to non-linear gamma.
+ */
+ struct drm_property *gamma_mode_property;
};
#define obj_to_plane(x) container_of(x, struct drm_plane, base)
@@ -887,6 +900,7 @@ int drm_plane_create_color_mgmt_properties(struct drm_device *dev,
int num_values);
void drm_plane_attach_degamma_properties(struct drm_plane *plane);
void drm_plane_attach_ctm_property(struct drm_plane *plane);
+void drm_plane_attach_gamma_properties(struct drm_plane *plane);
int drm_plane_color_add_gamma_degamma_mode_range(struct drm_plane *plane,
const char *name,
const struct drm_color_lut_range *ranges,