On 29 November 2016 at 13:03, Christophe Milard < christophe.mil...@linaro.org> wrote:
> On 29 November 2016 at 18:13, Francois Ozog <francois.o...@linaro.org> > wrote: > > > > > > > On 29 November 2016 at 16:44, Christophe Milard < > > christophe.mil...@linaro.org> wrote: > > > >> > >> > >> On 29 November 2016 at 13:22, Francois Ozog <francois.o...@linaro.org> > >> wrote: > >> > >>> Hi, > >>> > >>> comments inline > >>> > >>> On 29 November 2016 at 10:58, Christophe Milard < > >>> christophe.mil...@linaro.org> wrote: > >>> > >>>> Hi, > >>>> > >>>> In our last meeting, yesterday, we agreed on the following objects: > >>>> 1) enumerator class > >>>> 2) enumerator > >>>> 3) enumerated_device > >>>> 4) devio > >>>> > >>> [FF] we have defined two types of devio: devio-nommu, devio-iommu. The > >>> devio-nommu can be implemented using uio or vfio-nommu interfaces. > >>> devio-nommu abstracts calls to both and ensure it is OS independent. > >>> devio-iommu implement full vfio interface with dma and irq remappings. > if > >>> we consider uio as being deprecated, we may just focus on vfio based > >>> devio-nommu and devio-iommu on the first pass and add uio next. > >>> > >> > >> [CH] Agreed, I think. devio-nommu, devio-iommu are two instances of a > >> more general devio object, right? > >> > > [FF] In essence yes but the list of functions on devio-nommu and > > devio-iommu are not the same. So we'll have to deal with casts and have a > > shared list of functions. > > > > [CH]: different devio could provide completely different set of ops. I > don't see any problem with that. I am not even sure we should try to > "merge/cast" devios providing the same functionality. what for? this would > just add an extra degree of complexity (dependency between diffferent devio > version), and these function would have to be accesses through different > devio ops anyway > > > > > >> > >>> 5) driver > >>>> > >>>> and to come: pktio_interface... > >>>> > >>>> At registration time, the driver have to tell: > >>>> - The enumerator class it expects devices from (string E) > >>>> - The devio it intend to use (string D) > >>>> > >>>> [FF]: > >>> 1) the administrator has bound uio or vfio to the device. In that case, > >>> the driver have to be compatible with them. > >>> > >> > >> [CH]: so the driver deals directely with the pci-vfio or pci-uio > >> kernel-driver interface? So some devio module will be kernel drivers, > and > >> some other will be ODP modules? > >> My understanding was that the driver would ask for, say, devio-mmu, > >> always. > >> pci-vfio can be used to implement devio-mmu (and probably will), but the > >> driver does not care. it just requires and uses devio-mmu. whether the > >> devio-mmu implementation finds (an already bound) or binds the pcivfio > >> kernel driver is transparent to the ODP device driver. So in my eyes the > >> driver does not have to be compatible with pci-vfio (or uio). the > driver is > >> just compatible with devio-mmu. (which is probably a close to a 1:1 > mapping > >> to pci-vfio) > >> > >> [FF] devio-nommu abstracts both uio and vfio-nommu as they have the same > > functional spectrum. So the driver does not deal with uio or vfio > directly. > > If the device is bound to uio, the device enumerator will pass a > > devio-nommu object whose ops point to uio implementation. > > > > [CH] yes. > > > > > > >> 2) the administrator did nothing, then it is the driver duty to ask for > a > >>> devio-nommu or devio-iommu interface to the enumerator. > >>> > >> > >> [CH] that should happen in any case, I think. > >> > > [FF] this is scenario is mor complex than the other one and may require > > scripting to properly configure vfio. I think we should implement 1) > first > > then 2. > > > > [CH] OK. I can imagine a devio-nommu trying to bind a kernel driver: > Nothing seems to prevent doing this, so I am fine. we can ignore this case > for now. > > > > > >> > >>> 3) so I would say that String D is for supported list of devio > >>> interfaces and versions. > >>> > >> > >> [CH] I am not sure why a driver would support many devios, but why not. > >> OK for the versions > >> > > [FF] because we are not in a perfect world. very soon there will be full > > vfio capabilities in x86 and we'll have to have support for that at least > > for virtio-net. And we are not going to have that on ARM for probably a > > year. So the vitio-net driver will have to support both devio-nommu and > > devio-iommu > > > [CH] Ok. I thought this situation could simply be handled with different > drivers. But your approach does not prevent to have different drivers > either, so why not... > so D becomes: > struct { > int major > int minor > char devio_name[x]} devio[N] > i.e. an array of N devio that the driver REQUIRES (rather than supports). > [the driver requires any of the devio in the list, of course. not all.] > Then I guess the driver should be told about the specific devio it is given > to work with (one in the list) at probe time, right? e.g the index in the > range [0...N-1]. The selected devio should have a matching name, same major > and minor(devio) >= minor(driver). > > > > > >> > >>> Also, the version of these matters! are we OK with a major/minor > >>>> approach?, i.e. the driver will be probed (after registration), only > >>>> for objects enumerated by a compatible enumerator E and if a > >>>> compatible devio D has been registered: > >>>> > >>>> By compatible we mean: > >>>> At registration time enumerators and devios provide a major/minor > >>>> version number > >>>> At registration time, driver provides the requested enumerator and > >>>> devio name and version. > >>>> The register version (of a enumerator or devio) is compatible with the > >>>> requested version if: > >>>> major(requested) = major(registered) > >>>> minor(requested) <= minor(registered) > >>>> > >>>> Does this make sense for you? any better idea? > >>>> > >>>> [FF] If we look at operational cases, I think we cannot allow too much > >>> flexibility. we should define a "device framework" API version and only > >>> allow loaded modules (enumerator classes, drivers...) that have the > same > >>> API versions. Then a version can be used to identify bug fixes in the > >>> implementation. This may allow to update a faulty driver live on a > system. > >>> > >> > >> [CH] so the major/minor approach should be good enough? > >> > > [FF] yes except the major version does not represent the major version of > > the driver , the enumerator,... it represents the API version to which > the > > object complies to. The version increments with bug fixes only on the > > "minor" version which represent the actual version of the driver, > > enumerator... > > > [CH] I guess we agree here: this number reflects API changes: the version > number of a devio would change as follow: > -major number increases when the API changes, breaking previous api > -minor version increases when the API grows, leaving older api elements > unchanged (still usable). > Can we reuse an established scheme like the one for linux libs ? > > Christophe > > > > >> > >>> > >>> 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 > > > > > -- Mike Holmes Program Manager - Linaro Networking Group Linaro.org <http://www.linaro.org/> *│ *Open source software for ARM SoCs "Work should be fun and collaborative, the rest follows"