diff mbox

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

Message ID 20170509072358.19116-1-icenowy@aosc.io
State Changes Requested
Delegated to: Jagannadha Sutradharudu Teki
Headers show

Commit Message

Icenowy Zheng May 9, 2017, 7:23 a.m. UTC
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(+)

Comments

Maxime Ripard May 9, 2017, 8:29 p.m. UTC | #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
Icenowy Zheng May 10, 2017, 2:25 p.m. UTC | #2
于 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
diff mbox

Patch

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