From: sylvain.meyer@worldonline.fr - add vram option to reserve more memory than stolen by BIOS if needed - fix intelfbhw_pan_display typo - add __initdata annotations Signed-off-by: Sylvain Meyer Signed-off-by: Andrew Morton --- 25-akpm/drivers/video/intelfb/intelfb.h | 7 +- 25-akpm/drivers/video/intelfb/intelfbdrv.c | 95 ++++++++++++++++++++++------- 25-akpm/drivers/video/intelfb/intelfbhw.c | 2 3 files changed, 81 insertions(+), 23 deletions(-) diff -puN drivers/video/intelfb/intelfbdrv.c~fbdev-add-vram-option-to-intelfb drivers/video/intelfb/intelfbdrv.c --- 25/drivers/video/intelfb/intelfbdrv.c~fbdev-add-vram-option-to-intelfb Wed Nov 10 14:53:30 2004 +++ 25-akpm/drivers/video/intelfb/intelfbdrv.c Wed Nov 10 14:53:30 2004 @@ -94,6 +94,11 @@ * Use module_param instead of old MODULE_PARM * Some cleanup * + * 11/2004 - Version 0.9.2 + * Add vram option to reserve more memory than stolen by BIOS + * Fix intelfbhw_pan_display typo + * Add __initdata annotations + * * TODO: * * @@ -186,19 +191,22 @@ MODULE_DESCRIPTION( MODULE_LICENSE("Dual BSD/GPL"); MODULE_DEVICE_TABLE(pci, intelfb_pci_table); -static int accel = 1; -static int hwcursor = 1; -static int mtrr = 1; -static int fixed = 0; -static int noinit = 0; -static int noregister = 0; -static int probeonly = 0; -static int idonly = 0; -static int bailearly = 0; -static char *mode = NULL; +static int accel __initdata = 1; +static int vram __initdata = 4; +static int hwcursor __initdata = 1; +static int mtrr __initdata = 1; +static int fixed __initdata = 0; +static int noinit __initdata = 0; +static int noregister __initdata = 0; +static int probeonly __initdata = 0; +static int idonly __initdata = 0; +static int bailearly __initdata = 0; +static char *mode __initdata = NULL; module_param(accel, bool, S_IRUGO); MODULE_PARM_DESC(accel, "Enable console acceleration"); +module_param(vram, int, S_IRUGO); +MODULE_PARM_DESC(vram, "System RAM to allocate to framebuffer in MiB"); module_param(hwcursor, bool, S_IRUGO); MODULE_PARM_DESC(hwcursor, "Enable HW cursor"); module_param(mtrr, bool, S_IRUGO); @@ -257,6 +265,7 @@ intelfb_exit(void) #ifndef MODULE #define OPT_EQUAL(opt, name) (!strncmp(opt, name, strlen(name))) +#define OPT_INTVAL(opt, name) simple_strtoul(opt + strlen(name), NULL, 0) #define OPT_STRVAL(opt, name) (opt + strlen(name)) static __inline__ char * @@ -279,6 +288,19 @@ get_opt_string(const char *this_opt, con } static __inline__ int +get_opt_int(const char *this_opt, const char *name, int *ret) +{ + if (!ret) + return 0; + + if (!OPT_EQUAL(this_opt, name)) + return 0; + + *ret = OPT_INTVAL(this_opt, name); + return 1; +} + +static __inline__ int get_opt_bool(const char *this_opt, const char *name, int *ret) { if (!ret) @@ -330,6 +352,8 @@ intelfb_setup(char *options) continue; if (get_opt_bool(this_opt, "accel", &accel)) ; + else if (get_opt_int(this_opt, "vram", &vram)) + ; else if (get_opt_bool(this_opt, "hwcursor", &hwcursor)) ; else if (get_opt_bool(this_opt, "mtrr", &mtrr)) @@ -402,8 +426,10 @@ cleanup(struct intelfb_info *dinfo) unset_mtrr(dinfo); - if (dinfo->gtt_fb_mem) + if (dinfo->fbmem_gart && dinfo->gtt_fb_mem) { agp_unbind_memory(dinfo->gtt_fb_mem); + agp_free_memory(dinfo->gtt_fb_mem); + } if (dinfo->gtt_cursor_mem) { agp_unbind_memory(dinfo->gtt_cursor_mem); agp_free_memory(dinfo->gtt_cursor_mem); @@ -560,13 +586,14 @@ intelfb_pci_register(struct pci_dev *pde dinfo->accel = 0; } - /* Framebuffer parameters - Use all the stolen memory */ - dinfo->fb.size = ROUND_UP_TO_PAGE(stolen_size); - dinfo->fb.offset = 0; // starts at offset 0 - dinfo->fb.physical = dinfo->aperture.physical - + (dinfo->fb.offset << 12); - dinfo->fb.virtual = dinfo->aperture.virtual + (dinfo->fb.offset << 12); - dinfo->fb_start = dinfo->fb.offset << 12; + /* Framebuffer parameters - Use all the stolen memory if >= vram */ + if (ROUND_UP_TO_PAGE(stolen_size) >= MB(vram)) { + dinfo->fb.size = ROUND_UP_TO_PAGE(stolen_size); + dinfo->fbmem_gart = 0; + } else { + dinfo->fb.size = MB(vram); + dinfo->fbmem_gart = 1; + } /* Allocate space for the ring buffer and HW cursor if enabled. */ if (dinfo->accel) { @@ -601,6 +628,11 @@ intelfb_pci_register(struct pci_dev *pde dinfo->cursor.offset = (stolen_size >> 12) + + gtt_info.current_memory + (dinfo->ring.size >> 12); } + if (dinfo->fbmem_gart) { + dinfo->fb.offset = (stolen_size >> 12) + + + gtt_info.current_memory + (dinfo->ring.size >> 12) + + (dinfo->cursor.size >> 12); + } /* Allocate memories (which aren't stolen) */ if (dinfo->accel) { @@ -652,6 +684,29 @@ intelfb_pci_register(struct pci_dev *pde dinfo->cursor.virtual = dinfo->aperture.virtual + (dinfo->cursor.offset << 12); } + if (dinfo->fbmem_gart) { + if (!(dinfo->gtt_fb_mem = + agp_allocate_memory(dinfo->fb.size >> 12, + AGP_NORMAL_MEMORY))) { + WRN_MSG("cannot allocate framebuffer memory - use " + "the stolen one\n"); + dinfo->fbmem_gart = 0; + } + if (agp_bind_memory(dinfo->gtt_fb_mem, + dinfo->fb.offset)) { + WRN_MSG("cannot bind framebuffer memory - use " + "the stolen one\n"); + dinfo->fbmem_gart = 0; + } + } + + /* update framebuffer memory parameters */ + if (!dinfo->fbmem_gart) + dinfo->fb.offset = 0; /* starts at offset 0 */ + dinfo->fb.physical = dinfo->aperture.physical + + (dinfo->fb.offset << 12); + dinfo->fb.virtual = dinfo->aperture.virtual + (dinfo->fb.offset << 12); + dinfo->fb_start = dinfo->fb.offset << 12; /* release agpgart */ agp_backend_release(); @@ -673,8 +728,8 @@ intelfb_pci_register(struct pci_dev *pde (u32 __iomem ) dinfo->cursor.virtual, dinfo->cursor.offset, dinfo->cursor.physical); - DBG_MSG("options: accel = %d, hwcursor = %d, fixed = %d, " - "noinit = %d\n", accel, hwcursor, fixed, noinit); + DBG_MSG("options: vram = %d, accel = %d, hwcursor = %d, fixed = %d, " + "noinit = %d\n", vram, accel, hwcursor, fixed, noinit); DBG_MSG("options: mode = \"%s\"\n", mode ? mode : ""); if (probeonly) diff -puN drivers/video/intelfb/intelfb.h~fbdev-add-vram-option-to-intelfb drivers/video/intelfb/intelfb.h --- 25/drivers/video/intelfb/intelfb.h~fbdev-add-vram-option-to-intelfb Wed Nov 10 14:53:30 2004 +++ 25-akpm/drivers/video/intelfb/intelfb.h Wed Nov 10 14:53:30 2004 @@ -8,7 +8,7 @@ /*** Version/name ***/ -#define INTELFB_VERSION "0.9.1" +#define INTELFB_VERSION "0.9.2" #define INTELFB_MODULE_NAME "intelfb" #define SUPPORTED_CHIPSETS "830M/845G/852GM/855GM/865G" @@ -199,10 +199,13 @@ struct intelfb_info { struct intelfb_hwstate save_state; /* agpgart structs */ - struct agp_memory *gtt_fb_mem; // use all stolen memory + struct agp_memory *gtt_fb_mem; // use all stolen memory or vram struct agp_memory *gtt_ring_mem; // ring buffer struct agp_memory *gtt_cursor_mem; // hw cursor + /* use a gart reserved fb mem */ + u8 fbmem_gart; + /* mtrr support */ u32 mtrr_reg; u32 has_mtrr; diff -puN drivers/video/intelfb/intelfbhw.c~fbdev-add-vram-option-to-intelfb drivers/video/intelfb/intelfbhw.c --- 25/drivers/video/intelfb/intelfbhw.c~fbdev-add-vram-option-to-intelfb Wed Nov 10 14:53:30 2004 +++ 25-akpm/drivers/video/intelfb/intelfbhw.c Wed Nov 10 14:53:30 2004 @@ -295,7 +295,7 @@ intelfbhw_pan_display(struct fb_var_scre offset = (yoffset * dinfo->pitch) + (xoffset * var->bits_per_pixel) / 8; - offset += dinfo->fb.offset >> 12; + offset += dinfo->fb.offset << 12; OUTREG(DSPABASE, offset); _