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
3 changed files with 40 additions and 0 deletions
|
@ -138,6 +138,38 @@ void radeon_crtc_load_lut(struct drm_crtc *crtc)
|
||||||
legacy_crtc_load_lut(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 */
|
/** Sets the color ramps on behalf of fbcon */
|
||||||
void radeon_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green,
|
void radeon_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green,
|
||||||
u16 blue, int regno)
|
u16 blue, int regno)
|
||||||
|
|
|
@ -355,6 +355,11 @@ int radeon_crtc_set_base_atomic(struct drm_crtc *crtc,
|
||||||
struct drm_framebuffer *fb,
|
struct drm_framebuffer *fb,
|
||||||
int x, int y, int enter)
|
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);
|
return radeon_crtc_do_set_base(crtc, fb, x, y, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -267,6 +267,7 @@ struct radeon_crtc {
|
||||||
struct drm_crtc base;
|
struct drm_crtc base;
|
||||||
int crtc_id;
|
int crtc_id;
|
||||||
u16 lut_r[256], lut_g[256], lut_b[256];
|
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 enabled;
|
||||||
bool can_tile;
|
bool can_tile;
|
||||||
uint32_t crtc_offset;
|
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_encoder_set_active_device(struct drm_encoder *encoder);
|
||||||
|
|
||||||
extern void radeon_crtc_load_lut(struct drm_crtc *crtc);
|
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,
|
extern int atombios_crtc_set_base(struct drm_crtc *crtc, int x, int y,
|
||||||
struct drm_framebuffer *old_fb);
|
struct drm_framebuffer *old_fb);
|
||||||
extern int atombios_crtc_set_base_atomic(struct drm_crtc *crtc,
|
extern int atombios_crtc_set_base_atomic(struct drm_crtc *crtc,
|
||||||
|
|
Loading…
Reference in a new issue