mbox series

[v7,0/4] Introduce PRU platform consumer API

Message ID 20230404115336.599430-1-danishanwar@ti.com
Headers show
Series Introduce PRU platform consumer API | expand

Message

MD Danish Anwar April 4, 2023, 11:53 a.m. UTC
Hi All,
The Programmable Real-Time Unit and Industrial Communication Subsystem (PRU-ICSS
or simply PRUSS) on various TI SoCs consists of dual 32-bit RISC cores
(Programmable Real-Time Units, or PRUs) for program execution.

There are 3 foundation components for TI PRUSS subsystem: the PRUSS platform
driver, the PRUSS INTC driver and the PRUSS remoteproc driver. All of them have
already been merged and can be found under:
1) drivers/soc/ti/pruss.c
   Documentation/devicetree/bindings/soc/ti/ti,pruss.yaml
2) drivers/irqchip/irq-pruss-intc.c
   Documentation/devicetree/bindings/interrupt-controller/ti,pruss-intc.yaml
3) drivers/remoteproc/pru_rproc.c
   Documentation/devicetree/bindings/remoteproc/ti,pru-consumer.yaml

The programmable nature of the PRUs provide flexibility to implement custom
peripheral interfaces, fast real-time responses, or specialized data handling.
Example of a PRU consumer drivers will be: 
  - Software UART over PRUSS
  - PRU-ICSS Ethernet EMAC

In order to make usage of common PRU resources and allow the consumer drivers 
to configure the PRU hardware for specific usage the PRU API is introduced.

This is the v7 of the old patch series [9].

Changes from v6 [9] to v7:
*) Addressed Simon's comment on patch 3 of this series and dropped unnecassary
macros from the patch.

Changes from v5 [1] to v6:
*) Added Reviewed by tags of Roger and Tony to the patches.
*) Added Acked by tag of Mathieu to patch 2 of this series.
*) Added NULL check for @mux in pruss_cfg_get_gpmux() API.
*) Added comment to the pruss_get() function documentation mentioning it is
expected the caller will have done a pru_rproc_get() on @rproc.
*) Fixed compilation warning "warning: ‘pruss_cfg_update’ defined but not used"
in patch 3 by squashing patch 3 [7] and patch 5 [8] of previous revision
together. Squashed patch 5 instead of patch 4 with patch 3 because patch 5 uses
both read() and update() APIs where as patch 4 only uses update() API.
Previously pruss_cfg_read()/update() APIs were intoroduced in patch 3
and used in patch 4 and 5. Now these APIs are introduced as well as used in 
patch 3.

Changes from v4 [2] to v5:
*) Addressed Roger's comment to change function argument in API 
pruss_cfg_xfr_enable(). Instead of asking user to calcualte mask, now user
will just provide the pru_type and mask will be calcualted inside the API.
*) Moved enum pru_type from pru_rproc.c to include/linux/remoteproc/pruss.h
in patch 4 / 5.
*) Moved enum pruss_gpi_mode from patch 3/5 to patch 4/5 to introduce this
enum in same patch as the API using it.
*) Moved enum pruss_gp_mux_sel from patch 3/5 to patch 5/5 to introduce this
enum in same patch as the API using it.
*) Created new headefile drivers/soc/ti/pruss.h, private to PRUSS as asked by
Roger. Moved all private definitions and pruss_cfg_read () / update ()
APIs to this newly added headerfile.
*) Renamed include/linux/pruss_driver.h to include/linux/pruss_internal.h as
suggested by Andrew and Roger.

Changes from v3 [3] to v4:
*) Added my SoB tags in all patches as earlier SoB tags were missing in few
patches.
*) Added Roger's RB tags in 3 patches.
*) Addressed Roger's comment in patch 4/5 of this series. Added check for 
   invalid GPI mode in pruss_cfg_gpimode() API.
*) Removed patch [4] from this series as that patch is no longer required.
*) Made pruss_cfg_read() and pruss_cfg_update() APIs internal to pruss.c by
   removing EXPORT_SYMBOL_GPL and making them static. Now these APIs are 
   internal to pruss.c and PRUSS CFG space is not exposed.
