2022-08-10 03:49:47

by Bjorn Andersson

[permalink] [raw]
Subject: [PATCH 0/7] drm/msm/dp: Support for external displays

Introduce support for DisplayPort on SDM845 and SC8280XP, followed by
introduction of drm_bridge based HPD handling.

The version of these patches are restarted, as the previous
drm_connector_oob_hotplug_event()-based approach was abandoned and this only
barely resembles that effort.

In this effort the HPD handling is based on the reliance of the hpd_notify()
being invoked by a downstream (next_bridge) drm_bridge implementation, such as
the standard display-connector, or a something like an USB Type-C controller
implementation.

Bjorn Andersson (7):
dt-bindings: msm/dp: Add SDM845 and SC8280XP compatibles
drm/msm/dp: Stop using DP id as index in desc
drm/msm/dp: Add DP and EDP compatibles for SC8280XP
drm/msm/dp: Add SDM845 DisplayPort instance
drm/msm/dp: Implement hpd_notify()
drm/msm/dp: Don't enable HPD interrupts for edp
drm/msm/dp: HPD handling relates to next_bridge

.../bindings/display/msm/dp-controller.yaml | 3 +
drivers/gpu/drm/msm/dp/dp_display.c | 136 +++++++++++-------
drivers/gpu/drm/msm/dp/dp_display.h | 1 +
drivers/gpu/drm/msm/dp/dp_drm.c | 3 +
drivers/gpu/drm/msm/dp/dp_drm.h | 2 +
drivers/gpu/drm/msm/msm_drv.h | 1 +
6 files changed, 92 insertions(+), 54 deletions(-)

--
2.35.1


2022-08-10 03:50:19

by Bjorn Andersson

[permalink] [raw]
Subject: [PATCH 2/7] drm/msm/dp: Stop using DP id as index in desc

In the SC8280XP platform there are two identical MDSS instances, each
with the same set of DisplayPort instances, at different addresses.

By not relying on the index to define the instance id it's possible to
describe them both in the same table and hence have a single compatible.

While at it, flatten the cfg/desc structure so that the match data is
just an array of descs.

Signed-off-by: Bjorn Andersson <[email protected]>
---
drivers/gpu/drm/msm/dp/dp_display.c | 72 ++++++++++-------------------
1 file changed, 25 insertions(+), 47 deletions(-)

diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c
index bfd0aeff3f0d..2d9bbc335786 100644
--- a/drivers/gpu/drm/msm/dp/dp_display.c
+++ b/drivers/gpu/drm/msm/dp/dp_display.c
@@ -122,61 +122,41 @@ struct dp_display_private {

struct msm_dp_desc {
phys_addr_t io_start;
+ unsigned int id;
unsigned int connector_type;
bool wide_bus_en;
};

-struct msm_dp_config {
- const struct msm_dp_desc *descs;
- size_t num_descs;
-};
-
static const struct msm_dp_desc sc7180_dp_descs[] = {
- [MSM_DP_CONTROLLER_0] = { .io_start = 0x0ae90000, .connector_type = DRM_MODE_CONNECTOR_DisplayPort },
-};
-
-static const struct msm_dp_config sc7180_dp_cfg = {
- .descs = sc7180_dp_descs,
- .num_descs = ARRAY_SIZE(sc7180_dp_descs),
+ { .io_start = 0x0ae90000, .id = MSM_DP_CONTROLLER_0, .connector_type = DRM_MODE_CONNECTOR_DisplayPort },
+ {}
};

static const struct msm_dp_desc sc7280_dp_descs[] = {
- [MSM_DP_CONTROLLER_0] = { .io_start = 0x0ae90000, .connector_type = DRM_MODE_CONNECTOR_DisplayPort, .wide_bus_en = true },
- [MSM_DP_CONTROLLER_1] = { .io_start = 0x0aea0000, .connector_type = DRM_MODE_CONNECTOR_eDP, .wide_bus_en = true },
-};
-
-static const struct msm_dp_config sc7280_dp_cfg = {
- .descs = sc7280_dp_descs,
- .num_descs = ARRAY_SIZE(sc7280_dp_descs),
+ { .io_start = 0x0ae90000, .id = MSM_DP_CONTROLLER_0, .connector_type = DRM_MODE_CONNECTOR_DisplayPort, .wide_bus_en = true },
+ { .io_start = 0x0aea0000, .id = MSM_DP_CONTROLLER_1, .connector_type = DRM_MODE_CONNECTOR_eDP, .wide_bus_en = true },
+ {}
};

static const struct msm_dp_desc sc8180x_dp_descs[] = {
- [MSM_DP_CONTROLLER_0] = { .io_start = 0x0ae90000, .connector_type = DRM_MODE_CONNECTOR_DisplayPort },
- [MSM_DP_CONTROLLER_1] = { .io_start = 0x0ae98000, .connector_type = DRM_MODE_CONNECTOR_DisplayPort },
- [MSM_DP_CONTROLLER_2] = { .io_start = 0x0ae9a000, .connector_type = DRM_MODE_CONNECTOR_eDP },
-};
-
-static const struct msm_dp_config sc8180x_dp_cfg = {
- .descs = sc8180x_dp_descs,
- .num_descs = ARRAY_SIZE(sc8180x_dp_descs),
+ { .io_start = 0x0ae90000, .id = MSM_DP_CONTROLLER_0, .connector_type = DRM_MODE_CONNECTOR_DisplayPort },
+ { .io_start = 0x0ae98000, .id = MSM_DP_CONTROLLER_1, .connector_type = DRM_MODE_CONNECTOR_DisplayPort },
+ { .io_start = 0x0ae9a000, .id = MSM_DP_CONTROLLER_2, .connector_type = DRM_MODE_CONNECTOR_eDP },
+ {}
};

static const struct msm_dp_desc sm8350_dp_descs[] = {
- [MSM_DP_CONTROLLER_0] = { .io_start = 0x0ae90000, .connector_type = DRM_MODE_CONNECTOR_DisplayPort },
-};
-
-static const struct msm_dp_config sm8350_dp_cfg = {
- .descs = sm8350_dp_descs,
- .num_descs = ARRAY_SIZE(sm8350_dp_descs),
+ { .io_start = 0x0ae90000, .id = MSM_DP_CONTROLLER_0, .connector_type = DRM_MODE_CONNECTOR_DisplayPort },
+ {}
};

static const struct of_device_id dp_dt_match[] = {
- { .compatible = "qcom,sc7180-dp", .data = &sc7180_dp_cfg },
- { .compatible = "qcom,sc7280-dp", .data = &sc7280_dp_cfg },
- { .compatible = "qcom,sc7280-edp", .data = &sc7280_dp_cfg },
- { .compatible = "qcom,sc8180x-dp", .data = &sc8180x_dp_cfg },
- { .compatible = "qcom,sc8180x-edp", .data = &sc8180x_dp_cfg },
- { .compatible = "qcom,sm8350-dp", .data = &sm8350_dp_cfg },
+ { .compatible = "qcom,sc7180-dp", .data = &sc7180_dp_descs },
+ { .compatible = "qcom,sc7280-dp", .data = &sc7280_dp_descs },
+ { .compatible = "qcom,sc7280-edp", .data = &sc7280_dp_descs },
+ { .compatible = "qcom,sc8180x-dp", .data = &sc8180x_dp_descs },
+ { .compatible = "qcom,sc8180x-edp", .data = &sc8180x_dp_descs },
+ { .compatible = "qcom,sm8350-dp", .data = &sm8350_dp_descs },
{}
};

@@ -1262,10 +1242,9 @@ int dp_display_request_irq(struct msm_dp *dp_display)
return 0;
}

-static const struct msm_dp_desc *dp_display_get_desc(struct platform_device *pdev,
- unsigned int *id)
+static const struct msm_dp_desc *dp_display_get_desc(struct platform_device *pdev)
{
- const struct msm_dp_config *cfg = of_device_get_match_data(&pdev->dev);
+ const struct msm_dp_desc *descs = of_device_get_match_data(&pdev->dev);
struct resource *res;
int i;

@@ -1273,11 +1252,9 @@ static const struct msm_dp_desc *dp_display_get_desc(struct platform_device *pde
if (!res)
return NULL;

- for (i = 0; i < cfg->num_descs; i++) {
- if (cfg->descs[i].io_start == res->start) {
- *id = i;
- return &cfg->descs[i];
- }
+ for (i = 0; i < descs[i].io_start; i++) {
+ if (descs[i].io_start == res->start)
+ return &descs[i];
}

dev_err(&pdev->dev, "unknown displayport instance\n");
@@ -1299,12 +1276,13 @@ static int dp_display_probe(struct platform_device *pdev)
if (!dp)
return -ENOMEM;

- desc = dp_display_get_desc(pdev, &dp->id);
+ desc = dp_display_get_desc(pdev);
if (!desc)
return -EINVAL;

dp->pdev = pdev;
dp->name = "drm_dp";
+ dp->id = desc->id;
dp->dp_display.connector_type = desc->connector_type;
dp->wide_bus_en = desc->wide_bus_en;
dp->dp_display.is_edp =
--
2.35.1

2022-08-10 03:50:51

by Bjorn Andersson

[permalink] [raw]
Subject: [PATCH 4/7] drm/msm/dp: Add SDM845 DisplayPort instance

The Qualcomm SDM845 platform has a single DisplayPort controller, with
the same design as SC7180, so add support for this by reusing the SC7180
definition.

Signed-off-by: Bjorn Andersson <[email protected]>
---
drivers/gpu/drm/msm/dp/dp_display.c | 1 +
1 file changed, 1 insertion(+)

diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c
index e4a83c2cd972..699f28f2251e 100644
--- a/drivers/gpu/drm/msm/dp/dp_display.c
+++ b/drivers/gpu/drm/msm/dp/dp_display.c
@@ -178,6 +178,7 @@ static const struct of_device_id dp_dt_match[] = {
{ .compatible = "qcom,sc8180x-edp", .data = &sc8180x_dp_descs },
{ .compatible = "qcom,sc8280xp-dp", .data = &sc8280xp_dp_descs },
{ .compatible = "qcom,sc8280xp-edp", .data = &sc8280xp_edp_descs },
+ { .compatible = "qcom,sdm845-dp", .data = &sc7180_dp_descs },
{ .compatible = "qcom,sm8350-dp", .data = &sm8350_dp_descs },
{}
};
--
2.35.1

2022-08-10 03:50:53

by Bjorn Andersson

[permalink] [raw]
Subject: [PATCH 5/7] drm/msm/dp: Implement hpd_notify()

The DisplayPort controller's hot-plug mechanism is based on pinmuxing a
physical signal no a GPIO pin into the controller. This is not always
possible, either because there aren't dedicated GPIOs available or
because the hot-plug signal is a virtual notification, in cases such as
USB Type-C.

For these cases, by implementing the hpd_notify() callback for the
DisplayPort controller's drm_bridge, a downstream drm_bridge
(next_bridge) can be used to track and signal the connection status
changes.

This makes it possible to use downstream drm_bridges such as
display-connector or any virtual mechanism, as long as they are
implemented as a drm_bridge.

Signed-off-by: Bjorn Andersson <[email protected]>
---
drivers/gpu/drm/msm/dp/dp_display.c | 23 +++++++++++++++++++++++
drivers/gpu/drm/msm/dp/dp_display.h | 1 +
drivers/gpu/drm/msm/dp/dp_drm.c | 3 +++
drivers/gpu/drm/msm/dp/dp_drm.h | 2 ++
4 files changed, 29 insertions(+)

diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c
index 699f28f2251e..568295381246 100644
--- a/drivers/gpu/drm/msm/dp/dp_display.c
+++ b/drivers/gpu/drm/msm/dp/dp_display.c
@@ -1303,6 +1303,7 @@ static int dp_display_probe(struct platform_device *pdev)
if (!desc)
return -EINVAL;

+ dp->dp_display.dev = &pdev->dev;
dp->pdev = pdev;
dp->name = "drm_dp";
dp->id = desc->id;
@@ -1765,3 +1766,25 @@ void dp_bridge_mode_set(struct drm_bridge *drm_bridge,
dp_display->dp_mode.h_active_low =
!!(dp_display->dp_mode.drm_mode.flags & DRM_MODE_FLAG_NHSYNC);
}
+
+void dp_bridge_hpd_notify(struct drm_bridge *bridge,
+ enum drm_connector_status status)
+{
+ struct msm_dp_bridge *dp_bridge = to_dp_bridge(bridge);
+ struct msm_dp *dp_display = dp_bridge->dp_display;
+ struct dp_display_private *dp = container_of(dp_display, struct dp_display_private, dp_display);
+
+ /* Without next_bridge interrupts are handled by the DP core directly */
+ if (!dp_display->next_bridge)
+ return;
+
+ if (!dp->core_initialized) {
+ drm_dbg_dp(dp->drm_dev, "not initialized\n");
+ return;
+ }
+
+ if (!dp_display->is_connected && status == connector_status_connected)
+ dp_add_event(dp, EV_HPD_PLUG_INT, 0, 0);
+ else if (dp_display->is_connected && status == connector_status_disconnected)
+ dp_add_event(dp, EV_HPD_UNPLUG_INT, 0, 0);
+}
diff --git a/drivers/gpu/drm/msm/dp/dp_display.h b/drivers/gpu/drm/msm/dp/dp_display.h
index dcedf021f7fe..d7bc537ead31 100644
--- a/drivers/gpu/drm/msm/dp/dp_display.h
+++ b/drivers/gpu/drm/msm/dp/dp_display.h
@@ -11,6 +11,7 @@
#include "disp/msm_disp_snapshot.h"

struct msm_dp {
+ struct device *dev;
struct drm_device *drm_dev;
struct device *codec_dev;
struct drm_bridge *bridge;
diff --git a/drivers/gpu/drm/msm/dp/dp_drm.c b/drivers/gpu/drm/msm/dp/dp_drm.c
index 6df25f7662e7..875b23910bef 100644
--- a/drivers/gpu/drm/msm/dp/dp_drm.c
+++ b/drivers/gpu/drm/msm/dp/dp_drm.c
@@ -68,6 +68,7 @@ static const struct drm_bridge_funcs dp_bridge_ops = {
.mode_valid = dp_bridge_mode_valid,
.get_modes = dp_bridge_get_modes,
.detect = dp_bridge_detect,
+ .hpd_notify = dp_bridge_hpd_notify,
};

struct drm_bridge *dp_bridge_init(struct msm_dp *dp_display, struct drm_device *dev,
@@ -138,6 +139,8 @@ struct drm_connector *dp_drm_connector_init(struct msm_dp *dp_display, struct dr
if (IS_ERR(connector))
return connector;

+ connector->fwnode = fwnode_handle_get(dev_fwnode(dp_display->dev));
+
drm_connector_attach_encoder(connector, encoder);

return connector;
diff --git a/drivers/gpu/drm/msm/dp/dp_drm.h b/drivers/gpu/drm/msm/dp/dp_drm.h
index 82035dbb0578..79e6b2cf2d25 100644
--- a/drivers/gpu/drm/msm/dp/dp_drm.h
+++ b/drivers/gpu/drm/msm/dp/dp_drm.h
@@ -32,5 +32,7 @@ enum drm_mode_status dp_bridge_mode_valid(struct drm_bridge *bridge,
void dp_bridge_mode_set(struct drm_bridge *drm_bridge,
const struct drm_display_mode *mode,
const struct drm_display_mode *adjusted_mode);
+void dp_bridge_hpd_notify(struct drm_bridge *bridge,
+ enum drm_connector_status status);

#endif /* _DP_DRM_H_ */
--
2.35.1

2022-08-10 03:51:27

by Bjorn Andersson

[permalink] [raw]
Subject: [PATCH 7/7] drm/msm/dp: HPD handling relates to next_bridge

The DisplayPort controller's internal HPD interrupt handling is used for
cases where the HPD signal is connected to a GPIO which is pinmuxed into
the DisplayPort controller.

Most of the logic for enabling and disabling the HPD-related interrupts
is conditioned on the presence of an EDP panel, but more generically
designs that has a downstream drm_bridge (next_bridge) could use this to
handle the HPD interrupts, instead of the internal mechanism.

So replace the current is_edp-based guards with a check for the presence
of next_bridge.

Signed-off-by: Bjorn Andersson <[email protected]>
---
drivers/gpu/drm/msm/dp/dp_display.c | 15 +++++++--------
1 file changed, 7 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c
index bb4db9acaa4f..3e93918aa276 100644
--- a/drivers/gpu/drm/msm/dp/dp_display.c
+++ b/drivers/gpu/drm/msm/dp/dp_display.c
@@ -610,7 +610,7 @@ static int dp_hpd_plug_handle(struct dp_display_private *dp, u32 data)
}

/* enable HDP irq_hpd/replug interrupt */
- if (!dp->dp_display.is_edp)
+ if (!dp->dp_display.next_bridge)
dp_catalog_hpd_config_intr(dp->catalog,
DP_DP_IRQ_HPD_INT_MASK | DP_DP_HPD_REPLUG_INT_MASK,
true);
@@ -653,7 +653,7 @@ static int dp_hpd_unplug_handle(struct dp_display_private *dp, u32 data)
dp->dp_display.connector_type, state);

/* disable irq_hpd/replug interrupts */
- if (!dp->dp_display.is_edp)
+ if (!dp->dp_display.next_bridge)
dp_catalog_hpd_config_intr(dp->catalog,
DP_DP_IRQ_HPD_INT_MASK | DP_DP_HPD_REPLUG_INT_MASK,
false);
@@ -682,7 +682,7 @@ static int dp_hpd_unplug_handle(struct dp_display_private *dp, u32 data)
}

/* disable HPD plug interrupts */
- if (!dp->dp_display.is_edp)
+ if (!dp->dp_display.next_bridge)
dp_catalog_hpd_config_intr(dp->catalog, DP_DP_HPD_PLUG_INT_MASK, false);

/*
@@ -701,7 +701,7 @@ static int dp_hpd_unplug_handle(struct dp_display_private *dp, u32 data)
dp_display_handle_plugged_change(&dp->dp_display, false);

/* enable HDP plug interrupt to prepare for next plugin */
- if (!dp->dp_display.is_edp)
+ if (!dp->dp_display.next_bridge)
dp_catalog_hpd_config_intr(dp->catalog, DP_DP_HPD_PLUG_INT_MASK, true);

drm_dbg_dp(dp->drm_dev, "After, type=%d hpd_state=%d\n",
@@ -1086,8 +1086,8 @@ static void dp_display_config_hpd(struct dp_display_private *dp)
dp_display_host_init(dp);
dp_catalog_ctrl_hpd_config(dp->catalog);

- /* Enable plug and unplug interrupts only for external DisplayPort */
- if (!dp->dp_display.is_edp)
+ /* Enable plug and unplug interrupts only if not handled by next_bridge */
+ if (!dp->dp_display.next_bridge)
dp_catalog_hpd_config_intr(dp->catalog,
DP_DP_HPD_PLUG_INT_MASK |
DP_DP_HPD_UNPLUG_INT_MASK,
@@ -1380,8 +1380,7 @@ static int dp_pm_resume(struct device *dev)

dp_catalog_ctrl_hpd_config(dp->catalog);

-
- if (!dp->dp_display.is_edp)
+ if (!dp->dp_display.next_bridge)
dp_catalog_hpd_config_intr(dp->catalog,
DP_DP_HPD_PLUG_INT_MASK |
DP_DP_HPD_UNPLUG_INT_MASK,
--
2.35.1

2022-08-10 04:05:26

by Bjorn Andersson

[permalink] [raw]
Subject: [PATCH 6/7] drm/msm/dp: Don't enable HPD interrupts for edp

Most instances where HPD interrupts are masked and unmasked are guareded
by the presence of an EDP panel being connected, but not all. Extend
this to cover the last few places, as HPD interrupt handling is not used
for the EDP case.

Signed-off-by: Bjorn Andersson <[email protected]>
---
drivers/gpu/drm/msm/dp/dp_display.c | 15 ++++++++++-----
1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c
index 568295381246..bb4db9acaa4f 100644
--- a/drivers/gpu/drm/msm/dp/dp_display.c
+++ b/drivers/gpu/drm/msm/dp/dp_display.c
@@ -610,8 +610,10 @@ static int dp_hpd_plug_handle(struct dp_display_private *dp, u32 data)
}

/* enable HDP irq_hpd/replug interrupt */
- dp_catalog_hpd_config_intr(dp->catalog,
- DP_DP_IRQ_HPD_INT_MASK | DP_DP_HPD_REPLUG_INT_MASK, true);
+ if (!dp->dp_display.is_edp)
+ dp_catalog_hpd_config_intr(dp->catalog,
+ DP_DP_IRQ_HPD_INT_MASK | DP_DP_HPD_REPLUG_INT_MASK,
+ true);

drm_dbg_dp(dp->drm_dev, "After, type=%d hpd_state=%d\n",
dp->dp_display.connector_type, state);
@@ -651,8 +653,10 @@ static int dp_hpd_unplug_handle(struct dp_display_private *dp, u32 data)
dp->dp_display.connector_type, state);

/* disable irq_hpd/replug interrupts */
- dp_catalog_hpd_config_intr(dp->catalog,
- DP_DP_IRQ_HPD_INT_MASK | DP_DP_HPD_REPLUG_INT_MASK, false);
+ if (!dp->dp_display.is_edp)
+ dp_catalog_hpd_config_intr(dp->catalog,
+ DP_DP_IRQ_HPD_INT_MASK | DP_DP_HPD_REPLUG_INT_MASK,
+ false);

/* unplugged, no more irq_hpd handle */
dp_del_event(dp, EV_IRQ_HPD_INT);
@@ -678,7 +682,8 @@ static int dp_hpd_unplug_handle(struct dp_display_private *dp, u32 data)
}

/* disable HPD plug interrupts */
- dp_catalog_hpd_config_intr(dp->catalog, DP_DP_HPD_PLUG_INT_MASK, false);
+ if (!dp->dp_display.is_edp)
+ dp_catalog_hpd_config_intr(dp->catalog, DP_DP_HPD_PLUG_INT_MASK, false);

/*
* We don't need separate work for disconnect as
--
2.35.1

2022-08-10 04:05:57

by Bjorn Andersson

[permalink] [raw]
Subject: [PATCH 3/7] drm/msm/dp: Add DP and EDP compatibles for SC8280XP

The SC8280XP platform has four DisplayPort controllers, per MDSS
instance, all with widebus support.

The first two are defined to be DisplayPort only, while the latter pair
(of each instance) can be either DisplayPort or Embedded DisplayPort.
The two sets are tied to the possible compatibels.

Signed-off-by: Bjorn Andersson <[email protected]>
---
drivers/gpu/drm/msm/dp/dp_display.c | 22 ++++++++++++++++++++++
drivers/gpu/drm/msm/msm_drv.h | 1 +
2 files changed, 23 insertions(+)

diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c
index 2d9bbc335786..e4a83c2cd972 100644
--- a/drivers/gpu/drm/msm/dp/dp_display.c
+++ b/drivers/gpu/drm/msm/dp/dp_display.c
@@ -145,6 +145,26 @@ static const struct msm_dp_desc sc8180x_dp_descs[] = {
{}
};

+static const struct msm_dp_desc sc8280xp_dp_descs[] = {
+ { .io_start = 0x0ae90000, .id = MSM_DP_CONTROLLER_0, .connector_type = DRM_MODE_CONNECTOR_DisplayPort, .wide_bus_en = true },
+ { .io_start = 0x0ae98000, .id = MSM_DP_CONTROLLER_1, .connector_type = DRM_MODE_CONNECTOR_DisplayPort, .wide_bus_en = true },
+ { .io_start = 0x0ae9a000, .id = MSM_DP_CONTROLLER_2, .connector_type = DRM_MODE_CONNECTOR_DisplayPort, .wide_bus_en = true },
+ { .io_start = 0x0aea0000, .id = MSM_DP_CONTROLLER_3, .connector_type = DRM_MODE_CONNECTOR_DisplayPort, .wide_bus_en = true },
+ { .io_start = 0x22090000, .id = MSM_DP_CONTROLLER_0, .connector_type = DRM_MODE_CONNECTOR_DisplayPort, .wide_bus_en = true },
+ { .io_start = 0x22098000, .id = MSM_DP_CONTROLLER_1, .connector_type = DRM_MODE_CONNECTOR_DisplayPort, .wide_bus_en = true },
+ { .io_start = 0x2209a000, .id = MSM_DP_CONTROLLER_2, .connector_type = DRM_MODE_CONNECTOR_DisplayPort, .wide_bus_en = true },
+ { .io_start = 0x220a0000, .id = MSM_DP_CONTROLLER_3, .connector_type = DRM_MODE_CONNECTOR_DisplayPort, .wide_bus_en = true },
+ {}
+};
+
+static const struct msm_dp_desc sc8280xp_edp_descs[] = {
+ { .io_start = 0x0ae9a000, .id = MSM_DP_CONTROLLER_2, .connector_type = DRM_MODE_CONNECTOR_eDP, .wide_bus_en = true },
+ { .io_start = 0x0aea0000, .id = MSM_DP_CONTROLLER_3, .connector_type = DRM_MODE_CONNECTOR_eDP, .wide_bus_en = true },
+ { .io_start = 0x2209a000, .id = MSM_DP_CONTROLLER_2, .connector_type = DRM_MODE_CONNECTOR_eDP, .wide_bus_en = true },
+ { .io_start = 0x220a0000, .id = MSM_DP_CONTROLLER_3, .connector_type = DRM_MODE_CONNECTOR_eDP, .wide_bus_en = true },
+ {}
+};
+
static const struct msm_dp_desc sm8350_dp_descs[] = {
{ .io_start = 0x0ae90000, .id = MSM_DP_CONTROLLER_0, .connector_type = DRM_MODE_CONNECTOR_DisplayPort },
{}
@@ -156,6 +176,8 @@ static const struct of_device_id dp_dt_match[] = {
{ .compatible = "qcom,sc7280-edp", .data = &sc7280_dp_descs },
{ .compatible = "qcom,sc8180x-dp", .data = &sc8180x_dp_descs },
{ .compatible = "qcom,sc8180x-edp", .data = &sc8180x_dp_descs },
+ { .compatible = "qcom,sc8280xp-dp", .data = &sc8280xp_dp_descs },
+ { .compatible = "qcom,sc8280xp-edp", .data = &sc8280xp_edp_descs },
{ .compatible = "qcom,sm8350-dp", .data = &sm8350_dp_descs },
{}
};
diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
index b3689a2d27d7..5978c6e26a1e 100644
--- a/drivers/gpu/drm/msm/msm_drv.h
+++ b/drivers/gpu/drm/msm/msm_drv.h
@@ -55,6 +55,7 @@ enum msm_dp_controller {
MSM_DP_CONTROLLER_0,
MSM_DP_CONTROLLER_1,
MSM_DP_CONTROLLER_2,
+ MSM_DP_CONTROLLER_3,
MSM_DP_CONTROLLER_COUNT,
};

--
2.35.1

2022-08-10 04:06:42

by Bjorn Andersson

[permalink] [raw]
Subject: [PATCH 1/7] dt-bindings: msm/dp: Add SDM845 and SC8280XP compatibles

Add compatibles for the DisplayPort and Embedded DisplayPort blocks in
Qualcomm SDM845 and SC8280XP platforms.

Signed-off-by: Bjorn Andersson <[email protected]>
---
.../devicetree/bindings/display/msm/dp-controller.yaml | 3 +++
1 file changed, 3 insertions(+)

diff --git a/Documentation/devicetree/bindings/display/msm/dp-controller.yaml b/Documentation/devicetree/bindings/display/msm/dp-controller.yaml
index 94bc6e1b6451..90f9302d1731 100644
--- a/Documentation/devicetree/bindings/display/msm/dp-controller.yaml
+++ b/Documentation/devicetree/bindings/display/msm/dp-controller.yaml
@@ -16,11 +16,14 @@ description: |
properties:
compatible:
enum:
+ - qcom,sdm845-dp
- qcom,sc7180-dp
- qcom,sc7280-dp
- qcom,sc7280-edp
- qcom,sc8180x-dp
- qcom,sc8180x-edp
+ - qcom,sc8280xp-dp
+ - qcom,sc8280xp-edp
- qcom,sm8350-dp

reg:
--
2.35.1

2022-08-10 14:10:59

by Rob Herring

[permalink] [raw]
Subject: Re: [PATCH 1/7] dt-bindings: msm/dp: Add SDM845 and SC8280XP compatibles

On Tue, 09 Aug 2022 20:50:07 -0700, Bjorn Andersson wrote:
> Add compatibles for the DisplayPort and Embedded DisplayPort blocks in
> Qualcomm SDM845 and SC8280XP platforms.
>
> Signed-off-by: Bjorn Andersson <[email protected]>
> ---
> .../devicetree/bindings/display/msm/dp-controller.yaml | 3 +++
> 1 file changed, 3 insertions(+)
>

Running 'make dtbs_check' with the schema in this patch gives the
following warnings. Consider if they are expected or the schema is
incorrect. These may not be new warnings.

Note that it is not yet a requirement to have 0 warnings for dtbs_check.
This will change in the future.

Full log is available here: https://patchwork.ozlabs.org/patch/


displayport-controller@ae90000: '#clock-cells', 'data-lanes', 'opp-table', 'vdda-0p9-supply', 'vdda-1p2-supply' do not match any of the regexes: 'pinctrl-[0-9]+'
arch/arm64/boot/dts/qcom/sc7180-trogdor-coachz-r1.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-coachz-r1-lte.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-coachz-r3.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-coachz-r3-lte.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-homestar-r2.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-homestar-r3.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-homestar-r4.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-limozeen-nots-r4.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-limozeen-nots-r5.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-limozeen-nots-r9.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-limozeen-r4.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-limozeen-r9.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r0.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r1.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r1-kb.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r1-lte.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r3.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r3-kb.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r3-lte.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r9.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r9-kb.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r9-lte.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-pompom-r1.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-pompom-r1-lte.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-pompom-r2.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-pompom-r2-lte.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-pompom-r3.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-pompom-r3-lte.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-r1.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-r1-lte.dtb

displayport-controller@ae90000: '#clock-cells', 'opp-table' do not match any of the regexes: 'pinctrl-[0-9]+'
arch/arm64/boot/dts/qcom/sc7180-idp.dtb
arch/arm64/boot/dts/qcom/sc7280-crd-r3.dtb
arch/arm64/boot/dts/qcom/sc7280-herobrine-crd.dtb
arch/arm64/boot/dts/qcom/sc7280-herobrine-herobrine-r1.dtb
arch/arm64/boot/dts/qcom/sc7280-herobrine-villager-r0.dtb
arch/arm64/boot/dts/qcom/sc7280-idp2.dtb
arch/arm64/boot/dts/qcom/sc7280-idp.dtb

displayport-controller@ae90000: reg: [[0, 183042048, 0, 5120]] is too short
arch/arm64/boot/dts/qcom/sc7180-idp.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-coachz-r1.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-coachz-r1-lte.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-coachz-r3.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-coachz-r3-lte.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-homestar-r2.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-homestar-r3.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-homestar-r4.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-limozeen-nots-r4.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-limozeen-nots-r5.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-limozeen-nots-r9.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-limozeen-r4.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-limozeen-r9.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r0.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r1.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r1-kb.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r1-lte.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r3.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r3-kb.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r3-lte.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r9.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r9-kb.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r9-lte.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-pompom-r1.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-pompom-r1-lte.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-pompom-r2.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-pompom-r2-lte.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-pompom-r3.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-pompom-r3-lte.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-r1.dtb
arch/arm64/boot/dts/qcom/sc7180-trogdor-r1-lte.dtb
arch/arm64/boot/dts/qcom/sc7280-crd-r3.dtb
arch/arm64/boot/dts/qcom/sc7280-herobrine-crd.dtb
arch/arm64/boot/dts/qcom/sc7280-herobrine-herobrine-r1.dtb
arch/arm64/boot/dts/qcom/sc7280-herobrine-villager-r0.dtb
arch/arm64/boot/dts/qcom/sc7280-idp2.dtb
arch/arm64/boot/dts/qcom/sc7280-idp.dtb

edp@aea0000: '#address-cells', '#clock-cells', '#size-cells', 'aux-bus', 'opp-table', 'vdda-0p9-supply', 'vdda-1p2-supply' do not match any of the regexes: 'pinctrl-[0-9]+'
arch/arm64/boot/dts/qcom/sc7280-herobrine-crd.dtb
arch/arm64/boot/dts/qcom/sc7280-herobrine-herobrine-r1.dtb
arch/arm64/boot/dts/qcom/sc7280-herobrine-villager-r0.dtb

edp@aea0000: '#address-cells', '#clock-cells', '#size-cells', 'opp-table' do not match any of the regexes: 'pinctrl-[0-9]+'
arch/arm64/boot/dts/qcom/sc7280-crd-r3.dtb
arch/arm64/boot/dts/qcom/sc7280-idp2.dtb
arch/arm64/boot/dts/qcom/sc7280-idp.dtb

edp@aea0000: clock-names:0: 'core_iface' was expected
arch/arm64/boot/dts/qcom/sc7280-crd-r3.dtb
arch/arm64/boot/dts/qcom/sc7280-herobrine-crd.dtb
arch/arm64/boot/dts/qcom/sc7280-herobrine-herobrine-r1.dtb
arch/arm64/boot/dts/qcom/sc7280-herobrine-villager-r0.dtb
arch/arm64/boot/dts/qcom/sc7280-idp2.dtb
arch/arm64/boot/dts/qcom/sc7280-idp.dtb

edp@aea0000: clock-names:1: 'core_aux' was expected
arch/arm64/boot/dts/qcom/sc7280-crd-r3.dtb
arch/arm64/boot/dts/qcom/sc7280-herobrine-crd.dtb
arch/arm64/boot/dts/qcom/sc7280-herobrine-herobrine-r1.dtb
arch/arm64/boot/dts/qcom/sc7280-herobrine-villager-r0.dtb
arch/arm64/boot/dts/qcom/sc7280-idp2.dtb
arch/arm64/boot/dts/qcom/sc7280-idp.dtb

edp@aea0000: clock-names:2: 'ctrl_link' was expected
arch/arm64/boot/dts/qcom/sc7280-crd-r3.dtb
arch/arm64/boot/dts/qcom/sc7280-herobrine-crd.dtb
arch/arm64/boot/dts/qcom/sc7280-herobrine-herobrine-r1.dtb
arch/arm64/boot/dts/qcom/sc7280-herobrine-villager-r0.dtb
arch/arm64/boot/dts/qcom/sc7280-idp2.dtb
arch/arm64/boot/dts/qcom/sc7280-idp.dtb

edp@aea0000: clock-names:3: 'ctrl_link_iface' was expected
arch/arm64/boot/dts/qcom/sc7280-crd-r3.dtb
arch/arm64/boot/dts/qcom/sc7280-herobrine-crd.dtb
arch/arm64/boot/dts/qcom/sc7280-herobrine-herobrine-r1.dtb
arch/arm64/boot/dts/qcom/sc7280-herobrine-villager-r0.dtb
arch/arm64/boot/dts/qcom/sc7280-idp2.dtb
arch/arm64/boot/dts/qcom/sc7280-idp.dtb

edp@aea0000: clock-names:4: 'stream_pixel' was expected
arch/arm64/boot/dts/qcom/sc7280-crd-r3.dtb
arch/arm64/boot/dts/qcom/sc7280-herobrine-crd.dtb
arch/arm64/boot/dts/qcom/sc7280-herobrine-herobrine-r1.dtb
arch/arm64/boot/dts/qcom/sc7280-herobrine-villager-r0.dtb
arch/arm64/boot/dts/qcom/sc7280-idp2.dtb
arch/arm64/boot/dts/qcom/sc7280-idp.dtb

edp@aea0000: clock-names: ['core_xo', 'core_ref', 'core_iface', 'core_aux', 'ctrl_link', 'ctrl_link_iface', 'stream_pixel'] is too long
arch/arm64/boot/dts/qcom/sc7280-crd-r3.dtb
arch/arm64/boot/dts/qcom/sc7280-herobrine-crd.dtb
arch/arm64/boot/dts/qcom/sc7280-herobrine-herobrine-r1.dtb
arch/arm64/boot/dts/qcom/sc7280-herobrine-villager-r0.dtb
arch/arm64/boot/dts/qcom/sc7280-idp2.dtb
arch/arm64/boot/dts/qcom/sc7280-idp.dtb

edp@aea0000: clocks: [[39, 0], [42, 183], [286, 1], [286, 17], [286, 19], [286, 22], [286, 23]] is too long
arch/arm64/boot/dts/qcom/sc7280-idp.dtb

edp@aea0000: clocks: [[39, 0], [42, 183], [291, 1], [291, 17], [291, 19], [291, 22], [291, 23]] is too long
arch/arm64/boot/dts/qcom/sc7280-idp2.dtb

edp@aea0000: clocks: [[39, 0], [42, 183], [294, 1], [294, 17], [294, 19], [294, 22], [294, 23]] is too long
arch/arm64/boot/dts/qcom/sc7280-crd-r3.dtb

edp@aea0000: clocks: [[39, 0], [42, 183], [299, 1], [299, 17], [299, 19], [299, 22], [299, 23]] is too long
arch/arm64/boot/dts/qcom/sc7280-herobrine-villager-r0.dtb

edp@aea0000: clocks: [[39, 0], [42, 183], [302, 1], [302, 17], [302, 19], [302, 22], [302, 23]] is too long
arch/arm64/boot/dts/qcom/sc7280-herobrine-crd.dtb
arch/arm64/boot/dts/qcom/sc7280-herobrine-herobrine-r1.dtb

edp@aea0000: reg: [[0, 183107584, 0, 512], [0, 183108096, 0, 512], [0, 183108608, 0, 3072], [0, 183111680, 0, 1024]] is too short
arch/arm64/boot/dts/qcom/sc7280-crd-r3.dtb
arch/arm64/boot/dts/qcom/sc7280-herobrine-crd.dtb
arch/arm64/boot/dts/qcom/sc7280-herobrine-herobrine-r1.dtb
arch/arm64/boot/dts/qcom/sc7280-herobrine-villager-r0.dtb
arch/arm64/boot/dts/qcom/sc7280-idp2.dtb
arch/arm64/boot/dts/qcom/sc7280-idp.dtb

edp@aea0000: '#sound-dai-cells' is a required property
arch/arm64/boot/dts/qcom/sc7280-herobrine-crd.dtb
arch/arm64/boot/dts/qcom/sc7280-herobrine-herobrine-r1.dtb
arch/arm64/boot/dts/qcom/sc7280-herobrine-villager-r0.dtb

2022-08-10 15:43:17

by Krzysztof Kozlowski

[permalink] [raw]
Subject: Re: [PATCH 1/7] dt-bindings: msm/dp: Add SDM845 and SC8280XP compatibles

On 10/08/2022 06:50, Bjorn Andersson wrote:
> Add compatibles for the DisplayPort and Embedded DisplayPort blocks in
> Qualcomm SDM845 and SC8280XP platforms.
>
> Signed-off-by: Bjorn Andersson <[email protected]>
> ---
> .../devicetree/bindings/display/msm/dp-controller.yaml | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/display/msm/dp-controller.yaml b/Documentation/devicetree/bindings/display/msm/dp-controller.yaml
> index 94bc6e1b6451..90f9302d1731 100644
> --- a/Documentation/devicetree/bindings/display/msm/dp-controller.yaml
> +++ b/Documentation/devicetree/bindings/display/msm/dp-controller.yaml
> @@ -16,11 +16,14 @@ description: |
> properties:
> compatible:
> enum:
> + - qcom,sdm845-dp
> - qcom,sc7180-dp

Alphabetical order, please.

The DTS warnings from the bot look unrelated to this patch.



Best regards,
Krzysztof

2022-08-10 20:18:27

by Rob Herring

[permalink] [raw]
Subject: Re: [PATCH 1/7] dt-bindings: msm/dp: Add SDM845 and SC8280XP compatibles

On Wed, Aug 10, 2022 at 05:47:52PM +0300, Krzysztof Kozlowski wrote:
> On 10/08/2022 06:50, Bjorn Andersson wrote:
> > Add compatibles for the DisplayPort and Embedded DisplayPort blocks in
> > Qualcomm SDM845 and SC8280XP platforms.
> >
> > Signed-off-by: Bjorn Andersson <[email protected]>
> > ---
> > .../devicetree/bindings/display/msm/dp-controller.yaml | 3 +++
> > 1 file changed, 3 insertions(+)
> >
> > diff --git a/Documentation/devicetree/bindings/display/msm/dp-controller.yaml b/Documentation/devicetree/bindings/display/msm/dp-controller.yaml
> > index 94bc6e1b6451..90f9302d1731 100644
> > --- a/Documentation/devicetree/bindings/display/msm/dp-controller.yaml
> > +++ b/Documentation/devicetree/bindings/display/msm/dp-controller.yaml
> > @@ -16,11 +16,14 @@ description: |
> > properties:
> > compatible:
> > enum:
> > + - qcom,sdm845-dp
> > - qcom,sc7180-dp
>
> Alphabetical order, please.
>
> The DTS warnings from the bot look unrelated to this patch.

Yes, but there are a ton of them and I thought Bjorn might care. Looks
like the schema is pretty out of sync with reality and they don't really
look like dts side fixes.

Rob

2022-08-11 07:02:19

by Krzysztof Kozlowski

[permalink] [raw]
Subject: Re: [PATCH 1/7] dt-bindings: msm/dp: Add SDM845 and SC8280XP compatibles

On 10/08/2022 22:20, Rob Herring wrote:
> On Wed, Aug 10, 2022 at 05:47:52PM +0300, Krzysztof Kozlowski wrote:
>> On 10/08/2022 06:50, Bjorn Andersson wrote:
>>> Add compatibles for the DisplayPort and Embedded DisplayPort blocks in
>>> Qualcomm SDM845 and SC8280XP platforms.
>>>
>>> Signed-off-by: Bjorn Andersson <[email protected]>
>>> ---
>>> .../devicetree/bindings/display/msm/dp-controller.yaml | 3 +++
>>> 1 file changed, 3 insertions(+)
>>>
>>> diff --git a/Documentation/devicetree/bindings/display/msm/dp-controller.yaml b/Documentation/devicetree/bindings/display/msm/dp-controller.yaml
>>> index 94bc6e1b6451..90f9302d1731 100644
>>> --- a/Documentation/devicetree/bindings/display/msm/dp-controller.yaml
>>> +++ b/Documentation/devicetree/bindings/display/msm/dp-controller.yaml
>>> @@ -16,11 +16,14 @@ description: |
>>> properties:
>>> compatible:
>>> enum:
>>> + - qcom,sdm845-dp
>>> - qcom,sc7180-dp
>>
>> Alphabetical order, please.
>>
>> The DTS warnings from the bot look unrelated to this patch.
>
> Yes, but there are a ton of them and I thought Bjorn might care. Looks
> like the schema is pretty out of sync with reality and they don't really
> look like dts side fixes.

It's in progress by Dmitry:
https://lore.kernel.org/all/[email protected]/

Best regards,
Krzysztof

2022-08-22 20:38:05

by Dmitry Baryshkov

[permalink] [raw]
Subject: Re: [PATCH 4/7] drm/msm/dp: Add SDM845 DisplayPort instance

On 10/08/2022 06:50, Bjorn Andersson wrote:
> The Qualcomm SDM845 platform has a single DisplayPort controller, with
> the same design as SC7180, so add support for this by reusing the SC7180
> definition.
>
> Signed-off-by: Bjorn Andersson <[email protected]>

Reviewed-by: Dmitry Baryshkov <[email protected]>

> ---
> drivers/gpu/drm/msm/dp/dp_display.c | 1 +
> 1 file changed, 1 insertion(+)
>

--
With best wishes
Dmitry

2022-08-22 21:02:32

by Dmitry Baryshkov

[permalink] [raw]
Subject: Re: [PATCH 5/7] drm/msm/dp: Implement hpd_notify()

On 10/08/2022 06:50, Bjorn Andersson wrote:
> The DisplayPort controller's hot-plug mechanism is based on pinmuxing a
> physical signal no a GPIO pin into the controller. This is not always
> possible, either because there aren't dedicated GPIOs available or
> because the hot-plug signal is a virtual notification, in cases such as
> USB Type-C.
>
> For these cases, by implementing the hpd_notify() callback for the
> DisplayPort controller's drm_bridge, a downstream drm_bridge
> (next_bridge) can be used to track and signal the connection status
> changes.
>
> This makes it possible to use downstream drm_bridges such as
> display-connector or any virtual mechanism, as long as they are
> implemented as a drm_bridge.
>
> Signed-off-by: Bjorn Andersson <[email protected]>
> ---
> drivers/gpu/drm/msm/dp/dp_display.c | 23 +++++++++++++++++++++++
> drivers/gpu/drm/msm/dp/dp_display.h | 1 +
> drivers/gpu/drm/msm/dp/dp_drm.c | 3 +++
> drivers/gpu/drm/msm/dp/dp_drm.h | 2 ++
> 4 files changed, 29 insertions(+)
>
> diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c
> index 699f28f2251e..568295381246 100644
> --- a/drivers/gpu/drm/msm/dp/dp_display.c
> +++ b/drivers/gpu/drm/msm/dp/dp_display.c
> @@ -1303,6 +1303,7 @@ static int dp_display_probe(struct platform_device *pdev)
> if (!desc)
> return -EINVAL;
>
> + dp->dp_display.dev = &pdev->dev;
> dp->pdev = pdev;
> dp->name = "drm_dp";
> dp->id = desc->id;
> @@ -1765,3 +1766,25 @@ void dp_bridge_mode_set(struct drm_bridge *drm_bridge,
> dp_display->dp_mode.h_active_low =
> !!(dp_display->dp_mode.drm_mode.flags & DRM_MODE_FLAG_NHSYNC);
> }
> +
> +void dp_bridge_hpd_notify(struct drm_bridge *bridge,
> + enum drm_connector_status status)
> +{
> + struct msm_dp_bridge *dp_bridge = to_dp_bridge(bridge);
> + struct msm_dp *dp_display = dp_bridge->dp_display;
> + struct dp_display_private *dp = container_of(dp_display, struct dp_display_private, dp_display);
> +
> + /* Without next_bridge interrupts are handled by the DP core directly */
> + if (!dp_display->next_bridge)
> + return;
> +
> + if (!dp->core_initialized) {
> + drm_dbg_dp(dp->drm_dev, "not initialized\n");
> + return;
> + }
> +
> + if (!dp_display->is_connected && status == connector_status_connected)
> + dp_add_event(dp, EV_HPD_PLUG_INT, 0, 0);
> + else if (dp_display->is_connected && status == connector_status_disconnected)
> + dp_add_event(dp, EV_HPD_UNPLUG_INT, 0, 0);
> +}
> diff --git a/drivers/gpu/drm/msm/dp/dp_display.h b/drivers/gpu/drm/msm/dp/dp_display.h
> index dcedf021f7fe..d7bc537ead31 100644
> --- a/drivers/gpu/drm/msm/dp/dp_display.h
> +++ b/drivers/gpu/drm/msm/dp/dp_display.h
> @@ -11,6 +11,7 @@
> #include "disp/msm_disp_snapshot.h"
>
> struct msm_dp {
> + struct device *dev;
> struct drm_device *drm_dev;
> struct device *codec_dev;
> struct drm_bridge *bridge;
> diff --git a/drivers/gpu/drm/msm/dp/dp_drm.c b/drivers/gpu/drm/msm/dp/dp_drm.c
> index 6df25f7662e7..875b23910bef 100644
> --- a/drivers/gpu/drm/msm/dp/dp_drm.c
> +++ b/drivers/gpu/drm/msm/dp/dp_drm.c
> @@ -68,6 +68,7 @@ static const struct drm_bridge_funcs dp_bridge_ops = {
> .mode_valid = dp_bridge_mode_valid,
> .get_modes = dp_bridge_get_modes,
> .detect = dp_bridge_detect,
> + .hpd_notify = dp_bridge_hpd_notify,
> };
>
> struct drm_bridge *dp_bridge_init(struct msm_dp *dp_display, struct drm_device *dev,
> @@ -138,6 +139,8 @@ struct drm_connector *dp_drm_connector_init(struct msm_dp *dp_display, struct dr
> if (IS_ERR(connector))
> return connector;
>
> + connector->fwnode = fwnode_handle_get(dev_fwnode(dp_display->dev));

Not used anymore, isn't it? Then dp_display->dev also seems unused.

> +
> drm_connector_attach_encoder(connector, encoder);
>
> return connector;
> diff --git a/drivers/gpu/drm/msm/dp/dp_drm.h b/drivers/gpu/drm/msm/dp/dp_drm.h
> index 82035dbb0578..79e6b2cf2d25 100644
> --- a/drivers/gpu/drm/msm/dp/dp_drm.h
> +++ b/drivers/gpu/drm/msm/dp/dp_drm.h
> @@ -32,5 +32,7 @@ enum drm_mode_status dp_bridge_mode_valid(struct drm_bridge *bridge,
> void dp_bridge_mode_set(struct drm_bridge *drm_bridge,
> const struct drm_display_mode *mode,
> const struct drm_display_mode *adjusted_mode);
> +void dp_bridge_hpd_notify(struct drm_bridge *bridge,
> + enum drm_connector_status status);
>
> #endif /* _DP_DRM_H_ */

--
With best wishes
Dmitry

2022-08-22 21:08:28

by Dmitry Baryshkov

[permalink] [raw]
Subject: Re: [PATCH 6/7] drm/msm/dp: Don't enable HPD interrupts for edp

On 10/08/2022 06:50, Bjorn Andersson wrote:
> Most instances where HPD interrupts are masked and unmasked are guareded
> by the presence of an EDP panel being connected, but not all. Extend
> this to cover the last few places, as HPD interrupt handling is not used
> for the EDP case.
>
> Signed-off-by: Bjorn Andersson <[email protected]>

Reviewed-by: Dmitry Baryshkov <[email protected]>

> ---
> drivers/gpu/drm/msm/dp/dp_display.c | 15 ++++++++++-----
> 1 file changed, 10 insertions(+), 5 deletions(-)

--
With best wishes
Dmitry

2022-08-22 21:16:16

by Dmitry Baryshkov

[permalink] [raw]
Subject: Re: [PATCH 3/7] drm/msm/dp: Add DP and EDP compatibles for SC8280XP

On 10/08/2022 06:50, Bjorn Andersson wrote:
> The SC8280XP platform has four DisplayPort controllers, per MDSS
> instance, all with widebus support.
>
> The first two are defined to be DisplayPort only, while the latter pair
> (of each instance) can be either DisplayPort or Embedded DisplayPort.
> The two sets are tied to the possible compatibels.
>
> Signed-off-by: Bjorn Andersson <[email protected]>

Reviewed-by: Dmitry Baryshkov <[email protected]>

> ---
> drivers/gpu/drm/msm/dp/dp_display.c | 22 ++++++++++++++++++++++
> drivers/gpu/drm/msm/msm_drv.h | 1 +
> 2 files changed, 23 insertions(+)--
With best wishes
Dmitry