[SeaBIOS] [PATCH 5/6] vgabios: generate EDID of preferred resolution
Kevin O'Connor
kevin at koconnor.net
Sun Sep 2 23:28:27 CEST 2012
On Sat, Sep 01, 2012 at 03:09:21PM +0900, Hiroshi Miura wrote:
>
> Add interface to EDID part.
> Now bios initialize code can register preferred mode
> from information of host OS.
I don't really understanding what this patch does. I think it needs
some cleanup or further clarification.
[...]
> +int vesa_set_prefered_mode(u16 x, u16 y) {
> +
> + SET_VGA(prefered_mode.x, x);
> + SET_VGA(prefered_mode.y, y);
> + return 0;
> +}
There's no reason to build a "struct prefered_mode_info" and define an
init function - one can just delcare two global variables - for
example: u16 PreferedXres VAR16, PreferedYres VAR16;
> +int vesa_get_prefered_mode(u16 seg, void *data) {
> + struct prefered_mode_info *info = data;
> + int a, b;
> +
> + a = GET_GLOBAL(prefered_mode.x);
> + b = GET_GLOBAL(prefered_mode.y);
> + SET_FARVAR(seg, info->x, a);
> + SET_FARVAR(seg, info->y, b);
> + return 0;
> +}
Dead code.
> +static void get_prefered_resolution(struct edid_detailed_timing *dtd, u16 *x, u16 *y) {
> + u16 maxx, maxy;
> +
> + maxx = GET_GLOBAL(prefered_mode.x);
> + maxy = GET_GLOBAL(prefered_mode.y);
> + if (maxx == 0 && maxy == 0) {/* unknown, no-preference */
> + dtd = &vbe_edid_dtd_1920x1080;
> + maxx = 1920; maxy = 1080;
> + } else if (maxx >= 1920 && (maxy >= 1080 || maxy == 0)){
> + dtd = &vbe_edid_dtd_1920x1080;
> + maxx = 1920; maxy = 1080;
> + } else if (maxx >= 1600 && (maxy >= 1200 || maxy == 0)){
> + dtd = &vbe_edid_dtd_1600x1200;
> + maxx = 1600; maxy = 1200;
> + } else {
> + dtd = &vbe_edid_dtd_1280x1024;
> + maxx = 1280; maxy = 1024;
> + }
> + *x = maxx; *y = maxy;
> +}
It's preferable to do this type of scanning at init time and store the
results somewhere in memory.
[...]
> SET_FARVAR(seg, info->standard_timing[0], VBE_EDID_STD_640x480_85Hz);
> SET_FARVAR(seg, info->standard_timing[1], VBE_EDID_STD_800x600_85Hz);
> - SET_FARVAR(seg, info->standard_timing[2], VBE_EDID_STD_1024x768_85Hz);
> - SET_FARVAR(seg, info->standard_timing[3], VBE_EDID_STD_1280x720_70Hz);
> - SET_FARVAR(seg, info->standard_timing[4], VBE_EDID_STD_1280x960_60Hz);
> - SET_FARVAR(seg, info->standard_timing[5], VBE_EDID_STD_1440x900_60Hz);
> - SET_FARVAR(seg, info->standard_timing[6], VBE_EDID_STD_1600x1200_60Hz);
> - SET_FARVAR(seg, info->standard_timing[7], VBE_EDID_STD_1680x1050_60Hz);
> - /* detailed timing blocks */
> - memcpy_far(seg, &(info->desc[0].dtd), get_global_seg(), &vbe_edid_dtd_1152x864,
> - sizeof (vbe_edid_dtd_1152x864));
> - memcpy_far(seg, &(info->desc[1].dtd), get_global_seg(), &vbe_edid_dtd_1280x1024,
> - sizeof (vbe_edid_dtd_1280x1024));
> + j=2;
> + if (max_x >= 1152 && max_x < 1024) {
> + SET_FARVAR(seg, info->standard_timing[2], VBE_EDID_STD_1152x864_70Hz);
> + j=3;
> + } else if (max_x >= 1024 && max_x < 1280) {
> + SET_FARVAR(seg, info->standard_timing[2], VBE_EDID_STD_1152x864_70Hz);
> + SET_FARVAR(seg, info->standard_timing[3], VBE_EDID_STD_1024x768_85Hz);
> + j=4;
> + } else if (max_x >= 1280 && max_x < 1600) {
> + SET_FARVAR(seg, info->standard_timing[2], VBE_EDID_STD_1024x768_85Hz);
> + SET_FARVAR(seg, info->standard_timing[3], VBE_EDID_STD_1280x1024_60Hz);
> + j=4;
> + } else if (max_x >= 1600 && max_x < 1920) {
> + SET_FARVAR(seg, info->standard_timing[3], VBE_EDID_STD_1440x900_60Hz);
> + SET_FARVAR(seg, info->standard_timing[4], VBE_EDID_STD_1600x900_60Hz);
> + j=5;
Looks odd - nothing sets info->standard_timing[2].
-Kevin
More information about the SeaBIOS
mailing list