*) Moved APIs pruss_cfg_gpimode(), pruss_cfg_miirt_enable(), 
   pruss_cfg_xfr_enable(), pruss_cfg_get_gpmux(), pruss_cfg_set_gpmux() to
   pruss.c file as they are using APIs pruss_cfg_read / update. 
   Defined these APIs in pruss.h file as other drivers use these APIs to 
   perform respective operations.

Changes from v2 to v3:
*) No functional changes, the old series has been rebased on linux-next (tag:
next-20230306).

This series depends on another series which is already merged in the remoteproc
tree [5] and is part of v6.3-rc1. This series and the remoteproc series form 
the PRUSS consumer API which can be used by consumer drivers to utilize the 
PRUs.

One example of the consumer driver is the PRU-ICSSG ethernet driver [6],which 
depends on this series and the remoteproc series [5].

[1] https://lore.kernel.org/all/20230323062451.2925996-1-danishanwar@ti.com/
[2] https://lore.kernel.org/all/20230313111127.1229187-1-danishanwar@ti.com/
[3] https://lore.kernel.org/all/20230306110934.2736465-1-danishanwar@ti.com/
[4] https://lore.kernel.org/all/20230306110934.2736465-6-danishanwar@ti.com/
[5] https://lore.kernel.org/all/20230106121046.886863-1-danishanwar@ti.com/#t
[6] https://lore.kernel.org/all/20230210114957.2667963-1-danishanwar@ti.com/
[7] https://lore.kernel.org/all/20230323062451.2925996-4-danishanwar@ti.com/
[8] https://lore.kernel.org/all/20230323062451.2925996-6-danishanwar@ti.com/
[9] https://lore.kernel.org/all/20230331112941.823410-1-danishanwar@ti.com/

Thanks and Regards,
Md Danish Anwar

Andrew F. Davis (1):
  soc: ti: pruss: Add pruss_{request,release}_mem_region() API

Suman Anna (2):
  soc: ti: pruss: Add pruss_cfg_read()/update(),
    pruss_cfg_get_gpmux()/set_gpmux() APIs
  soc: ti: pruss: Add helper functions to set GPI mode, MII_RT_event and
    XFR

Tero Kristo (1):
  soc: ti: pruss: Add pruss_get()/put() API

 drivers/remoteproc/pru_rproc.c                |  17 +-
 drivers/soc/ti/pruss.c                        | 260 +++++++++++++++++-
 drivers/soc/ti/pruss.h                        |  88 ++++++
 .../{pruss_driver.h => pruss_internal.h}      |  34 +--
 include/linux/remoteproc/pruss.h              | 141 ++++++++++
 5 files changed, 498 insertions(+), 42 deletions(-)
 create mode 100644 drivers/soc/ti/pruss.h
 rename include/linux/{pruss_driver.h => pruss_internal.h} (58%)

Comments

Anwar, Md Danish April 6, 2023, 6:54 a.m. UTC | #1
On 04/04/23 17:23, MD Danish Anwar wrote:
> Hi All,
> The Programmable Real-Time Unit and Industrial Communication Subsystem (PRU-ICSS
> or simply PRUSS) on various TI SoCs consists of dual 32-bit RISC cores
> (Programmable Real-Time Units, or PRUs) for program execution.
> 
> There are 3 foundation components for TI PRUSS subsystem: the PRUSS platform
> driver, the PRUSS INTC driver and the PRUSS remoteproc driver. All of them have
> already been merged and can be found under:
> 1) drivers/soc/ti/pruss.c
>    Documentation/devicetree/bindings/soc/ti/ti,pruss.yaml
> 2) drivers/irqchip/irq-pruss-intc.c
>    Documentation/devicetree/bindings/interrupt-controller/ti,pruss-intc.yaml
> 3) drivers/remoteproc/pru_rproc.c
>    Documentation/devicetree/bindings/remoteproc/ti,pru-consumer.yaml
> 
> The programmable nature of the PRUs provide flexibility to implement custom
> peripheral interfaces, fast real-time responses, or specialized data handling.
> Example of a PRU consumer drivers will be: 
>   - Software UART over PRUSS
>   - PRU-ICSS Ethernet EMAC
> 
> In order to make usage of common PRU resources and allow the consumer drivers 
> to configure the PRU hardware for specific usage the PRU API is introduced.
> 
> This is the v7 of the old patch series [9].
> 

