To deal with drivers we need to have additional "standard" (helper or API?) objects to deal with MAC addresses.
ODP could be made to handle SDH, SDLC, FrameRelay or ATM packets. A packet_io is pretty generic... But as soon as we talk with drivers and initialization, we need to deal with L1 initialization (link up/ synchronized...) and L2 initialization (DLCI, MAC (Ethernet, FDDI, TokenRing...)...). Shall we add those L1 and L3 concepts ? FF On 9 November 2016 at 09:38, Francois Ozog <francois.o...@linaro.org> wrote: > > > On 9 November 2016 at 09:09, Christophe Milard < > christophe.mil...@linaro.org> wrote: > >> >> >> On 8 November 2016 at 18:19, Francois Ozog <francois.o...@linaro.org> >> wrote: >> >>> Hi Christophe, >>> >>> We are focusing on network devices which have at least network ports. >>> Inventory of devices and ports are two distinct topics as there is no >>> guarantee that there is one device per port. (Intel and Mellanox have this >>> policy: one device per PCI port, but many others have one PCI device for >>> multiple ports (Chelsio...) >>> >>> 1) device discovery >>> >>> So let's focus first on device discovery. >>> >>> Devices can be found from: >>> - static "configuration" based on ODP implementation >>> - ACPI >>> - PCI >>> - DPAA2 NXP bus >>> - VMBus (VMs running on Microsoft Hyper-V hypervisor) >>> - others ? >>> >>> So bus are somewhat limited (ACPI is NOT a bus). I prefer to talk about >>> device enumerators. >>> >> >> OK. >> >> >>> >>> so we can loop through all devices using your proposed: >>> for each <device enumerator> >>> for each probed device >>> >> >> Not sure what a "probed device" is here, I what thinking: >> for each <device enumerator> >> for each driver >> driver.probe(device) >> >> Is that what you meant? >> >> >>> [FF] no: > for each <device enumerator> > >> for each enumerated device >> for each registered driver >> > driver.probe(device) > >> >>> But that is only for static discovery at the program startup. >>> >> >> yes >> >> >>> >>> It would be way better to allow hotplugs (card insertion in a chassis, >>> addition of one virtual interfrace in aa VM because of a scale up >>> operation). >>> >> >> yes: we can probe new hotplugged devices (again registered drivers) when >> a new device is hot plugged and and probe registered (unassigned) device >> again any hot plugged driver. >> >> >>> >>> So in addition to initial synchronous probing we need asynchronous >>> events handling. >>> >> >> yes >> >> >>> >>> Once we have found the device, we need to check if we have a driver for >>> it and if the "user" has decided if he wants to use that device >>> (configuration aspects) >>> >> >> I guess the fact that a user loads a driver is an act of configuration...? >> [FF] I guess not, load all drivers >> >>> >>> 2) driver assignment >>> From this device we may want to enumerate ports and other "things" (like >>> embeded switch) that are present on the device. >>> >> >> hmmm... so a device driver could act as a new enumerator? I am not fully >> following your proposal here... Let's say 2 PCI board contains (each) its >> switch (one switch per board). The PCI enumerator will detect 2 devices. So >> according to your proposal, we would also have switch enumerators? How many >> such switch enumerator do we have? Where is it located? >> [FF]: lets make a simpler example: 2 PCI devices, each with four 10Gbps >> ethernet ports. there are two enumerated PCI devices but there are 8 >> packet_ios. packet ios should conserve a link to a device, the device >> should have a link back to the enumerator. no upperlayer metadata saved in >> each "object", just a link. >> >>> >>> Accessing devices is bus dependent, os dependent and processor >>> dependent. >>> A few problems to tackle: >>> - On Linux, a device can be accessed through uio, vfio or through a >>> direct library (cf bifurcated drivers) >>> >> >> yes. So a device enumerator will give many interface to play with the >> devices it enumerates. In my first example, I called BUS what you call >> enumerator and DRIVER_TYPE was the key to select the device interface (like >> PCI_VFIO wouild select the vfio interface). If we keep with the enumerator >> view (that I like), shall each enumerator give a choice of >> "device-interface" for each of its device? I.E: >> my BUS = your enumerator (OK) >> my DRIVER_TYPE = device_interface? >> [FF] not sure I understand >> > > >> - if uio, it also depends on the processor architecture (Intel has a >>> special way of exposing uio, PPC64 and ARM64 are different) >>> >> >> Haven't digged into uio yet ... >> >> >> >>> - if bifurcated driver, the "odp/dpdk driver" SHOULD not deal directly >>> with the PCI device but rather with the device specific library >>> >> >> "odp/dpdk driver"...Are you planning for a new driver structure for dpdk >> too, which we would share ? >> Not sure I understand what you meant there. I though bifurcated drivers >> where just drivers getting their data from userland application but >> controled by kernel tools. I guess my view is not complete here. >> [FF] when you bind a driver to uio, the netdev disappears. When using >> bifurcated drivers it does not. >> >>> >>> 3) created objects in ODP >>> odp_pktio_t is somewhat corresponding to a port "driver". it does >>> properly adapts to a device with multiple ports. >>> >> >> Not sure of the match when you started talking about the embeded >> switches... >> > [FF] I keep hw discovery/inventory/representation (hierarchy of connected > elements) separate from the functional aspects (drivers, ports, > controllable hw blocks such as classifier, scheduler...). .I guess we can > represent the switch as if it was a classifier+scheduler+tm. I haven't > thought too much about that > >> >> Christophe. >> >>> >>> FF >>> >>> >>> >>> >>> >>> On 7 November 2016 at 17:49, Christophe Milard < >>> christophe.mil...@linaro.org> wrote: >>> >>>> Bonsoir Francois, >>>> >>>> I'll take that in English thereafter so that other can read (copy to >>>> the list). >>>> >>>> I have looked at that: >>>> >>>> https://dpdksummit.com/Archive/pdf/2016Userspace/Day02-Sessi >>>> on03-ShreyanshJain-Userspace2016.pdf >>>> >>>> I guess that is what you referred to, Francois, when talking at the >>>> SYNC meeting earlier today. I missed a lot of was you said, though, my >>>> BJ being extremely uncooperative today. >>>> >>>> I have not seen the presentation, but my understanding is that PCI >>>> drivers would "require" PCI bus drivers. As SocX driver could require >>>> Soc bus scan. >>>> I have to admit that I did not follow 100% the DPDK proposal, but >>>> this approach to have a "BUS driver" is not very clear to me, when it >>>> comes to ODP: >>>> >>>> 1)Because SoC constructors will probably accelerate more than the >>>> interface. If those constructors have, for instance, different >>>> odp-packet implementation (matching their HW), they will likely have >>>> their own ODP implementation anyway, so making the bus enumerator a >>>> driver will not help them. >>>> >>>> 2)Bus enumeration and ressource mapping would likely require quite a >>>> lot of assumptions regarding the OS/platform the BUS driver runs on >>>> (such as the persence of the /sys fs on linux). >>>> That would make the driver OS/Platform dependent: not a big deal for >>>> DPDK (which is mainly targetting linux/X86), but maybe more a problem >>>> for ODP... >>>> >>>> I have to admit that having driver dependencies (a bit like package >>>> systems like apt-get/rpm have) would have benefits as well, but not >>>> sure that it would be best for us. Isn't the goal of ODP being mostly >>>> an API to enable completely different implementations? Is there a >>>> point trying to go for more than standart busses in the linux generic >>>> implementation then? >>>> >>>> By the way: How does the NXP board interface the machine? Not sure I >>>> understand their case... >>>> >>>> >>>> My intension was to do Bus enumeration in ODP, and provide driver >>>> registration in ODP as well. So eventually, ODP would build a list of >>>> devices for each bus and a list of registered drivers. >>>> >>>> Then ODP would do something like: >>>> for each bus >>>> for each device of this bus >>>> for each driver >>>> if driver.bus == bus, then call driver.probe(device), >>>> if probe() returns true (the driver can handle the >>>> device), then break; >>>> >>>> Basically saying that the first driver whose probe() fnct returns true >>>> is good to go. >>>> >>>> This is a simpler model (and It would be limited to PCI busses to >>>> start with), but it hopefully would enable drivers to be OS/platform >>>> agnostic: If, PCI for instance, is handled differentely on different >>>> ODP implementation, the board driver would not have to care as long as >>>> the ODPDRV-pci interface remains the same. >>>> >>>> Any other voices? >>>> >>>> Those who want to TALK to me are VERY welcomed to HO me! :-) >>>> >>>> Thks for reading :-) >>>> >>>> Christophe. >>>> >>> >>> >>> >>> -- >>> [image: Linaro] <http://www.linaro.org/> >>> François-Frédéric Ozog | *Director Linaro Networking Group* >>> T: +33.67221.6485 >>> francois.o...@linaro.org | Skype: ffozog >>> >>> >> > > > -- > [image: Linaro] <http://www.linaro.org/> > François-Frédéric Ozog | *Director Linaro Networking Group* > T: +33.67221.6485 > francois.o...@linaro.org | Skype: ffozog > > -- [image: Linaro] <http://www.linaro.org/> François-Frédéric Ozog | *Director Linaro Networking Group* T: +33.67221.6485 francois.o...@linaro.org | Skype: ffozog