[PATCH v2 03/14] x86: provide platform-devices for boot-framebuffers

2013-07-17 Thread David Herrmann
Hi

Any comments on this?

On Thu, Jul 4, 2013 at 2:25 PM, David Herrmann  wrote:
> 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 
> ---
>  arch/x86/Kconfig | 26 +++
>  arch/x86/include/asm/sysfb.h | 41 +
>  arch/x86/kernel/Makefile |  2 +
>  arch/x86/kernel/sysfb.c  | 71 ++
>  arch/x86/kernel/sysfb_simplefb.c | 95 
> 
>  5 files changed, 235 insertions(+)
>  create mode 100644 arch/x86/include/asm/sysfb.h
>  create mode 100644 arch/x86/kernel/sysfb.c
>  create mode 100644 arch/x86/kernel/sysfb_simplefb.c
>
> diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
> index fe120da..54a93a5 100644
> --- a/arch/x86/Kconfig
> +++ b/arch/x86/Kconfig
> @@ -2255,6 +2255,32 @@ config RAPIDIO
>
>  source "drivers/rapidio/Kconfig"
>
> +config X86_SYSFB
> +   bool "Mark VGA/VBE/EFI FB as generic system framebuffer"
> +   help
> + Firmwares often provide initial graphics framebuffers so the BIOS,
> + bootloader or kernel can show basic video-output during boot for
> + user-guidance and debugging. Historically, x86 used the VESA BIOS
> + Extensions and EFI-framebuffers for this, which are mostly limited
> + to x86.
> + This option, if enabled, marks VGA/VBE/EFI framebuffers as generic
> + framebuffers so the new generic system-framebuffer drivers can be
> + used on x86. If the framebuffer is not compatible with the generic
> + modes, it is adverticed as fallback platform framebuffer so legacy
> + drivers like efifb, vesafb and uvesafb can pick it up.
> + If this option is not selected, all system framebuffers are always
> + marked as fallback platform framebuffers as usual.
> +
> + Note: Legacy fbdev drivers, including vesafb, efifb, uvesafb, will
> + not be able to pick up generic system framebuffers if this option
> + is selected. You are highly encouraged to enable simplefb as
> + replacement if you select this option. simplefb can correctly deal
> + with generic system framebuffers. But you should still keep vesafb
> + and others enabled as fallback if a system framebuffer is
> + incompatible with simplefb.
> +
> + If unsure, say Y.
> +
>  endmenu
>
>
> diff --git a/arch/x86/include/asm/sysfb.h b/arch/x86/include/asm/sysfb.h
> new file mode 100644
> index 000..2395fe0
> --- /dev/null
> +++ b/arch/x86/include/asm/sysfb.h
> @@ -0,0 +1,41 @@
> +#ifndef _ARCH_X86_KERNEL_SYSFB_H
> +#define _ARCH_X86_KERNEL_SYSFB_H
> +
> +/*
> + * Generic System Framebuffers on x86
> + * Copyright (c) 2012-2013 David Herrmann 
> + *
> + * 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.
> + */
> +
> 

Re: [PATCH v2 03/14] x86: provide platform-devices for boot-framebuffers

2013-07-17 Thread David Herrmann
Hi

Any comments on this?

