2020-04-24 15:42:02

by Maxime Ripard

[permalink] [raw]
Subject: [PATCH v2 79/91] drm/vc4: hdmi: Deal with multiple debugfs files

The HDMI driver was registering a single debugfs file so far with the name
hdmi_regs.

Obviously, this is not going to work anymore when will have multiple HDMI
controllers since we will end up trying to register two files with the same
name.

Let's use the ID to avoid that name conflict.

Signed-off-by: Maxime Ripard <[email protected]>
---
drivers/gpu/drm/vc4/vc4_hdmi.c | 5 ++++-
drivers/gpu/drm/vc4/vc4_hdmi.h | 3 +++
2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c
index aaf96420d0ec..aae5b10a2d11 100644
--- a/drivers/gpu/drm/vc4/vc4_hdmi.c
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
@@ -1377,7 +1377,9 @@ static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data)
if (ret)
goto err_destroy_encoder;

- vc4_debugfs_add_file(drm, "hdmi_regs", vc4_hdmi_debugfs_regs, vc4_hdmi);
+ vc4_debugfs_add_file(drm, variant->debugfs_name,
+ vc4_hdmi_debugfs_regs,
+ vc4_hdmi);

return 0;

@@ -1439,6 +1441,7 @@ static int vc4_hdmi_dev_remove(struct platform_device *pdev)

