[U-Boot] [PATCH v2 0/2] 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/.
Icenowy Zheng (2): video: sunxi: extract simplefb match code to a new file sunxi: setup simplefb for Allwinner DE2
drivers/video/sunxi/Makefile | 4 +- drivers/video/sunxi/simplefb_common.c | 29 ++++++++++++++ drivers/video/sunxi/simplefb_common.h | 22 +++++++++++ drivers/video/sunxi/sunxi_de2.c | 72 +++++++++++++++++++++++++++++++++++ drivers/video/sunxi/sunxi_display.c | 13 +------ include/configs/sunxi-common.h | 4 ++ 6 files changed, 131 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 --- drivers/video/sunxi/Makefile | 2 +- drivers/video/sunxi/simplefb_common.c | 29 +++++++++++++++++++++++++++++ drivers/video/sunxi/simplefb_common.h | 22 ++++++++++++++++++++++ drivers/video/sunxi/sunxi_display.c | 13 ++----------- 4 files changed, 54 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..4823f13a0c --- /dev/null +++ b/drivers/video/sunxi/simplefb_common.c @@ -0,0 +1,29 @@ +/* + * Common code for Allwinner SimpleFB with pipeline. + * + * (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..ac9bfcb087 --- /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 */

Hi Icenowy,
thanks for sending this!
On 11/09/17 16:54, Icenowy Zheng wrote:
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
drivers/video/sunxi/Makefile | 2 +- drivers/video/sunxi/simplefb_common.c | 29 +++++++++++++++++++++++++++++ drivers/video/sunxi/simplefb_common.h | 22 ++++++++++++++++++++++ drivers/video/sunxi/sunxi_display.c | 13 ++----------- 4 files changed, 54 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..4823f13a0c --- /dev/null +++ b/drivers/video/sunxi/simplefb_common.c @@ -0,0 +1,29 @@ +/*
- Common code for Allwinner SimpleFB with pipeline.
- (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..ac9bfcb087 --- /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
+/*
Just a nit, but I think kerndoc requires two asterisks here ("/**").
The rest looks fine to me, so:
Reviewed-by: Andre Przywara andre.przywara@arm.com
Cheers, Andre.
- 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 */

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 --- Changes in v2: - Extract the simplefb node searching code.
drivers/video/sunxi/Makefile | 2 +- drivers/video/sunxi/sunxi_de2.c | 72 +++++++++++++++++++++++++++++++++++++++++ include/configs/sunxi-common.h | 4 +++ 3 files changed, 77 insertions(+), 1 deletion(-)
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 */ diff --git a/include/configs/sunxi-common.h b/include/configs/sunxi-common.h index 1373b1f037..c240fe4403 100644 --- a/include/configs/sunxi-common.h +++ b/include/configs/sunxi-common.h @@ -288,6 +288,10 @@ extern int soft_i2c_gpio_scl;
#endif /* CONFIG_VIDEO */
+#ifdef CONFIG_VIDEO_DE2 +#define CONFIG_VIDEO_DT_SIMPLEFB +#endif + /* Ethernet support */ #ifdef CONFIG_SUNXI_EMAC #define CONFIG_PHY_ADDR 1

Hi,
On Mon, Sep 11, 2017 at 11:54:58PM +0800, Icenowy Zheng wrote:
diff --git a/include/configs/sunxi-common.h b/include/configs/sunxi-common.h index 1373b1f037..c240fe4403 100644 --- a/include/configs/sunxi-common.h +++ b/include/configs/sunxi-common.h @@ -288,6 +288,10 @@ extern int soft_i2c_gpio_scl;
#endif /* CONFIG_VIDEO */
+#ifdef CONFIG_VIDEO_DE2 +#define CONFIG_VIDEO_DT_SIMPLEFB +#endif
Please use a Kconfig option for that one.
Thanks! Maxime

在 2017-09-12 16:18,Maxime Ripard 写道:
Hi,
On Mon, Sep 11, 2017 at 11:54:58PM +0800, Icenowy Zheng wrote:
diff --git a/include/configs/sunxi-common.h b/include/configs/sunxi-common.h index 1373b1f037..c240fe4403 100644 --- a/include/configs/sunxi-common.h +++ b/include/configs/sunxi-common.h @@ -288,6 +288,10 @@ extern int soft_i2c_gpio_scl;
#endif /* CONFIG_VIDEO */
+#ifdef CONFIG_VIDEO_DE2 +#define CONFIG_VIDEO_DT_SIMPLEFB +#endif
Please use a Kconfig option for that one.
Should I also convert DE1 simplefb to a Kconfig option?
Thanks! Maxime

On Tue, Sep 12, 2017 at 04:25:36PM +0800, icenowy@aosc.io wrote:
在 2017-09-12 16:18,Maxime Ripard 写道:
Hi,
On Mon, Sep 11, 2017 at 11:54:58PM +0800, Icenowy Zheng wrote:
diff --git a/include/configs/sunxi-common.h b/include/configs/sunxi-common.h index 1373b1f037..c240fe4403 100644 --- a/include/configs/sunxi-common.h +++ b/include/configs/sunxi-common.h @@ -288,6 +288,10 @@ extern int soft_i2c_gpio_scl;
#endif /* CONFIG_VIDEO */
+#ifdef CONFIG_VIDEO_DE2 +#define CONFIG_VIDEO_DT_SIMPLEFB +#endif
Please use a Kconfig option for that one.
Should I also convert DE1 simplefb to a Kconfig option?
If you have some spare time, sure, but it's not a pre-requisite for this serie.
Maxime
participants (4)
-
Andre Przywara
-
Icenowy Zheng
-
icenowy@aosc.io
-
Maxime Ripard