Hi Mathieu, Can you please review this series. I have addressed comments made
by you in v5. I have also addressed Simon's comment in v6 and removed redundant
macros from pruss.h header file.

> Changes from v6 [9] to v7:
> *) Addressed Simon's comment on patch 3 of this series and dropped unnecassary
> macros from the patch.
> 
> Changes from v5 [1] to v6:
> *) Added Reviewed by tags of Roger and Tony to the patches.
> *) Added Acked by tag of Mathieu to patch 2 of this series.
> *) Added NULL check for @mux in pruss_cfg_get_gpmux() API.
> *) Added comment to the pruss_get() function documentation mentioning it is
> expected the caller will have done a pru_rproc_get() on @rproc.
> *) Fixed compilation warning "warning: ‘pruss_cfg_update’ defined but not used"
> in patch 3 by squashing patch 3 [7] and patch 5 [8] of previous revision
> together. Squashed patch 5 instead of patch 4 with patch 3 because patch 5 uses
> both read() and update() APIs where as patch 4 only uses update() API.
> Previously pruss_cfg_read()/update() APIs were intoroduced in patch 3
> and used in patch 4 and 5. Now these APIs are introduced as well as used in 
> patch 3.
>
Mathieu Poirier April 6, 2023, 1:15 p.m. UTC | #2
On Thu, 6 Apr 2023 at 00:54, Md Danish Anwar <a0501179@ti.com> wrote:
>
> On 04/04/23 17:23, MD Danish Anwar wrote:
> > Hi All,
> > The Programmable Real-Time Unit and Industrial Communication Subsystem (PRU-ICSS
> > or simply PRUSS) on various TI SoCs consists of dual 32-bit RISC cores
> > (Programmable Real-Time Units, or PRUs) for program execution.
> >
> > There are 3 foundation components for TI PRUSS subsystem: the PRUSS platform
> > driver, the PRUSS INTC driver and the PRUSS remoteproc driver. All of them have
> > already been merged and can be found under:
> > 1) drivers/soc/ti/pruss.c
> >    Documentation/devicetree/bindings/soc/ti/ti,pruss.yaml
> > 2) drivers/irqchip/irq-pruss-intc.c
> >    Documentation/devicetree/bindings/interrupt-controller/ti,pruss-intc.yaml
> > 3) drivers/remoteproc/pru_rproc.c
> >    Documentation/devicetree/bindings/remoteproc/ti,pru-consumer.yaml
> >
> > The programmable nature of the PRUs provide flexibility to implement custom
> > peripheral interfaces, fast real-time responses, or specialized data handling.
> > Example of a PRU consumer drivers will be:
> >   - Software UART over PRUSS
> >   - PRU-ICSS Ethernet EMAC
> >
> > In order to make usage of common PRU resources and allow the consumer drivers
> > to configure the PRU hardware for specific usage the PRU API is introduced.
> >
> > This is the v7 of the old patch series [9].
> >
>
> Hi Mathieu, Can you please review this series. I have addressed comments made
> by you in v5. I have also addressed Simon's comment in v6 and removed redundant
> macros from pruss.h header file.
>

You are pushing me to review your code 19 hours after sending the last
revision?  Are you serious?

> > Changes from v6 [9] to v7:
> > *) Addressed Simon's comment on patch 3 of this series and dropped unnecassary
> > macros from the patch.
> >
> > Changes from v5 [1] to v6:
> > *) Added Reviewed by tags of Roger and Tony to the patches.
> > *) Added Acked by tag of Mathieu to patch 2 of this series.
> > *) Added NULL check for @mux in pruss_cfg_get_gpmux() API.
> > *) Added comment to the pruss_get() function documentation mentioning it is
> > expected the caller will have done a pru_rproc_get() on @rproc.
> > *) Fixed compilation warning "warning: ‘pruss_cfg_update’ defined but not used"
> > in patch 3 by squashing patch 3 [7] and patch 5 [8] of previous revision
> > together. Squashed patch 5 instead of patch 4 with patch 3 because patch 5 uses
> > both read() and update() APIs where as patch 4 only uses update() API.
> > Previously pruss_cfg_read()/update() APIs were intoroduced in patch 3
> > and used in patch 4 and 5. Now these APIs are introduced as well as used in
> > patch 3.
> >
>
>
> --
> Thanks and Regards,
> Danish.
Anwar, Md Danish April 10, 2023, 4:47 a.m. UTC | #3
On 06/04/23 18:45, Mathieu Poirier wrote:
> On Thu, 6 Apr 2023 at 00:54, Md Danish Anwar <a0501179@ti.com> wrote:
>>
>> On 04/04/23 17:23, MD Danish Anwar wrote:
>>> Hi All,
>>> The Programmable Real-Time Unit and Industrial Communication Subsystem (PRU-ICSS
>>> or simply PRUSS) on various TI SoCs consists of dual 32-bit RISC cores
>>> (Programmable Real-Time Units, or PRUs) for program execution.
>>>
>>> There are 3 foundation components for TI PRUSS subsystem: the PRUSS platform
>>> driver, the PRUSS INTC driver and the PRUSS remoteproc driver. All of them have
>>> already been merged and can be found under:
>>> 1) drivers/soc/ti/pruss.c
>>>    Documentation/devicetree/bindings/soc/ti/ti,pruss.yaml
>>> 2) drivers/irqchip/irq-pruss-intc.c
>>>    Documentation/devicetree/bindings/interrupt-controller/ti,pruss-intc.yaml
>>> 3) drivers/remoteproc/pru_rproc.c
>>>    Documentation/devicetree/bindings/remoteproc/ti,pru-consumer.yaml
>>>
>>> The programmable nature of the PRUs provide flexibility to implement custom
>>> peripheral interfaces, fast real-time responses, or specialized data handling.
>>> Example of a PRU consumer drivers will be:
>>>   - Software UART over PRUSS
>>>   - PRU-ICSS Ethernet EMAC
>>>
>>> In order to make usage of common PRU resources and allow the consumer drivers
>>> to configure the PRU hardware for specific usage the PRU API is introduced.
>>>
>>> This is the v7 of the old patch series [9].
>>>
>>
>> Hi Mathieu, Can you please review this series. I have addressed comments made
>> by you in v5. I have also addressed Simon's comment in v6 and removed redundant
>> macros from pruss.h header file.
>>
> 
> You are pushing me to review your code 19 hours after sending the last
> revision?  Are you serious?
> 

I am really sorry for this. Thursday was last working day last week (as Friday
was holiday in India), so I thought I should ping you so that this series would
be reviewed by Monday. From now on I would try to keep a gap a week (or
whatever is appropriate) before pinging you for review.

I am really sorry for this again.

>>> Changes from v6 [9] to v7:
>>> *) Addressed Simon's comment on patch 3 of this series and dropped unnecassary
>>> macros from the patch.
>>>
>>> Changes from v5 [1] to v6:
>>> *) Added Reviewed by tags of Roger and Tony to the patches.
>>> *) Added Acked by tag of Mathieu to patch 2 of this series.
>>> *) Added NULL check for @mux in pruss_cfg_get_gpmux() API.
>>> *) Added comment to the pruss_get() function documentation mentioning it is
>>> expected the caller will have done a pru_rproc_get() on @rproc.
>>> *) Fixed compilation warning "warning: ‘pruss_cfg_update’ defined but not used"
>>> in patch 3 by squashing patch 3 [7] and patch 5 [8] of previous revision
>>> together. Squashed patch 5 instead of patch 4 with patch 3 because patch 5 uses
>>> both read() and update() APIs where as patch 4 only uses update() API.
>>> Previously pruss_cfg_read()/update() APIs were intoroduced in patch 3
>>> and used in patch 4 and 5. Now these APIs are introduced as well as used in
>>> patch 3.
>>>
>>
>>
>> --
>> Thanks and Regards,
>> Danish.
Simon Horman April 10, 2023, 9:37 a.m. UTC | #4
On Tue, Apr 04, 2023 at 05:23:32PM +0530, MD Danish Anwar wrote:
> Hi All,
> The Programmable Real-Time Unit and Industrial Communication Subsystem (PRU-ICSS
> or simply PRUSS) on various TI SoCs consists of dual 32-bit RISC cores
> (Programmable Real-Time Units, or PRUs) for program execution.

...

I've reviewed this series from a code style, static analysis, etc.. pov.

I'm happy that issues that I reported in earlier revisions have been
addressed. And have no outstanding issues with the patchset.

So from that position, FWIIW,

Reviewed-by: Simon Horman <simon.horman@corigine.com>