forked from Minki/linux
radeon, kdb, kms: Save and restore the LUT on atomic KMS enter/exit
When changing VTs non-atomically the kernel works in conjunction with the Xserver in user space and receives the LUT information from the Xserver via a system call. When changing modes atomically for kdb, this information must be saved and restored without disturbing user space as if nothing ever happened. Signed-off-by: Jason Wessel <jason.wessel@windriver.com> CC: Jesse Barnes <jbarnes@virtuousgeek.org> CC: David Airlie <airlied@linux.ie> CC: dri-devel@lists.freedesktop.org Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
413d45d362
commit
ff773714dd
@ -138,6 +138,38 @@ void radeon_crtc_load_lut(struct drm_crtc *crtc)
|
||||
legacy_crtc_load_lut(crtc);
|
||||
}
|
||||
|
||||
void radeon_crtc_save_lut(struct drm_crtc *crtc)
|
||||
{
|
||||
struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
|
||||
int i;
|
||||
|
||||
if (!crtc->enabled)
|
||||
return;
|
||||
|
||||
for (i = 0; i < 256; i++) {
|
||||
radeon_crtc->lut_r_copy[i] = radeon_crtc->lut_r[i];
|
||||
radeon_crtc->lut_g_copy[i] = radeon_crtc->lut_g[i];
|
||||
radeon_crtc->lut_b_copy[i] = radeon_crtc->lut_b[i];
|
||||
}
|
||||
}
|
||||
|
||||
void radeon_crtc_restore_lut(struct drm_crtc *crtc)
|
||||
{
|
||||
struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
|
||||
int i;
|
||||
|
||||
if (!crtc->enabled)
|
||||
return;
|
||||
|
||||
for (i = 0; i < 256; i++) {
|
||||
radeon_crtc->lut_r[i] = radeon_crtc->lut_r_copy[i];
|
||||
radeon_crtc->lut_g[i] = radeon_crtc->lut_g_copy[i];
|
||||
radeon_crtc->lut_b[i] = radeon_crtc->lut_b_copy[i];
|
||||
}
|
||||
|
||||
radeon_crtc_load_lut(crtc);
|
||||
}
|
||||
|
||||
/** Sets the color ramps on behalf of fbcon */
|
||||
void radeon_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green,
|
||||
u16 blue, int regno)
|
||||
|
@ -355,6 +355,11 @@ int radeon_crtc_set_base_atomic(struct drm_crtc *crtc,
|
||||
struct drm_framebuffer *fb,
|
||||
int x, int y, int enter)
|
||||
{
|
||||
if (enter)
|
||||
radeon_crtc_save_lut(crtc);
|
||||
else
|
||||
radeon_crtc_restore_lut(crtc);
|
||||
|
||||
return radeon_crtc_do_set_base(crtc, fb, x, y, 1);
|
||||
}
|
||||
|
||||
|
@ -267,6 +267,7 @@ struct radeon_crtc {
|
||||
struct drm_crtc base;
|
||||
int crtc_id;
|
||||
u16 lut_r[256], lut_g[256], lut_b[256];
|
||||
u16 lut_r_copy[256], lut_g_copy[256], lut_b_copy[256];
|
||||
bool enabled;
|
||||
bool can_tile;
|
||||
uint32_t crtc_offset;
|
||||
@ -512,6 +513,8 @@ extern int atombios_get_encoder_mode(struct drm_encoder *encoder);
|
||||
extern void radeon_encoder_set_active_device(struct drm_encoder *encoder);
|
||||
|
||||
extern void radeon_crtc_load_lut(struct drm_crtc *crtc);
|
||||
extern void radeon_crtc_save_lut(struct drm_crtc *crtc);
|
||||
extern void radeon_crtc_restore_lut(struct drm_crtc *crtc);
|
||||
extern int atombios_crtc_set_base(struct drm_crtc *crtc, int x, int y,
|
||||
struct drm_framebuffer *old_fb);
|
||||
extern int atombios_crtc_set_base_atomic(struct drm_crtc *crtc,
|
||||
|
Loading…
Reference in New Issue
Block a user