[U-Boot] [PATCH v4 0/3] Allwinner DE2 HDMI SimpleFB support

This patchset is for Allwinner DE2 HDMI SimpleFB support.
The framebuffer initialized by the Allwinner DE2 driver can be passed by to the kernel as simplefb, and this can enable the kernel to display graphics without having full DE2 driver.
Add the suppot of simplefb in DE2 code.
The code to find a simplefb with sunxi extension and a suitable pipeline is extracted to a new source file in video/sunxi/.
An option is added for device tree simplefb, and furtherly other simplefb support code should also be converted to it.
Icenowy Zheng (3): video: sunxi: extract simplefb match code to a new file video: add an option for video simplefb via DT sunxi: setup simplefb for Allwinner DE2
arch/arm/mach-sunxi/Kconfig | 1 + drivers/video/Kconfig | 8 ++++ drivers/video/sunxi/Makefile | 4 +- drivers/video/sunxi/simplefb_common.c | 30 +++++++++++++++ drivers/video/sunxi/simplefb_common.h | 22 +++++++++++ drivers/video/sunxi/sunxi_de2.c | 72 +++++++++++++++++++++++++++++++++++ drivers/video/sunxi/sunxi_display.c | 13 +------ 7 files changed, 137 insertions(+), 13 deletions(-) create mode 100644 drivers/video/sunxi/simplefb_common.c create mode 100644 drivers/video/sunxi/simplefb_common.h

