@@ -27,18 +27,113 @@
#include "intel_color_manager.h"
+int get_chv_pipe_capabilities(struct drm_device *dev,
+ struct drm_color_caps *color_caps, struct drm_crtc *crtc)
+{
+ struct drm_palette_caps palette_caps_after_ctm;
+ struct drm_palette_caps palette_caps_before_ctm;
+ struct drm_palette_sampling_details
+ palette_sampling_before_ctm[CHV_MAX_PALETTE_CAPS_BEFORE_CTM];
+ struct drm_palette_sampling_details
+ palette_sampling_after_ctm[CHV_MAX_PALETTE_CAPS_AFTER_CTM];
+ struct drm_ctm_caps ctm_caps;
+ struct drm_property_blob *blob = NULL;
+ struct drm_mode_config *config = &dev->mode_config;
+ int ret;
+
+ palette_sampling_before_ctm[0].sample_fract_precision =
+ CHV_DEGAMMA_PRECISION;
+ palette_sampling_before_ctm[0].last_sample_int_max =
+ CHV_DEGAMMA_LAST_SAMPLE_INT_MAX;
+ palette_sampling_before_ctm[0].remaining_sample_int_max =
+ CHV_DEGAMMA_SAMPLE_INT_MAX;
+ palette_sampling_before_ctm[0].num_samples =
+ CHV_DEGAMMA_MAX_VALS;
+
+ palette_caps_before_ctm.version = CHV_PALETTE_STRUCT_VERSION;
+ palette_caps_before_ctm.num_supported_types =
+ CHV_MAX_PALETTE_CAPS_BEFORE_CTM;
+ palette_caps_before_ctm.palette_sampling_types[0] =
+ palette_sampling_before_ctm[0];
+
+ palette_sampling_after_ctm[0].sample_fract_precision =
+ CHV_10BIT_GAMMA_PRECISION;
+ palette_sampling_after_ctm[0].last_sample_int_max =
+ CHV_GAMMA_LAST_SAMPLE_INT_MAX;
+ palette_sampling_after_ctm[0].remaining_sample_int_max =
+ CHV_GAMMA_SAMPLE_INT_MAX;
+ palette_sampling_after_ctm[0].num_samples =
+ CHV_10BIT_GAMMA_MAX_VALS;
+
+ palette_sampling_after_ctm[1].sample_fract_precision =
+ CHV_8BIT_GAMMA_PRECISION;
+ palette_sampling_after_ctm[1].last_sample_int_max =
+ CHV_GAMMA_LAST_SAMPLE_INT_MAX;
+ palette_sampling_after_ctm[1].remaining_sample_int_max =
+ CHV_GAMMA_SAMPLE_INT_MAX;
+ palette_sampling_after_ctm[1].num_samples =
+ CHV_8BIT_GAMMA_MAX_VALS;
+
+ palette_caps_after_ctm.version = CHV_PALETTE_STRUCT_VERSION;
+ palette_caps_after_ctm.num_supported_types =
+ CHV_MAX_PALETTE_CAPS_AFTER_CTM;
+ palette_caps_after_ctm.palette_sampling_types[0] =
+ palette_sampling_after_ctm[0];
+ palette_caps_after_ctm.palette_sampling_types[1] =
+ palette_sampling_after_ctm[1];
+
+ ctm_caps.version = CHV_CTM_STRUCT_VERSION;
+ ctm_caps.ctm_coeff_fract_precision = CHV_CSC_COEFF_MAX_PRECISION;
+ ctm_caps.ctm_coeff_int_max = CHV_CSC_COEFF_MAX_INT;
+ ctm_caps.ctm_coeff_int_min = CHV_CSC_COEFF_MIN_INT;
+
+ color_caps->version = CHV_PLATFORM_STRUCT_VERSION;
+ color_caps->palette_caps_after_ctm = palette_caps_after_ctm;
+ color_caps->palette_caps_before_ctm = palette_caps_before_ctm;
+ color_caps->ctm_caps = ctm_caps;
+
+ ret = drm_property_replace_global_blob(dev, &blob,
+ sizeof(struct drm_color_caps),
+ (const void *)color_caps,
+ &crtc->base, config->prop_color_capabilities);
+ if (ret) {
+ DRM_ERROR("Error updating Gamma blob\n");
+ return -EFAULT;
+ }
+
+ return 0;
+}
+
+int get_pipe_capabilities(struct drm_device *dev,
+ struct drm_color_caps *color_caps, struct drm_crtc *crtc)
+{
+ if (IS_CHERRYVIEW(dev))
+ return get_chv_pipe_capabilities(dev, color_caps, crtc);
+ return -EINVAL;
+}
+
void intel_color_manager_attach(struct drm_device *dev,
struct drm_mode_object *mode_obj)
{
struct drm_mode_config *config = &dev->mode_config;
+ struct drm_color_caps *color_caps;
+ struct drm_crtc *crtc;
+ int ret;
if (mode_obj->type == DRM_MODE_OBJECT_CRTC) {
+ crtc = obj_to_crtc(mode_obj);
if (config->prop_color_capabilities) {
drm_object_attach_property(mode_obj,
config->prop_color_capabilities, 0);
DRM_DEBUG_DRIVER("Attached Color Caps property to CRTC\n");
} else
DRM_ERROR("Error attaching Color Capabilities property to CRTC\n");
+
+ color_caps = kzalloc(sizeof(struct drm_color_caps), GFP_KERNEL);
+ ret = get_pipe_capabilities(dev, color_caps, crtc);
+ if (ret)
+ DRM_ERROR("Error getting CRTC capabilities for platform\n");
+
if (config->prop_palette_before_ctm) {
drm_object_attach_property(mode_obj,
config->prop_palette_before_ctm, 0);
@@ -26,3 +26,23 @@
*/
#include <drm/drmP.h>
#include <drm/drm_crtc_helper.h>
+#include "i915_drv.h"
+
+#define CHV_PALETTE_STRUCT_VERSION 1
+#define CHV_CTM_STRUCT_VERSION 1
+#define CHV_PLATFORM_STRUCT_VERSION 1
+#define CHV_MAX_PALETTE_CAPS_BEFORE_CTM 1
+#define CHV_MAX_PALETTE_CAPS_AFTER_CTM 2
+#define CHV_DEGAMMA_PRECISION 14
+#define CHV_DEGAMMA_LAST_SAMPLE_INT_MAX 0
+#define CHV_DEGAMMA_SAMPLE_INT_MAX 0
+#define CHV_DEGAMMA_MAX_VALS 65
+#define CHV_10BIT_GAMMA_PRECISION 10
+#define CHV_GAMMA_LAST_SAMPLE_INT_MAX 0
+#define CHV_GAMMA_SAMPLE_INT_MAX 0
+#define CHV_10BIT_GAMMA_MAX_VALS 257
+#define CHV_8BIT_GAMMA_PRECISION 8
+#define CHV_8BIT_GAMMA_MAX_VALS 256
+#define CHV_CSC_COEFF_MAX_PRECISION 12
+#define CHV_CSC_COEFF_MAX_INT 7
+#define CHV_CSC_COEFF_MIN_INT -7