* [PATCH 2/6] fbcon: Stop framebuffer operations before hardware is properly initialized
@ 2005-03-13 0:33 Antonino A. Daplas
2005-03-13 23:07 ` Benjamin Herrenschmidt
0 siblings, 1 reply; 2+ messages in thread
From: Antonino A. Daplas @ 2005-03-13 0:33 UTC (permalink / raw)
To: Andrew Morton; +Cc: Linux Fbdev development list
Accessing the hardware before it is properly initialized can lead to crashes
or screen corruption. This happens when switching to X then back to console.
When console comes back from X, the device is in an undefined state. During
this window, accessing the hardware is disallowed.
A new field in fbcon_par is added (graphics), which will be set to nonzero
just before initialization of the framebuffer and when coming back from
KD_GRAPHICS, then unset when an fb_set_var/fb_set_par is done. While this
field is set, no accesses to the hardware is done. The consequence of
this change is, hopefully, more robust switching between KD_GRAPHICS<->
KD_TEXT.
An added benefit coming from this change is that the MODESWITCHLATE hack
is not needed anymore and thus removed. This hack is used by savagefb,
rivafb and nvidiafb.
Signed-off-by: Antonino Daplas <adaplas@pol.net>
---
drivers/video/console/fbcon.c | 41 ++++++++++++---------------------
drivers/video/console/fbcon.h | 1
drivers/video/nvidia/nvidia.c | 3 +-
drivers/video/riva/fbdev.c | 3 --
drivers/video/savage/savagefb_driver.c | 3 --
include/linux/fb.h | 4 ---
6 files changed, 22 insertions(+), 33 deletions(-)
diff -Nru a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c
--- a/drivers/video/console/fbcon.c 2005-03-12 23:24:05 +08:00
+++ b/drivers/video/console/fbcon.c 2005-03-10 06:29:05 +08:00
@@ -204,8 +204,10 @@
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);
+ vc->vc_mode != KD_TEXT || ops->graphics);
}
static inline int get_color(struct vc_data *vc, struct fb_info *info,
@@ -596,6 +598,8 @@
if (info->fbops->fb_set_par)
info->fbops->fb_set_par(info);
+ ops->graphics = 0;
+
if (vc)
fbcon_set_disp(info, &info->var, vc);
else
@@ -763,6 +767,7 @@
memset(ops, 0, sizeof(struct fbcon_ops));
ops->currcon = -1;
+ ops->graphics = 1;
info->fbcon_par = ops;
set_blitting_type(vc, info, NULL);
@@ -949,6 +954,7 @@
if (CON_IS_VISIBLE(vc) && info->fbops->fb_set_par)
info->fbops->fb_set_par(info);
+ ((struct fbcon_ops *) info->fbcon_par)->graphics = 0;
if ((cap & FBINFO_HWACCEL_COPYAREA) &&
!(cap & FBINFO_HWACCEL_DISABLED))
@@ -1871,7 +1877,6 @@
var.activate = FB_ACTIVATE_NOW |
FB_ACTIVATE_FORCE;
fb_set_var(info, &var);
- info->flags &= ~FBINFO_MISC_MODESWITCH;
}
var_to_display(p, &info->var, info);
}
@@ -1884,7 +1889,7 @@
struct fb_info *info;
struct display *p = &fb_display[vc->vc_num];
struct fb_var_screeninfo var;
- int i, prev_console, do_set_par = 0;
+ int i, prev_console;
info = registered_fb[con2fb_map[vc->vc_num]];
@@ -1943,14 +1948,9 @@
fb_set_var(info, &var);
if (prev_console != -1 &&
- registered_fb[con2fb_map[prev_console]] != info)
- do_set_par = 1;
-
- if (do_set_par || info->flags & FBINFO_MISC_MODESWITCH) {
- if (info->fbops->fb_set_par)
- info->fbops->fb_set_par(info);
- info->flags &= ~FBINFO_MISC_MODESWITCH;
- }
+ registered_fb[con2fb_map[prev_console]] != info &&
+ info->fbops->fb_set_par)
+ info->fbops->fb_set_par(info);
set_blitting_type(vc, info, p);
((struct fbcon_ops *)info->fbcon_par)->cursor_reset = 1;
@@ -2013,29 +2013,20 @@
{
struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
struct fbcon_ops *ops = info->fbcon_par;
- int active = !fbcon_is_inactive(vc, info);
if (mode_switch) {
struct fb_var_screeninfo var = info->var;
-/*
- * HACK ALERT: Some hardware will require reinitializion at this stage,
- * others will require it to be done as late as possible.
- * For now, we differentiate this with the
- * FBINFO_MISC_MODESWITCHLATE bitflag. Worst case will be
- * hardware that requires it here and another one later.
- * A definitive solution may require fixing X or the VT
- * system.
- */
- if (info->flags & FBINFO_MISC_MODESWITCHLATE)
- info->flags |= FBINFO_MISC_MODESWITCH;
- if (!blank && !(info->flags & FBINFO_MISC_MODESWITCHLATE)) {
+ ops->graphics = 1;
+
+ if (!blank) {
var.activate = FB_ACTIVATE_NOW | FB_ACTIVATE_FORCE;
fb_set_var(info, &var);
+ ops->graphics = 0;
}
}
- if (active) {
+ if (!fbcon_is_inactive(vc, info)) {
if (ops->blank_state != blank) {
ops->blank_state = blank;
fbcon_cursor(vc, blank ? CM_ERASE : CM_DRAW);
diff -Nru a/drivers/video/console/fbcon.h b/drivers/video/console/fbcon.h
--- a/drivers/video/console/fbcon.h 2005-03-12 23:24:05 +08:00
+++ b/drivers/video/console/fbcon.h 2005-03-10 06:29:05 +08:00
@@ -67,6 +67,7 @@
int cursor_flash;
int cursor_reset;
int blank_state;
+ int graphics;
char *cursor_data;
};
/*
diff -Nru a/drivers/video/nvidia/nvidia.c b/drivers/video/nvidia/nvidia.c
--- a/drivers/video/nvidia/nvidia.c 2005-03-12 23:25:14 +08:00
+++ b/drivers/video/nvidia/nvidia.c 2005-03-10 06:29:05 +08:00
@@ -1191,6 +1191,7 @@
var->yres_virtual = var->yres;
var->xres_virtual = vramlen / var->yres_virtual;
var->xres_virtual /= var->bits_per_pixel / 8;
+ var->xres_virtual &= ~63;
pitch = (var->xres_virtual *
var->bits_per_pixel + 7) / 8;
memlen = pitch * var->yres;
@@ -1301,7 +1302,7 @@
| FBINFO_HWACCEL_IMAGEBLIT
| FBINFO_HWACCEL_FILLRECT
| FBINFO_HWACCEL_COPYAREA
- | FBINFO_HWACCEL_YPAN | FBINFO_MISC_MODESWITCHLATE;
+ | FBINFO_HWACCEL_YPAN;
fb_videomode_to_modelist(info->monspecs.modedb,
info->monspecs.modedb_len, &info->modelist);
diff -Nru a/drivers/video/riva/fbdev.c b/drivers/video/riva/fbdev.c
--- a/drivers/video/riva/fbdev.c 2005-03-12 23:25:16 +08:00
+++ b/drivers/video/riva/fbdev.c 2005-03-10 06:29:05 +08:00
@@ -1708,8 +1708,7 @@
| FBINFO_HWACCEL_YPAN
| FBINFO_HWACCEL_COPYAREA
| FBINFO_HWACCEL_FILLRECT
- | FBINFO_HWACCEL_IMAGEBLIT
- | FBINFO_MISC_MODESWITCHLATE;
+ | FBINFO_HWACCEL_IMAGEBLIT;
/* Accel seems to not work properly on NV30 yet...*/
if ((par->riva.Architecture == NV_ARCH_30) || noaccel) {
diff -Nru a/drivers/video/savage/savagefb_driver.c b/drivers/video/savage/savagefb_driver.c
--- a/drivers/video/savage/savagefb_driver.c 2005-03-12 23:25:26 +08:00
+++ b/drivers/video/savage/savagefb_driver.c 2005-03-10 06:29:05 +08:00
@@ -1883,8 +1883,7 @@
info->fbops = &savagefb_ops;
info->flags = FBINFO_DEFAULT |
FBINFO_HWACCEL_YPAN |
- FBINFO_HWACCEL_XPAN |
- FBINFO_MISC_MODESWITCHLATE;
+ FBINFO_HWACCEL_XPAN;
info->pseudo_palette = par->pseudo_palette;
diff -Nru a/include/linux/fb.h b/include/linux/fb.h
--- a/include/linux/fb.h 2005-03-13 00:38:53 +08:00
+++ b/include/linux/fb.h 2005-03-10 06:29:05 +08:00
@@ -702,9 +702,7 @@
#define FBINFO_MISC_USEREVENT 0x10000 /* event request
from userspace */
-#define FBINFO_MISC_MODESWITCH 0x20000 /* mode switch */
-#define FBINFO_MISC_MODESWITCHLATE 0x40000 /* init hardware later */
-#define FBINFO_MISC_TILEBLITTING 0x80000 /* use tile blitting */
+#define FBINFO_MISC_TILEBLITTING 0x20000 /* use tile blitting */
struct fb_info {
int node;
-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH 2/6] fbcon: Stop framebuffer operations before hardware is properly initialized
2005-03-13 0:33 [PATCH 2/6] fbcon: Stop framebuffer operations before hardware is properly initialized Antonino A. Daplas
@ 2005-03-13 23:07 ` Benjamin Herrenschmidt
0 siblings, 0 replies; 2+ messages in thread
From: Benjamin Herrenschmidt @ 2005-03-13 23:07 UTC (permalink / raw)
To: Linux Fbdev development list; +Cc: Andrew Morton
On Sun, 2005-03-13 at 08:33 +0800, Antonino A. Daplas wrote:
> Accessing the hardware before it is properly initialized can lead to crashes
> or screen corruption. This happens when switching to X then back to console.
> When console comes back from X, the device is in an undefined state. During
> this window, accessing the hardware is disallowed.
>
> A new field in fbcon_par is added (graphics), which will be set to nonzero
> just before initialization of the framebuffer and when coming back from
> KD_GRAPHICS, then unset when an fb_set_var/fb_set_par is done. While this
> field is set, no accesses to the hardware is done. The consequence of
> this change is, hopefully, more robust switching between KD_GRAPHICS<->
> KD_TEXT.
>
> An added benefit coming from this change is that the MODESWITCHLATE hack
> is not needed anymore and thus removed. This hack is used by savagefb,
> rivafb and nvidiafb.
Excellent ! That should fix some nasty issues I've been dealing with as
well !
Ben.
-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2005-03-13 23:08 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-03-13 0:33 [PATCH 2/6] fbcon: Stop framebuffer operations before hardware is properly initialized Antonino A. Daplas
2005-03-13 23:07 ` Benjamin Herrenschmidt
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.