2009/8/14 Vladimir 'phcoder' Serbinenko <phco...@gmail.com>: > On Fri, Aug 14, 2009 at 4:04 PM, Michal Suchanek<hramr...@centrum.cz> wrote: >> Hello >> >> I am sending the rest of framebuffer patches that were not included in >> the split by Vladimir. >> >> remove-dup-function.patch >> >> * video_fb.c: remove grub_video_fb_get_video_ptr which is duplicated in >> fbutil.c >> * fbutil.c: copy the note from fbfill.c > I think the comment should go to video_fb.h to instruct future video > driver writers. > Could you create entries in the same format as Changelog
* video/fb/video_fb.c (grub_video_fb_get_video_ptr): remove function (duplicated in fbutil.c) * video/fb/fbutil.c: copy the note from fbfill.c Attaching additional patch that moves the note about memory architecture in video_fb.h * video_fb.h: move the note about memory architecture from fb*.c here >> >> rename-var.patch >> >> vbe.c: grub_video_vbe_setup rename local variable >> - this should make the distinction between grub_vbe_mode_info_block >> and grub_video_mode_info clearer in this function >> > Perhaps best_mode_info should be renamed too, for consistency. > Other than this I'm ok with both patches. I meant this only as a reminder that the mode_info that is used all the time really refers to a vbe mode (as opposed to framebuffer mode) bu it is certainly possible to rename Attaching an alternate patch that renames all the vbe mode related locals. * video/i386/pc/vbe.c: rename local variables to make clearer distinction between vbe modes and framebuffer modes While making this patch I noticed that - grub_vbe_set_video_mode sets the mode in framebuffer.active_mode and grub_video_vbe_setup in vbe_mode_in_use. Either this is redundant or any call to grub_vbe_set_video_mode without going through grub_video_vbe_setup makes the mode_in_use value obsolete - invalid. - grub_vbe_set_video_mode changes active_mode_info before setting the mode (and before checking it can be used) - grub_vbe_setup calls grub_video_set_video_mode with pointer to active_mode_info as argument which causes call to memcpy with this pointer as both src and dest This is resolved with additional patch: * video/i386/pc/vbe.c: remove vbe_mode_in_use (duplicated in framebuffer.active_vbe_mode) * video/i386/pc/vbe.c (grub_vbe_set_video_mode): save active mode info only after setting the mode Thanks Michal
Index: video/fb/fbblit.c =================================================================== --- video/fb/fbblit.c (revision 2496) +++ video/fb/fbblit.c (working copy) @@ -83,8 +83,8 @@ for (j = 0; j < height; j++) { - srcptr = (grub_uint32_t *)get_data_ptr (src, offset_x, j + offset_y); - dstptr = (grub_uint32_t *)get_data_ptr (dst, x, y + j); + srcptr = (grub_uint32_t *)grub_video_fb_get_video_ptr (src, offset_x, j + offset_y); + dstptr = (grub_uint32_t *)grub_video_fb_get_video_ptr (dst, x, y + j); grub_memmove (dstptr, srcptr, width * bpp); } @@ -110,8 +110,8 @@ srcrowskip = src->mode_info->pitch - src->mode_info->bytes_per_pixel * width; dstrowskip = dst->mode_info->pitch - dst->mode_info->bytes_per_pixel * width; - srcptr = (grub_uint8_t *) get_data_ptr (src, offset_x, offset_y); - dstptr = (grub_uint8_t *) get_data_ptr (dst, x, y); + srcptr = (grub_uint8_t *) grub_video_fb_get_video_ptr (src, offset_x, offset_y); + dstptr = (grub_uint8_t *) grub_video_fb_get_video_ptr (dst, x, y); for (j = 0; j < height; j++) { @@ -153,8 +153,8 @@ srcrowskip = src->mode_info->pitch - src->mode_info->bytes_per_pixel * width; dstrowskip = dst->mode_info->pitch - dst->mode_info->bytes_per_pixel * width; - srcptr = (grub_uint8_t *) get_data_ptr (src, offset_x, offset_y); - dstptr = (grub_uint8_t *) get_data_ptr (dst, x, y); + srcptr = (grub_uint8_t *) grub_video_fb_get_video_ptr (src, offset_x, offset_y); + dstptr = (grub_uint8_t *) grub_video_fb_get_video_ptr (dst, x, y); for (j = 0; j < height; j++) { @@ -197,8 +197,8 @@ srcrowskip = src->mode_info->pitch - src->mode_info->bytes_per_pixel * width; dstrowskip = dst->mode_info->pitch - dst->mode_info->bytes_per_pixel * width; - srcptr = (grub_uint32_t *) get_data_ptr (src, offset_x, offset_y); - dstptr = (grub_uint8_t *) get_data_ptr (dst, x, y); + srcptr = (grub_uint32_t *) grub_video_fb_get_video_ptr (src, offset_x, offset_y); + dstptr = (grub_uint8_t *) grub_video_fb_get_video_ptr (dst, x, y); for (j = 0; j < height; j++) { @@ -245,8 +245,8 @@ srcrowskip = src->mode_info->pitch - src->mode_info->bytes_per_pixel * width; dstrowskip = dst->mode_info->pitch - dst->mode_info->bytes_per_pixel * width; - srcptr = (grub_uint8_t *) get_data_ptr (src, offset_x, offset_y); - dstptr = (grub_uint8_t *) get_data_ptr (dst, x, y); + srcptr = (grub_uint8_t *) grub_video_fb_get_video_ptr (src, offset_x, offset_y); + dstptr = (grub_uint8_t *) grub_video_fb_get_video_ptr (dst, x, y); for (j = 0; j < height; j++) { @@ -285,8 +285,8 @@ for (j = 0; j < height; j++) { - srcptr = (grub_uint8_t *)get_data_ptr (src, offset_x, j + offset_y); - dstptr = (grub_uint32_t *)get_data_ptr (dst, x, y + j); + srcptr = (grub_uint8_t *)grub_video_fb_get_video_ptr (src, offset_x, j + offset_y); + dstptr = (grub_uint32_t *)grub_video_fb_get_video_ptr (dst, x, y + j); for (i = 0; i < width; i++) { @@ -321,8 +321,8 @@ for (j = 0; j < height; j++) { - srcptr = (grub_uint32_t *)get_data_ptr (src, offset_x, j + offset_y); - dstptr = (grub_uint8_t *)get_data_ptr (dst, x, y + j); + srcptr = (grub_uint32_t *)grub_video_fb_get_video_ptr (src, offset_x, j + offset_y); + dstptr = (grub_uint8_t *)grub_video_fb_get_video_ptr (dst, x, y + j); for (i = 0; i < width; i++) { @@ -358,8 +358,8 @@ for (j = 0; j < height; j++) { - srcptr = (grub_uint32_t *)get_data_ptr (src, offset_x, j + offset_y); - dstptr = (grub_uint8_t *)get_data_ptr (dst, x, y + j); + srcptr = (grub_uint32_t *)grub_video_fb_get_video_ptr (src, offset_x, j + offset_y); + dstptr = (grub_uint8_t *)grub_video_fb_get_video_ptr (dst, x, y + j); for (i = 0; i < width; i++) { @@ -394,8 +394,8 @@ for (j = 0; j < height; j++) { - srcptr = (grub_uint8_t *)get_data_ptr (src, offset_x, j + offset_y); - dstptr = (grub_uint8_t *)get_data_ptr (dst, x, y + j); + srcptr = (grub_uint8_t *)grub_video_fb_get_video_ptr (src, offset_x, j + offset_y); + dstptr = (grub_uint8_t *)grub_video_fb_get_video_ptr (dst, x, y + j); for (i = 0; i < width; i++) { @@ -491,8 +491,8 @@ srcrowskip = src->mode_info->pitch - src->mode_info->bytes_per_pixel * width; dstrowskip = dst->mode_info->pitch - dst->mode_info->bytes_per_pixel * width; - srcptr = (grub_uint32_t *) get_data_ptr (src, offset_x, offset_y); - dstptr = (grub_uint32_t *) get_data_ptr (dst, x, y); + srcptr = (grub_uint32_t *) grub_video_fb_get_video_ptr (src, offset_x, offset_y); + dstptr = (grub_uint32_t *) grub_video_fb_get_video_ptr (dst, x, y); for (j = 0; j < height; j++) { @@ -572,8 +572,8 @@ srcrowskip = src->mode_info->pitch - src->mode_info->bytes_per_pixel * width; dstrowskip = dst->mode_info->pitch - dst->mode_info->bytes_per_pixel * width; - srcptr = (grub_uint32_t *) get_data_ptr (src, offset_x, offset_y); - dstptr = (grub_uint8_t *) get_data_ptr (dst, x, y); + srcptr = (grub_uint32_t *) grub_video_fb_get_video_ptr (src, offset_x, offset_y); + dstptr = (grub_uint8_t *) grub_video_fb_get_video_ptr (dst, x, y); for (j = 0; j < height; j++) { @@ -656,8 +656,8 @@ for (j = 0; j < height; j++) { - srcptr = (grub_uint32_t *)get_data_ptr (src, offset_x, j + offset_y); - dstptr = (grub_uint32_t *)get_data_ptr (dst, x, y + j); + srcptr = (grub_uint32_t *)grub_video_fb_get_video_ptr (src, offset_x, j + offset_y); + dstptr = (grub_uint32_t *)grub_video_fb_get_video_ptr (dst, x, y + j); for (i = 0; i < width; i++) { @@ -721,8 +721,8 @@ for (j = 0; j < height; j++) { - srcptr = (grub_uint32_t *)get_data_ptr (src, offset_x, j + offset_y); - dstptr = (grub_uint8_t *)get_data_ptr (dst, x, y + j); + srcptr = (grub_uint32_t *)grub_video_fb_get_video_ptr (src, offset_x, j + offset_y); + dstptr = (grub_uint8_t *)grub_video_fb_get_video_ptr (dst, x, y + j); for (i = 0; i < width; i++) { @@ -788,8 +788,8 @@ for (j = 0; j < height; j++) { - srcptr = (grub_uint32_t *)get_data_ptr (src, offset_x, j + offset_y); - dstptr = (grub_uint8_t *)get_data_ptr (dst, x, y + j); + srcptr = (grub_uint32_t *)grub_video_fb_get_video_ptr (src, offset_x, j + offset_y); + dstptr = (grub_uint8_t *)grub_video_fb_get_video_ptr (dst, x, y + j); for (i = 0; i < width; i++) { Index: video/fb/fbutil.c =================================================================== --- video/fb/fbutil.c (revision 2496) +++ video/fb/fbutil.c (working copy) @@ -16,12 +16,23 @@ * along with GRUB. If not, see <http://www.gnu.org/licenses/>. */ +/* SPECIAL NOTES! + + Please note following when reading the code below: + + - In this driver we assume that every memory can be accessed by same memory + bus. If there are different address spaces do not use this code as a base + code for other archs. + + - Every function in this code assumes that bounds checking has been done in + previous phase and they are opted out in here. */ + #include <grub/fbutil.h> #include <grub/types.h> #include <grub/video.h> grub_uint8_t * -get_data_ptr (struct grub_video_fbblit_info *source, +grub_video_fb_get_video_ptr (struct grub_video_fbblit_info *source, unsigned int x, unsigned int y) { grub_uint8_t *ptr = 0; @@ -72,24 +83,24 @@ switch (source->mode_info->bpp) { case 32: - color = *(grub_uint32_t *)get_data_ptr (source, x, y); + color = *(grub_uint32_t *)grub_video_fb_get_video_ptr (source, x, y); break; case 24: { grub_uint8_t *ptr; - ptr = get_data_ptr (source, x, y); + ptr = grub_video_fb_get_video_ptr (source, x, y); color = ptr[0] | (ptr[1] << 8) | (ptr[2] << 16); } break; case 16: case 15: - color = *(grub_uint16_t *)get_data_ptr (source, x, y); + color = *(grub_uint16_t *)grub_video_fb_get_video_ptr (source, x, y); break; case 8: - color = *(grub_uint8_t *)get_data_ptr (source, x, y); + color = *(grub_uint8_t *)grub_video_fb_get_video_ptr (source, x, y); break; case 1: @@ -120,7 +131,7 @@ { grub_uint32_t *ptr; - ptr = (grub_uint32_t *)get_data_ptr (source, x, y); + ptr = (grub_uint32_t *)grub_video_fb_get_video_ptr (source, x, y); *ptr = color; } @@ -131,7 +142,7 @@ grub_uint8_t *ptr; grub_uint8_t *colorptr = (grub_uint8_t *)&color; - ptr = get_data_ptr (source, x, y); + ptr = grub_video_fb_get_video_ptr (source, x, y); ptr[0] = colorptr[0]; ptr[1] = colorptr[1]; @@ -144,7 +155,7 @@ { grub_uint16_t *ptr; - ptr = (grub_uint16_t *)get_data_ptr (source, x, y); + ptr = (grub_uint16_t *)grub_video_fb_get_video_ptr (source, x, y); *ptr = (grub_uint16_t) (color & 0xFFFF); } @@ -154,7 +165,7 @@ { grub_uint8_t *ptr; - ptr = (grub_uint8_t *)get_data_ptr (source, x, y); + ptr = (grub_uint8_t *)grub_video_fb_get_video_ptr (source, x, y); *ptr = (grub_uint8_t) (color & 0xFF); } Index: video/fb/video_fb.c =================================================================== --- video/fb/video_fb.c (revision 2496) +++ video/fb/video_fb.c (working copy) @@ -83,44 +83,6 @@ return GRUB_ERR_NONE; } - -grub_uint8_t * -grub_video_fb_get_video_ptr (struct grub_video_fbblit_info *source, - grub_uint32_t x, grub_uint32_t y) -{ - grub_uint8_t *ptr = 0; - - switch (source->mode_info->bpp) - { - case 32: - ptr = (grub_uint8_t *)source->data - + y * source->mode_info->pitch - + x * 4; - break; - - case 24: - ptr = (grub_uint8_t *)source->data - + y * source->mode_info->pitch - + x * 3; - break; - - case 16: - case 15: - ptr = (grub_uint8_t *)source->data - + y * source->mode_info->pitch - + x * 2; - break; - - case 8: - ptr = (grub_uint8_t *)source->data - + y * source->mode_info->pitch - + x; - break; - } - - return ptr; -} - grub_err_t grub_video_fb_get_palette (unsigned int start, unsigned int count, struct grub_video_palette_data *palette_data) Index: include/grub/fbutil.h =================================================================== --- include/grub/fbutil.h (revision 2496) +++ include/grub/fbutil.h (working copy) @@ -31,7 +31,7 @@ void *data; }; -grub_uint8_t *get_data_ptr (struct grub_video_fbblit_info *source, +grub_uint8_t *grub_video_fb_get_video_ptr (struct grub_video_fbblit_info *source, unsigned int x, unsigned int y); grub_video_color_t get_pixel (struct grub_video_fbblit_info *source, Index: include/grub/video_fb.h =================================================================== --- include/grub/video_fb.h (revision 2496) +++ include/grub/video_fb.h (working copy) @@ -33,9 +33,6 @@ #define GRUB_VIDEO_FBSTD_NUMCOLORS 16 extern struct grub_video_palette_data grub_video_fbstd_colors[GRUB_VIDEO_FBSTD_NUMCOLORS]; -grub_uint8_t * grub_video_fb_get_video_ptr (struct grub_video_fbblit_info *source, - grub_uint32_t x, grub_uint32_t y); - grub_err_t grub_video_fb_init (void);
diff --git include/gruvideo_fb.h include/gruvideo_fb.h index 17debd6..850946d 100644 --- include/gruvideo_fb.h +++ include/gruvideo_fb.h @@ -16,6 +16,12 @@ * along with GRUB. If not, see <http://www.gnu.org/licenses/>. */ +/* SPECIAL NOTE! + + - In this driver we assume that every memory can be accessed by same memory + bus. If there are different address spaces do not use this code as a base + code for other archs. */ + #ifndef GRUB_VIDEO_FB_HEADER #define GRUB_VIDEO_FB_HEADER 1 diff --git video/ffbblit.c video/ffbblit.c index 5b613bc..705da83 100644 --- video/ffbblit.c +++ video/ffbblit.c @@ -16,13 +16,7 @@ * along with GRUB. If not, see <http://www.gnu.org/licenses/>. */ -/* SPECIAL NOTES! - - Please note following when reading the code below: - - - In this driver we assume that every memory can be accessed by same memory - bus. If there are different address spaces do not use this code as a base - code for other archs. +/* SPECIAL NOTE! - Every function in this code assumes that bounds checking has been done in previous phase and they are opted out in here. */ diff --git video/ffbfill.c video/ffbfill.c index a4ca7c2..dba8ceb 100644 --- video/ffbfill.c +++ video/ffbfill.c @@ -16,13 +16,7 @@ * along with GRUB. If not, see <http://www.gnu.org/licenses/>. */ -/* SPECIAL NOTES! - - Please note following when reading the code below: - - - In this driver we assume that every memory can be accessed by same memory - bus. If there are different address spaces do not use this code as a base - code for other archs. +/* SPECIAL NOTE! - Every function in this code assumes that bounds checking has been done in previous phase and they are opted out in here. */ diff --git video/ffbutil.c video/ffbutil.c index 1fa48ec..db28e97 100644 --- video/ffbutil.c +++ video/ffbutil.c @@ -16,13 +16,7 @@ * along with GRUB. If not, see <http://www.gnu.org/licenses/>. */ -/* SPECIAL NOTES! - - Please note following when reading the code below: - - - In this driver we assume that every memory can be accessed by same memory - bus. If there are different address spaces do not use this code as a base - code for other archs. +/* SPECIAL NOTE! - Every function in this code assumes that bounds checking has been done in previous phase and they are opted out in here. */
diff --git video/i386/pc/vbe.c video/i386/pc/vbe.c index 0244b90..34885d6 100644 --- video/i386/pc/vbe.c +++ video/i386/pc/vbe.c @@ -31,7 +31,7 @@ static int vbe_detected = -1; static struct grub_vbe_info_block controller_info; -static struct grub_vbe_mode_info_block active_mode_info; +static struct grub_vbe_mode_info_block active_vbe_mode_info; static struct { @@ -40,14 +40,14 @@ static struct unsigned int bytes_per_scan_line; unsigned int bytes_per_pixel; - grub_uint32_t active_mode; + grub_uint32_t active_vbe_mode; grub_uint8_t *ptr; int index_color_mode; } framebuffer; -static grub_uint32_t initial_mode; -static grub_uint32_t mode_in_use = 0x55aa; -static grub_uint16_t *mode_list; +static grub_uint32_t initial_vbe_mode; +static grub_uint32_t vbe_mode_in_use = 0x55aa; +static grub_uint16_t *vbe_mode_list; static void * real2pm (grub_vbe_farptr_t ptr) @@ -110,11 +110,11 @@ grub_vbe_probe (struct grub_vbe_info_block *info_block) } grub_err_t -grub_vbe_set_video_mode (grub_uint32_t mode, - struct grub_vbe_mode_info_block *mode_info) +grub_vbe_set_video_mode (grub_uint32_t vbe_mode, + struct grub_vbe_mode_info_block *vbe_mode_info) { grub_vbe_status_t status; - grub_uint32_t old_mode; + grub_uint32_t old_vbe_mode; grub_err_t err; /* Make sure that VBE is supported. */ @@ -123,18 +123,18 @@ grub_vbe_set_video_mode (grub_uint32_t mode, return grub_errno; /* Try to get mode info. */ - grub_vbe_get_video_mode_info (mode, &active_mode_info); + grub_vbe_get_video_mode_info (vbe_mode, &active_vbe_mode_info); if (grub_errno != GRUB_ERR_NONE) return grub_errno; /* For all VESA BIOS modes, force linear frame buffer. */ - if (mode >= 0x100) + if (vbe_mode >= 0x100) { /* We only want linear frame buffer modes. */ - mode |= 1 << 14; + vbe_mode |= 1 << 14; /* Determine frame buffer pixel format. */ - switch (active_mode_info.memory_model) + switch (active_vbe_mode_info.memory_model) { case GRUB_VBE_MEMORY_MODEL_PACKED_PIXEL: framebuffer.index_color_mode = 1; @@ -147,24 +147,24 @@ grub_vbe_set_video_mode (grub_uint32_t mode, default: return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, "unsupported pixel format 0x%x", - active_mode_info.memory_model); + active_vbe_mode_info.memory_model); } } /* Get current mode. */ - grub_vbe_get_video_mode (&old_mode); + grub_vbe_get_video_mode (&old_vbe_mode); if (grub_errno != GRUB_ERR_NONE) return grub_errno; /* Try to set video mode. */ - status = grub_vbe_bios_set_mode (mode, 0); + status = grub_vbe_bios_set_mode (vbe_mode, 0); if (status != GRUB_VBE_STATUS_OK) - return grub_error (GRUB_ERR_BAD_DEVICE, "cannot set VBE mode %x", mode); + return grub_error (GRUB_ERR_BAD_DEVICE, "cannot set VBE mode %x", vbe_mode); /* Save information for later usage. */ - framebuffer.active_mode = mode; + framebuffer.active_vbe_mode = vbe_mode; - if (mode < 0x100) + if (vbe_mode < 0x100) { /* If this is not a VESA mode, guess address. */ framebuffer.ptr = (grub_uint8_t *) GRUB_MEMORY_MACHINE_VGA_ADDR; @@ -172,16 +172,16 @@ grub_vbe_set_video_mode (grub_uint32_t mode, } else { - framebuffer.ptr = (grub_uint8_t *) active_mode_info.phys_base_addr; + framebuffer.ptr = (grub_uint8_t *) active_vbe_mode_info.phys_base_addr; if (controller_info.version >= 0x300) - framebuffer.bytes_per_scan_line = active_mode_info.lin_bytes_per_scan_line; + framebuffer.bytes_per_scan_line = active_vbe_mode_info.lin_bytes_per_scan_line; else - framebuffer.bytes_per_scan_line = active_mode_info.bytes_per_scan_line; + framebuffer.bytes_per_scan_line = active_vbe_mode_info.bytes_per_scan_line; } /* Check whether mode is text mode or graphics mode. */ - if (active_mode_info.memory_model == GRUB_VBE_MEMORY_MODEL_TEXT) + if (active_vbe_mode_info.memory_model == GRUB_VBE_MEMORY_MODEL_TEXT) { /* Text mode. */ @@ -193,7 +193,7 @@ grub_vbe_set_video_mode (grub_uint32_t mode, /* Graphics mode. */ /* Calculate bytes_per_pixel value. */ - switch(active_mode_info.bits_per_pixel) + switch(active_vbe_mode_info.bits_per_pixel) { case 32: framebuffer.bytes_per_pixel = 4; break; case 24: framebuffer.bytes_per_pixel = 3; break; @@ -201,10 +201,10 @@ grub_vbe_set_video_mode (grub_uint32_t mode, case 15: framebuffer.bytes_per_pixel = 2; break; case 8: framebuffer.bytes_per_pixel = 1; break; default: - grub_vbe_bios_set_mode (old_mode, 0); + grub_vbe_bios_set_mode (old_vbe_mode, 0); return grub_error (GRUB_ERR_BAD_DEVICE, "cannot set VBE mode %x", - mode); + vbe_mode); break; } @@ -237,8 +237,8 @@ grub_vbe_set_video_mode (grub_uint32_t mode, } /* Copy mode info for caller. */ - if (mode_info) - grub_memcpy (mode_info, &active_mode_info, sizeof (*mode_info)); + if (vbe_mode_info) + grub_memcpy (vbe_mode_info, &active_vbe_mode_info, sizeof (*vbe_mode_info)); return GRUB_ERR_NONE; } @@ -314,9 +314,9 @@ grub_vbe_get_video_mode_info (grub_uint32_t mode, static grub_err_t grub_video_vbe_init (void) { - grub_uint16_t *rm_mode_list; + grub_uint16_t *rm_vbe_mode_list; grub_uint16_t *p; - grub_size_t mode_list_size; + grub_size_t vbe_mode_list_size; struct grub_vbe_info_block info_block; /* Check if there is adapter present. @@ -330,23 +330,23 @@ grub_video_vbe_init (void) return grub_errno; /* Copy modelist to local memory. */ - p = rm_mode_list = real2pm (info_block.video_mode_ptr); + p = rm_vbe_mode_list = real2pm (info_block.video_mode_ptr); while(*p++ != 0xFFFF) ; - mode_list_size = (grub_addr_t) p - (grub_addr_t) rm_mode_list; - mode_list = grub_malloc (mode_list_size); - if (! mode_list) + vbe_mode_list_size = (grub_addr_t) p - (grub_addr_t) rm_vbe_mode_list; + vbe_mode_list = grub_malloc (vbe_mode_list_size); + if (! vbe_mode_list) return grub_errno; - grub_memcpy (mode_list, rm_mode_list, mode_list_size); + grub_memcpy (vbe_mode_list, rm_vbe_mode_list, vbe_mode_list_size); /* Adapter could be found, figure out initial video mode. */ - grub_vbe_get_video_mode (&initial_mode); + grub_vbe_get_video_mode (&initial_vbe_mode); if (grub_errno != GRUB_ERR_NONE) { /* Free allocated resources. */ - grub_free (mode_list); - mode_list = NULL; + grub_free (vbe_mode_list); + vbe_mode_list = NULL; return grub_errno; } @@ -363,14 +363,14 @@ grub_video_vbe_fini (void) grub_vbe_status_t status; /* Restore old video mode. */ - status = grub_vbe_bios_set_mode (initial_mode, 0); + status = grub_vbe_bios_set_mode (initial_vbe_mode, 0); if (status != GRUB_VBE_STATUS_OK) /* TODO: Decide, is this something we want to do. */ return grub_errno; /* TODO: Free any resources allocated by driver. */ - grub_free (mode_list); - mode_list = NULL; + grub_free (vbe_mode_list); + vbe_mode_list = NULL; /* TODO: destroy render targets. */ @@ -382,9 +382,9 @@ grub_video_vbe_setup (unsigned int width, unsigned int height, unsigned int mode_type) { grub_uint16_t *p; - struct grub_vbe_mode_info_block mode_info; - struct grub_vbe_mode_info_block best_mode_info; - grub_uint32_t best_mode = 0; + struct grub_vbe_mode_info_block vbe_mode_info; + struct grub_vbe_mode_info_block best_vbe_mode_info; + grub_uint32_t best_vbe_mode = 0; int depth; /* Decode depth from mode_type. If it is zero, then autodetect. */ @@ -392,11 +392,11 @@ grub_video_vbe_setup (unsigned int width, unsigned int height, >> GRUB_VIDEO_MODE_TYPE_DEPTH_POS; /* Walk thru mode list and try to find matching mode. */ - for (p = mode_list; *p != 0xFFFF; p++) + for (p = vbe_mode_list; *p != 0xFFFF; p++) { - grub_uint32_t mode = *p; + grub_uint32_t vbe_mode = *p; - grub_vbe_get_video_mode_info (mode, &mode_info); + grub_vbe_get_video_mode_info (vbe_mode, &vbe_mode_info); if (grub_errno != GRUB_ERR_NONE) { /* Could not retrieve mode info, retreat. */ @@ -404,33 +404,33 @@ grub_video_vbe_setup (unsigned int width, unsigned int height, break; } - if ((mode_info.mode_attributes & 0x001) == 0) + if ((vbe_mode_info.mode_attributes & 0x001) == 0) /* If not available, skip it. */ continue; - if ((mode_info.mode_attributes & 0x002) == 0) + if ((vbe_mode_info.mode_attributes & 0x002) == 0) /* Not enough information. */ continue; - if ((mode_info.mode_attributes & 0x008) == 0) + if ((vbe_mode_info.mode_attributes & 0x008) == 0) /* Monochrome is unusable. */ continue; - if ((mode_info.mode_attributes & 0x080) == 0) + if ((vbe_mode_info.mode_attributes & 0x080) == 0) /* We support only linear frame buffer modes. */ continue; - if ((mode_info.mode_attributes & 0x010) == 0) + if ((vbe_mode_info.mode_attributes & 0x010) == 0) /* We allow only graphical modes. */ continue; - if ((mode_info.memory_model != GRUB_VBE_MEMORY_MODEL_PACKED_PIXEL) - && (mode_info.memory_model != GRUB_VBE_MEMORY_MODEL_DIRECT_COLOR)) + if ((vbe_mode_info.memory_model != GRUB_VBE_MEMORY_MODEL_PACKED_PIXEL) + && (vbe_mode_info.memory_model != GRUB_VBE_MEMORY_MODEL_DIRECT_COLOR)) /* Not compatible memory model. */ continue; - if ((mode_info.x_resolution != width) - || (mode_info.y_resolution != height)) + if ((vbe_mode_info.x_resolution != width) + || (vbe_mode_info.y_resolution != height)) /* Non matching resolution. */ continue; @@ -438,65 +438,65 @@ grub_video_vbe_setup (unsigned int width, unsigned int height, if ((mode_type & GRUB_VIDEO_MODE_TYPE_COLOR_MASK) != 0) { if (((mode_type & GRUB_VIDEO_MODE_TYPE_INDEX_COLOR) != 0) - && (mode_info.memory_model != GRUB_VBE_MEMORY_MODEL_PACKED_PIXEL)) + && (vbe_mode_info.memory_model != GRUB_VBE_MEMORY_MODEL_PACKED_PIXEL)) /* Requested only index color modes. */ continue; if (((mode_type & GRUB_VIDEO_MODE_TYPE_RGB) != 0) - && (mode_info.memory_model != GRUB_VBE_MEMORY_MODEL_DIRECT_COLOR)) + && (vbe_mode_info.memory_model != GRUB_VBE_MEMORY_MODEL_DIRECT_COLOR)) /* Requested only RGB modes. */ continue; } /* If there is a request for specific depth, ignore others. */ - if ((depth != 0) && (mode_info.bits_per_pixel != depth)) + if ((depth != 0) && (vbe_mode_info.bits_per_pixel != depth)) continue; /* Select mode with most number of bits per pixel. */ - if (best_mode != 0) - if (mode_info.bits_per_pixel < best_mode_info.bits_per_pixel) + if (best_vbe_mode != 0) + if (vbe_mode_info.bits_per_pixel < best_vbe_mode_info.bits_per_pixel) continue; /* Save so far best mode information for later use. */ - best_mode = mode; - grub_memcpy (&best_mode_info, &mode_info, sizeof (mode_info)); + best_vbe_mode = vbe_mode; + grub_memcpy (&best_vbe_mode_info, &vbe_mode_info, sizeof (vbe_mode_info)); } /* Try to initialize best mode found. */ - if (best_mode != 0) + if (best_vbe_mode != 0) { grub_err_t err; /* If this fails, then we have mode selection heuristics problem, or adapter failure. */ - grub_vbe_set_video_mode (best_mode, &active_mode_info); + grub_vbe_set_video_mode (best_vbe_mode, &active_vbe_mode_info); if (grub_errno != GRUB_ERR_NONE) return grub_errno; /* Now we are happily in requested video mode. Cache some info in order to fasten later operations. */ - mode_in_use = best_mode; + vbe_mode_in_use = best_vbe_mode; /* Fill mode info details. */ - framebuffer.mode_info.width = active_mode_info.x_resolution; - framebuffer.mode_info.height = active_mode_info.y_resolution; + framebuffer.mode_info.width = active_vbe_mode_info.x_resolution; + framebuffer.mode_info.height = active_vbe_mode_info.y_resolution; if (framebuffer.index_color_mode) framebuffer.mode_info.mode_type = GRUB_VIDEO_MODE_TYPE_INDEX_COLOR; else framebuffer.mode_info.mode_type = GRUB_VIDEO_MODE_TYPE_RGB; - framebuffer.mode_info.bpp = active_mode_info.bits_per_pixel; + framebuffer.mode_info.bpp = active_vbe_mode_info.bits_per_pixel; framebuffer.mode_info.bytes_per_pixel = framebuffer.bytes_per_pixel; framebuffer.mode_info.pitch = framebuffer.bytes_per_scan_line; framebuffer.mode_info.number_of_colors = 256; /* TODO: fix me. */ - framebuffer.mode_info.red_mask_size = active_mode_info.red_mask_size; - framebuffer.mode_info.red_field_pos = active_mode_info.red_field_position; - framebuffer.mode_info.green_mask_size = active_mode_info.green_mask_size; - framebuffer.mode_info.green_field_pos = active_mode_info.green_field_position; - framebuffer.mode_info.blue_mask_size = active_mode_info.blue_mask_size; - framebuffer.mode_info.blue_field_pos = active_mode_info.blue_field_position; - framebuffer.mode_info.reserved_mask_size = active_mode_info.rsvd_mask_size; - framebuffer.mode_info.reserved_field_pos = active_mode_info.rsvd_field_position; + framebuffer.mode_info.red_mask_size = active_vbe_mode_info.red_mask_size; + framebuffer.mode_info.red_field_pos = active_vbe_mode_info.red_field_position; + framebuffer.mode_info.green_mask_size = active_vbe_mode_info.green_mask_size; + framebuffer.mode_info.green_field_pos = active_vbe_mode_info.green_field_position; + framebuffer.mode_info.blue_mask_size = active_vbe_mode_info.blue_mask_size; + framebuffer.mode_info.blue_field_pos = active_vbe_mode_info.blue_field_position; + framebuffer.mode_info.reserved_mask_size = active_vbe_mode_info.rsvd_mask_size; + framebuffer.mode_info.reserved_field_pos = active_vbe_mode_info.rsvd_field_position; framebuffer.mode_info.blit_format = grub_video_get_blit_format (&framebuffer.mode_info); @@ -562,8 +562,8 @@ grub_video_vbe_get_info_and_fini (struct grub_video_mode_info *mode_info, grub_memcpy (mode_info, &(framebuffer.mode_info), sizeof (*mode_info)); *framebuf = (char *) framebuffer.ptr; - grub_free (mode_list); - mode_list = NULL; + grub_free (vbe_mode_list); + vbe_mode_list = NULL; grub_video_fb_fini ();
diff --git video/i386/pc/vbe.c video/i386/pc/vbe.c index 34885d6..1bcbf8e 100644 --- video/i386/pc/vbe.c +++ video/i386/pc/vbe.c @@ -46,7 +46,6 @@ static struct } framebuffer; static grub_uint32_t initial_vbe_mode; -static grub_uint32_t vbe_mode_in_use = 0x55aa; static grub_uint16_t *vbe_mode_list; static void * @@ -115,6 +114,7 @@ grub_vbe_set_video_mode (grub_uint32_t vbe_mode, { grub_vbe_status_t status; grub_uint32_t old_vbe_mode; + struct grub_vbe_mode_info_block new_vbe_mode_info; grub_err_t err; /* Make sure that VBE is supported. */ @@ -123,7 +123,7 @@ grub_vbe_set_video_mode (grub_uint32_t vbe_mode, return grub_errno; /* Try to get mode info. */ - grub_vbe_get_video_mode_info (vbe_mode, &active_vbe_mode_info); + grub_vbe_get_video_mode_info (vbe_mode, &new_vbe_mode_info); if (grub_errno != GRUB_ERR_NONE) return grub_errno; @@ -134,7 +134,7 @@ grub_vbe_set_video_mode (grub_uint32_t vbe_mode, vbe_mode |= 1 << 14; /* Determine frame buffer pixel format. */ - switch (active_vbe_mode_info.memory_model) + switch (new_vbe_mode_info.memory_model) { case GRUB_VBE_MEMORY_MODEL_PACKED_PIXEL: framebuffer.index_color_mode = 1; @@ -147,7 +147,7 @@ grub_vbe_set_video_mode (grub_uint32_t vbe_mode, default: return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, "unsupported pixel format 0x%x", - active_vbe_mode_info.memory_model); + new_vbe_mode_info.memory_model); } } @@ -163,6 +163,7 @@ grub_vbe_set_video_mode (grub_uint32_t vbe_mode, /* Save information for later usage. */ framebuffer.active_vbe_mode = vbe_mode; + grub_memcpy (&active_vbe_mode_info, &new_vbe_mode_info, sizeof (active_vbe_mode_info)); if (vbe_mode < 0x100) { @@ -172,16 +173,16 @@ grub_vbe_set_video_mode (grub_uint32_t vbe_mode, } else { - framebuffer.ptr = (grub_uint8_t *) active_vbe_mode_info.phys_base_addr; + framebuffer.ptr = (grub_uint8_t *) new_vbe_mode_info.phys_base_addr; if (controller_info.version >= 0x300) - framebuffer.bytes_per_scan_line = active_vbe_mode_info.lin_bytes_per_scan_line; + framebuffer.bytes_per_scan_line = new_vbe_mode_info.lin_bytes_per_scan_line; else - framebuffer.bytes_per_scan_line = active_vbe_mode_info.bytes_per_scan_line; + framebuffer.bytes_per_scan_line = new_vbe_mode_info.bytes_per_scan_line; } /* Check whether mode is text mode or graphics mode. */ - if (active_vbe_mode_info.memory_model == GRUB_VBE_MEMORY_MODEL_TEXT) + if (new_vbe_mode_info.memory_model == GRUB_VBE_MEMORY_MODEL_TEXT) { /* Text mode. */ @@ -193,7 +194,7 @@ grub_vbe_set_video_mode (grub_uint32_t vbe_mode, /* Graphics mode. */ /* Calculate bytes_per_pixel value. */ - switch(active_vbe_mode_info.bits_per_pixel) + switch(new_vbe_mode_info.bits_per_pixel) { case 32: framebuffer.bytes_per_pixel = 4; break; case 24: framebuffer.bytes_per_pixel = 3; break; @@ -238,7 +239,7 @@ grub_vbe_set_video_mode (grub_uint32_t vbe_mode, /* Copy mode info for caller. */ if (vbe_mode_info) - grub_memcpy (vbe_mode_info, &active_vbe_mode_info, sizeof (*vbe_mode_info)); + grub_memcpy (vbe_mode_info, &new_vbe_mode_info, sizeof (*vbe_mode_info)); return GRUB_ERR_NONE; } @@ -468,14 +469,11 @@ grub_video_vbe_setup (unsigned int width, unsigned int height, grub_err_t err; /* If this fails, then we have mode selection heuristics problem, or adapter failure. */ - grub_vbe_set_video_mode (best_vbe_mode, &active_vbe_mode_info); + /* grub_vbe_set_video_mode already sets active_vbe_mode_info. */ + grub_vbe_set_video_mode (best_vbe_mode, NULL); if (grub_errno != GRUB_ERR_NONE) return grub_errno; - /* Now we are happily in requested video mode. Cache some info - in order to fasten later operations. */ - vbe_mode_in_use = best_vbe_mode; - /* Fill mode info details. */ framebuffer.mode_info.width = active_vbe_mode_info.x_resolution; framebuffer.mode_info.height = active_vbe_mode_info.y_resolution;
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel