From: Sasha Levin Date: Sun, 10 Mar 2024 13:17:21 +0000 (-0400) Subject: Drop drm-bridge-add-transparent-bridge-helper.patch X-Git-Tag: v6.8.1~23 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e61281ad02e59240b9da6b9c32135ac501b8f64a;p=thirdparty%2Fkernel%2Fstable-queue.git Drop drm-bridge-add-transparent-bridge-helper.patch Signed-off-by: Sasha Levin --- diff --git a/queue-6.6/drm-bridge-add-transparent-bridge-helper.patch b/queue-6.6/drm-bridge-add-transparent-bridge-helper.patch deleted file mode 100644 index 367a1dcdd91..00000000000 --- a/queue-6.6/drm-bridge-add-transparent-bridge-helper.patch +++ /dev/null @@ -1,233 +0,0 @@ -From 62aa603606683e56c0e967003e07e93b73d8e901 Mon Sep 17 00:00:00 2001 -From: Sasha Levin -Date: Sun, 3 Dec 2023 14:43:28 +0300 -Subject: drm/bridge: add transparent bridge helper - -From: Dmitry Baryshkov - -[ Upstream commit 2a04739139b2b2761571e18937e2400e71eff664 ] - -Define a helper for creating simple transparent bridges which serve the -only purpose of linking devices into the bridge chain up to the last -bridge representing the connector. This is especially useful for -DP/USB-C bridge chains, which can span across several devices, but do -not require any additional functionality from the intermediate bridges. - -Reviewed-by: Neil Armstrong -Signed-off-by: Dmitry Baryshkov -Link: https://patchwork.freedesktop.org/patch/msgid/20231203114333.1305826-2-dmitry.baryshkov@linaro.org -Stable-dep-of: b979f2d50a09 ("soc: qcom: pmic_glink_altmode: fix drm bridge use-after-free") -Signed-off-by: Sasha Levin ---- - drivers/gpu/drm/bridge/Kconfig | 9 ++ - drivers/gpu/drm/bridge/Makefile | 1 + - drivers/gpu/drm/bridge/aux-bridge.c | 140 ++++++++++++++++++++++++++++ - include/drm/bridge/aux-bridge.h | 19 ++++ - 4 files changed, 169 insertions(+) - create mode 100644 drivers/gpu/drm/bridge/aux-bridge.c - create mode 100644 include/drm/bridge/aux-bridge.h - -diff --git a/drivers/gpu/drm/bridge/Kconfig b/drivers/gpu/drm/bridge/Kconfig -index 3e6a4e2044c0e..a22645efe93a0 100644 ---- a/drivers/gpu/drm/bridge/Kconfig -+++ b/drivers/gpu/drm/bridge/Kconfig -@@ -12,6 +12,15 @@ config DRM_PANEL_BRIDGE - help - DRM bridge wrapper of DRM panels - -+config DRM_AUX_BRIDGE -+ tristate -+ depends on DRM_BRIDGE && OF -+ select AUXILIARY_BUS -+ select DRM_PANEL_BRIDGE -+ help -+ Simple transparent bridge that is used by several non-DRM drivers to -+ build bridges chain. -+ - menu "Display Interface Bridges" - depends on DRM && DRM_BRIDGE - -diff --git a/drivers/gpu/drm/bridge/Makefile b/drivers/gpu/drm/bridge/Makefile -index 2b892b7ed59e8..918e3bfff079c 100644 ---- a/drivers/gpu/drm/bridge/Makefile -+++ b/drivers/gpu/drm/bridge/Makefile -@@ -1,4 +1,5 @@ - # SPDX-License-Identifier: GPL-2.0 -+obj-$(CONFIG_DRM_AUX_BRIDGE) += aux-bridge.o - obj-$(CONFIG_DRM_CHIPONE_ICN6211) += chipone-icn6211.o - obj-$(CONFIG_DRM_CHRONTEL_CH7033) += chrontel-ch7033.o - obj-$(CONFIG_DRM_CROS_EC_ANX7688) += cros-ec-anx7688.o -diff --git a/drivers/gpu/drm/bridge/aux-bridge.c b/drivers/gpu/drm/bridge/aux-bridge.c -new file mode 100644 -index 0000000000000..49d7c2ab1ecc3 ---- /dev/null -+++ b/drivers/gpu/drm/bridge/aux-bridge.c -@@ -0,0 +1,140 @@ -+// SPDX-License-Identifier: GPL-2.0+ -+/* -+ * Copyright (C) 2023 Linaro Ltd. -+ * -+ * Author: Dmitry Baryshkov -+ */ -+#include -+#include -+ -+#include -+#include -+ -+static DEFINE_IDA(drm_aux_bridge_ida); -+ -+static void drm_aux_bridge_release(struct device *dev) -+{ -+ struct auxiliary_device *adev = to_auxiliary_dev(dev); -+ -+ ida_free(&drm_aux_bridge_ida, adev->id); -+ -+ kfree(adev); -+} -+ -+static void drm_aux_bridge_unregister_adev(void *_adev) -+{ -+ struct auxiliary_device *adev = _adev; -+ -+ auxiliary_device_delete(adev); -+ auxiliary_device_uninit(adev); -+} -+ -+/** -+ * drm_aux_bridge_register - Create a simple bridge device to link the chain -+ * @parent: device instance providing this bridge -+ * -+ * Creates a simple DRM bridge that doesn't implement any drm_bridge -+ * operations. Such bridges merely fill a place in the bridge chain linking -+ * surrounding DRM bridges. -+ * -+ * Return: zero on success, negative error code on failure -+ */ -+int drm_aux_bridge_register(struct device *parent) -+{ -+ struct auxiliary_device *adev; -+ int ret; -+ -+ adev = kzalloc(sizeof(*adev), GFP_KERNEL); -+ if (!adev) -+ return -ENOMEM; -+ -+ ret = ida_alloc(&drm_aux_bridge_ida, GFP_KERNEL); -+ if (ret < 0) { -+ kfree(adev); -+ return ret; -+ } -+ -+ adev->id = ret; -+ adev->name = "aux_bridge"; -+ adev->dev.parent = parent; -+ adev->dev.of_node = parent->of_node; -+ adev->dev.release = drm_aux_bridge_release; -+ -+ ret = auxiliary_device_init(adev); -+ if (ret) { -+ ida_free(&drm_aux_bridge_ida, adev->id); -+ kfree(adev); -+ return ret; -+ } -+ -+ ret = auxiliary_device_add(adev); -+ if (ret) { -+ auxiliary_device_uninit(adev); -+ return ret; -+ } -+ -+ return devm_add_action_or_reset(parent, drm_aux_bridge_unregister_adev, adev); -+} -+EXPORT_SYMBOL_GPL(drm_aux_bridge_register); -+ -+struct drm_aux_bridge_data { -+ struct drm_bridge bridge; -+ struct drm_bridge *next_bridge; -+ struct device *dev; -+}; -+ -+static int drm_aux_bridge_attach(struct drm_bridge *bridge, -+ enum drm_bridge_attach_flags flags) -+{ -+ struct drm_aux_bridge_data *data; -+ -+ if (!(flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)) -+ return -EINVAL; -+ -+ data = container_of(bridge, struct drm_aux_bridge_data, bridge); -+ -+ return drm_bridge_attach(bridge->encoder, data->next_bridge, bridge, -+ DRM_BRIDGE_ATTACH_NO_CONNECTOR); -+} -+ -+static const struct drm_bridge_funcs drm_aux_bridge_funcs = { -+ .attach = drm_aux_bridge_attach, -+}; -+ -+static int drm_aux_bridge_probe(struct auxiliary_device *auxdev, -+ const struct auxiliary_device_id *id) -+{ -+ struct drm_aux_bridge_data *data; -+ -+ data = devm_kzalloc(&auxdev->dev, sizeof(*data), GFP_KERNEL); -+ if (!data) -+ return -ENOMEM; -+ -+ data->dev = &auxdev->dev; -+ data->next_bridge = devm_drm_of_get_bridge(&auxdev->dev, auxdev->dev.of_node, 0, 0); -+ if (IS_ERR(data->next_bridge)) -+ return dev_err_probe(&auxdev->dev, PTR_ERR(data->next_bridge), -+ "failed to acquire drm_bridge\n"); -+ -+ data->bridge.funcs = &drm_aux_bridge_funcs; -+ data->bridge.of_node = data->dev->of_node; -+ -+ return devm_drm_bridge_add(data->dev, &data->bridge); -+} -+ -+static const struct auxiliary_device_id drm_aux_bridge_table[] = { -+ { .name = KBUILD_MODNAME ".aux_bridge" }, -+ {}, -+}; -+MODULE_DEVICE_TABLE(auxiliary, drm_aux_bridge_table); -+ -+static struct auxiliary_driver drm_aux_bridge_drv = { -+ .name = "aux_bridge", -+ .id_table = drm_aux_bridge_table, -+ .probe = drm_aux_bridge_probe, -+}; -+module_auxiliary_driver(drm_aux_bridge_drv); -+ -+MODULE_AUTHOR("Dmitry Baryshkov "); -+MODULE_DESCRIPTION("DRM transparent bridge"); -+MODULE_LICENSE("GPL"); -diff --git a/include/drm/bridge/aux-bridge.h b/include/drm/bridge/aux-bridge.h -new file mode 100644 -index 0000000000000..b3a9cc9c862fd ---- /dev/null -+++ b/include/drm/bridge/aux-bridge.h -@@ -0,0 +1,19 @@ -+/* SPDX-License-Identifier: GPL-2.0+ */ -+/* -+ * Copyright (C) 2023 Linaro Ltd. -+ * -+ * Author: Dmitry Baryshkov -+ */ -+#ifndef DRM_AUX_BRIDGE_H -+#define DRM_AUX_BRIDGE_H -+ -+#if IS_ENABLED(CONFIG_DRM_AUX_BRIDGE) -+int drm_aux_bridge_register(struct device *parent); -+#else -+static inline int drm_aux_bridge_register(struct device *parent) -+{ -+ return 0; -+} -+#endif -+ -+#endif --- -2.43.0 - diff --git a/queue-6.6/series b/queue-6.6/series index 67e3d00eaf9..28241821c84 100644 --- a/queue-6.6/series +++ b/queue-6.6/series @@ -1,4 +1,3 @@ -drm-bridge-add-transparent-bridge-helper.patch dt-bindings-dma-fsl-edma-add-fsl-edma.h-to-prevent-h.patch dmaengine-fsl-edma-utilize-common-dt-binding-header-.patch dmaengine-fsl-edma-correct-max_segment_size-setting.patch diff --git a/queue-6.7/drm-bridge-add-transparent-bridge-helper.patch b/queue-6.7/drm-bridge-add-transparent-bridge-helper.patch deleted file mode 100644 index 3932022cae4..00000000000 --- a/queue-6.7/drm-bridge-add-transparent-bridge-helper.patch +++ /dev/null @@ -1,233 +0,0 @@ -From 17e9df4c7836d0de0a085dca309eba6b7a2c2747 Mon Sep 17 00:00:00 2001 -From: Sasha Levin -Date: Sun, 3 Dec 2023 14:43:28 +0300 -Subject: drm/bridge: add transparent bridge helper - -From: Dmitry Baryshkov - -[ Upstream commit 2a04739139b2b2761571e18937e2400e71eff664 ] - -Define a helper for creating simple transparent bridges which serve the -only purpose of linking devices into the bridge chain up to the last -bridge representing the connector. This is especially useful for -DP/USB-C bridge chains, which can span across several devices, but do -not require any additional functionality from the intermediate bridges. - -Reviewed-by: Neil Armstrong -Signed-off-by: Dmitry Baryshkov -Link: https://patchwork.freedesktop.org/patch/msgid/20231203114333.1305826-2-dmitry.baryshkov@linaro.org -Stable-dep-of: b979f2d50a09 ("soc: qcom: pmic_glink_altmode: fix drm bridge use-after-free") -Signed-off-by: Sasha Levin ---- - drivers/gpu/drm/bridge/Kconfig | 9 ++ - drivers/gpu/drm/bridge/Makefile | 1 + - drivers/gpu/drm/bridge/aux-bridge.c | 140 ++++++++++++++++++++++++++++ - include/drm/bridge/aux-bridge.h | 19 ++++ - 4 files changed, 169 insertions(+) - create mode 100644 drivers/gpu/drm/bridge/aux-bridge.c - create mode 100644 include/drm/bridge/aux-bridge.h - -diff --git a/drivers/gpu/drm/bridge/Kconfig b/drivers/gpu/drm/bridge/Kconfig -index 3e6a4e2044c0e..a22645efe93a0 100644 ---- a/drivers/gpu/drm/bridge/Kconfig -+++ b/drivers/gpu/drm/bridge/Kconfig -@@ -12,6 +12,15 @@ config DRM_PANEL_BRIDGE - help - DRM bridge wrapper of DRM panels - -+config DRM_AUX_BRIDGE -+ tristate -+ depends on DRM_BRIDGE && OF -+ select AUXILIARY_BUS -+ select DRM_PANEL_BRIDGE -+ help -+ Simple transparent bridge that is used by several non-DRM drivers to -+ build bridges chain. -+ - menu "Display Interface Bridges" - depends on DRM && DRM_BRIDGE - -diff --git a/drivers/gpu/drm/bridge/Makefile b/drivers/gpu/drm/bridge/Makefile -index 2b892b7ed59e8..918e3bfff079c 100644 ---- a/drivers/gpu/drm/bridge/Makefile -+++ b/drivers/gpu/drm/bridge/Makefile -@@ -1,4 +1,5 @@ - # SPDX-License-Identifier: GPL-2.0 -+obj-$(CONFIG_DRM_AUX_BRIDGE) += aux-bridge.o - obj-$(CONFIG_DRM_CHIPONE_ICN6211) += chipone-icn6211.o - obj-$(CONFIG_DRM_CHRONTEL_CH7033) += chrontel-ch7033.o - obj-$(CONFIG_DRM_CROS_EC_ANX7688) += cros-ec-anx7688.o -diff --git a/drivers/gpu/drm/bridge/aux-bridge.c b/drivers/gpu/drm/bridge/aux-bridge.c -new file mode 100644 -index 0000000000000..49d7c2ab1ecc3 ---- /dev/null -+++ b/drivers/gpu/drm/bridge/aux-bridge.c -@@ -0,0 +1,140 @@ -+// SPDX-License-Identifier: GPL-2.0+ -+/* -+ * Copyright (C) 2023 Linaro Ltd. -+ * -+ * Author: Dmitry Baryshkov -+ */ -+#include -+#include -+ -+#include -+#include -+ -+static DEFINE_IDA(drm_aux_bridge_ida); -+ -+static void drm_aux_bridge_release(struct device *dev) -+{ -+ struct auxiliary_device *adev = to_auxiliary_dev(dev); -+ -+ ida_free(&drm_aux_bridge_ida, adev->id); -+ -+ kfree(adev); -+} -+ -+static void drm_aux_bridge_unregister_adev(void *_adev) -+{ -+ struct auxiliary_device *adev = _adev; -+ -+ auxiliary_device_delete(adev); -+ auxiliary_device_uninit(adev); -+} -+ -+/** -+ * drm_aux_bridge_register - Create a simple bridge device to link the chain -+ * @parent: device instance providing this bridge -+ * -+ * Creates a simple DRM bridge that doesn't implement any drm_bridge -+ * operations. Such bridges merely fill a place in the bridge chain linking -+ * surrounding DRM bridges. -+ * -+ * Return: zero on success, negative error code on failure -+ */ -+int drm_aux_bridge_register(struct device *parent) -+{ -+ struct auxiliary_device *adev; -+ int ret; -+ -+ adev = kzalloc(sizeof(*adev), GFP_KERNEL); -+ if (!adev) -+ return -ENOMEM; -+ -+ ret = ida_alloc(&drm_aux_bridge_ida, GFP_KERNEL); -+ if (ret < 0) { -+ kfree(adev); -+ return ret; -+ } -+ -+ adev->id = ret; -+ adev->name = "aux_bridge"; -+ adev->dev.parent = parent; -+ adev->dev.of_node = parent->of_node; -+ adev->dev.release = drm_aux_bridge_release; -+ -+ ret = auxiliary_device_init(adev); -+ if (ret) { -+ ida_free(&drm_aux_bridge_ida, adev->id); -+ kfree(adev); -+ return ret; -+ } -+ -+ ret = auxiliary_device_add(adev); -+ if (ret) { -+ auxiliary_device_uninit(adev); -+ return ret; -+ } -+ -+ return devm_add_action_or_reset(parent, drm_aux_bridge_unregister_adev, adev); -+} -+EXPORT_SYMBOL_GPL(drm_aux_bridge_register); -+ -+struct drm_aux_bridge_data { -+ struct drm_bridge bridge; -+ struct drm_bridge *next_bridge; -+ struct device *dev; -+}; -+ -+static int drm_aux_bridge_attach(struct drm_bridge *bridge, -+ enum drm_bridge_attach_flags flags) -+{ -+ struct drm_aux_bridge_data *data; -+ -+ if (!(flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)) -+ return -EINVAL; -+ -+ data = container_of(bridge, struct drm_aux_bridge_data, bridge); -+ -+ return drm_bridge_attach(bridge->encoder, data->next_bridge, bridge, -+ DRM_BRIDGE_ATTACH_NO_CONNECTOR); -+} -+ -+static const struct drm_bridge_funcs drm_aux_bridge_funcs = { -+ .attach = drm_aux_bridge_attach, -+}; -+ -+static int drm_aux_bridge_probe(struct auxiliary_device *auxdev, -+ const struct auxiliary_device_id *id) -+{ -+ struct drm_aux_bridge_data *data; -+ -+ data = devm_kzalloc(&auxdev->dev, sizeof(*data), GFP_KERNEL); -+ if (!data) -+ return -ENOMEM; -+ -+ data->dev = &auxdev->dev; -+ data->next_bridge = devm_drm_of_get_bridge(&auxdev->dev, auxdev->dev.of_node, 0, 0); -+ if (IS_ERR(data->next_bridge)) -+ return dev_err_probe(&auxdev->dev, PTR_ERR(data->next_bridge), -+ "failed to acquire drm_bridge\n"); -+ -+ data->bridge.funcs = &drm_aux_bridge_funcs; -+ data->bridge.of_node = data->dev->of_node; -+ -+ return devm_drm_bridge_add(data->dev, &data->bridge); -+} -+ -+static const struct auxiliary_device_id drm_aux_bridge_table[] = { -+ { .name = KBUILD_MODNAME ".aux_bridge" }, -+ {}, -+}; -+MODULE_DEVICE_TABLE(auxiliary, drm_aux_bridge_table); -+ -+static struct auxiliary_driver drm_aux_bridge_drv = { -+ .name = "aux_bridge", -+ .id_table = drm_aux_bridge_table, -+ .probe = drm_aux_bridge_probe, -+}; -+module_auxiliary_driver(drm_aux_bridge_drv); -+ -+MODULE_AUTHOR("Dmitry Baryshkov "); -+MODULE_DESCRIPTION("DRM transparent bridge"); -+MODULE_LICENSE("GPL"); -diff --git a/include/drm/bridge/aux-bridge.h b/include/drm/bridge/aux-bridge.h -new file mode 100644 -index 0000000000000..b3a9cc9c862fd ---- /dev/null -+++ b/include/drm/bridge/aux-bridge.h -@@ -0,0 +1,19 @@ -+/* SPDX-License-Identifier: GPL-2.0+ */ -+/* -+ * Copyright (C) 2023 Linaro Ltd. -+ * -+ * Author: Dmitry Baryshkov -+ */ -+#ifndef DRM_AUX_BRIDGE_H -+#define DRM_AUX_BRIDGE_H -+ -+#if IS_ENABLED(CONFIG_DRM_AUX_BRIDGE) -+int drm_aux_bridge_register(struct device *parent); -+#else -+static inline int drm_aux_bridge_register(struct device *parent) -+{ -+ return 0; -+} -+#endif -+ -+#endif --- -2.43.0 - diff --git a/queue-6.7/series b/queue-6.7/series index cd6543f5feb..4d73fa435af 100644 --- a/queue-6.7/series +++ b/queue-6.7/series @@ -1,4 +1,3 @@ -drm-bridge-add-transparent-bridge-helper.patch dt-bindings-dma-fsl-edma-add-fsl-edma.h-to-prevent-h.patch dmaengine-fsl-edma-utilize-common-dt-binding-header-.patch dmaengine-fsl-edma-correct-max_segment_size-setting.patch