mbox series

[0/6] Add TI PRUSS platform driver

Message ID 1596020528-19510-1-git-send-email-grzegorz.jaszczyk@linaro.org (mailing list archive)
Headers show
Series Add TI PRUSS platform driver | expand

Message

Grzegorz Jaszczyk July 29, 2020, 11:02 a.m. UTC
Hi,

The Programmable Real-Time Unit and Industrial Communication Subsystem
(PRU-ICSS) is present on various TI SoCs. The IP is present on multiple TI SoC
architecture families including the OMAP architecture SoCs such as AM33xx,
AM437x and AM57xx; and on a Keystone 2 architecture based 66AK2G SoC. It is also
present on the Davinci based OMAPL138 SoCs and K3 architecture based AM65x and
J721E SoCs as well.

A PRUSS consists of dual 32-bit RISC cores (Programmable Real-Time Units, or
PRUs), shared RAM, data and instruction RAMs, some internal peripheral modules
to facilitate industrial communication, and an interrupt controller.

The programmable nature of the PRUs provide flexibility to implement custom
peripheral interfaces, fast real-time responses, or specialized data handling.
The common peripheral modules include the following,
  - an Ethernet MII_RT module with two MII ports
  - an MDIO port to control external Ethernet PHYs
  - an Industrial Ethernet Peripheral (IEP) to manage/generate Industrial
    Ethernet functions
  - an Enhanced Capture Module (eCAP)
  - an Industrial Ethernet Timer with 7/9 capture and 16 compare events
  - a 16550-compatible UART to support PROFIBUS
  - Enhanced GPIO with async capture and serial support


A typical usage scenario would be to load the application firmware into one or
more of the PRU cores, initialize one or more of the peripherals and perform I/O
through shared RAM from either a kernel driver or directly from userspace.

This series contains the PRUSS platform driver. This is the parent driver for
the entire PRUSS and is used for managing the subsystem level resources like
various memories and the CFG module.  It is responsible for the creation and
deletion of the platform devices for the child PRU devices and other child
devices (like Interrupt Controller, MDIO node and some syscon nodes) so that
they can be managed by specific platform drivers.

Grzegorz Jaszczyk (1):
  dt-bindings: soc: ti: Add TI PRUSS bindings

Suman Anna (5):
  soc: ti: pruss: Add a platform driver for PRUSS in TI SoCs
  soc: ti: pruss: Add support for PRU-ICSSs on AM437x SoCs
  soc: ti: pruss: Add support for PRU-ICSS subsystems on AM57xx SoCs
  soc: ti: pruss: Add support for PRU-ICSS subsystems on 66AK2G SoC
  soc: ti: pruss: enable support for ICSSG subsystems on K3 AM65x SoCs

 .../devicetree/bindings/soc/ti/ti,pruss.yaml       | 383 +++++++++++++++++++++
 drivers/soc/ti/Kconfig                             |  11 +
 drivers/soc/ti/Makefile                            |   1 +
 drivers/soc/ti/pruss.c                             | 183 ++++++++++
 include/linux/pruss_driver.h                       |  48 +++
 5 files changed, 626 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/soc/ti/ti,pruss.yaml
 create mode 100644 drivers/soc/ti/pruss.c
 create mode 100644 include/linux/pruss_driver.h

Comments

Pavel Machek Aug. 2, 2020, 11:53 a.m. UTC | #1
Hi!

> A typical usage scenario would be to load the application firmware into one or
> more of the PRU cores, initialize one or more of the peripherals and perform I/O
> through shared RAM from either a kernel driver or directly from userspace.
> 
> This series contains the PRUSS platform driver. This is the parent driver for
> the entire PRUSS and is used for managing the subsystem level resources like
> various memories and the CFG module.  It is responsible for the creation and
> deletion of the platform devices for the child PRU devices and other child
> devices (like Interrupt Controller, MDIO node and some syscon nodes) so that
> they can be managed by specific platform drivers.

>  drivers/soc/ti/Kconfig | 11 + drivers/soc/ti/Makefile | 1 + drivers/soc/ti/pruss.c | 

Is drivers/soc right place for that? We already have subsystem for various
programmable accelerators...


									Pavel
