summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnthony Koo <Anthony.Koo@amd.com>2017-08-03 09:59:23 -0400
committerAlex Deucher <alexander.deucher@amd.com>2017-09-26 18:16:20 -0400
commitd66cf5f5013a4268057bcb92d301d010268ea27f (patch)
tree3bad6df8f6eb551dacb8963036701f03f677a54d
parent665da60f23d8c6bda5431529a73be49b3b9d97cb (diff)
downloadlinux-d66cf5f5013a4268057bcb92d301d010268ea27f.tar.gz
linux-d66cf5f5013a4268057bcb92d301d010268ea27f.tar.bz2
linux-d66cf5f5013a4268057bcb92d301d010268ea27f.zip
drm/amd/display: implement DXGI Gamma Ramps
Support for gamma correction ramp in Floating Point format Signed-off-by: Anthony Koo <anthony.koo@amd.com> Reviewed-by: Tony Cheng <Tony.Cheng@amd.com> Acked-by: Harry Wentland <Harry.Wentland@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c14
-rw-r--r--drivers/gpu/drm/amd/display/dc/dc_hw_types.h21
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce/dce_ipp.c14
-rw-r--r--drivers/gpu/drm/amd/display/dc/dcn10/dcn10_ipp.c11
4 files changed, 40 insertions, 20 deletions
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 4535942e8a63..b0fcfebc04b8 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -1874,15 +1874,14 @@ static int fill_plane_attributes_from_fb(
}
-#define NUM_OF_RAW_GAMMA_RAMP_RGB_256 256
-
static void fill_gamma_from_crtc_state(
const struct drm_crtc_state *crtc_state,
struct dc_plane_state *plane_state)
{
int i;
struct dc_gamma *gamma;
- struct drm_color_lut *lut = (struct drm_color_lut *) crtc_state->gamma_lut->data;
+ struct drm_color_lut *lut =
+ (struct drm_color_lut *) crtc_state->gamma_lut->data;
gamma = dc_create_gamma();
@@ -1891,10 +1890,11 @@ static void fill_gamma_from_crtc_state(
return;
}
- for (i = 0; i < NUM_OF_RAW_GAMMA_RAMP_RGB_256; i++) {
- gamma->red[i] = lut[i].red;
- gamma->green[i] = lut[i].green;
- gamma->blue[i] = lut[i].blue;
+ gamma->type = GAMMA_RGB_256_ENTRIES;
+ for (i = 0; i < GAMMA_RGB_256_ENTRIES; i++) {
+ gamma->entries.red[i] = dal_fixed31_32_from_int(lut[i].red);
+ gamma->entries.green[i] = dal_fixed31_32_from_int(lut[i].green);
+ gamma->entries.blue[i] = dal_fixed31_32_from_int(lut[i].blue);
}
plane_state->gamma_correction = gamma;
diff --git a/drivers/gpu/drm/amd/display/dc/dc_hw_types.h b/drivers/gpu/drm/amd/display/dc/dc_hw_types.h
index 778bd5555c7a..8d1504668ec7 100644
--- a/drivers/gpu/drm/amd/display/dc/dc_hw_types.h
+++ b/drivers/gpu/drm/amd/display/dc/dc_hw_types.h
@@ -409,20 +409,31 @@ struct dc_cursor_mi_param {
/* IPP related types */
enum {
- INPUT_LUT_ENTRIES = 256
+ GAMMA_RGB_256_ENTRIES = 256,
+ GAMMA_RGB_FLOAT_1024_ENTRIES = 1024,
+ GAMMA_MAX_ENTRIES = 1024
+};
+
+enum dc_gamma_type {
+ GAMMA_RGB_256 = 1,
+ GAMMA_RGB_FLOAT_1024 = 2
};
struct dc_gamma {
- uint16_t red[INPUT_LUT_ENTRIES];
- uint16_t green[INPUT_LUT_ENTRIES];
- uint16_t blue[INPUT_LUT_ENTRIES];
+ enum dc_gamma_type type;
+ unsigned int num_entries;
+
+ struct dc_gamma_entries {
+ struct fixed31_32 red[GAMMA_MAX_ENTRIES];
+ struct fixed31_32 green[GAMMA_MAX_ENTRIES];
+ struct fixed31_32 blue[GAMMA_MAX_ENTRIES];
+ } entries;
/* private to DC core */
struct dc_context *ctx;
/* private to dc_surface.c */
int ref_count;
-
};
/* Used by both ipp amd opp functions*/
diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_ipp.c b/drivers/gpu/drm/amd/display/dc/dce/dce_ipp.c
index 9e8f0a3593a2..e010cf10d605 100644
--- a/drivers/gpu/drm/amd/display/dc/dce/dce_ipp.c
+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_ipp.c
@@ -193,10 +193,16 @@ static void dce_ipp_program_input_lut(
REG_SET(DC_LUT_RW_INDEX, 0,
DC_LUT_RW_INDEX, 0);
- for (i = 0; i < INPUT_LUT_ENTRIES; i++) {
- REG_SET(DC_LUT_SEQ_COLOR, 0, DC_LUT_SEQ_COLOR, gamma->red[i]);
- REG_SET(DC_LUT_SEQ_COLOR, 0, DC_LUT_SEQ_COLOR, gamma->green[i]);
- REG_SET(DC_LUT_SEQ_COLOR, 0, DC_LUT_SEQ_COLOR, gamma->blue[i]);
+ for (i = 0; i < gamma->num_entries; i++) {
+ REG_SET(DC_LUT_SEQ_COLOR, 0, DC_LUT_SEQ_COLOR,
+ dal_fixed31_32_round(
+ gamma->entries.red[i]));
+ REG_SET(DC_LUT_SEQ_COLOR, 0, DC_LUT_SEQ_COLOR,
+ dal_fixed31_32_round(
+ gamma->entries.green[i]));
+ REG_SET(DC_LUT_SEQ_COLOR, 0, DC_LUT_SEQ_COLOR,
+ dal_fixed31_32_round(
+ gamma->entries.blue[i]));
}
/* power off LUT memory */
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_ipp.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_ipp.c
index ee12f671d8ea..8ee830522148 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_ipp.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_ipp.c
@@ -910,13 +910,16 @@ static void ippn10_program_input_lut(
CM_IGAM_LUT_FORMAT_B, 3);
// Start at index 0 of IGAM LUT
REG_UPDATE(CM_IGAM_LUT_RW_INDEX, CM_IGAM_LUT_RW_INDEX, 0);
- for (i = 0; i < INPUT_LUT_ENTRIES; i++) {
+ for (i = 0; i < gamma->num_entries; i++) {
REG_SET(CM_IGAM_LUT_SEQ_COLOR, 0, CM_IGAM_LUT_SEQ_COLOR,
- gamma->red[i]);
+ dal_fixed31_32_round(
+ gamma->entries.red[i]));
REG_SET(CM_IGAM_LUT_SEQ_COLOR, 0, CM_IGAM_LUT_SEQ_COLOR,
- gamma->green[i]);
+ dal_fixed31_32_round(
+ gamma->entries.green[i]));
REG_SET(CM_IGAM_LUT_SEQ_COLOR, 0, CM_IGAM_LUT_SEQ_COLOR,
- gamma->blue[i]);
+ dal_fixed31_32_round(
+ gamma->entries.blue[i]));
}
// Power off LUT memory
REG_SET(CM_MEM_PWR_CTRL, 0, SHARED_MEM_PWR_DIS, 0);