On Thu, Jul 4, 2013 at 2:25 PM, David Herrmann dh.herrm...@gmail.com wrote:
 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.herrm...@gmail.com
 ---
  arch/x86/Kconfig | 26 +++
  arch/x86/include/asm/sysfb.h | 41 +
  arch/x86/kernel/Makefile |  2 +
  arch/x86/kernel/sysfb.c  | 71 ++
  arch/x86/kernel/sysfb_simplefb.c | 95 
 
  5 files changed, 235 insertions(+)
  create mode 100644 arch/x86/include/asm/sysfb.h
  create mode 100644 arch/x86/kernel/sysfb.c
  create mode 100644 arch/x86/kernel/sysfb_simplefb.c

 diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
 index fe120da..54a93a5 100644
 --- a/arch/x86/Kconfig
 +++ b/arch/x86/Kconfig
 @@ -2255,6 +2255,32 @@ config RAPIDIO

  source drivers/rapidio/Kconfig

 +config X86_SYSFB
 +   bool Mark VGA/VBE/EFI FB as generic system framebuffer
 +   help
 + Firmwares often provide initial graphics framebuffers so the BIOS,
 + bootloader or kernel can show basic video-output during boot for
 + user-guidance and debugging. Historically, x86 used the VESA BIOS
 + Extensions and EFI-framebuffers for this, which are mostly limited
 + to x86.
 + This option, if enabled, marks VGA/VBE/EFI framebuffers as generic
 + framebuffers so the new generic system-framebuffer drivers can be
 + used on x86. If the framebuffer is not compatible with the generic
 + modes, it is adverticed as fallback platform framebuffer so legacy
 + drivers like efifb, vesafb and uvesafb can pick it up.
 + If this option is not selected, all system framebuffers are always
 + marked as fallback platform framebuffers as usual.
 +
 + Note: Legacy fbdev drivers, including vesafb, efifb, uvesafb, will
 + not be able to pick up generic system framebuffers if this option
 + is selected. You are highly encouraged to enable simplefb as
 + replacement if you select this option. simplefb can correctly deal
 + with generic system framebuffers. But you should still keep vesafb
 + and others enabled as fallback if a system framebuffer is
 + incompatible with simplefb.
 +
 + If unsure, say Y.
 +
  endmenu


 diff --git a/arch/x86/include/asm/sysfb.h b/arch/x86/include/asm/sysfb.h
 new file mode 100644
 index 000..2395fe0
 --- /dev/null
 +++ b/arch/x86/include/asm/sysfb.h
 @@ -0,0 +1,41 @@
 +#ifndef _ARCH_X86_KERNEL_SYSFB_H
 +#define _ARCH_X86_KERNEL_SYSFB_H
 +
 +/*
 + * Generic System Framebuffers on x86
 + * Copyright (c) 2012-2013 David Herrmann dh.herrm...@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.
 + */
 +
 +#include linux/kernel.h
 +#include linux/platform_data/simplefb.h
 

[PATCH v2 03/14] x86: provide platform-devices for boot-framebuffers

2013-07-04 Thread David Herrmann
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 
---
 arch/x86/Kconfig | 26 +++
 arch/x86/include/asm/sysfb.h | 41 +
 arch/x86/kernel/Makefile |  2 +
 arch/x86/kernel/sysfb.c  | 71 ++
 arch/x86/kernel/sysfb_simplefb.c | 95 
 5 files changed, 235 insertions(+)
 create mode 100644 arch/x86/include/asm/sysfb.h
 create mode 100644 arch/x86/kernel/sysfb.c
 create mode 100644 arch/x86/kernel/sysfb_simplefb.c

diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index fe120da..54a93a5 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -2255,6 +2255,32 @@ config RAPIDIO

 source "drivers/rapidio/Kconfig"

+config X86_SYSFB
+   bool "Mark VGA/VBE/EFI FB as generic system framebuffer"
+   help
+ Firmwares often provide initial graphics framebuffers so the BIOS,
+ bootloader or kernel can show basic video-output during boot for
+ user-guidance and debugging. Historically, x86 used the VESA BIOS
+ Extensions and EFI-framebuffers for this, which are mostly limited
+ to x86.
+ This option, if enabled, marks VGA/VBE/EFI framebuffers as generic
+ framebuffers so the new generic system-framebuffer drivers can be
+ used on x86. If the framebuffer is not compatible with the generic
+ modes, it is adverticed as fallback platform framebuffer so legacy
+ drivers like efifb, vesafb and uvesafb can pick it up.
+ If this option is not selected, all system framebuffers are always
+ marked as fallback platform framebuffers as usual.
+
+ Note: Legacy fbdev drivers, including vesafb, efifb, uvesafb, will
+ not be able to pick up generic system framebuffers if this option
+ is selected. You are highly encouraged to enable simplefb as
+ replacement if you select this option. simplefb can correctly deal
+ with generic system framebuffers. But you should still keep vesafb
+ and others enabled as fallback if a system framebuffer is
+ incompatible with simplefb.
+
+ If unsure, say Y.
+
 endmenu