Pavel Machek Aug. 2, 2020, 11:57 a.m. UTC | #2
On Sun 2020-08-02 13:53:30, Pavel Machek wrote:
> Hi!
> 
> > A typical usage scenario would be to load the application firmware into one or
> > more of the PRU cores, initialize one or more of the peripherals and perform I/O
> > through shared RAM from either a kernel driver or directly from userspace.
> > 
> > This series contains the PRUSS platform driver. This is the parent driver for
> > the entire PRUSS and is used for managing the subsystem level resources like
> > various memories and the CFG module.  It is responsible for the creation and
> > deletion of the platform devices for the child PRU devices and other child
> > devices (like Interrupt Controller, MDIO node and some syscon nodes) so that
> > they can be managed by specific platform drivers.
> 
> >  drivers/soc/ti/Kconfig | 11 + drivers/soc/ti/Makefile | 1 + drivers/soc/ti/pruss.c | 
> 
> Is drivers/soc right place for that? We already have subsystem for various
> programmable accelerators...

....see drivers/remoteproc.
									Pavel
Grzegorz Jaszczyk Aug. 2, 2020, 9:41 p.m. UTC | #3
Hi

On Sun, 2 Aug 2020 at 13:57, Pavel Machek <pavel@ucw.cz> wrote:
>
> On Sun 2020-08-02 13:53:30, Pavel Machek wrote:
> > Hi!
> >
> > > A typical usage scenario would be to load the application firmware into one or
> > > more of the PRU cores, initialize one or more of the peripherals and perform I/O
> > > through shared RAM from either a kernel driver or directly from userspace.
> > >
> > > This series contains the PRUSS platform driver. This is the parent driver for
> > > the entire PRUSS and is used for managing the subsystem level resources like
> > > various memories and the CFG module.  It is responsible for the creation and
> > > deletion of the platform devices for the child PRU devices and other child
> > > devices (like Interrupt Controller, MDIO node and some syscon nodes) so that
> > > they can be managed by specific platform drivers.
> >
> > >  drivers/soc/ti/Kconfig | 11 + drivers/soc/ti/Makefile | 1 + drivers/soc/ti/pruss.c |
> >
> > Is drivers/soc right place for that? We already have subsystem for various
> > programmable accelerators...
>
> ....see drivers/remoteproc.

Yes I am aware of that and remoteproc sub-system will be used but only
for managing PRU cores (drivers/remoteproc/pru-rproc - will be
submitted soon), while this driver is the parent driver for the entire
PRUSS (used for managing the subsystem level resources like various
memories and the CFG module). This driver is also responsible for
populating all child devices (described in DT), managed by specific
(and separate) drivers: e.g.:
- PRU core will be managed by drivers/remoteproc/pru-rproc (will be
submitted next)
- PRU interrupt controller will be managed by
drivers/irqchip/irq-pruss-intc.c (it is already under review)
etc.

Best regards,
Grzegorz
Suman Anna Aug. 20, 2020, 2:43 p.m. UTC | #4
Hi Santosh, Tony,

On 7/29/20 6:02 AM, Grzegorz Jaszczyk wrote:
> Hi,
> 
> The Programmable Real-Time Unit and Industrial Communication Subsystem
> (PRU-ICSS) is present on various TI SoCs. The IP is present on multiple TI SoC
> architecture families including the OMAP architecture SoCs such as AM33xx,
> AM437x and AM57xx; and on a Keystone 2 architecture based 66AK2G SoC. It is also
> present on the Davinci based OMAPL138 SoCs and K3 architecture based AM65x and
> J721E SoCs as well.
> 
> A PRUSS consists of dual 32-bit RISC cores (Programmable Real-Time Units, or
> PRUs), shared RAM, data and instruction RAMs, some internal peripheral modules
> to facilitate industrial communication, and an interrupt controller.
> 
> The programmable nature of the PRUs provide flexibility to implement custom
> peripheral interfaces, fast real-time responses, or specialized data handling.
> The common peripheral modules include the following,
>   - an Ethernet MII_RT module with two MII ports
>   - an MDIO port to control external Ethernet PHYs
>   - an Industrial Ethernet Peripheral (IEP) to manage/generate Industrial
>     Ethernet functions
>   - an Enhanced Capture Module (eCAP)
>   - an Industrial Ethernet Timer with 7/9 capture and 16 compare events
>   - a 16550-compatible UART to support PROFIBUS
>   - Enhanced GPIO with async capture and serial support
> 
> 
> A typical usage scenario would be to load the application firmware into one or
> more of the PRU cores, initialize one or more of the peripherals and perform I/O
> through shared RAM from either a kernel driver or directly from userspace.
> 
> This series contains the PRUSS platform driver. This is the parent driver for
> the entire PRUSS and is used for managing the subsystem level resources like
> various memories and the CFG module.  It is responsible for the creation and
> deletion of the platform devices for the child PRU devices and other child
> devices (like Interrupt Controller, MDIO node and some syscon nodes) so that
> they can be managed by specific platform drivers.
> 
> Grzegorz Jaszczyk (1):
>   dt-bindings: soc: ti: Add TI PRUSS bindings
> 
> Suman Anna (5):
>   soc: ti: pruss: Add a platform driver for PRUSS in TI SoCs
>   soc: ti: pruss: Add support for PRU-ICSSs on AM437x SoCs
>   soc: ti: pruss: Add support for PRU-ICSS subsystems on AM57xx SoCs
>   soc: ti: pruss: Add support for PRU-ICSS subsystems on 66AK2G SoC
>   soc: ti: pruss: enable support for ICSSG subsystems on K3 AM65x SoCs

