The patch titled nvidiafb: VGA state save and restore has been added to the -mm tree. Its filename is nvidiafb-vga-state-save-and-restore.patch *** Remember to use Documentation/SubmitChecklist when testing your code *** See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find out what to do about this ------------------------------------------------------ Subject: nvidiafb: VGA state save and restore From: "Antonino A. Daplas" <adaplas@xxxxxxxxx> Allow the saving and restoration of VGA text mode. The state is saved on the first open and restored on the last close. Because of the non-linear mapping of the VGA registers to the MMIO space, this will be done only on X86 platforms where the device is the primary display. An echo 0 > /sys/class/vtconsole/vtcon1/bind will convert the display from graphics to text mode. Signed-off-by: Antonino Daplas <adaplas@xxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- drivers/video/Makefile | 2 drivers/video/nvidia/nv_type.h | 6 ++ drivers/video/nvidia/nvidia.c | 74 ++++++++++++++++++++++++++++++- 3 files changed, 80 insertions(+), 2 deletions(-) diff -puN drivers/video/Makefile~nvidiafb-vga-state-save-and-restore drivers/video/Makefile --- a/drivers/video/Makefile~nvidiafb-vga-state-save-and-restore +++ a/drivers/video/Makefile @@ -32,7 +32,7 @@ obj-$(CONFIG_FB_PM3) += pm3fb.o obj-$(CONFIG_FB_MATROX) += matrox/ obj-$(CONFIG_FB_RIVA) += riva/ vgastate.o -obj-$(CONFIG_FB_NVIDIA) += nvidia/ +obj-$(CONFIG_FB_NVIDIA) += nvidia/ vgastate.o obj-$(CONFIG_FB_ATY) += aty/ macmodes.o obj-$(CONFIG_FB_ATY128) += aty/ macmodes.o obj-$(CONFIG_FB_RADEON) += aty/ diff -puN drivers/video/nvidia/nv_type.h~nvidiafb-vga-state-save-and-restore drivers/video/nvidia/nv_type.h --- a/drivers/video/nvidia/nv_type.h~nvidiafb-vga-state-save-and-restore +++ a/drivers/video/nvidia/nv_type.h @@ -5,6 +5,8 @@ #include <linux/types.h> #include <linux/i2c.h> #include <linux/i2c-algo-bit.h> +#include <linux/mutex.h> +#include <video/vga.h> #define NV_ARCH_04 0x04 #define NV_ARCH_10 0x10 @@ -93,7 +95,10 @@ struct riva_regs { struct nvidia_par { RIVA_HW_STATE SavedReg; RIVA_HW_STATE ModeReg; + RIVA_HW_STATE initial_state; RIVA_HW_STATE *CurrentState; + struct vgastate vgastate; + struct mutex open_lock; u32 pseudo_palette[16]; struct pci_dev *pci_dev; u32 Architecture; @@ -141,6 +146,7 @@ struct nvidia_par { int BlendingPossible; u32 paletteEnabled; u32 forceCRTC; + u32 open_count; u8 DDCBase; #ifdef CONFIG_MTRR struct { diff -puN drivers/video/nvidia/nvidia.c~nvidiafb-vga-state-save-and-restore drivers/video/nvidia/nvidia.c --- a/drivers/video/nvidia/nvidia.c~nvidiafb-vga-state-save-and-restore +++ a/drivers/video/nvidia/nvidia.c @@ -949,8 +949,80 @@ static int nvidiafb_blank(int blank, str return 0; } +/* + * Because the VGA registers are not mapped linearly in its MMIO space, + * restrict VGA register saving and restore to x86 only, where legacy VGA IO + * access is legal. Consequently, we must also check if the device is the + * primary display. + */ +#ifdef CONFIG_X86 +static void save_vga_x86(struct nvidia_par *par) +{ + struct resource *res= &par->pci_dev->resource[PCI_ROM_RESOURCE]; + + if (res && res->flags & IORESOURCE_ROM_SHADOW) { + memset(&par->vgastate, 0, sizeof(par->vgastate)); + par->vgastate.flags = VGA_SAVE_MODE | VGA_SAVE_FONTS | + VGA_SAVE_CMAP; + save_vga(&par->vgastate); + } +} + +static void restore_vga_x86(struct nvidia_par *par) +{ + struct resource *res= &par->pci_dev->resource[PCI_ROM_RESOURCE]; + + if (res && res->flags & IORESOURCE_ROM_SHADOW) + restore_vga(&par->vgastate); +} +#else +#define save_vga_x86(x) do {} while (0) +#define restore_vga_x86(x) do {} while (0) +#endif /* X86 */ + +static int nvidiafb_open(struct fb_info *info, int user) +{ + struct nvidia_par *par = info->par; + + mutex_lock(&par->open_lock); + + if (!par->open_count) { + save_vga_x86(par); + nvidia_save_vga(par, &par->initial_state); + } + + par->open_count++; + mutex_unlock(&par->open_lock); + return 0; +} + +static int nvidiafb_release(struct fb_info *info, int user) +{ + struct nvidia_par *par = info->par; + int err = 0; + + mutex_lock(&par->open_lock); + + if (!par->open_count) { + err = -EINVAL; + goto done; + } + + if (par->open_count == 1) { + nvidia_write_regs(par, &par->initial_state); + restore_vga_x86(par); + } + + par->open_count--; +done: + mutex_unlock(&par->open_lock); + return 0; +} + static struct fb_ops nvidia_fb_ops = { .owner = THIS_MODULE, + .fb_open = nvidiafb_open, + .fb_release = nvidiafb_release, .fb_check_var = nvidiafb_check_var, .fb_set_par = nvidiafb_set_par, .fb_setcolreg = nvidiafb_setcolreg, @@ -1208,7 +1280,7 @@ static int __devinit nvidiafb_probe(stru par = info->par; par->pci_dev = pd; - + mutex_init(&par->open_lock); info->pixmap.addr = kzalloc(8 * 1024, GFP_KERNEL); if (info->pixmap.addr == NULL) _ Patches currently in -mm which might be from adaplas@xxxxxxxxx are origin.patch fbdev-add-ultrasharp-uxga-to-broken-monitor-database.patch intelfb-fix-ring-space-calculation.patch nvidiafb-bring-back-generic-ddc-reading.patch fbdev-ignore-vesa-modes-if-framebuffer-is-disabled.patch fbdev-fix-obvious-bug-in-show_pan.patch neofb-fill-transp-msb_right-with-the-correct.patch atyfb-kill-dead-code.patch fbdev-mm-deferred-io-support.patch fbdev-mm-deferred-io-support-fix.patch fbdev-mm-deferred-io-support-fix-2.patch fbdev-hecuba-framebuffer-driver.patch fbdev-hecuba-framebuffer-driver-fix.patch nvidiafb-fix-reversed-ddc-port.patch vt-expose-system-wide-utf-8-default-setting-via-sysfs.patch fbdev-dont-show-logo-if-driver-or-fbcon-are-modular.patch rivafb-nvidiafb-enable-hardware-monitoring.patch rivafb-handle-i2c-bus-creation-failure.patch rivafb-nvidiafb-various-cleanups.patch rivafb-fixed-reversed-ddc-ports.patch nvidiafb-ensure-that-crtc-registers-are-accessible.patch nvidiafb-access-crt-registers-safely.patch skeletonfb-various-corrections.patch epson1355fbc-fix-error-handling-code.patch nvidiafb-vga-state-save-and-restore.patch savagefb-rework-i2c-bit-access.patch savagefb-vga-state-save-and-restore.patch fbdev-link-vgastateo-using-kconfig.patch fbcon-delay-screen-update-when-setting-the-mode-of.patch nvidiafb-fix-sparse-warning.patch rivafb-fix-io-access.patch fbdev-kill-sparse-warning-in-deferred-io.patch fbdev-add-sparse-annotations-in-svgalibc.patch arcfb-kill-sparse-warning.patch s3fb-add-sparse-annotations.patch hecubafb-kill-sparse-warnings.patch i810fb-fix-incorrect-frequency-mask.patch vt-add-documentation-for-new-boot-sysfs-options.patch skeletonfb-documentation-error-fixes.patch fbdev-add-drawing-functions-for-framebuffers-in-system.patch arcfb-use-sys-instead-of-cfb-drawing-functions.patch hecubafb-use-sys-instead-of-cfb-drawing-functions.patch vfb-use-sys-instead-of-cfb-drawing-functions.patch fbdev-pass-struct-fb_info-to-fb_read-and-fb_write.patch fbdev-add-fb_read-fb_write-functions-for-framebuffers.patch arcfb-us-fb_sys_read.patch hecubafb-us-fb_sys_read.patch vfb-us-fb_sys_read-and-fb_sys_write.patch fbdev-consolidate-common-drawing-functions-into-a.patch fbdev-advertise-limitation-of-drawing-engine.patch fbcon-font-setting-should-check-limitation-of-driver.patch vga16fb-restrict-to-blit-rectangles-with-widths-of.patch s3fb-limit-8x16-rectangles-when-tileblitting-is-enabled.patch fbdev-add-tile-operation-to-get-the-maximum-length.patch s3fb-implement-fb_get_tilemax.patch fbcon-check-if-the-character-count-can-be-handled.patch fbdev-save-the-activate-field-before-calling-fb_check_var.patch s3fb-driver-fixes.patch vmlfb-framebuffer-driver-for-intel-vermilion-range.patch nvidiafb-rivafb-switch-to-pci_get-refcounting.patch pm2fb-3dlabs-permedia-2v-reference-board-added.patch pm2fb-permedia-2v-memory-clock-setting.patch pm2fb-pixclock-setting-restriction.patch nvidiafb-prevent-triggering-of-softlockup.patch - To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html