gop: Readd preset mode storage
diff --git a/common/drivers/gop.c b/common/drivers/gop.c
index c970efa1..16fd7065 100644
--- a/common/drivers/gop.c
+++ b/common/drivers/gop.c
@@ -171,8 +171,19 @@ static struct fb_info *get_mode_list(size_t *count, EFI_GRAPHICS_OUTPUT_PROTOCOL
return ret;
}
+#define MAX_PRESET_MODES 128
+no_unwind static int preset_modes[MAX_PRESET_MODES];
+no_unwind static bool preset_modes_initialised = false;
+
void init_gop(struct fb_info **ret, size_t *_fbs_count,
uint64_t target_width, uint64_t target_height, uint16_t target_bpp) {
+ if (preset_modes_initialised == false) {
+ for (size_t i = 0; i < MAX_PRESET_MODES; i++) {
+ preset_modes[i] = -1;
+ }
+ preset_modes_initialised = true;
+ }
+
EFI_STATUS status;
EFI_HANDLE tmp_handles[1];
@@ -216,7 +227,7 @@ void init_gop(struct fb_info **ret, size_t *_fbs_count,
};
size_t fbs_count = 0;
- for (size_t i = 0; i < handles_count; i++) {
+ for (size_t i = 0; i < handles_count && i < MAX_PRESET_MODES; i++) {
struct fb_info *fb = &(*ret)[fbs_count];
uint64_t _target_width = target_width;
@@ -249,7 +260,9 @@ void init_gop(struct fb_info **ret, size_t *_fbs_count,
continue;
}
- int preset_mode = gop->Mode->Mode;
+ if (preset_modes[i] == -1) {
+ preset_modes[i] = gop->Mode->Mode;
+ }
fb->edid = get_edid_info(handles[i]);
@@ -293,7 +306,7 @@ fallback:
if (current_fallback == 1) {
current_fallback++;
- if (try_mode(fb, gop, preset_mode, 0, 0, 0, *ret, fbs_count)) {
+ if (try_mode(fb, gop, preset_modes[i], 0, 0, 0, *ret, fbs_count)) {
goto success;
}
}
