Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 207884
b: refs/heads/master
c: 8fd4bd2
h: refs/heads/master
v: v3
  • Loading branch information
Jesse Barnes authored and Greg Kroah-Hartman committed Aug 10, 2010
1 parent e77c14f commit 7ef2053
Show file tree
Hide file tree
Showing 9 changed files with 28 additions and 10 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 26df6d13406d1a53b0bda08bd712f1924affd7cd
refs/heads/master: 8fd4bd22350784d5b2fe9274f6790ba353976415
13 changes: 9 additions & 4 deletions trunk/drivers/char/vt.c
Original file line number Diff line number Diff line change
Expand Up @@ -705,7 +705,10 @@ void redraw_screen(struct vc_data *vc, int is_switch)
update_attr(vc);
clear_buffer_attributes(vc);
}
if (update && vc->vc_mode != KD_GRAPHICS)

/* Forcibly update if we're panicing */
if ((update && vc->vc_mode != KD_GRAPHICS) ||
vt_force_oops_output(vc))
do_update_region(vc, vc->vc_origin, vc->vc_screenbuf_size / 2);
}
set_cursor(vc);
Expand Down Expand Up @@ -743,6 +746,7 @@ static void visual_init(struct vc_data *vc, int num, int init)
vc->vc_hi_font_mask = 0;
vc->vc_complement_mask = 0;
vc->vc_can_do_color = 0;
vc->vc_panic_force_write = false;
vc->vc_sw->con_init(vc, init);
if (!vc->vc_complement_mask)
vc->vc_complement_mask = vc->vc_can_do_color ? 0x7700 : 0x0800;
Expand Down Expand Up @@ -2506,7 +2510,7 @@ static void vt_console_print(struct console *co, const char *b, unsigned count)
goto quit;
}

if (vc->vc_mode != KD_TEXT)
if (vc->vc_mode != KD_TEXT && !vt_force_oops_output(vc))
goto quit;

/* undraw cursor first */
Expand Down Expand Up @@ -3784,7 +3788,8 @@ void do_unblank_screen(int leaving_gfx)
return;
}
vc = vc_cons[fg_console].d;
if (vc->vc_mode != KD_TEXT)
/* Try to unblank in oops case too */
if (vc->vc_mode != KD_TEXT && !vt_force_oops_output(vc))
return; /* but leave console_blanked != 0 */

if (blankinterval) {
Expand All @@ -3793,7 +3798,7 @@ void do_unblank_screen(int leaving_gfx)
}

console_blanked = 0;
if (vc->vc_sw->con_blank(vc, 0, leaving_gfx))
if (vc->vc_sw->con_blank(vc, 0, leaving_gfx) || vt_force_oops_output(vc))
/* Low-level driver cannot restore -> do it ourselves */
update_screen(vc);
if (console_blank_hook)
Expand Down
4 changes: 1 addition & 3 deletions trunk/drivers/gpu/drm/i915/intel_fb.c
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ static int intelfb_create(struct intel_fbdev *ifbdev,

strcpy(info->fix.id, "inteldrmfb");

info->flags = FBINFO_DEFAULT;
info->flags = FBINFO_DEFAULT | FBINFO_CAN_FORCE_OUTPUT;
info->fbops = &intelfb_ops;

/* setup aperture base/size for vesafb takeover */
Expand All @@ -148,8 +148,6 @@ static int intelfb_create(struct intel_fbdev *ifbdev,
info->fix.smem_start = dev->mode_config.fb_base + obj_priv->gtt_offset;
info->fix.smem_len = size;

info->flags = FBINFO_DEFAULT;

info->screen_base = ioremap_wc(dev->agp->base + obj_priv->gtt_offset,
size);
if (!info->screen_base) {
Expand Down
1 change: 1 addition & 0 deletions trunk/drivers/gpu/drm/nouveau/nouveau_fbcon.c
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,7 @@ nouveau_fbcon_create(struct nouveau_fbdev *nfbdev,
info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_COPYAREA |
FBINFO_HWACCEL_FILLRECT |
FBINFO_HWACCEL_IMAGEBLIT;
info->flags |= FBINFO_CAN_FORCE_OUTPUT;
info->fbops = &nouveau_fbcon_ops;
info->fix.smem_start = dev->mode_config.fb_base + nvbo->bo.offset -
dev_priv->vm_vram_base;
Expand Down
2 changes: 1 addition & 1 deletion trunk/drivers/gpu/drm/radeon/radeon_fb.c
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ static int radeonfb_create(struct radeon_fbdev *rfbdev,

drm_fb_helper_fill_fix(info, fb->pitch, fb->depth);

info->flags = FBINFO_DEFAULT;
info->flags = FBINFO_DEFAULT | FBINFO_CAN_FORCE_OUTPUT;
info->fbops = &radeonfb_ops;

tmp = radeon_bo_gpu_offset(rbo) - rdev->mc.vram_start;
Expand Down
4 changes: 3 additions & 1 deletion trunk/drivers/video/console/fbcon.c
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,8 @@ static inline int fbcon_is_inactive(struct vc_data *vc, struct fb_info *info)
struct fbcon_ops *ops = info->fbcon_par;

return (info->state != FBINFO_STATE_RUNNING ||
vc->vc_mode != KD_TEXT || ops->graphics);
vc->vc_mode != KD_TEXT || ops->graphics) &&
!vt_force_oops_output(vc);
}

static inline int get_color(struct vc_data *vc, struct fb_info *info,
Expand Down Expand Up @@ -1073,6 +1074,7 @@ static void fbcon_init(struct vc_data *vc, int init)
if (p->userfont)
charcnt = FNTCHARCNT(p->fontdata);

vc->vc_panic_force_write = !!(info->flags & FBINFO_CAN_FORCE_OUTPUT);
vc->vc_can_do_color = (fb_get_color_depth(&info->var, &info->fix)!=1);
vc->vc_complement_mask = vc->vc_can_do_color ? 0x7700 : 0x0800;
if (charcnt == 256) {
Expand Down
1 change: 1 addition & 0 deletions trunk/include/linux/console_struct.h
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ struct vc_data {
struct vc_data **vc_display_fg; /* [!] Ptr to var holding fg console for this display */
unsigned long vc_uni_pagedir;
unsigned long *vc_uni_pagedir_loc; /* [!] Location of uni_pagedir variable for this console */
bool vc_panic_force_write; /* when oops/panic this VC can accept forced output/blanking */
/* additional information is in vt_kern.h */
};

Expand Down
4 changes: 4 additions & 0 deletions trunk/include/linux/fb.h
Original file line number Diff line number Diff line change
Expand Up @@ -825,6 +825,10 @@ struct fb_tile_ops {
*/
#define FBINFO_BE_MATH 0x100000

/* report to the VT layer that this fb driver can accept forced console
output like oopses */
#define FBINFO_CAN_FORCE_OUTPUT 0x200000

struct fb_info {
int node;
int flags;
Expand Down
7 changes: 7 additions & 0 deletions trunk/include/linux/vt_kern.h
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,13 @@ extern int unbind_con_driver(const struct consw *csw, int first, int last,
int deflt);
int vty_init(const struct file_operations *console_fops);

static inline bool vt_force_oops_output(struct vc_data *vc)
{
if (oops_in_progress && vc->vc_panic_force_write)
return true;
return false;
}

/*
* vc_screen.c shares this temporary buffer with the console write code so that
* we can easily avoid touching user space while holding the console spinlock.
Expand Down

0 comments on commit 7ef2053

Please sign in to comment.