2023-06-20 10:05:09

by Sui Jingfeng

[permalink] [raw]
Subject: [PATCH v10 01/11] drm/etnaviv: Add a dedicated function to register an irq handler

From: Sui Jingfeng <[email protected]>

Because getting IRQ from a device is platform-dependent, PCI devices have
different methods for getting an IRQ. This patch is a preparation to extend
this driver for supporting the PCI devices.

Cc: Lucas Stach <[email protected]>
Cc: Christian Gmeiner <[email protected]>
Cc: Philipp Zabel <[email protected]>
Cc: Bjorn Helgaas <[email protected]>
Cc: Daniel Vetter <[email protected]>
Signed-off-by: Sui Jingfeng <[email protected]>
---
drivers/gpu/drm/etnaviv/etnaviv_gpu.c | 32 +++++++++++++++++++--------
1 file changed, 23 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
index de8c9894967c..a03e81337d8f 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
@@ -1817,6 +1817,27 @@ static const struct of_device_id etnaviv_gpu_match[] = {
};
MODULE_DEVICE_TABLE(of, etnaviv_gpu_match);

+static int etnaviv_gpu_register_irq(struct etnaviv_gpu *gpu, int irq)
+{
+ struct device *dev = gpu->dev;
+ int err;
+
+ if (irq < 0)
+ return irq;
+
+ err = devm_request_irq(dev, irq, irq_handler, 0, dev_name(dev), gpu);
+ if (err) {
+ dev_err(dev, "failed to request irq %u: %d\n", irq, err);
+ return err;
+ }
+
+ gpu->irq = irq;
+
+ dev_info(dev, "irq(%d) handler registered\n", irq);
+
+ return 0;
+}
+
static int etnaviv_gpu_platform_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
@@ -1837,16 +1858,9 @@ static int etnaviv_gpu_platform_probe(struct platform_device *pdev)
return PTR_ERR(gpu->mmio);

/* Get Interrupt: */
- gpu->irq = platform_get_irq(pdev, 0);
- if (gpu->irq < 0)
- return gpu->irq;
-
- err = devm_request_irq(&pdev->dev, gpu->irq, irq_handler, 0,
- dev_name(gpu->dev), gpu);
- if (err) {
- dev_err(dev, "failed to request IRQ%u: %d\n", gpu->irq, err);
+ err = etnaviv_gpu_register_irq(gpu, platform_get_irq(pdev, 0));
+ if (err)
return err;
- }

/* Get Clocks: */
gpu->clk_reg = devm_clk_get_optional(&pdev->dev, "reg");
--
2.25.1



2023-06-21 09:26:05

by Lucas Stach

[permalink] [raw]
Subject: Re: [PATCH v10 01/11] drm/etnaviv: Add a dedicated function to register an irq handler

