Skip to content

Commit ed2ef21

Browse files
committed
drm/mgag200: Store primary plane's color format in CRTC state
Store the primary plane's color format in the CRTC state and use it for programming the CRTC's gamma LUTs. Gamma tables (i.e., color management) are provided by the CRTC, but depend in the primary plane's color format. Store the format in the CRTC state and use it. This has not been an issue with simple-KMS helpers, which mix-up plane and CRTC state to some extent. For using regular atomic helpers, it's necessary to distinguish between the two. Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com> Tested-by: Jocelyn Falempe <jfalempe@redhat.com> Acked-by: Sam Ravnborg <sam@ravnborg.org> Link: https://patchwork.freedesktop.org/patch/msgid/20220728124103.30159-6-tzimmermann@suse.de
1 parent 2d70b9a commit ed2ef21

File tree

2 files changed

+15
-10
lines changed

2 files changed

+15
-10
lines changed

drivers/gpu/drm/mgag200/mgag200_drv.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,9 @@ struct mgag200_pll {
187187
struct mgag200_crtc_state {
188188
struct drm_crtc_state base;
189189

190+
/* Primary-plane format; required for modesetting and color mgmt. */
191+
const struct drm_format_info *format;
192+
190193
struct mgag200_pll_values pixpllc;
191194
};
192195

drivers/gpu/drm/mgag200/mgag200_mode.c

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -418,11 +418,9 @@ static void mgag200_set_offset(struct mga_device *mdev,
418418
WREG_ECRT(0x00, crtcext0);
419419
}
420420

421-
static void mgag200_set_format_regs(struct mga_device *mdev,
422-
const struct drm_framebuffer *fb)
421+
static void mgag200_set_format_regs(struct mga_device *mdev, const struct drm_format_info *format)
423422
{
424423
struct drm_device *dev = &mdev->base;
425-
const struct drm_format_info *format = fb->format;
426424
unsigned int bpp, bppshift, scale;
427425
u8 crtcext3, xmulctrl;
428426

@@ -501,7 +499,7 @@ static void mgag200_g200er_reset_tagfifo(struct mga_device *mdev)
501499

502500
static void mgag200_g200se_set_hiprilvl(struct mga_device *mdev,
503501
const struct drm_display_mode *mode,
504-
const struct drm_framebuffer *fb)
502+
const struct drm_format_info *format)
505503
{
506504
struct mgag200_g200se_device *g200se = to_mgag200_g200se_device(&mdev->base);
507505
unsigned int hiprilvl;
@@ -513,9 +511,9 @@ static void mgag200_g200se_set_hiprilvl(struct mga_device *mdev,
513511
unsigned int bpp;
514512
unsigned long mb;
515513

516-
if (fb->format->cpp[0] * 8 > 16)
514+
if (format->cpp[0] * 8 > 16)
517515
bpp = 32;
518-
else if (fb->format->cpp[0] * 8 > 8)
516+
else if (format->cpp[0] * 8 > 8)
519517
bpp = 16;
520518
else
521519
bpp = 8;
@@ -695,6 +693,7 @@ mgag200_simple_display_pipe_enable(struct drm_simple_display_pipe *pipe,
695693
struct drm_display_mode *adjusted_mode = &crtc_state->adjusted_mode;
696694
struct mgag200_crtc_state *mgag200_crtc_state = to_mgag200_crtc_state(crtc_state);
697695
struct drm_framebuffer *fb = plane_state->fb;
696+
const struct drm_format_info *format = mgag200_crtc_state->format;
698697
struct drm_shadow_plane_state *shadow_plane_state = to_drm_shadow_plane_state(plane_state);
699698
struct drm_rect fullscreen = {
700699
.x1 = 0,
@@ -706,7 +705,7 @@ mgag200_simple_display_pipe_enable(struct drm_simple_display_pipe *pipe,
706705
if (mdev->type == G200_WB || mdev->type == G200_EW3)
707706
mgag200_g200wb_hold_bmc(mdev);
708707

709-
mgag200_set_format_regs(mdev, fb);
708+
mgag200_set_format_regs(mdev, format);
710709
mgag200_set_mode_regs(mdev, adjusted_mode);
711710

712711
pixpll->funcs->update(pixpll, &mgag200_crtc_state->pixpllc);
@@ -715,17 +714,17 @@ mgag200_simple_display_pipe_enable(struct drm_simple_display_pipe *pipe,
715714
mgag200_g200er_reset_tagfifo(mdev);
716715

717716
if (IS_G200_SE(mdev))
718-
mgag200_g200se_set_hiprilvl(mdev, adjusted_mode, fb);
717+
mgag200_g200se_set_hiprilvl(mdev, adjusted_mode, format);
719718
else if (mdev->type == G200_EV)
720719
mgag200_g200ev_set_hiprilvl(mdev);
721720

722721
if (mdev->type == G200_WB || mdev->type == G200_EW3)
723722
mgag200_g200wb_release_bmc(mdev);
724723

725724
if (crtc_state->gamma_lut)
726-
mgag200_crtc_set_gamma(mdev, fb->format, crtc_state->gamma_lut->data);
725+
mgag200_crtc_set_gamma(mdev, format, crtc_state->gamma_lut->data);
727726
else
728-
mgag200_crtc_set_gamma_linear(mdev, fb->format);
727+
mgag200_crtc_set_gamma_linear(mdev, format);
729728

730729
mgag200_enable_display(mdev);
731730

@@ -768,6 +767,8 @@ mgag200_simple_display_pipe_check(struct drm_simple_display_pipe *pipe,
768767
if (!fb || (fb->format != new_fb->format))
769768
crtc_state->mode_changed = true; /* update PLL settings */
770769

770+
mgag200_crtc_state->format = new_fb->format;
771+
771772
if (crtc_state->mode_changed) {
772773
ret = pixpll->funcs->compute(pixpll, crtc_state->mode.clock,
773774
&mgag200_crtc_state->pixpllc);
@@ -831,6 +832,7 @@ mgag200_simple_display_pipe_duplicate_crtc_state(struct drm_simple_display_pipe
831832
return NULL;
832833
__drm_atomic_helper_crtc_duplicate_state(crtc, &new_mgag200_crtc_state->base);
833834

835+
new_mgag200_crtc_state->format = mgag200_crtc_state->format;
834836
memcpy(&new_mgag200_crtc_state->pixpllc, &mgag200_crtc_state->pixpllc,
835837
sizeof(new_mgag200_crtc_state->pixpllc));
836838

0 commit comments

Comments
 (0)