static const struct vc4_hdmi_variant bcm2835_variant = {
.encoder_type = VC4_ENCODER_TYPE_HDMI0,
+ .debugfs_name = "hdmi_regs",
.registers = vc4_hdmi_fields,
.num_registers = ARRAY_SIZE(vc4_hdmi_fields),

diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.h b/drivers/gpu/drm/vc4/vc4_hdmi.h
index 4240c5ea7fde..22100820c81b 100644
--- a/drivers/gpu/drm/vc4/vc4_hdmi.h
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.h
@@ -30,6 +30,9 @@ struct vc4_hdmi_variant {
/* Encoder Type for that controller */
enum vc4_encoder_type encoder_type;

+ /* Filename to expose the registers in debugfs */
+ const char *debugfs_name;
+
/* List of the registers available on that variant */
const struct vc4_hdmi_register *registers;

--
git-series 0.9.1


2020-04-25 21:29:04

by Stefan Wahren

[permalink] [raw]
Subject: Re: [PATCH v2 79/91] drm/vc4: hdmi: Deal with multiple debugfs files

Hi Maxime,

Am 24.04.20 um 17:35 schrieb Maxime Ripard:
> The HDMI driver was registering a single debugfs file so far with the name
> hdmi_regs.
>
> Obviously, this is not going to work anymore when will have multiple HDMI
> controllers since we will end up trying to register two files with the same
> name.
>
> Let's use the ID to avoid that name conflict.

even with this patch there is a name conflict in debugfs using Linux
5.7-rc1. Dave Stevenson addressed this by using different card names
[1]. Since this patch won't apply anymore here is my suggestion:

diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c
index 29287ab..7209397 100644
--- a/drivers/gpu/drm/vc4/vc4_hdmi.c
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
@@ -1181,9 +1181,14 @@ static int vc4_hdmi_audio_init(struct vc4_hdmi
*vc4_hdmi)
 
     card->dai_link = dai_link;
     card->num_links = 1;
-    card->name = "vc4-hdmi";
     card->dev = dev;
 
+    if (vc4_hdmi->variant->encoder_type == VC4_ENCODER_TYPE_HDMI1) {
+        card->name = "vc4-hdmi1";
+    } else {
+        card->name = "vc4-hdmi";
+    }
+
     /*
      * Be careful, snd_soc_register_card() calls dev_set_drvdata() and
      * stores a pointer to the snd card object in dev->driver_data. This
--
2.7.4


[1] -
https://github.com/raspberrypi/linux/pull/3515/commits/82fe6c16811e5acc9bdbbf298db1b30f84b820d2

>
> Signed-off-by: Maxime Ripard <[email protected]>
> ---
> drivers/gpu/drm/vc4/vc4_hdmi.c | 5 ++++-
> drivers/gpu/drm/vc4/vc4_hdmi.h | 3 +++
> 2 files changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c
> index aaf96420d0ec..aae5b10a2d11 100644
> --- a/drivers/gpu/drm/vc4/vc4_hdmi.c
> +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
> @@ -1377,7 +1377,9 @@ static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data)
> if (ret)
> goto err_destroy_encoder;
>
> - vc4_debugfs_add_file(drm, "hdmi_regs", vc4_hdmi_debugfs_regs, vc4_hdmi);
> + vc4_debugfs_add_file(drm, variant->debugfs_name,
> + vc4_hdmi_debugfs_regs,
> + vc4_hdmi);
>
> return 0;
>
> @@ -1439,6 +1441,7 @@ static int vc4_hdmi_dev_remove(struct platform_device *pdev)
>
> static const struct vc4_hdmi_variant bcm2835_variant = {
> .encoder_type = VC4_ENCODER_TYPE_HDMI0,
> + .debugfs_name = "hdmi_regs",
> .registers = vc4_hdmi_fields,
> .num_registers = ARRAY_SIZE(vc4_hdmi_fields),
>
> diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.h b/drivers/gpu/drm/vc4/vc4_hdmi.h
> index 4240c5ea7fde..22100820c81b 100644
> --- a/drivers/gpu/drm/vc4/vc4_hdmi.h
> +++ b/drivers/gpu/drm/vc4/vc4_hdmi.h
> @@ -30,6 +30,9 @@ struct vc4_hdmi_variant {
> /* Encoder Type for that controller */
> enum vc4_encoder_type encoder_type;
>
> + /* Filename to expose the registers in debugfs */
> + const char *debugfs_name;
> +
> /* List of the registers available on that variant */
> const struct vc4_hdmi_register *registers;
>

2020-04-28 15:59:32

by Maxime Ripard

[permalink] [raw]
Subject: Re: [PATCH v2 79/91] drm/vc4: hdmi: Deal with multiple debugfs files

Hi Stefan,

On Sat, Apr 25, 2020 at 11:26:31PM +0200, Stefan Wahren wrote:
> Am 24.04.20 um 17:35 schrieb Maxime Ripard:
> > The HDMI driver was registering a single debugfs file so far with the name
> > hdmi_regs.
> >
> > Obviously, this is not going to work anymore when will have multiple HDMI
> > controllers since we will end up trying to register two files with the same
> > name.
> >
> > Let's use the ID to avoid that name conflict.
>
> even with this patch there is a name conflict in debugfs using Linux
> 5.7-rc1. Dave Stevenson addressed this by using different card names
> [1]. Since this patch won't apply anymore here is my suggestion:
>
> diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c
> index 29287ab..7209397 100644
> --- a/drivers/gpu/drm/vc4/vc4_hdmi.c
> +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
> @@ -1181,9 +1181,14 @@ static int vc4_hdmi_audio_init(struct vc4_hdmi
> *vc4_hdmi)
> ?
> ???? card->dai_link = dai_link;
> ???? card->num_links = 1;
> -??? card->name = "vc4-hdmi";
> ???? card->dev = dev;
> ?
> +??? if (vc4_hdmi->variant->encoder_type == VC4_ENCODER_TYPE_HDMI1) {
> +??? ??? card->name = "vc4-hdmi1";
> +??? } else {
> +??? ??? card->name = "vc4-hdmi";
> +??? }
> +

Thinking about this some more, we don't really need VC4_ENCODER_TYPE_HDMI0 and
HDMI1, and it can all work with the same encoder type for both, so I'll drop
them.

To address this issue though, we can add a card name string to the variant, like
I did for debugfs. Is that alright for you?

Maxime


Attachments:
(No filename) (1.53 kB)
signature.asc (235.00 B)
Download all attachments

2020-04-28 16:22:11

by Dave Stevenson

[permalink] [raw]
Subject: Re: [PATCH v2 79/91] drm/vc4: hdmi: Deal with multiple debugfs files

Hi Stefan and Maxime

On Tue, 28 Apr 2020 at 16:57, Maxime Ripard <[email protected]> wrote:
>
> Hi Stefan,
>
> On Sat, Apr 25, 2020 at 11:26:31PM +0200, Stefan Wahren wrote:
> > Am 24.04.20 um 17:35 schrieb Maxime Ripard:
> > > The HDMI driver was registering a single debugfs file so far with the name
> > > hdmi_regs.
> > >
> > > Obviously, this is not going to work anymore when will have multiple HDMI
> > > controllers since we will end up trying to register two files with the same
> > > name.
> > >
> > > Let's use the ID to avoid that name conflict.
> >
> > even with this patch there is a name conflict in debugfs using Linux
> > 5.7-rc1. Dave Stevenson addressed this by using different card names
> > [1]. Since this patch won't apply anymore here is my suggestion:
> >
> > diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c
> > index 29287ab..7209397 100644
> > --- a/drivers/gpu/drm/vc4/vc4_hdmi.c
> > +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
> > @@ -1181,9 +1181,14 @@ static int vc4_hdmi_audio_init(struct vc4_hdmi
> > *vc4_hdmi)
> >
> > card->dai_link = dai_link;
> > card->num_links = 1;
> > - card->name = "vc4-hdmi";
> > card->dev = dev;
> >
> > + if (vc4_hdmi->variant->encoder_type == VC4_ENCODER_TYPE_HDMI1) {
> > + card->name = "vc4-hdmi1";
> > + } else {
> > + card->name = "vc4-hdmi";
> > + }
> > +
>
> Thinking about this some more, we don't really need VC4_ENCODER_TYPE_HDMI0 and
> HDMI1, and it can all work with the same encoder type for both, so I'll drop
> them.
>
> To address this issue though, we can add a card name string to the variant, like
> I did for debugfs. Is that alright for you?

My patch doesn't fix everything with the audio debugfs entries anyway.
I'm working against 5.4 on our downstream tree, and even with my patch
I get
[ 7.459508] debugfs: Directory 'fef00700.hdmi' with parent
'vc4-hdmi' already present!
[ 7.511017] debugfs: Directory 'fef05700.hdmi' with parent
'vc4-hdmi1' already present!
I seem to recall I reduced the number of complaints over 'vc4-hdmi',
but internal to sound/soc-core the node is still registered twice.

There was discussion about this a few months back.
https://lore.kernel.org/lkml/[email protected]/
seemed to conclude that it wasn't totally trivial to solve.

Regards,
Dave