Am Dienstag, dem 20.06.2023 um 17:47 +0800 schrieb Sui Jingfeng:
> From: Sui Jingfeng <[email protected]>
>
> Because getting IRQ from a device is platform-dependent, PCI devices have
> different methods for getting an IRQ. This patch is a preparation to extend
> this driver for supporting the PCI devices.
>
> Cc: Lucas Stach <[email protected]>
> Cc: Christian Gmeiner <[email protected]>
> Cc: Philipp Zabel <[email protected]>
> Cc: Bjorn Helgaas <[email protected]>
> Cc: Daniel Vetter <[email protected]>
> Signed-off-by: Sui Jingfeng <[email protected]>
> ---
> drivers/gpu/drm/etnaviv/etnaviv_gpu.c | 32 +++++++++++++++++++--------
> 1 file changed, 23 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
> index de8c9894967c..a03e81337d8f 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
> @@ -1817,6 +1817,27 @@ static const struct of_device_id etnaviv_gpu_match[] = {
> };
> MODULE_DEVICE_TABLE(of, etnaviv_gpu_match);
>
> +static int etnaviv_gpu_register_irq(struct etnaviv_gpu *gpu, int irq)
> +{
> + struct device *dev = gpu->dev;
> + int err;
> +
> + if (irq < 0)
> + return irq;
> +
> + err = devm_request_irq(dev, irq, irq_handler, 0, dev_name(dev), gpu);
> + if (err) {
> + dev_err(dev, "failed to request irq %u: %d\n", irq, err);
> + return err;
> + }
> +
> + gpu->irq = irq;
> +
> + dev_info(dev, "irq(%d) handler registered\n", irq);

There is no reason to put this into the kernel log. It's no different
than other resources to the driver and we don't log each one of those
either.

In fact I don't see any reason for this change in the first place.
Effectively you are moving a single function call into a new function,
which doesn't seem like an improvement.

Regards,
Lucas

> +
> + return 0;
> +}
> +
> static int etnaviv_gpu_platform_probe(struct platform_device *pdev)
> {
> struct device *dev = &pdev->dev;
> @@ -1837,16 +1858,9 @@ static int etnaviv_gpu_platform_probe(struct platform_device *pdev)
> return PTR_ERR(gpu->mmio);
>
> /* Get Interrupt: */
> - gpu->irq = platform_get_irq(pdev, 0);
> - if (gpu->irq < 0)
> - return gpu->irq;
> -
> - err = devm_request_irq(&pdev->dev, gpu->irq, irq_handler, 0,
> - dev_name(gpu->dev), gpu);
> - if (err) {
> - dev_err(dev, "failed to request IRQ%u: %d\n", gpu->irq, err);
> + err = etnaviv_gpu_register_irq(gpu, platform_get_irq(pdev, 0));
> + if (err)
> return err;
> - }
>
> /* Get Clocks: */
> gpu->clk_reg = devm_clk_get_optional(&pdev->dev, "reg");


2023-06-21 09:26:16

by Sui Jingfeng

[permalink] [raw]
Subject: Re: [PATCH v10 01/11] drm/etnaviv: Add a dedicated function to register an irq handler

Hi,

On 2023/6/21 17:07, Lucas Stach wrote:
> Am Dienstag, dem 20.06.2023 um 17:47 +0800 schrieb Sui Jingfeng:
>> From: Sui Jingfeng <[email protected]>
>>
>> Because getting IRQ from a device is platform-dependent, PCI devices have
>> different methods for getting an IRQ. This patch is a preparation to extend
>> this driver for supporting the PCI devices.
>>
>> Cc: Lucas Stach <[email protected]>
>> Cc: Christian Gmeiner <[email protected]>
>> Cc: Philipp Zabel <[email protected]>
>> Cc: Bjorn Helgaas <[email protected]>
>> Cc: Daniel Vetter <[email protected]>
>> Signed-off-by: Sui Jingfeng <[email protected]>
>> ---
>> drivers/gpu/drm/etnaviv/etnaviv_gpu.c | 32 +++++++++++++++++++--------
>> 1 file changed, 23 insertions(+), 9 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
>> index de8c9894967c..a03e81337d8f 100644
>> --- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
>> +++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
>> @@ -1817,6 +1817,27 @@ static const struct of_device_id etnaviv_gpu_match[] = {
>> };
>> MODULE_DEVICE_TABLE(of, etnaviv_gpu_match);
>>
>> +static int etnaviv_gpu_register_irq(struct etnaviv_gpu *gpu, int irq)
>> +{
>> + struct device *dev = gpu->dev;
>> + int err;
>> +
>> + if (irq < 0)
>> + return irq;
>> +
>> + err = devm_request_irq(dev, irq, irq_handler, 0, dev_name(dev), gpu);
>> + if (err) {
>> + dev_err(dev, "failed to request irq %u: %d\n", irq, err);
>> + return err;
>> + }
>> +
>> + gpu->irq = irq;
>> +
>> + dev_info(dev, "irq(%d) handler registered\n", irq);
> There is no reason to put this into the kernel log.

I want to see the IRQ of the device when debugging,

etnaviv actually print very less.

This serve as a minimal signal  to us the etnaviv_gpu_register_irq()
function is successful at driver load time.

> It's no different
> than other resources to the driver and we don't log each one of those
> either.
>
> In fact I don't see any reason for this change in the first place.
> Effectively you are moving a single function call into a new function,
> which doesn't seem like an improvement.

This is to make the patch easy to review, each patch is only introduce a
small function,

which is paving the way for we introducing the PCI device driver.

Otherwise when we introducing the PCI device driver, the patch is looks
ugly,

It is difficult to review.

> Regards,
> Lucas
>
>> +
>> + return 0;
>> +}
>> +
>> static int etnaviv_gpu_platform_probe(struct platform_device *pdev)
>> {
>> struct device *dev = &pdev->dev;
>> @@ -1837,16 +1858,9 @@ static int etnaviv_gpu_platform_probe(struct platform_device *pdev)
>> return PTR_ERR(gpu->mmio);
>>
>> /* Get Interrupt: */
>> - gpu->irq = platform_get_irq(pdev, 0);
>> - if (gpu->irq < 0)
>> - return gpu->irq;
>> -
>> - err = devm_request_irq(&pdev->dev, gpu->irq, irq_handler, 0,
>> - dev_name(gpu->dev), gpu);
>> - if (err) {
>> - dev_err(dev, "failed to request IRQ%u: %d\n", gpu->irq, err);
>> + err = etnaviv_gpu_register_irq(gpu, platform_get_irq(pdev, 0));
>> + if (err)
>> return err;
>> - }
>>
>> /* Get Clocks: */
>> gpu->clk_reg = devm_clk_get_optional(&pdev->dev, "reg");

--
Jingfeng


2023-06-21 09:48:18

by Sui Jingfeng

[permalink] [raw]
Subject: Re: [PATCH v10 01/11] drm/etnaviv: Add a dedicated function to register an irq handler

Hi,

On 2023/6/21 17:07, Lucas Stach wrote:
> Am Dienstag, dem 20.06.2023 um 17:47 +0800 schrieb Sui Jingfeng:
>> From: Sui Jingfeng <[email protected]>
>>
>> Because getting IRQ from a device is platform-dependent, PCI devices have
>> different methods for getting an IRQ. This patch is a preparation to extend
>> this driver for supporting the PCI devices.
>>
>> Cc: Lucas Stach <[email protected]>
>> Cc: Christian Gmeiner <[email protected]>
>> Cc: Philipp Zabel <[email protected]>
>> Cc: Bjorn Helgaas <[email protected]>
>> Cc: Daniel Vetter <[email protected]>
>> Signed-off-by: Sui Jingfeng <[email protected]>
>> ---
>> drivers/gpu/drm/etnaviv/etnaviv_gpu.c | 32 +++++++++++++++++++--------
>> 1 file changed, 23 insertions(+), 9 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
>> index de8c9894967c..a03e81337d8f 100644
>> --- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
>> +++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
>> @@ -1817,6 +1817,27 @@ static const struct of_device_id etnaviv_gpu_match[] = {
>> };
>> MODULE_DEVICE_TABLE(of, etnaviv_gpu_match);
>>
>> +static int etnaviv_gpu_register_irq(struct etnaviv_gpu *gpu, int irq)
>> +{
>> + struct device *dev = gpu->dev;
>> + int err;
>> +
>> + if (irq < 0)
>> + return irq;
>> +
>> + err = devm_request_irq(dev, irq, irq_handler, 0, dev_name(dev), gpu);
>> + if (err) {
>> + dev_err(dev, "failed to request irq %u: %d\n", irq, err);
>> + return err;
>> + }
>> +
>> + gpu->irq = irq;
>> +
>> + dev_info(dev, "irq(%d) handler registered\n", irq);
> There is no reason to put this into the kernel log. It's no different
> than other resources to the driver and we don't log each one of those
> either.
>
> In fact I don't see any reason for this change in the first place.
> Effectively you are moving a single function call into a new function,
> which doesn't seem like an improvement.

Hi, another reason is that we observed that

It(register irq) has no relationship to rest of the
etnaviv_gpu_driver_create() funciton,

so it should be stand alone.

After stand alone, it is not platform-dependent any more,

it can be shared by both the PCI device driver and the platform device
driver.


So, this is what I'm thinking when I create this function.

> Regards,
> Lucas
>
>> +
>> + return 0;
>> +}
>> +
>> static int etnaviv_gpu_platform_probe(struct platform_device *pdev)
>> {
>> struct device *dev = &pdev->dev;
>> @@ -1837,16 +1858,9 @@ static int etnaviv_gpu_platform_probe(struct platform_device *pdev)
>> return PTR_ERR(gpu->mmio);
>>
>> /* Get Interrupt: */
>> - gpu->irq = platform_get_irq(pdev, 0);
>> - if (gpu->irq < 0)
>> - return gpu->irq;
>> -
>> - err = devm_request_irq(&pdev->dev, gpu->irq, irq_handler, 0,
>> - dev_name(gpu->dev), gpu);
>> - if (err) {
>> - dev_err(dev, "failed to request IRQ%u: %d\n", gpu->irq, err);
>> + err = etnaviv_gpu_register_irq(gpu, platform_get_irq(pdev, 0));
>> + if (err)
>> return err;
>> - }
>>
>> /* Get Clocks: */
>> gpu->clk_reg = devm_clk_get_optional(&pdev->dev, "reg");

--
Jingfeng


2023-06-21 10:29:03

by Lucas Stach

[permalink] [raw]
Subject: Re: [PATCH v10 01/11] drm/etnaviv: Add a dedicated function to register an irq handler

Am Mittwoch, dem 21.06.2023 um 17:20 +0800 schrieb Sui Jingfeng:
> Hi,
>
> On 2023/6/21 17:07, Lucas Stach wrote:
> > Am Dienstag, dem 20.06.2023 um 17:47 +0800 schrieb Sui Jingfeng:
> > > From: Sui Jingfeng <[email protected]>
> > >
> > > Because getting IRQ from a device is platform-dependent, PCI devices have
> > > different methods for getting an IRQ. This patch is a preparation to extend
> > > this driver for supporting the PCI devices.
> > >
> > > Cc: Lucas Stach <[email protected]>
> > > Cc: Christian Gmeiner <[email protected]>
> > > Cc: Philipp Zabel <[email protected]>
> > > Cc: Bjorn Helgaas <[email protected]>
> > > Cc: Daniel Vetter <[email protected]>
> > > Signed-off-by: Sui Jingfeng <[email protected]>
> > > ---
> > > drivers/gpu/drm/etnaviv/etnaviv_gpu.c | 32 +++++++++++++++++++--------
> > > 1 file changed, 23 insertions(+), 9 deletions(-)
> > >
> > > diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
> > > index de8c9894967c..a03e81337d8f 100644
> > > --- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
> > > +++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
> > > @@ -1817,6 +1817,27 @@ static const struct of_device_id etnaviv_gpu_match[] = {
> > > };
> > > MODULE_DEVICE_TABLE(of, etnaviv_gpu_match);
> > >
> > > +static int etnaviv_gpu_register_irq(struct etnaviv_gpu *gpu, int irq)
> > > +{
> > > + struct device *dev = gpu->dev;
> > > + int err;
> > > +
> > > + if (irq < 0)
> > > + return irq;
> > > +
> > > + err = devm_request_irq(dev, irq, irq_handler, 0, dev_name(dev), gpu);
> > > + if (err) {
> > > + dev_err(dev, "failed to request irq %u: %d\n", irq, err);
> > > + return err;
> > > + }
> > > +
> > > + gpu->irq = irq;
> > > +
> > > + dev_info(dev, "irq(%d) handler registered\n", irq);
> > There is no reason to put this into the kernel log.
>
> I want to see the IRQ of the device when debugging,
>
> etnaviv actually print very less.
>
> This serve as a minimal signal  to us the etnaviv_gpu_register_irq()
> function is successful at driver load time.
>
And debugging is a very different use-case than normal operation. If
it's needed at all, downgrade this to dev_dbg. This isn't interesting
information for a ordinary user of a system.

> > It's no different
> > than other resources to the driver and we don't log each one of those
> > either.
> >
> > In fact I don't see any reason for this change in the first place.
> > Effectively you are moving a single function call into a new function,
> > which doesn't seem like an improvement.
>
> This is to make the patch easy to review, each patch is only introduce a
> small function,
>
What I'm saying is that I don't see the need to introduce this function
at all. All you need to do is move platform_get_irq out into the
platform device code path. The devm_request_irq can stay where it is,
as the only difference between platform and PCI device is how the irq
number is retrieved from the platform.

Regards,
Lucas

> which is paving the way for we introducing the PCI device driver.
>
> Otherwise when we introducing the PCI device driver, the patch is looks
> ugly,
>
> It is difficult to review.
>
> > Regards,
> > Lucas
> >
> > > +
> > > + return 0;
> > > +}
> > > +
> > > static int etnaviv_gpu_platform_probe(struct platform_device *pdev)
> > > {
> > > struct device *dev = &pdev->dev;
> > > @@ -1837,16 +1858,9 @@ static int etnaviv_gpu_platform_probe(struct platform_device *pdev)
> > > return PTR_ERR(gpu->mmio);
> > >
> > > /* Get Interrupt: */
> > > - gpu->irq = platform_get_irq(pdev, 0);
> > > - if (gpu->irq < 0)
> > > - return gpu->irq;
> > > -
> > > - err = devm_request_irq(&pdev->dev, gpu->irq, irq_handler, 0,
> > > - dev_name(gpu->dev), gpu);
> > > - if (err) {
> > > - dev_err(dev, "failed to request IRQ%u: %d\n", gpu->irq, err);
> > > + err = etnaviv_gpu_register_irq(gpu, platform_get_irq(pdev, 0));
> > > + if (err)
> > > return err;
> > > - }
> > >
> > > /* Get Clocks: */
> > > gpu->clk_reg = devm_clk_get_optional(&pdev->dev, "reg");
>


2023-06-24 16:08:15

by Sui Jingfeng

[permalink] [raw]
Subject: Re: [PATCH v10 01/11] drm/etnaviv: Add a dedicated function to register an irq handler

Hi,

On 2023/6/21 18:16, Lucas Stach wrote:
> Am Mittwoch, dem 21.06.2023 um 17:20 +0800 schrieb Sui Jingfeng:
>> Hi,
>>
>> On 2023/6/21 17:07, Lucas Stach wrote:
>>> Am Dienstag, dem 20.06.2023 um 17:47 +0800 schrieb Sui Jingfeng:
>>>> From: Sui Jingfeng <[email protected]>
>>>>
>>>> Because getting IRQ from a device is platform-dependent, PCI devices have
>>>> different methods for getting an IRQ. This patch is a preparation to extend
>>>> this driver for supporting the PCI devices.
>>>>
>>>> Cc: Lucas Stach <[email protected]>
>>>> Cc: Christian Gmeiner <[email protected]>
>>>> Cc: Philipp Zabel <[email protected]>
>>>> Cc: Bjorn Helgaas <[email protected]>
>>>> Cc: Daniel Vetter <[email protected]>
>>>> Signed-off-by: Sui Jingfeng <[email protected]>
>>>> ---
>>>> drivers/gpu/drm/etnaviv/etnaviv_gpu.c | 32 +++++++++++++++++++--------
>>>> 1 file changed, 23 insertions(+), 9 deletions(-)
>>>>
>>>> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
>>>> index de8c9894967c..a03e81337d8f 100644
>>>> --- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
>>>> +++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
>>>> @@ -1817,6 +1817,27 @@ static const struct of_device_id etnaviv_gpu_match[] = {
>>>> };
>>>> MODULE_DEVICE_TABLE(of, etnaviv_gpu_match);
>>>>
>>>> +static int etnaviv_gpu_register_irq(struct etnaviv_gpu *gpu, int irq)
>>>> +{
>>>> + struct device *dev = gpu->dev;
>>>> + int err;
>>>> +
>>>> + if (irq < 0)
>>>> + return irq;
>>>> +
>>>> + err = devm_request_irq(dev, irq, irq_handler, 0, dev_name(dev), gpu);
>>>> + if (err) {
>>>> + dev_err(dev, "failed to request irq %u: %d\n", irq, err);
>>>> + return err;
>>>> + }
>>>> +
>>>> + gpu->irq = irq;
>>>> +
>>>> + dev_info(dev, "irq(%d) handler registered\n", irq);
>>> There is no reason to put this into the kernel log.
>> I want to see the IRQ of the device when debugging,
>>
>> etnaviv actually print very less.
>>
>> This serve as a minimal signal  to us the etnaviv_gpu_register_irq()
>> function is successful at driver load time.
>>
> And debugging is a very different use-case than normal operation. If
> it's needed at all, downgrade this to dev_dbg. This isn't interesting
> information for a ordinary user of a system.
>
>>> It's no different
>>> than other resources to the driver and we don't log each one of those
>>> either.
>>>
>>> In fact I don't see any reason for this change in the first place.
>>> Effectively you are moving a single function call into a new function,
>>> which doesn't seem like an improvement.
>> This is to make the patch easy to review, each patch is only introduce a
>> small function,
>>
> What I'm saying is that I don't see the need to introduce this function
> at all. All you need to do is move platform_get_irq out into the
> platform device code path. The devm_request_irq can stay where it is,
> as the only difference between platform and PCI device is how the irq
> number is retrieved from the platform.

Yes, you are right. I understand what are asking, but my point is:


This patch is paving the way for us to introduce the PCI device driver.

All of the patches before the patch
v10-0006-drm-etnaviv-Add-driver-support-for-the-PCI-devic.patch

are actually doing the preparation.


Look at the patch 0006, I achieve the goal by 128 insertions and 7
deletions.

while the only 7 deletions are actually for code shading(convert the
static function to global function).

There is No large area diff and NO distortion.

The goal is adding a PCI device driver on the top of what we already have.


Before the cleanup, the etnaviv_gpu_platform_probe() function is just
like is a *glue*.

Originally,  it integrate a lot of irrelevant part together.


1.  Mapping MMIO registers make it platform-dependent;

2.  Calling platform_get_irq(pdev, 0) make it platform-dependent;

3.  Getting Clocks by calling devm_clk_get() make it platform-dependent;

4.  Calling component_add() make it subsytem and framework-dependent;


All of above list item is deny us to introduce the PCI device driver
wrapper.

It(sub-functional code) is not relevant to each other.

Hence the first five patch is actually do the clean,

for the clarify(and tidy and good looking) of the patch 6.


I will drop the printing, but keep the cleanup function there,

Is this acceptable?


> Regards,
> Lucas
>
>> which is paving the way for we introducing the PCI device driver.
>>
>> Otherwise when we introducing the PCI device driver, the patch is looks
>> ugly,
>>
>> It is difficult to review.
>>
>>> Regards,
>>> Lucas
>>>
>>>> +
>>>> + return 0;
>>>> +}
>>>> +
>>>> static int etnaviv_gpu_platform_probe(struct platform_device *pdev)
>>>> {
>>>> struct device *dev = &pdev->dev;
>>>> @@ -1837,16 +1858,9 @@ static int etnaviv_gpu_platform_probe(struct platform_device *pdev)
>>>> return PTR_ERR(gpu->mmio);
>>>>
>>>> /* Get Interrupt: */
>>>> - gpu->irq = platform_get_irq(pdev, 0);
>>>> - if (gpu->irq < 0)
>>>> - return gpu->irq;
>>>> -
>>>> - err = devm_request_irq(&pdev->dev, gpu->irq, irq_handler, 0,
>>>> - dev_name(gpu->dev), gpu);
>>>> - if (err) {
>>>> - dev_err(dev, "failed to request IRQ%u: %d\n", gpu->irq, err);
>>>> + err = etnaviv_gpu_register_irq(gpu, platform_get_irq(pdev, 0));
>>>> + if (err)
>>>> return err;
>>>> - }
>>>>
>>>> /* Get Clocks: */
>>>> gpu->clk_reg = devm_clk_get_optional(&pdev->dev, "reg");

--
Jingfeng


2023-06-26 11:24:31

by Lucas Stach

[permalink] [raw]
Subject: Re: [PATCH v10 01/11] drm/etnaviv: Add a dedicated function to register an irq handler

Am Samstag, dem 24.06.2023 um 23:53 +0800 schrieb Sui Jingfeng:
> Hi,
>
> On 2023/6/21 18:16, Lucas Stach wrote:
> > Am Mittwoch, dem 21.06.2023 um 17:20 +0800 schrieb Sui Jingfeng:
> > > Hi,
> > >
> > > On 2023/6/21 17:07, Lucas Stach wrote:
> > > > Am Dienstag, dem 20.06.2023 um 17:47 +0800 schrieb Sui Jingfeng:
> > > > > From: Sui Jingfeng <[email protected]>
> > > > >
> > > > > Because getting IRQ from a device is platform-dependent, PCI devices have
> > > > > different methods for getting an IRQ. This patch is a preparation to extend
> > > > > this driver for supporting the PCI devices.
> > > > >
> > > > > Cc: Lucas Stach <[email protected]>
> > > > > Cc: Christian Gmeiner <[email protected]>
> > > > > Cc: Philipp Zabel <[email protected]>
> > > > > Cc: Bjorn Helgaas <[email protected]>
> > > > > Cc: Daniel Vetter <[email protected]>
> > > > > Signed-off-by: Sui Jingfeng <[email protected]>
> > > > > ---
> > > > > drivers/gpu/drm/etnaviv/etnaviv_gpu.c | 32 +++++++++++++++++++--------
> > > > > 1 file changed, 23 insertions(+), 9 deletions(-)
> > > > >
> > > > > diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
> > > > > index de8c9894967c..a03e81337d8f 100644
> > > > > --- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
> > > > > +++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
> > > > > @@ -1817,6 +1817,27 @@ static const struct of_device_id etnaviv_gpu_match[] = {
> > > > > };
> > > > > MODULE_DEVICE_TABLE(of, etnaviv_gpu_match);
> > > > >
> > > > > +static int etnaviv_gpu_register_irq(struct etnaviv_gpu *gpu, int irq)
> > > > > +{
> > > > > + struct device *dev = gpu->dev;
> > > > > + int err;
> > > > > +
> > > > > + if (irq < 0)
> > > > > + return irq;
> > > > > +
> > > > > + err = devm_request_irq(dev, irq, irq_handler, 0, dev_name(dev), gpu);
> > > > > + if (err) {
> > > > > + dev_err(dev, "failed to request irq %u: %d\n", irq, err);
> > > > > + return err;
> > > > > + }
> > > > > +
> > > > > + gpu->irq = irq;
> > > > > +
> > > > > + dev_info(dev, "irq(%d) handler registered\n", irq);
> > > > There is no reason to put this into the kernel log.
> > > I want to see the IRQ of the device when debugging,
> > >
> > > etnaviv actually print very less.
> > >
> > > This serve as a minimal signal  to us the etnaviv_gpu_register_irq()
> > > function is successful at driver load time.
> > >
> > And debugging is a very different use-case than normal operation. If
> > it's needed at all, downgrade this to dev_dbg. This isn't interesting
> > information for a ordinary user of a system.
> >
> > > > It's no different
> > > > than other resources to the driver and we don't log each one of those
> > > > either.
> > > >
> > > > In fact I don't see any reason for this change in the first place.
> > > > Effectively you are moving a single function call into a new function,
> > > > which doesn't seem like an improvement.
> > > This is to make the patch easy to review, each patch is only introduce a
> > > small function,
> > >
> > What I'm saying is that I don't see the need to introduce this function
> > at all. All you need to do is move platform_get_irq out into the
> > platform device code path. The devm_request_irq can stay where it is,
> > as the only difference between platform and PCI device is how the irq
> > number is retrieved from the platform.
>
> Yes, you are right. I understand what are asking, but my point is:
>
>
> This patch is paving the way for us to introduce the PCI device driver.
>
> All of the patches before the patch
> v10-0006-drm-etnaviv-Add-driver-support-for-the-PCI-devic.patch
>
> are actually doing the preparation.
>
>
> Look at the patch 0006, I achieve the goal by 128 insertions and 7
> deletions.
>
> while the only 7 deletions are actually for code shading(convert the
> static function to global function).
>
> There is No large area diff and NO distortion.
>
> The goal is adding a PCI device driver on the top of what we already have.
>
>
> Before the cleanup, the etnaviv_gpu_platform_probe() function is just
> like is a *glue*.
>
> Originally,  it integrate a lot of irrelevant part together.
>
>
> 1.  Mapping MMIO registers make it platform-dependent;
>
> 2.  Calling platform_get_irq(pdev, 0) make it platform-dependent;
>
I get that and I'm fine with moving this out of this function. But
that's not what you are actually doing in this patch. You are moving
devm_request_irq out of this function, which isn't necessary, since the
request IRQ is not platform dependent. It's the retrieval of the IRQ
number to request (platform_get_irq/pdev->irq) which is platform
dependent.

Regards,
Lucas

> 3.  Getting Clocks by calling devm_clk_get() make it platform-dependent;
>
> 4.  Calling component_add() make it subsytem and framework-dependent;
>
>
> All of above list item is deny us to introduce the PCI device driver
> wrapper.
>
> It(sub-functional code) is not relevant to each other.
>
> Hence the first five patch is actually do the clean,
>
> for the clarify(and tidy and good looking) of the patch 6.
>
>
> I will drop the printing, but keep the cleanup function there,
>
> Is this acceptable?
>
>
> > Regards,
> > Lucas
> >
> > > which is paving the way for we introducing the PCI device driver.
> > >
> > > Otherwise when we introducing the PCI device driver, the patch is looks
> > > ugly,
> > >
> > > It is difficult to review.
> > >
> > > > Regards,
> > > > Lucas
> > > >
> > > > > +
> > > > > + return 0;
> > > > > +}
> > > > > +
> > > > > static int etnaviv_gpu_platform_probe(struct platform_device *pdev)
> > > > > {
> > > > > struct device *dev = &pdev->dev;
> > > > > @@ -1837,16 +1858,9 @@ static int etnaviv_gpu_platform_probe(struct platform_device *pdev)
> > > > > return PTR_ERR(gpu->mmio);
> > > > >
> > > > > /* Get Interrupt: */
> > > > > - gpu->irq = platform_get_irq(pdev, 0);
> > > > > - if (gpu->irq < 0)
> > > > > - return gpu->irq;
> > > > > -
> > > > > - err = devm_request_irq(&pdev->dev, gpu->irq, irq_handler, 0,
> > > > > - dev_name(gpu->dev), gpu);
> > > > > - if (err) {
> > > > > - dev_err(dev, "failed to request IRQ%u: %d\n", gpu->irq, err);
> > > > > + err = etnaviv_gpu_register_irq(gpu, platform_get_irq(pdev, 0));
> > > > > + if (err)
> > > > > return err;
> > > > > - }
> > > > >
> > > > > /* Get Clocks: */
> > > > > gpu->clk_reg = devm_clk_get_optional(&pdev->dev, "reg");
>