diff options
Diffstat (limited to 'arch/x86/boot/compressed/eboot.c')
-rw-r--r-- | arch/x86/boot/compressed/eboot.c | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c index b3e0227df2c9..c760e073963e 100644 --- a/arch/x86/boot/compressed/eboot.c +++ b/arch/x86/boot/compressed/eboot.c | |||
@@ -276,8 +276,9 @@ static efi_status_t setup_gop(struct screen_info *si, efi_guid_t *proto, | |||
276 | nr_gops = size / sizeof(void *); | 276 | nr_gops = size / sizeof(void *); |
277 | for (i = 0; i < nr_gops; i++) { | 277 | for (i = 0; i < nr_gops; i++) { |
278 | struct efi_graphics_output_mode_info *info; | 278 | struct efi_graphics_output_mode_info *info; |
279 | efi_guid_t pciio_proto = EFI_PCI_IO_PROTOCOL_GUID; | 279 | efi_guid_t conout_proto = EFI_CONSOLE_OUT_DEVICE_GUID; |
280 | void *pciio; | 280 | bool conout_found = false; |
281 | void *dummy; | ||
281 | void *h = gop_handle[i]; | 282 | void *h = gop_handle[i]; |
282 | 283 | ||
283 | status = efi_call_phys3(sys_table->boottime->handle_protocol, | 284 | status = efi_call_phys3(sys_table->boottime->handle_protocol, |
@@ -285,19 +286,21 @@ static efi_status_t setup_gop(struct screen_info *si, efi_guid_t *proto, | |||
285 | if (status != EFI_SUCCESS) | 286 | if (status != EFI_SUCCESS) |
286 | continue; | 287 | continue; |
287 | 288 | ||
288 | efi_call_phys3(sys_table->boottime->handle_protocol, | 289 | status = efi_call_phys3(sys_table->boottime->handle_protocol, |
289 | h, &pciio_proto, &pciio); | 290 | h, &conout_proto, &dummy); |
291 | |||
292 | if (status == EFI_SUCCESS) | ||
293 | conout_found = true; | ||
290 | 294 | ||
291 | status = efi_call_phys4(gop->query_mode, gop, | 295 | status = efi_call_phys4(gop->query_mode, gop, |
292 | gop->mode->mode, &size, &info); | 296 | gop->mode->mode, &size, &info); |
293 | if (status == EFI_SUCCESS && (!first_gop || pciio)) { | 297 | if (status == EFI_SUCCESS && (!first_gop || conout_found)) { |
294 | /* | 298 | /* |
295 | * Apple provide GOPs that are not backed by | 299 | * Systems that use the UEFI Console Splitter may |
296 | * real hardware (they're used to handle | 300 | * provide multiple GOP devices, not all of which are |
297 | * multiple displays). The workaround is to | 301 | * backed by real hardware. The workaround is to search |
298 | * search for a GOP implementing the PCIIO | 302 | * for a GOP implementing the ConOut protocol, and if |
299 | * protocol, and if one isn't found, to just | 303 | * one isn't found, to just fall back to the first GOP. |
300 | * fallback to the first GOP. | ||
301 | */ | 304 | */ |
302 | width = info->horizontal_resolution; | 305 | width = info->horizontal_resolution; |
303 | height = info->vertical_resolution; | 306 | height = info->vertical_resolution; |
@@ -308,10 +311,10 @@ static efi_status_t setup_gop(struct screen_info *si, efi_guid_t *proto, | |||
308 | pixels_per_scan_line = info->pixels_per_scan_line; | 311 | pixels_per_scan_line = info->pixels_per_scan_line; |
309 | 312 | ||
310 | /* | 313 | /* |
311 | * Once we've found a GOP supporting PCIIO, | 314 | * Once we've found a GOP supporting ConOut, |
312 | * don't bother looking any further. | 315 | * don't bother looking any further. |
313 | */ | 316 | */ |
314 | if (pciio) | 317 | if (conout_found) |
315 | break; | 318 | break; |
316 | 319 | ||
317 | first_gop = gop; | 320 | first_gop = gop; |
@@ -328,7 +331,6 @@ static efi_status_t setup_gop(struct screen_info *si, efi_guid_t *proto, | |||
328 | si->lfb_width = width; | 331 | si->lfb_width = width; |
329 | si->lfb_height = height; | 332 | si->lfb_height = height; |
330 | si->lfb_base = fb_base; | 333 | si->lfb_base = fb_base; |
331 | si->lfb_size = fb_size; | ||
332 | si->pages = 1; | 334 | si->pages = 1; |
333 | 335 | ||
334 | if (pixel_format == PIXEL_RGB_RESERVED_8BIT_PER_COLOR) { | 336 | if (pixel_format == PIXEL_RGB_RESERVED_8BIT_PER_COLOR) { |
@@ -376,6 +378,10 @@ static efi_status_t setup_gop(struct screen_info *si, efi_guid_t *proto, | |||
376 | si->rsvd_pos = 0; | 378 | si->rsvd_pos = 0; |
377 | } | 379 | } |
378 | 380 | ||
381 | si->lfb_size = si->lfb_linelength * si->lfb_height; | ||
382 | |||
383 | si->capabilities |= VIDEO_CAPABILITY_SKIP_QUIRKS; | ||
384 | |||
379 | free_handle: | 385 | free_handle: |
380 | efi_call_phys1(sys_table->boottime->free_pool, gop_handle); | 386 | efi_call_phys1(sys_table->boottime->free_pool, gop_handle); |
381 | return status; | 387 | return status; |