diff options
author | David Herrmann <dh.herrmann@gmail.com> | 2013-08-02 08:05:22 -0400 |
---|---|---|
committer | H. Peter Anvin <hpa@linux.intel.com> | 2013-08-02 19:17:46 -0400 |
commit | e3263ab389a7bc9398c3d366819d6f39b9cfd677 (patch) | |
tree | aa42182804337d3a491f16a5d581e1102a110858 /arch/x86/include/asm/sysfb.h | |
parent | df0960ab2d95543a7c162b04b2064991666adbad (diff) |
x86: provide platform-devices for boot-framebuffers
The current situation regarding boot-framebuffers (VGA, VESA/VBE, EFI) on
x86 causes troubles when loading multiple fbdev drivers. The global
"struct screen_info" does not provide any state-tracking about which
drivers use the FBs. request_mem_region() theoretically works, but
unfortunately vesafb/efifb ignore it due to quirks for broken boards.
Avoid this by creating a platform framebuffer devices with a pointer
to the "struct screen_info" as platform-data. Drivers can now create
platform-drivers and the driver-core will refuse multiple drivers being
active simultaneously.
We keep the screen_info available for backwards-compatibility. Drivers
can be converted in follow-up patches.
Different devices are created for VGA/VESA/EFI FBs to allow multiple
drivers to be loaded on distro kernels. We create:
- "vesa-framebuffer" for VBE/VESA graphics FBs
- "efi-framebuffer" for EFI FBs
- "platform-framebuffer" for everything else
This allows to load vesafb, efifb and others simultaneously and each
picks up only the supported FB types.
Apart from platform-framebuffer devices, this also introduces a
compatibility option for "simple-framebuffer" drivers which recently got
introduced for OF based systems. If CONFIG_X86_SYSFB is selected, we
try to match the screen_info against a simple-framebuffer supported
format. If we succeed, we create a "simple-framebuffer" device instead
of a platform-framebuffer.
This allows to reuse the simplefb.c driver across architectures and also
to introduce a SimpleDRM driver. There is no need to have vesafb.c,
efifb.c, simplefb.c and more just to have architecture specific quirks
in their setup-routines.
Instead, we now move the architecture specific quirks into x86-setup and
provide a generic simple-framebuffer. For backwards-compatibility (if
strange formats are used), we still allow vesafb/efifb to be loaded
simultaneously and pick up all remaining devices.
Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
Link: http://lkml.kernel.org/r/1375445127-15480-4-git-send-email-dh.herrmann@gmail.com
Tested-by: Stephen Warren <swarren@nvidia.com>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
Diffstat (limited to 'arch/x86/include/asm/sysfb.h')
-rw-r--r-- | arch/x86/include/asm/sysfb.h | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/arch/x86/include/asm/sysfb.h b/arch/x86/include/asm/sysfb.h new file mode 100644 index 000000000000..2395fe03f56b --- /dev/null +++ b/arch/x86/include/asm/sysfb.h | |||
@@ -0,0 +1,41 @@ | |||
1 | #ifndef _ARCH_X86_KERNEL_SYSFB_H | ||
2 | #define _ARCH_X86_KERNEL_SYSFB_H | ||
3 | |||
4 | /* | ||
5 | * Generic System Framebuffers on x86 | ||
6 | * Copyright (c) 2012-2013 David Herrmann <dh.herrmann@gmail.com> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of the GNU General Public License as published by the Free | ||
10 | * Software Foundation; either version 2 of the License, or (at your option) | ||
11 | * any later version. | ||
12 | */ | ||
13 | |||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/platform_data/simplefb.h> | ||
16 | #include <linux/screen_info.h> | ||
17 | |||
18 | #ifdef CONFIG_X86_SYSFB | ||
19 | |||
20 | bool parse_mode(const struct screen_info *si, | ||
21 | struct simplefb_platform_data *mode); | ||
22 | int create_simplefb(const struct screen_info *si, | ||
23 | const struct simplefb_platform_data *mode); | ||
24 | |||
25 | #else /* CONFIG_X86_SYSFB */ | ||
26 | |||
27 | static inline bool parse_mode(const struct screen_info *si, | ||
28 | struct simplefb_platform_data *mode) | ||
29 | { | ||
30 | return false; | ||
31 | } | ||
32 | |||
33 | static inline int create_simplefb(const struct screen_info *si, | ||
34 | const struct simplefb_platform_data *mode) | ||
35 | { | ||
36 | return -EINVAL; | ||
37 | } | ||
38 | |||
39 | #endif /* CONFIG_X86_SYSFB */ | ||
40 | |||
41 | #endif /* _ARCH_X86_KERNEL_SYSFB_H */ | ||