As the DE2 simplefb setup code can also benefit from the simplefb match code, extract it to a new source file.
Signed-off-by: Icenowy Zheng icenowy@aosc.io Reviewed-by: Andre Przywara andre.przywara@arm.com Acked-by: Maxime Ripard maxime.ripard@free-electrons.com --- Changes in v4: - Add missing copyright for Luc. Changes in v3: - Use /** to start kerndoc.
drivers/video/sunxi/Makefile | 2 +- drivers/video/sunxi/simplefb_common.c | 30 ++++++++++++++++++++++++++++++ drivers/video/sunxi/simplefb_common.h | 22 ++++++++++++++++++++++ drivers/video/sunxi/sunxi_display.c | 13 ++----------- 4 files changed, 55 insertions(+), 12 deletions(-) create mode 100644 drivers/video/sunxi/simplefb_common.c create mode 100644 drivers/video/sunxi/simplefb_common.h
diff --git a/drivers/video/sunxi/Makefile b/drivers/video/sunxi/Makefile index 0d64c2021f..10862edaca 100644 --- a/drivers/video/sunxi/Makefile +++ b/drivers/video/sunxi/Makefile @@ -5,5 +5,5 @@ # SPDX-License-Identifier: GPL-2.0+ #
-obj-$(CONFIG_VIDEO_SUNXI) += sunxi_display.o lcdc.o tve_common.o ../videomodes.o +obj-$(CONFIG_VIDEO_SUNXI) += sunxi_display.o simplefb_common.o lcdc.o tve_common.o ../videomodes.o obj-$(CONFIG_VIDEO_DE2) += sunxi_de2.o sunxi_dw_hdmi.o lcdc.o ../dw_hdmi.o diff --git a/drivers/video/sunxi/simplefb_common.c b/drivers/video/sunxi/simplefb_common.c new file mode 100644 index 0000000000..7befb736da --- /dev/null +++ b/drivers/video/sunxi/simplefb_common.c @@ -0,0 +1,30 @@ +/* + * Common code for Allwinner SimpleFB with pipeline. + * + * (C) Copyright 2013-2014 Luc Verhaegen libv@skynet.be + * (C) Copyright 2014-2015 Hans de Goede hdegoede@redhat.com + * (C) Copyright 2017 Icenowy Zheng icenowy@aosc.io + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include <fdtdec.h> + +int sunxi_simplefb_fdt_match(void *blob, const char *pipeline) +{ + int offset, ret; + + /* Find a prefilled simpefb node, matching out pipeline config */ + offset = fdt_node_offset_by_compatible(blob, -1, + "allwinner,simple-framebuffer"); + while (offset >= 0) { + ret = fdt_stringlist_search(blob, offset, "allwinner,pipeline", + pipeline); + if (ret == 0) + break; + offset = fdt_node_offset_by_compatible(blob, offset, + "allwinner,simple-framebuffer"); + } + + return offset; +} diff --git a/drivers/video/sunxi/simplefb_common.h b/drivers/video/sunxi/simplefb_common.h new file mode 100644 index 0000000000..1a2bfabf00 --- /dev/null +++ b/drivers/video/sunxi/simplefb_common.h @@ -0,0 +1,22 @@ +/* + * (C) Copyright 2017 Icenowy Zheng icenowy@aosc.io + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#ifndef __SIMPLEFB_COMMON_H +#define __SIMPLEFB_COMMON_H + +/** + * sunxi_simplefb_fdt_match() - match a sunxi simplefb node + * + * Match a sunxi simplefb device node with a specified pipeline, and + * return its offset. + * + * @blob: device tree blob + * @pipeline: display pipeline + * @return device node offset in blob, or negative values if failed + */ +int sunxi_simplefb_fdt_match(void *blob, const char *pipeline); + +#endif diff --git a/drivers/video/sunxi/sunxi_display.c b/drivers/video/sunxi/sunxi_display.c index de768ba94a..7f25ed5f26 100644 --- a/drivers/video/sunxi/sunxi_display.c +++ b/drivers/video/sunxi/sunxi_display.c @@ -29,6 +29,7 @@ #include "../anx9804.h" #include "../hitachi_tx18d42vm_lcd.h" #include "../ssd2828.h" +#include "simplefb_common.h"
#ifdef CONFIG_VIDEO_LCD_BL_PWM_ACTIVE_LOW #define PWM_ON 0 @@ -1377,17 +1378,7 @@ int sunxi_simplefb_setup(void *blob) break; }
- /* Find a prefilled simpefb node, matching out pipeline config */ - offset = fdt_node_offset_by_compatible(blob, -1, - "allwinner,simple-framebuffer"); - while (offset >= 0) { - ret = fdt_stringlist_search(blob, offset, "allwinner,pipeline", - pipeline); - if (ret == 0) - break; - offset = fdt_node_offset_by_compatible(blob, offset, - "allwinner,simple-framebuffer"); - } + offset = sunxi_simplefb_fdt_match(blob, pipeline); if (offset < 0) { eprintf("Cannot setup simplefb: node not found\n"); return 0; /* Keep older kernels working */

Add an option to indicate that the video driver should setup a SimpleFB node that passes the video framebuffer initialized by U-Boot to the operating system kernel.
Currently only the Allwinner DE2 driver uses this option.
Signed-off-by: Icenowy Zheng icenowy@aosc.io --- Changes in v4: - Remove the dependency of VIDEO_DT_SIMPLEFB.
drivers/video/Kconfig | 8 ++++++++ 1 file changed, 8 insertions(+)
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig index 082cc4a528..547d4cc0c7 100644 --- a/drivers/video/Kconfig +++ b/drivers/video/Kconfig @@ -601,4 +601,12 @@ config VIDEO_DW_HDMI rather requires a SoC-specific glue driver to call it), it can not be enabled from the configuration menu.
+config VIDEO_DT_SIMPLEFB + bool "Enable SimpleFB support for passing framebuffer to OS" + help + Enables the code to pass the framebuffer to the kernel as a + simple framebuffer in the device tree. + The video output is initialized by U-Boot, and kept by the + kernel. + endmenu

