> >
> > On 9/14/22 12:35, Thomas Monjalon wrote:
> > > 06/09/2022 14:51, Tom Rix:
> > > > On 9/1/22 1:34 PM, Chautru, Nicolas wrote:
> > > > > From: Tom Rix <t...@redhat.com>
> > > > > > On 8/31/22 6:26 PM, Chautru, Nicolas wrote:
> > > > > > > From: Tom Rix <t...@redhat.com>
> > > > > > > > On 8/31/22 3:37 PM, Chautru, Nicolas wrote:
> > > > > > > > > > > > > Comparing ACC200 & ACC100 header files, I
> > > > > > > > > > > > > understand ACC200 is an evolution of the ACC10x
> > > > > > > > > > > > > family. The FEC bits are really close, ACC200 main
> > > > > > > > > > > > > addition seems to be FFT acceleration which could
> > > > > > > > > > > > > be handled in ACC10x driver based on device ID.
> > > > > > > > > > > > >
> > > > > > > > > > > > > I think both drivers have to be merged in order to
> > > > > > > > > > > > > avoid code duplication. That's how other families
> > > > > > > > > > > > > of devices (e.g. i40e) are handled.
> > > > > > > > > > > > I haven't seen your reply on this point.  Do you
> > > > > > > > > > > > confirm you are working on a single driver for ACC
> > > > > > > > > > > > family in order to avoid code duplication?
> > > > > > > > > > > >
> > > > > > > > > > > The implementation is based on distinct ACC100 and
> > > > > > > > > > > ACC200 drivers.  The 2
> > > > > > > > > > devices are fundamentally different generation, processes
> > > > > > > > > > and IP.
> > > > > > > > > > > MountBryce is an eASIC device over PCIe while ACC200 is
> > > > > > > > > > > an integrated
> > > > > > > > > > accelerator on Xeon CPU.
> > > > > > > > > > > The actual implementation are not the same, underlying
> > > > > > > > > > > IP are all distinct
> > > > > > > > > > even if many of the descriptor format have similarities.
> > > > > > > > > > > The actual capabilities of the acceleration are
> > > > > > > > > > > different and/or new.  The workaround and silicon
> > > > > > > > > > > errata are also different causing different
> > > > > > > > > > limitation and implementation in the driver (see the
> > > > > > > > > > serie with ongoing changes for ACC100 in parallel).
> > > > > > > > > > > This is fundamentally distinct from ACC101 which was a
> > > > > > > > > > > derivative product
> > > > > > > > > > from ACC100 and where it made sense to share
> > > > > > > > > > implementation
> > > > > > between
> > > > > > > > > > ACC100 and ACC101.
> > > > > > > > > > > So in a nutshell these 2 devices and drivers are 2
> > > > > > > > > > > different beasts and the
> > > > > > > > > > intention is to keep them intentionally separate as in
> > > > > > > > > > the serie.
> > > > > > > > > > > Let me know if unclear, thanks!
> > > > > > > > > > Nic,
> > > > > > > > > >
> > > > > > > > > > I used a similarity checker to compare acc100 and acc200
> > > > > > > > > >
> > > > > > > > > > https://urldefense.proofpoint.com/v2/url?u=https-
> 3A__dickgrune.com_Programs_similarity-
> 5Ftester_&d=DwIBAg&c=nKjWec2b6R0mOyPaz7xtfQ&r=DnL7Si2wl_PRwpZ9TW
> ey3eu68gBzn7DkPwuqhd6WNyo&m=m846AfMSeaddoC0hcxp1mHU4LV3jRUpw
> P-Ie_41buNb9nACOR5La8n8LEFBCnn4t&s=9dgMzk9UMFLA-
> b1EJbi4lK3GG6mNMgOXZRyDZqe00TU&e=
> > > > > > > > > >
> > > > > > > > > > l=simum.log if [ -f $l ]; then rm $l fi
> > > > > > > > > >
> > > > > > > > > > sim_c -s -R -o$l -R -p -P -a .
> > > > > > > > > >
> > > > > > > > > > There results are
> > > > > > > > > >
> > > > > > > > > > ./acc200/acc200_pf_enum.h consists for 100 % of
> > > > > > > > > > ./acc100/acc100_pf_enum.h material
> > > > > > > > > > ./acc100/acc100_pf_enum.h consists for 98 % of
> > > > > > > > > > ./acc200/acc200_pf_enum.h material
> > > > > > > > > > ./acc100/rte_acc100_pmd.h consists for 98 % of
> > > > > > > > > > ./acc200/acc200_pmd.h material ./acc200/acc200_vf_enum.h
> > > > > > > > > > consists for 95 % of ./acc100/acc100_pf_enum.h material
> > > > > > > > > > ./acc200/acc200_pmd.h consists for 92 % of
> > > > > > > > > > ./acc100/rte_acc100_pmd.h material
> > > > > > > > > > ./acc200/rte_acc200_cfg.h consists for 92 % of
> > > > > > > > > > ./acc100/rte_acc100_cfg.h material
> > > > > > > > > > ./acc100/rte_acc100_pmd.c consists for 87 % of
> > > > > > > > > > ./acc200/rte_acc200_pmd.c material
> > > > > > > > > > ./acc100/acc100_vf_enum.h consists for 80 % of
> > > > > > > > > > ./acc200/acc200_pf_enum.h material
> > > > > > > > > > ./acc200/rte_acc200_pmd.c consists for 78 % of
> > > > > > > > > > ./acc100/rte_acc100_pmd.c material
> > > > > > > > > > ./acc100/rte_acc100_cfg.h consists for 75 % of
> > > > > > > > > > ./acc200/rte_acc200_cfg.h material
> > > > > > > > > >
> > > > > > > > > > Spot checking the first *pf_enum.h at 100%, these are the
> > > > > > > > > > devices' registers, they are the same.
> > > > > > > > > >
> > > > > > > > > > I raised this similarity issue with 100 vs 101.
> > > > > > > > > >
> > > > > > > > > > Having multiple copies is difficult to support and should
> > > > > > > > > > be avoided.
> > > > > > > > > >
> > > > > > > > > > For the end user, they should have to use only one
> > > > > > > > > > driver.
> > > > > > > > > >
> > > > > > > > > There are really different IP and do not have the same
> > > > > > > > > interface (PCIe/DDR vs
> > > > > > > > integrated) and there is big serie of changes which are
> > > > > > > > specific to ACC100 coming in parallel. Any workaround,
> > > > > > > > optimization would be
> > > > > > different.
> > > > > > > > > I agree that for the coming serie of integrated accelerator
> > > > > > > > > we will use a
> > > > > > > > unified driver approach but for that very case that would be
> > > > > > > > quite messy to artificially put them within the same PMD.
> > > > > > > >
> > > > > > > > How is the IP different when 100% of the registers are the
> > > > > > > > same ?
> > > > > > > >
> > > > > > > These are 2 different HW aspects. The base toplevel
> > > > > > > configuration registers
> > > > > > are kept similar on purpose but the underlying IP are totally
> > > > > > different design and implementation.
> > > > > > > Even the registers have differences but not visible here, the
> > > > > > > actual RDL file
> > > > > > would define more specifically these registers bitfields and
> > > > > > implementation including which ones are not implemented (but that
> > > > > > is proprietary information), and at bbdev level the interface is
> > > > > > not some much register based than processing based on data from
> > > > > > DMA.
> > > > > > > Basically even if there was a common driver, all these would be
> > > > > > > duplicated
> > > > > > and they are indeed different IP (including different vendors)..
> > > > > > > But I agree with the general intent and to have a common driver
> > > > > > > for the
> > > > > > integrated driver serie (ACC200, ACC300...) now that we are
> > > > > > moving away from PCIe/DDR lookaside acceleration and eASIC/FPGA
> > > > > > implementation (ACC100/AC101).
> > > > > >
> > > > > > Looking a little deeper, at how the driver is lays out some of
> > > > > > its bitfields and private data by reviewing the
> > > > > >
> > > > > > ./acc200/acc200_pmd.h consists for 92 % of
> > > > > > ./acc100/rte_acc100_pmd.h
> > > > > >
> > > > > > There are some minor changes to existing reserved bitfields.  A
> > > > > > new structure for fft.  The acc200_device, the private data for
> > > > > > the driver, is an exact copy of acc100_device.
> > > > > >
> > > > > > acc200_pmd.h is the superset and could be used with little
> > > > > > changes as a common acc_pmd.h.  acc200 is doing everything the
> > > > > > acc100 did in a very similar if not exact way, adding the fft
> > > > > > feature.
> > > > > >
> > > > > > Can you point to some portion of this patchset that is so unique
> > > > > > that it could not be abstracted to an if-check or function and so
> > > > > > requiring this separate, nearly identical driver ?
> > > > > >
> > > > > You used a similarity checker really, there are actually way more
> > > > > relevent differences than what you imply here.  With regards to the
> > > > > 2 pf_enum.h file, there are many registers that have same or
> > > > > similar names but have now different values being mapped hence you
> > > > > just cannot use one for the other.  Saying that
> > > > > "./acc200/acc200_pmd.h consists for 92 % of
> > > > > ./acc100/rte_acc100_pmd.h" is just not correct and really
> > > > > irrelevant.  Just do a diff side by side please and check, that
> > > > > should be extremely obvious, that metrics tells more about the
> > > > > similarity checker limitation than anything else.  Even when using
> > > > > a common driver for ACC200/300 they will have distinct register
> > > > > enum files being auto-generated and coming from distinct RDL.
> > > > > Again just do a diff of these 2 files. I believe you will agree
> > > > > that is not relevant for these files to try to artificially merged
> > > > > these together.
> > > > >
> > > > > With regards to the pmd.h, some structure/defines are indeed common
> > > > > and could be moved to a common file (for instance turboencoder and
> > > > > LDPC encoder which are more vanilla and unlikely to change for
> > > > > future product unlike the decoders which have different feature set
> > > > > and behaviour; or some 3GPP constant that can be defined once).  We
> > > > > can definitely change these to put together shared
> > > > > structures/defines, but not intending to try to artificially put
> > > > > things together with spaghetti code.  We would like to keep 3
> > > > > parallel versions of these PMD for 3 different product lines which
> > > > > are indeed fundamentally different designs (including different
> > > > > workaround required as can be seen on the parallel ACC100 serie
> > > > > under review).  - one version for FPGA implementation (support for
> > > > > N3000, N6000, ...) - one version for eASIC lookaside card
> > > > > implementation (ACC100, ACC101, ...) - one version for the
> > > > > integrated Xeon accelerators (ACC200, ACC300, ...)
> > > >
> > > > Some suggestions on refactoring,
> > > >
> > > > For the registers, have a common file.
> > > >
> > > > For the shared functionality, ex/ ldpc encoder, break these out to
> > > > its own shared file.
> > > >
> > > > The public interface, see my earlier comments on the documentation,
> > > > should be have the same interfaces and the few differences
> > > > highlighted.
> > >
> > > +1 to have common files, and all in a single directory
> > > drivers/baseband/acc100/
> >
> > Jus to be sure we are aligned, do you mean to have both drivers in the
> > same directory, which will share some common files? That's the way I
> > would go.
> >
> 
> I think the expectation is that the two drivers will diverge in future, so
> having separate directories should be ok, even with common files placed in
> one directory are shared with another. With meson include paths its pretty
> trivial to manage if it's just header files, and even if there are common C
> files, there is always the option of using drivers/common if we want to
> split them out. As I understand it, right now it's only headers inluding
> functions which can be static inline, so simple sharing via include paths
> should work fine.
> 
It can be ok to have 2 separate directories, but 
- is it not possible to have them in same directory say 'acc'  for all 
affiliated devices.
Similar to other vendors' devices (cnxk, i40e, mlx).
- Can both the devices - acc100 and acc200 coexist? If not, same directory is 
good enough.
- there can be multiple files or directories in 'acc' which can be named 
appropriately to
denote the actual device(acc100/200).

Having cross dependency across different drivers of same type looks a kind of 
hacking the meson.
This was a reason we moved to have a drivers/common/ for some of the drivers.
Also including "../acc100/abc.h" does not look appropriate to me.

IMO, we should not add unnecessary directories when the code is common and can 
be managed in a single one.

However, technically it is also ok to have 2 separate directories. But, 
agreeing on this will set a
precedence for future next generation devices from the same vendors. It may be 
a topic of discussion in techboard.

-Akhil

Reply via email to