vt_vga: check if VGA is available from ACPI FADT table

On x86 the IA-PC Boot Flags in the FADT can signal whether VGA is
available or not.

Sponsored by:		Citrix systems R&D
Reviewed by:		marcel
Differential revision:	https://reviews.freebsd.org/D14397
This commit is contained in:
royger 2018-03-13 09:38:53 +00:00
parent d37531263a
commit 17785aa2d9

View File

@ -30,6 +30,8 @@
* SUCH DAMAGE.
*/
#include "opt_acpi.h"
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
@ -46,6 +48,10 @@ __FBSDID("$FreeBSD$");
#include <machine/bus.h>
#if ((defined(__amd64__) || defined(__i386__)) && defined(DEV_ACPI))
#include <contrib/dev/acpica/include/acpi.h>
#endif
struct vga_softc {
bus_space_tag_t vga_fb_tag;
bus_space_handle_t vga_fb_handle;
@ -1196,11 +1202,39 @@ vga_initialize(struct vt_device *vd, int textmode)
return (0);
}
static bool
vga_acpi_disabled(void)
{
#if ((defined(__amd64__) || defined(__i386__)) && defined(DEV_ACPI))
ACPI_TABLE_FADT *fadt;
vm_paddr_t physaddr;
uint16_t flags;
physaddr = acpi_find_table(ACPI_SIG_FADT);
if (physaddr == 0)
return (false);
fadt = acpi_map_table(physaddr, ACPI_SIG_FADT);
if (fadt == NULL) {
printf("vt_vga: unable to map FADT ACPI table\n");
return (false);
}
flags = fadt->BootFlags;
acpi_unmap_table(fadt);
if (flags & ACPI_FADT_NO_VGA)
return (true);
#endif
return (false);
}
static int
vga_probe(struct vt_device *vd)
{
return (CN_INTERNAL);
return (vga_acpi_disabled() ? CN_DEAD : CN_INTERNAL);
}
static int