* [PATCH 03/30] drm/tegra: Don't register DP AUX channels before connectors
[not found] <20210219215326.2227596-1-lyude@redhat.com>
@ 2021-02-19 21:52 ` Lyude Paul
2021-04-14 16:49 ` Thierry Reding
2021-02-19 21:53 ` [PATCH 15/30] drm/dp: Add backpointer to drm_device in drm_dp_aux Lyude Paul
1 sibling, 1 reply; 6+ messages in thread
From: Lyude Paul @ 2021-02-19 21:52 UTC (permalink / raw)
To: intel-gfx, dri-devel, amd-gfx, nouveau, Ville Syrjälä,
Jani Nikula, Rodrigo Vivi, Thomas Zimmermann
Cc: Thierry Reding, David Airlie, Daniel Vetter, Jonathan Hunter,
open list:DRM DRIVERS FOR NVIDIA TEGRA, open list
As pointed out by the documentation for drm_dp_aux_register(),
drm_dp_aux_init() should be used in situations where the AUX channel for a
display driver can potentially be registered before it's respective DRM
driver. This is the case with Tegra, since the DP aux channel exists as a
platform device instead of being a grandchild of the DRM device.
Since we're about to add a backpointer to a DP AUX channel's respective DRM
device, let's fix this so that we don't potentially allow userspace to use
the AUX channel before we've associated it with it's DRM connector.
Signed-off-by: Lyude Paul <lyude@redhat.com>
---
drivers/gpu/drm/tegra/dpaux.c | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/tegra/dpaux.c b/drivers/gpu/drm/tegra/dpaux.c
index 105fb9cdbb3b..ea56c6ec25e4 100644
--- a/drivers/gpu/drm/tegra/dpaux.c
+++ b/drivers/gpu/drm/tegra/dpaux.c
@@ -534,9 +534,7 @@ static int tegra_dpaux_probe(struct platform_device *pdev)
dpaux->aux.transfer = tegra_dpaux_transfer;
dpaux->aux.dev = &pdev->dev;
- err = drm_dp_aux_register(&dpaux->aux);
- if (err < 0)
- return err;
+ drm_dp_aux_init(&dpaux->aux);
/*
* Assume that by default the DPAUX/I2C pads will be used for HDMI,
@@ -589,8 +587,6 @@ static int tegra_dpaux_remove(struct platform_device *pdev)
pm_runtime_put_sync(&pdev->dev);
pm_runtime_disable(&pdev->dev);
- drm_dp_aux_unregister(&dpaux->aux);
-
mutex_lock(&dpaux_lock);
list_del(&dpaux->list);
mutex_unlock(&dpaux_lock);
@@ -723,6 +719,10 @@ int drm_dp_aux_attach(struct drm_dp_aux *aux, struct tegra_output *output)
unsigned long timeout;
int err;
+ err = drm_dp_aux_register(aux);
+ if (err < 0)
+ return err;
+
output->connector.polled = DRM_CONNECTOR_POLL_HPD;
dpaux->output = output;
@@ -760,6 +760,7 @@ int drm_dp_aux_detach(struct drm_dp_aux *aux)
unsigned long timeout;
int err;
+ drm_dp_aux_unregister(aux);
disable_irq(dpaux->irq);
if (dpaux->output->panel) {
--
2.29.2
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 15/30] drm/dp: Add backpointer to drm_device in drm_dp_aux
[not found] <20210219215326.2227596-1-lyude@redhat.com>
2021-02-19 21:52 ` [PATCH 03/30] drm/tegra: Don't register DP AUX channels before connectors Lyude Paul
@ 2021-02-19 21:53 ` Lyude Paul
2021-02-21 18:21 ` Laurent Pinchart
1 sibling, 1 reply; 6+ messages in thread
From: Lyude Paul @ 2021-02-19 21:53 UTC (permalink / raw)
To: intel-gfx, dri-devel, amd-gfx, nouveau, Ville Syrjälä,
Jani Nikula, Rodrigo Vivi, Thomas Zimmermann
Cc: Alex Deucher, Christian König, David Airlie, Daniel Vetter,
Harry Wentland, Leo Li, Andrzej Hajda, Neil Armstrong,
Laurent Pinchart, Jonas Karlman, Jernej Skrabec,
Maarten Lankhorst, Maxime Ripard, Joonas Lahtinen, Rob Clark,
Sean Paul, Ben Skeggs, Thierry Reding, Jonathan Hunter, Hyun Kwon,
Michal Simek, Luben Tuikov, Oleg Vasilev, Emil Velikov,
Mikita Lipski, Eryk Brol, Rodrigo Siqueira, Jerry (Fangzhi) Zuo,
Chris Park, Pankaj Bharadiya, Sam Ravnborg, Boris Brezillon,
Torsten Duwe, Vasily Khoruzhick, Joe Perches, Icenowy Zheng,
Tomi Valkeinen, Marek Szyprowski, Swapnil Jakhade, Yuti Amonkar,
Julia Lawall, open list, open list:DRM DRIVER FOR MSM ADRENO GPU,
open list:DRM DRIVER FOR MSM ADRENO GPU,
open list:DRM DRIVERS FOR NVIDIA TEGRA,
moderated list:ARM/ZYNQ ARCHITECTURE
This is something that we've wanted for a while now: the ability to
actually look up the respective drm_device for a given drm_dp_aux struct.
This will also allow us to transition over to using the drm_dbg_*() helpers
for debug message printing, as we'll finally have a drm_device to reference
for doing so.
Note that there is one limitation with this - because some DP AUX adapters
exist as platform devices which are initialized independently of their
respective DRM devices, one cannot rely on drm_dp_aux->drm_dev to always be
non-NULL until drm_dp_aux_register() has been called. We make sure to point
this out in the documentation for struct drm_dp_aux.
Signed-off-by: Lyude Paul <lyude@redhat.com>
---
drivers/gpu/drm/amd/amdgpu/atombios_dp.c | 1 +
.../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | 1 +
drivers/gpu/drm/bridge/analogix/analogix-anx6345.c | 1 +
drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c | 1 +
drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 1 +
drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c | 1 +
drivers/gpu/drm/bridge/tc358767.c | 1 +
drivers/gpu/drm/bridge/ti-sn65dsi86.c | 1 +
drivers/gpu/drm/drm_dp_aux_dev.c | 6 ++++++
drivers/gpu/drm/drm_dp_mst_topology.c | 1 +
drivers/gpu/drm/i915/display/intel_dp_aux.c | 1 +
drivers/gpu/drm/msm/edp/edp.h | 3 +--
drivers/gpu/drm/msm/edp/edp_aux.c | 5 +++--
drivers/gpu/drm/msm/edp/edp_ctrl.c | 2 +-
drivers/gpu/drm/nouveau/nouveau_connector.c | 1 +
drivers/gpu/drm/radeon/atombios_dp.c | 1 +
drivers/gpu/drm/tegra/dpaux.c | 1 +
drivers/gpu/drm/xlnx/zynqmp_dp.c | 1 +
include/drm/drm_dp_helper.h | 9 ++++++++-
19 files changed, 33 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/atombios_dp.c b/drivers/gpu/drm/amd/amdgpu/atombios_dp.c
index a3ba9ca11e98..6d35da65e09f 100644
--- a/drivers/gpu/drm/amd/amdgpu/atombios_dp.c
+++ b/drivers/gpu/drm/amd/amdgpu/atombios_dp.c
@@ -188,6 +188,7 @@ void amdgpu_atombios_dp_aux_init(struct amdgpu_connector *amdgpu_connector)
{
amdgpu_connector->ddc_bus->rec.hpd = amdgpu_connector->hpd.hpd;
amdgpu_connector->ddc_bus->aux.transfer = amdgpu_atombios_dp_aux_transfer;
+ amdgpu_connector->ddc_bus->aux.drm_dev = amdgpu_connector->base.dev;
drm_dp_aux_init(&amdgpu_connector->ddc_bus->aux);
amdgpu_connector->ddc_bus->has_aux = true;
}
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
index 41b09ab22233..163641b44339 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
@@ -431,6 +431,7 @@ void amdgpu_dm_initialize_dp_connector(struct amdgpu_display_manager *dm,
link_index);
aconnector->dm_dp_aux.aux.transfer = dm_dp_aux_transfer;
aconnector->dm_dp_aux.ddc_service = aconnector->dc_link->ddc;
+ aconnector->dm_dp_aux.aux.drm_dev = dm->ddev;
drm_dp_aux_init(&aconnector->dm_dp_aux.aux);
drm_dp_cec_register_connector(&aconnector->dm_dp_aux.aux,
diff --git a/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c b/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
index aa6cda458eb9..e33cd077595a 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
@@ -537,6 +537,7 @@ static int anx6345_bridge_attach(struct drm_bridge *bridge,
/* Register aux channel */
anx6345->aux.name = "DP-AUX";
anx6345->aux.dev = &anx6345->client->dev;
+ anx6345->aux.drm_dev = bridge->dev;
anx6345->aux.transfer = anx6345_aux_transfer;
err = drm_dp_aux_register(&anx6345->aux);
diff --git a/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
index f20558618220..5e6a0ed39199 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
@@ -905,6 +905,7 @@ static int anx78xx_bridge_attach(struct drm_bridge *bridge,
/* Register aux channel */
anx78xx->aux.name = "DP-AUX";
anx78xx->aux.dev = &anx78xx->client->dev;
+ anx78xx->aux.drm_dev = bridge->dev;
anx78xx->aux.transfer = anx78xx_aux_transfer;
err = drm_dp_aux_register(&anx78xx->aux);
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
index f115233b1cb9..550814ca2139 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -1765,6 +1765,7 @@ int analogix_dp_bind(struct analogix_dp_device *dp, struct drm_device *drm_dev)
dp->aux.name = "DP-AUX";
dp->aux.transfer = analogix_dpaux_transfer;
dp->aux.dev = dp->dev;
+ dp->aux.drm_dev = drm_dev;
ret = drm_dp_aux_register(&dp->aux);
if (ret)
diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c b/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c
index d966a33743b5..fe821ad628ec 100644
--- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c
+++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c
@@ -1674,6 +1674,7 @@ static int cdns_mhdp_attach(struct drm_bridge *bridge,
dev_dbg(mhdp->dev, "%s\n", __func__);
+ mhdp->aux.drm_dev = bridge->dev;
ret = drm_dp_aux_register(&mhdp->aux);
if (ret < 0)
return ret;
diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
index da89922721ed..23a6f90b694b 100644
--- a/drivers/gpu/drm/bridge/tc358767.c
+++ b/drivers/gpu/drm/bridge/tc358767.c
@@ -1414,6 +1414,7 @@ static int tc_bridge_attach(struct drm_bridge *bridge,
if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)
return 0;
+ tc->aux.drm_dev = drm;
ret = drm_dp_aux_register(&tc->aux);
if (ret < 0)
return ret;
diff --git a/drivers/gpu/drm/bridge/ti-sn65dsi86.c b/drivers/gpu/drm/bridge/ti-sn65dsi86.c
index 88df4dd0f39d..8e24272bbf00 100644
--- a/drivers/gpu/drm/bridge/ti-sn65dsi86.c
+++ b/drivers/gpu/drm/bridge/ti-sn65dsi86.c
@@ -362,6 +362,7 @@ static int ti_sn_bridge_attach(struct drm_bridge *bridge,
return -EINVAL;
}
+ pdata->aux.drm_dev = bridge->dev;
ret = drm_dp_aux_register(&pdata->aux);
if (ret < 0) {
drm_err(bridge->dev, "Failed to register DP AUX channel: %d\n", ret);
diff --git a/drivers/gpu/drm/drm_dp_aux_dev.c b/drivers/gpu/drm/drm_dp_aux_dev.c
index e25181bf2c48..06b374cae956 100644
--- a/drivers/gpu/drm/drm_dp_aux_dev.c
+++ b/drivers/gpu/drm/drm_dp_aux_dev.c
@@ -278,6 +278,12 @@ void drm_dp_aux_unregister_devnode(struct drm_dp_aux *aux)
if (!aux_dev) /* attach must have failed */
return;
+ /*
+ * As some AUX adapters may exist as platform devices which outlive their respective DRM
+ * devices, we clear drm_dev to ensure that we never accidentally reference a stale pointer
+ */
+ aux->drm_dev = NULL;
+
mutex_lock(&aux_idr_mutex);
idr_remove(&aux_idr, aux_dev->index);
mutex_unlock(&aux_idr_mutex);
diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c
index 932c4641ec3e..cf4f2f85711e 100644
--- a/drivers/gpu/drm/drm_dp_mst_topology.c
+++ b/drivers/gpu/drm/drm_dp_mst_topology.c
@@ -2349,6 +2349,7 @@ drm_dp_mst_add_port(struct drm_device *dev,
port->aux.is_remote = true;
/* initialize the MST downstream port's AUX crc work queue */
+ port->aux.drm_dev = dev;
drm_dp_remote_aux_init(&port->aux);
/*
diff --git a/drivers/gpu/drm/i915/display/intel_dp_aux.c b/drivers/gpu/drm/i915/display/intel_dp_aux.c
index eaebf123310a..0571c0794226 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_aux.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_aux.c
@@ -675,6 +675,7 @@ void intel_dp_aux_init(struct intel_dp *intel_dp)
else
intel_dp->get_aux_send_ctl = g4x_get_aux_send_ctl;
+ intel_dp->aux.drm_dev = &dev_priv->drm;
drm_dp_aux_init(&intel_dp->aux);
/* Failure to allocate our preferred name is not critical */
diff --git a/drivers/gpu/drm/msm/edp/edp.h b/drivers/gpu/drm/msm/edp/edp.h
index eb34243dad53..8590f2ce274d 100644
--- a/drivers/gpu/drm/msm/edp/edp.h
+++ b/drivers/gpu/drm/msm/edp/edp.h
@@ -46,8 +46,7 @@ void edp_bridge_destroy(struct drm_bridge *bridge);
struct drm_connector *msm_edp_connector_init(struct msm_edp *edp);
/* AUX */
-void *msm_edp_aux_init(struct device *dev, void __iomem *regbase,
- struct drm_dp_aux **drm_aux);
+void *msm_edp_aux_init(struct msm_edp *edp, void __iomem *regbase, struct drm_dp_aux **drm_aux);
void msm_edp_aux_destroy(struct device *dev, struct edp_aux *aux);
irqreturn_t msm_edp_aux_irq(struct edp_aux *aux, u32 isr);
void msm_edp_aux_ctrl(struct edp_aux *aux, int enable);
diff --git a/drivers/gpu/drm/msm/edp/edp_aux.c b/drivers/gpu/drm/msm/edp/edp_aux.c
index df10a0196d94..e3d85c622cfb 100644
--- a/drivers/gpu/drm/msm/edp/edp_aux.c
+++ b/drivers/gpu/drm/msm/edp/edp_aux.c
@@ -184,9 +184,9 @@ static ssize_t edp_aux_transfer(struct drm_dp_aux *drm_aux,
return ret;
}
-void *msm_edp_aux_init(struct device *dev, void __iomem *regbase,
- struct drm_dp_aux **drm_aux)
+void *msm_edp_aux_init(struct msm_edp *edp, void __iomem *regbase, struct drm_dp_aux **drm_aux)
{
+ struct device *dev = &edp->pdev->dev;
struct edp_aux *aux = NULL;
int ret;
@@ -201,6 +201,7 @@ void *msm_edp_aux_init(struct device *dev, void __iomem *regbase,
aux->drm_aux.name = "msm_edp_aux";
aux->drm_aux.dev = dev;
+ aux->drm_aux.drm_dev = edp->dev;
aux->drm_aux.transfer = edp_aux_transfer;
ret = drm_dp_aux_register(&aux->drm_aux);
if (ret) {
diff --git a/drivers/gpu/drm/msm/edp/edp_ctrl.c b/drivers/gpu/drm/msm/edp/edp_ctrl.c
index 0d9657cc70db..57af3d8b6699 100644
--- a/drivers/gpu/drm/msm/edp/edp_ctrl.c
+++ b/drivers/gpu/drm/msm/edp/edp_ctrl.c
@@ -1153,7 +1153,7 @@ int msm_edp_ctrl_init(struct msm_edp *edp)
}
/* Init aux and phy */
- ctrl->aux = msm_edp_aux_init(dev, ctrl->base, &ctrl->drm_aux);
+ ctrl->aux = msm_edp_aux_init(edp, ctrl->base, &ctrl->drm_aux);
if (!ctrl->aux || !ctrl->drm_aux) {
pr_err("%s:failed to init aux\n", __func__);
return -ENOMEM;
diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c
index bfce762adcf0..d1b49508ecb9 100644
--- a/drivers/gpu/drm/nouveau/nouveau_connector.c
+++ b/drivers/gpu/drm/nouveau/nouveau_connector.c
@@ -1355,6 +1355,7 @@ nouveau_connector_create(struct drm_device *dev,
case DRM_MODE_CONNECTOR_DisplayPort:
case DRM_MODE_CONNECTOR_eDP:
nv_connector->aux.dev = connector->kdev;
+ nv_connector->aux.drm_dev = dev;
nv_connector->aux.transfer = nouveau_connector_aux_xfer;
snprintf(aux_name, sizeof(aux_name), "sor-%04x-%04x",
dcbe->hasht, dcbe->hashm);
diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c
index 15b00a347560..c50c504bad50 100644
--- a/drivers/gpu/drm/radeon/atombios_dp.c
+++ b/drivers/gpu/drm/radeon/atombios_dp.c
@@ -232,6 +232,7 @@ void radeon_dp_aux_init(struct radeon_connector *radeon_connector)
radeon_connector->ddc_bus->rec.hpd = radeon_connector->hpd.hpd;
radeon_connector->ddc_bus->aux.dev = radeon_connector->base.kdev;
+ radeon_connector->ddc_bus->aux.drm_dev = radeon_connector->base.dev;
if (ASIC_IS_DCE5(rdev)) {
if (radeon_auxch)
radeon_connector->ddc_bus->aux.transfer = radeon_dp_aux_transfer_native;
diff --git a/drivers/gpu/drm/tegra/dpaux.c b/drivers/gpu/drm/tegra/dpaux.c
index ea56c6ec25e4..7d7cc90b6fc9 100644
--- a/drivers/gpu/drm/tegra/dpaux.c
+++ b/drivers/gpu/drm/tegra/dpaux.c
@@ -719,6 +719,7 @@ int drm_dp_aux_attach(struct drm_dp_aux *aux, struct tegra_output *output)
unsigned long timeout;
int err;
+ aux->drm_dev = output->connector.dev;
err = drm_dp_aux_register(aux);
if (err < 0)
return err;
diff --git a/drivers/gpu/drm/xlnx/zynqmp_dp.c b/drivers/gpu/drm/xlnx/zynqmp_dp.c
index 99158ee67d02..8272eee03adc 100644
--- a/drivers/gpu/drm/xlnx/zynqmp_dp.c
+++ b/drivers/gpu/drm/xlnx/zynqmp_dp.c
@@ -1069,6 +1069,7 @@ static int zynqmp_dp_aux_init(struct zynqmp_dp *dp)
dp->aux.name = "ZynqMP DP AUX";
dp->aux.dev = dp->dev;
+ dp->aux.drm_dev = dp->drm;
dp->aux.transfer = zynqmp_dp_aux_transfer;
return drm_dp_aux_register(&dp->aux);
diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h
index b35a1c1339e8..45ec74862212 100644
--- a/include/drm/drm_dp_helper.h
+++ b/include/drm/drm_dp_helper.h
@@ -1833,13 +1833,19 @@ struct drm_dp_aux_cec {
* @name: user-visible name of this AUX channel and the I2C-over-AUX adapter
* @ddc: I2C adapter that can be used for I2C-over-AUX communication
* @dev: pointer to struct device that is the parent for this AUX channel
+ * @drm_dev: pointer to the &drm_device that owns this AUX channel. Beware, this may be %NULL
+ * before drm_dp_aux_register() has been called.
* @crtc: backpointer to the crtc that is currently using this AUX channel
* @hw_mutex: internal mutex used for locking transfers
* @crc_work: worker that captures CRCs for each frame
* @crc_count: counter of captured frame CRCs
* @transfer: transfers a message representing a single AUX transaction
*
- * The @dev field should be set to a pointer to the device that implements the AUX channel.
+ * The @dev field should be set to a pointer to the device that implements the AUX channel. As well,
+ * the @drm_dev field should be set to the &drm_device that will be using this AUX channel as early
+ * as possible. For many graphics drivers this should happen before drm_dp_aux_init(), however it's
+ * perfectly fine to set this field later so long as it's assigned before calling
+ * drm_dp_aux_register().
*
* The @name field may be used to specify the name of the I2C adapter. If set to %NULL, dev_name()
* of @dev will be used.
@@ -1866,6 +1872,7 @@ struct drm_dp_aux {
const char *name;
struct i2c_adapter ddc;
struct device *dev;
+ struct drm_device *drm_dev;
struct drm_crtc *crtc;
struct mutex hw_mutex;
struct work_struct crc_work;
--
2.29.2
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 15/30] drm/dp: Add backpointer to drm_device in drm_dp_aux
2021-02-19 21:53 ` [PATCH 15/30] drm/dp: Add backpointer to drm_device in drm_dp_aux Lyude Paul
@ 2021-02-21 18:21 ` Laurent Pinchart
2021-02-24 20:40 ` Lyude Paul
0 siblings, 1 reply; 6+ messages in thread
From: Laurent Pinchart @ 2021-02-21 18:21 UTC (permalink / raw)
To: Lyude Paul
Cc: intel-gfx, dri-devel, amd-gfx, nouveau, Ville Syrjälä,
Jani Nikula, Rodrigo Vivi, Thomas Zimmermann, Alex Deucher,
Christian König, David Airlie, Daniel Vetter, Harry Wentland,
Leo Li, Andrzej Hajda, Neil Armstrong, Jonas Karlman,
Jernej Skrabec, Maarten Lankhorst, Maxime Ripard, Joonas Lahtinen,
Rob Clark, Sean Paul, Ben Skeggs, Thierry Reding, Jonathan Hunter,
Hyun Kwon, Michal Simek, Luben Tuikov, Oleg Vasilev, Emil Velikov,
Mikita Lipski, Eryk Brol, Rodrigo Siqueira, Jerry (Fangzhi) Zuo,
Chris Park, Pankaj Bharadiya, Sam Ravnborg, Boris Brezillon,
Torsten Duwe, Vasily Khoruzhick, Joe Perches, Icenowy Zheng,
Tomi Valkeinen, Marek Szyprowski, Swapnil Jakhade, Yuti Amonkar,
Julia Lawall, open list, open list:DRM DRIVER FOR MSM ADRENO GPU,
open list:DRM DRIVER FOR MSM ADRENO GPU,
open list:DRM DRIVERS FOR NVIDIA TEGRA,
moderated list:ARM/ZYNQ ARCHITECTURE
Hi Lyude,
Thank you for the patch.
On Fri, Feb 19, 2021 at 04:53:11PM -0500, Lyude Paul wrote:
> This is something that we've wanted for a while now: the ability to
> actually look up the respective drm_device for a given drm_dp_aux struct.
> This will also allow us to transition over to using the drm_dbg_*() helpers
> for debug message printing, as we'll finally have a drm_device to reference
> for doing so.
Isn't it better to use the existing dev field ? If you have multiple DP
outputs for one DRM device, using the DRM device name in debug messages
won't tell which output the message corresponds to.
> Note that there is one limitation with this - because some DP AUX adapters
> exist as platform devices which are initialized independently of their
> respective DRM devices, one cannot rely on drm_dp_aux->drm_dev to always be
> non-NULL until drm_dp_aux_register() has been called. We make sure to point
> this out in the documentation for struct drm_dp_aux.
>
> Signed-off-by: Lyude Paul <lyude@redhat.com>
> ---
> drivers/gpu/drm/amd/amdgpu/atombios_dp.c | 1 +
> .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | 1 +
> drivers/gpu/drm/bridge/analogix/analogix-anx6345.c | 1 +
> drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c | 1 +
> drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 1 +
> drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c | 1 +
> drivers/gpu/drm/bridge/tc358767.c | 1 +
> drivers/gpu/drm/bridge/ti-sn65dsi86.c | 1 +
> drivers/gpu/drm/drm_dp_aux_dev.c | 6 ++++++
> drivers/gpu/drm/drm_dp_mst_topology.c | 1 +
> drivers/gpu/drm/i915/display/intel_dp_aux.c | 1 +
> drivers/gpu/drm/msm/edp/edp.h | 3 +--
> drivers/gpu/drm/msm/edp/edp_aux.c | 5 +++--
> drivers/gpu/drm/msm/edp/edp_ctrl.c | 2 +-
> drivers/gpu/drm/nouveau/nouveau_connector.c | 1 +
> drivers/gpu/drm/radeon/atombios_dp.c | 1 +
> drivers/gpu/drm/tegra/dpaux.c | 1 +
> drivers/gpu/drm/xlnx/zynqmp_dp.c | 1 +
> include/drm/drm_dp_helper.h | 9 ++++++++-
> 19 files changed, 33 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/atombios_dp.c b/drivers/gpu/drm/amd/amdgpu/atombios_dp.c
> index a3ba9ca11e98..6d35da65e09f 100644
> --- a/drivers/gpu/drm/amd/amdgpu/atombios_dp.c
> +++ b/drivers/gpu/drm/amd/amdgpu/atombios_dp.c
> @@ -188,6 +188,7 @@ void amdgpu_atombios_dp_aux_init(struct amdgpu_connector *amdgpu_connector)
> {
> amdgpu_connector->ddc_bus->rec.hpd = amdgpu_connector->hpd.hpd;
> amdgpu_connector->ddc_bus->aux.transfer = amdgpu_atombios_dp_aux_transfer;
> + amdgpu_connector->ddc_bus->aux.drm_dev = amdgpu_connector->base.dev;
> drm_dp_aux_init(&amdgpu_connector->ddc_bus->aux);
> amdgpu_connector->ddc_bus->has_aux = true;
> }
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
> index 41b09ab22233..163641b44339 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
> @@ -431,6 +431,7 @@ void amdgpu_dm_initialize_dp_connector(struct amdgpu_display_manager *dm,
> link_index);
> aconnector->dm_dp_aux.aux.transfer = dm_dp_aux_transfer;
> aconnector->dm_dp_aux.ddc_service = aconnector->dc_link->ddc;
> + aconnector->dm_dp_aux.aux.drm_dev = dm->ddev;
>
> drm_dp_aux_init(&aconnector->dm_dp_aux.aux);
> drm_dp_cec_register_connector(&aconnector->dm_dp_aux.aux,
> diff --git a/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c b/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
> index aa6cda458eb9..e33cd077595a 100644
> --- a/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
> +++ b/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
> @@ -537,6 +537,7 @@ static int anx6345_bridge_attach(struct drm_bridge *bridge,
> /* Register aux channel */
> anx6345->aux.name = "DP-AUX";
> anx6345->aux.dev = &anx6345->client->dev;
> + anx6345->aux.drm_dev = bridge->dev;
> anx6345->aux.transfer = anx6345_aux_transfer;
>
> err = drm_dp_aux_register(&anx6345->aux);
> diff --git a/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
> index f20558618220..5e6a0ed39199 100644
> --- a/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
> +++ b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
> @@ -905,6 +905,7 @@ static int anx78xx_bridge_attach(struct drm_bridge *bridge,
> /* Register aux channel */
> anx78xx->aux.name = "DP-AUX";
> anx78xx->aux.dev = &anx78xx->client->dev;
> + anx78xx->aux.drm_dev = bridge->dev;
> anx78xx->aux.transfer = anx78xx_aux_transfer;
>
> err = drm_dp_aux_register(&anx78xx->aux);
> diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
> index f115233b1cb9..550814ca2139 100644
> --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
> +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
> @@ -1765,6 +1765,7 @@ int analogix_dp_bind(struct analogix_dp_device *dp, struct drm_device *drm_dev)
> dp->aux.name = "DP-AUX";
> dp->aux.transfer = analogix_dpaux_transfer;
> dp->aux.dev = dp->dev;
> + dp->aux.drm_dev = drm_dev;
>
> ret = drm_dp_aux_register(&dp->aux);
> if (ret)
> diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c b/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c
> index d966a33743b5..fe821ad628ec 100644
> --- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c
> +++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c
> @@ -1674,6 +1674,7 @@ static int cdns_mhdp_attach(struct drm_bridge *bridge,
>
> dev_dbg(mhdp->dev, "%s\n", __func__);
>
> + mhdp->aux.drm_dev = bridge->dev;
> ret = drm_dp_aux_register(&mhdp->aux);
> if (ret < 0)
> return ret;
> diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
> index da89922721ed..23a6f90b694b 100644
> --- a/drivers/gpu/drm/bridge/tc358767.c
> +++ b/drivers/gpu/drm/bridge/tc358767.c
> @@ -1414,6 +1414,7 @@ static int tc_bridge_attach(struct drm_bridge *bridge,
> if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)
> return 0;
>
> + tc->aux.drm_dev = drm;
> ret = drm_dp_aux_register(&tc->aux);
> if (ret < 0)
> return ret;
> diff --git a/drivers/gpu/drm/bridge/ti-sn65dsi86.c b/drivers/gpu/drm/bridge/ti-sn65dsi86.c
> index 88df4dd0f39d..8e24272bbf00 100644
> --- a/drivers/gpu/drm/bridge/ti-sn65dsi86.c
> +++ b/drivers/gpu/drm/bridge/ti-sn65dsi86.c
> @@ -362,6 +362,7 @@ static int ti_sn_bridge_attach(struct drm_bridge *bridge,
> return -EINVAL;
> }
>
> + pdata->aux.drm_dev = bridge->dev;
> ret = drm_dp_aux_register(&pdata->aux);
> if (ret < 0) {
> drm_err(bridge->dev, "Failed to register DP AUX channel: %d\n", ret);
> diff --git a/drivers/gpu/drm/drm_dp_aux_dev.c b/drivers/gpu/drm/drm_dp_aux_dev.c
> index e25181bf2c48..06b374cae956 100644
> --- a/drivers/gpu/drm/drm_dp_aux_dev.c
> +++ b/drivers/gpu/drm/drm_dp_aux_dev.c
> @@ -278,6 +278,12 @@ void drm_dp_aux_unregister_devnode(struct drm_dp_aux *aux)
> if (!aux_dev) /* attach must have failed */
> return;
>
> + /*
> + * As some AUX adapters may exist as platform devices which outlive their respective DRM
> + * devices, we clear drm_dev to ensure that we never accidentally reference a stale pointer
> + */
> + aux->drm_dev = NULL;
> +
> mutex_lock(&aux_idr_mutex);
> idr_remove(&aux_idr, aux_dev->index);
> mutex_unlock(&aux_idr_mutex);
> diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c
> index 932c4641ec3e..cf4f2f85711e 100644
> --- a/drivers/gpu/drm/drm_dp_mst_topology.c
> +++ b/drivers/gpu/drm/drm_dp_mst_topology.c
> @@ -2349,6 +2349,7 @@ drm_dp_mst_add_port(struct drm_device *dev,
> port->aux.is_remote = true;
>
> /* initialize the MST downstream port's AUX crc work queue */
> + port->aux.drm_dev = dev;
> drm_dp_remote_aux_init(&port->aux);
>
> /*
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_aux.c b/drivers/gpu/drm/i915/display/intel_dp_aux.c
> index eaebf123310a..0571c0794226 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_aux.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_aux.c
> @@ -675,6 +675,7 @@ void intel_dp_aux_init(struct intel_dp *intel_dp)
> else
> intel_dp->get_aux_send_ctl = g4x_get_aux_send_ctl;
>
> + intel_dp->aux.drm_dev = &dev_priv->drm;
> drm_dp_aux_init(&intel_dp->aux);
>
> /* Failure to allocate our preferred name is not critical */
> diff --git a/drivers/gpu/drm/msm/edp/edp.h b/drivers/gpu/drm/msm/edp/edp.h
> index eb34243dad53..8590f2ce274d 100644
> --- a/drivers/gpu/drm/msm/edp/edp.h
> +++ b/drivers/gpu/drm/msm/edp/edp.h
> @@ -46,8 +46,7 @@ void edp_bridge_destroy(struct drm_bridge *bridge);
> struct drm_connector *msm_edp_connector_init(struct msm_edp *edp);
>
> /* AUX */
> -void *msm_edp_aux_init(struct device *dev, void __iomem *regbase,
> - struct drm_dp_aux **drm_aux);
> +void *msm_edp_aux_init(struct msm_edp *edp, void __iomem *regbase, struct drm_dp_aux **drm_aux);
> void msm_edp_aux_destroy(struct device *dev, struct edp_aux *aux);
> irqreturn_t msm_edp_aux_irq(struct edp_aux *aux, u32 isr);
> void msm_edp_aux_ctrl(struct edp_aux *aux, int enable);
> diff --git a/drivers/gpu/drm/msm/edp/edp_aux.c b/drivers/gpu/drm/msm/edp/edp_aux.c
> index df10a0196d94..e3d85c622cfb 100644
> --- a/drivers/gpu/drm/msm/edp/edp_aux.c
> +++ b/drivers/gpu/drm/msm/edp/edp_aux.c
> @@ -184,9 +184,9 @@ static ssize_t edp_aux_transfer(struct drm_dp_aux *drm_aux,
> return ret;
> }
>
> -void *msm_edp_aux_init(struct device *dev, void __iomem *regbase,
> - struct drm_dp_aux **drm_aux)
> +void *msm_edp_aux_init(struct msm_edp *edp, void __iomem *regbase, struct drm_dp_aux **drm_aux)
> {
> + struct device *dev = &edp->pdev->dev;
> struct edp_aux *aux = NULL;
> int ret;
>
> @@ -201,6 +201,7 @@ void *msm_edp_aux_init(struct device *dev, void __iomem *regbase,
>
> aux->drm_aux.name = "msm_edp_aux";
> aux->drm_aux.dev = dev;
> + aux->drm_aux.drm_dev = edp->dev;
> aux->drm_aux.transfer = edp_aux_transfer;
> ret = drm_dp_aux_register(&aux->drm_aux);
> if (ret) {
> diff --git a/drivers/gpu/drm/msm/edp/edp_ctrl.c b/drivers/gpu/drm/msm/edp/edp_ctrl.c
> index 0d9657cc70db..57af3d8b6699 100644
> --- a/drivers/gpu/drm/msm/edp/edp_ctrl.c
> +++ b/drivers/gpu/drm/msm/edp/edp_ctrl.c
> @@ -1153,7 +1153,7 @@ int msm_edp_ctrl_init(struct msm_edp *edp)
> }
>
> /* Init aux and phy */
> - ctrl->aux = msm_edp_aux_init(dev, ctrl->base, &ctrl->drm_aux);
> + ctrl->aux = msm_edp_aux_init(edp, ctrl->base, &ctrl->drm_aux);
> if (!ctrl->aux || !ctrl->drm_aux) {
> pr_err("%s:failed to init aux\n", __func__);
> return -ENOMEM;
> diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c
> index bfce762adcf0..d1b49508ecb9 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_connector.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_connector.c
> @@ -1355,6 +1355,7 @@ nouveau_connector_create(struct drm_device *dev,
> case DRM_MODE_CONNECTOR_DisplayPort:
> case DRM_MODE_CONNECTOR_eDP:
> nv_connector->aux.dev = connector->kdev;
> + nv_connector->aux.drm_dev = dev;
> nv_connector->aux.transfer = nouveau_connector_aux_xfer;
> snprintf(aux_name, sizeof(aux_name), "sor-%04x-%04x",
> dcbe->hasht, dcbe->hashm);
> diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c
> index 15b00a347560..c50c504bad50 100644
> --- a/drivers/gpu/drm/radeon/atombios_dp.c
> +++ b/drivers/gpu/drm/radeon/atombios_dp.c
> @@ -232,6 +232,7 @@ void radeon_dp_aux_init(struct radeon_connector *radeon_connector)
>
> radeon_connector->ddc_bus->rec.hpd = radeon_connector->hpd.hpd;
> radeon_connector->ddc_bus->aux.dev = radeon_connector->base.kdev;
> + radeon_connector->ddc_bus->aux.drm_dev = radeon_connector->base.dev;
> if (ASIC_IS_DCE5(rdev)) {
> if (radeon_auxch)
> radeon_connector->ddc_bus->aux.transfer = radeon_dp_aux_transfer_native;
> diff --git a/drivers/gpu/drm/tegra/dpaux.c b/drivers/gpu/drm/tegra/dpaux.c
> index ea56c6ec25e4..7d7cc90b6fc9 100644
> --- a/drivers/gpu/drm/tegra/dpaux.c
> +++ b/drivers/gpu/drm/tegra/dpaux.c
> @@ -719,6 +719,7 @@ int drm_dp_aux_attach(struct drm_dp_aux *aux, struct tegra_output *output)
> unsigned long timeout;
> int err;
>
> + aux->drm_dev = output->connector.dev;
> err = drm_dp_aux_register(aux);
> if (err < 0)
> return err;
> diff --git a/drivers/gpu/drm/xlnx/zynqmp_dp.c b/drivers/gpu/drm/xlnx/zynqmp_dp.c
> index 99158ee67d02..8272eee03adc 100644
> --- a/drivers/gpu/drm/xlnx/zynqmp_dp.c
> +++ b/drivers/gpu/drm/xlnx/zynqmp_dp.c
> @@ -1069,6 +1069,7 @@ static int zynqmp_dp_aux_init(struct zynqmp_dp *dp)
>
> dp->aux.name = "ZynqMP DP AUX";
> dp->aux.dev = dp->dev;
> + dp->aux.drm_dev = dp->drm;
> dp->aux.transfer = zynqmp_dp_aux_transfer;
>
> return drm_dp_aux_register(&dp->aux);
> diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h
> index b35a1c1339e8..45ec74862212 100644
> --- a/include/drm/drm_dp_helper.h
> +++ b/include/drm/drm_dp_helper.h
> @@ -1833,13 +1833,19 @@ struct drm_dp_aux_cec {
> * @name: user-visible name of this AUX channel and the I2C-over-AUX adapter
> * @ddc: I2C adapter that can be used for I2C-over-AUX communication
> * @dev: pointer to struct device that is the parent for this AUX channel
> + * @drm_dev: pointer to the &drm_device that owns this AUX channel. Beware, this may be %NULL
> + * before drm_dp_aux_register() has been called.
> * @crtc: backpointer to the crtc that is currently using this AUX channel
> * @hw_mutex: internal mutex used for locking transfers
> * @crc_work: worker that captures CRCs for each frame
> * @crc_count: counter of captured frame CRCs
> * @transfer: transfers a message representing a single AUX transaction
> *
> - * The @dev field should be set to a pointer to the device that implements the AUX channel.
> + * The @dev field should be set to a pointer to the device that implements the AUX channel. As well,
> + * the @drm_dev field should be set to the &drm_device that will be using this AUX channel as early
> + * as possible. For many graphics drivers this should happen before drm_dp_aux_init(), however it's
> + * perfectly fine to set this field later so long as it's assigned before calling
> + * drm_dp_aux_register().
> *
> * The @name field may be used to specify the name of the I2C adapter. If set to %NULL, dev_name()
> * of @dev will be used.
> @@ -1866,6 +1872,7 @@ struct drm_dp_aux {
> const char *name;
> struct i2c_adapter ddc;
> struct device *dev;
> + struct drm_device *drm_dev;
> struct drm_crtc *crtc;
> struct mutex hw_mutex;
> struct work_struct crc_work;
--
Regards,
Laurent Pinchart
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 15/30] drm/dp: Add backpointer to drm_device in drm_dp_aux
2021-02-21 18:21 ` Laurent Pinchart
@ 2021-02-24 20:40 ` Lyude Paul
0 siblings, 0 replies; 6+ messages in thread
From: Lyude Paul @ 2021-02-24 20:40 UTC (permalink / raw)
To: Laurent Pinchart
Cc: intel-gfx, dri-devel, amd-gfx, nouveau, Ville Syrjälä,
Jani Nikula, Rodrigo Vivi, Thomas Zimmermann, Alex Deucher,
Christian König, David Airlie, Daniel Vetter, Harry Wentland,
Leo Li, Andrzej Hajda, Neil Armstrong, Jonas Karlman,
Jernej Skrabec, Maarten Lankhorst, Maxime Ripard, Joonas Lahtinen,
Rob Clark, Sean Paul, Ben Skeggs, Thierry Reding, Jonathan Hunter,
Hyun Kwon, Michal Simek, Luben Tuikov, Oleg Vasilev, Emil Velikov,
Mikita Lipski, Eryk Brol, Rodrigo Siqueira, Jerry (Fangzhi) Zuo,
Chris Park, Pankaj Bharadiya, Sam Ravnborg, Boris Brezillon,
Torsten Duwe, Vasily Khoruzhick, Joe Perches, Icenowy Zheng,
Tomi Valkeinen, Marek Szyprowski, Swapnil Jakhade, Yuti Amonkar,
Julia Lawall, open list, open list:DRM DRIVER FOR MSM ADRENO GPU,
open list:DRM DRIVER FOR MSM ADRENO GPU,
open list:DRM DRIVERS FOR NVIDIA TEGRA,
moderated list:ARM/ZYNQ ARCHITECTURE
On Sun, 2021-02-21 at 20:21 +0200, Laurent Pinchart wrote:
> Hi Lyude,
>
> Thank you for the patch.
>
> On Fri, Feb 19, 2021 at 04:53:11PM -0500, Lyude Paul wrote:
> > This is something that we've wanted for a while now: the ability to
> > actually look up the respective drm_device for a given drm_dp_aux struct.
> > This will also allow us to transition over to using the drm_dbg_*() helpers
> > for debug message printing, as we'll finally have a drm_device to reference
> > for doing so.
>
> Isn't it better to use the existing dev field ? If you have multiple DP
> outputs for one DRM device, using the DRM device name in debug messages
> won't tell which output the message corresponds to.
Well the thing is dev won't tell you that either - on most SoCs the DP AUX
adapter is it's own platform device that isn't a child of the DRM device. Also,
that's what the ability to name AUX channels is supposed to be there for.
> > Note that there is one limitation with this - because some DP AUX adapters
> > exist as platform devices which are initialized independently of their
> > respective DRM devices, one cannot rely on drm_dp_aux->drm_dev to always be
> > non-NULL until drm_dp_aux_register() has been called. We make sure to point
> > this out in the documentation for struct drm_dp_aux.
> >
> > Signed-off-by: Lyude Paul <lyude@redhat.com>
> > ---
> > drivers/gpu/drm/amd/amdgpu/atombios_dp.c | 1 +
> > .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | 1 +
> > drivers/gpu/drm/bridge/analogix/analogix-anx6345.c | 1 +
> > drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c | 1 +
> > drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 1 +
> > drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c | 1 +
> > drivers/gpu/drm/bridge/tc358767.c | 1 +
> > drivers/gpu/drm/bridge/ti-sn65dsi86.c | 1 +
> > drivers/gpu/drm/drm_dp_aux_dev.c | 6 ++++++
> > drivers/gpu/drm/drm_dp_mst_topology.c | 1 +
> > drivers/gpu/drm/i915/display/intel_dp_aux.c | 1 +
> > drivers/gpu/drm/msm/edp/edp.h | 3 +--
> > drivers/gpu/drm/msm/edp/edp_aux.c | 5 +++--
> > drivers/gpu/drm/msm/edp/edp_ctrl.c | 2 +-
> > drivers/gpu/drm/nouveau/nouveau_connector.c | 1 +
> > drivers/gpu/drm/radeon/atombios_dp.c | 1 +
> > drivers/gpu/drm/tegra/dpaux.c | 1 +
> > drivers/gpu/drm/xlnx/zynqmp_dp.c | 1 +
> > include/drm/drm_dp_helper.h | 9 ++++++++-
> > 19 files changed, 33 insertions(+), 6 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/amd/amdgpu/atombios_dp.c
> > b/drivers/gpu/drm/amd/amdgpu/atombios_dp.c
> > index a3ba9ca11e98..6d35da65e09f 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/atombios_dp.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/atombios_dp.c
> > @@ -188,6 +188,7 @@ void amdgpu_atombios_dp_aux_init(struct amdgpu_connector
> > *amdgpu_connector)
> > {
> > amdgpu_connector->ddc_bus->rec.hpd = amdgpu_connector->hpd.hpd;
> > amdgpu_connector->ddc_bus->aux.transfer =
> > amdgpu_atombios_dp_aux_transfer;
> > + amdgpu_connector->ddc_bus->aux.drm_dev = amdgpu_connector->base.dev;
> > drm_dp_aux_init(&amdgpu_connector->ddc_bus->aux);
> > amdgpu_connector->ddc_bus->has_aux = true;
> > }
> > diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
> > b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
> > index 41b09ab22233..163641b44339 100644
> > --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
> > +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
> > @@ -431,6 +431,7 @@ void amdgpu_dm_initialize_dp_connector(struct
> > amdgpu_display_manager *dm,
> > link_index);
> > aconnector->dm_dp_aux.aux.transfer = dm_dp_aux_transfer;
> > aconnector->dm_dp_aux.ddc_service = aconnector->dc_link->ddc;
> > + aconnector->dm_dp_aux.aux.drm_dev = dm->ddev;
> >
> > drm_dp_aux_init(&aconnector->dm_dp_aux.aux);
> > drm_dp_cec_register_connector(&aconnector->dm_dp_aux.aux,
> > diff --git a/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
> > b/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
> > index aa6cda458eb9..e33cd077595a 100644
> > --- a/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
> > +++ b/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
> > @@ -537,6 +537,7 @@ static int anx6345_bridge_attach(struct drm_bridge
> > *bridge,
> > /* Register aux channel */
> > anx6345->aux.name = "DP-AUX";
> > anx6345->aux.dev = &anx6345->client->dev;
> > + anx6345->aux.drm_dev = bridge->dev;
> > anx6345->aux.transfer = anx6345_aux_transfer;
> >
> > err = drm_dp_aux_register(&anx6345->aux);
> > diff --git a/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
> > b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
> > index f20558618220..5e6a0ed39199 100644
> > --- a/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
> > +++ b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
> > @@ -905,6 +905,7 @@ static int anx78xx_bridge_attach(struct drm_bridge
> > *bridge,
> > /* Register aux channel */
> > anx78xx->aux.name = "DP-AUX";
> > anx78xx->aux.dev = &anx78xx->client->dev;
> > + anx78xx->aux.drm_dev = bridge->dev;
> > anx78xx->aux.transfer = anx78xx_aux_transfer;
> >
> > err = drm_dp_aux_register(&anx78xx->aux);
> > diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
> > b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
> > index f115233b1cb9..550814ca2139 100644
> > --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
> > +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
> > @@ -1765,6 +1765,7 @@ int analogix_dp_bind(struct analogix_dp_device *dp,
> > struct drm_device *drm_dev)
> > dp->aux.name = "DP-AUX";
> > dp->aux.transfer = analogix_dpaux_transfer;
> > dp->aux.dev = dp->dev;
> > + dp->aux.drm_dev = drm_dev;
> >
> > ret = drm_dp_aux_register(&dp->aux);
> > if (ret)
> > diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c
> > b/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c
> > index d966a33743b5..fe821ad628ec 100644
> > --- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c
> > +++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c
> > @@ -1674,6 +1674,7 @@ static int cdns_mhdp_attach(struct drm_bridge *bridge,
> >
> > dev_dbg(mhdp->dev, "%s\n", __func__);
> >
> > + mhdp->aux.drm_dev = bridge->dev;
> > ret = drm_dp_aux_register(&mhdp->aux);
> > if (ret < 0)
> > return ret;
> > diff --git a/drivers/gpu/drm/bridge/tc358767.c
> > b/drivers/gpu/drm/bridge/tc358767.c
> > index da89922721ed..23a6f90b694b 100644
> > --- a/drivers/gpu/drm/bridge/tc358767.c
> > +++ b/drivers/gpu/drm/bridge/tc358767.c
> > @@ -1414,6 +1414,7 @@ static int tc_bridge_attach(struct drm_bridge *bridge,
> > if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)
> > return 0;
> >
> > + tc->aux.drm_dev = drm;
> > ret = drm_dp_aux_register(&tc->aux);
> > if (ret < 0)
> > return ret;
> > diff --git a/drivers/gpu/drm/bridge/ti-sn65dsi86.c
> > b/drivers/gpu/drm/bridge/ti-sn65dsi86.c
> > index 88df4dd0f39d..8e24272bbf00 100644
> > --- a/drivers/gpu/drm/bridge/ti-sn65dsi86.c
> > +++ b/drivers/gpu/drm/bridge/ti-sn65dsi86.c
> > @@ -362,6 +362,7 @@ static int ti_sn_bridge_attach(struct drm_bridge
> > *bridge,
> > return -EINVAL;
> > }
> >
> > + pdata->aux.drm_dev = bridge->dev;
> > ret = drm_dp_aux_register(&pdata->aux);
> > if (ret < 0) {
> > drm_err(bridge->dev, "Failed to register DP AUX channel:
> > %d\n", ret);
> > diff --git a/drivers/gpu/drm/drm_dp_aux_dev.c
> > b/drivers/gpu/drm/drm_dp_aux_dev.c
> > index e25181bf2c48..06b374cae956 100644
> > --- a/drivers/gpu/drm/drm_dp_aux_dev.c
> > +++ b/drivers/gpu/drm/drm_dp_aux_dev.c
> > @@ -278,6 +278,12 @@ void drm_dp_aux_unregister_devnode(struct drm_dp_aux
> > *aux)
> > if (!aux_dev) /* attach must have failed */
> > return;
> >
> > + /*
> > + * As some AUX adapters may exist as platform devices which outlive
> > their respective DRM
> > + * devices, we clear drm_dev to ensure that we never accidentally
> > reference a stale pointer
> > + */
> > + aux->drm_dev = NULL;
> > +
> > mutex_lock(&aux_idr_mutex);
> > idr_remove(&aux_idr, aux_dev->index);
> > mutex_unlock(&aux_idr_mutex);
> > diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c
> > b/drivers/gpu/drm/drm_dp_mst_topology.c
> > index 932c4641ec3e..cf4f2f85711e 100644
> > --- a/drivers/gpu/drm/drm_dp_mst_topology.c
> > +++ b/drivers/gpu/drm/drm_dp_mst_topology.c
> > @@ -2349,6 +2349,7 @@ drm_dp_mst_add_port(struct drm_device *dev,
> > port->aux.is_remote = true;
> >
> > /* initialize the MST downstream port's AUX crc work queue */
> > + port->aux.drm_dev = dev;
> > drm_dp_remote_aux_init(&port->aux);
> >
> > /*
> > diff --git a/drivers/gpu/drm/i915/display/intel_dp_aux.c
> > b/drivers/gpu/drm/i915/display/intel_dp_aux.c
> > index eaebf123310a..0571c0794226 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp_aux.c
> > +++ b/drivers/gpu/drm/i915/display/intel_dp_aux.c
> > @@ -675,6 +675,7 @@ void intel_dp_aux_init(struct intel_dp *intel_dp)
> > else
> > intel_dp->get_aux_send_ctl = g4x_get_aux_send_ctl;
> >
> > + intel_dp->aux.drm_dev = &dev_priv->drm;
> > drm_dp_aux_init(&intel_dp->aux);
> >
> > /* Failure to allocate our preferred name is not critical */
> > diff --git a/drivers/gpu/drm/msm/edp/edp.h b/drivers/gpu/drm/msm/edp/edp.h
> > index eb34243dad53..8590f2ce274d 100644
> > --- a/drivers/gpu/drm/msm/edp/edp.h
> > +++ b/drivers/gpu/drm/msm/edp/edp.h
> > @@ -46,8 +46,7 @@ void edp_bridge_destroy(struct drm_bridge *bridge);
> > struct drm_connector *msm_edp_connector_init(struct msm_edp *edp);
> >
> > /* AUX */
> > -void *msm_edp_aux_init(struct device *dev, void __iomem *regbase,
> > - struct drm_dp_aux **drm_aux);
> > +void *msm_edp_aux_init(struct msm_edp *edp, void __iomem *regbase, struct
> > drm_dp_aux **drm_aux);
> > void msm_edp_aux_destroy(struct device *dev, struct edp_aux *aux);
> > irqreturn_t msm_edp_aux_irq(struct edp_aux *aux, u32 isr);
> > void msm_edp_aux_ctrl(struct edp_aux *aux, int enable);
> > diff --git a/drivers/gpu/drm/msm/edp/edp_aux.c
> > b/drivers/gpu/drm/msm/edp/edp_aux.c
> > index df10a0196d94..e3d85c622cfb 100644
> > --- a/drivers/gpu/drm/msm/edp/edp_aux.c
> > +++ b/drivers/gpu/drm/msm/edp/edp_aux.c
> > @@ -184,9 +184,9 @@ static ssize_t edp_aux_transfer(struct drm_dp_aux
> > *drm_aux,
> > return ret;
> > }
> >
> > -void *msm_edp_aux_init(struct device *dev, void __iomem *regbase,
> > - struct drm_dp_aux **drm_aux)
> > +void *msm_edp_aux_init(struct msm_edp *edp, void __iomem *regbase, struct
> > drm_dp_aux **drm_aux)
> > {
> > + struct device *dev = &edp->pdev->dev;
> > struct edp_aux *aux = NULL;
> > int ret;
> >
> > @@ -201,6 +201,7 @@ void *msm_edp_aux_init(struct device *dev, void __iomem
> > *regbase,
> >
> > aux->drm_aux.name = "msm_edp_aux";
> > aux->drm_aux.dev = dev;
> > + aux->drm_aux.drm_dev = edp->dev;
> > aux->drm_aux.transfer = edp_aux_transfer;
> > ret = drm_dp_aux_register(&aux->drm_aux);
> > if (ret) {
> > diff --git a/drivers/gpu/drm/msm/edp/edp_ctrl.c
> > b/drivers/gpu/drm/msm/edp/edp_ctrl.c
> > index 0d9657cc70db..57af3d8b6699 100644
> > --- a/drivers/gpu/drm/msm/edp/edp_ctrl.c
> > +++ b/drivers/gpu/drm/msm/edp/edp_ctrl.c
> > @@ -1153,7 +1153,7 @@ int msm_edp_ctrl_init(struct msm_edp *edp)
> > }
> >
> > /* Init aux and phy */
> > - ctrl->aux = msm_edp_aux_init(dev, ctrl->base, &ctrl->drm_aux);
> > + ctrl->aux = msm_edp_aux_init(edp, ctrl->base, &ctrl->drm_aux);
> > if (!ctrl->aux || !ctrl->drm_aux) {
> > pr_err("%s:failed to init aux\n", __func__);
> > return -ENOMEM;
> > diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c
> > b/drivers/gpu/drm/nouveau/nouveau_connector.c
> > index bfce762adcf0..d1b49508ecb9 100644
> > --- a/drivers/gpu/drm/nouveau/nouveau_connector.c
> > +++ b/drivers/gpu/drm/nouveau/nouveau_connector.c
> > @@ -1355,6 +1355,7 @@ nouveau_connector_create(struct drm_device *dev,
> > case DRM_MODE_CONNECTOR_DisplayPort:
> > case DRM_MODE_CONNECTOR_eDP:
> > nv_connector->aux.dev = connector->kdev;
> > + nv_connector->aux.drm_dev = dev;
> > nv_connector->aux.transfer = nouveau_connector_aux_xfer;
> > snprintf(aux_name, sizeof(aux_name), "sor-%04x-%04x",
> > dcbe->hasht, dcbe->hashm);
> > diff --git a/drivers/gpu/drm/radeon/atombios_dp.c
> > b/drivers/gpu/drm/radeon/atombios_dp.c
> > index 15b00a347560..c50c504bad50 100644
> > --- a/drivers/gpu/drm/radeon/atombios_dp.c
> > +++ b/drivers/gpu/drm/radeon/atombios_dp.c
> > @@ -232,6 +232,7 @@ void radeon_dp_aux_init(struct radeon_connector
> > *radeon_connector)
> >
> > radeon_connector->ddc_bus->rec.hpd = radeon_connector->hpd.hpd;
> > radeon_connector->ddc_bus->aux.dev = radeon_connector->base.kdev;
> > + radeon_connector->ddc_bus->aux.drm_dev = radeon_connector->base.dev;
> > if (ASIC_IS_DCE5(rdev)) {
> > if (radeon_auxch)
> > radeon_connector->ddc_bus->aux.transfer =
> > radeon_dp_aux_transfer_native;
> > diff --git a/drivers/gpu/drm/tegra/dpaux.c b/drivers/gpu/drm/tegra/dpaux.c
> > index ea56c6ec25e4..7d7cc90b6fc9 100644
> > --- a/drivers/gpu/drm/tegra/dpaux.c
> > +++ b/drivers/gpu/drm/tegra/dpaux.c
> > @@ -719,6 +719,7 @@ int drm_dp_aux_attach(struct drm_dp_aux *aux, struct
> > tegra_output *output)
> > unsigned long timeout;
> > int err;
> >
> > + aux->drm_dev = output->connector.dev;
> > err = drm_dp_aux_register(aux);
> > if (err < 0)
> > return err;
> > diff --git a/drivers/gpu/drm/xlnx/zynqmp_dp.c
> > b/drivers/gpu/drm/xlnx/zynqmp_dp.c
> > index 99158ee67d02..8272eee03adc 100644
> > --- a/drivers/gpu/drm/xlnx/zynqmp_dp.c
> > +++ b/drivers/gpu/drm/xlnx/zynqmp_dp.c
> > @@ -1069,6 +1069,7 @@ static int zynqmp_dp_aux_init(struct zynqmp_dp *dp)
> >
> > dp->aux.name = "ZynqMP DP AUX";
> > dp->aux.dev = dp->dev;
> > + dp->aux.drm_dev = dp->drm;
> > dp->aux.transfer = zynqmp_dp_aux_transfer;
> >
> > return drm_dp_aux_register(&dp->aux);
> > diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h
> > index b35a1c1339e8..45ec74862212 100644
> > --- a/include/drm/drm_dp_helper.h
> > +++ b/include/drm/drm_dp_helper.h
> > @@ -1833,13 +1833,19 @@ struct drm_dp_aux_cec {
> > * @name: user-visible name of this AUX channel and the I2C-over-AUX
> > adapter
> > * @ddc: I2C adapter that can be used for I2C-over-AUX communication
> > * @dev: pointer to struct device that is the parent for this AUX channel
> > + * @drm_dev: pointer to the &drm_device that owns this AUX channel. Beware,
> > this may be %NULL
> > + * before drm_dp_aux_register() has been called.
> > * @crtc: backpointer to the crtc that is currently using this AUX channel
> > * @hw_mutex: internal mutex used for locking transfers
> > * @crc_work: worker that captures CRCs for each frame
> > * @crc_count: counter of captured frame CRCs
> > * @transfer: transfers a message representing a single AUX transaction
> > *
> > - * The @dev field should be set to a pointer to the device that implements
> > the AUX channel.
> > + * The @dev field should be set to a pointer to the device that implements
> > the AUX channel. As well,
> > + * the @drm_dev field should be set to the &drm_device that will be using
> > this AUX channel as early
> > + * as possible. For many graphics drivers this should happen before
> > drm_dp_aux_init(), however it's
> > + * perfectly fine to set this field later so long as it's assigned before
> > calling
> > + * drm_dp_aux_register().
> > *
> > * The @name field may be used to specify the name of the I2C adapter. If
> > set to %NULL, dev_name()
> > * of @dev will be used.
> > @@ -1866,6 +1872,7 @@ struct drm_dp_aux {
> > const char *name;
> > struct i2c_adapter ddc;
> > struct device *dev;
> > + struct drm_device *drm_dev;
> > struct drm_crtc *crtc;
> > struct mutex hw_mutex;
> > struct work_struct crc_work;
>
--
Sincerely,
Lyude Paul (she/her)
Software Engineer at Red Hat
Note: I deal with a lot of emails and have a lot of bugs on my plate. If you've
asked me a question, are waiting for a review/merge on a patch, etc. and I
haven't responded in a while, please feel free to send me another email to check
on my status. I don't bite!
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 03/30] drm/tegra: Don't register DP AUX channels before connectors
2021-02-19 21:52 ` [PATCH 03/30] drm/tegra: Don't register DP AUX channels before connectors Lyude Paul
@ 2021-04-14 16:49 ` Thierry Reding
2021-04-14 18:17 ` Lyude Paul
0 siblings, 1 reply; 6+ messages in thread
From: Thierry Reding @ 2021-04-14 16:49 UTC (permalink / raw)
To: Lyude Paul
Cc: intel-gfx, dri-devel, amd-gfx, nouveau, Ville Syrjälä,
Jani Nikula, Rodrigo Vivi, Thomas Zimmermann, David Airlie,
Daniel Vetter, Jonathan Hunter,
open list:DRM DRIVERS FOR NVIDIA TEGRA, open list
[-- Attachment #1: Type: text/plain, Size: 2612 bytes --]
On Fri, Feb 19, 2021 at 04:52:59PM -0500, Lyude Paul wrote:
> As pointed out by the documentation for drm_dp_aux_register(),
> drm_dp_aux_init() should be used in situations where the AUX channel for a
> display driver can potentially be registered before it's respective DRM
> driver. This is the case with Tegra, since the DP aux channel exists as a
> platform device instead of being a grandchild of the DRM device.
>
> Since we're about to add a backpointer to a DP AUX channel's respective DRM
> device, let's fix this so that we don't potentially allow userspace to use
> the AUX channel before we've associated it with it's DRM connector.
>
> Signed-off-by: Lyude Paul <lyude@redhat.com>
> ---
> drivers/gpu/drm/tegra/dpaux.c | 11 ++++++-----
> 1 file changed, 6 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/tegra/dpaux.c b/drivers/gpu/drm/tegra/dpaux.c
> index 105fb9cdbb3b..ea56c6ec25e4 100644
> --- a/drivers/gpu/drm/tegra/dpaux.c
> +++ b/drivers/gpu/drm/tegra/dpaux.c
> @@ -534,9 +534,7 @@ static int tegra_dpaux_probe(struct platform_device *pdev)
> dpaux->aux.transfer = tegra_dpaux_transfer;
> dpaux->aux.dev = &pdev->dev;
>
> - err = drm_dp_aux_register(&dpaux->aux);
> - if (err < 0)
> - return err;
> + drm_dp_aux_init(&dpaux->aux);
I just noticed that this change causes an error on some setups that I
haven't seen before. The problem is that the SOR driver tries to grab a
reference to the I2C device to make sure it doesn't go away while it has
a pointer to it.
However, since now the I2C adapter hasn't been registered yet, I get
this:
[ 15.013969] kobject: '(null)' (000000005c903e43): is not initialized, yet kobject_get() is being called.
I recall that you wanted to make this change so that a backpointer to
the DRM device could be added (I think that's patch 15 of the series),
but I didn't see that patch get merged, so it's a bit difficult to try
and fix this up.
Has the situation changed? Do we no longer need the backpointer? If we
still want it, what's the plan for merging the change? Should I work
under the assumption that patch will make it in sometime and try to fix
this on top of that?
I'm thinking that perhaps we can move the I2C adapter registration into
drm_dp_aux_init() since that's independent of the DRM device. It would
also make a bit more sense from the Tegra driver's point of view where
all devices would be created during the ->probe() path, and only during
the ->init() path would the connection between DRM device and DRM DP AUX
device be established.
Thierry
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 03/30] drm/tegra: Don't register DP AUX channels before connectors
2021-04-14 16:49 ` Thierry Reding
@ 2021-04-14 18:17 ` Lyude Paul
0 siblings, 0 replies; 6+ messages in thread
From: Lyude Paul @ 2021-04-14 18:17 UTC (permalink / raw)
To: Thierry Reding
Cc: intel-gfx, dri-devel, amd-gfx, nouveau, Ville Syrjälä,
Jani Nikula, Rodrigo Vivi, Thomas Zimmermann, David Airlie,
Daniel Vetter, Jonathan Hunter,
open list:DRM DRIVERS FOR NVIDIA TEGRA, open list
On Wed, 2021-04-14 at 18:49 +0200, Thierry Reding wrote:
> On Fri, Feb 19, 2021 at 04:52:59PM -0500, Lyude Paul wrote:
> > As pointed out by the documentation for drm_dp_aux_register(),
> > drm_dp_aux_init() should be used in situations where the AUX channel for a
> > display driver can potentially be registered before it's respective DRM
> > driver. This is the case with Tegra, since the DP aux channel exists as a
> > platform device instead of being a grandchild of the DRM device.
> >
> > Since we're about to add a backpointer to a DP AUX channel's respective
> > DRM
> > device, let's fix this so that we don't potentially allow userspace to use
> > the AUX channel before we've associated it with it's DRM connector.
> >
> > Signed-off-by: Lyude Paul <lyude@redhat.com>
> > ---
> > drivers/gpu/drm/tegra/dpaux.c | 11 ++++++-----
> > 1 file changed, 6 insertions(+), 5 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/tegra/dpaux.c b/drivers/gpu/drm/tegra/dpaux.c
> > index 105fb9cdbb3b..ea56c6ec25e4 100644
> > --- a/drivers/gpu/drm/tegra/dpaux.c
> > +++ b/drivers/gpu/drm/tegra/dpaux.c
> > @@ -534,9 +534,7 @@ static int tegra_dpaux_probe(struct platform_device
> > *pdev)
> > dpaux->aux.transfer = tegra_dpaux_transfer;
> > dpaux->aux.dev = &pdev->dev;
> >
> > - err = drm_dp_aux_register(&dpaux->aux);
> > - if (err < 0)
> > - return err;
> > + drm_dp_aux_init(&dpaux->aux);
>
> I just noticed that this change causes an error on some setups that I
> haven't seen before. The problem is that the SOR driver tries to grab a
> reference to the I2C device to make sure it doesn't go away while it has
> a pointer to it.
>
> However, since now the I2C adapter hasn't been registered yet, I get
> this:
>
> [ 15.013969] kobject: '(null)' (000000005c903e43): is not
> initialized, yet kobject_get() is being called.
>
> I recall that you wanted to make this change so that a backpointer to
> the DRM device could be added (I think that's patch 15 of the series),
> but I didn't see that patch get merged, so it's a bit difficult to try
> and fix this up.
I'm pretty sure I already merged the tegra change in drm-misc-next, so if it's
causing issues you probably should send out a revert for now and I can r-b it
so we can figure out a better solution for this in the mean time
> Has the situation changed? Do we no longer need the backpointer? If we
> still want it, what's the plan for merging the change? Should I work
> under the assumption that patch will make it in sometime and try to fix
> this on top of that?
yes we do still need the backpointer - I'm just still working on getting
reviews for some of the other parts of this series, and have been on PTO/busy
with a couple of other things.
>
> I'm thinking that perhaps we can move the I2C adapter registration into
> drm_dp_aux_init() since that's independent of the DRM device.
Yeah this makes sense for me - I can try to make this change on the next
respin of this series. What kind of setup were you able to reproduce issues on
this with btw?
> It would
> also make a bit more sense from the Tegra driver's point of view where
> all devices would be created during the ->probe() path, and only during
> the ->init() path would the connection between DRM device and DRM DP AUX
> device be established.
>
> Thierry
--
Cheers,
Lyude Paul (she/her)
Software Engineer at Red Hat
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2021-04-14 18:18 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20210219215326.2227596-1-lyude@redhat.com>
2021-02-19 21:52 ` [PATCH 03/30] drm/tegra: Don't register DP AUX channels before connectors Lyude Paul
2021-04-14 16:49 ` Thierry Reding
2021-04-14 18:17 ` Lyude Paul
2021-02-19 21:53 ` [PATCH 15/30] drm/dp: Add backpointer to drm_device in drm_dp_aux Lyude Paul
2021-02-21 18:21 ` Laurent Pinchart
2021-02-24 20:40 ` Lyude Paul
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox