| 
									
										
											  
											
												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>
											
										 
											2013-08-02 14:05:22 +02:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Generic System Framebuffers on x86 | 
					
						
							|  |  |  |  * Copyright (c) 2012-2013 David Herrmann <dh.herrmann@gmail.com> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is free software; you can redistribute it and/or modify it | 
					
						
							|  |  |  |  * under the terms of the GNU General Public License as published by the Free | 
					
						
							|  |  |  |  * Software Foundation; either version 2 of the License, or (at your option) | 
					
						
							|  |  |  |  * any later version. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Simple-Framebuffer support for x86 systems | 
					
						
							|  |  |  |  * Create a platform-device for any available boot framebuffer. The | 
					
						
							|  |  |  |  * simple-framebuffer platform device is already available on DT systems, so | 
					
						
							|  |  |  |  * this module parses the global "screen_info" object and creates a suitable | 
					
						
							|  |  |  |  * platform device compatible with the "simple-framebuffer" DT object. If | 
					
						
							|  |  |  |  * the framebuffer is incompatible, we instead create a legacy | 
					
						
							|  |  |  |  * "vesa-framebuffer", "efi-framebuffer" or "platform-framebuffer" device and | 
					
						
							|  |  |  |  * pass the screen_info as platform_data. This allows legacy drivers | 
					
						
							|  |  |  |  * to pick these devices up without messing with simple-framebuffer drivers. | 
					
						
							|  |  |  |  * The global "screen_info" is still valid at all times. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * If CONFIG_X86_SYSFB is not selected, we never register "simple-framebuffer" | 
					
						
							|  |  |  |  * platform devices, but only use legacy framebuffer devices for | 
					
						
							|  |  |  |  * backwards compatibility. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * TODO: We set the dev_id field of all platform-devices to 0. This allows | 
					
						
							|  |  |  |  * other x86 OF/DT parsers to create such devices, too. However, they must | 
					
						
							|  |  |  |  * start at offset 1 for this to work. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <linux/err.h>
 | 
					
						
							|  |  |  | #include <linux/init.h>
 | 
					
						
							|  |  |  | #include <linux/kernel.h>
 | 
					
						
							|  |  |  | #include <linux/mm.h>
 | 
					
						
							|  |  |  | #include <linux/platform_data/simplefb.h>
 | 
					
						
							|  |  |  | #include <linux/platform_device.h>
 | 
					
						
							|  |  |  | #include <linux/screen_info.h>
 | 
					
						
							|  |  |  | #include <asm/sysfb.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static __init int sysfb_init(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	struct screen_info *si = &screen_info; | 
					
						
							|  |  |  | 	struct simplefb_platform_data mode; | 
					
						
							|  |  |  | 	struct platform_device *pd; | 
					
						
							|  |  |  | 	const char *name; | 
					
						
							|  |  |  | 	bool compatible; | 
					
						
							|  |  |  | 	int ret; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-02 14:05:23 +02:00
										 |  |  | 	sysfb_apply_efi_quirks(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												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>
											
										 
											2013-08-02 14:05:22 +02:00
										 |  |  | 	/* try to create a simple-framebuffer device */ | 
					
						
							|  |  |  | 	compatible = parse_mode(si, &mode); | 
					
						
							|  |  |  | 	if (compatible) { | 
					
						
							|  |  |  | 		ret = create_simplefb(si, &mode); | 
					
						
							|  |  |  | 		if (!ret) | 
					
						
							|  |  |  | 			return 0; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* if the FB is incompatible, create a legacy framebuffer device */ | 
					
						
							|  |  |  | 	if (si->orig_video_isVGA == VIDEO_TYPE_EFI) | 
					
						
							|  |  |  | 		name = "efi-framebuffer"; | 
					
						
							|  |  |  | 	else if (si->orig_video_isVGA == VIDEO_TYPE_VLFB) | 
					
						
							|  |  |  | 		name = "vesa-framebuffer"; | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		name = "platform-framebuffer"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	pd = platform_device_register_resndata(NULL, name, 0, | 
					
						
							|  |  |  | 					       NULL, 0, si, sizeof(*si)); | 
					
						
							|  |  |  | 	return IS_ERR(pd) ? PTR_ERR(pd) : 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-02 14:05:23 +02:00
										 |  |  | /* must execute after PCI subsystem for EFI quirks */ | 
					
						
							| 
									
										
											  
											
												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>
											
										 
											2013-08-02 14:05:22 +02:00
										 |  |  | device_initcall(sysfb_init); |