Re: [PATCH v8 09/14] drm: bridge: samsung-dsim: Add atomic_get_input_bus_fmts

2022-11-16 Thread Jagan Teki
On Wed, Nov 16, 2022 at 4:37 PM Marek Szyprowski
 wrote:
>
> On 16.11.2022 11:49, Marek Vasut wrote:
> > On 11/16/22 09:07, Marek Szyprowski wrote:
> >> On 15.11.2022 13:00, Marek Vasut wrote:
> >>> On 11/14/22 08:49, Jagan Teki wrote:
>  On Sun, Nov 13, 2022 at 5:51 AM Marek Vasut  wrote:
> >
> > On 11/10/22 19:38, Jagan Teki wrote:
> >> Finding the right input bus format throughout the pipeline is hard
> >> so add atomic_get_input_bus_fmts callback and initialize with the
> >> proper input format from list of supported output formats.
> >>
> >> This format can be used in pipeline for negotiating bus format
> >> between
> >> the DSI-end of this bridge and the other component closer to
> >> pipeline
> >> components.
> >>
> >> List of Pixel formats are taken from,
> >> AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022
> >> 3.7.4 Pixel formats
> >> Table 14. DSI pixel packing formats
> >>
> >> v8:
> >> * added pixel formats supported by NXP AN13573 i.MX 8/RT MIPI
> >> DSI/CSI-2
> >>
> >> v7, v6, v5, v4:
> >> * none
> >>
> >> v3:
> >> * include media-bus-format.h
> >>
> >> v2:
> >> * none
> >>
> >> v1:
> >> * new patch
> >>
> >> Signed-off-by: Jagan Teki 
> >> ---
> >> drivers/gpu/drm/bridge/samsung-dsim.c | 53
> >> +++
> >> 1 file changed, 53 insertions(+)
> >>
> >> diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c
> >> b/drivers/gpu/drm/bridge/samsung-dsim.c
> >> index 0fe153b29e4f..33e5ae9c865f 100644
> >> --- a/drivers/gpu/drm/bridge/samsung-dsim.c
> >> +++ b/drivers/gpu/drm/bridge/samsung-dsim.c
> >> @@ -15,6 +15,7 @@
> >> #include 
> >> #include 
> >> #include 
> >> +#include 
> >> #include 
> >> #include 
> >>
> >> @@ -1321,6 +1322,57 @@ static void
> >> samsung_dsim_atomic_post_disable(struct drm_bridge *bridge,
> >> pm_runtime_put_sync(dsi->dev);
> >> }
> >>
> >> +/*
> >> + * This pixel output formats list referenced from,
> >> + * AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022
> >> + * 3.7.4 Pixel formats
> >> + * Table 14. DSI pixel packing formats
> >> + */
> >> +static const u32 samsung_dsim_pixel_output_fmts[] = {
> >
> > You can also add :
> >
> > MEDIA_BUS_FMT_YUYV10_1X20
> >
> > MEDIA_BUS_FMT_YUYV12_1X24
> 
>  Are these for the below formats?
> 
>  "Loosely Packed Pixel Stream, 20-bit YCbCr, 4:2:2
> Packed Pixel Stream, 24-bit YCbCr, 4:2:2"
> >
> >> + MEDIA_BUS_FMT_UYVY8_1X16,
> >> + MEDIA_BUS_FMT_RGB101010_1X30,
> >> + MEDIA_BUS_FMT_RGB121212_1X36,
> >> + MEDIA_BUS_FMT_RGB565_1X16,
> >> + MEDIA_BUS_FMT_RGB666_1X18,
> >> + MEDIA_BUS_FMT_RGB888_1X24,
> >> +};
> >> +
> >> +static bool samsung_dsim_pixel_output_fmt_supported(u32 fmt)
> >> +{
> >> + int i;
> >> +
> >> + for (i = 0; i < ARRAY_SIZE(samsung_dsim_pixel_output_fmts);
> >> i++) {
> >> + if (samsung_dsim_pixel_output_fmts[i] == fmt)
> >> + return true;
> >> + }
> >> +
> >> + return false;
> >> +}
> >> +
> >> +static u32 *
> >> +samsung_dsim_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
> >> +struct drm_bridge_state
> >> *bridge_state,
> >> +struct drm_crtc_state
> >> *crtc_state,
> >> +struct drm_connector_state
> >> *conn_state,
> >> +u32 output_fmt,
> >> +unsigned int *num_input_fmts)
> >> +{
> >> + u32 *input_fmts;
> >> +
> >> + if (!samsung_dsim_pixel_output_fmt_supported(output_fmt))
> >> + return NULL;
> >> +
> >> + *num_input_fmts = 1;
> >
> > Shouldn't this be 6 ?
> >
> >> + input_fmts = kmalloc(sizeof(*input_fmts), GFP_KERNEL);
> >> + if (!input_fmts)
> >> + return NULL;
> >> +
> >> + input_fmts[0] = output_fmt;
> >
> > Shouldn't this be a list of all 6 supported pixel formats ?
> 
>  Negotiation would settle to return one input_fmt from the list of
>  supporting output_fmts. so the num_input_fmts would be 1 rather than
>  the number of fmts in the supporting list. This is what I understood
>  from the atomic_get_input_bus_fmts API. let me know if I miss
>  something here.
> >>>
> >>> How does the negotiation work for this kind of pipeline:
> >>>
> >>> LCDIFv3<->DSIM<->HDMI bridge<->HDMI connector
> >>>
> >>> where all elements (LCDIFv3, DSIM, HDMI bridge) can support either
> >>> RGB888 or packed YUV422 ?
> >>>
> >>> Who decides 

Re: [PATCH v8 09/14] drm: bridge: samsung-dsim: Add atomic_get_input_bus_fmts

2022-11-16 Thread Marek Szyprowski
On 16.11.2022 11:49, Marek Vasut wrote:
> On 11/16/22 09:07, Marek Szyprowski wrote:
>> On 15.11.2022 13:00, Marek Vasut wrote:
>>> On 11/14/22 08:49, Jagan Teki wrote:
 On Sun, Nov 13, 2022 at 5:51 AM Marek Vasut  wrote:
>
> On 11/10/22 19:38, Jagan Teki wrote:
>> Finding the right input bus format throughout the pipeline is hard
>> so add atomic_get_input_bus_fmts callback and initialize with the
>> proper input format from list of supported output formats.
>>
>> This format can be used in pipeline for negotiating bus format 
>> between
>> the DSI-end of this bridge and the other component closer to 
>> pipeline
>> components.
>>
>> List of Pixel formats are taken from,
>> AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022
>> 3.7.4 Pixel formats
>> Table 14. DSI pixel packing formats
>>
>> v8:
>> * added pixel formats supported by NXP AN13573 i.MX 8/RT MIPI
>> DSI/CSI-2
>>
>> v7, v6, v5, v4:
>> * none
>>
>> v3:
>> * include media-bus-format.h
>>
>> v2:
>> * none
>>
>> v1:
>> * new patch
>>
>> Signed-off-by: Jagan Teki 
>> ---
>>     drivers/gpu/drm/bridge/samsung-dsim.c | 53
>> +++
>>     1 file changed, 53 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c
>> b/drivers/gpu/drm/bridge/samsung-dsim.c
>> index 0fe153b29e4f..33e5ae9c865f 100644
>> --- a/drivers/gpu/drm/bridge/samsung-dsim.c
>> +++ b/drivers/gpu/drm/bridge/samsung-dsim.c
>> @@ -15,6 +15,7 @@
>>     #include 
>>     #include 
>>     #include 
>> +#include 
>>     #include 
>>     #include 
>>
>> @@ -1321,6 +1322,57 @@ static void
>> samsung_dsim_atomic_post_disable(struct drm_bridge *bridge,
>>     pm_runtime_put_sync(dsi->dev);
>>     }
>>
>> +/*
>> + * This pixel output formats list referenced from,
>> + * AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022
>> + * 3.7.4 Pixel formats
>> + * Table 14. DSI pixel packing formats
>> + */
>> +static const u32 samsung_dsim_pixel_output_fmts[] = {
>
> You can also add :
>
> MEDIA_BUS_FMT_YUYV10_1X20
>
> MEDIA_BUS_FMT_YUYV12_1X24

 Are these for the below formats?

 "Loosely Packed Pixel Stream, 20-bit YCbCr, 4:2:2
    Packed Pixel Stream, 24-bit YCbCr, 4:2:2"
>
>> + MEDIA_BUS_FMT_UYVY8_1X16,
>> + MEDIA_BUS_FMT_RGB101010_1X30,
>> + MEDIA_BUS_FMT_RGB121212_1X36,
>> + MEDIA_BUS_FMT_RGB565_1X16,
>> + MEDIA_BUS_FMT_RGB666_1X18,
>> + MEDIA_BUS_FMT_RGB888_1X24,
>> +};
>> +
>> +static bool samsung_dsim_pixel_output_fmt_supported(u32 fmt)
>> +{
>> + int i;
>> +
>> + for (i = 0; i < ARRAY_SIZE(samsung_dsim_pixel_output_fmts);
>> i++) {
>> + if (samsung_dsim_pixel_output_fmts[i] == fmt)
>> + return true;
>> + }
>> +
>> + return false;
>> +}
>> +
>> +static u32 *
>> +samsung_dsim_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
>> +    struct drm_bridge_state
>> *bridge_state,
>> +    struct drm_crtc_state
>> *crtc_state,
>> +    struct drm_connector_state
>> *conn_state,
>> +    u32 output_fmt,
>> +    unsigned int *num_input_fmts)
>> +{
>> + u32 *input_fmts;
>> +
>> + if (!samsung_dsim_pixel_output_fmt_supported(output_fmt))
>> + return NULL;
>> +
>> + *num_input_fmts = 1;
>
> Shouldn't this be 6 ?
>
>> + input_fmts = kmalloc(sizeof(*input_fmts), GFP_KERNEL);
>> + if (!input_fmts)
>> + return NULL;
>> +
>> + input_fmts[0] = output_fmt;
>
> Shouldn't this be a list of all 6 supported pixel formats ?

 Negotiation would settle to return one input_fmt from the list of
 supporting output_fmts. so the num_input_fmts would be 1 rather than
 the number of fmts in the supporting list. This is what I understood
 from the atomic_get_input_bus_fmts API. let me know if I miss
 something here.
>>>
>>> How does the negotiation work for this kind of pipeline:
>>>
>>> LCDIFv3<->DSIM<->HDMI bridge<->HDMI connector
>>>
>>> where all elements (LCDIFv3, DSIM, HDMI bridge) can support either
>>> RGB888 or packed YUV422 ?
>>>
>>> Who decides the format used by such pipeline ?
>>>
>>> Why should it be the DSIM bridge and not e.g. the HDMI bridge or the
>>> LCDIFv3 ?
>>
>>
>> If I got it right, the drivers reports their preference for the returned
>> formats. The format that is first in the reported array is the most
>> preferred one. This probably means that in your case the HDMI 

Re: [PATCH v8 09/14] drm: bridge: samsung-dsim: Add atomic_get_input_bus_fmts

2022-11-16 Thread Marek Vasut

On 11/16/22 09:07, Marek Szyprowski wrote:

On 15.11.2022 13:00, Marek Vasut wrote:

On 11/14/22 08:49, Jagan Teki wrote:

On Sun, Nov 13, 2022 at 5:51 AM Marek Vasut  wrote:


On 11/10/22 19:38, Jagan Teki wrote:

Finding the right input bus format throughout the pipeline is hard
so add atomic_get_input_bus_fmts callback and initialize with the
proper input format from list of supported output formats.

This format can be used in pipeline for negotiating bus format between
the DSI-end of this bridge and the other component closer to pipeline
components.

List of Pixel formats are taken from,
AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022
3.7.4 Pixel formats
Table 14. DSI pixel packing formats

v8:
* added pixel formats supported by NXP AN13573 i.MX 8/RT MIPI
DSI/CSI-2

v7, v6, v5, v4:
* none

v3:
* include media-bus-format.h

v2:
* none

v1:
* new patch

Signed-off-by: Jagan Teki 
---
    drivers/gpu/drm/bridge/samsung-dsim.c | 53
+++
    1 file changed, 53 insertions(+)

diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c
b/drivers/gpu/drm/bridge/samsung-dsim.c
index 0fe153b29e4f..33e5ae9c865f 100644
--- a/drivers/gpu/drm/bridge/samsung-dsim.c
+++ b/drivers/gpu/drm/bridge/samsung-dsim.c
@@ -15,6 +15,7 @@
    #include 
    #include 
    #include 
+#include 
    #include 
    #include 

@@ -1321,6 +1322,57 @@ static void
samsung_dsim_atomic_post_disable(struct drm_bridge *bridge,
    pm_runtime_put_sync(dsi->dev);
    }

+/*
+ * This pixel output formats list referenced from,
+ * AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022
+ * 3.7.4 Pixel formats
+ * Table 14. DSI pixel packing formats
+ */
+static const u32 samsung_dsim_pixel_output_fmts[] = {


You can also add :

MEDIA_BUS_FMT_YUYV10_1X20

MEDIA_BUS_FMT_YUYV12_1X24


Are these for the below formats?

"Loosely Packed Pixel Stream, 20-bit YCbCr, 4:2:2
   Packed Pixel Stream, 24-bit YCbCr, 4:2:2"



+ MEDIA_BUS_FMT_UYVY8_1X16,
+ MEDIA_BUS_FMT_RGB101010_1X30,
+ MEDIA_BUS_FMT_RGB121212_1X36,
+ MEDIA_BUS_FMT_RGB565_1X16,
+ MEDIA_BUS_FMT_RGB666_1X18,
+ MEDIA_BUS_FMT_RGB888_1X24,
+};
+
+static bool samsung_dsim_pixel_output_fmt_supported(u32 fmt)
+{
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(samsung_dsim_pixel_output_fmts);
i++) {
+ if (samsung_dsim_pixel_output_fmts[i] == fmt)
+ return true;
+ }
+
+ return false;
+}
+
+static u32 *
+samsung_dsim_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
+    struct drm_bridge_state
*bridge_state,
+    struct drm_crtc_state
*crtc_state,
+    struct drm_connector_state
*conn_state,
+    u32 output_fmt,
+    unsigned int *num_input_fmts)
+{
+ u32 *input_fmts;
+
+ if (!samsung_dsim_pixel_output_fmt_supported(output_fmt))
+ return NULL;
+
+ *num_input_fmts = 1;


Shouldn't this be 6 ?


+ input_fmts = kmalloc(sizeof(*input_fmts), GFP_KERNEL);
+ if (!input_fmts)
+ return NULL;
+
+ input_fmts[0] = output_fmt;


Shouldn't this be a list of all 6 supported pixel formats ?


Negotiation would settle to return one input_fmt from the list of
supporting output_fmts. so the num_input_fmts would be 1 rather than
the number of fmts in the supporting list. This is what I understood
from the atomic_get_input_bus_fmts API. let me know if I miss
something here.


How does the negotiation work for this kind of pipeline:

LCDIFv3<->DSIM<->HDMI bridge<->HDMI connector

where all elements (LCDIFv3, DSIM, HDMI bridge) can support either
RGB888 or packed YUV422 ?

Who decides the format used by such pipeline ?

Why should it be the DSIM bridge and not e.g. the HDMI bridge or the
LCDIFv3 ?



If I got it right, the drivers reports their preference for the returned
formats. The format that is first in the reported array is the most
preferred one. This probably means that in your case the HDMI bridge
decides by reporting RGB or YUV first (if all elements supports both).


But in that case, we need to list input_fmts[0]...input_fmts[n-1] in 
samsung_dsim_atomic_get_input_bus_fmts() and also set *num_input_fmts = 
n, correct ?


Re: [PATCH v8 09/14] drm: bridge: samsung-dsim: Add atomic_get_input_bus_fmts

2022-11-16 Thread Marek Szyprowski
On 15.11.2022 13:00, Marek Vasut wrote:
> On 11/14/22 08:49, Jagan Teki wrote:
>> On Sun, Nov 13, 2022 at 5:51 AM Marek Vasut  wrote:
>>>
>>> On 11/10/22 19:38, Jagan Teki wrote:
 Finding the right input bus format throughout the pipeline is hard
 so add atomic_get_input_bus_fmts callback and initialize with the
 proper input format from list of supported output formats.

 This format can be used in pipeline for negotiating bus format between
 the DSI-end of this bridge and the other component closer to pipeline
 components.

 List of Pixel formats are taken from,
 AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022
 3.7.4 Pixel formats
 Table 14. DSI pixel packing formats

 v8:
 * added pixel formats supported by NXP AN13573 i.MX 8/RT MIPI 
 DSI/CSI-2

 v7, v6, v5, v4:
 * none

 v3:
 * include media-bus-format.h

 v2:
 * none

 v1:
 * new patch

 Signed-off-by: Jagan Teki 
 ---
    drivers/gpu/drm/bridge/samsung-dsim.c | 53 
 +++
    1 file changed, 53 insertions(+)

 diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c 
 b/drivers/gpu/drm/bridge/samsung-dsim.c
 index 0fe153b29e4f..33e5ae9c865f 100644
 --- a/drivers/gpu/drm/bridge/samsung-dsim.c
 +++ b/drivers/gpu/drm/bridge/samsung-dsim.c
 @@ -15,6 +15,7 @@
    #include 
    #include 
    #include 
 +#include 
    #include 
    #include 

 @@ -1321,6 +1322,57 @@ static void 
 samsung_dsim_atomic_post_disable(struct drm_bridge *bridge,
    pm_runtime_put_sync(dsi->dev);
    }

 +/*
 + * This pixel output formats list referenced from,
 + * AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022
 + * 3.7.4 Pixel formats
 + * Table 14. DSI pixel packing formats
 + */
 +static const u32 samsung_dsim_pixel_output_fmts[] = {
>>>
>>> You can also add :
>>>
>>> MEDIA_BUS_FMT_YUYV10_1X20
>>>
>>> MEDIA_BUS_FMT_YUYV12_1X24
>>
>> Are these for the below formats?
>>
>> "Loosely Packed Pixel Stream, 20-bit YCbCr, 4:2:2
>>   Packed Pixel Stream, 24-bit YCbCr, 4:2:2"
>>>
 + MEDIA_BUS_FMT_UYVY8_1X16,
 + MEDIA_BUS_FMT_RGB101010_1X30,
 + MEDIA_BUS_FMT_RGB121212_1X36,
 + MEDIA_BUS_FMT_RGB565_1X16,
 + MEDIA_BUS_FMT_RGB666_1X18,
 + MEDIA_BUS_FMT_RGB888_1X24,
 +};
 +
 +static bool samsung_dsim_pixel_output_fmt_supported(u32 fmt)
 +{
 + int i;
 +
 + for (i = 0; i < ARRAY_SIZE(samsung_dsim_pixel_output_fmts); 
 i++) {
 + if (samsung_dsim_pixel_output_fmts[i] == fmt)
 + return true;
 + }
 +
 + return false;
 +}
 +
 +static u32 *
 +samsung_dsim_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
 +    struct drm_bridge_state 
 *bridge_state,
 +    struct drm_crtc_state 
 *crtc_state,
 +    struct drm_connector_state 
 *conn_state,
 +    u32 output_fmt,
 +    unsigned int *num_input_fmts)
 +{
 + u32 *input_fmts;
 +
 + if (!samsung_dsim_pixel_output_fmt_supported(output_fmt))
 + return NULL;
 +
 + *num_input_fmts = 1;
>>>
>>> Shouldn't this be 6 ?
>>>
 + input_fmts = kmalloc(sizeof(*input_fmts), GFP_KERNEL);
 + if (!input_fmts)
 + return NULL;
 +
 + input_fmts[0] = output_fmt;
>>>
>>> Shouldn't this be a list of all 6 supported pixel formats ?
>>
>> Negotiation would settle to return one input_fmt from the list of
>> supporting output_fmts. so the num_input_fmts would be 1 rather than
>> the number of fmts in the supporting list. This is what I understood
>> from the atomic_get_input_bus_fmts API. let me know if I miss
>> something here.
>
> How does the negotiation work for this kind of pipeline:
>
> LCDIFv3<->DSIM<->HDMI bridge<->HDMI connector
>
> where all elements (LCDIFv3, DSIM, HDMI bridge) can support either 
> RGB888 or packed YUV422 ?
>
> Who decides the format used by such pipeline ?
>
> Why should it be the DSIM bridge and not e.g. the HDMI bridge or the 
> LCDIFv3 ?


If I got it right, the drivers reports their preference for the returned 
formats. The format that is first in the reported array is the most 
preferred one. This probably means that in your case the HDMI bridge 
decides by reporting RGB or YUV first (if all elements supports both).


Best regards
-- 
Marek Szyprowski, PhD
Samsung R Institute Poland



Re: [PATCH v8 09/14] drm: bridge: samsung-dsim: Add atomic_get_input_bus_fmts

2022-11-15 Thread Marek Szyprowski
Hi Jagan,

On 15.11.2022 10:20, Jagan Teki wrote:
> On Tue, Nov 15, 2022 at 2:18 PM Frieder Schrempf
>  wrote:
>> On 15.11.22 09:09, Marek Szyprowski wrote:
>>> On 14.11.2022 18:07, Jagan Teki wrote:
 On Mon, Nov 14, 2022 at 8:10 PM Marek Szyprowski
  wrote:
> On 14.11.2022 11:57, Marek Szyprowski wrote:
>> On 10.11.2022 19:38, Jagan Teki wrote:
>>> Finding the right input bus format throughout the pipeline is hard
>>> so add atomic_get_input_bus_fmts callback and initialize with the
>>> proper input format from list of supported output formats.
>>>
>>> This format can be used in pipeline for negotiating bus format between
>>> the DSI-end of this bridge and the other component closer to pipeline
>>> components.
>>>
>>> List of Pixel formats are taken from,
>>> AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022
>>> 3.7.4 Pixel formats
>>> Table 14. DSI pixel packing formats
>>>
>>> v8:
>>> * added pixel formats supported by NXP AN13573 i.MX 8/RT MIPI DSI/CSI-2
>>>
>>> v7, v6, v5, v4:
>>> * none
>>>
>>> v3:
>>> * include media-bus-format.h
>>>
>>> v2:
>>> * none
>>>
>>> v1:
>>> * new patch
>>>
>>> Signed-off-by: Jagan Teki 
>>> ---
>>> drivers/gpu/drm/bridge/samsung-dsim.c | 53 
>>> +++
>>> 1 file changed, 53 insertions(+)
>>>
>>> diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c
>>> b/drivers/gpu/drm/bridge/samsung-dsim.c
>>> index 0fe153b29e4f..33e5ae9c865f 100644
>>> --- a/drivers/gpu/drm/bridge/samsung-dsim.c
>>> +++ b/drivers/gpu/drm/bridge/samsung-dsim.c
>>> @@ -15,6 +15,7 @@
>>> #include 
>>> #include 
>>> #include 
>>> +#include 
>>> #include 
>>> #include 
>>> @@ -1321,6 +1322,57 @@ static void
>>> samsung_dsim_atomic_post_disable(struct drm_bridge *bridge,
>>> pm_runtime_put_sync(dsi->dev);
>>> }
>>> +/*
>>> + * This pixel output formats list referenced from,
>>> + * AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022
>>> + * 3.7.4 Pixel formats
>>> + * Table 14. DSI pixel packing formats
>>> + */
>>> +static const u32 samsung_dsim_pixel_output_fmts[] = {
>>> +MEDIA_BUS_FMT_UYVY8_1X16,
>>> +MEDIA_BUS_FMT_RGB101010_1X30,
>>> +MEDIA_BUS_FMT_RGB121212_1X36,
>>> +MEDIA_BUS_FMT_RGB565_1X16,
>>> +MEDIA_BUS_FMT_RGB666_1X18,
>>> +MEDIA_BUS_FMT_RGB888_1X24,
>>> +};
>>> +
>>> +static bool samsung_dsim_pixel_output_fmt_supported(u32 fmt)
>>> +{
>>> +int i;
>>> +
>>> +for (i = 0; i < ARRAY_SIZE(samsung_dsim_pixel_output_fmts); i++) {
>>> +if (samsung_dsim_pixel_output_fmts[i] == fmt)
>>> +return true;
>>> +}
>>> +
>>> +return false;
>>> +}
>>> +
>>> +static u32 *
>>> +samsung_dsim_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
>>> +   struct drm_bridge_state *bridge_state,
>>> +   struct drm_crtc_state *crtc_state,
>>> +   struct drm_connector_state *conn_state,
>>> +   u32 output_fmt,
>>> +   unsigned int *num_input_fmts)
>>> +{
>>> +u32 *input_fmts;
>>> +
>>> +if (!samsung_dsim_pixel_output_fmt_supported(output_fmt))
>>> +return NULL;
>> Please add support for MEDIA_BUS_FMT_FIXED and maybe default to
>> MEDIA_BUS_FMT_RGB888_1X24 if requested format is not matched.
>>
>> Otherwise the above check breaks all current clients of the Samsung
>> DSIM/Exynos DSI. I didn't dig into the bus matching code yet, but all
>> DSI panels requests such format on my test systems...
> I've checked a bit more the bus format related code and it looks that
> there are more issues. The DSI panels don't use the MEDIA_BUS_FMT_*
> formats thus the bridge negotiation code selects MEDIA_BUS_FMT_FIXED for
> them. On Arndale board with Toshiba tc358764 bridge the
> MEDIA_BUS_FMT_RGB888_1X7X4_SPWG output_fmt is requested in
> samsung_dsim_atomic_get_input_bus_fmts() (forwarded from the LVDS panel,
 dsim => tc358764 => panel-simple

 If I understand the bridge format negotiation correctly - If
 atomic_get_input_bus_fmts is not implemented in tc358764 then
 MEDIA_BUS_FMT_FIXED will be the output_fmt for dsim so we can assign
 MEDIA_BUS_FMT_RGB888_1X24 for FIXED formats.

 from include/drm/drm_bridge.h:

* This method is called on all elements of the bridge chain as 
 part of
* the bus format negotiation process that happens in
* drm_atomic_bridge_chain_select_bus_fmts().
* This method is optional. When not implemented, the core will 
 bypass
* bus 

Re: [PATCH v8 09/14] drm: bridge: samsung-dsim: Add atomic_get_input_bus_fmts

2022-11-15 Thread Marek Vasut

On 11/14/22 08:49, Jagan Teki wrote:

On Sun, Nov 13, 2022 at 5:51 AM Marek Vasut  wrote:


On 11/10/22 19:38, Jagan Teki wrote:

Finding the right input bus format throughout the pipeline is hard
so add atomic_get_input_bus_fmts callback and initialize with the
proper input format from list of supported output formats.

This format can be used in pipeline for negotiating bus format between
the DSI-end of this bridge and the other component closer to pipeline
components.

List of Pixel formats are taken from,
AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022
3.7.4 Pixel formats
Table 14. DSI pixel packing formats

v8:
* added pixel formats supported by NXP AN13573 i.MX 8/RT MIPI DSI/CSI-2

v7, v6, v5, v4:
* none

v3:
* include media-bus-format.h

v2:
* none

v1:
* new patch

Signed-off-by: Jagan Teki 
---
   drivers/gpu/drm/bridge/samsung-dsim.c | 53 +++
   1 file changed, 53 insertions(+)

diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c 
b/drivers/gpu/drm/bridge/samsung-dsim.c
index 0fe153b29e4f..33e5ae9c865f 100644
--- a/drivers/gpu/drm/bridge/samsung-dsim.c
+++ b/drivers/gpu/drm/bridge/samsung-dsim.c
@@ -15,6 +15,7 @@
   #include 
   #include 
   #include 
+#include 
   #include 
   #include 

@@ -1321,6 +1322,57 @@ static void samsung_dsim_atomic_post_disable(struct 
drm_bridge *bridge,
   pm_runtime_put_sync(dsi->dev);
   }

+/*
+ * This pixel output formats list referenced from,
+ * AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022
+ * 3.7.4 Pixel formats
+ * Table 14. DSI pixel packing formats
+ */
+static const u32 samsung_dsim_pixel_output_fmts[] = {


You can also add :

MEDIA_BUS_FMT_YUYV10_1X20

MEDIA_BUS_FMT_YUYV12_1X24


Are these for the below formats?

"Loosely Packed Pixel Stream, 20-bit YCbCr, 4:2:2
  Packed Pixel Stream, 24-bit YCbCr, 4:2:2"



+ MEDIA_BUS_FMT_UYVY8_1X16,
+ MEDIA_BUS_FMT_RGB101010_1X30,
+ MEDIA_BUS_FMT_RGB121212_1X36,
+ MEDIA_BUS_FMT_RGB565_1X16,
+ MEDIA_BUS_FMT_RGB666_1X18,
+ MEDIA_BUS_FMT_RGB888_1X24,
+};
+
+static bool samsung_dsim_pixel_output_fmt_supported(u32 fmt)
+{
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(samsung_dsim_pixel_output_fmts); i++) {
+ if (samsung_dsim_pixel_output_fmts[i] == fmt)
+ return true;
+ }
+
+ return false;
+}
+
+static u32 *
+samsung_dsim_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
+struct drm_bridge_state *bridge_state,
+struct drm_crtc_state *crtc_state,
+struct drm_connector_state *conn_state,
+u32 output_fmt,
+unsigned int *num_input_fmts)
+{
+ u32 *input_fmts;
+
+ if (!samsung_dsim_pixel_output_fmt_supported(output_fmt))
+ return NULL;
+
+ *num_input_fmts = 1;


Shouldn't this be 6 ?


+ input_fmts = kmalloc(sizeof(*input_fmts), GFP_KERNEL);
+ if (!input_fmts)
+ return NULL;
+
+ input_fmts[0] = output_fmt;


Shouldn't this be a list of all 6 supported pixel formats ?


Negotiation would settle to return one input_fmt from the list of
supporting output_fmts. so the num_input_fmts would be 1 rather than
the number of fmts in the supporting list. This is what I understood
from the atomic_get_input_bus_fmts API. let me know if I miss
something here.


How does the negotiation work for this kind of pipeline:

LCDIFv3<->DSIM<->HDMI bridge<->HDMI connector

where all elements (LCDIFv3, DSIM, HDMI bridge) can support either 
RGB888 or packed YUV422 ?


Who decides the format used by such pipeline ?

Why should it be the DSIM bridge and not e.g. the HDMI bridge or the 
LCDIFv3 ?


Re: [PATCH v8 09/14] drm: bridge: samsung-dsim: Add atomic_get_input_bus_fmts

2022-11-15 Thread Jagan Teki
On Tue, Nov 15, 2022 at 2:18 PM Frieder Schrempf
 wrote:
>
> On 15.11.22 09:09, Marek Szyprowski wrote:
> > Hi Jagan,
> >
> > On 14.11.2022 18:07, Jagan Teki wrote:
> >> On Mon, Nov 14, 2022 at 8:10 PM Marek Szyprowski
> >>  wrote:
> >>> On 14.11.2022 11:57, Marek Szyprowski wrote:
>  On 10.11.2022 19:38, Jagan Teki wrote:
> > Finding the right input bus format throughout the pipeline is hard
> > so add atomic_get_input_bus_fmts callback and initialize with the
> > proper input format from list of supported output formats.
> >
> > This format can be used in pipeline for negotiating bus format between
> > the DSI-end of this bridge and the other component closer to pipeline
> > components.
> >
> > List of Pixel formats are taken from,
> > AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022
> > 3.7.4 Pixel formats
> > Table 14. DSI pixel packing formats
> >
> > v8:
> > * added pixel formats supported by NXP AN13573 i.MX 8/RT MIPI DSI/CSI-2
> >
> > v7, v6, v5, v4:
> > * none
> >
> > v3:
> > * include media-bus-format.h
> >
> > v2:
> > * none
> >
> > v1:
> > * new patch
> >
> > Signed-off-by: Jagan Teki 
> > ---
> >drivers/gpu/drm/bridge/samsung-dsim.c | 53 
> > +++
> >1 file changed, 53 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c
> > b/drivers/gpu/drm/bridge/samsung-dsim.c
> > index 0fe153b29e4f..33e5ae9c865f 100644
> > --- a/drivers/gpu/drm/bridge/samsung-dsim.c
> > +++ b/drivers/gpu/drm/bridge/samsung-dsim.c
> > @@ -15,6 +15,7 @@
> >#include 
> >#include 
> >#include 
> > +#include 
> >#include 
> >#include 
> >@@ -1321,6 +1322,57 @@ static void
> > samsung_dsim_atomic_post_disable(struct drm_bridge *bridge,
> >pm_runtime_put_sync(dsi->dev);
> >}
> >+/*
> > + * This pixel output formats list referenced from,
> > + * AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022
> > + * 3.7.4 Pixel formats
> > + * Table 14. DSI pixel packing formats
> > + */
> > +static const u32 samsung_dsim_pixel_output_fmts[] = {
> > +MEDIA_BUS_FMT_UYVY8_1X16,
> > +MEDIA_BUS_FMT_RGB101010_1X30,
> > +MEDIA_BUS_FMT_RGB121212_1X36,
> > +MEDIA_BUS_FMT_RGB565_1X16,
> > +MEDIA_BUS_FMT_RGB666_1X18,
> > +MEDIA_BUS_FMT_RGB888_1X24,
> > +};
> > +
> > +static bool samsung_dsim_pixel_output_fmt_supported(u32 fmt)
> > +{
> > +int i;
> > +
> > +for (i = 0; i < ARRAY_SIZE(samsung_dsim_pixel_output_fmts); i++) {
> > +if (samsung_dsim_pixel_output_fmts[i] == fmt)
> > +return true;
> > +}
> > +
> > +return false;
> > +}
> > +
> > +static u32 *
> > +samsung_dsim_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
> > +   struct drm_bridge_state *bridge_state,
> > +   struct drm_crtc_state *crtc_state,
> > +   struct drm_connector_state *conn_state,
> > +   u32 output_fmt,
> > +   unsigned int *num_input_fmts)
> > +{
> > +u32 *input_fmts;
> > +
> > +if (!samsung_dsim_pixel_output_fmt_supported(output_fmt))
> > +return NULL;
> 
>  Please add support for MEDIA_BUS_FMT_FIXED and maybe default to
>  MEDIA_BUS_FMT_RGB888_1X24 if requested format is not matched.
> 
>  Otherwise the above check breaks all current clients of the Samsung
>  DSIM/Exynos DSI. I didn't dig into the bus matching code yet, but all
>  DSI panels requests such format on my test systems...
> >>> I've checked a bit more the bus format related code and it looks that
> >>> there are more issues. The DSI panels don't use the MEDIA_BUS_FMT_*
> >>> formats thus the bridge negotiation code selects MEDIA_BUS_FMT_FIXED for
> >>> them. On Arndale board with Toshiba tc358764 bridge the
> >>> MEDIA_BUS_FMT_RGB888_1X7X4_SPWG output_fmt is requested in
> >>> samsung_dsim_atomic_get_input_bus_fmts() (forwarded from the LVDS panel,
> >> dsim => tc358764 => panel-simple
> >>
> >> If I understand the bridge format negotiation correctly - If
> >> atomic_get_input_bus_fmts is not implemented in tc358764 then
> >> MEDIA_BUS_FMT_FIXED will be the output_fmt for dsim so we can assign
> >> MEDIA_BUS_FMT_RGB888_1X24 for FIXED formats.
> >>
> >> from include/drm/drm_bridge.h:
> >>
> >>   * This method is called on all elements of the bridge chain as 
> >> part of
> >>   * the bus format negotiation process that happens in
> >>   * drm_atomic_bridge_chain_select_bus_fmts().
> >>   * This method is optional. When not implemented, the core will 
> >> bypass
> >>   * bus format negotiation on this element of the 

Re: [PATCH v8 09/14] drm: bridge: samsung-dsim: Add atomic_get_input_bus_fmts

2022-11-15 Thread Frieder Schrempf
On 15.11.22 09:09, Marek Szyprowski wrote:
> Hi Jagan,
> 
> On 14.11.2022 18:07, Jagan Teki wrote:
>> On Mon, Nov 14, 2022 at 8:10 PM Marek Szyprowski
>>  wrote:
>>> On 14.11.2022 11:57, Marek Szyprowski wrote:
 On 10.11.2022 19:38, Jagan Teki wrote:
> Finding the right input bus format throughout the pipeline is hard
> so add atomic_get_input_bus_fmts callback and initialize with the
> proper input format from list of supported output formats.
>
> This format can be used in pipeline for negotiating bus format between
> the DSI-end of this bridge and the other component closer to pipeline
> components.
>
> List of Pixel formats are taken from,
> AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022
> 3.7.4 Pixel formats
> Table 14. DSI pixel packing formats
>
> v8:
> * added pixel formats supported by NXP AN13573 i.MX 8/RT MIPI DSI/CSI-2
>
> v7, v6, v5, v4:
> * none
>
> v3:
> * include media-bus-format.h
>
> v2:
> * none
>
> v1:
> * new patch
>
> Signed-off-by: Jagan Teki 
> ---
>drivers/gpu/drm/bridge/samsung-dsim.c | 53 +++
>1 file changed, 53 insertions(+)
>
> diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c
> b/drivers/gpu/drm/bridge/samsung-dsim.c
> index 0fe153b29e4f..33e5ae9c865f 100644
> --- a/drivers/gpu/drm/bridge/samsung-dsim.c
> +++ b/drivers/gpu/drm/bridge/samsung-dsim.c
> @@ -15,6 +15,7 @@
>#include 
>#include 
>#include 
> +#include 
>#include 
>#include 
>@@ -1321,6 +1322,57 @@ static void
> samsung_dsim_atomic_post_disable(struct drm_bridge *bridge,
>pm_runtime_put_sync(dsi->dev);
>}
>+/*
> + * This pixel output formats list referenced from,
> + * AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022
> + * 3.7.4 Pixel formats
> + * Table 14. DSI pixel packing formats
> + */
> +static const u32 samsung_dsim_pixel_output_fmts[] = {
> +MEDIA_BUS_FMT_UYVY8_1X16,
> +MEDIA_BUS_FMT_RGB101010_1X30,
> +MEDIA_BUS_FMT_RGB121212_1X36,
> +MEDIA_BUS_FMT_RGB565_1X16,
> +MEDIA_BUS_FMT_RGB666_1X18,
> +MEDIA_BUS_FMT_RGB888_1X24,
> +};
> +
> +static bool samsung_dsim_pixel_output_fmt_supported(u32 fmt)
> +{
> +int i;
> +
> +for (i = 0; i < ARRAY_SIZE(samsung_dsim_pixel_output_fmts); i++) {
> +if (samsung_dsim_pixel_output_fmts[i] == fmt)
> +return true;
> +}
> +
> +return false;
> +}
> +
> +static u32 *
> +samsung_dsim_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
> +   struct drm_bridge_state *bridge_state,
> +   struct drm_crtc_state *crtc_state,
> +   struct drm_connector_state *conn_state,
> +   u32 output_fmt,
> +   unsigned int *num_input_fmts)
> +{
> +u32 *input_fmts;
> +
> +if (!samsung_dsim_pixel_output_fmt_supported(output_fmt))
> +return NULL;

 Please add support for MEDIA_BUS_FMT_FIXED and maybe default to
 MEDIA_BUS_FMT_RGB888_1X24 if requested format is not matched.

 Otherwise the above check breaks all current clients of the Samsung
 DSIM/Exynos DSI. I didn't dig into the bus matching code yet, but all
 DSI panels requests such format on my test systems...
>>> I've checked a bit more the bus format related code and it looks that
>>> there are more issues. The DSI panels don't use the MEDIA_BUS_FMT_*
>>> formats thus the bridge negotiation code selects MEDIA_BUS_FMT_FIXED for
>>> them. On Arndale board with Toshiba tc358764 bridge the
>>> MEDIA_BUS_FMT_RGB888_1X7X4_SPWG output_fmt is requested in
>>> samsung_dsim_atomic_get_input_bus_fmts() (forwarded from the LVDS panel,
>> dsim => tc358764 => panel-simple
>>
>> If I understand the bridge format negotiation correctly - If
>> atomic_get_input_bus_fmts is not implemented in tc358764 then
>> MEDIA_BUS_FMT_FIXED will be the output_fmt for dsim so we can assign
>> MEDIA_BUS_FMT_RGB888_1X24 for FIXED formats.
>>
>> from include/drm/drm_bridge.h:
>>
>>   * This method is called on all elements of the bridge chain as 
>> part of
>>   * the bus format negotiation process that happens in
>>   * drm_atomic_bridge_chain_select_bus_fmts().
>>   * This method is optional. When not implemented, the core will 
>> bypass
>>   * bus format negotiation on this element of the bridge without
>>   * failing, and the previous element in the chain will be passed
>>   * MEDIA_BUS_FMT_FIXED as its output bus format.
>>
>> As I can see tc358764 is not implemented either
>> atomic_get_input_bus_fmts or atomic API, so I think dsim gets the
>> MEDIA_BUS_FMT_FIXED bridge pipeline. I 

Re: [PATCH v8 09/14] drm: bridge: samsung-dsim: Add atomic_get_input_bus_fmts

2022-11-15 Thread Marek Szyprowski
Hi Jagan,

On 14.11.2022 18:07, Jagan Teki wrote:
> On Mon, Nov 14, 2022 at 8:10 PM Marek Szyprowski
>  wrote:
>> On 14.11.2022 11:57, Marek Szyprowski wrote:
>>> On 10.11.2022 19:38, Jagan Teki wrote:
 Finding the right input bus format throughout the pipeline is hard
 so add atomic_get_input_bus_fmts callback and initialize with the
 proper input format from list of supported output formats.

 This format can be used in pipeline for negotiating bus format between
 the DSI-end of this bridge and the other component closer to pipeline
 components.

 List of Pixel formats are taken from,
 AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022
 3.7.4 Pixel formats
 Table 14. DSI pixel packing formats

 v8:
 * added pixel formats supported by NXP AN13573 i.MX 8/RT MIPI DSI/CSI-2

 v7, v6, v5, v4:
 * none

 v3:
 * include media-bus-format.h

 v2:
 * none

 v1:
 * new patch

 Signed-off-by: Jagan Teki 
 ---
drivers/gpu/drm/bridge/samsung-dsim.c | 53 +++
1 file changed, 53 insertions(+)

 diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c
 b/drivers/gpu/drm/bridge/samsung-dsim.c
 index 0fe153b29e4f..33e5ae9c865f 100644
 --- a/drivers/gpu/drm/bridge/samsung-dsim.c
 +++ b/drivers/gpu/drm/bridge/samsung-dsim.c
 @@ -15,6 +15,7 @@
#include 
#include 
#include 
 +#include 
#include 
#include 
@@ -1321,6 +1322,57 @@ static void
 samsung_dsim_atomic_post_disable(struct drm_bridge *bridge,
pm_runtime_put_sync(dsi->dev);
}
+/*
 + * This pixel output formats list referenced from,
 + * AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022
 + * 3.7.4 Pixel formats
 + * Table 14. DSI pixel packing formats
 + */
 +static const u32 samsung_dsim_pixel_output_fmts[] = {
 +MEDIA_BUS_FMT_UYVY8_1X16,
 +MEDIA_BUS_FMT_RGB101010_1X30,
 +MEDIA_BUS_FMT_RGB121212_1X36,
 +MEDIA_BUS_FMT_RGB565_1X16,
 +MEDIA_BUS_FMT_RGB666_1X18,
 +MEDIA_BUS_FMT_RGB888_1X24,
 +};
 +
 +static bool samsung_dsim_pixel_output_fmt_supported(u32 fmt)
 +{
 +int i;
 +
 +for (i = 0; i < ARRAY_SIZE(samsung_dsim_pixel_output_fmts); i++) {
 +if (samsung_dsim_pixel_output_fmts[i] == fmt)
 +return true;
 +}
 +
 +return false;
 +}
 +
 +static u32 *
 +samsung_dsim_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
 +   struct drm_bridge_state *bridge_state,
 +   struct drm_crtc_state *crtc_state,
 +   struct drm_connector_state *conn_state,
 +   u32 output_fmt,
 +   unsigned int *num_input_fmts)
 +{
 +u32 *input_fmts;
 +
 +if (!samsung_dsim_pixel_output_fmt_supported(output_fmt))
 +return NULL;
>>>
>>> Please add support for MEDIA_BUS_FMT_FIXED and maybe default to
>>> MEDIA_BUS_FMT_RGB888_1X24 if requested format is not matched.
>>>
>>> Otherwise the above check breaks all current clients of the Samsung
>>> DSIM/Exynos DSI. I didn't dig into the bus matching code yet, but all
>>> DSI panels requests such format on my test systems...
>> I've checked a bit more the bus format related code and it looks that
>> there are more issues. The DSI panels don't use the MEDIA_BUS_FMT_*
>> formats thus the bridge negotiation code selects MEDIA_BUS_FMT_FIXED for
>> them. On Arndale board with Toshiba tc358764 bridge the
>> MEDIA_BUS_FMT_RGB888_1X7X4_SPWG output_fmt is requested in
>> samsung_dsim_atomic_get_input_bus_fmts() (forwarded from the LVDS panel,
> dsim => tc358764 => panel-simple
>
> If I understand the bridge format negotiation correctly - If
> atomic_get_input_bus_fmts is not implemented in tc358764 then
> MEDIA_BUS_FMT_FIXED will be the output_fmt for dsim so we can assign
> MEDIA_BUS_FMT_RGB888_1X24 for FIXED formats.
>
> from include/drm/drm_bridge.h:
>
>   * This method is called on all elements of the bridge chain as part 
> of
>   * the bus format negotiation process that happens in
>   * drm_atomic_bridge_chain_select_bus_fmts().
>   * This method is optional. When not implemented, the core will 
> bypass
>   * bus format negotiation on this element of the bridge without
>   * failing, and the previous element in the chain will be passed
>   * MEDIA_BUS_FMT_FIXED as its output bus format.
>
> As I can see tc358764 is not implemented either
> atomic_get_input_bus_fmts or atomic API, so I think dsim gets the
> MEDIA_BUS_FMT_FIXED bridge pipeline. I have tested sn65dsi without
> atomic_get_input_bus_fmts I can see the dsim is getting
> MEDIA_BUS_FMT_FIXED.
>
> Can you check the same from your side?

Here in case of Arndale 

Re: [PATCH v8 09/14] drm: bridge: samsung-dsim: Add atomic_get_input_bus_fmts

2022-11-14 Thread Jagan Teki
On Mon, Nov 14, 2022 at 8:10 PM Marek Szyprowski
 wrote:
>
> On 14.11.2022 11:57, Marek Szyprowski wrote:
> > On 10.11.2022 19:38, Jagan Teki wrote:
> >> Finding the right input bus format throughout the pipeline is hard
> >> so add atomic_get_input_bus_fmts callback and initialize with the
> >> proper input format from list of supported output formats.
> >>
> >> This format can be used in pipeline for negotiating bus format between
> >> the DSI-end of this bridge and the other component closer to pipeline
> >> components.
> >>
> >> List of Pixel formats are taken from,
> >> AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022
> >> 3.7.4 Pixel formats
> >> Table 14. DSI pixel packing formats
> >>
> >> v8:
> >> * added pixel formats supported by NXP AN13573 i.MX 8/RT MIPI DSI/CSI-2
> >>
> >> v7, v6, v5, v4:
> >> * none
> >>
> >> v3:
> >> * include media-bus-format.h
> >>
> >> v2:
> >> * none
> >>
> >> v1:
> >> * new patch
> >>
> >> Signed-off-by: Jagan Teki 
> >> ---
> >>   drivers/gpu/drm/bridge/samsung-dsim.c | 53 +++
> >>   1 file changed, 53 insertions(+)
> >>
> >> diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c
> >> b/drivers/gpu/drm/bridge/samsung-dsim.c
> >> index 0fe153b29e4f..33e5ae9c865f 100644
> >> --- a/drivers/gpu/drm/bridge/samsung-dsim.c
> >> +++ b/drivers/gpu/drm/bridge/samsung-dsim.c
> >> @@ -15,6 +15,7 @@
> >>   #include 
> >>   #include 
> >>   #include 
> >> +#include 
> >>   #include 
> >>   #include 
> >>   @@ -1321,6 +1322,57 @@ static void
> >> samsung_dsim_atomic_post_disable(struct drm_bridge *bridge,
> >>   pm_runtime_put_sync(dsi->dev);
> >>   }
> >>   +/*
> >> + * This pixel output formats list referenced from,
> >> + * AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022
> >> + * 3.7.4 Pixel formats
> >> + * Table 14. DSI pixel packing formats
> >> + */
> >> +static const u32 samsung_dsim_pixel_output_fmts[] = {
> >> +MEDIA_BUS_FMT_UYVY8_1X16,
> >> +MEDIA_BUS_FMT_RGB101010_1X30,
> >> +MEDIA_BUS_FMT_RGB121212_1X36,
> >> +MEDIA_BUS_FMT_RGB565_1X16,
> >> +MEDIA_BUS_FMT_RGB666_1X18,
> >> +MEDIA_BUS_FMT_RGB888_1X24,
> >> +};
> >> +
> >> +static bool samsung_dsim_pixel_output_fmt_supported(u32 fmt)
> >> +{
> >> +int i;
> >> +
> >> +for (i = 0; i < ARRAY_SIZE(samsung_dsim_pixel_output_fmts); i++) {
> >> +if (samsung_dsim_pixel_output_fmts[i] == fmt)
> >> +return true;
> >> +}
> >> +
> >> +return false;
> >> +}
> >> +
> >> +static u32 *
> >> +samsung_dsim_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
> >> +   struct drm_bridge_state *bridge_state,
> >> +   struct drm_crtc_state *crtc_state,
> >> +   struct drm_connector_state *conn_state,
> >> +   u32 output_fmt,
> >> +   unsigned int *num_input_fmts)
> >> +{
> >> +u32 *input_fmts;
> >> +
> >> +if (!samsung_dsim_pixel_output_fmt_supported(output_fmt))
> >> +return NULL;
> >
> >
> > Please add support for MEDIA_BUS_FMT_FIXED and maybe default to
> > MEDIA_BUS_FMT_RGB888_1X24 if requested format is not matched.
> >
> > Otherwise the above check breaks all current clients of the Samsung
> > DSIM/Exynos DSI. I didn't dig into the bus matching code yet, but all
> > DSI panels requests such format on my test systems...
>
> I've checked a bit more the bus format related code and it looks that
> there are more issues. The DSI panels don't use the MEDIA_BUS_FMT_*
> formats thus the bridge negotiation code selects MEDIA_BUS_FMT_FIXED for
> them. On Arndale board with Toshiba tc358764 bridge the
> MEDIA_BUS_FMT_RGB888_1X7X4_SPWG output_fmt is requested in
> samsung_dsim_atomic_get_input_bus_fmts() (forwarded from the LVDS panel,

dsim => tc358764 => panel-simple

If I understand the bridge format negotiation correctly - If
atomic_get_input_bus_fmts is not implemented in tc358764 then
MEDIA_BUS_FMT_FIXED will be the output_fmt for dsim so we can assign
MEDIA_BUS_FMT_RGB888_1X24 for FIXED formats.

from include/drm/drm_bridge.h:

 * This method is called on all elements of the bridge chain as part of
 * the bus format negotiation process that happens in
 * drm_atomic_bridge_chain_select_bus_fmts().
 * This method is optional. When not implemented, the core will bypass
 * bus format negotiation on this element of the bridge without
 * failing, and the previous element in the chain will be passed
 * MEDIA_BUS_FMT_FIXED as its output bus format.

As I can see tc358764 is not implemented either
atomic_get_input_bus_fmts or atomic API, so I think dsim gets the
MEDIA_BUS_FMT_FIXED bridge pipeline. I have tested sn65dsi without
atomic_get_input_bus_fmts I can see the dsim is getting
MEDIA_BUS_FMT_FIXED.

Can you check the same from your side?

On the other side, MEDIA_BUS_FMT_RGB888_1X7X4_SPWG is 24-bit samples
transferred over an LVDS bus with four differential data pairs,

Re: [PATCH v8 09/14] drm: bridge: samsung-dsim: Add atomic_get_input_bus_fmts

2022-11-14 Thread Marek Szyprowski
On 14.11.2022 11:57, Marek Szyprowski wrote:
> On 10.11.2022 19:38, Jagan Teki wrote:
>> Finding the right input bus format throughout the pipeline is hard
>> so add atomic_get_input_bus_fmts callback and initialize with the
>> proper input format from list of supported output formats.
>>
>> This format can be used in pipeline for negotiating bus format between
>> the DSI-end of this bridge and the other component closer to pipeline
>> components.
>>
>> List of Pixel formats are taken from,
>> AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022
>> 3.7.4 Pixel formats
>> Table 14. DSI pixel packing formats
>>
>> v8:
>> * added pixel formats supported by NXP AN13573 i.MX 8/RT MIPI DSI/CSI-2
>>
>> v7, v6, v5, v4:
>> * none
>>
>> v3:
>> * include media-bus-format.h
>>
>> v2:
>> * none
>>
>> v1:
>> * new patch
>>
>> Signed-off-by: Jagan Teki 
>> ---
>>   drivers/gpu/drm/bridge/samsung-dsim.c | 53 +++
>>   1 file changed, 53 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c 
>> b/drivers/gpu/drm/bridge/samsung-dsim.c
>> index 0fe153b29e4f..33e5ae9c865f 100644
>> --- a/drivers/gpu/drm/bridge/samsung-dsim.c
>> +++ b/drivers/gpu/drm/bridge/samsung-dsim.c
>> @@ -15,6 +15,7 @@
>>   #include 
>>   #include 
>>   #include 
>> +#include 
>>   #include 
>>   #include 
>>   @@ -1321,6 +1322,57 @@ static void 
>> samsung_dsim_atomic_post_disable(struct drm_bridge *bridge,
>>   pm_runtime_put_sync(dsi->dev);
>>   }
>>   +/*
>> + * This pixel output formats list referenced from,
>> + * AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022
>> + * 3.7.4 Pixel formats
>> + * Table 14. DSI pixel packing formats
>> + */
>> +static const u32 samsung_dsim_pixel_output_fmts[] = {
>> +    MEDIA_BUS_FMT_UYVY8_1X16,
>> +    MEDIA_BUS_FMT_RGB101010_1X30,
>> +    MEDIA_BUS_FMT_RGB121212_1X36,
>> +    MEDIA_BUS_FMT_RGB565_1X16,
>> +    MEDIA_BUS_FMT_RGB666_1X18,
>> +    MEDIA_BUS_FMT_RGB888_1X24,
>> +};
>> +
>> +static bool samsung_dsim_pixel_output_fmt_supported(u32 fmt)
>> +{
>> +    int i;
>> +
>> +    for (i = 0; i < ARRAY_SIZE(samsung_dsim_pixel_output_fmts); i++) {
>> +    if (samsung_dsim_pixel_output_fmts[i] == fmt)
>> +    return true;
>> +    }
>> +
>> +    return false;
>> +}
>> +
>> +static u32 *
>> +samsung_dsim_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
>> +   struct drm_bridge_state *bridge_state,
>> +   struct drm_crtc_state *crtc_state,
>> +   struct drm_connector_state *conn_state,
>> +   u32 output_fmt,
>> +   unsigned int *num_input_fmts)
>> +{
>> +    u32 *input_fmts;
>> +
>> +    if (!samsung_dsim_pixel_output_fmt_supported(output_fmt))
>> +    return NULL;
>
>
> Please add support for MEDIA_BUS_FMT_FIXED and maybe default to 
> MEDIA_BUS_FMT_RGB888_1X24 if requested format is not matched.
>
> Otherwise the above check breaks all current clients of the Samsung 
> DSIM/Exynos DSI. I didn't dig into the bus matching code yet, but all 
> DSI panels requests such format on my test systems...

I've checked a bit more the bus format related code and it looks that 
there are more issues. The DSI panels don't use the MEDIA_BUS_FMT_* 
formats thus the bridge negotiation code selects MEDIA_BUS_FMT_FIXED for 
them. On Arndale board with Toshiba tc358764 bridge the 
MEDIA_BUS_FMT_RGB888_1X7X4_SPWG output_fmt is requested in 
samsung_dsim_atomic_get_input_bus_fmts() (forwarded from the LVDS panel, 
but this doesn't look like a format really needed on that bridge). A bit 
more logic seems to be needed there to make it working properly.

I suggest to move all this bus format related changes into a separate 
patchset and adjust other bridges/panels/etc as needed in it.

>
>> +
>> +    *num_input_fmts = 1;
>> +
>> +    input_fmts = kmalloc(sizeof(*input_fmts), GFP_KERNEL);
>> +    if (!input_fmts)
>> +    return NULL;
>> +
>> +    input_fmts[0] = output_fmt;
>> +
>> +    return input_fmts;
>> +}
>> +
>>   static int samsung_dsim_atomic_check(struct drm_bridge *bridge,
>>    struct drm_bridge_state *bridge_state,
>>    struct drm_crtc_state *crtc_state,
>> @@ -1385,6 +1437,7 @@ static const struct drm_bridge_funcs 
>> samsung_dsim_bridge_funcs = {
>>   .atomic_duplicate_state    = 
>> drm_atomic_helper_bridge_duplicate_state,
>>   .atomic_destroy_state    = 
>> drm_atomic_helper_bridge_destroy_state,
>>   .atomic_reset    = drm_atomic_helper_bridge_reset,
>> +    .atomic_get_input_bus_fmts    = 
>> samsung_dsim_atomic_get_input_bus_fmts,
>>   .atomic_check    = samsung_dsim_atomic_check,
>>   .atomic_pre_enable    = samsung_dsim_atomic_pre_enable,
>>   .atomic_enable    = samsung_dsim_atomic_enable,
>
> Best regards

Best regards
-- 
Marek Szyprowski, PhD
Samsung R Institute Poland



Re: [PATCH v8 09/14] drm: bridge: samsung-dsim: Add atomic_get_input_bus_fmts

2022-11-14 Thread Marek Szyprowski
On 10.11.2022 19:38, Jagan Teki wrote:
> Finding the right input bus format throughout the pipeline is hard
> so add atomic_get_input_bus_fmts callback and initialize with the
> proper input format from list of supported output formats.
>
> This format can be used in pipeline for negotiating bus format between
> the DSI-end of this bridge and the other component closer to pipeline
> components.
>
> List of Pixel formats are taken from,
> AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022
> 3.7.4 Pixel formats
> Table 14. DSI pixel packing formats
>
> v8:
> * added pixel formats supported by NXP AN13573 i.MX 8/RT MIPI DSI/CSI-2
>
> v7, v6, v5, v4:
> * none
>
> v3:
> * include media-bus-format.h
>
> v2:
> * none
>
> v1:
> * new patch
>
> Signed-off-by: Jagan Teki 
> ---
>   drivers/gpu/drm/bridge/samsung-dsim.c | 53 +++
>   1 file changed, 53 insertions(+)
>
> diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c 
> b/drivers/gpu/drm/bridge/samsung-dsim.c
> index 0fe153b29e4f..33e5ae9c865f 100644
> --- a/drivers/gpu/drm/bridge/samsung-dsim.c
> +++ b/drivers/gpu/drm/bridge/samsung-dsim.c
> @@ -15,6 +15,7 @@
>   #include 
>   #include 
>   #include 
> +#include 
>   #include 
>   #include 
>   
> @@ -1321,6 +1322,57 @@ static void samsung_dsim_atomic_post_disable(struct 
> drm_bridge *bridge,
>   pm_runtime_put_sync(dsi->dev);
>   }
>   
> +/*
> + * This pixel output formats list referenced from,
> + * AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022
> + * 3.7.4 Pixel formats
> + * Table 14. DSI pixel packing formats
> + */
> +static const u32 samsung_dsim_pixel_output_fmts[] = {
> + MEDIA_BUS_FMT_UYVY8_1X16,
> + MEDIA_BUS_FMT_RGB101010_1X30,
> + MEDIA_BUS_FMT_RGB121212_1X36,
> + MEDIA_BUS_FMT_RGB565_1X16,
> + MEDIA_BUS_FMT_RGB666_1X18,
> + MEDIA_BUS_FMT_RGB888_1X24,
> +};
> +
> +static bool samsung_dsim_pixel_output_fmt_supported(u32 fmt)
> +{
> + int i;
> +
> + for (i = 0; i < ARRAY_SIZE(samsung_dsim_pixel_output_fmts); i++) {
> + if (samsung_dsim_pixel_output_fmts[i] == fmt)
> + return true;
> + }
> +
> + return false;
> +}
> +
> +static u32 *
> +samsung_dsim_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
> +struct drm_bridge_state *bridge_state,
> +struct drm_crtc_state *crtc_state,
> +struct drm_connector_state *conn_state,
> +u32 output_fmt,
> +unsigned int *num_input_fmts)
> +{
> + u32 *input_fmts;
> +
> + if (!samsung_dsim_pixel_output_fmt_supported(output_fmt))
> + return NULL;


Please add support for MEDIA_BUS_FMT_FIXED and maybe default to 
MEDIA_BUS_FMT_RGB888_1X24 if requested format is not matched.

Otherwise the above check breaks all current clients of the Samsung 
DSIM/Exynos DSI. I didn't dig into the bus matching code yet, but all 
DSI panels requests such format on my test systems...


> +
> + *num_input_fmts = 1;
> +
> + input_fmts = kmalloc(sizeof(*input_fmts), GFP_KERNEL);
> + if (!input_fmts)
> + return NULL;
> +
> + input_fmts[0] = output_fmt;
> +
> + return input_fmts;
> +}
> +
>   static int samsung_dsim_atomic_check(struct drm_bridge *bridge,
>struct drm_bridge_state *bridge_state,
>struct drm_crtc_state *crtc_state,
> @@ -1385,6 +1437,7 @@ static const struct drm_bridge_funcs 
> samsung_dsim_bridge_funcs = {
>   .atomic_duplicate_state = 
> drm_atomic_helper_bridge_duplicate_state,
>   .atomic_destroy_state   = 
> drm_atomic_helper_bridge_destroy_state,
>   .atomic_reset   = drm_atomic_helper_bridge_reset,
> + .atomic_get_input_bus_fmts  = 
> samsung_dsim_atomic_get_input_bus_fmts,
>   .atomic_check   = samsung_dsim_atomic_check,
>   .atomic_pre_enable  = samsung_dsim_atomic_pre_enable,
>   .atomic_enable  = samsung_dsim_atomic_enable,

Best regards
-- 
Marek Szyprowski, PhD
Samsung R Institute Poland



Re: [PATCH v8 09/14] drm: bridge: samsung-dsim: Add atomic_get_input_bus_fmts

2022-11-13 Thread Jagan Teki
On Sun, Nov 13, 2022 at 5:51 AM Marek Vasut  wrote:
>
> On 11/10/22 19:38, Jagan Teki wrote:
> > Finding the right input bus format throughout the pipeline is hard
> > so add atomic_get_input_bus_fmts callback and initialize with the
> > proper input format from list of supported output formats.
> >
> > This format can be used in pipeline for negotiating bus format between
> > the DSI-end of this bridge and the other component closer to pipeline
> > components.
> >
> > List of Pixel formats are taken from,
> > AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022
> > 3.7.4 Pixel formats
> > Table 14. DSI pixel packing formats
> >
> > v8:
> > * added pixel formats supported by NXP AN13573 i.MX 8/RT MIPI DSI/CSI-2
> >
> > v7, v6, v5, v4:
> > * none
> >
> > v3:
> > * include media-bus-format.h
> >
> > v2:
> > * none
> >
> > v1:
> > * new patch
> >
> > Signed-off-by: Jagan Teki 
> > ---
> >   drivers/gpu/drm/bridge/samsung-dsim.c | 53 +++
> >   1 file changed, 53 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c 
> > b/drivers/gpu/drm/bridge/samsung-dsim.c
> > index 0fe153b29e4f..33e5ae9c865f 100644
> > --- a/drivers/gpu/drm/bridge/samsung-dsim.c
> > +++ b/drivers/gpu/drm/bridge/samsung-dsim.c
> > @@ -15,6 +15,7 @@
> >   #include 
> >   #include 
> >   #include 
> > +#include 
> >   #include 
> >   #include 
> >
> > @@ -1321,6 +1322,57 @@ static void samsung_dsim_atomic_post_disable(struct 
> > drm_bridge *bridge,
> >   pm_runtime_put_sync(dsi->dev);
> >   }
> >
> > +/*
> > + * This pixel output formats list referenced from,
> > + * AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022
> > + * 3.7.4 Pixel formats
> > + * Table 14. DSI pixel packing formats
> > + */
> > +static const u32 samsung_dsim_pixel_output_fmts[] = {
>
> You can also add :
>
> MEDIA_BUS_FMT_YUYV10_1X20
>
> MEDIA_BUS_FMT_YUYV12_1X24

Are these for the below formats?

"Loosely Packed Pixel Stream, 20-bit YCbCr, 4:2:2
 Packed Pixel Stream, 24-bit YCbCr, 4:2:2"
>
> > + MEDIA_BUS_FMT_UYVY8_1X16,
> > + MEDIA_BUS_FMT_RGB101010_1X30,
> > + MEDIA_BUS_FMT_RGB121212_1X36,
> > + MEDIA_BUS_FMT_RGB565_1X16,
> > + MEDIA_BUS_FMT_RGB666_1X18,
> > + MEDIA_BUS_FMT_RGB888_1X24,
> > +};
> > +
> > +static bool samsung_dsim_pixel_output_fmt_supported(u32 fmt)
> > +{
> > + int i;
> > +
> > + for (i = 0; i < ARRAY_SIZE(samsung_dsim_pixel_output_fmts); i++) {
> > + if (samsung_dsim_pixel_output_fmts[i] == fmt)
> > + return true;
> > + }
> > +
> > + return false;
> > +}
> > +
> > +static u32 *
> > +samsung_dsim_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
> > +struct drm_bridge_state *bridge_state,
> > +struct drm_crtc_state *crtc_state,
> > +struct drm_connector_state *conn_state,
> > +u32 output_fmt,
> > +unsigned int *num_input_fmts)
> > +{
> > + u32 *input_fmts;
> > +
> > + if (!samsung_dsim_pixel_output_fmt_supported(output_fmt))
> > + return NULL;
> > +
> > + *num_input_fmts = 1;
>
> Shouldn't this be 6 ?
>
> > + input_fmts = kmalloc(sizeof(*input_fmts), GFP_KERNEL);
> > + if (!input_fmts)
> > + return NULL;
> > +
> > + input_fmts[0] = output_fmt;
>
> Shouldn't this be a list of all 6 supported pixel formats ?

Negotiation would settle to return one input_fmt from the list of
supporting output_fmts. so the num_input_fmts would be 1 rather than
the number of fmts in the supporting list. This is what I understood
from the atomic_get_input_bus_fmts API. let me know if I miss
something here.

Jagan.


Re: [PATCH v8 09/14] drm: bridge: samsung-dsim: Add atomic_get_input_bus_fmts

2022-11-12 Thread Marek Vasut

On 11/10/22 19:38, Jagan Teki wrote:

Finding the right input bus format throughout the pipeline is hard
so add atomic_get_input_bus_fmts callback and initialize with the
proper input format from list of supported output formats.

This format can be used in pipeline for negotiating bus format between
the DSI-end of this bridge and the other component closer to pipeline
components.

List of Pixel formats are taken from,
AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022
3.7.4 Pixel formats
Table 14. DSI pixel packing formats

v8:
* added pixel formats supported by NXP AN13573 i.MX 8/RT MIPI DSI/CSI-2

v7, v6, v5, v4:
* none

v3:
* include media-bus-format.h

v2:
* none

v1:
* new patch

Signed-off-by: Jagan Teki 
---
  drivers/gpu/drm/bridge/samsung-dsim.c | 53 +++
  1 file changed, 53 insertions(+)

diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c 
b/drivers/gpu/drm/bridge/samsung-dsim.c
index 0fe153b29e4f..33e5ae9c865f 100644
--- a/drivers/gpu/drm/bridge/samsung-dsim.c
+++ b/drivers/gpu/drm/bridge/samsung-dsim.c
@@ -15,6 +15,7 @@
  #include 
  #include 
  #include 
+#include 
  #include 
  #include 
  
@@ -1321,6 +1322,57 @@ static void samsung_dsim_atomic_post_disable(struct drm_bridge *bridge,

pm_runtime_put_sync(dsi->dev);
  }
  
+/*

+ * This pixel output formats list referenced from,
+ * AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022
+ * 3.7.4 Pixel formats
+ * Table 14. DSI pixel packing formats
+ */
+static const u32 samsung_dsim_pixel_output_fmts[] = {


You can also add :

MEDIA_BUS_FMT_YUYV10_1X20

MEDIA_BUS_FMT_YUYV12_1X24


+   MEDIA_BUS_FMT_UYVY8_1X16,
+   MEDIA_BUS_FMT_RGB101010_1X30,
+   MEDIA_BUS_FMT_RGB121212_1X36,
+   MEDIA_BUS_FMT_RGB565_1X16,
+   MEDIA_BUS_FMT_RGB666_1X18,
+   MEDIA_BUS_FMT_RGB888_1X24,
+};
+
+static bool samsung_dsim_pixel_output_fmt_supported(u32 fmt)
+{
+   int i;
+
+   for (i = 0; i < ARRAY_SIZE(samsung_dsim_pixel_output_fmts); i++) {
+   if (samsung_dsim_pixel_output_fmts[i] == fmt)
+   return true;
+   }
+
+   return false;
+}
+
+static u32 *
+samsung_dsim_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
+  struct drm_bridge_state *bridge_state,
+  struct drm_crtc_state *crtc_state,
+  struct drm_connector_state *conn_state,
+  u32 output_fmt,
+  unsigned int *num_input_fmts)
+{
+   u32 *input_fmts;
+
+   if (!samsung_dsim_pixel_output_fmt_supported(output_fmt))
+   return NULL;
+
+   *num_input_fmts = 1;


Shouldn't this be 6 ?


+   input_fmts = kmalloc(sizeof(*input_fmts), GFP_KERNEL);
+   if (!input_fmts)
+   return NULL;
+
+   input_fmts[0] = output_fmt;


Shouldn't this be a list of all 6 supported pixel formats ?

(replace 6 with 8 with the two new YUYV10/YUYV12 pixel formats above)


[PATCH v8 09/14] drm: bridge: samsung-dsim: Add atomic_get_input_bus_fmts

2022-11-10 Thread Jagan Teki
Finding the right input bus format throughout the pipeline is hard
so add atomic_get_input_bus_fmts callback and initialize with the
proper input format from list of supported output formats.

This format can be used in pipeline for negotiating bus format between
the DSI-end of this bridge and the other component closer to pipeline
components.

List of Pixel formats are taken from,
AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022
3.7.4 Pixel formats
Table 14. DSI pixel packing formats

v8:
* added pixel formats supported by NXP AN13573 i.MX 8/RT MIPI DSI/CSI-2

v7, v6, v5, v4:
* none

v3:
* include media-bus-format.h

v2:
* none

v1:
* new patch

Signed-off-by: Jagan Teki 
---
 drivers/gpu/drm/bridge/samsung-dsim.c | 53 +++
 1 file changed, 53 insertions(+)

diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c 
b/drivers/gpu/drm/bridge/samsung-dsim.c
index 0fe153b29e4f..33e5ae9c865f 100644
--- a/drivers/gpu/drm/bridge/samsung-dsim.c
+++ b/drivers/gpu/drm/bridge/samsung-dsim.c
@@ -15,6 +15,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 
@@ -1321,6 +1322,57 @@ static void samsung_dsim_atomic_post_disable(struct 
drm_bridge *bridge,
pm_runtime_put_sync(dsi->dev);
 }
 
+/*
+ * This pixel output formats list referenced from,
+ * AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022
+ * 3.7.4 Pixel formats
+ * Table 14. DSI pixel packing formats
+ */
+static const u32 samsung_dsim_pixel_output_fmts[] = {
+   MEDIA_BUS_FMT_UYVY8_1X16,
+   MEDIA_BUS_FMT_RGB101010_1X30,
+   MEDIA_BUS_FMT_RGB121212_1X36,
+   MEDIA_BUS_FMT_RGB565_1X16,
+   MEDIA_BUS_FMT_RGB666_1X18,
+   MEDIA_BUS_FMT_RGB888_1X24,
+};
+
+static bool samsung_dsim_pixel_output_fmt_supported(u32 fmt)
+{
+   int i;
+
+   for (i = 0; i < ARRAY_SIZE(samsung_dsim_pixel_output_fmts); i++) {
+   if (samsung_dsim_pixel_output_fmts[i] == fmt)
+   return true;
+   }
+
+   return false;
+}
+
+static u32 *
+samsung_dsim_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
+  struct drm_bridge_state *bridge_state,
+  struct drm_crtc_state *crtc_state,
+  struct drm_connector_state *conn_state,
+  u32 output_fmt,
+  unsigned int *num_input_fmts)
+{
+   u32 *input_fmts;
+
+   if (!samsung_dsim_pixel_output_fmt_supported(output_fmt))
+   return NULL;
+
+   *num_input_fmts = 1;
+
+   input_fmts = kmalloc(sizeof(*input_fmts), GFP_KERNEL);
+   if (!input_fmts)
+   return NULL;
+
+   input_fmts[0] = output_fmt;
+
+   return input_fmts;
+}
+
 static int samsung_dsim_atomic_check(struct drm_bridge *bridge,
 struct drm_bridge_state *bridge_state,
 struct drm_crtc_state *crtc_state,
@@ -1385,6 +1437,7 @@ static const struct drm_bridge_funcs 
samsung_dsim_bridge_funcs = {
.atomic_duplicate_state = 
drm_atomic_helper_bridge_duplicate_state,
.atomic_destroy_state   = 
drm_atomic_helper_bridge_destroy_state,
.atomic_reset   = drm_atomic_helper_bridge_reset,
+   .atomic_get_input_bus_fmts  = 
samsung_dsim_atomic_get_input_bus_fmts,
.atomic_check   = samsung_dsim_atomic_check,
.atomic_pre_enable  = samsung_dsim_atomic_pre_enable,
.atomic_enable  = samsung_dsim_atomic_enable,
-- 
2.25.1