Hi,
On Fri, Sep 15, 2017 at 09:59:20AM +0800, Icenowy Zheng wrote:
Add an option to indicate that the video driver should setup a SimpleFB node that passes the video framebuffer initialized by U-Boot to the operating system kernel.
Currently only the Allwinner DE2 driver uses this option.
Signed-off-by: Icenowy Zheng icenowy@aosc.io
Changes in v4:
- Remove the dependency of VIDEO_DT_SIMPLEFB.
drivers/video/Kconfig | 8 ++++++++ 1 file changed, 8 insertions(+)
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig index 082cc4a528..547d4cc0c7 100644 --- a/drivers/video/Kconfig +++ b/drivers/video/Kconfig @@ -601,4 +601,12 @@ config VIDEO_DW_HDMI rather requires a SoC-specific glue driver to call it), it can not be enabled from the configuration menu.
+config VIDEO_DT_SIMPLEFB
- bool "Enable SimpleFB support for passing framebuffer to OS"
- help
Enables the code to pass the framebuffer to the kernel as a
simple framebuffer in the device tree.
The video output is initialized by U-Boot, and kept by the
kernel.
You should also remove it from the current users. It will generate a warning otherwise.
Maxime

于 2017年9月18日 GMT+08:00 下午3:29:06, Maxime Ripard maxime.ripard@free-electrons.com 写到:
Hi,
On Fri, Sep 15, 2017 at 09:59:20AM +0800, Icenowy Zheng wrote:
Add an option to indicate that the video driver should setup a
SimpleFB
node that passes the video framebuffer initialized by U-Boot to the operating system kernel.
Currently only the Allwinner DE2 driver uses this option.
Signed-off-by: Icenowy Zheng icenowy@aosc.io
Changes in v4:
- Remove the dependency of VIDEO_DT_SIMPLEFB.
drivers/video/Kconfig | 8 ++++++++ 1 file changed, 8 insertions(+)
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig index 082cc4a528..547d4cc0c7 100644 --- a/drivers/video/Kconfig +++ b/drivers/video/Kconfig @@ -601,4 +601,12 @@ config VIDEO_DW_HDMI rather requires a SoC-specific glue driver to call it), it can not be enabled from the configuration menu.
+config VIDEO_DT_SIMPLEFB
- bool "Enable SimpleFB support for passing framebuffer to OS"
- help
Enables the code to pass the framebuffer to the kernel as a
simple framebuffer in the device tree.
The video output is initialized by U-Boot, and kept by the
kernel.
You should also remove it from the current users. It will generate a warning otherwise.
I think the only current user is DE1.
Should I also convert DE1 to use this option in this patch?
Maxime

On Mon, Sep 18, 2017 at 03:31:54PM +0800, Icenowy Zheng wrote:
于 2017年9月18日 GMT+08:00 下午3:29:06, Maxime Ripard maxime.ripard@free-electrons.com 写到:
Hi,
On Fri, Sep 15, 2017 at 09:59:20AM +0800, Icenowy Zheng wrote:
Add an option to indicate that the video driver should setup a
SimpleFB
node that passes the video framebuffer initialized by U-Boot to the operating system kernel.
Currently only the Allwinner DE2 driver uses this option.
Signed-off-by: Icenowy Zheng icenowy@aosc.io
Changes in v4:
- Remove the dependency of VIDEO_DT_SIMPLEFB.
drivers/video/Kconfig | 8 ++++++++ 1 file changed, 8 insertions(+)
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig index 082cc4a528..547d4cc0c7 100644 --- a/drivers/video/Kconfig +++ b/drivers/video/Kconfig @@ -601,4 +601,12 @@ config VIDEO_DW_HDMI rather requires a SoC-specific glue driver to call it), it can not be enabled from the configuration menu.
+config VIDEO_DT_SIMPLEFB
- bool "Enable SimpleFB support for passing framebuffer to OS"
- help
Enables the code to pass the framebuffer to the kernel as a
simple framebuffer in the device tree.
The video output is initialized by U-Boot, and kept by the
kernel.
You should also remove it from the current users. It will generate a warning otherwise.
I think the only current user is DE1.
I was talking about configs/sunxi-common.h
Should I also convert DE1 to use this option in this patch?
That, or just make it a default to ARCH_SUNXI in that patch.
Maxime

