From: sylvain.meyer@worldonline.fr Code cleanup and small fixes in __iomem annotations Signed-off-by: Sylvain Meyer Signed-off-by: Andrew Morton --- /dev/null | 222 -------------------- 25-akpm/drivers/video/intelfb/intelfb.h | 33 --- 25-akpm/drivers/video/intelfb/intelfbdrv.c | 319 ++++++++--------------------- 25-akpm/drivers/video/intelfb/intelfbdrv.h | 14 - 25-akpm/drivers/video/intelfb/intelfbhw.c | 10 5 files changed, 112 insertions(+), 486 deletions(-) diff -L drivers/video/intelfb/builtinmodes.c -puN drivers/video/intelfb/builtinmodes.c~fbdev-intelfb-code-cleanup /dev/null --- 25/drivers/video/intelfb/builtinmodes.c +++ /dev/null 2003-09-15 06:40:47.000000000 -0700 @@ -1,222 +0,0 @@ - -/* - * THIS FILE IS AUTOMATICALLY GENERATED BY fbmode.pl -- DO NOT EDIT - */ - -static struct fb_videomode modedb[] = { - { - /* 640x350 @ 85 Hz, 37.9 kHz hsync */ - "640x350@85", 85, 640, 350, 31746, 96, 32, 60, 32, 64, 3, - FB_SYNC_HOR_HIGH_ACT, FB_VMODE_NONINTERLACED - }, - { - /* 640x400 @ 85 Hz, 37.9 kHz hsync */ - "640x400@85", 85, 640, 400, 31746, 96, 32, 41, 1, 64, 3, - FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED - }, - { - /* 720x400 @ 85 Hz, 37.9 kHz hsync */ - "720x400@85", 85, 720, 400, 28169, 108, 36, 42, 1, 72, 3, - FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED - }, - { - /* 640x480 @ 60 Hz, 31.5 kHz hsync */ - "640x480@60", 60, 640, 480, 39683, 48, 16, 33, 10, 96, 2, - 0, FB_VMODE_NONINTERLACED - }, - { - /* 640x480 @ 73 Hz, 37.9 kHz hsync */ - "640x480@73", 73, 640, 480, 31746, 128, 24, 29, 9, 40, 2, - 0, FB_VMODE_NONINTERLACED - }, - { - /* 640x480 @ 75 Hz, 37.5 kHz hsync */ - "640x480@75", 75, 640, 480, 31746, 120, 16, 16, 1, 64, 3, - 0, FB_VMODE_NONINTERLACED - }, - { - /* 640x480 @ 85 Hz, 43.3 kHz hsync */ - "640x480@85", 85, 640, 480, 27778, 80, 56, 25, 1, 56, 3, - 0, FB_VMODE_NONINTERLACED - }, - { - /* 800x600 @ 56 Hz, 35.2 kHz hsync */ - "800x600@56", 56, 800, 600, 27778, 128, 24, 22, 1, 72, 2, - FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED - }, - { - /* 800x600 @ 60 Hz, 37.9 kHz hsync */ - "800x600@60", 60, 800, 600, 25000, 88, 40, 23, 1, 128, 4, - FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED - }, - { - /* 800x600 @ 72 Hz, 48.1 kHz hsync */ - "800x600@72", 72, 800, 600, 20000, 64, 56, 23, 37, 120, 6, - FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED - }, - { - /* 800x600 @ 75 Hz, 46.9 kHz hsync */ - "800x600@75", 75, 800, 600, 20202, 160, 16, 21, 1, 80, 3, - FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED - }, - { - /* 800x600 @ 85 Hz, 53.7 kHz hsync */ - "800x600@85", 85, 800, 600, 17762, 152, 32, 27, 1, 64, 3, - FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED - }, - { - /* 1024x768 @ 60 Hz, 48.4 kHz hsync */ - "1024x768@60", 60, 1024, 768, 15385, 160, 24, 29, 3, 136, 6, - 0, FB_VMODE_NONINTERLACED - }, - { - /* 1024x768 @ 70 Hz, 56.5 kHz hsync */ - "1024x768@70", 70, 1024, 768, 13333, 144, 24, 29, 3, 136, 6, - 0, FB_VMODE_NONINTERLACED - }, - { - /* 1024x768 @ 75 Hz, 60.1 kHz hsync */ - "1024x768@75", 75, 1024, 768, 12690, 176, 16, 28, 1, 96, 3, - FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED - }, - { - /* 1024x768 @ 85 Hz, 68.7 kHz hsync */ - "1024x768@85", 85, 1024, 768, 10582, 208, 48, 36, 1, 96, 3, - FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED - }, - { - /* 1152x864 @ 75 Hz, 67.5 kHz hsync */ - "1152x864@75", 75, 1152, 864, 9259, 256, 64, 32, 1, 128, 3, - FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED - }, - { - /* 1280x960 @ 60 Hz, 60.0 kHz hsync */ - "1280x960@60", 60, 1280, 960, 9259, 312, 96, 36, 1, 112, 3, - FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED - }, - { - /* 1280x960 @ 85 Hz, 85.9 kHz hsync */ - "1280x960@85", 85, 1280, 960, 6734, 224, 64, 47, 1, 160, 3, - FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED - }, - { - /* 1280x1024 @ 60 Hz, 64.0 kHz hsync */ - "1280x1024@60", 60, 1280, 1024, 9259, 248, 48, 38, 1, 112, 3, - FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED - }, - { - /* 1280x1024 @ 75 Hz, 80.0 kHz hsync */ - "1280x1024@75", 75, 1280, 1024, 7407, 248, 16, 38, 1, 144, 3, - FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED - }, - { - /* 1280x1024 @ 85 Hz, 91.1 kHz hsync */ - "1280x1024@85", 85, 1280, 1024, 6349, 224, 64, 44, 1, 160, 3, - FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED - }, - { - /* 1600x1200 @ 60 Hz, 75.0 kHz hsync */ - "1600x1200@60", 60, 1600, 1200, 6173, 304, 64, 46, 1, 192, 3, - FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED - }, - { - /* 1600x1200 @ 65 Hz, 81.2 kHz hsync */ - "1600x1200@65", 65, 1600, 1200, 5698, 304, 64, 46, 1, 192, 3, - FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED - }, - { - /* 1600x1200 @ 70 Hz, 87.5 kHz hsync */ - "1600x1200@70", 70, 1600, 1200, 5291, 304, 64, 46, 1, 192, 3, - FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED - }, - { - /* 1600x1200 @ 75 Hz, 93.8 kHz hsync */ - "1600x1200@75", 75, 1600, 1200, 4938, 304, 64, 46, 1, 192, 3, - FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED - }, - { - /* 1600x1200 @ 85 Hz, 106.2 kHz hsync */ - "1600x1200@85", 85, 1600, 1200, 4357, 304, 64, 46, 1, 192, 3, - FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED - }, - { - /* 1792x1344 @ 60 Hz, 83.7 kHz hsync */ - "1792x1344@60", 60, 1792, 1344, 4883, 328, 128, 46, 1, 200, 3, - FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED - }, - { - /* 1792x1344 @ 75 Hz, 106.3 kHz hsync */ - "1792x1344@75", 75, 1792, 1344, 3831, 352, 96, 69, 1, 216, 3, - FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED - }, - { - /* 1856x1392 @ 60 Hz, 86.4 kHz hsync */ - "1856x1392@60", 60, 1856, 1392, 4581, 352, 96, 43, 1, 224, 3, - FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED - }, - { - /* 1856x1392 @ 75 Hz, 112.5 kHz hsync */ - "1856x1392@75", 75, 1856, 1392, 3472, 352, 128, 104, 1, 224, 3, - FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED - }, - { - /* 1920x1440 @ 60 Hz, 90.0 kHz hsync */ - "1920x1440@60", 60, 1920, 1440, 4274, 344, 128, 56, 1, 208, 3, - FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED - }, - { - /* 1920x1440 @ 75 Hz, 112.5 kHz hsync */ - "1920x1440@75", 75, 1920, 1440, 3367, 352, 144, 56, 1, 224, 3, - FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED - }, - { - /* 832x624 @ 75 Hz, 49.7 kHz hsync */ - "832x624@75", 75, 832, 624, 17457, 224, 32, 39, 1, 64, 3, - 0, FB_VMODE_NONINTERLACED - }, - { - /* 1152x768 @ 55 Hz, 44.2 kHz hsync */ - "1152x768@55", 55, 1152, 768, 15386, 158, 26, 29, 3, 136, 6, - FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED - }, - { - /* 1400x1050 @ 60 Hz, 64.9 kHz hsync */ - "1400x1050@60", 60, 1400, 1050, 8197, 240, 88, 18, 2, 152, 12, - FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED - }, - { - /* 1400x1050 @ 75 Hz, 81.5 kHz hsync */ - "1400x1050@75", 75, 1400, 1050, 6418, 128, 64, 26, 2, 320, 12, - FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED - }, - { - /* 1600x1024 @ 60 Hz, 64.0 kHz hsync */ - "1600x1024@60", 60, 1600, 1024, 9354, 30, 20, 37, 3, 20, 3, - 0, FB_VMODE_NONINTERLACED - }, - { - /* 1920x1440 @ 85 Hz, 128.5 kHz hsync */ - "1920x1440@85", 85, 1920, 1440, 2930, 368, 152, 68, 1, 216, 3, - FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED - }, - { - /* 2048x1536 @ 60 Hz, 95.3 kHz hsync */ - "2048x1536@60", 60, 2048, 1536, 3746, 376, 152, 49, 1, 224, 3, - FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED - }, - { - /* 2048x1536 @ 75 Hz, 120.2 kHz hsync */ - "2048x1536@75", 75, 2048, 1536, 2937, 392, 168, 63, 1, 224, 3, - FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED - }, - { - /* 2048x1536 @ 85 Hz, 137.0 kHz hsync */ - "2048x1536@85", 85, 2048, 1536, 2577, 392, 168, 72, 1, 224, 3, - FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED - } -}; - -static int num_modes = sizeof(modedb) / sizeof(modedb[0]); - -#define DFLT_MODE 3 - diff -puN drivers/video/intelfb/intelfbdrv.c~fbdev-intelfb-code-cleanup drivers/video/intelfb/intelfbdrv.c --- 25/drivers/video/intelfb/intelfbdrv.c~fbdev-intelfb-code-cleanup 2004-11-03 19:16:00.160101408 -0800 +++ 25-akpm/drivers/video/intelfb/intelfbdrv.c 2004-11-03 19:16:00.173099432 -0800 @@ -87,10 +87,13 @@ * 09/2004 - Version 0.9.0 - by Sylvain Meyer * Port to linux 2.6 kernel fbdev * Fix HW accel and HW cursor on i845G - * Add TV-Out functionality (tested with a ch7011 tv encoder) * Use of agpgart for fb memory reservation * Add mtrr support * + * 10/2004 - Version 0.9.1 + * Use module_param instead of old MODULE_PARM + * Some cleanup + * * TODO: * * @@ -130,10 +133,6 @@ #include "intelfbdrv.h" #include "intelfbhw.h" -#include "builtinmodes.c" - -#define FB_ACCEL_I830 42 - /* * Limiting the class to PCI_CLASS_DISPLAY_VGA prevents function 1 of the * mobile chipsets from being registered. @@ -187,18 +186,38 @@ MODULE_DESCRIPTION( MODULE_LICENSE("Dual BSD/GPL"); MODULE_DEVICE_TABLE(pci, intelfb_pci_table); -INTELFB_INT_PARAM(accel, 1, "Enable console acceleration"); -INTELFB_INT_PARAM(hwcursor, 1, "Enable HW cursor"); -INTELFB_INT_PARAM(mtrr, 1, "Enable MTRR support"); -INTELFB_INT_PARAM(fixed, 0, "Disable mode switching"); -INTELFB_INT_PARAM(noinit, 0, "Don't initialise graphics mode when loading"); -INTELFB_INT_PARAM(noregister, 0, "Don't register, just probe and exit (debug)"); -INTELFB_INT_PARAM(probeonly, 0, "Do a minimal probe (debug)"); -INTELFB_INT_PARAM(idonly, 0, - "Just identify without doing anything else (debug)"); -INTELFB_INT_PARAM(bailearly, 0, "Bail out early, depending on value (debug)"); -INTELFB_STR_PARAM(mode, 0, - "Initial video mode \"x[-][@]\""); +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; + +module_param(accel, bool, S_IRUGO); +MODULE_PARM_DESC(accel, "Enable console acceleration"); +module_param(hwcursor, bool, S_IRUGO); +MODULE_PARM_DESC(hwcursor, "Enable HW cursor"); +module_param(mtrr, bool, S_IRUGO); +MODULE_PARM_DESC(mtrr, "Enable MTRR support"); +module_param(fixed, bool, S_IRUGO); +MODULE_PARM_DESC(fixed, "Disable mode switching"); +module_param(noinit, bool, 0); +MODULE_PARM_DESC(noinit, "Don't initialise graphics mode when loading"); +module_param(noregister, bool, 0); +MODULE_PARM_DESC(noregister, "Don't register, just probe and exit (debug)"); +module_param(probeonly, bool, 0); +MODULE_PARM_DESC(probeonly, "Do a minimal probe (debug)"); +module_param(idonly, bool, 0); +MODULE_PARM_DESC(idonly, "Just identify without doing anything else (debug)"); +module_param(bailearly, bool, 0); +MODULE_PARM_DESC(bailearly, "Bail out early, depending on value (debug)"); +module_param(mode, charp, S_IRUGO); +MODULE_PARM_DESC(mode, + "Initial video mode \"x[-][@]\""); /*************************************************************** * modules entry points * ***************************************************************/ @@ -224,7 +243,6 @@ intelfb_init(void) if (fb_get_options("intelfb", &option)) return -ENODEV; intelfb_setup(option); - #endif return pci_module_init(&intelfb_driver); @@ -239,7 +257,6 @@ 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 * @@ -282,19 +299,6 @@ get_opt_bool(const char *this_opt, const return 1; } -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; -} - int __init intelfb_setup(char *options) { @@ -510,7 +514,7 @@ intelfb_pci_register(struct pci_dev *pde } /* Map the fb and MMIO regions */ - dinfo->aperture.virtual = (u32 __iomem *)ioremap_nocache + dinfo->aperture.virtual = (u8 __iomem *)ioremap_nocache (dinfo->aperture.physical, dinfo->aperture.size); if (!dinfo->aperture.virtual) { ERR_MSG("Cannot remap FB region.\n"); @@ -518,7 +522,7 @@ intelfb_pci_register(struct pci_dev *pde return -ENODEV; } dinfo->mmio_base = - (u32 __iomem *)ioremap_nocache(dinfo->mmio_base_phys, + (u8 __iomem *)ioremap_nocache(dinfo->mmio_base_phys, INTEL_REG_SIZE); if (!dinfo->mmio_base) { ERR_MSG("Cannot remap MMIO region.\n"); @@ -759,27 +763,6 @@ intelfb_pci_register(struct pci_dev *pde if (bailearly == 18) bailout(dinfo); -#if TEST_MODE_TO_HW - { - struct intelfb_hwstate hw; - struct fb_var_screeninfo var; - int i; - - for (i = 0; i < num_modes; i++) { - mode_to_var(&modedb[i], &var, 8); - intelfbhw_read_hw_state(dinfo, &hw, 0); - if (intelfbhw_mode_to_hw(dinfo, &hw, &var)) { - DBG_MSG("Failed to set hw for mode %dx%d\n", - var.xres, var.yres); - } else { - DBG_MSG("HW state for mode %dx%d\n", - var.xres, var.yres); - intelfbhw_print_hw_state(dinfo, &hw); - } - } - } -#endif - /* Cursor initialisation */ if (dinfo->hwcursor) { intelfbhw_cursor_init(dinfo); @@ -835,79 +818,7 @@ intelfb_pci_unregister(struct pci_dev *p * helper functions * ***************************************************************/ -/* - * A simplified version of fb_find_mode. The latter doesn't seem to work - * too well -- haven't figured out why yet. - */ -static int -intelfb_find_mode(struct fb_var_screeninfo *var, - struct fb_info *info, const char *mode_option, - const struct fb_videomode *db, unsigned int dbsize, - const struct fb_videomode *default_mode, - unsigned int default_bpp) -{ - int i; - char mname[20] = "", tmp[20] = "", *p, *q; - unsigned int bpp = 0; - - DBG_MSG("intelfb_find_mode\n"); - - /* Set up defaults */ - if (!db) { - db = modedb; - dbsize = sizeof(modedb) / sizeof(*modedb); - } - - if (!default_bpp) - default_bpp = 16; - - var->activate = FB_ACTIVATE_TEST; - if (mode_option && *mode_option) { - if (strlen(mode_option) < sizeof(tmp) - 1) { - strcat(tmp, mode_option); - q = tmp; - p = strsep(&q, "-"); - strcat(mname, p); - if (q) { - p = strsep(&q, "@"); - bpp = simple_strtoul(p, NULL, 10); - if (q) { - strcat(mname, "@"); - strcat(mname, q); - } - } - } - if (!bpp) - bpp = default_bpp; - DBG_MSG("Mode is %s, bpp %d\n", mname, bpp); - } - if (*mname) { - for (i = 0; i < dbsize; i++) { - if (!strncmp(db[i].name, mname, strlen(mname))) { - mode_to_var(&db[i], var, bpp); - if (!intelfb_check_var(var, info)) - return 1; - } - } - } - - if (!default_mode) - return 0; - - mode_to_var(default_mode, var, default_bpp); - if (!intelfb_check_var(var, info)) - return 3; - - for (i = 0; i < dbsize; i++) { - mode_to_var(&db[i], var, default_bpp); - if (!intelfb_check_var(var, info)) - return 4; - } - - return 0; -} - -int +int __inline__ intelfb_var_to_depth(const struct fb_var_screeninfo *var) { DBG_MSG("intelfb_var_to_depth: bpp: %d, green.length is %d\n", @@ -923,7 +834,23 @@ intelfb_var_to_depth(const struct fb_var } } -static void + +static __inline__ int +var_to_refresh(const struct fb_var_screeninfo *var) +{ + int xtot = var->xres + var->left_margin + var->right_margin + + var->hsync_len; + int ytot = var->yres + var->upper_margin + var->lower_margin + + var->vsync_len; + + return (1000000000 / var->pixclock * 1000 + 500) / xtot / ytot; +} + +/*************************************************************** + * Various intialisation functions * + ***************************************************************/ + +static void __devinit get_initial_mode(struct intelfb_info *dinfo) { struct fb_var_screeninfo *var; @@ -940,16 +867,6 @@ get_initial_mode(struct intelfb_info *di memset(var, 0, sizeof(*var)); var->xres = screen_info.lfb_width; var->yres = screen_info.lfb_height; - var->xres_virtual = var->xres; -#if ALLOCATE_FOR_PANNING - /* Allow use of half of the video ram for panning */ - var->yres_virtual = - dinfo->initial_video_ram / 2 / dinfo->initial_pitch; - if (var->yres_virtual < var->yres) - var->yres_virtual = var->yres; -#else - var->yres_virtual = var->yres; -#endif var->bits_per_pixel = screen_info.lfb_depth; switch (screen_info.lfb_depth) { case 15: @@ -1001,84 +918,29 @@ get_initial_mode(struct intelfb_info *di } } -/* Convert a mode to a var, also making the bpp a supported value. */ -static void -mode_to_var(const struct fb_videomode *mode, struct fb_var_screeninfo *var, - u32 bpp) -{ - if (!mode || !var) - return; - - var->xres = mode->xres; - var->yres = mode->yres; - var->xres_virtual = mode->xres; - var->yres_virtual = mode->yres; - var->xoffset = 0; - var->yoffset = 0; - if (bpp <= 8) - var->bits_per_pixel = 8; - else if (bpp <= 16) { - if (bpp == 16) - var->green.length = 6; - var->bits_per_pixel = 16; - } else if (bpp <= 32) - var->bits_per_pixel = 32; - else { - WRN_MSG("var_to_mode: bad bpp: %d\n", bpp); - var->bits_per_pixel = bpp; - } - var->pixclock = mode->pixclock; - var->left_margin = mode->left_margin; - var->right_margin = mode->right_margin; - var->upper_margin = mode->upper_margin; - var->lower_margin = mode->lower_margin; - var->hsync_len = mode->hsync_len; - var->vsync_len = mode->vsync_len; - var->sync = mode->sync; - var->vmode = mode->vmode; - var->width = -1; - var->height = -1; -} - -static __inline__ int -var_to_refresh(const struct fb_var_screeninfo *var) -{ - int xtot = var->xres + var->left_margin + var->right_margin + - var->hsync_len; - int ytot = var->yres + var->upper_margin + var->lower_margin + - var->vsync_len; - - return (1000000000 / var->pixclock * 1000 + 500) / xtot / ytot; -} - -/*************************************************************** - * Various intialisation functions * - ***************************************************************/ - static int __devinit intelfb_init_var(struct intelfb_info *dinfo) { + struct fb_var_screeninfo *var; int msrc = 0; - DBG_MSG("intelfb_init_disp_var\n"); + DBG_MSG("intelfb_init_var\n"); - if (dinfo->fixed_mode) { - memcpy(&dinfo->info->var, &dinfo->initial_var, + var = &dinfo->info->var; + if (FIXED_MODE(dinfo)) { + memcpy(var, &dinfo->initial_var, sizeof(struct fb_var_screeninfo)); msrc = 5; } else { if (mode) { - msrc = intelfb_find_mode(&dinfo->info->var, - dinfo->info, mode, - modedb, num_modes, NULL, 0); + msrc = fb_find_mode(var, dinfo->info, mode, + NULL, 0, NULL, 0); if (msrc) msrc |= 8; } if (!msrc) { - msrc = intelfb_find_mode(&dinfo->info->var, - dinfo->info, PREFERRED_MODE, - modedb, num_modes, - &modedb[DFLT_MODE], 0); + msrc = fb_find_mode(var, dinfo->info, PREFERRED_MODE, + NULL, 0, NULL, 0); } } @@ -1087,16 +949,26 @@ intelfb_init_var(struct intelfb_info *di return 1; } - INF_MSG("Initial video mode is %dx%d-%d@%d.\n", dinfo->info->var.xres, - dinfo->info->var.yres, intelfb_var_to_depth(&dinfo->info->var), - var_to_refresh(&dinfo->info->var)); + INF_MSG("Initial video mode is %dx%d-%d@%d.\n", var->xres, var->yres, + var->bits_per_pixel, var_to_refresh(var)); DBG_MSG("Initial video mode is from %d.\n", msrc); +#if ALLOCATE_FOR_PANNING + /* Allow use of half of the video ram for panning */ + var->xres_virtual = var->xres; + var->yres_virtual = + dinfo->fb.size / 2 / (var->bits_per_pixel * var->xres); + if (var->yres_virtual < var->yres) + var->yres_virtual = var->yres; +#else + var->yres_virtual = var->yres; +#endif + if (dinfo->accel) - dinfo->info->var.accel_flags |= FB_ACCELF_TEXT; + var->accel_flags |= FB_ACCELF_TEXT; else - dinfo->info->var.accel_flags &= ~FB_ACCELF_TEXT; + var->accel_flags &= ~FB_ACCELF_TEXT; return 0; } @@ -1211,7 +1083,7 @@ intelfb_check_var(struct fb_var_screenin if (intelfbhw_validate_mode(dinfo, var) != 0) return -EINVAL; - memcpy(&v, var, sizeof(v)); + v = *var; /* Check for a supported bpp. */ if (v.bits_per_pixel <= 8) { @@ -1299,7 +1171,7 @@ intelfb_check_var(struct fb_var_screenin v.red.msb_right = v.green.msb_right = v.blue.msb_right = v.transp.msb_right = 0; - memcpy(var, &v, sizeof(v)); + *var = v; return 0; } @@ -1317,16 +1189,14 @@ intelfb_set_par(struct fb_info *info) } DBG_MSG("intelfb_set_par (%dx%d-%d)\n", info->var.xres, - info->var.yres, intelfb_var_to_depth(&info->var)); + info->var.yres, info->var.bits_per_pixel); intelfb_blank(1, info); if (dinfo->accel) intelfbhw_2d_stop(dinfo); - mdelay(100); - - memcpy(&hw, &dinfo->save_state, sizeof(hw)); + hw = dinfo->save_state; if (intelfbhw_mode_to_hw(dinfo, &hw, &info->var)) return -EINVAL; if (intelfbhw_program_mode(dinfo, &hw, 0)) @@ -1339,15 +1209,20 @@ intelfb_set_par(struct fb_info *info) update_dinfo(dinfo, &info->var); - mdelay(100); - if (dinfo->accel) intelfbhw_2d_start(dinfo); - intelfbhw_pan_display(&info->var, info); + intelfb_pan_display(&info->var, info); intelfb_blank(0, info); + if (ACCEL(dinfo, info)) { + info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN | + FBINFO_HWACCEL_COPYAREA | FBINFO_HWACCEL_FILLRECT | + FBINFO_HWACCEL_IMAGEBLIT; + } else { + info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN; + } return 0; } @@ -1432,7 +1307,7 @@ intelfb_fillrect (struct fb_info *info, DBG_MSG("intelfb_fillrect\n"); #endif - if (!dinfo->accel || dinfo->ring_lockup || dinfo->depth == 4) + if (!ACCEL(dinfo, info) || dinfo->depth == 4) return cfb_fillrect(info, rect); if (rect->rop == ROP_COPY) @@ -1460,7 +1335,7 @@ intelfb_copyarea(struct fb_info *info, c DBG_MSG("intelfb_copyarea\n"); #endif - if (!dinfo->accel || dinfo->ring_lockup || dinfo->depth == 4) + if (!ACCEL(dinfo, info) || dinfo->depth == 4) return cfb_copyarea(info, region); intelfbhw_do_bitblt(dinfo, region->sx, region->sy, region->dx, @@ -1478,7 +1353,7 @@ intelfb_imageblit(struct fb_info *info, DBG_MSG("intelfb_imageblit\n"); #endif - if (!dinfo->accel || dinfo->ring_lockup || dinfo->depth == 4 + if (!ACCEL(dinfo, info) || dinfo->depth == 4 || image->depth != 1) return cfb_imageblit(info, image); @@ -1512,7 +1387,7 @@ intelfb_cursor(struct fb_info *info, str intelfbhw_cursor_hide(dinfo); /* If XFree killed the cursor - restore it */ - if (INREG(CURSOR_A_BASEADDR) != dinfo->cursor.physical) { + if (INREG(CURSOR_A_BASEADDR) != dinfo->cursor.offset << 12) { u32 fg, bg; DBG_MSG("the cursor was killed - restore it !!\n"); @@ -1572,7 +1447,7 @@ intelfb_cursor(struct fb_info *info, str intelfbhw_cursor_setcolor(dinfo, bg, fg); } - if (cursor->set & (FB_CUR_SETSHAPE & FB_CUR_SETIMAGE)) { + if (cursor->set & (FB_CUR_SETSHAPE | FB_CUR_SETIMAGE)) { u32 s_pitch = (ROUND_UP_TO(cursor->image.width, 8) / 8); u32 size = s_pitch * cursor->image.height; u8 *dat = (u8 *) cursor->image.data; diff -puN drivers/video/intelfb/intelfbdrv.h~fbdev-intelfb-code-cleanup drivers/video/intelfb/intelfbdrv.h --- 25/drivers/video/intelfb/intelfbdrv.h~fbdev-intelfb-code-cleanup 2004-11-03 19:16:00.162101104 -0800 +++ 25-akpm/drivers/video/intelfb/intelfbdrv.h 2004-11-03 19:16:00.174099280 -0800 @@ -29,19 +29,11 @@ */ int __init intelfb_setup(char *options); -static void get_initial_mode(struct intelfb_info *dinfo); +static void __devinit get_initial_mode(struct intelfb_info *dinfo); static void update_dinfo(struct intelfb_info *dinfo, struct fb_var_screeninfo *var); static int intelfb_get_fix(struct fb_fix_screeninfo *fix, struct fb_info *info); -static void mode_to_var(const struct fb_videomode *mode, - struct fb_var_screeninfo *var, u32 bpp); -static int -intelfb_find_mode(struct fb_var_screeninfo *var, - struct fb_info *info, const char *mode_option, - const struct fb_videomode *db, unsigned int dbsize, - const struct fb_videomode *default_mode, - unsigned int default_bpp); static int intelfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info); @@ -69,8 +61,8 @@ static int intelfb_ioctl(struct inode *i unsigned int cmd, unsigned long arg, struct fb_info *info); -static int intelfb_pci_register(struct pci_dev *pdev, - const struct pci_device_id *ent); +static int __devinit intelfb_pci_register(struct pci_dev *pdev, + const struct pci_device_id *ent); static void __devexit intelfb_pci_unregister(struct pci_dev *pdev); static int __devinit intelfb_set_fbinfo(struct intelfb_info *dinfo); diff -puN drivers/video/intelfb/intelfb.h~fbdev-intelfb-code-cleanup drivers/video/intelfb/intelfb.h --- 25/drivers/video/intelfb/intelfb.h~fbdev-intelfb-code-cleanup 2004-11-03 19:16:00.164100800 -0800 +++ 25-akpm/drivers/video/intelfb/intelfb.h 2004-11-03 19:16:00.174099280 -0800 @@ -8,7 +8,7 @@ /*** Version/name ***/ -#define INTELFB_VERSION "0.9.0" +#define INTELFB_VERSION "0.9.1" #define INTELFB_MODULE_NAME "intelfb" #define SUPPORTED_CHIPSETS "830M/845G/852GM/855GM/865G" @@ -35,14 +35,6 @@ #define ALLOCATE_FOR_PANNING 1 #endif -#ifndef BAILOUT_EARLY -#define BAILOUT_EARLY 0 -#endif - -#ifndef TEST_MODE_TO_HW -#define TEST_MODE_TO_HW 0 -#endif - #ifndef PREFERRED_MODE #define PREFERRED_MODE "1024x768-16@60" #endif @@ -94,21 +86,10 @@ /* get commonly used pointers */ #define GET_DINFO(info) (info)->par -/* module parameters */ -#define INTELFB_INT_PARAM(name, default, desc) \ - static int name = default; \ - module_param(name, int, default); \ - MODULE_PARM_DESC(name, desc); - -#define INTELFB_STR_PARAM(name, default, desc) \ - static char *name = (char *) default; \ - module_param(name, charp, default); \ - MODULE_PARM_DESC(name, desc); - /* misc macros */ -#define TEXT_ACCEL(d, v) \ - ((d)->accel && (d)->ring_active && \ - ((v)->accel_flags & FB_ACCELF_TEXT)) +#define ACCEL(d, i) \ + ((d)->accel && !(d)->ring_lockup && \ + ((i)->var.accel_flags & FB_ACCELF_TEXT)) /*#define NOACCEL_CHIPSET(d) \ ((d)->chipset != INTEL_865G)*/ @@ -205,7 +186,7 @@ struct intelfb_hwstate { struct intelfb_heap_data { u32 physical; - u32 __iomem *virtual; + u8 __iomem *virtual; u32 offset; // in GATT pages u32 size; // in bytes }; @@ -234,13 +215,13 @@ struct intelfb_info { /* mmio regs */ u32 mmio_base_phys; - u32 __iomem *mmio_base; + u8 __iomem *mmio_base; /* fb start offset (in bytes) */ u32 fb_start; /* ring buffer */ - u32 __iomem *ring_head; + u8 __iomem *ring_head; u32 ring_tail; u32 ring_tail_mask; u32 ring_space; diff -puN drivers/video/intelfb/intelfbhw.c~fbdev-intelfb-code-cleanup drivers/video/intelfb/intelfbhw.c --- 25/drivers/video/intelfb/intelfbhw.c~fbdev-intelfb-code-cleanup 2004-11-03 19:16:00.166100496 -0800 +++ 25-akpm/drivers/video/intelfb/intelfbhw.c 2004-11-03 19:16:00.176098976 -0800 @@ -290,7 +290,7 @@ intelfbhw_pan_display(struct fb_var_scre if ((xoffset + var->xres > var->xres_virtual) || (yoffset + var->yres > var->yres_virtual)) - return EINVAL; + return -EINVAL; offset = (yoffset * dinfo->pitch) + (xoffset * var->bits_per_pixel) / 8; @@ -1240,7 +1240,7 @@ wait_ring(struct intelfb_info *dinfo, in end = jiffies + (HZ * 3); while (dinfo->ring_space < n) { - dinfo->ring_head = (u32 __iomem *)(INREG(PRI_RING_HEAD) & + dinfo->ring_head = (u8 __iomem *)(INREG(PRI_RING_HEAD) & RING_HEAD_MASK); if (dinfo->ring_tail + RING_MIN_FREE < (u32 __iomem) dinfo->ring_head) @@ -1312,8 +1312,8 @@ refresh_ring(struct intelfb_info *dinfo) DBG_MSG("refresh_ring\n"); #endif - dinfo->ring_head = (u32 __iomem *) (INREG(PRI_RING_HEAD) & - RING_HEAD_MASK); + dinfo->ring_head = (u8 __iomem *) (INREG(PRI_RING_HEAD) & + RING_HEAD_MASK); dinfo->ring_tail = INREG(PRI_RING_TAIL) & RING_TAIL_MASK; if (dinfo->ring_tail + RING_MIN_FREE < (u32 __iomem)dinfo->ring_head) dinfo->ring_space = (u32 __iomem) dinfo->ring_head @@ -1605,7 +1605,7 @@ intelfbhw_cursor_init(struct intelfb_inf CURSOR_ENABLE | CURSOR_STRIDE_MASK); tmp = CURSOR_FORMAT_3C; OUTREG(CURSOR_CONTROL, tmp); - OUTREG(CURSOR_A_BASEADDR, dinfo->cursor.physical); + OUTREG(CURSOR_A_BASEADDR, dinfo->cursor.offset << 12); tmp = (64 << CURSOR_SIZE_H_SHIFT) | (64 << CURSOR_SIZE_V_SHIFT); OUTREG(CURSOR_SIZE, tmp); _