]>
Commit | Line | Data |
---|---|---|
1 | /* | |
2 | * VESA frame buffer driver | |
3 | * | |
4 | * Copyright (C) 2014 Google, Inc | |
5 | * | |
6 | * SPDX-License-Identifier: GPL-2.0+ | |
7 | */ | |
8 | ||
9 | #include <common.h> | |
10 | #include <pci_rom.h> | |
11 | #include <video_fb.h> | |
12 | #include <vbe.h> | |
13 | ||
14 | /* | |
15 | * The Graphic Device | |
16 | */ | |
17 | GraphicDevice ctfb; | |
18 | ||
19 | void *video_hw_init(void) | |
20 | { | |
21 | GraphicDevice *gdev = &ctfb; | |
22 | struct udevice *dev; | |
23 | int bits_per_pixel; | |
24 | int ret; | |
25 | ||
26 | printf("Video: "); | |
27 | if (!ll_boot_init()) { | |
28 | /* | |
29 | * If we are running from EFI or coreboot, this driver can't | |
30 | * work. | |
31 | */ | |
32 | printf("Not available (previous bootloader prevents it)\n"); | |
33 | return NULL; | |
34 | } | |
35 | if (vbe_get_video_info(gdev)) { | |
36 | ret = dm_pci_find_class(PCI_CLASS_DISPLAY_VGA << 8, 0, &dev); | |
37 | if (ret) { | |
38 | printf("no card detected\n"); | |
39 | return NULL; | |
40 | } | |
41 | bootstage_start(BOOTSTAGE_ID_ACCUM_LCD, "vesa display"); | |
42 | ret = dm_pci_run_vga_bios(dev, NULL, PCI_ROM_USE_NATIVE | | |
43 | PCI_ROM_ALLOW_FALLBACK); | |
44 | bootstage_accum(BOOTSTAGE_ID_ACCUM_LCD); | |
45 | if (ret) { | |
46 | printf("failed to run video BIOS: %d\n", ret); | |
47 | return NULL; | |
48 | } | |
49 | } | |
50 | ||
51 | if (vbe_get_video_info(gdev)) { | |
52 | printf("No video mode configured\n"); | |
53 | return NULL; | |
54 | } | |
55 | ||
56 | bits_per_pixel = gdev->gdfBytesPP * 8; | |
57 | sprintf(gdev->modeIdent, "%dx%dx%d", gdev->winSizeX, gdev->winSizeY, | |
58 | bits_per_pixel); | |
59 | printf("%s\n", gdev->modeIdent); | |
60 | debug("Frame buffer at %x\n", gdev->pciBase); | |
61 | ||
62 | return (void *)gdev; | |
63 | } |