As the support of EFI boot on Allwinner H3 is broken, we still need to use simplefb to pass the framebuffer to Linux.
Add code to setup simplefb for Allwinner DE2 driver.
Signed-off-by: Icenowy Zheng icenowy@aosc.io Acked-by: Maxime Ripard maxime.ripard@free-electrons.com --- Changes in v4: - Imply CONFIG_VIDEO_DT_SIMPLEFB.
Changes in v3: - Extract CONFIG_VIDEO_DT_SIMPLEFB to a Kconfig option.
Changes in v2: - Extract the simplefb node searching code.
arch/arm/mach-sunxi/Kconfig | 1 + drivers/video/sunxi/Makefile | 2 +- drivers/video/sunxi/sunxi_de2.c | 72 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+), 1 deletion(-)
diff --git a/arch/arm/mach-sunxi/Kconfig b/arch/arm/mach-sunxi/Kconfig index 2309f59999..6474b12b54 100644 --- a/arch/arm/mach-sunxi/Kconfig +++ b/arch/arm/mach-sunxi/Kconfig @@ -768,6 +768,7 @@ config VIDEO_DE2 depends on SUNXI_DE2 select DM_VIDEO select DISPLAY + imply VIDEO_DT_SIMPLEFB default y ---help--- Say y here if you want to build DE2 video driver which is present on diff --git a/drivers/video/sunxi/Makefile b/drivers/video/sunxi/Makefile index 10862edaca..aec32b79b9 100644 --- a/drivers/video/sunxi/Makefile +++ b/drivers/video/sunxi/Makefile @@ -6,4 +6,4 @@ #
obj-$(CONFIG_VIDEO_SUNXI) += sunxi_display.o simplefb_common.o lcdc.o tve_common.o ../videomodes.o -obj-$(CONFIG_VIDEO_DE2) += sunxi_de2.o sunxi_dw_hdmi.o lcdc.o ../dw_hdmi.o +obj-$(CONFIG_VIDEO_DE2) += sunxi_de2.o sunxi_dw_hdmi.o simplefb_common.o lcdc.o ../dw_hdmi.o diff --git a/drivers/video/sunxi/sunxi_de2.c b/drivers/video/sunxi/sunxi_de2.c index ee67764ac5..67b937098c 100644 --- a/drivers/video/sunxi/sunxi_de2.c +++ b/drivers/video/sunxi/sunxi_de2.c @@ -10,6 +10,8 @@ #include <display.h> #include <dm.h> #include <edid.h> +#include <fdtdec.h> +#include <fdt_support.h> #include <video.h> #include <asm/global_data.h> #include <asm/io.h> @@ -17,6 +19,7 @@ #include <asm/arch/display2.h> #include <dm/device-internal.h> #include <dm/uclass-internal.h> +#include "simplefb_common.h"
DECLARE_GLOBAL_DATA_PTR;
@@ -292,3 +295,72 @@ U_BOOT_DRIVER(sunxi_de2) = { U_BOOT_DEVICE(sunxi_de2) = { .name = "sunxi_de2" }; + +/* + * Simplefb support. + */ +#if defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_VIDEO_DT_SIMPLEFB) +int sunxi_simplefb_setup(void *blob) +{ + struct udevice *de2, *hdmi; + struct video_priv *de2_priv; + struct video_uc_platdata *de2_plat; + int mux; + int offset, ret; + u64 start, size; + const char *pipeline = NULL; + + debug("Setting up simplefb\n"); + + if (IS_ENABLED(CONFIG_MACH_SUNXI_H3_H5)) + mux = 0; + else + mux = 1; + + /* Skip simplefb setting if DE2 / HDMI is not present */ + ret = uclass_find_device_by_name(UCLASS_VIDEO, + "sunxi_de2", &de2); + if (ret) { + debug("DE2 not present\n"); + return 0; + } + + ret = uclass_find_device_by_name(UCLASS_DISPLAY, + "sunxi_dw_hdmi", &hdmi); + if (ret) { + debug("HDMI not present\n"); + return 0; + } + + if (mux == 0) + pipeline = "mixer0-lcd0-hdmi"; + else + pipeline = "mixer1-lcd1-hdmi"; + + de2_priv = dev_get_uclass_priv(de2); + de2_plat = dev_get_uclass_platdata(de2); + + offset = sunxi_simplefb_fdt_match(blob, pipeline); + if (offset < 0) { + eprintf("Cannot setup simplefb: node not found\n"); + return 0; /* Keep older kernels working */ + } + + start = gd->bd->bi_dram[0].start; + size = de2_plat->base - start; + ret = fdt_fixup_memory_banks(blob, &start, &size, 1); + if (ret) { + eprintf("Cannot setup simplefb: Error reserving memory\n"); + return ret; + } + + ret = fdt_setup_simplefb_node(blob, offset, de2_plat->base, + de2_priv->xsize, de2_priv->ysize, + VNBYTES(de2_priv->bpix) * de2_priv->xsize, + "x8r8g8b8"); + if (ret) + eprintf("Cannot setup simplefb: Error setting properties\n"); + + return ret; +} +#endif /* CONFIG_OF_BOARD_SETUP && CONFIG_VIDEO_DT_SIMPLEFB */

On Fri, Sep 15, 2017 at 2:59 AM, Icenowy Zheng icenowy@aosc.io wrote:
This patchset is for Allwinner DE2 HDMI SimpleFB support.
The framebuffer initialized by the Allwinner DE2 driver can be passed by to the kernel as simplefb, and this can enable the kernel to display graphics without having full DE2 driver.
Add the suppot of simplefb in DE2 code.
The code to find a simplefb with sunxi extension and a suitable pipeline is extracted to a new source file in video/sunxi/.
An option is added for device tree simplefb, and furtherly other simplefb support code should also be converted to it.
There was a generic simplefb driver recently added [1], is it worth basing it on that?
[1] https://lists.denx.de/pipermail/u-boot/2017-September/306273.html

On Fri, Sep 15, 2017 at 02:25:12PM +0100, Peter Robinson wrote:
On Fri, Sep 15, 2017 at 2:59 AM, Icenowy Zheng icenowy@aosc.io wrote:
This patchset is for Allwinner DE2 HDMI SimpleFB support.
The framebuffer initialized by the Allwinner DE2 driver can be passed by to the kernel as simplefb, and this can enable the kernel to display graphics without having full DE2 driver.
Add the suppot of simplefb in DE2 code.
The code to find a simplefb with sunxi extension and a suitable pipeline is extracted to a new source file in video/sunxi/.
An option is added for device tree simplefb, and furtherly other simplefb support code should also be converted to it.
There was a generic simplefb driver recently added [1], is it worth basing it on that?
[1] https://lists.denx.de/pipermail/u-boot/2017-September/306273.html
This is a simplefb "client", it uses a display that has already been initialized. What Icenowy is working on is a "provider", ie it initializes the display in order for other components to reuse it (Linux).
Maxime

在 2017-09-15 21:35,Maxime Ripard 写道:
On Fri, Sep 15, 2017 at 02:25:12PM +0100, Peter Robinson wrote:
On Fri, Sep 15, 2017 at 2:59 AM, Icenowy Zheng icenowy@aosc.io wrote:
This patchset is for Allwinner DE2 HDMI SimpleFB support.
The framebuffer initialized by the Allwinner DE2 driver can be passed by to the kernel as simplefb, and this can enable the kernel to display graphics without having full DE2 driver.
Add the suppot of simplefb in DE2 code.
The code to find a simplefb with sunxi extension and a suitable pipeline is extracted to a new source file in video/sunxi/.
An option is added for device tree simplefb, and furtherly other simplefb support code should also be converted to it.
There was a generic simplefb driver recently added [1], is it worth basing it on that?
[1] https://lists.denx.de/pipermail/u-boot/2017-September/306273.html
This is a simplefb "client", it uses a display that has already been initialized. What Icenowy is working on is a "provider", ie it initializes the display in order for other components to reuse it (Linux).
As I know, now FreeBSD and NetBSD are also going to use the simplefb.
Maxime
participants (4)
-
Icenowy Zheng
-
icenowy@aosc.io
-
Maxime Ripard
-
Peter Robinson