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

icenowy at aosc.io icenowy at aosc.io
Wed May 10 14:25:22 UTC 2017


于 2017年5月10日 GMT+08:00 上午4:29:20, Maxime Ripard 
<maxime.ripard at 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 at 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


More information about the U-Boot mailing list