Re: [PATCH v18 2/3] drm/ingenic: Implement proper .atomic_get_input_bus_fmts

2022-04-07 Thread Neil Armstrong

On 07/04/2022 13:16, H. Nikolaus Schaller wrote:

From: Paul Cercueil 

The .atomic_get_input_bus_fmts() callback of our top bridge should
return the possible input formats for a given output format. If the
requested output format is not supported, then NULL should be returned,
otherwise the bus format negociation will end with a bus format that the
encoder does not support.

Signed-off-by: Paul Cercueil 
Signed-off-by: H. Nikolaus Schaller 
---
  drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 28 ++-
  1 file changed, 27 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c 
b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
index a4f5a323f4906..8eb0ad501a7b9 100644
--- a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
+++ b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
@@ -833,6 +833,32 @@ static int ingenic_drm_bridge_atomic_check(struct 
drm_bridge *bridge,
}
  }
  
+static u32 *

+ingenic_drm_bridge_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)
+{
+   switch (output_fmt) {
+   case MEDIA_BUS_FMT_RGB888_1X24:
+   case MEDIA_BUS_FMT_RGB666_1X18:
+   case MEDIA_BUS_FMT_RGB565_1X16:
+   case MEDIA_BUS_FMT_RGB888_3X8:
+   case MEDIA_BUS_FMT_RGB888_3X8_DELTA:
+   break;
+   default:
+   *num_input_fmts = 0;
+   return NULL;
+   }
+
+   return drm_atomic_helper_bridge_propagate_bus_fmt(bridge, bridge_state,
+ crtc_state, 
conn_state,
+ output_fmt,
+ num_input_fmts);
+}
+
  static irqreturn_t ingenic_drm_irq_handler(int irq, void *arg)
  {
struct ingenic_drm *priv = drm_device_get_priv(arg);
@@ -984,7 +1010,7 @@ static const struct drm_bridge_funcs 
ingenic_drm_bridge_funcs = {
.atomic_reset   = drm_atomic_helper_bridge_reset,
.atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
.atomic_destroy_state   = drm_atomic_helper_bridge_destroy_state,
-   .atomic_get_input_bus_fmts = drm_atomic_helper_bridge_propagate_bus_fmt,
+   .atomic_get_input_bus_fmts = 
ingenic_drm_bridge_atomic_get_input_bus_fmts,
  };
  
  static const struct drm_mode_config_funcs ingenic_drm_mode_config_funcs = {


Reviewed-by: Neil Armstrong 


[PATCH v18 2/3] drm/ingenic: Implement proper .atomic_get_input_bus_fmts

2022-04-07 Thread H. Nikolaus Schaller
From: Paul Cercueil 

The .atomic_get_input_bus_fmts() callback of our top bridge should
return the possible input formats for a given output format. If the
requested output format is not supported, then NULL should be returned,
otherwise the bus format negociation will end with a bus format that the
encoder does not support.

Signed-off-by: Paul Cercueil 
Signed-off-by: H. Nikolaus Schaller 
---
 drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 28 ++-
 1 file changed, 27 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c 
b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
index a4f5a323f4906..8eb0ad501a7b9 100644
--- a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
+++ b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
@@ -833,6 +833,32 @@ static int ingenic_drm_bridge_atomic_check(struct 
drm_bridge *bridge,
}
 }
 
+static u32 *
+ingenic_drm_bridge_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)
+{
+   switch (output_fmt) {
+   case MEDIA_BUS_FMT_RGB888_1X24:
+   case MEDIA_BUS_FMT_RGB666_1X18:
+   case MEDIA_BUS_FMT_RGB565_1X16:
+   case MEDIA_BUS_FMT_RGB888_3X8:
+   case MEDIA_BUS_FMT_RGB888_3X8_DELTA:
+   break;
+   default:
+   *num_input_fmts = 0;
+   return NULL;
+   }
+
+   return drm_atomic_helper_bridge_propagate_bus_fmt(bridge, bridge_state,
+ crtc_state, 
conn_state,
+ output_fmt,
+ num_input_fmts);
+}
+
 static irqreturn_t ingenic_drm_irq_handler(int irq, void *arg)
 {
struct ingenic_drm *priv = drm_device_get_priv(arg);
@@ -984,7 +1010,7 @@ static const struct drm_bridge_funcs 
ingenic_drm_bridge_funcs = {
.atomic_reset   = drm_atomic_helper_bridge_reset,
.atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
.atomic_destroy_state   = drm_atomic_helper_bridge_destroy_state,
-   .atomic_get_input_bus_fmts = drm_atomic_helper_bridge_propagate_bus_fmt,
+   .atomic_get_input_bus_fmts = 
ingenic_drm_bridge_atomic_get_input_bus_fmts,
 };
 
 static const struct drm_mode_config_funcs ingenic_drm_mode_config_funcs = {
-- 
2.33.0