[U-Boot] [PATCH] sunxi: setup simplefb for Allwinner DE2

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 --- drivers/video/sunxi/sunxi_de2.c | 81 +++++++++++++++++++++++++++++++++++++++++ include/configs/sunxi-common.h | 4 ++ 2 files changed, 85 insertions(+)
diff --git a/drivers/video/sunxi/sunxi_de2.c b/drivers/video/sunxi/sunxi_de2.c index 9a32c3a020..97e0513f04 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> @@ -256,3 +258,82 @@ 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); + + /* 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"); + } + 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, + (1 << de2_priv->bpix) / 8 * 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 997a92c8be..8078ffe82a 100644 --- a/include/configs/sunxi-common.h +++ b/include/configs/sunxi-common.h @@ -286,6 +286,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 Icenowy,
On Tue, May 09, 2017 at 03:23:58PM +0800, Icenowy Zheng wrote:
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
drivers/video/sunxi/sunxi_de2.c | 81 +++++++++++++++++++++++++++++++++++++++++ include/configs/sunxi-common.h | 4 ++ 2 files changed, 85 insertions(+)
diff --git a/drivers/video/sunxi/sunxi_de2.c b/drivers/video/sunxi/sunxi_de2.c index 9a32c3a020..97e0513f04 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> @@ -256,3 +258,82 @@ 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);
- /* 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");
- }
- 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,
(1 << de2_priv->bpix) / 8 * de2_priv->xsize,
"x8r8g8b8");
- if (ret)
eprintf("Cannot setup simplefb: Error setting properties\n");
- return ret;
This looks very similar to sun4i's simplefb setup code. Can't it be shared?
What is changing between the two, the compatible to check for?
Thanks! Maxime

于 2017年5月10日 GMT+08:00 上午4:29:20, Maxime Ripard maxime.ripard@free-electrons.com 写到:
Hi Icenowy,
On Tue, May 09, 2017 at 03:23:58PM +0800, Icenowy Zheng wrote:
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
drivers/video/sunxi/sunxi_de2.c | 81
+++++++++++++++++++++++++++++++++++++++++
include/configs/sunxi-common.h | 4 ++ 2 files changed, 85 insertions(+)
diff --git a/drivers/video/sunxi/sunxi_de2.c
b/drivers/video/sunxi/sunxi_de2.c
index 9a32c3a020..97e0513f04 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> @@ -256,3 +258,82 @@ 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);
- /* 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");
- }
- 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,
(1 << de2_priv->bpix) / 8 * de2_priv->xsize,
"x8r8g8b8");
- if (ret)
eprintf("Cannot setup simplefb: Error setting properties\n");
- return ret;
This looks very similar to sun4i's simplefb setup code. Can't it be shared?
only a few code (~ 5 lines).
Many lines have info-retrieving from DM structures, so they cannot be shared.
What is changing between the two, the compatible to check for?
1. support for Driver Model-based video. 2. pipeline changed.
Thanks! Maxime
participants (3)
-
Icenowy Zheng
-
icenowy@aosc.io
-
Maxime Ripard