Do you have any comments on the driver portions of this series before Greg posts
a v2 addressing the binding comments. This is one of the foundation series
towards enabling PRUSS, and is a dependency for the PRU remoteproc driver.

regards
Suman

> 
>  .../devicetree/bindings/soc/ti/ti,pruss.yaml       | 383 +++++++++++++++++++++
>  drivers/soc/ti/Kconfig                             |  11 +
>  drivers/soc/ti/Makefile                            |   1 +
>  drivers/soc/ti/pruss.c                             | 183 ++++++++++
>  include/linux/pruss_driver.h                       |  48 +++
>  5 files changed, 626 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/soc/ti/ti,pruss.yaml
>  create mode 100644 drivers/soc/ti/pruss.c
>  create mode 100644 include/linux/pruss_driver.h
>
Santosh Shilimkar Aug. 20, 2020, 4:27 p.m. UTC | #5
On 8/20/20 7:43 AM, Suman Anna wrote:
> Hi Santosh, Tony,
> 
> On 7/29/20 6:02 AM, Grzegorz Jaszczyk wrote:
>> Hi,
>>
>> The Programmable Real-Time Unit and Industrial Communication Subsystem
>> (PRU-ICSS) is present on various TI SoCs. The IP is present on multiple TI SoC
>> architecture families including the OMAP architecture SoCs such as AM33xx,
>> AM437x and AM57xx; and on a Keystone 2 architecture based 66AK2G SoC. It is also
>> present on the Davinci based OMAPL138 SoCs and K3 architecture based AM65x and
>> J721E SoCs as well.
>>
>> A PRUSS consists of dual 32-bit RISC cores (Programmable Real-Time Units, or
>> PRUs), shared RAM, data and instruction RAMs, some internal peripheral modules
>> to facilitate industrial communication, and an interrupt controller.
>>
>> The programmable nature of the PRUs provide flexibility to implement custom
>> peripheral interfaces, fast real-time responses, or specialized data handling.
>> The common peripheral modules include the following,
>>    - an Ethernet MII_RT module with two MII ports
>>    - an MDIO port to control external Ethernet PHYs
>>    - an Industrial Ethernet Peripheral (IEP) to manage/generate Industrial
>>      Ethernet functions
>>    - an Enhanced Capture Module (eCAP)
>>    - an Industrial Ethernet Timer with 7/9 capture and 16 compare events
>>    - a 16550-compatible UART to support PROFIBUS
>>    - Enhanced GPIO with async capture and serial support
>>
>>
>> A typical usage scenario would be to load the application firmware into one or
>> more of the PRU cores, initialize one or more of the peripherals and perform I/O
>> through shared RAM from either a kernel driver or directly from userspace.
>>
>> This series contains the PRUSS platform driver. This is the parent driver for
>> the entire PRUSS and is used for managing the subsystem level resources like
>> various memories and the CFG module.  It is responsible for the creation and
>> deletion of the platform devices for the child PRU devices and other child
>> devices (like Interrupt Controller, MDIO node and some syscon nodes) so that
>> they can be managed by specific platform drivers.
>>
>> Grzegorz Jaszczyk (1):
>>    dt-bindings: soc: ti: Add TI PRUSS bindings
>>
>> Suman Anna (5):
>>    soc: ti: pruss: Add a platform driver for PRUSS in TI SoCs
>>    soc: ti: pruss: Add support for PRU-ICSSs on AM437x SoCs
>>    soc: ti: pruss: Add support for PRU-ICSS subsystems on AM57xx SoCs
>>    soc: ti: pruss: Add support for PRU-ICSS subsystems on 66AK2G SoC
>>    soc: ti: pruss: enable support for ICSSG subsystems on K3 AM65x SoCs
> 
> Do you have any comments on the driver portions of this series before Greg posts
> a v2 addressing the binding comments. This is one of the foundation series
> towards enabling PRUSS, and is a dependency for the PRU remoteproc driver.
> 
No just post V2 addressing Rob's comment. I will line it up once
rob acks it.

Regards,
Santosh