Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1617933 > unrolled thread
| Started by | Your Name <you@example.com> |
|---|---|
| First post | 2017-04-06 14:30 +0200 |
| Last post | 2017-04-06 14:30 +0200 |
| Articles | 8 — 1 participant |
Back to article view | Back to linux.kernel
[PATCH v4 00/12] drm: rockchip: Fix rockchip drm unbind crash error Your Name <you@example.com> - 2017-04-06 14:30 +0200
[PATCH v4 12/12] drm/drm_ioctl.c: Break ioctl when drm device not registered Your Name <you@example.com> - 2017-04-06 14:30 +0200
[PATCH v4 01/12] drm: bridge: analogix: Detach panel when unbinding analogix dp Your Name <you@example.com> - 2017-04-06 14:30 +0200
[PATCH v4 04/12] drm: bridge: analogix: Destroy connector & encoder when unbinding Your Name <you@example.com> - 2017-04-06 14:30 +0200
[PATCH v4 06/12] drm/rockchip: cdn-dp: Don't unregister audio dev when unbinding Your Name <you@example.com> - 2017-04-06 14:30 +0200
[PATCH v4 05/12] drm/rockchip: cdn-dp: Don't try to release firmware when not loaded Your Name <you@example.com> - 2017-04-06 14:30 +0200
[PATCH v4 02/12] drm: bridge: analogix: Unregister dp aux when unbinding Your Name <you@example.com> - 2017-04-06 14:30 +0200
[PATCH v4 10/12] drm/rockchip: Reoder drm bind/unbind sequence Your Name <you@example.com> - 2017-04-06 14:30 +0200
| From | Your Name <you@example.com> |
|---|---|
| Date | 2017-04-06 14:30 +0200 |
| Subject | [PATCH v4 00/12] drm: rockchip: Fix rockchip drm unbind crash error |
| Message-ID | <tteI2-8tl-9@gated-at.bofh.it> |
Verified on rk3399 chromebook kevin: 1/ stop ui && pkill -9 frecon 2/ unbind/bind drm Changes in v4: Address Andrzej Hajda <a.hajda@samsung.com>'s comments. Changes in v3: Update commit message. Address Sean Paul <seanpaul@chromium.org>'s comments. Update commit message. Address Sean Paul <seanpaul@chromium.org>'s comments. Update commit message. Address Daniel Vetter <daniel@ffwll.ch>'s comments. Update commit message. Changes in v2: Fix some commit messages. Jeffy Chen (12): drm: bridge: analogix: Detach panel when unbinding analogix dp drm: bridge: analogix: Unregister dp aux when unbinding drm: bridge: analogix: Disable clock when unbinding drm: bridge: analogix: Destroy connector & encoder when unbinding drm/rockchip: cdn-dp: Don't try to release firmware when not loaded drm/rockchip: cdn-dp: Don't unregister audio dev when unbinding drm/rockchip: vop: Enable pm domain before vop_initial drm/rockchip: vop: Unprepare clocks when unbinding drm/rockchip: analogix_dp: Disable clock when unbinding drm/rockchip: Reoder drm bind/unbind sequence drm/rockchip: Shutdown all crtcs when unbinding drm drm/drm_ioctl.c: Break ioctl when drm device not registered drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 6 +++ drivers/gpu/drm/drm_ioctl.c | 2 +- drivers/gpu/drm/rockchip/analogix_dp-rockchip.c | 3 +- drivers/gpu/drm/rockchip/cdn-dp-core.c | 10 +++-- drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 50 ++++++++++++---------- drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 33 ++++++++++---- 6 files changed, 67 insertions(+), 37 deletions(-) -- 2.1.4
[toc] | [next] | [standalone]
| From | Your Name <you@example.com> |
|---|---|
| Date | 2017-04-06 14:30 +0200 |
| Subject | [PATCH v4 12/12] drm/drm_ioctl.c: Break ioctl when drm device not registered |
| Message-ID | <tteI3-8tl-31@gated-at.bofh.it> |
| In reply to | #1617933 |
From: Jeffy Chen <jeffy.chen@rock-chips.com> After unbinding drm, the user space may still owns the drm dev fd, and may still be able to call drm ioctl. Add a sanity check here to prevent that from happening. Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> Signed-off-by: Your Name <you@example.com> --- Changes in v4: None Changes in v3: None Changes in v2: None drivers/gpu/drm/drm_ioctl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c index 7d6deaa..15beb11 100644 --- a/drivers/gpu/drm/drm_ioctl.c +++ b/drivers/gpu/drm/drm_ioctl.c @@ -674,7 +674,7 @@ long drm_ioctl(struct file *filp, dev = file_priv->minor->dev; - if (drm_device_is_unplugged(dev)) + if (drm_device_is_unplugged(dev) || !dev->registered) return -ENODEV; is_driver_ioctl = nr >= DRM_COMMAND_BASE && nr < DRM_COMMAND_END; -- 2.1.4
[toc] | [prev] | [next] | [standalone]
| From | Your Name <you@example.com> |
|---|---|
| Date | 2017-04-06 14:30 +0200 |
| Subject | [PATCH v4 01/12] drm: bridge: analogix: Detach panel when unbinding analogix dp |
| Message-ID | <tteI3-8tl-39@gated-at.bofh.it> |
| In reply to | #1617933 |
From: Jeffy Chen <jeffy.chen@rock-chips.com>
The panel is attached when binding analogix dp.
Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>
Signed-off-by: Your Name <you@example.com>
---
Changes in v4: None
Changes in v3: None
Changes in v2:
Fix some commit messages.
drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
index c26997a..28144a1 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -1443,6 +1443,8 @@ void analogix_dp_unbind(struct device *dev, struct device *master,
if (dp->plat_data->panel) {
if (drm_panel_unprepare(dp->plat_data->panel))
DRM_ERROR("failed to turnoff the panel\n");
+ if (drm_panel_detach(dp->plat_data->panel))
+ DRM_ERROR("failed to detach the panel\n");
}
pm_runtime_disable(dev);
--
2.1.4
[toc] | [prev] | [next] | [standalone]
| From | Your Name <you@example.com> |
|---|---|
| Date | 2017-04-06 14:30 +0200 |
| Subject | [PATCH v4 04/12] drm: bridge: analogix: Destroy connector & encoder when unbinding |
| Message-ID | <tteI3-8tl-41@gated-at.bofh.it> |
| In reply to | #1617933 |
From: Jeffy Chen <jeffy.chen@rock-chips.com>
Normally we do this in drm_mode_config_cleanup. But:
1/ analogix dp's connector is allocated in bind, and freed after unbind.
So we need to destroy it in unbind to avoid further access.
2/ the drm bridge is attached in bind, and detached in encoder cleanup.
So we need to destroy encoder in unbind.
Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
Signed-off-by: Your Name <you@example.com>
---
Changes in v4:
Address Andrzej Hajda <a.hajda@samsung.com>'s comments.
Changes in v3: None
Changes in v2: None
drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
index d05ade4..4c758ed 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -1439,6 +1439,8 @@ void analogix_dp_unbind(struct device *dev, struct device *master,
struct analogix_dp_device *dp = dev_get_drvdata(dev);
analogix_dp_bridge_disable(dp->bridge);
+ dp->connector.funcs->destroy(&dp->connector);
+ dp->encoder->funcs->destroy(dp->encoder);
if (dp->plat_data->panel) {
if (drm_panel_unprepare(dp->plat_data->panel))
--
2.1.4
[toc] | [prev] | [next] | [standalone]
| From | Your Name <you@example.com> |
|---|---|
| Date | 2017-04-06 14:30 +0200 |
| Subject | [PATCH v4 06/12] drm/rockchip: cdn-dp: Don't unregister audio dev when unbinding |
| Message-ID | <tteI3-8tl-37@gated-at.bofh.it> |
| In reply to | #1617933 |
From: Jeffy Chen <jeffy.chen@rock-chips.com>
After snd_soc_unregister_codec, the dai link would remain bound to
the invalid codec. That would cause crashes after unbind dp driver.
Let's unregister audio codec when removing dp driver to prevent that.
Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
Signed-off-by: Your Name <you@example.com>
---
Changes in v4: None
Changes in v3:
Update commit message.
Changes in v2: None
drivers/gpu/drm/rockchip/cdn-dp-core.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/rockchip/cdn-dp-core.c b/drivers/gpu/drm/rockchip/cdn-dp-core.c
index ee4195d..a2169dd 100644
--- a/drivers/gpu/drm/rockchip/cdn-dp-core.c
+++ b/drivers/gpu/drm/rockchip/cdn-dp-core.c
@@ -1092,8 +1092,6 @@ static int cdn_dp_bind(struct device *dev, struct device *master, void *data)
goto err_free_connector;
}
- cdn_dp_audio_codec_init(dp, dev);
-
for (i = 0; i < dp->ports; i++) {
port = dp->port[i];
@@ -1128,7 +1126,6 @@ static void cdn_dp_unbind(struct device *dev, struct device *master, void *data)
struct drm_connector *connector = &dp->connector;
cancel_work_sync(&dp->event_work);
- platform_device_unregister(dp->audio_pdev);
cdn_dp_encoder_disable(encoder);
encoder->funcs->destroy(encoder);
connector->funcs->destroy(connector);
@@ -1221,6 +1218,8 @@ static int cdn_dp_probe(struct platform_device *pdev)
mutex_init(&dp->lock);
dev_set_drvdata(dev, dp);
+ cdn_dp_audio_codec_init(dp, dev);
+
return component_add(dev, &cdn_dp_component_ops);
}
@@ -1228,6 +1227,7 @@ static int cdn_dp_remove(struct platform_device *pdev)
{
struct cdn_dp_device *dp = platform_get_drvdata(pdev);
+ platform_device_unregister(dp->audio_pdev);
cdn_dp_suspend(dp->dev);
component_del(&pdev->dev, &cdn_dp_component_ops);
--
2.1.4
[toc] | [prev] | [next] | [standalone]
| From | Your Name <you@example.com> |
|---|---|
| Date | 2017-04-06 14:30 +0200 |
| Subject | [PATCH v4 05/12] drm/rockchip: cdn-dp: Don't try to release firmware when not loaded |
| Message-ID | <tteI3-8tl-47@gated-at.bofh.it> |
| In reply to | #1617933 |
From: Jeffy Chen <jeffy.chen@rock-chips.com> Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> Signed-off-by: Your Name <you@example.com> --- Changes in v4: None Changes in v3: None Changes in v2: None drivers/gpu/drm/rockchip/cdn-dp-core.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/rockchip/cdn-dp-core.c b/drivers/gpu/drm/rockchip/cdn-dp-core.c index 4e55d63..ee4195d 100644 --- a/drivers/gpu/drm/rockchip/cdn-dp-core.c +++ b/drivers/gpu/drm/rockchip/cdn-dp-core.c @@ -1053,6 +1053,7 @@ static int cdn_dp_bind(struct device *dev, struct device *master, void *data) dp->connected = false; dp->active = false; dp->active_port = -1; + dp->fw_loaded = false; INIT_WORK(&dp->event_work, cdn_dp_pd_event_work); @@ -1133,7 +1134,8 @@ static void cdn_dp_unbind(struct device *dev, struct device *master, void *data) connector->funcs->destroy(connector); pm_runtime_disable(dev); - release_firmware(dp->fw); + if (dp->fw_loaded) + release_firmware(dp->fw); kfree(dp->edid); dp->edid = NULL; } -- 2.1.4
[toc] | [prev] | [next] | [standalone]
| From | Your Name <you@example.com> |
|---|---|
| Date | 2017-04-06 14:30 +0200 |
| Subject | [PATCH v4 02/12] drm: bridge: analogix: Unregister dp aux when unbinding |
| Message-ID | <tteI3-8tl-43@gated-at.bofh.it> |
| In reply to | #1617933 |
From: Jeffy Chen <jeffy.chen@rock-chips.com>
The dp aux is registered when binding analogix dp.
Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>
Signed-off-by: Your Name <you@example.com>
---
Changes in v4: None
Changes in v3: None
Changes in v2: None
drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
index 28144a1..7b75f82 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -1447,6 +1447,7 @@ void analogix_dp_unbind(struct device *dev, struct device *master,
DRM_ERROR("failed to detach the panel\n");
}
+ drm_dp_aux_unregister(&dp->aux);
pm_runtime_disable(dev);
}
EXPORT_SYMBOL_GPL(analogix_dp_unbind);
--
2.1.4
[toc] | [prev] | [next] | [standalone]
| From | Your Name <you@example.com> |
|---|---|
| Date | 2017-04-06 14:30 +0200 |
| Subject | [PATCH v4 10/12] drm/rockchip: Reoder drm bind/unbind sequence |
| Message-ID | <tteI3-8tl-51@gated-at.bofh.it> |
| In reply to | #1617933 |
From: Jeffy Chen <jeffy.chen@rock-chips.com>
Current drm bind/unbind sequence would cause some memory issues.
For example we should not cleanup iommu before cleanup mode config.
Reorder bind/unbind sequence, follow exynos drm.
Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
Signed-off-by: Your Name <you@example.com>
---
Changes in v4: None
Changes in v3:
Address Sean Paul <seanpaul@chromium.org>'s comments.
Update commit message.
Changes in v2: None
drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 49 +++++++++++++++--------------
1 file changed, 26 insertions(+), 23 deletions(-)
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
index cd7d02e1..f24968f 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
@@ -136,21 +136,24 @@ static int rockchip_drm_bind(struct device *dev)
INIT_LIST_HEAD(&private->psr_list);
spin_lock_init(&private->psr_list_lock);
+ ret = rockchip_drm_init_iommu(drm_dev);
+ if (ret)
+ goto err_free;
+
drm_mode_config_init(drm_dev);
rockchip_drm_mode_config_init(drm_dev);
- ret = rockchip_drm_init_iommu(drm_dev);
- if (ret)
- goto err_config_cleanup;
-
/* Try to bind all sub drivers. */
ret = component_bind_all(dev, drm_dev);
if (ret)
- goto err_iommu_cleanup;
+ goto err_mode_config_cleanup;
- /* init kms poll for handling hpd */
- drm_kms_helper_poll_init(drm_dev);
+ ret = drm_vblank_init(drm_dev, drm_dev->mode_config.num_crtc);
+ if (ret)
+ goto err_unbind_all;
+
+ drm_mode_config_reset(drm_dev);
/*
* enable drm irq mode.
@@ -158,15 +161,12 @@ static int rockchip_drm_bind(struct device *dev)
*/
drm_dev->irq_enabled = true;
- ret = drm_vblank_init(drm_dev, ROCKCHIP_MAX_CRTC);
- if (ret)
- goto err_kms_helper_poll_fini;
-
- drm_mode_config_reset(drm_dev);
+ /* init kms poll for handling hpd */
+ drm_kms_helper_poll_init(drm_dev);
ret = rockchip_drm_fbdev_init(drm_dev);
if (ret)
- goto err_vblank_cleanup;
+ goto err_kms_helper_poll_fini;
ret = drm_dev_register(drm_dev, 0);
if (ret)
@@ -175,17 +175,17 @@ static int rockchip_drm_bind(struct device *dev)
return 0;
err_fbdev_fini:
rockchip_drm_fbdev_fini(drm_dev);
-err_vblank_cleanup:
- drm_vblank_cleanup(drm_dev);
err_kms_helper_poll_fini:
drm_kms_helper_poll_fini(drm_dev);
+ drm_vblank_cleanup(drm_dev);
+err_unbind_all:
component_unbind_all(dev, drm_dev);
-err_iommu_cleanup:
- rockchip_iommu_cleanup(drm_dev);
-err_config_cleanup:
+err_mode_config_cleanup:
drm_mode_config_cleanup(drm_dev);
- drm_dev->dev_private = NULL;
+ rockchip_iommu_cleanup(drm_dev);
err_free:
+ drm_dev->dev_private = NULL;
+ dev_set_drvdata(dev, NULL);
drm_dev_unref(drm_dev);
return ret;
}
@@ -194,16 +194,19 @@ static void rockchip_drm_unbind(struct device *dev)
{
struct drm_device *drm_dev = dev_get_drvdata(dev);
+ drm_dev_unregister(drm_dev);
+
rockchip_drm_fbdev_fini(drm_dev);
- drm_vblank_cleanup(drm_dev);
drm_kms_helper_poll_fini(drm_dev);
+
+ drm_vblank_cleanup(drm_dev);
component_unbind_all(dev, drm_dev);
- rockchip_iommu_cleanup(drm_dev);
drm_mode_config_cleanup(drm_dev);
+ rockchip_iommu_cleanup(drm_dev);
+
drm_dev->dev_private = NULL;
- drm_dev_unregister(drm_dev);
- drm_dev_unref(drm_dev);
dev_set_drvdata(dev, NULL);
+ drm_dev_unref(drm_dev);
}
static void rockchip_drm_lastclose(struct drm_device *dev)
--
2.1.4
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web