> -----Original Message----- > From: Wang, Haiyue <haiyue.w...@intel.com> > Sent: Thursday, April 15, 2021 3:52 PM > To: Xueming(Steven) Li <xuemi...@nvidia.com>; NBU-Contact-Thomas Monjalon > <tho...@monjalon.net> > Cc: dev@dpdk.org; Asaf Penso <as...@nvidia.com>; Parav Pandit > <pa...@nvidia.com>; Ray Kinsella <m...@ashroe.eu>; Neil Horman > <nhor...@tuxdriver.com> > Subject: RE: [dpdk-dev] [PATCH v1] bus/auxiliary: introduce auxiliary bus > > > -----Original Message----- > > From: Xueming(Steven) Li <xuemi...@nvidia.com> > > Sent: Thursday, April 15, 2021 15:46 > > To: Wang, Haiyue <haiyue.w...@intel.com>; NBU-Contact-Thomas Monjalon > > <tho...@monjalon.net> > > Cc: dev@dpdk.org; Asaf Penso <as...@nvidia.com>; Parav Pandit > > <pa...@nvidia.com>; Ray Kinsella <m...@ashroe.eu>; Neil Horman > > <nhor...@tuxdriver.com> > > Subject: RE: [dpdk-dev] [PATCH v1] bus/auxiliary: introduce auxiliary > > bus > > > > > > > -----Original Message----- > > > From: Wang, Haiyue <haiyue.w...@intel.com> > > > Sent: Thursday, April 15, 2021 3:36 PM > > > To: Xueming(Steven) Li <xuemi...@nvidia.com>; NBU-Contact-Thomas > > > Monjalon <tho...@monjalon.net> > > > Cc: dev@dpdk.org; Asaf Penso <as...@nvidia.com>; Parav Pandit > > > <pa...@nvidia.com>; Ray Kinsella > > <m...@ashroe.eu>; Neil Horman > > > <nhor...@tuxdriver.com> > > > Subject: RE: [dpdk-dev] [PATCH v1] bus/auxiliary: introduce > > > auxiliary bus > > > > > > > -----Original Message----- > > > > From: dev <dev-boun...@dpdk.org> On Behalf Of Xueming Li > > > > Sent: Tuesday, April 13, 2021 11:23 > > > > To: Thomas Monjalon <tho...@monjalon.net> > > > > Cc: dev@dpdk.org; xuemi...@nvidia.com; Asaf Penso > > > > <as...@nvidia.com>; Parav Pandit <pa...@nvidia.com>; Ray Kinsella > > > > <m...@ashroe.eu>; Neil Horman <nhor...@tuxdriver.com> > > > > Subject: [dpdk-dev] [PATCH v1] bus/auxiliary: introduce auxiliary > > > > bus > > > > > > > > Auxiliary [1] provides a way to split function into child-devices > > > > representing sub-domains of functionality. Each auxiliary_device > > > > represents a part of its parent functionality. > > > > > > > > Auxiliary device is identified by unique device name, sysfs path: > > > > /sys/bus/auxiliary/devices/<name> > > > > > > > > [1] kernel auxiliary bus document: > > > > https://www.kernel.org/doc/html/latest/driver-api/auxiliary_bus.ht > > > > ml > > > > > > > > Signed-off-by: Xueming Li <xuemi...@nvidia.com> > > > > --- > > > > MAINTAINERS | 5 + > > > > drivers/bus/auxiliary/auxiliary_common.c | 391 > > > > ++++++++++++++++++++++ drivers/bus/auxiliary/auxiliary_params.c > > > > ++++++++++++++++++++++ | 58 ++++ > > > > drivers/bus/auxiliary/linux/auxiliary.c | 147 ++++++++ > > > > drivers/bus/auxiliary/meson.build | 17 + > > > > drivers/bus/auxiliary/private.h | 118 +++++++ > > > > drivers/bus/auxiliary/rte_bus_auxiliary.h | 180 ++++++++++ > > > > drivers/bus/auxiliary/version.map | 10 + > > > > drivers/bus/meson.build | 2 +- > > > > 9 files changed, 927 insertions(+), 1 deletion(-) create mode > > > > 100644 drivers/bus/auxiliary/auxiliary_common.c > > > > create mode 100644 drivers/bus/auxiliary/auxiliary_params.c > > > > create mode 100644 drivers/bus/auxiliary/linux/auxiliary.c > > > > create mode 100644 drivers/bus/auxiliary/meson.build create mode > > > > 100644 drivers/bus/auxiliary/private.h create mode 100644 > > > > drivers/bus/auxiliary/rte_bus_auxiliary.h > > > > create mode 100644 drivers/bus/auxiliary/version.map > > > > > > > > > > > > > > --- /dev/null > > > > +++ b/drivers/bus/auxiliary/rte_bus_auxiliary.h > > > > @@ -0,0 +1,180 @@ > > > > +/* SPDX-License-Identifier: BSD-3-Clause > > > > + * Copyright 2021 Mellanox Technologies, Ltd */ > > > > + > > > > +#ifndef _RTE_BUS_AUXILIARY_H_ > > > > +#define _RTE_BUS_AUXILIARY_H_ > > > > + > > > > +/** > > > > + * @file > > > > + * > > > > + * RTE Auxiliary Bus Interface. > > > > + */ > > > > + > > > > +#ifdef __cplusplus > > > > +extern "C" { > > > > +#endif > > > > + > > > > +#include <stdio.h> > > > > +#include <stdlib.h> > > > > +#include <limits.h> > > > > +#include <errno.h> > > > > +#include <sys/queue.h> > > > > +#include <stdint.h> > > > > +#include <inttypes.h> > > > > + > > > > +#include <rte_debug.h> > > > > +#include <rte_interrupts.h> > > > > +#include <rte_dev.h> > > > > +#include <rte_bus.h> > > > > +#include <rte_kvargs.h> > > > > + > > > > +/* Forward declarations */ > > > > +struct rte_auxiliary_driver; > > > > +struct rte_auxiliary_bus; > > > > +struct rte_auxiliary_device; > > > > + > > > > +/** > > > > + * Match function for the driver to decide if device can be handled. > > > > + */ > > > > +typedef bool(auxiliary_match_t) (const char *); > > > > + > > > > +/** > > > > + * Initialization function for the driver called during auxiliary > > > > probing. > > > > + */ > > > > +typedef int(auxiliary_probe_t) (struct rte_auxiliary_driver*, > > > > + struct rte_auxiliary_device*); > > > > + > > > > +/** > > > > + * Uninitialization function for the driver called during hotplugging. > > > > + */ > > > > +typedef int (auxiliary_remove_t)(struct rte_auxiliary_device *); > > > > + > > > > +/** > > > > + * Driver-specific DMA mapping. After a successful call the > > > > +device > > > > + * will be able to read/write from/to this segment. > > > > + * > > > > + * @param dev > > > > + * Pointer to the auxiliary device. > > > > + * @param addr > > > > + * Starting virtual address of memory to be mapped. > > > > + * @param iova > > > > + * Starting IOVA address of memory to be mapped. > > > > + * @param len > > > > + * Length of memory segment being mapped. > > > > + * @return > > > > + * - 0 On success. > > > > + * - Negative value and rte_errno is set otherwise. > > > > + */ > > > > +typedef int (auxiliary_dma_map_t)(struct rte_auxiliary_device *dev, > > > > void *addr, > > > > + uint64_t iova, size_t len); > > > > + > > > > +/** > > > > + * Driver-specific DMA un-mapping. After a successful call the > > > > +device > > > > + * will not be able to read/write from/to this segment. > > > > + * > > > > + * @param dev > > > > + * Pointer to the auxiliary device. > > > > + * @param addr > > > > + * Starting virtual address of memory to be unmapped. > > > > + * @param iova > > > > + * Starting IOVA address of memory to be unmapped. > > > > + * @param len > > > > + * Length of memory segment being unmapped. > > > > + * @return > > > > + * - 0 On success. > > > > + * - Negative value and rte_errno is set otherwise. > > > > + */ > > > > +typedef int (auxiliary_dma_unmap_t)(struct rte_auxiliary_device *dev, > > > > + void *addr, uint64_t iova, size_t > > > > len); > > > > + > > > > +/** > > > > + * A structure describing an auxiliary device. > > > > + */ > > > > +struct rte_auxiliary_device { > > > > + TAILQ_ENTRY(rte_auxiliary_device) next; /**< Next probed > > > > device. */ > > > > + char name[RTE_DEV_NAME_MAX_LEN + 1]; /**< ASCII device > > > > name */ > > > > + struct rte_device device; /**< Inherit core > > > > device */ > > > > + struct rte_intr_handle intr_handle; /**< Interrupt handle > > > > */ > > > > + struct rte_auxiliary_driver *driver; /**< driver used in > > > > probing */ > > > > +}; > > > > + > > > > +/** List of auxiliary devices */ > > > > +TAILQ_HEAD(rte_auxiliary_device_list, rte_auxiliary_device); > > > > +/** List of auxiliary drivers */ > > > > +TAILQ_HEAD(rte_auxiliary_driver_list, rte_auxiliary_driver); > > > > + > > > > +/** > > > > + * Structure describing the auxiliary bus */ struct > > > > +rte_auxiliary_bus { > > > > + struct rte_bus bus; /**< Inherit the generic > > > > class */ > > > > + struct rte_auxiliary_device_list device_list; /**< List of > > > > devices */ > > > > + struct rte_auxiliary_driver_list driver_list; /**< List of > > > > +drivers */ }; > > > > + > > > > +/** > > > > + * A structure describing an auxiliary driver. > > > > + */ > > > > +struct rte_auxiliary_driver { > > > > + TAILQ_ENTRY(rte_auxiliary_driver) next; /**< Next in list. */ > > > > + struct rte_driver driver; /**< Inherit core driver. > > > > */ > > > > + struct rte_auxiliary_bus *bus; /**< Auxiliary bus > > > > reference. */ > > > > + auxiliary_match_t *match; /**< Device match > > > > function. */ > > > > + auxiliary_probe_t *probe; /**< Device Probe > > > > function. */ > > > > + auxiliary_remove_t *remove; /**< Device Remove > > > > function. */ > > > > + auxiliary_dma_map_t *dma_map; /**< Device dma map > > > > function. */ > > > > + auxiliary_dma_unmap_t *dma_unmap; /**< Device dma unmap > > > > function. */ > > > > > > These API type can be pointer type defined, then no need "*": > > > > > > typedef int (*auxiliary_dma_unmap_t)(struct rte_auxiliary_device *dev, > > > void *addr, uint64_t iova, size_t len); > > > > > > auxiliary_dma_unmap_t dma_unmap; > > > > > > Like: > > > https://patchwork.dpdk.org/project/dpdk/patch/20210331224547.2217759 > > > -1-tho...@monjalon.net/ > > > > > > typedef int (*rte_dev_dma_map_t)(struct rte_device *dev, > > > void *addr, uint64_t iova, size_t len); > > > > Thanks, is there a reason to prefer pointer type? > > Good practice to make code beautiful ? ;-) > > > > > Thoma's patch looks good, will rebase on it once accepted. > > I mean the function type is defined as pointer type. Yes, I'm talking another topic :) His patch makes dma map/unmap higher level to rte_bus, so that no need to define the api again here.
> > > > > > > > > > -- > > > > 2.25.1