diff --git a/arch/x86/include/asm/sysfb.h b/arch/x86/include/asm/sysfb.h
new file mode 100644
index 000..2395fe0
--- /dev/null
+++ b/arch/x86/include/asm/sysfb.h
@@ -0,0 +1,41 @@
+#ifndef _ARCH_X86_KERNEL_SYSFB_H
+#define _ARCH_X86_KERNEL_SYSFB_H
+
+/*
+ * Generic System Framebuffers on x86
+ * Copyright (c) 2012-2013 David Herrmann 
+ *
+ * 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.
+ */
+
+#include 
+#include 
+#include 
+
+#ifdef CONFIG_X86_SYSFB
+
+bool parse_mode(const struct screen_info *si,
+   struct simplefb_platform_data *mode);
+int create_simplefb(const struct screen_info *si,
+   const struct simplefb_platform_data *mode);
+
+#else /* 

[PATCH v2 03/14] x86: provide platform-devices for boot-framebuffers

2013-07-04 Thread David Herrmann
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.herrm...@gmail.com
---
 arch/x86/Kconfig | 26 +++
 arch/x86/include/asm/sysfb.h | 41 +
 arch/x86/kernel/Makefile |  2 +
 arch/x86/kernel/sysfb.c  | 71 ++
 arch/x86/kernel/sysfb_simplefb.c | 95 
 5 files changed, 235 insertions(+)
 create mode 100644 arch/x86/include/asm/sysfb.h
 create mode 100644 arch/x86/kernel/sysfb.c
 create mode 100644 arch/x86/kernel/sysfb_simplefb.c

diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index fe120da..54a93a5 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -2255,6 +2255,32 @@ config RAPIDIO
 
 source drivers/rapidio/Kconfig
 
+config X86_SYSFB
+   bool Mark VGA/VBE/EFI FB as generic system framebuffer
+   help
+ Firmwares often provide initial graphics framebuffers so the BIOS,
+ bootloader or kernel can show basic video-output during boot for
+ user-guidance and debugging. Historically, x86 used the VESA BIOS
+ Extensions and EFI-framebuffers for this, which are mostly limited
+ to x86.
+ This option, if enabled, marks VGA/VBE/EFI framebuffers as generic
+ framebuffers so the new generic system-framebuffer drivers can be
+ used on x86. If the framebuffer is not compatible with the generic
+ modes, it is adverticed as fallback platform framebuffer so legacy
+ drivers like efifb, vesafb and uvesafb can pick it up.
+ If this option is not selected, all system framebuffers are always
+ marked as fallback platform framebuffers as usual.
+
+ Note: Legacy fbdev drivers, including vesafb, efifb, uvesafb, will
+ not be able to pick up generic system framebuffers if this option
+ is selected. You are highly encouraged to enable simplefb as
+ replacement if you select this option. simplefb can correctly deal
+ with generic system framebuffers. But you should still keep vesafb
+ and others enabled as fallback if a system framebuffer is
+ incompatible with simplefb.
+
+ If unsure, say Y.
+
 endmenu
 
 
diff --git a/arch/x86/include/asm/sysfb.h b/arch/x86/include/asm/sysfb.h
new file mode 100644
index 000..2395fe0
--- /dev/null
+++ b/arch/x86/include/asm/sysfb.h
@@ -0,0 +1,41 @@
+#ifndef _ARCH_X86_KERNEL_SYSFB_H
+#define _ARCH_X86_KERNEL_SYSFB_H
+
+/*
+ * Generic System Framebuffers on x86
+ * Copyright (c) 2012-2013 David Herrmann dh.herrm...@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.
+ */
+
+#include linux/kernel.h
+#include linux/platform_data/simplefb.h
+#include linux/screen_info.h
+
+#ifdef CONFIG_X86_SYSFB
+
+bool parse_mode(const struct screen_info *si,
+   struct simplefb_platform_data *mode);
+int create_simplefb(const struct