drm/vc4: Fix oops dereferencing DPI's connector since panel_bridge.
Subsystems (3)
PATCH 1/1 drm/vc4: Fix oops dereferencing DPI's connector since panel_bridge.
In the cleanup, I didn't notice that we needed to dereference the connector for the bus_format. Fix the regression by looking up the first (and only) connector attached to us, and assume that its bus_format is what we want. Some day it would be good to have that part of display_info attached to the bridge, instead.
--- drivers/gpu/drm/vc4/vc4_dpi.c | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-)
drivers/gpu/drm/vc4/vc4_dpi.c +23 -4
@@ -96,7 +96,6 @@ struct vc4_dpi {struct platform_device *pdev;struct drm_encoder *encoder; -struct drm_connector *connector;void __iomem *regs;
@@ -164,14 +163,31 @@ static void vc4_dpi_encoder_disable(struct drm_encoder *encoder)static void vc4_dpi_encoder_enable (struct drm_encoder *encoder) { +struct drm_device *dev = encoder->dev;struct drm_display_mode *mode = &encoder->crtc->mode;struct vc4_dpi_encoder *vc4_encoder =to_vc4_dpi_encoder (encoder);struct vc4_dpi *dpi = vc4_encoder->dpi; +struct drm_connector_list_iter conn_iter; +struct drm_connector *connector =NULL , *connector_scan;u32 dpi_c =DPI_ENABLE |DPI_OUTPUT_ENABLE_MODE ;int ret; -if (dpi->connector->display_info.num_bus_formats) { -u32 bus_format = dpi->connector->display_info.bus_formats[0 ]; +/* Look up the connector attached to DPI so we can get the +* bus_format. Ideally the bridge would tell us the +* bus_format we want, but it doesn't yet, so assume that it's +* uniform throughout the bridge chain. +*/ +drm_connector_list_iter_begin (dev, &conn_iter); +drm_for_each_connector_iter (connector_scan, &conn_iter) { +if (connector_scan->encoder == encoder) { + connector = connector_scan; +break ; + } + } +drm_connector_list_iter_end (&conn_iter); + +if (connector && connector->display_info.num_bus_formats) { +u32 bus_format = connector->display_info.bus_formats[0 ];switch (bus_format) {case MEDIA_BUS_FMT_RGB888_1X24 :
@@ -199,6 +215,9 @@ static void vc4_dpi_encoder_enable(struct drm_encoder *encoder)DRM_ERROR ("Unknown media bus format %d\n" , bus_format);break ; } + }else { +/* Default to 24bit if no connector found. */ + dpi_c |=VC4_SET_FIELD (DPI_FORMAT_24BIT_888_RGB ,DPI_FORMAT ); }if (mode->flags &DRM_MODE_FLAG_NHSYNC )
@@ -264,7 +283,7 @@ static int vc4_dpi_init_bridge(struct vc4_dpi *dpi)return ret; } -if (panel) +if (panel) bridge =drm_panel_bridge_add (panel,DRM_MODE_CONNECTOR_DPI );return drm_bridge_attach (dpi->encoder, bridge,NULL );
Signature · 6 lines
2.16.2 _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
Quoted 5 lines · Eric Anholt
In the cleanup, I didn't notice that we needed to dereference the connector for the
bus_format. Fix the regression by looking up the first (and only) connector attached to us, and assume that itsbus_formatis what we want. Some day it would be good to have that part ofdisplay_infoattached to the bridge, instead.
Could anyone comment on this patch?
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Quoted 70 lines · Eric Anholt
In the cleanup, I didn't notice that we needed to dereference the connector for the
bus_format. Fix the regression by looking up the first (and only) connector attached to us, and assume that itsbus_formatis what we want. Some day it would be good to have that part ofdisplay_infoattached to the bridge, instead.Signed-off-by Eric Anholt <[email protected]>Fixes 7b1298e05310 ("drm/vc4: Switch DPI to using the panel-bridge helper.")Cc Boris Brezillon <[email protected]>--- drivers/gpu/drm/vc4/vc4_dpi.c | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-)drivers/gpu/drm/vc4/vc4_dpi.c +22
-3@@ -96,7 +96,6 @@ struct vc4_dpi {struct platform_device *pdev;struct drm_encoder *encoder; -struct drm_connector *connector;void __iomem *regs;@@ -164,14 +163,31 @@ static void vc4_dpi_encoder_disable(struct drm_encoder *encoder)static void vc4_dpi_encoder_enable (struct drm_encoder *encoder) { +struct drm_device *dev = encoder->dev;struct drm_display_mode *mode = &encoder->crtc->mode;struct vc4_dpi_encoder *vc4_encoder =to_vc4_dpi_encoder (encoder);struct vc4_dpi *dpi = vc4_encoder->dpi; +struct drm_connector_list_iter conn_iter; +struct drm_connector *connector =NULL , *connector_scan;u32 dpi_c =DPI_ENABLE |DPI_OUTPUT_ENABLE_MODE ;int ret; -if (dpi->connector->display_info.num_bus_formats) { -u32 bus_format = dpi->connector->display_info.bus_formats[0 ]; +/* Look up the connector attached to DPI so we can get the +* bus_format. Ideally the bridge would tell us the +* bus_format we want, but it doesn't yet, so assume that it's +* uniform throughout the bridge chain. +*/ +drm_connector_list_iter_begin (dev, &conn_iter); +drm_for_each_connector_iter (connector_scan, &conn_iter) { +if (connector_scan->encoder == encoder) { + connector = connector_scan; +break ; + } + } +drm_connector_list_iter_end (&conn_iter); + +if (connector && connector->display_info.num_bus_formats) { +u32 bus_format = connector->display_info.bus_formats[0 ];switch (bus_format) {case MEDIA_BUS_FMT_RGB888_1X24 :@@ -199,6 +215,9 @@ static void vc4_dpi_encoder_enable(struct drm_encoder *encoder)DRM_ERROR ("Unknown media bus format %d\n" , bus_format);break ; } + }else { +/* Default to 24bit if no connector found. */ + dpi_c |=VC4_SET_FIELD (DPI_FORMAT_24BIT_888_RGB ,DPI_FORMAT ); }if (mode->flags &DRM_MODE_FLAG_NHSYNC )
drivers/gpu/drm/vc4/vc4_dpi.c static int vc4_dpi_init_bridge(struct vc4_dpi *dpi) · line 286
Quoted 5 lines
drivers/gpu/drm/vc4/vc4_dpi.c +1
-1@@ -264,7 +283,7 @@ static int vc4_dpi_init_bridge(struct vc4_dpi *dpi)return ret; } -if (panel) +if (panel)
whitespace creep, with that fixed:
Quoted 10 lines
drivers/gpu/drm/vc4/vc4_dpi.c +0
-0bridge =drm_panel_bridge_add (panel,DRM_MODE_CONNECTOR_DPI );return drm_bridge_attach (dpi->encoder, bridge,NULL );Signature · 6 lines
2.16.2 _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
Signature · 5 lines
Sean Paul, Software Engineer, Google / Chromium OS _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
Quoted 9 lines · On Fri, 9 Mar 2018 15:32:56 -0800 Eric Anholt <[email protected]> wrote:
In the cleanup, I didn't notice that we needed to dereference the connector for the
bus_format. Fix the regression by looking up the first (and only) connector attached to us, and assume that itsbus_formatis what we want. Some day it would be good to have that part ofdisplay_infoattached to the bridge, instead.Signed-off-by Eric Anholt <[email protected]>Fixes 7b1298e05310 ("drm/vc4: Switch DPI to using the panel-bridge helper.")Cc Boris Brezillon <[email protected]>
Quoted 61 lines
--- drivers/gpu/drm/vc4/vc4_dpi.c | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-)drivers/gpu/drm/vc4/vc4_dpi.c +22
-3@@ -96,7 +96,6 @@ struct vc4_dpi {struct platform_device *pdev;struct drm_encoder *encoder; -struct drm_connector *connector;void __iomem *regs;@@ -164,14 +163,31 @@ static void vc4_dpi_encoder_disable(struct drm_encoder *encoder)static void vc4_dpi_encoder_enable (struct drm_encoder *encoder) { +struct drm_device *dev = encoder->dev;struct drm_display_mode *mode = &encoder->crtc->mode;struct vc4_dpi_encoder *vc4_encoder =to_vc4_dpi_encoder (encoder);struct vc4_dpi *dpi = vc4_encoder->dpi; +struct drm_connector_list_iter conn_iter; +struct drm_connector *connector =NULL , *connector_scan;u32 dpi_c =DPI_ENABLE |DPI_OUTPUT_ENABLE_MODE ;int ret; -if (dpi->connector->display_info.num_bus_formats) { -u32 bus_format = dpi->connector->display_info.bus_formats[0 ]; +/* Look up the connector attached to DPI so we can get the +* bus_format. Ideally the bridge would tell us the +* bus_format we want, but it doesn't yet, so assume that it's +* uniform throughout the bridge chain. +*/ +drm_connector_list_iter_begin (dev, &conn_iter); +drm_for_each_connector_iter (connector_scan, &conn_iter) { +if (connector_scan->encoder == encoder) { + connector = connector_scan; +break ; + } + } +drm_connector_list_iter_end (&conn_iter); + +if (connector && connector->display_info.num_bus_formats) { +u32 bus_format = connector->display_info.bus_formats[0 ];switch (bus_format) {case MEDIA_BUS_FMT_RGB888_1X24 :@@ -199,6 +215,9 @@ static void vc4_dpi_encoder_enable(struct drm_encoder *encoder)DRM_ERROR ("Unknown media bus format %d\n" , bus_format);break ; } + }else { +/* Default to 24bit if no connector found. */ + dpi_c |=VC4_SET_FIELD (DPI_FORMAT_24BIT_888_RGB ,DPI_FORMAT ); }if (mode->flags &DRM_MODE_FLAG_NHSYNC )
drivers/gpu/drm/vc4/vc4_dpi.c static int vc4_dpi_init_bridge(struct vc4_dpi *dpi) · line 289
Quoted 8 lines
drivers/gpu/drm/vc4/vc4_dpi.c +1
-1@@ -264,7 +283,7 @@ static int vc4_dpi_init_bridge(struct vc4_dpi *dpi)return ret; } -if (panel) +if (panel) bridge =drm_panel_bridge_add (panel,DRM_MODE_CONNECTOR_DPI );return drm_bridge_attach (dpi->encoder, bridge,NULL );
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel