2023-03-16 14:09:00

by Jayesh Choudhary

[permalink] [raw]
Subject: [PATCH 0/2] "no-hpd" support in CDNS DP bridge driver

In J721s2 EVM, DP0 HPD is not connected to correct HPD pin on SOC
which results in HPD detect as always connnected, so when display
is not connected driver continuously retries to read EDID and DPCD
registers.

To handle such cases add support for no hpd configuration in
cdns-mhdp driver.

DT changes for display in j721s2 will be posted once we have no-hpd
support and multilink DP support[1] merged.

[1]:
<https://lore.kernel.org/all/[email protected]/>

Rahul T R (2):
dt-bindings: drm/bridge: Add no-hpd property
drm: bridge: cdns-mhdp8546: Add support for no-hpd

.../display/bridge/cdns,mhdp8546.yaml | 6 +++
.../drm/bridge/cadence/cdns-mhdp8546-core.c | 37 ++++++++++++++++---
.../drm/bridge/cadence/cdns-mhdp8546-core.h | 1 +
3 files changed, 39 insertions(+), 5 deletions(-)

--
2.25.1



2023-03-16 14:09:15

by Jayesh Choudhary

[permalink] [raw]
Subject: [PATCH 1/2] dt-bindings: drm/bridge: Add no-hpd property

From: Rahul T R <[email protected]>

Add no-hpd property to the bindings, to disable
hpd when not connected or unusable

Signed-off-by: Rahul T R <[email protected]>
Signed-off-by: Jayesh Choudhary <[email protected]>
---
.../devicetree/bindings/display/bridge/cdns,mhdp8546.yaml | 6 ++++++
1 file changed, 6 insertions(+)

diff --git a/Documentation/devicetree/bindings/display/bridge/cdns,mhdp8546.yaml b/Documentation/devicetree/bindings/display/bridge/cdns,mhdp8546.yaml
index b2e8bc6da9d0..69d381195218 100644
--- a/Documentation/devicetree/bindings/display/bridge/cdns,mhdp8546.yaml
+++ b/Documentation/devicetree/bindings/display/bridge/cdns,mhdp8546.yaml
@@ -57,6 +57,12 @@ properties:
interrupts:
maxItems: 1

+ cdns,no-hpd:
+ type: boolean
+ description:
+ Set if the HPD line on the bridge isn't hooked up to anything or is
+ otherwise unusable.
+
ports:
$ref: /schemas/graph.yaml#/properties/ports

--
2.25.1


2023-03-16 14:10:02

by Jayesh Choudhary

[permalink] [raw]
Subject: [PATCH 2/2] drm: bridge: cdns-mhdp8546: Add support for no-hpd

From: Rahul T R <[email protected]>

In J721S2 EVMs DP0 hpd is not connected to correct
hpd pin on SOC, to handle such cases, Add support for
"no-hpd" property in the device tree node to disable
hpd

Also change the log level for dpcd read failuers to
debug, since framework retries 32 times for each read

Signed-off-by: Rahul T R <[email protected]>
Signed-off-by: Jayesh Choudhary <[email protected]>
---
.../drm/bridge/cadence/cdns-mhdp8546-core.c | 37 ++++++++++++++++---
.../drm/bridge/cadence/cdns-mhdp8546-core.h | 1 +
2 files changed, 33 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c b/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c
index f6822dfa3805..e177794b069d 100644
--- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c
+++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c
@@ -54,6 +54,8 @@
#include "cdns-mhdp8546-hdcp.h"
#include "cdns-mhdp8546-j721e.h"

+static int cdns_mhdp_update_link_status(struct cdns_mhdp_device *mhdp);
+
static int cdns_mhdp_mailbox_read(struct cdns_mhdp_device *mhdp)
{
int ret, empty;
@@ -749,7 +751,7 @@ static int cdns_mhdp_fw_activate(const struct firmware *fw,
* MHDP_HW_STOPPED happens only due to driver removal when
* bridge should already be detached.
*/
- if (mhdp->bridge_attached)
+ if (mhdp->bridge_attached && !mhdp->no_hpd)
writel(~(u32)CDNS_APB_INT_MASK_SW_EVENT_INT,
mhdp->regs + CDNS_APB_INT_MASK);

@@ -845,7 +847,7 @@ static ssize_t cdns_mhdp_transfer(struct drm_dp_aux *aux,
ret = cdns_mhdp_dpcd_read(mhdp, msg->address,
msg->buffer, msg->size);
if (ret) {
- dev_err(mhdp->dev,
+ dev_dbg(mhdp->dev,
"Failed to read DPCD addr %u\n",
msg->address);

@@ -1738,6 +1740,19 @@ static int cdns_mhdp_attach(struct drm_bridge *bridge,

spin_unlock(&mhdp->start_lock);

+ if (mhdp->no_hpd) {
+ ret = wait_event_timeout(mhdp->fw_load_wq,
+ mhdp->hw_state == MHDP_HW_READY,
+ msecs_to_jiffies(100));
+ if (ret == 0) {
+ dev_err(mhdp->dev, "%s: Timeout waiting for fw loading\n",
+ __func__);
+ return -ETIMEDOUT;
+ }
+
+ cdns_mhdp_update_link_status(mhdp);
+ return 0;
+ }
/* Enable SW event interrupts */
if (hw_ready)
writel(~(u32)CDNS_APB_INT_MASK_SW_EVENT_INT,
@@ -2256,7 +2271,16 @@ static int cdns_mhdp_update_link_status(struct cdns_mhdp_device *mhdp)

mutex_lock(&mhdp->link_mutex);

- mhdp->plugged = cdns_mhdp_detect_hpd(mhdp, &hpd_pulse);
+ if (mhdp->no_hpd) {
+ ret = drm_dp_dpcd_read_link_status(&mhdp->aux, status);
+ hpd_pulse = false;
+ if (ret < 0)
+ mhdp->plugged = false;
+ else
+ mhdp->plugged = true;
+ } else {
+ mhdp->plugged = cdns_mhdp_detect_hpd(mhdp, &hpd_pulse);
+ }

if (!mhdp->plugged) {
cdns_mhdp_link_down(mhdp);
@@ -2451,6 +2475,8 @@ static int cdns_mhdp_probe(struct platform_device *pdev)
mhdp->aux.dev = dev;
mhdp->aux.transfer = cdns_mhdp_transfer;

+ mhdp->no_hpd = of_property_read_bool(dev->of_node, "cdns,no-hpd");
+
mhdp->regs = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(mhdp->regs)) {
dev_err(dev, "Failed to get memory resource\n");
@@ -2526,8 +2552,9 @@ static int cdns_mhdp_probe(struct platform_device *pdev)

mhdp->bridge.of_node = pdev->dev.of_node;
mhdp->bridge.funcs = &cdns_mhdp_bridge_funcs;
- mhdp->bridge.ops = DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID |
- DRM_BRIDGE_OP_HPD;
+ mhdp->bridge.ops = DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID;
+ if (!mhdp->no_hpd)
+ mhdp->bridge.ops |= DRM_BRIDGE_OP_HPD;
mhdp->bridge.type = DRM_MODE_CONNECTOR_DisplayPort;
if (mhdp->info)
mhdp->bridge.timings = mhdp->info->timings;
diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.h b/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.h
index bedddd510d17..6786ccb51387 100644
--- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.h
+++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.h
@@ -388,6 +388,7 @@ struct cdns_mhdp_device {

bool link_up;
bool plugged;
+ bool no_hpd;

/*
* "start_lock" protects the access to bridge_attached and
--
2.25.1


2023-03-17 12:38:38

by Krzysztof Kozlowski

[permalink] [raw]
Subject: Re: [PATCH 1/2] dt-bindings: drm/bridge: Add no-hpd property

On 16/03/2023 15:08, Jayesh Choudhary wrote:
> From: Rahul T R <[email protected]>
>
> Add no-hpd property to the bindings, to disable
> hpd when not connected or unusable
>
> Signed-off-by: Rahul T R <[email protected]>
> Signed-off-by: Jayesh Choudhary <[email protected]>
> ---
> .../devicetree/bindings/display/bridge/cdns,mhdp8546.yaml | 6 ++++++
> 1 file changed, 6 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/display/bridge/cdns,mhdp8546.yaml b/Documentation/devicetree/bindings/display/bridge/cdns,mhdp8546.yaml
> index b2e8bc6da9d0..69d381195218 100644
> --- a/Documentation/devicetree/bindings/display/bridge/cdns,mhdp8546.yaml
> +++ b/Documentation/devicetree/bindings/display/bridge/cdns,mhdp8546.yaml
> @@ -57,6 +57,12 @@ properties:
> interrupts:
> maxItems: 1
>
> + cdns,no-hpd:

There is already no-hpd property.

> + type: boolean
> + description:
> + Set if the HPD line on the bridge isn't hooked up to anything or is
> + otherwise unusable.

It's the property of the panel, not bridge. Unless you want to say that
bridge physically does not have HPD? Does it follow the standard in such
case?

Best regards,
Krzysztof


2023-03-21 12:02:58

by Jayesh Choudhary

[permalink] [raw]
Subject: Re: [PATCH 1/2] dt-bindings: drm/bridge: Add no-hpd property

Hello Krzysztof,

On 17/03/23 18:08, Krzysztof Kozlowski wrote:
> On 16/03/2023 15:08, Jayesh Choudhary wrote:
>> From: Rahul T R <[email protected]>
>>
>> Add no-hpd property to the bindings, to disable
>> hpd when not connected or unusable
>>
>> Signed-off-by: Rahul T R <[email protected]>
>> Signed-off-by: Jayesh Choudhary <[email protected]>
>> ---
>> .../devicetree/bindings/display/bridge/cdns,mhdp8546.yaml | 6 ++++++
>> 1 file changed, 6 insertions(+)
>>
>> diff --git a/Documentation/devicetree/bindings/display/bridge/cdns,mhdp8546.yaml b/Documentation/devicetree/bindings/display/bridge/cdns,mhdp8546.yaml
>> index b2e8bc6da9d0..69d381195218 100644
>> --- a/Documentation/devicetree/bindings/display/bridge/cdns,mhdp8546.yaml
>> +++ b/Documentation/devicetree/bindings/display/bridge/cdns,mhdp8546.yaml
>> @@ -57,6 +57,12 @@ properties:
>> interrupts:
>> maxItems: 1
>>
>> + cdns,no-hpd:
>
> There is already no-hpd property.
>
>> + type: boolean
>> + description:
>> + Set if the HPD line on the bridge isn't hooked up to anything or is
>> + otherwise unusable.
>
> It's the property of the panel, not bridge. Unless you want to say that
> bridge physically does not have HPD? Does it follow the standard in such
> case?

MHDP does have hpd. But the mhdp driver should handle the cases when the
hpd pin of bridge is not connected to that of the DP-connector. This is
to add support for that. (optional property)

-Jayesh


>
> Best regards,
> Krzysztof
>

2023-03-21 12:38:19

by Krzysztof Kozlowski

[permalink] [raw]
Subject: Re: [PATCH 1/2] dt-bindings: drm/bridge: Add no-hpd property

On 21/03/2023 13:02, Jayesh Choudhary wrote:
>>
>>> + type: boolean
>>> + description:
>>> + Set if the HPD line on the bridge isn't hooked up to anything or is
>>> + otherwise unusable.
>>
>> It's the property of the panel, not bridge. Unless you want to say that
>> bridge physically does not have HPD? Does it follow the standard in such
>> case?
>
> MHDP does have hpd. But the mhdp driver should handle the cases when the

This is about bindings, not driver. Your driver can still handle this as
it wishes.

> hpd pin of bridge is not connected to that of the DP-connector. This is
> to add support for that. (optional property)

Which is indicated by panel no-hpd, right? Or you mean now that HPD
physically cannot go to panel because it is cut on the bridge side? But
isn't this the same case (from hardware/bindings point, not driver) as
panel would not have HPD?


Best regards,
Krzysztof


2023-03-21 14:29:40

by Jayesh Choudhary

[permalink] [raw]
Subject: Re: [PATCH 1/2] dt-bindings: drm/bridge: Add no-hpd property



On 21/03/23 18:08, Krzysztof Kozlowski wrote:
> On 21/03/2023 13:02, Jayesh Choudhary wrote:
>>>
>>>> + type: boolean
>>>> + description:
>>>> + Set if the HPD line on the bridge isn't hooked up to anything or is
>>>> + otherwise unusable.
>>>
>>> It's the property of the panel, not bridge. Unless you want to say that
>>> bridge physically does not have HPD? Does it follow the standard in such
>>> case?
>>
>> MHDP does have hpd. But the mhdp driver should handle the cases when the
>
> This is about bindings, not driver. Your driver can still handle this as
> it wishes.
>
>> hpd pin of bridge is not connected to that of the DP-connector. This is
>> to add support for that. (optional property)
>
> Which is indicated by panel no-hpd, right?

Actually no panel is involved in this. For TI SoC J721S2, the data
pipeline involves the bridge whose endpoint is directly the DP connector
with compatible 'dp-connector'. And in the binding dp-connector.yaml,
there isn't any 'no-hpd' property for this indication.

Does this clarifies the issue? Or did I misinterpret your comment?

> Or you mean now that HPD
> physically cannot go to panel because it is cut on the bridge side? But
> isn't this the same case (from hardware/bindings point, not driver) as
> panel would not have HPD?
Warm Regards,
-Jayesh

2023-03-21 15:17:56

by Krzysztof Kozlowski

[permalink] [raw]
Subject: Re: [PATCH 1/2] dt-bindings: drm/bridge: Add no-hpd property

On 21/03/2023 15:28, Jayesh Choudhary wrote:
>
>
> On 21/03/23 18:08, Krzysztof Kozlowski wrote:
>> On 21/03/2023 13:02, Jayesh Choudhary wrote:
>>>>
>>>>> + type: boolean
>>>>> + description:
>>>>> + Set if the HPD line on the bridge isn't hooked up to anything or is
>>>>> + otherwise unusable.
>>>>
>>>> It's the property of the panel, not bridge. Unless you want to say that
>>>> bridge physically does not have HPD? Does it follow the standard in such
>>>> case?
>>>
>>> MHDP does have hpd. But the mhdp driver should handle the cases when the
>>
>> This is about bindings, not driver. Your driver can still handle this as
>> it wishes.
>>
>>> hpd pin of bridge is not connected to that of the DP-connector. This is
>>> to add support for that. (optional property)
>>
>> Which is indicated by panel no-hpd, right?
>
> Actually no panel is involved in this. For TI SoC J721S2, the data
> pipeline involves the bridge whose endpoint is directly the DP connector
> with compatible 'dp-connector'. And in the binding dp-connector.yaml,
> there isn't any 'no-hpd' property for this indication.
>
> Does this clarifies the issue? Or did I misinterpret your comment?

Yes, then you only need to narrow which hardware does not have HPD
hooked up. Or at least clarify that it is not about driver having or not
having HPD control...


Best regards,
Krzysztof


2023-03-23 12:33:41

by Jayesh Choudhary

[permalink] [raw]
Subject: Re: [PATCH 1/2] dt-bindings: drm/bridge: Add no-hpd property



On 21/03/23 20:47, Krzysztof Kozlowski wrote:
> On 21/03/2023 15:28, Jayesh Choudhary wrote:
>>
>>
>> On 21/03/23 18:08, Krzysztof Kozlowski wrote:
>>> On 21/03/2023 13:02, Jayesh Choudhary wrote:
>>>>>
>>>>>> + type: boolean
>>>>>> + description:
>>>>>> + Set if the HPD line on the bridge isn't hooked up to anything or is
>>>>>> + otherwise unusable.
>>>>>
>>>>> It's the property of the panel, not bridge. Unless you want to say that
>>>>> bridge physically does not have HPD? Does it follow the standard in such
>>>>> case?
>>>>
>>>> MHDP does have hpd. But the mhdp driver should handle the cases when the
>>>
>>> This is about bindings, not driver. Your driver can still handle this as
>>> it wishes.
>>>
>>>> hpd pin of bridge is not connected to that of the DP-connector. This is
>>>> to add support for that. (optional property)
>>>
>>> Which is indicated by panel no-hpd, right?
>>
>> Actually no panel is involved in this. For TI SoC J721S2, the data
>> pipeline involves the bridge whose endpoint is directly the DP connector
>> with compatible 'dp-connector'. And in the binding dp-connector.yaml,
>> there isn't any 'no-hpd' property for this indication.
>>
>> Does this clarifies the issue? Or did I misinterpret your comment?
>
> Yes, then you only need to narrow which hardware does not have HPD
> hooked up. Or at least clarify that it is not about driver having or not
> having HPD control...
>

Okay. I will edit the commit message in v2. (after further review of the
driver changes for this series)

I will mention that the mhdp bridge can work without its HPD pin hooked
up to the connector, but the current bridge driver throws an error when
hpd line is not connected to the connector. For such cases, using this
optional property, we can bypass the hpd detection and instead use the
auxiliary channels connected to the DP connector to confirm the connection.

Thanks,
-Jayesh