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. There is a short cut used by this patch where gamma_store is used as the save space. If this turns out to be a problem in the future a pre-allocated chunk of memory will be required for each crtc to save and restore the LUT information. 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:
committed by
Dave Airlie
parent
38ed0fcacd
commit
99231028ff
@@ -242,6 +242,30 @@ static int drm_fb_helper_parse_command_line(struct drm_fb_helper *fb_helper)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void drm_fb_helper_save_lut_atomic(struct drm_crtc *crtc, struct drm_fb_helper *helper)
|
||||||
|
{
|
||||||
|
uint16_t *r_base, *g_base, *b_base;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
r_base = crtc->gamma_store;
|
||||||
|
g_base = r_base + crtc->gamma_size;
|
||||||
|
b_base = g_base + crtc->gamma_size;
|
||||||
|
|
||||||
|
for (i = 0; i < crtc->gamma_size; i++)
|
||||||
|
helper->funcs->gamma_get(crtc, &r_base[i], &g_base[i], &b_base[i], i);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void drm_fb_helper_restore_lut_atomic(struct drm_crtc *crtc)
|
||||||
|
{
|
||||||
|
uint16_t *r_base, *g_base, *b_base;
|
||||||
|
|
||||||
|
r_base = crtc->gamma_store;
|
||||||
|
g_base = r_base + crtc->gamma_size;
|
||||||
|
b_base = g_base + crtc->gamma_size;
|
||||||
|
|
||||||
|
crtc->funcs->gamma_set(crtc, r_base, g_base, b_base, 0, crtc->gamma_size);
|
||||||
|
}
|
||||||
|
|
||||||
int drm_fb_helper_debug_enter(struct fb_info *info)
|
int drm_fb_helper_debug_enter(struct fb_info *info)
|
||||||
{
|
{
|
||||||
struct drm_fb_helper *helper = info->par;
|
struct drm_fb_helper *helper = info->par;
|
||||||
@@ -260,6 +284,7 @@ int drm_fb_helper_debug_enter(struct fb_info *info)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
funcs = mode_set->crtc->helper_private;
|
funcs = mode_set->crtc->helper_private;
|
||||||
|
drm_fb_helper_save_lut_atomic(mode_set->crtc, helper);
|
||||||
funcs->mode_set_base_atomic(mode_set->crtc,
|
funcs->mode_set_base_atomic(mode_set->crtc,
|
||||||
mode_set->fb,
|
mode_set->fb,
|
||||||
mode_set->x,
|
mode_set->x,
|
||||||
@@ -309,6 +334,7 @@ int drm_fb_helper_debug_leave(struct fb_info *info)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
drm_fb_helper_restore_lut_atomic(mode_set->crtc);
|
||||||
funcs->mode_set_base_atomic(mode_set->crtc, fb, crtc->x,
|
funcs->mode_set_base_atomic(mode_set->crtc, fb, crtc->x,
|
||||||
crtc->y, 0);
|
crtc->y, 0);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user