From 55c124cbf9b85e47ff2d8f95b533a3fe73cdba2a Mon Sep 17 00:00:00 2001 From: Sasha Levin Date: Mon, 25 Jul 2022 14:15:18 -0400 Subject: [PATCH] Fixes for 4.14 Signed-off-by: Sasha Levin --- ...remove-obsolete-crtc_mode_valid-hack.patch | 332 ++++++++++++++++++ queue-4.14/series | 2 + ...ternal-fix-an-incorrect-null-check-o.patch | 57 +++ 3 files changed, 391 insertions(+) create mode 100644 queue-4.14/drm-tilcdc-remove-obsolete-crtc_mode_valid-hack.patch create mode 100644 queue-4.14/tilcdc-tilcdc_external-fix-an-incorrect-null-check-o.patch diff --git a/queue-4.14/drm-tilcdc-remove-obsolete-crtc_mode_valid-hack.patch b/queue-4.14/drm-tilcdc-remove-obsolete-crtc_mode_valid-hack.patch new file mode 100644 index 00000000000..7f28eca69a8 --- /dev/null +++ b/queue-4.14/drm-tilcdc-remove-obsolete-crtc_mode_valid-hack.patch @@ -0,0 +1,332 @@ +From 511f362c6077b35546b702ff990dae62a593c3b8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 2 Aug 2019 15:55:22 +0300 +Subject: drm/tilcdc: Remove obsolete crtc_mode_valid() hack + +From: Jyri Sarha + +[ Upstream commit 57d8396504b3a93f284e51b866740a3e7419a3d9 ] + +Earlier there were no mode_valid() helper for crtc and tilcdc had a +hack to over come this limitation. But now the mode_valid() helper is +there (has been since v4.13), so it is about time to get rid of that +hack. + +Signed-off-by: Jyri Sarha +Reviewed-by: Laurent Pinchart +Link: https://patchwork.freedesktop.org/patch/msgid/ <5c4dcb5b1e7975bd2b7ca86f7addf219cd0f9a06.1564750248.git.jsarha@ti.com +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/tilcdc/tilcdc_crtc.c | 28 +++----- + drivers/gpu/drm/tilcdc/tilcdc_drv.c | 1 - + drivers/gpu/drm/tilcdc/tilcdc_drv.h | 2 - + drivers/gpu/drm/tilcdc/tilcdc_external.c | 88 +++--------------------- + drivers/gpu/drm/tilcdc/tilcdc_external.h | 1 - + drivers/gpu/drm/tilcdc/tilcdc_panel.c | 9 --- + drivers/gpu/drm/tilcdc/tilcdc_tfp410.c | 9 --- + 7 files changed, 19 insertions(+), 119 deletions(-) + +diff --git a/drivers/gpu/drm/tilcdc/tilcdc_crtc.c b/drivers/gpu/drm/tilcdc/tilcdc_crtc.c +index 06d6e785c920..7b11908d992a 100644 +--- a/drivers/gpu/drm/tilcdc/tilcdc_crtc.c ++++ b/drivers/gpu/drm/tilcdc/tilcdc_crtc.c +@@ -707,9 +707,6 @@ static bool tilcdc_crtc_mode_fixup(struct drm_crtc *crtc, + static int tilcdc_crtc_atomic_check(struct drm_crtc *crtc, + struct drm_crtc_state *state) + { +- struct drm_display_mode *mode = &state->mode; +- int ret; +- + /* If we are not active we don't care */ + if (!state->active) + return 0; +@@ -721,12 +718,6 @@ static int tilcdc_crtc_atomic_check(struct drm_crtc *crtc, + return -EINVAL; + } + +- ret = tilcdc_crtc_mode_valid(crtc, mode); +- if (ret) { +- dev_dbg(crtc->dev->dev, "Mode \"%s\" not valid", mode->name); +- return -EINVAL; +- } +- + return 0; + } + +@@ -750,13 +741,6 @@ static const struct drm_crtc_funcs tilcdc_crtc_funcs = { + .disable_vblank = tilcdc_crtc_disable_vblank, + }; + +-static const struct drm_crtc_helper_funcs tilcdc_crtc_helper_funcs = { +- .mode_fixup = tilcdc_crtc_mode_fixup, +- .atomic_check = tilcdc_crtc_atomic_check, +- .atomic_enable = tilcdc_crtc_atomic_enable, +- .atomic_disable = tilcdc_crtc_atomic_disable, +-}; +- + int tilcdc_crtc_max_width(struct drm_crtc *crtc) + { + struct drm_device *dev = crtc->dev; +@@ -771,7 +755,9 @@ int tilcdc_crtc_max_width(struct drm_crtc *crtc) + return max_width; + } + +-int tilcdc_crtc_mode_valid(struct drm_crtc *crtc, struct drm_display_mode *mode) ++static enum drm_mode_status ++tilcdc_crtc_mode_valid(struct drm_crtc *crtc, ++ const struct drm_display_mode *mode) + { + struct tilcdc_drm_private *priv = crtc->dev->dev_private; + unsigned int bandwidth; +@@ -859,6 +845,14 @@ int tilcdc_crtc_mode_valid(struct drm_crtc *crtc, struct drm_display_mode *mode) + return MODE_OK; + } + ++static const struct drm_crtc_helper_funcs tilcdc_crtc_helper_funcs = { ++ .mode_valid = tilcdc_crtc_mode_valid, ++ .mode_fixup = tilcdc_crtc_mode_fixup, ++ .atomic_check = tilcdc_crtc_atomic_check, ++ .atomic_enable = tilcdc_crtc_atomic_enable, ++ .atomic_disable = tilcdc_crtc_atomic_disable, ++}; ++ + void tilcdc_crtc_set_panel_info(struct drm_crtc *crtc, + const struct tilcdc_panel_info *info) + { +diff --git a/drivers/gpu/drm/tilcdc/tilcdc_drv.c b/drivers/gpu/drm/tilcdc/tilcdc_drv.c +index 56039897607c..d42e1f9f2949 100644 +--- a/drivers/gpu/drm/tilcdc/tilcdc_drv.c ++++ b/drivers/gpu/drm/tilcdc/tilcdc_drv.c +@@ -208,7 +208,6 @@ static void tilcdc_fini(struct drm_device *dev) + + drm_irq_uninstall(dev); + drm_mode_config_cleanup(dev); +- tilcdc_remove_external_device(dev); + + if (priv->clk) + clk_put(priv->clk); +diff --git a/drivers/gpu/drm/tilcdc/tilcdc_drv.h b/drivers/gpu/drm/tilcdc/tilcdc_drv.h +index 8caa11bc7aec..c0ab69c79a93 100644 +--- a/drivers/gpu/drm/tilcdc/tilcdc_drv.h ++++ b/drivers/gpu/drm/tilcdc/tilcdc_drv.h +@@ -91,7 +91,6 @@ struct tilcdc_drm_private { + + struct drm_encoder *external_encoder; + struct drm_connector *external_connector; +- const struct drm_connector_helper_funcs *connector_funcs; + + bool is_registered; + bool is_componentized; +@@ -173,7 +172,6 @@ void tilcdc_crtc_set_panel_info(struct drm_crtc *crtc, + const struct tilcdc_panel_info *info); + void tilcdc_crtc_set_simulate_vesa_sync(struct drm_crtc *crtc, + bool simulate_vesa_sync); +-int tilcdc_crtc_mode_valid(struct drm_crtc *crtc, struct drm_display_mode *mode); + int tilcdc_crtc_max_width(struct drm_crtc *crtc); + void tilcdc_crtc_shutdown(struct drm_crtc *crtc); + int tilcdc_crtc_update_fb(struct drm_crtc *crtc, +diff --git a/drivers/gpu/drm/tilcdc/tilcdc_external.c b/drivers/gpu/drm/tilcdc/tilcdc_external.c +index 711c7b3289d3..9c8520569d31 100644 +--- a/drivers/gpu/drm/tilcdc/tilcdc_external.c ++++ b/drivers/gpu/drm/tilcdc/tilcdc_external.c +@@ -40,64 +40,6 @@ static const struct tilcdc_panel_info panel_info_default = { + .raster_order = 0, + }; + +-static int tilcdc_external_mode_valid(struct drm_connector *connector, +- struct drm_display_mode *mode) +-{ +- struct tilcdc_drm_private *priv = connector->dev->dev_private; +- int ret; +- +- ret = tilcdc_crtc_mode_valid(priv->crtc, mode); +- if (ret != MODE_OK) +- return ret; +- +- BUG_ON(priv->external_connector != connector); +- BUG_ON(!priv->connector_funcs); +- +- /* If the connector has its own mode_valid call it. */ +- if (!IS_ERR(priv->connector_funcs) && +- priv->connector_funcs->mode_valid) +- return priv->connector_funcs->mode_valid(connector, mode); +- +- return MODE_OK; +-} +- +-static int tilcdc_add_external_connector(struct drm_device *dev, +- struct drm_connector *connector) +-{ +- struct tilcdc_drm_private *priv = dev->dev_private; +- struct drm_connector_helper_funcs *connector_funcs; +- +- /* There should never be more than one connector */ +- if (WARN_ON(priv->external_connector)) +- return -EINVAL; +- +- priv->external_connector = connector; +- connector_funcs = devm_kzalloc(dev->dev, sizeof(*connector_funcs), +- GFP_KERNEL); +- if (!connector_funcs) +- return -ENOMEM; +- +- /* connector->helper_private contains always struct +- * connector_helper_funcs pointer. For tilcdc crtc to have a +- * say if a specific mode is Ok, we need to install our own +- * helper functions. In our helper functions we copy +- * everything else but use our own mode_valid() (above). +- */ +- if (connector->helper_private) { +- priv->connector_funcs = connector->helper_private; +- *connector_funcs = *priv->connector_funcs; +- } else { +- priv->connector_funcs = ERR_PTR(-ENOENT); +- } +- connector_funcs->mode_valid = tilcdc_external_mode_valid; +- drm_connector_helper_add(connector, connector_funcs); +- +- dev_dbg(dev->dev, "External connector '%s' connected\n", +- connector->name); +- +- return 0; +-} +- + static + struct drm_connector *tilcdc_encoder_find_connector(struct drm_device *ddev, + struct drm_encoder *encoder) +@@ -119,7 +61,6 @@ struct drm_connector *tilcdc_encoder_find_connector(struct drm_device *ddev, + int tilcdc_add_component_encoder(struct drm_device *ddev) + { + struct tilcdc_drm_private *priv = ddev->dev_private; +- struct drm_connector *connector; + struct drm_encoder *encoder; + + list_for_each_entry(encoder, &ddev->mode_config.encoder_list, head) +@@ -131,28 +72,17 @@ int tilcdc_add_component_encoder(struct drm_device *ddev) + return -ENODEV; + } + +- connector = tilcdc_encoder_find_connector(ddev, encoder); ++ priv->external_connector = ++ tilcdc_encoder_find_connector(ddev, encoder); + +- if (!connector) ++ if (!priv->external_connector) + return -ENODEV; + + /* Only tda998x is supported at the moment. */ + tilcdc_crtc_set_simulate_vesa_sync(priv->crtc, true); + tilcdc_crtc_set_panel_info(priv->crtc, &panel_info_tda998x); + +- return tilcdc_add_external_connector(ddev, connector); +-} +- +-void tilcdc_remove_external_device(struct drm_device *dev) +-{ +- struct tilcdc_drm_private *priv = dev->dev_private; +- +- /* Restore the original helper functions, if any. */ +- if (IS_ERR(priv->connector_funcs)) +- drm_connector_helper_add(priv->external_connector, NULL); +- else if (priv->connector_funcs) +- drm_connector_helper_add(priv->external_connector, +- priv->connector_funcs); ++ return 0; + } + + static const struct drm_encoder_funcs tilcdc_external_encoder_funcs = { +@@ -163,7 +93,6 @@ static + int tilcdc_attach_bridge(struct drm_device *ddev, struct drm_bridge *bridge) + { + struct tilcdc_drm_private *priv = ddev->dev_private; +- struct drm_connector *connector; + int ret; + + priv->external_encoder->possible_crtcs = BIT(0); +@@ -176,13 +105,12 @@ int tilcdc_attach_bridge(struct drm_device *ddev, struct drm_bridge *bridge) + + tilcdc_crtc_set_panel_info(priv->crtc, &panel_info_default); + +- connector = tilcdc_encoder_find_connector(ddev, priv->external_encoder); +- if (!connector) ++ priv->external_connector = ++ tilcdc_encoder_find_connector(ddev, priv->external_encoder); ++ if (!priv->external_connector) + return -ENODEV; + +- ret = tilcdc_add_external_connector(ddev, connector); +- +- return ret; ++ return 0; + } + + int tilcdc_attach_external_device(struct drm_device *ddev) +diff --git a/drivers/gpu/drm/tilcdc/tilcdc_external.h b/drivers/gpu/drm/tilcdc/tilcdc_external.h +index 763d18f006c7..a28b9df68c8f 100644 +--- a/drivers/gpu/drm/tilcdc/tilcdc_external.h ++++ b/drivers/gpu/drm/tilcdc/tilcdc_external.h +@@ -19,7 +19,6 @@ + #define __TILCDC_EXTERNAL_H__ + + int tilcdc_add_component_encoder(struct drm_device *dev); +-void tilcdc_remove_external_device(struct drm_device *dev); + int tilcdc_get_external_components(struct device *dev, + struct component_match **match); + int tilcdc_attach_external_device(struct drm_device *ddev); +diff --git a/drivers/gpu/drm/tilcdc/tilcdc_panel.c b/drivers/gpu/drm/tilcdc/tilcdc_panel.c +index 0484b2cf0e2b..f67a6194fd65 100644 +--- a/drivers/gpu/drm/tilcdc/tilcdc_panel.c ++++ b/drivers/gpu/drm/tilcdc/tilcdc_panel.c +@@ -176,14 +176,6 @@ static int panel_connector_get_modes(struct drm_connector *connector) + return i; + } + +-static int panel_connector_mode_valid(struct drm_connector *connector, +- struct drm_display_mode *mode) +-{ +- struct tilcdc_drm_private *priv = connector->dev->dev_private; +- /* our only constraints are what the crtc can generate: */ +- return tilcdc_crtc_mode_valid(priv->crtc, mode); +-} +- + static struct drm_encoder *panel_connector_best_encoder( + struct drm_connector *connector) + { +@@ -201,7 +193,6 @@ static const struct drm_connector_funcs panel_connector_funcs = { + + static const struct drm_connector_helper_funcs panel_connector_helper_funcs = { + .get_modes = panel_connector_get_modes, +- .mode_valid = panel_connector_mode_valid, + .best_encoder = panel_connector_best_encoder, + }; + +diff --git a/drivers/gpu/drm/tilcdc/tilcdc_tfp410.c b/drivers/gpu/drm/tilcdc/tilcdc_tfp410.c +index 1e2dfb1b1d6b..68c7bbba24e9 100644 +--- a/drivers/gpu/drm/tilcdc/tilcdc_tfp410.c ++++ b/drivers/gpu/drm/tilcdc/tilcdc_tfp410.c +@@ -185,14 +185,6 @@ static int tfp410_connector_get_modes(struct drm_connector *connector) + return ret; + } + +-static int tfp410_connector_mode_valid(struct drm_connector *connector, +- struct drm_display_mode *mode) +-{ +- struct tilcdc_drm_private *priv = connector->dev->dev_private; +- /* our only constraints are what the crtc can generate: */ +- return tilcdc_crtc_mode_valid(priv->crtc, mode); +-} +- + static struct drm_encoder *tfp410_connector_best_encoder( + struct drm_connector *connector) + { +@@ -211,7 +203,6 @@ static const struct drm_connector_funcs tfp410_connector_funcs = { + + static const struct drm_connector_helper_funcs tfp410_connector_helper_funcs = { + .get_modes = tfp410_connector_get_modes, +- .mode_valid = tfp410_connector_mode_valid, + .best_encoder = tfp410_connector_best_encoder, + }; + +-- +2.35.1 + diff --git a/queue-4.14/series b/queue-4.14/series index 964e0d6a1cd..23b9c1133ca 100644 --- a/queue-4.14/series +++ b/queue-4.14/series @@ -15,3 +15,5 @@ be2net-fix-buffer-overflow-in-be_get_module_eeprom.patch revert-revert-char-random-silence-a-lockdep-splat-with-printk.patch mm-mempolicy-fix-uninit-value-in-mpol_rebind_policy.patch bpf-make-sure-mac_header-was-set-before-using-it.patch +drm-tilcdc-remove-obsolete-crtc_mode_valid-hack.patch +tilcdc-tilcdc_external-fix-an-incorrect-null-check-o.patch diff --git a/queue-4.14/tilcdc-tilcdc_external-fix-an-incorrect-null-check-o.patch b/queue-4.14/tilcdc-tilcdc_external-fix-an-incorrect-null-check-o.patch new file mode 100644 index 00000000000..e5643b616e7 --- /dev/null +++ b/queue-4.14/tilcdc-tilcdc_external-fix-an-incorrect-null-check-o.patch @@ -0,0 +1,57 @@ +From ec138478927a96b5b309171f81c867df8317f761 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 27 Mar 2022 14:15:16 +0800 +Subject: tilcdc: tilcdc_external: fix an incorrect NULL check on list iterator + +From: Xiaomeng Tong + +[ Upstream commit 8b917cbe38e9b0d002492477a9fc2bfee2412ce4 ] + +The bug is here: + if (!encoder) { + +The list iterator value 'encoder' will *always* be set and non-NULL +by list_for_each_entry(), so it is incorrect to assume that the +iterator value will be NULL if the list is empty or no element +is found. + +To fix the bug, use a new variable 'iter' as the list iterator, +while use the original variable 'encoder' as a dedicated pointer +to point to the found element. + +Cc: stable@vger.kernel.org +Fixes: ec9eab097a500 ("drm/tilcdc: Add drm bridge support for attaching drm bridge drivers") +Signed-off-by: Xiaomeng Tong +Reviewed-by: Jyri Sarha +Tested-by: Jyri Sarha +Signed-off-by: Jyri Sarha +Link: https://patchwork.freedesktop.org/patch/msgid/20220327061516.5076-1-xiam0nd.tong@gmail.com +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/tilcdc/tilcdc_external.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/drivers/gpu/drm/tilcdc/tilcdc_external.c b/drivers/gpu/drm/tilcdc/tilcdc_external.c +index 9c8520569d31..511e178012cd 100644 +--- a/drivers/gpu/drm/tilcdc/tilcdc_external.c ++++ b/drivers/gpu/drm/tilcdc/tilcdc_external.c +@@ -61,11 +61,13 @@ struct drm_connector *tilcdc_encoder_find_connector(struct drm_device *ddev, + int tilcdc_add_component_encoder(struct drm_device *ddev) + { + struct tilcdc_drm_private *priv = ddev->dev_private; +- struct drm_encoder *encoder; ++ struct drm_encoder *encoder = NULL, *iter; + +- list_for_each_entry(encoder, &ddev->mode_config.encoder_list, head) +- if (encoder->possible_crtcs & (1 << priv->crtc->index)) ++ list_for_each_entry(iter, &ddev->mode_config.encoder_list, head) ++ if (iter->possible_crtcs & (1 << priv->crtc->index)) { ++ encoder = iter; + break; ++ } + + if (!encoder) { + dev_err(ddev->dev, "%s: No suitable encoder found\n", __func__); +-- +2.35.1 + -- 2.47.3