All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/3] 30bpp framebuffer support
@ 2021-09-16 13:01 Mark Kettenis
  2021-09-16 13:01 ` [PATCH 1/3] video: Add 30bpp support Mark Kettenis
                   ` (2 more replies)
  0 siblings, 3 replies; 12+ messages in thread
From: Mark Kettenis @ 2021-09-16 13:01 UTC (permalink / raw)
  To: u-boot
  Cc: Mark Kettenis, Anatolij Gustschin, Heinrich Schuchardt, Alexander Graf

Apple M1 machines come up with a framebuffer that in 30bpp mode.
This series adds basic support for this mode.

Mark Kettenis (3):
  video: Add 30bpp support
  efi_loader: GOP: Add 30bpp support
  video: simplefb: Add 30bpp support

 drivers/video/console_normal.c    |  2 ++
 drivers/video/console_rotate.c    |  6 ++++++
 drivers/video/console_truetype.c  |  3 +++
 drivers/video/simplefb.c          |  3 +++
 drivers/video/vidconsole-uclass.c |  7 +++++++
 drivers/video/video-uclass.c      |  1 +
 include/video.h                   |  1 +
 lib/efi_loader/efi_gop.c          | 10 ++++++++++
 8 files changed, 33 insertions(+)

-- 
2.33.0


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH 1/3] video: Add 30bpp support
  2021-09-16 13:01 [PATCH 0/3] 30bpp framebuffer support Mark Kettenis
@ 2021-09-16 13:01 ` Mark Kettenis
  2021-09-25 13:40   ` Simon Glass
  2021-09-16 13:01 ` [PATCH 2/3] efi_loader: GOP: " Mark Kettenis
  2021-09-16 13:01 ` [PATCH 3/3] video: simplefb: " Mark Kettenis
  2 siblings, 1 reply; 12+ messages in thread
From: Mark Kettenis @ 2021-09-16 13:01 UTC (permalink / raw)
  To: u-boot
  Cc: Mark Kettenis, Anatolij Gustschin, Heinrich Schuchardt, Alexander Graf

Add support for 30bpp mode where pixels are picked in 32-bit
integers but use 10 bits instead of 8 bits for each component.

Signed-off-by: Mark Kettenis <kettenis@openbsd.org>
---
 drivers/video/console_normal.c    | 2 ++
 drivers/video/console_rotate.c    | 6 ++++++
 drivers/video/console_truetype.c  | 3 +++
 drivers/video/vidconsole-uclass.c | 7 +++++++
 drivers/video/video-uclass.c      | 1 +
 include/video.h                   | 1 +
 6 files changed, 20 insertions(+)

diff --git a/drivers/video/console_normal.c b/drivers/video/console_normal.c
index 04f022491e..e0b89cbb93 100644
--- a/drivers/video/console_normal.c
+++ b/drivers/video/console_normal.c
@@ -41,6 +41,7 @@ static int console_normal_set_row(struct udevice *dev, uint row, int clr)
 			end = dst;
 			break;
 		}
+	case VIDEO_BPP30:
 	case VIDEO_BPP32:
 		if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
 			uint32_t *dst = line;
@@ -126,6 +127,7 @@ static int console_normal_putc_xy(struct udevice *dev, uint x_frac, uint y,
 				}
 				break;
 			}
+		case VIDEO_BPP30:
 		case VIDEO_BPP32:
 			if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
 				uint32_t *dst = line;
diff --git a/drivers/video/console_rotate.c b/drivers/video/console_rotate.c
index 36c8d0609d..bf81b80a39 100644
--- a/drivers/video/console_rotate.c
+++ b/drivers/video/console_rotate.c
@@ -40,6 +40,7 @@ static int console_set_row_1(struct udevice *dev, uint row, int clr)
 					*dst++ = clr;
 				break;
 			}
+		case VIDEO_BPP30:
 		case VIDEO_BPP32:
 			if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
 				uint32_t *dst = line;
@@ -128,6 +129,7 @@ static int console_putc_xy_1(struct udevice *dev, uint x_frac, uint y, char ch)
 				}
 				break;
 			}
+		case VIDEO_BPP30:
 		case VIDEO_BPP32:
 			if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
 				uint32_t *dst = line;
@@ -183,6 +185,7 @@ static int console_set_row_2(struct udevice *dev, uint row, int clr)
 			end = dst;
 			break;
 		}
+	case VIDEO_BPP30:
 	case VIDEO_BPP32:
 		if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
 			uint32_t *dst = line;
@@ -266,6 +269,7 @@ static int console_putc_xy_2(struct udevice *dev, uint x_frac, uint y, char ch)
 				}
 				break;
 			}
+		case VIDEO_BPP30:
 		case VIDEO_BPP32:
 			if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
 				uint32_t *dst = line;
@@ -318,6 +322,7 @@ static int console_set_row_3(struct udevice *dev, uint row, int clr)
 					*dst++ = clr;
 				break;
 			}
+		case VIDEO_BPP30:
 		case VIDEO_BPP32:
 			if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
 				uint32_t *dst = line;
@@ -402,6 +407,7 @@ static int console_putc_xy_3(struct udevice *dev, uint x_frac, uint y, char ch)
 				}
 				break;
 			}
+		case VIDEO_BPP30:
 		case VIDEO_BPP32:
 			if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
 				uint32_t *dst = line;
diff --git a/drivers/video/console_truetype.c b/drivers/video/console_truetype.c
index 98427f4c61..0195d996de 100644
--- a/drivers/video/console_truetype.c
+++ b/drivers/video/console_truetype.c
@@ -153,6 +153,7 @@ static int console_truetype_set_row(struct udevice *dev, uint row, int clr)
 	}
 #endif
 #ifdef CONFIG_VIDEO_BPP32
+	case VIDEO_BPP30:
 	case VIDEO_BPP32: {
 		u32 *dst = line;
 
@@ -299,6 +300,7 @@ static int console_truetype_putc_xy(struct udevice *dev, uint x, uint y,
 		}
 #endif
 #ifdef CONFIG_VIDEO_BPP32
+		case VIDEO_BPP30:
 		case VIDEO_BPP32: {
 			u32 *dst = (u32 *)line + xoff;
 			int i;
@@ -381,6 +383,7 @@ static int console_truetype_erase(struct udevice *dev, int xstart, int ystart,
 		}
 #endif
 #ifdef CONFIG_VIDEO_BPP32
+		case VIDEO_BPP30:
 		case VIDEO_BPP32: {
 			uint32_t *dst = line;
 
diff --git a/drivers/video/vidconsole-uclass.c b/drivers/video/vidconsole-uclass.c
index 8132efa55a..cc274b45fe 100644
--- a/drivers/video/vidconsole-uclass.c
+++ b/drivers/video/vidconsole-uclass.c
@@ -153,6 +153,13 @@ u32 vid_console_color(struct video_priv *priv, unsigned int idx)
 			       ((colors[idx].b >> 3) <<  0);
 		}
 		break;
+	case VIDEO_BPP30:
+		if (CONFIG_IS_ENABLED(VIDEO_BPP32)) {
+			return (colors[idx].r << 22) |
+			       (colors[idx].g << 12) |
+			       (colors[idx].b <<  2);
+		}
+		break;
 	case VIDEO_BPP32:
 		if (CONFIG_IS_ENABLED(VIDEO_BPP32)) {
 			return (colors[idx].r << 16) |
diff --git a/drivers/video/video-uclass.c b/drivers/video/video-uclass.c
index 9f8cf6ef2a..28bf701f41 100644
--- a/drivers/video/video-uclass.c
+++ b/drivers/video/video-uclass.c
@@ -129,6 +129,7 @@ int video_clear(struct udevice *dev)
 				*ppix++ = priv->colour_bg;
 			break;
 		}
+	case VIDEO_BPP30:
 	case VIDEO_BPP32:
 		if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
 			u32 *ppix = priv->fb;
diff --git a/include/video.h b/include/video.h
index 827733305e..04c636b317 100644
--- a/include/video.h
+++ b/include/video.h
@@ -53,6 +53,7 @@ enum video_log2_bpp {
 	VIDEO_BPP4,
 	VIDEO_BPP8,
 	VIDEO_BPP16,
+	VIDEO_BPP30,
 	VIDEO_BPP32,
 };
 
-- 
2.33.0


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 2/3] efi_loader: GOP: Add 30bpp support
  2021-09-16 13:01 [PATCH 0/3] 30bpp framebuffer support Mark Kettenis
  2021-09-16 13:01 ` [PATCH 1/3] video: Add 30bpp support Mark Kettenis
@ 2021-09-16 13:01 ` Mark Kettenis
  2021-09-17  2:56   ` Heinrich Schuchardt
  2021-09-25 13:40   ` Simon Glass
  2021-09-16 13:01 ` [PATCH 3/3] video: simplefb: " Mark Kettenis
  2 siblings, 2 replies; 12+ messages in thread
From: Mark Kettenis @ 2021-09-16 13:01 UTC (permalink / raw)
  To: u-boot
  Cc: Mark Kettenis, Anatolij Gustschin, Heinrich Schuchardt, Alexander Graf

Provide correct framebuffer information for 30bpp modes.

Signed-off-by: Mark Kettenis <kettenis@openbsd.org>
---
 lib/efi_loader/efi_gop.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/lib/efi_loader/efi_gop.c b/lib/efi_loader/efi_gop.c
index 1206b2d7a2..42bf49b184 100644
--- a/lib/efi_loader/efi_gop.c
+++ b/lib/efi_loader/efi_gop.c
@@ -227,6 +227,7 @@ static efi_uintn_t gop_get_bpp(struct efi_gop *this)
 
 	switch (gopobj->bpix) {
 #ifdef CONFIG_DM_VIDEO
+	case VIDEO_BPP30:
 	case VIDEO_BPP32:
 #else
 	case LCD_COLOR32:
@@ -468,6 +469,7 @@ efi_status_t efi_gop_register(void)
 	switch (bpix) {
 #ifdef CONFIG_DM_VIDEO
 	case VIDEO_BPP16:
+	case VIDEO_BPP30:
 	case VIDEO_BPP32:
 #else
 	case LCD_COLOR32:
@@ -518,6 +520,14 @@ efi_status_t efi_gop_register(void)
 #endif
 	{
 		gopobj->info.pixel_format = EFI_GOT_BGRA8;
+#ifdef CONFIG_DM_VIDEO
+	} else if (bpix == VIDEO_BPP30) {
+		gopobj->info.pixel_format = EFI_GOT_BITMASK;
+		gopobj->info.pixel_bitmask[0] = 0x3ff00000; /* red */
+		gopobj->info.pixel_bitmask[1] = 0x000ffc00; /* green */
+		gopobj->info.pixel_bitmask[2] = 0x000003ff; /* blue */
+		gopobj->info.pixel_bitmask[3] = 0xc0000000; /* reserved */
+#endif
 	} else {
 		gopobj->info.pixel_format = EFI_GOT_BITMASK;
 		gopobj->info.pixel_bitmask[0] = 0xf800; /* red */
-- 
2.33.0


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 3/3] video: simplefb: Add 30bpp support
  2021-09-16 13:01 [PATCH 0/3] 30bpp framebuffer support Mark Kettenis
  2021-09-16 13:01 ` [PATCH 1/3] video: Add 30bpp support Mark Kettenis
  2021-09-16 13:01 ` [PATCH 2/3] efi_loader: GOP: " Mark Kettenis
@ 2021-09-16 13:01 ` Mark Kettenis
  2021-09-25 13:41   ` Simon Glass
  2 siblings, 1 reply; 12+ messages in thread
From: Mark Kettenis @ 2021-09-16 13:01 UTC (permalink / raw)
  To: u-boot
  Cc: Mark Kettenis, Anatolij Gustschin, Heinrich Schuchardt, Alexander Graf

Recognize the canonical format strings for framebuffers in
30bpp mode.

Signed-off-by: Mark Kettenis <kettenis@openbsd.org>
---
 drivers/video/simplefb.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/video/simplefb.c b/drivers/video/simplefb.c
index fd58426cf5..7e1cc4560f 100644
--- a/drivers/video/simplefb.c
+++ b/drivers/video/simplefb.c
@@ -52,6 +52,9 @@ static int simple_video_probe(struct udevice *dev)
 		uc_priv->bpix = VIDEO_BPP16;
 	} else if (strcmp(format, "a8b8g8r8") == 0) {
 		uc_priv->bpix = VIDEO_BPP32;
+	} else if (strcmp(format, "a2r10g10b10") == 0 ||
+		   strcmp(format, "x2r10g10b10") == 0) {
+		uc_priv->bpix = VIDEO_BPP30;
 	} else {
 		printf("%s: invalid format: %s\n", __func__, format);
 		return -EINVAL;
-- 
2.33.0


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH 2/3] efi_loader: GOP: Add 30bpp support
  2021-09-16 13:01 ` [PATCH 2/3] efi_loader: GOP: " Mark Kettenis
@ 2021-09-17  2:56   ` Heinrich Schuchardt
  2021-09-17  9:23     ` Mark Kettenis
  2021-09-25 13:40   ` Simon Glass
  1 sibling, 1 reply; 12+ messages in thread
From: Heinrich Schuchardt @ 2021-09-17  2:56 UTC (permalink / raw)
  To: Mark Kettenis, u-boot; +Cc: Anatolij Gustschin, Alexander Graf

On 9/16/21 3:01 PM, Mark Kettenis wrote:
> Provide correct framebuffer information for 30bpp modes.

This is not enough to get a correct GOP implementation for the 30bpp mode.

Have a look at efi_gop_pixel efi_vid16_to_blt_col() and
efi_blt_col_to_vid16() and where they are used.

>
> Signed-off-by: Mark Kettenis <kettenis@openbsd.org>
> ---
>   lib/efi_loader/efi_gop.c | 10 ++++++++++
>   1 file changed, 10 insertions(+)
>
> diff --git a/lib/efi_loader/efi_gop.c b/lib/efi_loader/efi_gop.c
> index 1206b2d7a2..42bf49b184 100644
> --- a/lib/efi_loader/efi_gop.c
> +++ b/lib/efi_loader/efi_gop.c
> @@ -227,6 +227,7 @@ static efi_uintn_t gop_get_bpp(struct efi_gop *this)
>
>   	switch (gopobj->bpix) {
>   #ifdef CONFIG_DM_VIDEO
> +	case VIDEO_BPP30:
>   	case VIDEO_BPP32:
>   #else
>   	case LCD_COLOR32:
> @@ -468,6 +469,7 @@ efi_status_t efi_gop_register(void)
>   	switch (bpix) {
>   #ifdef CONFIG_DM_VIDEO
>   	case VIDEO_BPP16:
> +	case VIDEO_BPP30:
>   	case VIDEO_BPP32:
>   #else
>   	case LCD_COLOR32:
> @@ -518,6 +520,14 @@ efi_status_t efi_gop_register(void)
>   #endif
>   	{
>   		gopobj->info.pixel_format = EFI_GOT_BGRA8;
> +#ifdef CONFIG_DM_VIDEO

This symbol is not 30bpp specific. Is there a Kconfig variable that we
can use to hide 30bpp support where it is not needed?

Which modes does the M1 support?

Best regards

Heinrich

> +	} else if (bpix == VIDEO_BPP30) {
> +		gopobj->info.pixel_format = EFI_GOT_BITMASK;
> +		gopobj->info.pixel_bitmask[0] = 0x3ff00000; /* red */
> +		gopobj->info.pixel_bitmask[1] = 0x000ffc00; /* green */
> +		gopobj->info.pixel_bitmask[2] = 0x000003ff; /* blue */
> +		gopobj->info.pixel_bitmask[3] = 0xc0000000; /* reserved */
> +#endif
>   	} else {
>   		gopobj->info.pixel_format = EFI_GOT_BITMASK;
>   		gopobj->info.pixel_bitmask[0] = 0xf800; /* red */
>


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 2/3] efi_loader: GOP: Add 30bpp support
  2021-09-17  2:56   ` Heinrich Schuchardt
@ 2021-09-17  9:23     ` Mark Kettenis
  2021-09-17 11:29       ` Heinrich Schuchardt
  0 siblings, 1 reply; 12+ messages in thread
From: Mark Kettenis @ 2021-09-17  9:23 UTC (permalink / raw)
  To: Heinrich Schuchardt; +Cc: kettenis, u-boot, agust, agraf

> From: Heinrich Schuchardt <xypron.glpk@gmx.de>
> Date: Fri, 17 Sep 2021 04:56:31 +0200

Hi Heinrich,

> On 9/16/21 3:01 PM, Mark Kettenis wrote:
> > Provide correct framebuffer information for 30bpp modes.
> 
> This is not enough to get a correct GOP implementation for the 30bpp mode.
> 
> Have a look at efi_gop_pixel efi_vid16_to_blt_col() and
> efi_blt_col_to_vid16() and where they are used.

Ah right.  This does indeed not support EFI_GRAPHICS_OUTPUT_PROTOCOL.Blt()
correctly.  I shouldn't be too hard to translate between XRGB2101010
and XRGB8888.  Any ideas how I could test that code?

> > Signed-off-by: Mark Kettenis <kettenis@openbsd.org>
> > ---
> >   lib/efi_loader/efi_gop.c | 10 ++++++++++
> >   1 file changed, 10 insertions(+)
> >
> > diff --git a/lib/efi_loader/efi_gop.c b/lib/efi_loader/efi_gop.c
> > index 1206b2d7a2..42bf49b184 100644
> > --- a/lib/efi_loader/efi_gop.c
> > +++ b/lib/efi_loader/efi_gop.c
> > @@ -227,6 +227,7 @@ static efi_uintn_t gop_get_bpp(struct efi_gop *this)
> >
> >   	switch (gopobj->bpix) {
> >   #ifdef CONFIG_DM_VIDEO
> > +	case VIDEO_BPP30:
> >   	case VIDEO_BPP32:
> >   #else
> >   	case LCD_COLOR32:
> > @@ -468,6 +469,7 @@ efi_status_t efi_gop_register(void)
> >   	switch (bpix) {
> >   #ifdef CONFIG_DM_VIDEO
> >   	case VIDEO_BPP16:
> > +	case VIDEO_BPP30:
> >   	case VIDEO_BPP32:
> >   #else
> >   	case LCD_COLOR32:
> > @@ -518,6 +520,14 @@ efi_status_t efi_gop_register(void)
> >   #endif
> >   	{
> >   		gopobj->info.pixel_format = EFI_GOT_BGRA8;
> > +#ifdef CONFIG_DM_VIDEO
> 
> This symbol is not 30bpp specific. Is there a Kconfig variable that we
> can use to hide 30bpp support where it is not needed?

I quite deliberately didn't add a separate config option for 30bpp as
there is very little code that is added to the already existing 32bpp
code.  In a sense 30bpp is just a different submode of the 32bpp
support with just a different color map, so I thought it made sense to
group it under CONFIG_VIDEO_32BPP.  I did initially consider adding a
separate config option for it, but it quickly turns into an #ifdef
maze that makes it hard to understand the code.

The CONFIG_DM_VIDEO check is just there to make sure the 30bpp is only
offered in the DM model.  Based on recent discussions I expect the
!CONFIG_DM_VIDEO case to disappear in the near feature so adding 30bpp
support for the non-DM case doesn't make sense.

The EFI GOP code currently doesn't check the CONFIG_VIDEO_BPP16 and
CONFIG_VIDEO_BPP32 defines to see which of these modes are enabled
within U-Boot, so we don't "hide" 16bpp support on platforms that just
support 32bpp either.

> Which modes does the M1 support?

We're not sure.  It does support at least 8-bit (32bpp) and 10-bit
(30bpp) color depth modes.  But the firmware tends to come up with
10-bit color depth whenever it can and I'm not planning to add support
for changing the framebuffer mode on the M1, since the interface to do
that is "interesting" [1].

[1] See Alyssa Rozenzweig's talk at XDC 2021,
    https://www.youtube.com/watch?v=uTZISTjqy9Q
> 
> > +	} else if (bpix == VIDEO_BPP30) {
> > +		gopobj->info.pixel_format = EFI_GOT_BITMASK;
> > +		gopobj->info.pixel_bitmask[0] = 0x3ff00000; /* red */
> > +		gopobj->info.pixel_bitmask[1] = 0x000ffc00; /* green */
> > +		gopobj->info.pixel_bitmask[2] = 0x000003ff; /* blue */
> > +		gopobj->info.pixel_bitmask[3] = 0xc0000000; /* reserved */
> > +#endif
> >   	} else {
> >   		gopobj->info.pixel_format = EFI_GOT_BITMASK;
> >   		gopobj->info.pixel_bitmask[0] = 0xf800; /* red */
> >
> 
> 

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 2/3] efi_loader: GOP: Add 30bpp support
  2021-09-17  9:23     ` Mark Kettenis
@ 2021-09-17 11:29       ` Heinrich Schuchardt
  2021-09-17 12:41         ` Mark Kettenis
  0 siblings, 1 reply; 12+ messages in thread
From: Heinrich Schuchardt @ 2021-09-17 11:29 UTC (permalink / raw)
  To: Mark Kettenis; +Cc: kettenis, u-boot, agust, agraf



On 9/17/21 11:23 AM, Mark Kettenis wrote:
>> From: Heinrich Schuchardt <xypron.glpk@gmx.de>
>> Date: Fri, 17 Sep 2021 04:56:31 +0200
>
> Hi Heinrich,
>
>> On 9/16/21 3:01 PM, Mark Kettenis wrote:
>>> Provide correct framebuffer information for 30bpp modes.
>>
>> This is not enough to get a correct GOP implementation for the 30bpp mode.
>>
>> Have a look at efi_gop_pixel efi_vid16_to_blt_col() and
>> efi_blt_col_to_vid16() and where they are used.
>
> Ah right.  This does indeed not support EFI_GRAPHICS_OUTPUT_PROTOCOL.Blt()
> correctly.  I shouldn't be too hard to translate between XRGB2101010
> and XRGB8888.  Any ideas how I could test that code?

setenv efi_selftest block image transfer
bootefi selftest

should show an animated submarine with yellow portholes similar to

https://gist.github.com/xypron/7e1f73408465da71e3ef946250e76776#file-sub-png

Best regards

Heinrich

>
>>> Signed-off-by: Mark Kettenis <kettenis@openbsd.org>
>>> ---
>>>    lib/efi_loader/efi_gop.c | 10 ++++++++++
>>>    1 file changed, 10 insertions(+)
>>>
>>> diff --git a/lib/efi_loader/efi_gop.c b/lib/efi_loader/efi_gop.c
>>> index 1206b2d7a2..42bf49b184 100644
>>> --- a/lib/efi_loader/efi_gop.c
>>> +++ b/lib/efi_loader/efi_gop.c
>>> @@ -227,6 +227,7 @@ static efi_uintn_t gop_get_bpp(struct efi_gop *this)
>>>
>>>    	switch (gopobj->bpix) {
>>>    #ifdef CONFIG_DM_VIDEO
>>> +	case VIDEO_BPP30:
>>>    	case VIDEO_BPP32:
>>>    #else
>>>    	case LCD_COLOR32:
>>> @@ -468,6 +469,7 @@ efi_status_t efi_gop_register(void)
>>>    	switch (bpix) {
>>>    #ifdef CONFIG_DM_VIDEO
>>>    	case VIDEO_BPP16:
>>> +	case VIDEO_BPP30:
>>>    	case VIDEO_BPP32:
>>>    #else
>>>    	case LCD_COLOR32:
>>> @@ -518,6 +520,14 @@ efi_status_t efi_gop_register(void)
>>>    #endif
>>>    	{
>>>    		gopobj->info.pixel_format = EFI_GOT_BGRA8;
>>> +#ifdef CONFIG_DM_VIDEO
>>
>> This symbol is not 30bpp specific. Is there a Kconfig variable that we
>> can use to hide 30bpp support where it is not needed?
>
> I quite deliberately didn't add a separate config option for 30bpp as
> there is very little code that is added to the already existing 32bpp
> code.  In a sense 30bpp is just a different submode of the 32bpp
> support with just a different color map, so I thought it made sense to
> group it under CONFIG_VIDEO_32BPP.  I did initially consider adding a
> separate config option for it, but it quickly turns into an #ifdef
> maze that makes it hard to understand the code.
>
> The CONFIG_DM_VIDEO check is just there to make sure the 30bpp is only
> offered in the DM model.  Based on recent discussions I expect the
> !CONFIG_DM_VIDEO case to disappear in the near feature so adding 30bpp
> support for the non-DM case doesn't make sense.
>
> The EFI GOP code currently doesn't check the CONFIG_VIDEO_BPP16 and
> CONFIG_VIDEO_BPP32 defines to see which of these modes are enabled
> within U-Boot, so we don't "hide" 16bpp support on platforms that just
> support 32bpp either.
>
>> Which modes does the M1 support?
>
> We're not sure.  It does support at least 8-bit (32bpp) and 10-bit
> (30bpp) color depth modes.  But the firmware tends to come up with
> 10-bit color depth whenever it can and I'm not planning to add support
> for changing the framebuffer mode on the M1, since the interface to do
> that is "interesting" [1].
>
> [1] See Alyssa Rozenzweig's talk at XDC 2021,
>      https://www.youtube.com/watch?v=uTZISTjqy9Q
>>
>>> +	} else if (bpix == VIDEO_BPP30) {
>>> +		gopobj->info.pixel_format = EFI_GOT_BITMASK;
>>> +		gopobj->info.pixel_bitmask[0] = 0x3ff00000; /* red */
>>> +		gopobj->info.pixel_bitmask[1] = 0x000ffc00; /* green */
>>> +		gopobj->info.pixel_bitmask[2] = 0x000003ff; /* blue */
>>> +		gopobj->info.pixel_bitmask[3] = 0xc0000000; /* reserved */
>>> +#endif
>>>    	} else {
>>>    		gopobj->info.pixel_format = EFI_GOT_BITMASK;
>>>    		gopobj->info.pixel_bitmask[0] = 0xf800; /* red */
>>>
>>
>>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 2/3] efi_loader: GOP: Add 30bpp support
  2021-09-17 11:29       ` Heinrich Schuchardt
@ 2021-09-17 12:41         ` Mark Kettenis
  0 siblings, 0 replies; 12+ messages in thread
From: Mark Kettenis @ 2021-09-17 12:41 UTC (permalink / raw)
  To: Heinrich Schuchardt; +Cc: kettenis, u-boot, agust, agraf

> From: Heinrich Schuchardt <xypron.glpk@gmx.de>
> Date: Fri, 17 Sep 2021 13:29:06 +0200
> 
> On 9/17/21 11:23 AM, Mark Kettenis wrote:
> >> From: Heinrich Schuchardt <xypron.glpk@gmx.de>
> >> Date: Fri, 17 Sep 2021 04:56:31 +0200
> >
> > Hi Heinrich,
> >
> >> On 9/16/21 3:01 PM, Mark Kettenis wrote:
> >>> Provide correct framebuffer information for 30bpp modes.
> >>
> >> This is not enough to get a correct GOP implementation for the 30bpp mode.
> >>
> >> Have a look at efi_gop_pixel efi_vid16_to_blt_col() and
> >> efi_blt_col_to_vid16() and where they are used.
> >
> > Ah right.  This does indeed not support EFI_GRAPHICS_OUTPUT_PROTOCOL.Blt()
> > correctly.  I shouldn't be too hard to translate between XRGB2101010
> > and XRGB8888.  Any ideas how I could test that code?
> 
> setenv efi_selftest block image transfer
> bootefi selftest
> 
> should show an animated submarine with yellow portholes similar to
> 
> https://gist.github.com/xypron/7e1f73408465da71e3ef946250e76776#file-sub-png
> 
> Best regards

Cool thanks.  Looks like my implementation works!  I'll wait a bit for
feedback on the other diffs in this series before sending a v2 with that.

Cheers,

Mark

> >>> Signed-off-by: Mark Kettenis <kettenis@openbsd.org>
> >>> ---
> >>>    lib/efi_loader/efi_gop.c | 10 ++++++++++
> >>>    1 file changed, 10 insertions(+)
> >>>
> >>> diff --git a/lib/efi_loader/efi_gop.c b/lib/efi_loader/efi_gop.c
> >>> index 1206b2d7a2..42bf49b184 100644
> >>> --- a/lib/efi_loader/efi_gop.c
> >>> +++ b/lib/efi_loader/efi_gop.c
> >>> @@ -227,6 +227,7 @@ static efi_uintn_t gop_get_bpp(struct efi_gop *this)
> >>>
> >>>    	switch (gopobj->bpix) {
> >>>    #ifdef CONFIG_DM_VIDEO
> >>> +	case VIDEO_BPP30:
> >>>    	case VIDEO_BPP32:
> >>>    #else
> >>>    	case LCD_COLOR32:
> >>> @@ -468,6 +469,7 @@ efi_status_t efi_gop_register(void)
> >>>    	switch (bpix) {
> >>>    #ifdef CONFIG_DM_VIDEO
> >>>    	case VIDEO_BPP16:
> >>> +	case VIDEO_BPP30:
> >>>    	case VIDEO_BPP32:
> >>>    #else
> >>>    	case LCD_COLOR32:
> >>> @@ -518,6 +520,14 @@ efi_status_t efi_gop_register(void)
> >>>    #endif
> >>>    	{
> >>>    		gopobj->info.pixel_format = EFI_GOT_BGRA8;
> >>> +#ifdef CONFIG_DM_VIDEO
> >>
> >> This symbol is not 30bpp specific. Is there a Kconfig variable that we
> >> can use to hide 30bpp support where it is not needed?
> >
> > I quite deliberately didn't add a separate config option for 30bpp as
> > there is very little code that is added to the already existing 32bpp
> > code.  In a sense 30bpp is just a different submode of the 32bpp
> > support with just a different color map, so I thought it made sense to
> > group it under CONFIG_VIDEO_32BPP.  I did initially consider adding a
> > separate config option for it, but it quickly turns into an #ifdef
> > maze that makes it hard to understand the code.
> >
> > The CONFIG_DM_VIDEO check is just there to make sure the 30bpp is only
> > offered in the DM model.  Based on recent discussions I expect the
> > !CONFIG_DM_VIDEO case to disappear in the near feature so adding 30bpp
> > support for the non-DM case doesn't make sense.
> >
> > The EFI GOP code currently doesn't check the CONFIG_VIDEO_BPP16 and
> > CONFIG_VIDEO_BPP32 defines to see which of these modes are enabled
> > within U-Boot, so we don't "hide" 16bpp support on platforms that just
> > support 32bpp either.
> >
> >> Which modes does the M1 support?
> >
> > We're not sure.  It does support at least 8-bit (32bpp) and 10-bit
> > (30bpp) color depth modes.  But the firmware tends to come up with
> > 10-bit color depth whenever it can and I'm not planning to add support
> > for changing the framebuffer mode on the M1, since the interface to do
> > that is "interesting" [1].
> >
> > [1] See Alyssa Rozenzweig's talk at XDC 2021,
> >      https://www.youtube.com/watch?v=uTZISTjqy9Q
> >>
> >>> +	} else if (bpix == VIDEO_BPP30) {
> >>> +		gopobj->info.pixel_format = EFI_GOT_BITMASK;
> >>> +		gopobj->info.pixel_bitmask[0] = 0x3ff00000; /* red */
> >>> +		gopobj->info.pixel_bitmask[1] = 0x000ffc00; /* green */
> >>> +		gopobj->info.pixel_bitmask[2] = 0x000003ff; /* blue */
> >>> +		gopobj->info.pixel_bitmask[3] = 0xc0000000; /* reserved */
> >>> +#endif
> >>>    	} else {
> >>>    		gopobj->info.pixel_format = EFI_GOT_BITMASK;
> >>>    		gopobj->info.pixel_bitmask[0] = 0xf800; /* red */
> >>>
> >>
> >>
> 

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 1/3] video: Add 30bpp support
  2021-09-16 13:01 ` [PATCH 1/3] video: Add 30bpp support Mark Kettenis
@ 2021-09-25 13:40   ` Simon Glass
  2021-09-25 16:55     ` Mark Kettenis
  0 siblings, 1 reply; 12+ messages in thread
From: Simon Glass @ 2021-09-25 13:40 UTC (permalink / raw)
  To: Mark Kettenis
  Cc: U-Boot Mailing List, Anatolij Gustschin, Heinrich Schuchardt,
	Alexander Graf

On Thu, 16 Sept 2021 at 07:01, Mark Kettenis <kettenis@openbsd.org> wrote:
>
> Add support for 30bpp mode where pixels are picked in 32-bit
> integers but use 10 bits instead of 8 bits for each component.
>
> Signed-off-by: Mark Kettenis <kettenis@openbsd.org>
> ---
>  drivers/video/console_normal.c    | 2 ++
>  drivers/video/console_rotate.c    | 6 ++++++
>  drivers/video/console_truetype.c  | 3 +++
>  drivers/video/vidconsole-uclass.c | 7 +++++++
>  drivers/video/video-uclass.c      | 1 +
>  include/video.h                   | 1 +
>  6 files changed, 20 insertions(+)
>
> diff --git a/drivers/video/console_normal.c b/drivers/video/console_normal.c
> index 04f022491e..e0b89cbb93 100644
> --- a/drivers/video/console_normal.c
> +++ b/drivers/video/console_normal.c
> @@ -41,6 +41,7 @@ static int console_normal_set_row(struct udevice *dev, uint row, int clr)
>                         end = dst;
>                         break;
>                 }
> +       case VIDEO_BPP30:
>         case VIDEO_BPP32:
>                 if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
>                         uint32_t *dst = line;
> @@ -126,6 +127,7 @@ static int console_normal_putc_xy(struct udevice *dev, uint x_frac, uint y,
>                                 }
>                                 break;
>                         }
> +               case VIDEO_BPP30:
>                 case VIDEO_BPP32:
>                         if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
>                                 uint32_t *dst = line;
> diff --git a/drivers/video/console_rotate.c b/drivers/video/console_rotate.c
> index 36c8d0609d..bf81b80a39 100644
> --- a/drivers/video/console_rotate.c
> +++ b/drivers/video/console_rotate.c
> @@ -40,6 +40,7 @@ static int console_set_row_1(struct udevice *dev, uint row, int clr)
>                                         *dst++ = clr;
>                                 break;
>                         }
> +               case VIDEO_BPP30:
>                 case VIDEO_BPP32:
>                         if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
>                                 uint32_t *dst = line;
> @@ -128,6 +129,7 @@ static int console_putc_xy_1(struct udevice *dev, uint x_frac, uint y, char ch)
>                                 }
>                                 break;
>                         }
> +               case VIDEO_BPP30:
>                 case VIDEO_BPP32:
>                         if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
>                                 uint32_t *dst = line;
> @@ -183,6 +185,7 @@ static int console_set_row_2(struct udevice *dev, uint row, int clr)
>                         end = dst;
>                         break;
>                 }
> +       case VIDEO_BPP30:
>         case VIDEO_BPP32:
>                 if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
>                         uint32_t *dst = line;
> @@ -266,6 +269,7 @@ static int console_putc_xy_2(struct udevice *dev, uint x_frac, uint y, char ch)
>                                 }
>                                 break;
>                         }
> +               case VIDEO_BPP30:
>                 case VIDEO_BPP32:
>                         if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
>                                 uint32_t *dst = line;
> @@ -318,6 +322,7 @@ static int console_set_row_3(struct udevice *dev, uint row, int clr)
>                                         *dst++ = clr;
>                                 break;
>                         }
> +               case VIDEO_BPP30:
>                 case VIDEO_BPP32:
>                         if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
>                                 uint32_t *dst = line;
> @@ -402,6 +407,7 @@ static int console_putc_xy_3(struct udevice *dev, uint x_frac, uint y, char ch)
>                                 }
>                                 break;
>                         }
> +               case VIDEO_BPP30:
>                 case VIDEO_BPP32:
>                         if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
>                                 uint32_t *dst = line;
> diff --git a/drivers/video/console_truetype.c b/drivers/video/console_truetype.c
> index 98427f4c61..0195d996de 100644
> --- a/drivers/video/console_truetype.c
> +++ b/drivers/video/console_truetype.c
> @@ -153,6 +153,7 @@ static int console_truetype_set_row(struct udevice *dev, uint row, int clr)
>         }
>  #endif
>  #ifdef CONFIG_VIDEO_BPP32
> +       case VIDEO_BPP30:
>         case VIDEO_BPP32: {
>                 u32 *dst = line;
>
> @@ -299,6 +300,7 @@ static int console_truetype_putc_xy(struct udevice *dev, uint x, uint y,
>                 }
>  #endif
>  #ifdef CONFIG_VIDEO_BPP32
> +               case VIDEO_BPP30:
>                 case VIDEO_BPP32: {
>                         u32 *dst = (u32 *)line + xoff;
>                         int i;
> @@ -381,6 +383,7 @@ static int console_truetype_erase(struct udevice *dev, int xstart, int ystart,
>                 }
>  #endif
>  #ifdef CONFIG_VIDEO_BPP32
> +               case VIDEO_BPP30:
>                 case VIDEO_BPP32: {
>                         uint32_t *dst = line;
>
> diff --git a/drivers/video/vidconsole-uclass.c b/drivers/video/vidconsole-uclass.c
> index 8132efa55a..cc274b45fe 100644
> --- a/drivers/video/vidconsole-uclass.c
> +++ b/drivers/video/vidconsole-uclass.c
> @@ -153,6 +153,13 @@ u32 vid_console_color(struct video_priv *priv, unsigned int idx)
>                                ((colors[idx].b >> 3) <<  0);
>                 }
>                 break;
> +       case VIDEO_BPP30:
> +               if (CONFIG_IS_ENABLED(VIDEO_BPP32)) {
> +                       return (colors[idx].r << 22) |
> +                              (colors[idx].g << 12) |
> +                              (colors[idx].b <<  2);
> +               }
> +               break;
>         case VIDEO_BPP32:
>                 if (CONFIG_IS_ENABLED(VIDEO_BPP32)) {
>                         return (colors[idx].r << 16) |
> diff --git a/drivers/video/video-uclass.c b/drivers/video/video-uclass.c
> index 9f8cf6ef2a..28bf701f41 100644
> --- a/drivers/video/video-uclass.c
> +++ b/drivers/video/video-uclass.c
> @@ -129,6 +129,7 @@ int video_clear(struct udevice *dev)
>                                 *ppix++ = priv->colour_bg;
>                         break;
>                 }
> +       case VIDEO_BPP30:
>         case VIDEO_BPP32:
>                 if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
>                         u32 *ppix = priv->fb;
> diff --git a/include/video.h b/include/video.h
> index 827733305e..04c636b317 100644
> --- a/include/video.h
> +++ b/include/video.
> @@ -53,6 +53,7 @@ enum video_log2_bpp {
>         VIDEO_BPP4,
>         VIDEO_BPP8,
>         VIDEO_BPP16,
> +       VIDEO_BPP30,
>         VIDEO_BPP32,
>  };

This breaks the enuam here. See the comment above:

/*
 * Bits per pixel selector. Each value n is such that the bits-per-pixel is
 * 2 ^ n
 */

Quite a few things rely on this, so there will need to be some
changes. See for example VBNBYTE() immediately below.

Also don't you need a CONFIG_VIDEO_BPP30 ?

Tested on: Macbook Air M1
Tested-by: Simon Glass <sjg@chromium.org>

Fails on sandbox (display turns blue)

Regards,
Simon

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 2/3] efi_loader: GOP: Add 30bpp support
  2021-09-16 13:01 ` [PATCH 2/3] efi_loader: GOP: " Mark Kettenis
  2021-09-17  2:56   ` Heinrich Schuchardt
@ 2021-09-25 13:40   ` Simon Glass
  1 sibling, 0 replies; 12+ messages in thread
From: Simon Glass @ 2021-09-25 13:40 UTC (permalink / raw)
  To: Mark Kettenis
  Cc: U-Boot Mailing List, Anatolij Gustschin, Heinrich Schuchardt,
	Alexander Graf

Hi Mark,

On Thu, 16 Sept 2021 at 07:02, Mark Kettenis <kettenis@openbsd.org> wrote:
>
> Provide correct framebuffer information for 30bpp modes.
>
> Signed-off-by: Mark Kettenis <kettenis@openbsd.org>
> ---
>  lib/efi_loader/efi_gop.c | 10 ++++++++++
>  1 file changed, 10 insertions(+)
>
> diff --git a/lib/efi_loader/efi_gop.c b/lib/efi_loader/efi_gop.c
> index 1206b2d7a2..42bf49b184 100644
> --- a/lib/efi_loader/efi_gop.c
> +++ b/lib/efi_loader/efi_gop.c
> @@ -227,6 +227,7 @@ static efi_uintn_t gop_get_bpp(struct efi_gop *this)
>
>         switch (gopobj->bpix) {
>  #ifdef CONFIG_DM_VIDEO
> +       case VIDEO_BPP30:
>         case VIDEO_BPP32:
>  #else
>         case LCD_COLOR32:
> @@ -468,6 +469,7 @@ efi_status_t efi_gop_register(void)
>         switch (bpix) {
>  #ifdef CONFIG_DM_VIDEO
>         case VIDEO_BPP16:
> +       case VIDEO_BPP30:
>         case VIDEO_BPP32:
>  #else
>         case LCD_COLOR32:
> @@ -518,6 +520,14 @@ efi_status_t efi_gop_register(void)
>  #endif
>         {
>                 gopobj->info.pixel_format = EFI_GOT_BGRA8;
> +#ifdef CONFIG_DM_VIDEO

Can avoid #ifdefs please? Does this work?

if (IS_ENABLED(CONFIG_DM_VIDEO) && IS_ENABLED(CONFIG_VIDEO_BPP30) &&
bpix == VIDEO_BPP30)

Heinrich might know if we can just require DM_VIDEO.

> +       } else if (bpix == VIDEO_BPP30) {
> +               gopobj->info.pixel_format = EFI_GOT_BITMASK;
> +               gopobj->info.pixel_bitmask[0] = 0x3ff00000; /* red */
> +               gopobj->info.pixel_bitmask[1] = 0x000ffc00; /* green */
> +               gopobj->info.pixel_bitmask[2] = 0x000003ff; /* blue */
> +               gopobj->info.pixel_bitmask[3] = 0xc0000000; /* reserved */
> +#endif
>         } else {
>                 gopobj->info.pixel_format = EFI_GOT_BITMASK;
>                 gopobj->info.pixel_bitmask[0] = 0xf800; /* red */
> --
> 2.33.0
>

Tested on: Macbook Air M1
Tested-by: Simon Glass <sjg@chromium.org>

Regards,
Simon

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 3/3] video: simplefb: Add 30bpp support
  2021-09-16 13:01 ` [PATCH 3/3] video: simplefb: " Mark Kettenis
@ 2021-09-25 13:41   ` Simon Glass
  0 siblings, 0 replies; 12+ messages in thread
From: Simon Glass @ 2021-09-25 13:41 UTC (permalink / raw)
  To: Mark Kettenis
  Cc: U-Boot Mailing List, Anatolij Gustschin, Heinrich Schuchardt,
	Alexander Graf

On Thu, 16 Sept 2021 at 07:02, Mark Kettenis <kettenis@openbsd.org> wrote:
>
> Recognize the canonical format strings for framebuffers in
> 30bpp mode.
>
> Signed-off-by: Mark Kettenis <kettenis@openbsd.org>
> ---
>  drivers/video/simplefb.c | 3 +++
>  1 file changed, 3 insertions(+)
>
> diff --git a/drivers/video/simplefb.c b/drivers/video/simplefb.c
> index fd58426cf5..7e1cc4560f 100644
> --- a/drivers/video/simplefb.c
> +++ b/drivers/video/simplefb.c
> @@ -52,6 +52,9 @@ static int simple_video_probe(struct udevice *dev)
>                 uc_priv->bpix = VIDEO_BPP16;
>         } else if (strcmp(format, "a8b8g8r8") == 0) {
>                 uc_priv->bpix = VIDEO_BPP32;
> +       } else if (strcmp(format, "a2r10g10b10") == 0 ||
> +                  strcmp(format, "x2r10g10b10") == 0) {
> +               uc_priv->bpix = VIDEO_BPP30;
>         } else {
>                 printf("%s: invalid format: %s\n", __func__, format);
>                 return -EINVAL;
> --
> 2.33.0
>

Reviewed-by: Simon Glass <sjg@chromium.org>
Tested on: Macbook Air M1
Tested-by: Simon Glass <sjg@chromium.org>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 1/3] video: Add 30bpp support
  2021-09-25 13:40   ` Simon Glass
@ 2021-09-25 16:55     ` Mark Kettenis
  0 siblings, 0 replies; 12+ messages in thread
From: Mark Kettenis @ 2021-09-25 16:55 UTC (permalink / raw)
  To: Simon Glass; +Cc: kettenis, u-boot, agust, xypron.glpk, agraf

> From: Simon Glass <sjg@chromium.org>
> Date: Sat, 25 Sep 2021 07:40:54 -0600
> 
> On Thu, 16 Sept 2021 at 07:01, Mark Kettenis <kettenis@openbsd.org> wrote:
> >
> > Add support for 30bpp mode where pixels are picked in 32-bit
> > integers but use 10 bits instead of 8 bits for each component.
> >
> > Signed-off-by: Mark Kettenis <kettenis@openbsd.org>
> > ---
> >  drivers/video/console_normal.c    | 2 ++
> >  drivers/video/console_rotate.c    | 6 ++++++
> >  drivers/video/console_truetype.c  | 3 +++
> >  drivers/video/vidconsole-uclass.c | 7 +++++++
> >  drivers/video/video-uclass.c      | 1 +
> >  include/video.h                   | 1 +
> >  6 files changed, 20 insertions(+)
> >
> > diff --git a/drivers/video/console_normal.c b/drivers/video/console_normal.c
> > index 04f022491e..e0b89cbb93 100644
> > --- a/drivers/video/console_normal.c
> > +++ b/drivers/video/console_normal.c
> > @@ -41,6 +41,7 @@ static int console_normal_set_row(struct udevice *dev, uint row, int clr)
> >                         end = dst;
> >                         break;
> >                 }
> > +       case VIDEO_BPP30:
> >         case VIDEO_BPP32:
> >                 if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
> >                         uint32_t *dst = line;
> > @@ -126,6 +127,7 @@ static int console_normal_putc_xy(struct udevice *dev, uint x_frac, uint y,
> >                                 }
> >                                 break;
> >                         }
> > +               case VIDEO_BPP30:
> >                 case VIDEO_BPP32:
> >                         if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
> >                                 uint32_t *dst = line;
> > diff --git a/drivers/video/console_rotate.c b/drivers/video/console_rotate.c
> > index 36c8d0609d..bf81b80a39 100644
> > --- a/drivers/video/console_rotate.c
> > +++ b/drivers/video/console_rotate.c
> > @@ -40,6 +40,7 @@ static int console_set_row_1(struct udevice *dev, uint row, int clr)
> >                                         *dst++ = clr;
> >                                 break;
> >                         }
> > +               case VIDEO_BPP30:
> >                 case VIDEO_BPP32:
> >                         if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
> >                                 uint32_t *dst = line;
> > @@ -128,6 +129,7 @@ static int console_putc_xy_1(struct udevice *dev, uint x_frac, uint y, char ch)
> >                                 }
> >                                 break;
> >                         }
> > +               case VIDEO_BPP30:
> >                 case VIDEO_BPP32:
> >                         if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
> >                                 uint32_t *dst = line;
> > @@ -183,6 +185,7 @@ static int console_set_row_2(struct udevice *dev, uint row, int clr)
> >                         end = dst;
> >                         break;
> >                 }
> > +       case VIDEO_BPP30:
> >         case VIDEO_BPP32:
> >                 if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
> >                         uint32_t *dst = line;
> > @@ -266,6 +269,7 @@ static int console_putc_xy_2(struct udevice *dev, uint x_frac, uint y, char ch)
> >                                 }
> >                                 break;
> >                         }
> > +               case VIDEO_BPP30:
> >                 case VIDEO_BPP32:
> >                         if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
> >                                 uint32_t *dst = line;
> > @@ -318,6 +322,7 @@ static int console_set_row_3(struct udevice *dev, uint row, int clr)
> >                                         *dst++ = clr;
> >                                 break;
> >                         }
> > +               case VIDEO_BPP30:
> >                 case VIDEO_BPP32:
> >                         if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
> >                                 uint32_t *dst = line;
> > @@ -402,6 +407,7 @@ static int console_putc_xy_3(struct udevice *dev, uint x_frac, uint y, char ch)
> >                                 }
> >                                 break;
> >                         }
> > +               case VIDEO_BPP30:
> >                 case VIDEO_BPP32:
> >                         if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
> >                                 uint32_t *dst = line;
> > diff --git a/drivers/video/console_truetype.c b/drivers/video/console_truetype.c
> > index 98427f4c61..0195d996de 100644
> > --- a/drivers/video/console_truetype.c
> > +++ b/drivers/video/console_truetype.c
> > @@ -153,6 +153,7 @@ static int console_truetype_set_row(struct udevice *dev, uint row, int clr)
> >         }
> >  #endif
> >  #ifdef CONFIG_VIDEO_BPP32
> > +       case VIDEO_BPP30:
> >         case VIDEO_BPP32: {
> >                 u32 *dst = line;
> >
> > @@ -299,6 +300,7 @@ static int console_truetype_putc_xy(struct udevice *dev, uint x, uint y,
> >                 }
> >  #endif
> >  #ifdef CONFIG_VIDEO_BPP32
> > +               case VIDEO_BPP30:
> >                 case VIDEO_BPP32: {
> >                         u32 *dst = (u32 *)line + xoff;
> >                         int i;
> > @@ -381,6 +383,7 @@ static int console_truetype_erase(struct udevice *dev, int xstart, int ystart,
> >                 }
> >  #endif
> >  #ifdef CONFIG_VIDEO_BPP32
> > +               case VIDEO_BPP30:
> >                 case VIDEO_BPP32: {
> >                         uint32_t *dst = line;
> >
> > diff --git a/drivers/video/vidconsole-uclass.c b/drivers/video/vidconsole-uclass.c
> > index 8132efa55a..cc274b45fe 100644
> > --- a/drivers/video/vidconsole-uclass.c
> > +++ b/drivers/video/vidconsole-uclass.c
> > @@ -153,6 +153,13 @@ u32 vid_console_color(struct video_priv *priv, unsigned int idx)
> >                                ((colors[idx].b >> 3) <<  0);
> >                 }
> >                 break;
> > +       case VIDEO_BPP30:
> > +               if (CONFIG_IS_ENABLED(VIDEO_BPP32)) {
> > +                       return (colors[idx].r << 22) |
> > +                              (colors[idx].g << 12) |
> > +                              (colors[idx].b <<  2);
> > +               }
> > +               break;
> >         case VIDEO_BPP32:
> >                 if (CONFIG_IS_ENABLED(VIDEO_BPP32)) {
> >                         return (colors[idx].r << 16) |
> > diff --git a/drivers/video/video-uclass.c b/drivers/video/video-uclass.c
> > index 9f8cf6ef2a..28bf701f41 100644
> > --- a/drivers/video/video-uclass.c
> > +++ b/drivers/video/video-uclass.c
> > @@ -129,6 +129,7 @@ int video_clear(struct udevice *dev)
> >                                 *ppix++ = priv->colour_bg;
> >                         break;
> >                 }
> > +       case VIDEO_BPP30:
> >         case VIDEO_BPP32:
> >                 if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
> >                         u32 *ppix = priv->fb;
> > diff --git a/include/video.h b/include/video.h
> > index 827733305e..04c636b317 100644
> > --- a/include/video.h
> > +++ b/include/video.
> > @@ -53,6 +53,7 @@ enum video_log2_bpp {
> >         VIDEO_BPP4,
> >         VIDEO_BPP8,
> >         VIDEO_BPP16,
> > +       VIDEO_BPP30,
> >         VIDEO_BPP32,
> >  };
> 
> This breaks the enuam here. See the comment above:
> 
> /*
>  * Bits per pixel selector. Each value n is such that the bits-per-pixel is
>  * 2 ^ n
>  */
> 
> Quite a few things rely on this, so there will need to be some
> changes. See for example VBNBYTE() immediately below.

Bleah.  I suppose I need a separate field in struct video_priv to keep
track of the pixel format then.

> Also don't you need a CONFIG_VIDEO_BPP30 ?

The idea was that the code additions were minimal enough for that not
to make sense.  But I'll need re-evaluate this after I figure out a
better way to distinguish between 8-bit and 10-bit color depth.

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2021-09-25 16:55 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-16 13:01 [PATCH 0/3] 30bpp framebuffer support Mark Kettenis
2021-09-16 13:01 ` [PATCH 1/3] video: Add 30bpp support Mark Kettenis
2021-09-25 13:40   ` Simon Glass
2021-09-25 16:55     ` Mark Kettenis
2021-09-16 13:01 ` [PATCH 2/3] efi_loader: GOP: " Mark Kettenis
2021-09-17  2:56   ` Heinrich Schuchardt
2021-09-17  9:23     ` Mark Kettenis
2021-09-17 11:29       ` Heinrich Schuchardt
2021-09-17 12:41         ` Mark Kettenis
2021-09-25 13:40   ` Simon Glass
2021-09-16 13:01 ` [PATCH 3/3] video: simplefb: " Mark Kettenis
2021-09-25 13:41   ` Simon Glass

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.