diff options
| author | Philippe CORNU <philippe.cornu@st.com> | 2017-10-26 07:17:46 -0400 |
|---|---|---|
| committer | Benjamin Gaignard <benjamin.gaignard@linaro.org> | 2018-01-09 07:40:51 -0500 |
| commit | b706a25eaed083a54afd113db86ee9747cc2f28b (patch) | |
| tree | b0d9047804c6b1aa14da17251beaecc7a9972aa8 /drivers/gpu/drm | |
| parent | c4712f27be5159819a735d7d294103040cf60477 (diff) | |
drm/stm: ltdc: add clut mode support
Add the 8-bit clut mode support at crtc level.
Useful for low memory footprint user interfaces but also for
8-bit old games (including color shifting visual effects).
Tested with fbdev FBIOPUTCMAP & drm DRM_IOCTL_MODE_SETGAMMA
ioctls.
Signed-off-by: Philippe Cornu <philippe.cornu@st.com>
Signed-off-by: Benjamin Gaignard <benjamin.gaignard@linaro.org>
Link: https://patchwork.freedesktop.org/patch/msgid/1509016666-18927-1-git-send-email-philippe.cornu@st.com
Diffstat (limited to 'drivers/gpu/drm')
| -rw-r--r-- | drivers/gpu/drm/stm/ltdc.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/drivers/gpu/drm/stm/ltdc.c b/drivers/gpu/drm/stm/ltdc.c index 6dc5d4ec4e17..b48589343ae1 100644 --- a/drivers/gpu/drm/stm/ltdc.c +++ b/drivers/gpu/drm/stm/ltdc.c | |||
| @@ -175,6 +175,8 @@ | |||
| 175 | 175 | ||
| 176 | #define LXCFBLNR_CFBLN GENMASK(10, 0) /* Color Frame Buffer Line Number */ | 176 | #define LXCFBLNR_CFBLN GENMASK(10, 0) /* Color Frame Buffer Line Number */ |
| 177 | 177 | ||
| 178 | #define CLUT_SIZE 256 | ||
| 179 | |||
| 178 | #define CONSTA_MAX 0xFF /* CONSTant Alpha MAX= 1.0 */ | 180 | #define CONSTA_MAX 0xFF /* CONSTant Alpha MAX= 1.0 */ |
| 179 | #define BF1_PAXCA 0x600 /* Pixel Alpha x Constant Alpha */ | 181 | #define BF1_PAXCA 0x600 /* Pixel Alpha x Constant Alpha */ |
| 180 | #define BF1_CA 0x400 /* Constant Alpha */ | 182 | #define BF1_CA 0x400 /* Constant Alpha */ |
| @@ -363,6 +365,28 @@ static irqreturn_t ltdc_irq(int irq, void *arg) | |||
| 363 | * DRM_CRTC | 365 | * DRM_CRTC |
| 364 | */ | 366 | */ |
| 365 | 367 | ||
| 368 | static void ltdc_crtc_update_clut(struct drm_crtc *crtc) | ||
| 369 | { | ||
| 370 | struct ltdc_device *ldev = crtc_to_ltdc(crtc); | ||
| 371 | struct drm_color_lut *lut; | ||
| 372 | u32 val; | ||
| 373 | int i; | ||
| 374 | |||
| 375 | if (!crtc || !crtc->state) | ||
| 376 | return; | ||
| 377 | |||
| 378 | if (!crtc->state->color_mgmt_changed || !crtc->state->gamma_lut) | ||
| 379 | return; | ||
| 380 | |||
| 381 | lut = (struct drm_color_lut *)crtc->state->gamma_lut->data; | ||
| 382 | |||
| 383 | for (i = 0; i < CLUT_SIZE; i++, lut++) { | ||
| 384 | val = ((lut->red << 8) & 0xff0000) | (lut->green & 0xff00) | | ||
| 385 | (lut->blue >> 8) | (i << 24); | ||
| 386 | reg_write(ldev->regs, LTDC_L1CLUTWR, val); | ||
| 387 | } | ||
| 388 | } | ||
| 389 | |||
| 366 | static void ltdc_crtc_atomic_enable(struct drm_crtc *crtc, | 390 | static void ltdc_crtc_atomic_enable(struct drm_crtc *crtc, |
| 367 | struct drm_crtc_state *old_state) | 391 | struct drm_crtc_state *old_state) |
| 368 | { | 392 | { |
| @@ -486,6 +510,8 @@ static void ltdc_crtc_atomic_flush(struct drm_crtc *crtc, | |||
| 486 | 510 | ||
| 487 | DRM_DEBUG_ATOMIC("\n"); | 511 | DRM_DEBUG_ATOMIC("\n"); |
| 488 | 512 | ||
| 513 | ltdc_crtc_update_clut(crtc); | ||
| 514 | |||
| 489 | /* Commit shadow registers = update planes at next vblank */ | 515 | /* Commit shadow registers = update planes at next vblank */ |
| 490 | reg_set(ldev->regs, LTDC_SRCR, SRCR_VBR); | 516 | reg_set(ldev->regs, LTDC_SRCR, SRCR_VBR); |
| 491 | 517 | ||
| @@ -533,6 +559,7 @@ static const struct drm_crtc_funcs ltdc_crtc_funcs = { | |||
| 533 | .reset = drm_atomic_helper_crtc_reset, | 559 | .reset = drm_atomic_helper_crtc_reset, |
| 534 | .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state, | 560 | .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state, |
| 535 | .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state, | 561 | .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state, |
| 562 | .gamma_set = drm_atomic_helper_legacy_gamma_set, | ||
| 536 | }; | 563 | }; |
| 537 | 564 | ||
| 538 | /* | 565 | /* |
| @@ -765,6 +792,9 @@ static int ltdc_crtc_init(struct drm_device *ddev, struct drm_crtc *crtc) | |||
| 765 | 792 | ||
| 766 | drm_crtc_helper_add(crtc, <dc_crtc_helper_funcs); | 793 | drm_crtc_helper_add(crtc, <dc_crtc_helper_funcs); |
| 767 | 794 | ||
| 795 | drm_mode_crtc_set_gamma_size(crtc, CLUT_SIZE); | ||
| 796 | drm_crtc_enable_color_mgmt(crtc, 0, false, CLUT_SIZE); | ||
| 797 | |||
| 768 | DRM_DEBUG_DRIVER("CRTC:%d created\n", crtc->base.id); | 798 | DRM_DEBUG_DRIVER("CRTC:%d created\n", crtc->base.id); |
| 769 | 799 | ||
| 770 | /* Add planes. Note : the first layer is used by primary plane */ | 800 | /* Add planes. Note : the first layer is used by primary plane */ |
