GIT 4c86a586c973a3f0f2e8e8de44bb9e2d257d54d1 git://git.infradead.org/users/jcrouse/geode.git#linus-upstream commit 4c86a586c973a3f0f2e8e8de44bb9e2d257d54d1 Author: Jordan Crouse Date: Thu Jun 8 09:26:19 2006 -0600 [PATCH] gxfb: Fixups for the AMD Geode GX framebuffer driver We cannot assume that the BIOS will be correctly setting up the hardware, so set some bits in various display registers to enable video output. Allow an advanced user to specify a frambuffer size, rather then probing the BIOS. All of these fixes were prompted by the OLPC effort. Signed-off-by: Jordan Crouse commit d1f552fc6b200be46fe6f5bfaa400ff5c8aa9d3f Author: Jordan Crouse Date: Thu Jun 8 09:25:53 2006 -0600 [PATCH] Add a configuration option to avoid automatically probing VGA Some x86 implementations don't have a built in VGA / VESA BIOS. This configuration option (enabled when EMBEDDED is selected), allows us to avoid probing the VGA hardware during boot. This option also disables the VGA console option, which depends heavily on the VGA / VESA probing. Signed-off-by: Jordan Crouse commit 19928c02aa1542582fdc5a08648b2b14976aede3 Author: Jordan Crouse Date: Mon May 15 20:54:51 2006 -0600 FB: Get the Geode GX frambuffer size from the BIOS Use the Geode GX BIOS virtual registers to get the actual size of the framebuffer. Signed-off-by: Jordan Crouse commit f2b4289226930da571af10bd3c2e62ea10bba13c Author: Jordan Crouse Date: Mon May 15 15:11:27 2006 -0600 GEODE: Update and fixup the PCI IDs for the CS5535 Clean up redundant and poorly worded PCI IDs Signed-off-by: Jordan Crouse --- Signed-off-by: Andrew Morton --- arch/i386/Kconfig | 9 +++++++++ arch/i386/boot/setup.S | 5 +++++ drivers/video/Kconfig | 4 ++-- drivers/video/console/Kconfig | 4 ++-- drivers/video/geode/Kconfig | 20 ++++++++++++++++++++ drivers/video/geode/display_gx.c | 22 +++++++++++++++++++--- drivers/video/geode/display_gx.h | 3 ++- drivers/video/geode/gxfb_core.c | 8 +++++++- drivers/video/geode/video_gx.c | 24 +++++++++++++++++++++++- drivers/video/geode/video_gx.h | 7 +++++++ include/linux/pci_ids.h | 5 ++--- 11 files changed, 98 insertions(+), 13 deletions(-) diff -puN arch/i386/boot/setup.S~git-geode arch/i386/boot/setup.S --- a/arch/i386/boot/setup.S~git-geode +++ a/arch/i386/boot/setup.S @@ -394,10 +394,13 @@ mem88: xorw %bx, %bx int $0x16 +#ifndef CONFIG_VGA_NOPROBE + # Check for video adapter and its parameters and allow the # user to browse video modes. call video # NOTE: we need %ds pointing # to bootsector +#endif # Get hd0 data... xorw %ax, %ax @@ -1006,9 +1009,11 @@ gdt_48: .word gdt_end - gdt - 1 # gdt limit .word 0, 0 # gdt base (filled in later) +#ifndef CONFIG_VGA_NOPROBE # Include video setup & detection code #include "video.S" +#endif # Setup signature -- must be last setup_sig1: .word SIG1 diff -puN arch/i386/Kconfig~git-geode arch/i386/Kconfig --- a/arch/i386/Kconfig~git-geode +++ a/arch/i386/Kconfig @@ -735,6 +735,15 @@ config SECCOMP If unsure, say Y. Only embedded should say N here. +config VGA_NOPROBE + bool "Don't probe VGA at boot" if EMBEDDED + default n + help + Saying Y here will cause the kernel to not probe VGA at boot time. + This will break everything that depends on the probed screen + data. Say N here unless you are absolutely sure this is what you + want. + source kernel/Kconfig.hz config KEXEC diff -puN drivers/video/console/Kconfig~git-geode drivers/video/console/Kconfig --- a/drivers/video/console/Kconfig~git-geode +++ a/drivers/video/console/Kconfig @@ -5,8 +5,8 @@ menu "Console display driver support" config VGA_CONSOLE - bool "VGA text console" if EMBEDDED || !X86 - depends on !ARCH_ACORN && !ARCH_EBSA110 && !4xx && !8xx && !SPARC && !M68K && !PARISC && !FRV && !ARCH_VERSATILE + bool "VGA text console" if (EMBEDDED || !X86) + depends on !ARCH_ACORN && !ARCH_EBSA110 && !4xx && !8xx && !SPARC && !M68K && !PARISC && !FRV && !ARCH_VERSATILE && !VGA_NOPROBE default y help Saying Y here will allow you to use Linux in text mode through a diff -puN drivers/video/geode/display_gx.c~git-geode drivers/video/geode/display_gx.c --- a/drivers/video/geode/display_gx.c~git-geode +++ a/drivers/video/geode/display_gx.c @@ -21,11 +21,26 @@ #include "geodefb.h" #include "display_gx.h" -int gx_frame_buffer_size(void) +#ifdef CONFIG_FB_GEODE_GX_SET_FBSIZE +unsigned int gx_frame_buffer_size(void) { + return CONFIG_FB_GEODE_GX_FBSIZE; +} +#else +unsigned int gx_frame_buffer_size(void) { - /* Assuming 16 MiB. */ - return 16*1024*1024; + unsigned int val; + + /* FB size is reported by a virtual register */ + /* Virtual register class = 0x02 */ + /* VG_MEM_SIZE(512Kb units) = 0x00 */ + + outw(0xFC53, 0xAC1C); + outw(0x0200, 0xAC1C); + + val = (unsigned int)(inw(0xAC1E)) & 0xFFl; + return (val << 19); } +#endif int gx_line_delta(int xres, int bpp) { @@ -81,6 +96,7 @@ static void gx_set_mode(struct fb_info * writel(((info->var.xres * info->var.bits_per_pixel/8) >> 3) + 2, par->dc_regs + DC_LINE_SIZE); + /* Enable graphics and video data and unmask address lines. */ dcfg |= DC_DCFG_GDEN | DC_DCFG_VDEN | DC_DCFG_A20M | DC_DCFG_A18M; diff -puN drivers/video/geode/display_gx.h~git-geode drivers/video/geode/display_gx.h --- a/drivers/video/geode/display_gx.h~git-geode +++ a/drivers/video/geode/display_gx.h @@ -11,7 +11,7 @@ #ifndef __DISPLAY_GX_H__ #define __DISPLAY_GX_H__ -int gx_frame_buffer_size(void); +unsigned int gx_frame_buffer_size(void); int gx_line_delta(int xres, int bpp); extern struct geode_dc_ops gx_dc_ops; @@ -93,4 +93,5 @@ extern struct geode_dc_ops gx_dc_ops; #define DC_PAL_ADDRESS 0x70 #define DC_PAL_DATA 0x74 +#define DC_GLIU0_MEM_OFFSET 0x84 #endif /* !__DISPLAY_GX1_H__ */ diff -puN drivers/video/geode/gxfb_core.c~git-geode drivers/video/geode/gxfb_core.c --- a/drivers/video/geode/gxfb_core.c~git-geode +++ a/drivers/video/geode/gxfb_core.c @@ -241,6 +241,12 @@ static int __init gxfb_map_video_memory( if (!info->screen_base) return -ENOMEM; + /* Set the 16MB aligned base address of the graphics memory region + * in the display controller */ + + writel(info->fix.smem_start & 0xFF000000, + par->dc_regs + DC_GLIU0_MEM_OFFSET); + dev_info(&dev->dev, "%d Kibyte of video memory at 0x%lx\n", info->fix.smem_len / 1024, info->fix.smem_start); @@ -381,7 +387,7 @@ static void gxfb_remove(struct pci_dev * } static struct pci_device_id gxfb_id_table[] = { - { PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_CS5535_VIDEO, + { PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_GX_VIDEO, PCI_ANY_ID, PCI_ANY_ID, PCI_BASE_CLASS_DISPLAY << 16, 0xff0000, 0 }, { 0, } diff -puN drivers/video/geode/Kconfig~git-geode drivers/video/geode/Kconfig --- a/drivers/video/geode/Kconfig~git-geode +++ a/drivers/video/geode/Kconfig @@ -23,6 +23,26 @@ config FB_GEODE_GX If unsure, say N. +config FB_GEODE_GX_SET_FBSIZE + bool "Manually specify the Geode GX framebuffer size" + depends on FB_GEODE_GX + default n + ---help--- + If you want to manually specify the size of your GX framebuffer, + say Y here, otherwise say N to dynamically probe it. + + Say N unless you know what you are doing. + +config FB_GEODE_GX_FBSIZE + hex "Size of the GX framebuffer, in bytes" + depends on FB_GEODE_GX_SET_FBSIZE + default "0x1600000" + ---help--- + Specify the size of the GX framebuffer. Normally, you will + want this to be MB aligned. Common values are 0x80000 (8MB) + and 0x1600000 (16MB). Don't change this unless you know what + you are doing + config FB_GEODE_GX1 tristate "AMD Geode GX1 framebuffer support (EXPERIMENTAL)" depends on FB && FB_GEODE && EXPERIMENTAL diff -puN drivers/video/geode/video_gx.c~git-geode drivers/video/geode/video_gx.c --- a/drivers/video/geode/video_gx.c~git-geode +++ a/drivers/video/geode/video_gx.c @@ -178,7 +178,21 @@ static void gx_set_dclk_frequency(struct static void gx_configure_display(struct fb_info *info) { struct geodefb_par *par = info->par; - u32 dcfg, fp_pm; + u32 dcfg, fp_pm, misc; + + /* Set up the MISC register */ + + misc = readl(par->vid_regs + GX_MISC); + + /* Power up the DAC */ + misc &= ~(GX_MISC_A_PWRDN | GX_MISC_DAC_PWRDN); + + /* Disable gamma correction */ + misc |= GX_MISC_GAM_EN; + + writel(misc, par->vid_regs + GX_MISC); + + /* Write the display configuration */ dcfg = readl(par->vid_regs + GX_DCFG); @@ -199,9 +213,17 @@ static void gx_configure_display(struct if (info->var.sync & FB_SYNC_VERT_HIGH_ACT) dcfg |= GX_DCFG_CRT_VSYNC_POL; + /* Enable the display logic */ + /* Set up the DACS to blank normally */ + + dcfg |= GX_DCFG_CRT_EN | GX_DCFG_DAC_BL_EN; + + /* Enable the external DAC VREF? */ + writel(dcfg, par->vid_regs + GX_DCFG); /* Power on flat panel. */ + fp_pm = readl(par->vid_regs + GX_FP_PM); fp_pm |= GX_FP_PM_P; writel(fp_pm, par->vid_regs + GX_FP_PM); diff -puN drivers/video/geode/video_gx.h~git-geode drivers/video/geode/video_gx.h --- a/drivers/video/geode/video_gx.h~git-geode +++ a/drivers/video/geode/video_gx.h @@ -28,6 +28,13 @@ extern struct geode_vid_ops gx_vid_ops; # define GX_DCFG_GV_GAM 0x00200000 # define GX_DCFG_DAC_VREF 0x04000000 +/* Geode GX MISC video configuration */ + +#define GX_MISC 0x50 +#define GX_MISC_GAM_EN 0x00000001 +#define GX_MISC_DAC_PWRDN 0x00000400 +#define GX_MISC_A_PWRDN 0x00000800 + /* Geode GX flat panel display control registers */ #define GX_FP_PM 0x410 # define GX_FP_PM_P 0x01000000 diff -puN drivers/video/Kconfig~git-geode drivers/video/Kconfig --- a/drivers/video/Kconfig~git-geode +++ a/drivers/video/Kconfig @@ -540,7 +540,7 @@ config FB_TGA config FB_VESA bool "VESA VGA graphics support" - depends on (FB = y) && X86 + depends on (FB = y) && X86 && !VGA_NOPROBE select FB_CFB_FILLRECT select FB_CFB_COPYAREA select FB_CFB_IMAGEBLIT @@ -1166,7 +1166,7 @@ config FB_SAVAGE_ACCEL config FB_SIS tristate "SiS/XGI display support" - depends on FB && PCI + depends on FB && PCI && !VGA_NOPROBE select FB_CFB_FILLRECT select FB_CFB_COPYAREA select FB_CFB_IMAGEBLIT diff -puN include/linux/pci_ids.h~git-geode include/linux/pci_ids.h --- a/include/linux/pci_ids.h~git-geode +++ a/include/linux/pci_ids.h @@ -390,7 +390,7 @@ #define PCI_DEVICE_ID_NS_CS5535_IDE 0x002d #define PCI_DEVICE_ID_NS_CS5535_AUDIO 0x002e #define PCI_DEVICE_ID_NS_CS5535_USB 0x002f -#define PCI_DEVICE_ID_NS_CS5535_VIDEO 0x0030 +#define PCI_DEVICE_ID_NS_GX_VIDEO 0x0030 #define PCI_DEVICE_ID_NS_SATURN 0x0035 #define PCI_DEVICE_ID_NS_SCx200_BRIDGE 0x0500 #define PCI_DEVICE_ID_NS_SCx200_SMI 0x0501 @@ -403,8 +403,7 @@ #define PCI_DEVICE_ID_NS_SC1100_XBUS 0x0515 #define PCI_DEVICE_ID_NS_87410 0xd001 -#define PCI_DEVICE_ID_NS_CS5535_HOST_BRIDGE 0x0028 -#define PCI_DEVICE_ID_NS_CS5535_ISA_BRIDGE 0x002b +#define PCI_DEVICE_ID_NS_GX_HOST_BRIDGE 0x0028 #define PCI_VENDOR_ID_TSENG 0x100c #define PCI_DEVICE_ID_TSENG_W32P_2 0x3202 _