* [patch 1/1] fbdev: Add vram option to intelfb
@ 2004-11-09 21:27 sylvain.meyer
0 siblings, 0 replies; only message in thread
From: sylvain.meyer @ 2004-11-09 21:27 UTC (permalink / raw)
To: akpm; +Cc: linux-fbdev-devel, adaplas, sylvain.meyer
- 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 <sylvain.meyer@worldonline.fr>
---
linux-2.6.10-rc1-mm2-root/drivers/video/intelfb/intelfb.h | 7
linux-2.6.10-rc1-mm2-root/drivers/video/intelfb/intelfbdrv.c | 95 ++++++++---
linux-2.6.10-rc1-mm2-root/drivers/video/intelfb/intelfbhw.c | 2
3 files changed, 81 insertions(+), 23 deletions(-)
diff -puN drivers/video/intelfb/intelfbdrv.c~intelfb-vram drivers/video/intelfb/intelfbdrv.c
--- linux-2.6.10-rc1-mm2/drivers/video/intelfb/intelfbdrv.c~intelfb-vram 2004-11-09 21:14:28.000000000 +0100
+++ linux-2.6.10-rc1-mm2-root/drivers/video/intelfb/intelfbdrv.c 2004-11-09 22:20:59.418754824 +0100
@@ -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~intelfb-vram drivers/video/intelfb/intelfb.h
--- linux-2.6.10-rc1-mm2/drivers/video/intelfb/intelfb.h~intelfb-vram 2004-11-09 21:14:28.000000000 +0100
+++ linux-2.6.10-rc1-mm2-root/drivers/video/intelfb/intelfb.h 2004-11-09 22:20:59.416755128 +0100
@@ -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~intelfb-vram drivers/video/intelfb/intelfbhw.c
--- linux-2.6.10-rc1-mm2/drivers/video/intelfb/intelfbhw.c~intelfb-vram 2004-11-09 22:07:54.000000000 +0100
+++ linux-2.6.10-rc1-mm2-root/drivers/video/intelfb/intelfbhw.c 2004-11-09 22:20:59.419754672 +0100
@@ -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);
_
-------------------------------------------------------
This SF.Net email is sponsored by:
Sybase ASE Linux Express Edition - download now for FREE
LinuxWorld Reader's Choice Award Winner for best database on Linux.
http://ads.osdn.com/?ad_id=5588&alloc_id=12065&op=click
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2004-11-09 21:27 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-11-09 21:27 [patch 1/1] fbdev: Add vram option to intelfb sylvain.meyer
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.