drivers/net/ethernet/ti/Kconfig | 9 + drivers/net/ethernet/ti/Makefile | 1 + drivers/net/ethernet/ti/icve_rpmsg_common.h | 137 ++++ drivers/net/ethernet/ti/inter_core_virt_eth.c | 591 ++++++++++++++++++ drivers/net/ethernet/ti/inter_core_virt_eth.h | 62 ++ 5 files changed, 800 insertions(+) create mode 100644 drivers/net/ethernet/ti/icve_rpmsg_common.h create mode 100644 drivers/net/ethernet/ti/inter_core_virt_eth.c create mode 100644 drivers/net/ethernet/ti/inter_core_virt_eth.h
virtio-net provides a solution for virtual ethernet interface in a virtualized environment. There might be a use-case for traffic tunneling between heterogeneous processors in a non virtualized environment such as TI's AM64x that has Cortex A53 and Cortex R5 where Linux runs on A53 and a flavour of RTOS on R5(FreeRTOS) and the ethernet controller is managed by R5 and needs to pass some low priority data to A53. One solution for such an use case where the ethernet controller does not support DMA for Tx/Rx channel, could be a RPMsg based shared memory ethernet driver. The data plane is over the shared memory while the control plane is over RPMsg end point channel. Two separate regions can be carved out in the shared memory, one for the A53 -> R5 data path, and other for R5 -> A53 data path. The shared memory layout is modelled as circular buffer. ------------------------- | HEAD | ------------------------- | TAIL | ------------------------- | PKT_1_LEN | | PKT_1 | ------------------------- | PKT_2_LEN | | PKT_2 | ------------------------- | . | | . | ------------------------- | PKT_N_LEN | | PKT_N | ------------------------- Polling mechanism can used to check for the offset between head and tail index to process the packets by both the cores. This is the v2 of this series. It addresses comments made on v1. Changes from v1 to v2: *) Addressed open comments on v1. *) Added patch 3/3 to add support for multicast filtering v1: https://lore.kernel.org/all/20240130110944.26771-1-r-gunasekaran@ti.com/ Ravi Gunasekaran (1): net: ethernet: ti: RPMsg based shared memory ethernet driver Yojana Mallik (2): net: ethernet: ti: Register the RPMsg driver as network device net: ethernet: ti: icve: Add support for multicast filtering drivers/net/ethernet/ti/Kconfig | 9 + drivers/net/ethernet/ti/Makefile | 1 + drivers/net/ethernet/ti/icve_rpmsg_common.h | 137 ++++ drivers/net/ethernet/ti/inter_core_virt_eth.c | 591 ++++++++++++++++++ drivers/net/ethernet/ti/inter_core_virt_eth.h | 62 ++ 5 files changed, 800 insertions(+) create mode 100644 drivers/net/ethernet/ti/icve_rpmsg_common.h create mode 100644 drivers/net/ethernet/ti/inter_core_virt_eth.c create mode 100644 drivers/net/ethernet/ti/inter_core_virt_eth.h -- 2.40.1
On Fri, May 31, 2024 at 12:10:03PM +0530, Yojana Mallik wrote: > virtio-net provides a solution for virtual ethernet interface in a > virtualized environment. > > There might be a use-case for traffic tunneling between heterogeneous > processors in a non virtualized environment such as TI's AM64x that has > Cortex A53 and Cortex R5 where Linux runs on A53 and a flavour of RTOS > on R5(FreeRTOS) and the ethernet controller is managed by R5 and needs > to pass some low priority data to A53. > > One solution for such an use case where the ethernet controller does > not support DMA for Tx/Rx channel, could be a RPMsg based shared memory > ethernet driver. virtio-net is very generic and vendor agnostic. Looking at icve, what is TI specific? Why not define a generic solution which could be used for any heterogeneous system? We are seeming more and more such systems, and there is no point everybody re-inventing the wheel. So what i would like to see is something similar to driver/tty/rpmsg_tty.c, a driver/net/ethernet/rpmsg_eth.c, with good documentation of the protocol used, so that others can implement it. And since you say you have FreeRTOS on the other end, you could also contribute that side to FreeRTOS as well. A complete open source solution everybody can use. Andrew
On 6/2/24 21:15, Andrew Lunn wrote:
> On Fri, May 31, 2024 at 12:10:03PM +0530, Yojana Mallik wrote:
>> virtio-net provides a solution for virtual ethernet interface in a
>> virtualized environment.
>>
>> There might be a use-case for traffic tunneling between heterogeneous
>> processors in a non virtualized environment such as TI's AM64x that has
>> Cortex A53 and Cortex R5 where Linux runs on A53 and a flavour of RTOS
>> on R5(FreeRTOS) and the ethernet controller is managed by R5 and needs
>> to pass some low priority data to A53.
>>
>> One solution for such an use case where the ethernet controller does
>> not support DMA for Tx/Rx channel, could be a RPMsg based shared memory
>> ethernet driver.
>
> virtio-net is very generic and vendor agnostic.
>
> Looking at icve, what is TI specific? Why not define a generic
> solution which could be used for any heterogeneous system? We are
> seeming more and more such systems, and there is no point everybody
> re-inventing the wheel. So what i would like to see is something
> similar to driver/tty/rpmsg_tty.c, a driver/net/ethernet/rpmsg_eth.c,
> with good documentation of the protocol used, so that others can
> implement it. And since you say you have FreeRTOS on the other end,
> you could also contribute that side to FreeRTOS as well. A complete
> open source solution everybody can use.
>
> Andrew
+static struct rpmsg_device_id icve_rpmsg_id_table[] = {
+ { .name = "ti.icve" },
+ {},
+};
+MODULE_DEVICE_TABLE(rpmsg, icve_rpmsg_id_table);
+
+static struct rpmsg_driver icve_rpmsg_client = {
+ .drv.name = KBUILD_MODNAME,
+ .id_table = icve_rpmsg_id_table,
+ .probe = icve_rpmsg_probe,
+ .callback = icve_rpmsg_cb,
+ .remove = icve_rpmsg_remove,
+};
+module_rpmsg_driver(icve_rpmsg_client);
+
When the Linux kernel detects an rpmsg device (the communication channel), it
looks for a matching driver that can handle this device with the help of name
string in the icve_rpmsg_id_table in driver structure. I will change the name
string to make the driver generic. Apart from the name string other entities
don't look TI specific.
Thank you for the suggestion to make inter-core virtual ethernet driver generic
like drivers/tty/rpmsg_tty.c for a complete open source solution. I will be
working on it.
Regard,
Yojana Mallik
On Sun, 2 Jun 2024 17:45:29 +0200 Andrew Lunn wrote: > On Fri, May 31, 2024 at 12:10:03PM +0530, Yojana Mallik wrote: > > virtio-net provides a solution for virtual ethernet interface in a > > virtualized environment. > > > > There might be a use-case for traffic tunneling between heterogeneous > > processors in a non virtualized environment such as TI's AM64x that has > > Cortex A53 and Cortex R5 where Linux runs on A53 and a flavour of RTOS > > on R5(FreeRTOS) and the ethernet controller is managed by R5 and needs > > to pass some low priority data to A53. > > > > One solution for such an use case where the ethernet controller does > > not support DMA for Tx/Rx channel, could be a RPMsg based shared memory > > ethernet driver. > > virtio-net is very generic and vendor agnostic. > > Looking at icve, what is TI specific? Why not define a generic > solution which could be used for any heterogeneous system? We are > seeming more and more such systems, and there is no point everybody > re-inventing the wheel. So what i would like to see is something > similar to driver/tty/rpmsg_tty.c, a driver/net/ethernet/rpmsg_eth.c, > with good documentation of the protocol used, so that others can > implement it. And since you say you have FreeRTOS on the other end, > you could also contribute that side to FreeRTOS as well. A complete > open source solution everybody can use. 100% agreed! FWIW there's also a PCIe NTB driver which provides very similar functionality.
© 2016 - 2026 Red Hat, Inc.