* [PATCH] fpga: dfl: improve configuration of dfl pci devices @ 2020-06-28 15:18 trix 2020-06-29 2:19 ` Xu Yilun ` (2 more replies) 0 siblings, 3 replies; 7+ messages in thread From: trix @ 2020-06-28 15:18 UTC (permalink / raw) To: mdf; +Cc: linux-fpga, linux-kernel, Tom Rix From: Tom Rix <trix@redhat.com> To use a dfl pci device, several dfl configs need to be selected. This is tedious and error prone. So automagically select the needed configs when FPGA_DFL_PCI is selected. Signed-off-by: Tom Rix <trix@redhat.com> --- drivers/fpga/Kconfig | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/drivers/fpga/Kconfig b/drivers/fpga/Kconfig index 7cd5a29fc437..4b9e05af5426 100644 --- a/drivers/fpga/Kconfig +++ b/drivers/fpga/Kconfig @@ -138,6 +138,27 @@ config OF_FPGA_REGION Support for loading FPGA images by applying a Device Tree overlay. +config FPGA_DFL_PCI + tristate "FPGA DFL PCIe Device Driver" + depends on PCI + select FPGA_DFL + select FPGA_DFL_FME + select FPGA_DFL_FME_MGR + select FPGA_DFL_FME_BRIDGE + select FPGA_DFL_FME_REGION + select FPGA_DFL_AFU + help + Select this option to enable PCIe driver for PCIe-based + Field-Programmable Gate Array (FPGA) solutions which implement + the Device Feature List (DFL). This driver provides interfaces + for userspace applications to configure, enumerate, open and access + FPGA accelerators on the FPGA DFL devices, enables system level + management functions such as FPGA partial reconfiguration, power + management and virtualization with DFL framework and DFL feature + device drivers. + + To compile this as a module, choose M here. + config FPGA_DFL tristate "FPGA Device Feature List (DFL) support" select FPGA_BRIDGE @@ -191,21 +212,6 @@ config FPGA_DFL_AFU to the FPGA infrastructure via a Port. There may be more than one Port/AFU per DFL based FPGA device. -config FPGA_DFL_PCI - tristate "FPGA DFL PCIe Device Driver" - depends on PCI && FPGA_DFL - help - Select this option to enable PCIe driver for PCIe-based - Field-Programmable Gate Array (FPGA) solutions which implement - the Device Feature List (DFL). This driver provides interfaces - for userspace applications to configure, enumerate, open and access - FPGA accelerators on the FPGA DFL devices, enables system level - management functions such as FPGA partial reconfiguration, power - management and virtualization with DFL framework and DFL feature - device drivers. - - To compile this as a module, choose M here. - config FPGA_MGR_ZYNQMP_FPGA tristate "Xilinx ZynqMP FPGA" depends on ZYNQMP_FIRMWARE || (!ZYNQMP_FIRMWARE && COMPILE_TEST) -- 2.18.1 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH] fpga: dfl: improve configuration of dfl pci devices 2020-06-28 15:18 [PATCH] fpga: dfl: improve configuration of dfl pci devices trix @ 2020-06-29 2:19 ` Xu Yilun 2020-06-29 3:12 ` Wu, Hao 2020-06-29 12:38 ` kernel test robot 2020-06-29 19:22 ` kernel test robot 2 siblings, 1 reply; 7+ messages in thread From: Xu Yilun @ 2020-06-29 2:19 UTC (permalink / raw) To: trix; +Cc: mdf, linux-fpga, linux-kernel, hao.wu, matthew.gerlach I think maybe we don't have to select them all. It is now possible for FPGA DFL boards to work without FME or AFU, providing limited functionality. It is possible designers trim the bitstream for their purpose, and also need a smaller driver set. I think we may add "default FPGA_DFL" for FPGA_DFL_FME, FPGA_DFL_FME_MGR and others to make life easier. How do you think? On Sun, Jun 28, 2020 at 08:18:13AM -0700, trix@redhat.com wrote: > From: Tom Rix <trix@redhat.com> > > To use a dfl pci device, several dfl configs need to be selected. > This is tedious and error prone. > > So automagically select the needed configs when FPGA_DFL_PCI > is selected. > > Signed-off-by: Tom Rix <trix@redhat.com> > --- > drivers/fpga/Kconfig | 36 +++++++++++++++++++++--------------- > 1 file changed, 21 insertions(+), 15 deletions(-) > > diff --git a/drivers/fpga/Kconfig b/drivers/fpga/Kconfig > index 7cd5a29fc437..4b9e05af5426 100644 > --- a/drivers/fpga/Kconfig > +++ b/drivers/fpga/Kconfig > @@ -138,6 +138,27 @@ config OF_FPGA_REGION > Support for loading FPGA images by applying a Device Tree > overlay. > > +config FPGA_DFL_PCI > + tristate "FPGA DFL PCIe Device Driver" > + depends on PCI > + select FPGA_DFL > + select FPGA_DFL_FME > + select FPGA_DFL_FME_MGR > + select FPGA_DFL_FME_BRIDGE > + select FPGA_DFL_FME_REGION > + select FPGA_DFL_AFU > + help > + Select this option to enable PCIe driver for PCIe-based > + Field-Programmable Gate Array (FPGA) solutions which implement > + the Device Feature List (DFL). This driver provides interfaces > + for userspace applications to configure, enumerate, open and access > + FPGA accelerators on the FPGA DFL devices, enables system level > + management functions such as FPGA partial reconfiguration, power > + management and virtualization with DFL framework and DFL feature > + device drivers. > + > + To compile this as a module, choose M here. > + > config FPGA_DFL > tristate "FPGA Device Feature List (DFL) support" > select FPGA_BRIDGE > @@ -191,21 +212,6 @@ config FPGA_DFL_AFU > to the FPGA infrastructure via a Port. There may be more than one > Port/AFU per DFL based FPGA device. > > -config FPGA_DFL_PCI > - tristate "FPGA DFL PCIe Device Driver" > - depends on PCI && FPGA_DFL > - help > - Select this option to enable PCIe driver for PCIe-based > - Field-Programmable Gate Array (FPGA) solutions which implement > - the Device Feature List (DFL). This driver provides interfaces > - for userspace applications to configure, enumerate, open and access > - FPGA accelerators on the FPGA DFL devices, enables system level > - management functions such as FPGA partial reconfiguration, power > - management and virtualization with DFL framework and DFL feature > - device drivers. > - > - To compile this as a module, choose M here. > - > config FPGA_MGR_ZYNQMP_FPGA > tristate "Xilinx ZynqMP FPGA" > depends on ZYNQMP_FIRMWARE || (!ZYNQMP_FIRMWARE && COMPILE_TEST) > -- > 2.18.1 ^ permalink raw reply [flat|nested] 7+ messages in thread
* RE: [PATCH] fpga: dfl: improve configuration of dfl pci devices 2020-06-29 2:19 ` Xu Yilun @ 2020-06-29 3:12 ` Wu, Hao 2020-06-29 13:28 ` Tom Rix 0 siblings, 1 reply; 7+ messages in thread From: Wu, Hao @ 2020-06-29 3:12 UTC (permalink / raw) To: Xu, Yilun, trix; +Cc: mdf, linux-fpga, linux-kernel, matthew.gerlach > -----Original Message----- > From: linux-fpga-owner@vger.kernel.org <linux-fpga-owner@vger.kernel.org> > On Behalf Of Xu Yilun > Sent: Monday, June 29, 2020 10:19 AM > To: trix@redhat.com > Cc: mdf@kernel.org; linux-fpga@vger.kernel.org; linux- > kernel@vger.kernel.org; Wu, Hao <hao.wu@intel.com>; > matthew.gerlach@linux.intel.com > Subject: Re: [PATCH] fpga: dfl: improve configuration of dfl pci devices > > I think maybe we don't have to select them all. It is now possible for > FPGA DFL boards to work without FME or AFU, providing limited > functionality. It is possible designers trim the bitstream for their > purpose, and also need a smaller driver set. > Yes, we hope that this dfl-pci could be a common module shared by different cards. Some device doesn't have FME, e.g. some VF device with AFU only, some device has FME, but no PR support, and in the future, it's possible to add new modules, or something replacing AFU or FME, so we don't have to select all here. > I think we may add "default FPGA_DFL" for FPGA_DFL_FME, > FPGA_DFL_FME_MGR and others to make life easier. It's hard to say it's easier for everybody, e.g. I am a user of N3000, but I have to unselect the PR modules, as they are default Yes as proposed? Maybe it's better to let user select what they want, unless we find something really common needed under DFL framework. Hao ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] fpga: dfl: improve configuration of dfl pci devices 2020-06-29 3:12 ` Wu, Hao @ 2020-06-29 13:28 ` Tom Rix 2020-06-30 2:34 ` Wu, Hao 0 siblings, 1 reply; 7+ messages in thread From: Tom Rix @ 2020-06-29 13:28 UTC (permalink / raw) To: Wu, Hao, Xu, Yilun; +Cc: mdf, linux-fpga, linux-kernel, matthew.gerlach On 6/28/20 8:12 PM, Wu, Hao wrote: >> -----Original Message----- >> From: linux-fpga-owner@vger.kernel.org <linux-fpga-owner@vger.kernel.org> >> On Behalf Of Xu Yilun >> Sent: Monday, June 29, 2020 10:19 AM >> To: trix@redhat.com >> Cc: mdf@kernel.org; linux-fpga@vger.kernel.org; linux- >> kernel@vger.kernel.org; Wu, Hao <hao.wu@intel.com>; >> matthew.gerlach@linux.intel.com >> Subject: Re: [PATCH] fpga: dfl: improve configuration of dfl pci devices >> >> I think maybe we don't have to select them all. It is now possible for >> FPGA DFL boards to work without FME or AFU, providing limited >> functionality. It is possible designers trim the bitstream for their >> purpose, and also need a smaller driver set. >> > Yes, we hope that this dfl-pci could be a common module shared by > different cards. Some device doesn't have FME, e.g. some VF device > with AFU only, some device has FME, but no PR support, and in the > future, it's possible to add new modules, or something replacing AFU > or FME, so we don't have to select all here. > >> I think we may add "default FPGA_DFL" for FPGA_DFL_FME, >> FPGA_DFL_FME_MGR and others to make life easier. > It's hard to say it's easier for everybody, e.g. I am a user of N3000, but > I have to unselect the PR modules, as they are default Yes as proposed? > Maybe it's better to let user select what they want, unless we find > something really common needed under DFL framework. I get your point about n3000, but that card is not currently supported in the public. Currently there is really only pac10, the 0x9c4 device. Once n3000 (and d5005) is out, it will have several sub devices that will also so need to be manually configured. While a developer of the n3000 will know which subdevices are needed, someone just building the kernel will not. So would expect there to be something like CONFIG_FPGA_DFL_N3000 select CONFIG_DFL_PCI select CONFIG_DFL_SUBDEV_1 .. On PF vs FP, yes only afu parts are needed. But i doubt anyone builds a VF specific kernel. And if folks wanted to not use the fme parts they would not have to load it's module at run time. I would like a top level config what auto selects all of the submodules needed based on the card. I think maybe that is CONFIG_FPGA_DFL_PAC10. so we will be ready for CONFIG_FPGA_DFL_N3000 and CONFIG_FPGA_DFL_D5005 and what ever comes later. Tom > Hao > ^ permalink raw reply [flat|nested] 7+ messages in thread
* RE: [PATCH] fpga: dfl: improve configuration of dfl pci devices 2020-06-29 13:28 ` Tom Rix @ 2020-06-30 2:34 ` Wu, Hao 0 siblings, 0 replies; 7+ messages in thread From: Wu, Hao @ 2020-06-30 2:34 UTC (permalink / raw) To: Tom Rix, Xu, Yilun; +Cc: mdf, linux-fpga, linux-kernel, matthew.gerlach > On 6/28/20 8:12 PM, Wu, Hao wrote: > >> -----Original Message----- > >> From: linux-fpga-owner@vger.kernel.org <linux-fpga- > owner@vger.kernel.org> > >> On Behalf Of Xu Yilun > >> Sent: Monday, June 29, 2020 10:19 AM > >> To: trix@redhat.com > >> Cc: mdf@kernel.org; linux-fpga@vger.kernel.org; linux- > >> kernel@vger.kernel.org; Wu, Hao <hao.wu@intel.com>; > >> matthew.gerlach@linux.intel.com > >> Subject: Re: [PATCH] fpga: dfl: improve configuration of dfl pci devices > >> > >> I think maybe we don't have to select them all. It is now possible for > >> FPGA DFL boards to work without FME or AFU, providing limited > >> functionality. It is possible designers trim the bitstream for their > >> purpose, and also need a smaller driver set. > >> > > Yes, we hope that this dfl-pci could be a common module shared by > > different cards. Some device doesn't have FME, e.g. some VF device > > with AFU only, some device has FME, but no PR support, and in the > > future, it's possible to add new modules, or something replacing AFU > > or FME, so we don't have to select all here. > > > >> I think we may add "default FPGA_DFL" for FPGA_DFL_FME, > >> FPGA_DFL_FME_MGR and others to make life easier. > > It's hard to say it's easier for everybody, e.g. I am a user of N3000, but > > I have to unselect the PR modules, as they are default Yes as proposed? > > Maybe it's better to let user select what they want, unless we find > > something really common needed under DFL framework. > > I get your point about n3000, but that card is not currently supported in the > public. Currently there is really only pac10, the 0x9c4 device. Once n3000 > (and d5005) is out, it will have several sub devices that will also so need to be > manually configured. While a developer of the n3000 will know which > subdevices are needed, someone just building the kernel will not. So would > expect there to be something like > > CONFIG_FPGA_DFL_N3000 > > select CONFIG_DFL_PCI > > select CONFIG_DFL_SUBDEV_1 > > .. How about non DFL sub modules? Do you mean it's going to select everything this card needs, including spi, ethernet, bmc and other components used on this card, as FPGA (e.g. N3000) is the only communication channel to them? > > On PF vs FP, yes only afu parts are needed. But i doubt anyone builds a VF > specific kernel. And if folks wanted to not use the fme parts they would not > have to load it's module at run time. It's possible to build a smaller image for virtual machine usage. > > I would like a top level config what auto selects all of the submodules needed > based on the card. I think maybe that is CONFIG_FPGA_DFL_PAC10. so we > will be ready for CONFIG_FPGA_DFL_N3000 and CONFIG_FPGA_DFL_D5005 > and what ever comes later. How about a reference kernel config listed somewhere (e.g. in kernel doc or some other public place) for them? Hao > > Tom > > > Hao > > ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] fpga: dfl: improve configuration of dfl pci devices 2020-06-28 15:18 [PATCH] fpga: dfl: improve configuration of dfl pci devices trix 2020-06-29 2:19 ` Xu Yilun @ 2020-06-29 12:38 ` kernel test robot 2020-06-29 19:22 ` kernel test robot 2 siblings, 0 replies; 7+ messages in thread From: kernel test robot @ 2020-06-29 12:38 UTC (permalink / raw) To: trix, mdf; +Cc: kbuild-all, linux-fpga, linux-kernel, Tom Rix [-- Attachment #1: Type: text/plain, Size: 34637 bytes --] Hi, Thank you for the patch! Yet something to improve: [auto build test ERROR on linus/master] [also build test ERROR on v5.8-rc3 next-20200629] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/0day-ci/linux/commits/trix-redhat-com/fpga-dfl-improve-configuration-of-dfl-pci-devices/20200628-231854 base: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 719fdd32921fb7e3208db8832d32ae1c2d68900f config: ia64-allmodconfig (attached as .config) compiler: ia64-linux-gcc (GCC) 9.3.0 reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=ia64 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> All error/warnings (new ones prefixed by >>): drivers/fpga/dfl-fme-perf.c: In function 'fme_perf_event_destroy': >> drivers/fpga/dfl-fme-perf.c:788:54: error: 'struct perf_event' has no member named 'hw' 788 | struct fme_perf_event_ops *ops = get_event_ops(event->hw.event_base); | ^~ In file included from include/linux/list.h:9, from include/linux/rculist.h:10, from include/linux/pid.h:5, from include/linux/sched.h:14, from include/linux/ptrace.h:6, from include/uapi/asm-generic/bpf_perf_event.h:4, from ./arch/ia64/include/generated/uapi/asm/bpf_perf_event.h:1, from include/uapi/linux/bpf_perf_event.h:11, from include/linux/perf_event.h:18, from drivers/fpga/dfl-fme-perf.c:19: >> drivers/fpga/dfl-fme-perf.c:789:53: error: 'struct perf_event' has no member named 'pmu' 789 | struct fme_perf_priv *priv = to_fme_perf_priv(event->pmu); | ^~ include/linux/kernel.h:1002:26: note: in definition of macro 'container_of' 1002 | void *__mptr = (void *)(ptr); \ | ^~~ >> drivers/fpga/dfl-fme-perf.c:789:31: note: in expansion of macro 'to_fme_perf_priv' 789 | struct fme_perf_priv *priv = to_fme_perf_priv(event->pmu); | ^~~~~~~~~~~~~~~~ In file included from include/uapi/linux/swab.h:6, from include/linux/swab.h:5, from include/uapi/linux/byteorder/little_endian.h:13, from include/linux/byteorder/little_endian.h:5, from arch/ia64/include/uapi/asm/byteorder.h:5, from include/uapi/linux/perf_event.h:20, from include/linux/perf_event.h:17, from drivers/fpga/dfl-fme-perf.c:19: >> drivers/fpga/dfl-fme-perf.c:789:53: error: 'struct perf_event' has no member named 'pmu' 789 | struct fme_perf_priv *priv = to_fme_perf_priv(event->pmu); | ^~ include/linux/compiler.h:372:9: note: in definition of macro '__compiletime_assert' 372 | if (!(condition)) \ | ^~~~~~~~~ include/linux/compiler.h:392:2: note: in expansion of macro '_compiletime_assert' 392 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) | ^~~~~~~~~~~~~~~~~~~ include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert' 39 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) | ^~~~~~~~~~~~~~~~~~ include/linux/kernel.h:1003:2: note: in expansion of macro 'BUILD_BUG_ON_MSG' 1003 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~~~~~~ include/linux/kernel.h:1003:20: note: in expansion of macro '__same_type' 1003 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~ >> drivers/fpga/dfl-fme-perf.c:176:32: note: in expansion of macro 'container_of' 176 | #define to_fme_perf_priv(_pmu) container_of(_pmu, struct fme_perf_priv, pmu) | ^~~~~~~~~~~~ >> drivers/fpga/dfl-fme-perf.c:789:31: note: in expansion of macro 'to_fme_perf_priv' 789 | struct fme_perf_priv *priv = to_fme_perf_priv(event->pmu); | ^~~~~~~~~~~~~~~~ >> drivers/fpga/dfl-fme-perf.c:789:53: error: 'struct perf_event' has no member named 'pmu' 789 | struct fme_perf_priv *priv = to_fme_perf_priv(event->pmu); | ^~ include/linux/compiler.h:372:9: note: in definition of macro '__compiletime_assert' 372 | if (!(condition)) \ | ^~~~~~~~~ include/linux/compiler.h:392:2: note: in expansion of macro '_compiletime_assert' 392 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) | ^~~~~~~~~~~~~~~~~~~ include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert' 39 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) | ^~~~~~~~~~~~~~~~~~ include/linux/kernel.h:1003:2: note: in expansion of macro 'BUILD_BUG_ON_MSG' 1003 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~~~~~~ include/linux/kernel.h:1004:6: note: in expansion of macro '__same_type' 1004 | !__same_type(*(ptr), void), \ | ^~~~~~~~~~~ >> drivers/fpga/dfl-fme-perf.c:176:32: note: in expansion of macro 'container_of' 176 | #define to_fme_perf_priv(_pmu) container_of(_pmu, struct fme_perf_priv, pmu) | ^~~~~~~~~~~~ >> drivers/fpga/dfl-fme-perf.c:789:31: note: in expansion of macro 'to_fme_perf_priv' 789 | struct fme_perf_priv *priv = to_fme_perf_priv(event->pmu); | ^~~~~~~~~~~~~~~~ drivers/fpga/dfl-fme-perf.c:792:33: error: 'struct perf_event' has no member named 'hw' 792 | ops->event_destroy(priv, event->hw.idx, event->hw.config_base); | ^~ drivers/fpga/dfl-fme-perf.c:792:48: error: 'struct perf_event' has no member named 'hw' 792 | ops->event_destroy(priv, event->hw.idx, event->hw.config_base); | ^~ In file included from include/linux/list.h:9, from include/linux/rculist.h:10, from include/linux/pid.h:5, from include/linux/sched.h:14, from include/linux/ptrace.h:6, from include/uapi/asm-generic/bpf_perf_event.h:4, from ./arch/ia64/include/generated/uapi/asm/bpf_perf_event.h:1, from include/uapi/linux/bpf_perf_event.h:11, from include/linux/perf_event.h:18, from drivers/fpga/dfl-fme-perf.c:19: drivers/fpga/dfl-fme-perf.c: In function 'fme_perf_event_init': drivers/fpga/dfl-fme-perf.c:797:53: error: 'struct perf_event' has no member named 'pmu' 797 | struct fme_perf_priv *priv = to_fme_perf_priv(event->pmu); | ^~ include/linux/kernel.h:1002:26: note: in definition of macro 'container_of' 1002 | void *__mptr = (void *)(ptr); \ | ^~~ drivers/fpga/dfl-fme-perf.c:797:31: note: in expansion of macro 'to_fme_perf_priv' 797 | struct fme_perf_priv *priv = to_fme_perf_priv(event->pmu); | ^~~~~~~~~~~~~~~~ In file included from include/uapi/linux/swab.h:6, from include/linux/swab.h:5, from include/uapi/linux/byteorder/little_endian.h:13, from include/linux/byteorder/little_endian.h:5, from arch/ia64/include/uapi/asm/byteorder.h:5, from include/uapi/linux/perf_event.h:20, from include/linux/perf_event.h:17, from drivers/fpga/dfl-fme-perf.c:19: drivers/fpga/dfl-fme-perf.c:797:53: error: 'struct perf_event' has no member named 'pmu' 797 | struct fme_perf_priv *priv = to_fme_perf_priv(event->pmu); | ^~ include/linux/compiler.h:372:9: note: in definition of macro '__compiletime_assert' 372 | if (!(condition)) \ | ^~~~~~~~~ include/linux/compiler.h:392:2: note: in expansion of macro '_compiletime_assert' 392 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) | ^~~~~~~~~~~~~~~~~~~ include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert' 39 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) | ^~~~~~~~~~~~~~~~~~ include/linux/kernel.h:1003:2: note: in expansion of macro 'BUILD_BUG_ON_MSG' 1003 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~~~~~~ include/linux/kernel.h:1003:20: note: in expansion of macro '__same_type' 1003 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~ >> drivers/fpga/dfl-fme-perf.c:176:32: note: in expansion of macro 'container_of' 176 | #define to_fme_perf_priv(_pmu) container_of(_pmu, struct fme_perf_priv, pmu) | ^~~~~~~~~~~~ drivers/fpga/dfl-fme-perf.c:797:31: note: in expansion of macro 'to_fme_perf_priv' 797 | struct fme_perf_priv *priv = to_fme_perf_priv(event->pmu); | ^~~~~~~~~~~~~~~~ drivers/fpga/dfl-fme-perf.c:797:53: error: 'struct perf_event' has no member named 'pmu' 797 | struct fme_perf_priv *priv = to_fme_perf_priv(event->pmu); | ^~ include/linux/compiler.h:372:9: note: in definition of macro '__compiletime_assert' 372 | if (!(condition)) \ | ^~~~~~~~~ include/linux/compiler.h:392:2: note: in expansion of macro '_compiletime_assert' 392 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) | ^~~~~~~~~~~~~~~~~~~ include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert' 39 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) | ^~~~~~~~~~~~~~~~~~ include/linux/kernel.h:1003:2: note: in expansion of macro 'BUILD_BUG_ON_MSG' 1003 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~~~~~~ include/linux/kernel.h:1004:6: note: in expansion of macro '__same_type' 1004 | !__same_type(*(ptr), void), \ | ^~~~~~~~~~~ >> drivers/fpga/dfl-fme-perf.c:176:32: note: in expansion of macro 'container_of' 176 | #define to_fme_perf_priv(_pmu) container_of(_pmu, struct fme_perf_priv, pmu) | ^~~~~~~~~~~~ drivers/fpga/dfl-fme-perf.c:797:31: note: in expansion of macro 'to_fme_perf_priv' 797 | struct fme_perf_priv *priv = to_fme_perf_priv(event->pmu); | ^~~~~~~~~~~~~~~~ drivers/fpga/dfl-fme-perf.c:798:36: error: 'struct perf_event' has no member named 'hw' 798 | struct hw_perf_event *hwc = &event->hw; | ^~ >> drivers/fpga/dfl-fme-perf.c:803:11: error: 'struct perf_event' has no member named 'attr' 803 | if (event->attr.type != event->pmu->type) | ^~ drivers/fpga/dfl-fme-perf.c:803:31: error: 'struct perf_event' has no member named 'pmu' 803 | if (event->attr.type != event->pmu->type) | ^~ >> drivers/fpga/dfl-fme-perf.c:811:6: error: implicit declaration of function 'is_sampling_event' [-Werror=implicit-function-declaration] 811 | if (is_sampling_event(event) || event->attach_state & PERF_ATTACH_TASK) | ^~~~~~~~~~~~~~~~~ >> drivers/fpga/dfl-fme-perf.c:811:39: error: 'struct perf_event' has no member named 'attach_state' 811 | if (is_sampling_event(event) || event->attach_state & PERF_ATTACH_TASK) | ^~ >> drivers/fpga/dfl-fme-perf.c:814:11: error: 'struct perf_event' has no member named 'cpu' 814 | if (event->cpu < 0) | ^~ drivers/fpga/dfl-fme-perf.c:817:11: error: 'struct perf_event' has no member named 'cpu' 817 | if (event->cpu != priv->cpu) | ^~ In file included from include/uapi/linux/swab.h:6, from include/linux/swab.h:5, from include/uapi/linux/byteorder/little_endian.h:13, from include/linux/byteorder/little_endian.h:5, from arch/ia64/include/uapi/asm/byteorder.h:5, from include/uapi/linux/perf_event.h:20, from include/linux/perf_event.h:17, from drivers/fpga/dfl-fme-perf.c:19: drivers/fpga/dfl-fme-perf.c:820:27: error: 'struct perf_event' has no member named 'attr' 820 | eventid = get_event(event->attr.config); | ^~ include/linux/compiler.h:372:9: note: in definition of macro '__compiletime_assert' 372 | if (!(condition)) \ | ^~~~~~~~~ include/linux/compiler.h:392:2: note: in expansion of macro '_compiletime_assert' 392 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) | ^~~~~~~~~~~~~~~~~~~ include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert' 39 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) | ^~~~~~~~~~~~~~~~~~ include/linux/bitfield.h:52:3: note: in expansion of macro 'BUILD_BUG_ON_MSG' 52 | BUILD_BUG_ON_MSG((_mask) > (typeof(_reg))~0ull, \ | ^~~~~~~~~~~~~~~~ include/linux/bitfield.h:108:3: note: in expansion of macro '__BF_FIELD_CHECK' 108 | __BF_FIELD_CHECK(_mask, _reg, 0U, "FIELD_GET: "); \ | ^~~~~~~~~~~~~~~~ >> drivers/fpga/dfl-fme-perf.c:213:28: note: in expansion of macro 'FIELD_GET' 213 | #define get_event(_config) FIELD_GET(FME_EVENT_MASK, _config) | ^~~~~~~~~ >> drivers/fpga/dfl-fme-perf.c:820:12: note: in expansion of macro 'get_event' 820 | eventid = get_event(event->attr.config); | ^~~~~~~~~ In file included from drivers/fpga/dfl.h:17, from drivers/fpga/dfl-fme-perf.c:20: drivers/fpga/dfl-fme-perf.c:820:27: error: 'struct perf_event' has no member named 'attr' 820 | eventid = get_event(event->attr.config); | ^~ include/linux/bitfield.h:109:21: note: in definition of macro 'FIELD_GET' 109 | (typeof(_mask))(((_reg) & (_mask)) >> __bf_shf(_mask)); \ | ^~~~ >> drivers/fpga/dfl-fme-perf.c:820:12: note: in expansion of macro 'get_event' 820 | eventid = get_event(event->attr.config); | ^~~~~~~~~ In file included from include/uapi/linux/swab.h:6, from include/linux/swab.h:5, from include/uapi/linux/byteorder/little_endian.h:13, from include/linux/byteorder/little_endian.h:5, from arch/ia64/include/uapi/asm/byteorder.h:5, from include/uapi/linux/perf_event.h:20, from include/linux/perf_event.h:17, from drivers/fpga/dfl-fme-perf.c:19: drivers/fpga/dfl-fme-perf.c:821:27: error: 'struct perf_event' has no member named 'attr' 821 | portid = get_portid(event->attr.config); | ^~ include/linux/compiler.h:372:9: note: in definition of macro '__compiletime_assert' 372 | if (!(condition)) \ | ^~~~~~~~~ include/linux/compiler.h:392:2: note: in expansion of macro '_compiletime_assert' 392 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) | ^~~~~~~~~~~~~~~~~~~ include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert' 39 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) | ^~~~~~~~~~~~~~~~~~ include/linux/bitfield.h:52:3: note: in expansion of macro 'BUILD_BUG_ON_MSG' 52 | BUILD_BUG_ON_MSG((_mask) > (typeof(_reg))~0ull, \ | ^~~~~~~~~~~~~~~~ include/linux/bitfield.h:108:3: note: in expansion of macro '__BF_FIELD_CHECK' 108 | __BF_FIELD_CHECK(_mask, _reg, 0U, "FIELD_GET: "); \ | ^~~~~~~~~~~~~~~~ drivers/fpga/dfl-fme-perf.c:215:29: note: in expansion of macro 'FIELD_GET' 215 | #define get_portid(_config) FIELD_GET(FME_PORTID_MASK, _config) | ^~~~~~~~~ >> drivers/fpga/dfl-fme-perf.c:821:11: note: in expansion of macro 'get_portid' 821 | portid = get_portid(event->attr.config); | ^~~~~~~~~~ In file included from drivers/fpga/dfl.h:17, from drivers/fpga/dfl-fme-perf.c:20: drivers/fpga/dfl-fme-perf.c:821:27: error: 'struct perf_event' has no member named 'attr' 821 | portid = get_portid(event->attr.config); | ^~ include/linux/bitfield.h:109:21: note: in definition of macro 'FIELD_GET' 109 | (typeof(_mask))(((_reg) & (_mask)) >> __bf_shf(_mask)); \ | ^~~~ >> drivers/fpga/dfl-fme-perf.c:821:11: note: in expansion of macro 'get_portid' 821 | portid = get_portid(event->attr.config); | ^~~~~~~~~~ In file included from include/uapi/linux/swab.h:6, from include/linux/swab.h:5, from include/uapi/linux/byteorder/little_endian.h:13, from include/linux/byteorder/little_endian.h:5, from arch/ia64/include/uapi/asm/byteorder.h:5, from include/uapi/linux/perf_event.h:20, from include/linux/perf_event.h:17, from drivers/fpga/dfl-fme-perf.c:19: drivers/fpga/dfl-fme-perf.c:822:27: error: 'struct perf_event' has no member named 'attr' 822 | evtype = get_evtype(event->attr.config); | ^~ include/linux/compiler.h:372:9: note: in definition of macro '__compiletime_assert' 372 | if (!(condition)) \ | ^~~~~~~~~ include/linux/compiler.h:392:2: note: in expansion of macro '_compiletime_assert' 392 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) | ^~~~~~~~~~~~~~~~~~~ include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert' 39 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) | ^~~~~~~~~~~~~~~~~~ include/linux/bitfield.h:52:3: note: in expansion of macro 'BUILD_BUG_ON_MSG' 52 | BUILD_BUG_ON_MSG((_mask) > (typeof(_reg))~0ull, \ | ^~~~~~~~~~~~~~~~ include/linux/bitfield.h:108:3: note: in expansion of macro '__BF_FIELD_CHECK' 108 | __BF_FIELD_CHECK(_mask, _reg, 0U, "FIELD_GET: "); \ | ^~~~~~~~~~~~~~~~ drivers/fpga/dfl-fme-perf.c:214:29: note: in expansion of macro 'FIELD_GET' 214 | #define get_evtype(_config) FIELD_GET(FME_EVTYPE_MASK, _config) | ^~~~~~~~~ drivers/fpga/dfl-fme-perf.c:822:11: note: in expansion of macro 'get_evtype' 822 | evtype = get_evtype(event->attr.config); | ^~~~~~~~~~ In file included from drivers/fpga/dfl.h:17, from drivers/fpga/dfl-fme-perf.c:20: drivers/fpga/dfl-fme-perf.c:822:27: error: 'struct perf_event' has no member named 'attr' 822 | evtype = get_evtype(event->attr.config); | ^~ include/linux/bitfield.h:109:21: note: in definition of macro 'FIELD_GET' 109 | (typeof(_mask))(((_reg) & (_mask)) >> __bf_shf(_mask)); \ | ^~~~ drivers/fpga/dfl-fme-perf.c:822:11: note: in expansion of macro 'get_evtype' 822 | evtype = get_evtype(event->attr.config); | ^~~~~~~~~~ drivers/fpga/dfl-fme-perf.c:826:5: error: 'struct hw_perf_event' has no member named 'event_base' 826 | hwc->event_base = evtype; | ^~ drivers/fpga/dfl-fme-perf.c:827:5: error: 'struct hw_perf_event' has no member named 'idx' 827 | hwc->idx = (int)eventid; | ^~ drivers/fpga/dfl-fme-perf.c:828:5: error: 'struct hw_perf_event' has no member named 'config_base' 828 | hwc->config_base = portid; | ^~ drivers/fpga/dfl-fme-perf.c:830:7: error: 'struct perf_event' has no member named 'destroy' 830 | event->destroy = fme_perf_event_destroy; | ^~ drivers/fpga/dfl-fme-perf.c: In function 'fme_perf_event_update': drivers/fpga/dfl-fme-perf.c:844:54: error: 'struct perf_event' has no member named 'hw' 844 | struct fme_perf_event_ops *ops = get_event_ops(event->hw.event_base); | ^~ In file included from include/linux/list.h:9, from include/linux/rculist.h:10, from include/linux/pid.h:5, from include/linux/sched.h:14, from include/linux/ptrace.h:6, from include/uapi/asm-generic/bpf_perf_event.h:4, from ./arch/ia64/include/generated/uapi/asm/bpf_perf_event.h:1, from include/uapi/linux/bpf_perf_event.h:11, from include/linux/perf_event.h:18, from drivers/fpga/dfl-fme-perf.c:19: drivers/fpga/dfl-fme-perf.c:845:53: error: 'struct perf_event' has no member named 'pmu' 845 | struct fme_perf_priv *priv = to_fme_perf_priv(event->pmu); | ^~ include/linux/kernel.h:1002:26: note: in definition of macro 'container_of' 1002 | void *__mptr = (void *)(ptr); \ | ^~~ drivers/fpga/dfl-fme-perf.c:845:31: note: in expansion of macro 'to_fme_perf_priv' 845 | struct fme_perf_priv *priv = to_fme_perf_priv(event->pmu); | ^~~~~~~~~~~~~~~~ In file included from include/uapi/linux/swab.h:6, from include/linux/swab.h:5, from include/uapi/linux/byteorder/little_endian.h:13, from include/linux/byteorder/little_endian.h:5, from arch/ia64/include/uapi/asm/byteorder.h:5, from include/uapi/linux/perf_event.h:20, from include/linux/perf_event.h:17, from drivers/fpga/dfl-fme-perf.c:19: drivers/fpga/dfl-fme-perf.c:845:53: error: 'struct perf_event' has no member named 'pmu' 845 | struct fme_perf_priv *priv = to_fme_perf_priv(event->pmu); | ^~ include/linux/compiler.h:372:9: note: in definition of macro '__compiletime_assert' 372 | if (!(condition)) \ | ^~~~~~~~~ include/linux/compiler.h:392:2: note: in expansion of macro '_compiletime_assert' 392 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) | ^~~~~~~~~~~~~~~~~~~ include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert' 39 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) | ^~~~~~~~~~~~~~~~~~ vim +788 drivers/fpga/dfl-fme-perf.c 724142f8c42a7b Wu Hao 2020-04-27 785 724142f8c42a7b Wu Hao 2020-04-27 786 static void fme_perf_event_destroy(struct perf_event *event) 724142f8c42a7b Wu Hao 2020-04-27 787 { 724142f8c42a7b Wu Hao 2020-04-27 @788 struct fme_perf_event_ops *ops = get_event_ops(event->hw.event_base); 724142f8c42a7b Wu Hao 2020-04-27 @789 struct fme_perf_priv *priv = to_fme_perf_priv(event->pmu); 724142f8c42a7b Wu Hao 2020-04-27 790 724142f8c42a7b Wu Hao 2020-04-27 791 if (ops->event_destroy) 724142f8c42a7b Wu Hao 2020-04-27 792 ops->event_destroy(priv, event->hw.idx, event->hw.config_base); 724142f8c42a7b Wu Hao 2020-04-27 793 } 724142f8c42a7b Wu Hao 2020-04-27 794 724142f8c42a7b Wu Hao 2020-04-27 795 static int fme_perf_event_init(struct perf_event *event) 724142f8c42a7b Wu Hao 2020-04-27 796 { 724142f8c42a7b Wu Hao 2020-04-27 797 struct fme_perf_priv *priv = to_fme_perf_priv(event->pmu); 724142f8c42a7b Wu Hao 2020-04-27 @798 struct hw_perf_event *hwc = &event->hw; 724142f8c42a7b Wu Hao 2020-04-27 799 struct fme_perf_event_ops *ops; 724142f8c42a7b Wu Hao 2020-04-27 800 u32 eventid, evtype, portid; 724142f8c42a7b Wu Hao 2020-04-27 801 724142f8c42a7b Wu Hao 2020-04-27 802 /* test the event attr type check for PMU enumeration */ 724142f8c42a7b Wu Hao 2020-04-27 @803 if (event->attr.type != event->pmu->type) 724142f8c42a7b Wu Hao 2020-04-27 804 return -ENOENT; 724142f8c42a7b Wu Hao 2020-04-27 805 724142f8c42a7b Wu Hao 2020-04-27 806 /* 724142f8c42a7b Wu Hao 2020-04-27 807 * fme counters are shared across all cores. 724142f8c42a7b Wu Hao 2020-04-27 808 * Therefore, it does not support per-process mode. 724142f8c42a7b Wu Hao 2020-04-27 809 * Also, it does not support event sampling mode. 724142f8c42a7b Wu Hao 2020-04-27 810 */ 724142f8c42a7b Wu Hao 2020-04-27 @811 if (is_sampling_event(event) || event->attach_state & PERF_ATTACH_TASK) 724142f8c42a7b Wu Hao 2020-04-27 812 return -EINVAL; 724142f8c42a7b Wu Hao 2020-04-27 813 724142f8c42a7b Wu Hao 2020-04-27 @814 if (event->cpu < 0) 724142f8c42a7b Wu Hao 2020-04-27 815 return -EINVAL; 724142f8c42a7b Wu Hao 2020-04-27 816 724142f8c42a7b Wu Hao 2020-04-27 817 if (event->cpu != priv->cpu) 724142f8c42a7b Wu Hao 2020-04-27 818 return -EINVAL; 724142f8c42a7b Wu Hao 2020-04-27 819 724142f8c42a7b Wu Hao 2020-04-27 @820 eventid = get_event(event->attr.config); 724142f8c42a7b Wu Hao 2020-04-27 @821 portid = get_portid(event->attr.config); 724142f8c42a7b Wu Hao 2020-04-27 @822 evtype = get_evtype(event->attr.config); 724142f8c42a7b Wu Hao 2020-04-27 823 if (evtype > FME_EVTYPE_MAX) 724142f8c42a7b Wu Hao 2020-04-27 824 return -EINVAL; 724142f8c42a7b Wu Hao 2020-04-27 825 724142f8c42a7b Wu Hao 2020-04-27 @826 hwc->event_base = evtype; 724142f8c42a7b Wu Hao 2020-04-27 @827 hwc->idx = (int)eventid; 724142f8c42a7b Wu Hao 2020-04-27 @828 hwc->config_base = portid; 724142f8c42a7b Wu Hao 2020-04-27 829 724142f8c42a7b Wu Hao 2020-04-27 @830 event->destroy = fme_perf_event_destroy; 724142f8c42a7b Wu Hao 2020-04-27 831 724142f8c42a7b Wu Hao 2020-04-27 832 dev_dbg(priv->dev, "%s event=0x%x, evtype=0x%x, portid=0x%x,\n", 724142f8c42a7b Wu Hao 2020-04-27 833 __func__, eventid, evtype, portid); 724142f8c42a7b Wu Hao 2020-04-27 834 724142f8c42a7b Wu Hao 2020-04-27 835 ops = get_event_ops(evtype); 724142f8c42a7b Wu Hao 2020-04-27 836 if (ops->event_init) 724142f8c42a7b Wu Hao 2020-04-27 837 return ops->event_init(priv, eventid, portid); 724142f8c42a7b Wu Hao 2020-04-27 838 724142f8c42a7b Wu Hao 2020-04-27 839 return 0; 724142f8c42a7b Wu Hao 2020-04-27 840 } 724142f8c42a7b Wu Hao 2020-04-27 841 724142f8c42a7b Wu Hao 2020-04-27 842 static void fme_perf_event_update(struct perf_event *event) 724142f8c42a7b Wu Hao 2020-04-27 843 { 724142f8c42a7b Wu Hao 2020-04-27 844 struct fme_perf_event_ops *ops = get_event_ops(event->hw.event_base); 724142f8c42a7b Wu Hao 2020-04-27 845 struct fme_perf_priv *priv = to_fme_perf_priv(event->pmu); 724142f8c42a7b Wu Hao 2020-04-27 846 struct hw_perf_event *hwc = &event->hw; 724142f8c42a7b Wu Hao 2020-04-27 847 u64 now, prev, delta; 724142f8c42a7b Wu Hao 2020-04-27 848 724142f8c42a7b Wu Hao 2020-04-27 849 now = ops->read_counter(priv, (u32)hwc->idx, hwc->config_base); 724142f8c42a7b Wu Hao 2020-04-27 @850 prev = local64_read(&hwc->prev_count); 724142f8c42a7b Wu Hao 2020-04-27 851 delta = now - prev; 724142f8c42a7b Wu Hao 2020-04-27 852 724142f8c42a7b Wu Hao 2020-04-27 @853 local64_add(delta, &event->count); 724142f8c42a7b Wu Hao 2020-04-27 854 } 724142f8c42a7b Wu Hao 2020-04-27 855 724142f8c42a7b Wu Hao 2020-04-27 856 static void fme_perf_event_start(struct perf_event *event, int flags) 724142f8c42a7b Wu Hao 2020-04-27 857 { 724142f8c42a7b Wu Hao 2020-04-27 858 struct fme_perf_event_ops *ops = get_event_ops(event->hw.event_base); 724142f8c42a7b Wu Hao 2020-04-27 859 struct fme_perf_priv *priv = to_fme_perf_priv(event->pmu); 724142f8c42a7b Wu Hao 2020-04-27 860 struct hw_perf_event *hwc = &event->hw; 724142f8c42a7b Wu Hao 2020-04-27 861 u64 count; 724142f8c42a7b Wu Hao 2020-04-27 862 724142f8c42a7b Wu Hao 2020-04-27 863 count = ops->read_counter(priv, (u32)hwc->idx, hwc->config_base); 724142f8c42a7b Wu Hao 2020-04-27 @864 local64_set(&hwc->prev_count, count); 724142f8c42a7b Wu Hao 2020-04-27 865 } 724142f8c42a7b Wu Hao 2020-04-27 866 724142f8c42a7b Wu Hao 2020-04-27 867 static void fme_perf_event_stop(struct perf_event *event, int flags) 724142f8c42a7b Wu Hao 2020-04-27 868 { 724142f8c42a7b Wu Hao 2020-04-27 869 fme_perf_event_update(event); 724142f8c42a7b Wu Hao 2020-04-27 870 } 724142f8c42a7b Wu Hao 2020-04-27 871 724142f8c42a7b Wu Hao 2020-04-27 872 static int fme_perf_event_add(struct perf_event *event, int flags) 724142f8c42a7b Wu Hao 2020-04-27 873 { 724142f8c42a7b Wu Hao 2020-04-27 874 if (flags & PERF_EF_START) 724142f8c42a7b Wu Hao 2020-04-27 875 fme_perf_event_start(event, flags); 724142f8c42a7b Wu Hao 2020-04-27 876 724142f8c42a7b Wu Hao 2020-04-27 877 return 0; 724142f8c42a7b Wu Hao 2020-04-27 878 } 724142f8c42a7b Wu Hao 2020-04-27 879 724142f8c42a7b Wu Hao 2020-04-27 880 static void fme_perf_event_del(struct perf_event *event, int flags) 724142f8c42a7b Wu Hao 2020-04-27 881 { 724142f8c42a7b Wu Hao 2020-04-27 882 fme_perf_event_stop(event, PERF_EF_UPDATE); 724142f8c42a7b Wu Hao 2020-04-27 883 } 724142f8c42a7b Wu Hao 2020-04-27 884 724142f8c42a7b Wu Hao 2020-04-27 885 static void fme_perf_event_read(struct perf_event *event) 724142f8c42a7b Wu Hao 2020-04-27 886 { 724142f8c42a7b Wu Hao 2020-04-27 887 fme_perf_event_update(event); 724142f8c42a7b Wu Hao 2020-04-27 888 } 724142f8c42a7b Wu Hao 2020-04-27 889 724142f8c42a7b Wu Hao 2020-04-27 890 static void fme_perf_setup_hardware(struct fme_perf_priv *priv) 724142f8c42a7b Wu Hao 2020-04-27 891 { 724142f8c42a7b Wu Hao 2020-04-27 892 void __iomem *base = priv->ioaddr; 724142f8c42a7b Wu Hao 2020-04-27 893 u64 v; 724142f8c42a7b Wu Hao 2020-04-27 894 724142f8c42a7b Wu Hao 2020-04-27 895 /* read and save current working mode for fabric counters */ 724142f8c42a7b Wu Hao 2020-04-27 896 v = readq(base + FAB_CTRL); 724142f8c42a7b Wu Hao 2020-04-27 897 724142f8c42a7b Wu Hao 2020-04-27 898 if (FIELD_GET(FAB_PORT_FILTER, v) == FAB_PORT_FILTER_DISABLE) 724142f8c42a7b Wu Hao 2020-04-27 899 priv->fab_port_id = FME_PORTID_ROOT; 724142f8c42a7b Wu Hao 2020-04-27 900 else 724142f8c42a7b Wu Hao 2020-04-27 901 priv->fab_port_id = FIELD_GET(FAB_PORT_ID, v); 724142f8c42a7b Wu Hao 2020-04-27 902 } 724142f8c42a7b Wu Hao 2020-04-27 903 724142f8c42a7b Wu Hao 2020-04-27 904 static int fme_perf_pmu_register(struct platform_device *pdev, 724142f8c42a7b Wu Hao 2020-04-27 905 struct fme_perf_priv *priv) 724142f8c42a7b Wu Hao 2020-04-27 906 { 724142f8c42a7b Wu Hao 2020-04-27 907 struct pmu *pmu = &priv->pmu; 724142f8c42a7b Wu Hao 2020-04-27 908 char *name; 724142f8c42a7b Wu Hao 2020-04-27 909 int ret; 724142f8c42a7b Wu Hao 2020-04-27 910 724142f8c42a7b Wu Hao 2020-04-27 911 spin_lock_init(&priv->fab_lock); 724142f8c42a7b Wu Hao 2020-04-27 912 724142f8c42a7b Wu Hao 2020-04-27 913 fme_perf_setup_hardware(priv); 724142f8c42a7b Wu Hao 2020-04-27 914 724142f8c42a7b Wu Hao 2020-04-27 915 pmu->task_ctx_nr = perf_invalid_context; 724142f8c42a7b Wu Hao 2020-04-27 916 pmu->attr_groups = fme_perf_groups; 724142f8c42a7b Wu Hao 2020-04-27 917 pmu->attr_update = fme_perf_events_groups; 724142f8c42a7b Wu Hao 2020-04-27 918 pmu->event_init = fme_perf_event_init; 724142f8c42a7b Wu Hao 2020-04-27 919 pmu->add = fme_perf_event_add; 724142f8c42a7b Wu Hao 2020-04-27 920 pmu->del = fme_perf_event_del; 724142f8c42a7b Wu Hao 2020-04-27 921 pmu->start = fme_perf_event_start; 724142f8c42a7b Wu Hao 2020-04-27 922 pmu->stop = fme_perf_event_stop; 724142f8c42a7b Wu Hao 2020-04-27 923 pmu->read = fme_perf_event_read; 724142f8c42a7b Wu Hao 2020-04-27 924 pmu->capabilities = PERF_PMU_CAP_NO_INTERRUPT | 724142f8c42a7b Wu Hao 2020-04-27 925 PERF_PMU_CAP_NO_EXCLUDE; 724142f8c42a7b Wu Hao 2020-04-27 926 724142f8c42a7b Wu Hao 2020-04-27 927 name = devm_kasprintf(priv->dev, GFP_KERNEL, "dfl_fme%d", pdev->id); 724142f8c42a7b Wu Hao 2020-04-27 928 724142f8c42a7b Wu Hao 2020-04-27 @929 ret = perf_pmu_register(pmu, name, -1); 724142f8c42a7b Wu Hao 2020-04-27 930 if (ret) 724142f8c42a7b Wu Hao 2020-04-27 931 return ret; 724142f8c42a7b Wu Hao 2020-04-27 932 724142f8c42a7b Wu Hao 2020-04-27 933 return 0; 724142f8c42a7b Wu Hao 2020-04-27 934 } 724142f8c42a7b Wu Hao 2020-04-27 935 724142f8c42a7b Wu Hao 2020-04-27 936 static void fme_perf_pmu_unregister(struct fme_perf_priv *priv) 724142f8c42a7b Wu Hao 2020-04-27 937 { 724142f8c42a7b Wu Hao 2020-04-27 @938 perf_pmu_unregister(&priv->pmu); 724142f8c42a7b Wu Hao 2020-04-27 939 } 724142f8c42a7b Wu Hao 2020-04-27 940 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org [-- Attachment #2: .config.gz --] [-- Type: application/gzip, Size: 61096 bytes --] ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] fpga: dfl: improve configuration of dfl pci devices 2020-06-28 15:18 [PATCH] fpga: dfl: improve configuration of dfl pci devices trix 2020-06-29 2:19 ` Xu Yilun 2020-06-29 12:38 ` kernel test robot @ 2020-06-29 19:22 ` kernel test robot 2 siblings, 0 replies; 7+ messages in thread From: kernel test robot @ 2020-06-29 19:22 UTC (permalink / raw) To: trix, mdf; +Cc: kbuild-all, linux-fpga, linux-kernel, Tom Rix [-- Attachment #1: Type: text/plain, Size: 15964 bytes --] Hi, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on linus/master] [also build test WARNING on v5.8-rc3 next-20200629] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/0day-ci/linux/commits/trix-redhat-com/fpga-dfl-improve-configuration-of-dfl-pci-devices/20200628-231854 base: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 719fdd32921fb7e3208db8832d32ae1c2d68900f config: s390-randconfig-s031-20200629 (attached as .config) compiler: s390-linux-gcc (GCC) 9.3.0 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # apt-get install sparse # sparse version: v0.6.2-3-gfa153962-dirty # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross C= CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' ARCH=s390 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> sparse warnings: (new ones prefixed by >>) drivers/fpga/dfl-fme-perf.c:788:61: sparse: sparse: using member 'hw' in incomplete struct perf_event drivers/fpga/dfl-fme-perf.c:789:38: sparse: sparse: using member 'pmu' in incomplete struct perf_event >> drivers/fpga/dfl-fme-perf.c:789:38: sparse: sparse: cast from unknown type drivers/fpga/dfl-fme-perf.c:789:38: sparse: sparse: using member 'pmu' in incomplete struct perf_event drivers/fpga/dfl-fme-perf.c:789:38: sparse: sparse: using member 'pmu' in incomplete struct perf_event drivers/fpga/dfl-fme-perf.c:792:47: sparse: sparse: using member 'hw' in incomplete struct perf_event drivers/fpga/dfl-fme-perf.c:797:38: sparse: sparse: using member 'pmu' in incomplete struct perf_event drivers/fpga/dfl-fme-perf.c:797:38: sparse: sparse: cast from unknown type drivers/fpga/dfl-fme-perf.c:797:38: sparse: sparse: using member 'pmu' in incomplete struct perf_event drivers/fpga/dfl-fme-perf.c:797:38: sparse: sparse: using member 'pmu' in incomplete struct perf_event drivers/fpga/dfl-fme-perf.c:798:43: sparse: sparse: using member 'hw' in incomplete struct perf_event drivers/fpga/dfl-fme-perf.c:803:18: sparse: sparse: using member 'attr' in incomplete struct perf_event drivers/fpga/dfl-fme-perf.c:803:38: sparse: sparse: using member 'pmu' in incomplete struct perf_event drivers/fpga/dfl-fme-perf.c:811:13: sparse: sparse: undefined identifier 'is_sampling_event' drivers/fpga/dfl-fme-perf.c:814:18: sparse: sparse: using member 'cpu' in incomplete struct perf_event drivers/fpga/dfl-fme-perf.c:817:18: sparse: sparse: using member 'cpu' in incomplete struct perf_event drivers/fpga/dfl-fme-perf.c:820:19: sparse: sparse: using member 'attr' in incomplete struct perf_event >> drivers/fpga/dfl-fme-perf.c:820:19: sparse: sparse: incompatible types for operation (>): >> drivers/fpga/dfl-fme-perf.c:820:19: sparse: unsigned long long >> drivers/fpga/dfl-fme-perf.c:820:19: sparse: bad type drivers/fpga/dfl-fme-perf.c:820:19: sparse: sparse: using member 'attr' in incomplete struct perf_event drivers/fpga/dfl-fme-perf.c:820:19: sparse: sparse: cast from unknown type drivers/fpga/dfl-fme-perf.c:821:18: sparse: sparse: using member 'attr' in incomplete struct perf_event drivers/fpga/dfl-fme-perf.c:821:18: sparse: sparse: incompatible types for operation (>): drivers/fpga/dfl-fme-perf.c:821:18: sparse: unsigned long long drivers/fpga/dfl-fme-perf.c:821:18: sparse: bad type drivers/fpga/dfl-fme-perf.c:821:18: sparse: sparse: using member 'attr' in incomplete struct perf_event drivers/fpga/dfl-fme-perf.c:821:18: sparse: sparse: cast from unknown type drivers/fpga/dfl-fme-perf.c:822:18: sparse: sparse: using member 'attr' in incomplete struct perf_event drivers/fpga/dfl-fme-perf.c:822:18: sparse: sparse: incompatible types for operation (>): drivers/fpga/dfl-fme-perf.c:822:18: sparse: unsigned long long drivers/fpga/dfl-fme-perf.c:822:18: sparse: bad type drivers/fpga/dfl-fme-perf.c:822:18: sparse: sparse: using member 'attr' in incomplete struct perf_event drivers/fpga/dfl-fme-perf.c:822:18: sparse: sparse: cast from unknown type drivers/fpga/dfl-fme-perf.c:826:12: sparse: sparse: using member 'event_base' in incomplete struct hw_perf_event drivers/fpga/dfl-fme-perf.c:827:12: sparse: sparse: using member 'idx' in incomplete struct hw_perf_event drivers/fpga/dfl-fme-perf.c:828:12: sparse: sparse: using member 'config_base' in incomplete struct hw_perf_event drivers/fpga/dfl-fme-perf.c:830:14: sparse: sparse: using member 'destroy' in incomplete struct perf_event drivers/fpga/dfl-fme-perf.c:844:61: sparse: sparse: using member 'hw' in incomplete struct perf_event drivers/fpga/dfl-fme-perf.c:845:38: sparse: sparse: using member 'pmu' in incomplete struct perf_event drivers/fpga/dfl-fme-perf.c:845:38: sparse: sparse: cast from unknown type drivers/fpga/dfl-fme-perf.c:845:38: sparse: sparse: using member 'pmu' in incomplete struct perf_event drivers/fpga/dfl-fme-perf.c:845:38: sparse: sparse: using member 'pmu' in incomplete struct perf_event drivers/fpga/dfl-fme-perf.c:846:43: sparse: sparse: using member 'hw' in incomplete struct perf_event drivers/fpga/dfl-fme-perf.c:849:47: sparse: sparse: using member 'idx' in incomplete struct hw_perf_event drivers/fpga/dfl-fme-perf.c:849:57: sparse: sparse: using member 'config_base' in incomplete struct hw_perf_event drivers/fpga/dfl-fme-perf.c:850:16: sparse: sparse: using member 'prev_count' in incomplete struct hw_perf_event drivers/fpga/dfl-fme-perf.c:853:9: sparse: sparse: using member 'count' in incomplete struct perf_event drivers/fpga/dfl-fme-perf.c:858:61: sparse: sparse: using member 'hw' in incomplete struct perf_event drivers/fpga/dfl-fme-perf.c:859:38: sparse: sparse: using member 'pmu' in incomplete struct perf_event drivers/fpga/dfl-fme-perf.c:859:38: sparse: sparse: cast from unknown type drivers/fpga/dfl-fme-perf.c:859:38: sparse: sparse: using member 'pmu' in incomplete struct perf_event drivers/fpga/dfl-fme-perf.c:859:38: sparse: sparse: using member 'pmu' in incomplete struct perf_event drivers/fpga/dfl-fme-perf.c:860:43: sparse: sparse: using member 'hw' in incomplete struct perf_event drivers/fpga/dfl-fme-perf.c:863:49: sparse: sparse: using member 'idx' in incomplete struct hw_perf_event drivers/fpga/dfl-fme-perf.c:863:59: sparse: sparse: using member 'config_base' in incomplete struct hw_perf_event drivers/fpga/dfl-fme-perf.c:864:9: sparse: sparse: using member 'prev_count' in incomplete struct hw_perf_event drivers/fpga/dfl-fme-perf.c:929:15: sparse: sparse: undefined identifier 'perf_pmu_register' drivers/fpga/dfl-fme-perf.c:938:9: sparse: sparse: undefined identifier 'perf_pmu_unregister' include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:179:15: sparse: sparse: cast to restricted __le32 include/asm-generic/io.h:179:15: sparse: sparse: cast to restricted __le32 include/asm-generic/io.h:179:15: sparse: sparse: cast to restricted __le32 include/asm-generic/io.h:179:15: sparse: sparse: cast to restricted __le32 include/asm-generic/io.h:179:15: sparse: sparse: cast to restricted __le32 include/asm-generic/io.h:179:15: sparse: sparse: cast to restricted __le32 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:236:22: sparse: sparse: incorrect type in argument 1 (different base types) @@ expected unsigned long long [usertype] val @@ got restricted __le64 [usertype] @@ include/asm-generic/io.h:236:22: sparse: expected unsigned long long [usertype] val include/asm-generic/io.h:236:22: sparse: got restricted __le64 [usertype] include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:193:15: sparse: sparse: cast to restricted __le64 include/asm-generic/io.h:236:22: sparse: sparse: incorrect type in argument 1 (different base types) @@ expected unsigned long long [usertype] val @@ got restricted __le64 [usertype] @@ include/asm-generic/io.h:236:22: sparse: expected unsigned long long [usertype] val vim +789 drivers/fpga/dfl-fme-perf.c 724142f8c42a7b Wu Hao 2020-04-27 785 724142f8c42a7b Wu Hao 2020-04-27 786 static void fme_perf_event_destroy(struct perf_event *event) 724142f8c42a7b Wu Hao 2020-04-27 787 { 724142f8c42a7b Wu Hao 2020-04-27 788 struct fme_perf_event_ops *ops = get_event_ops(event->hw.event_base); 724142f8c42a7b Wu Hao 2020-04-27 @789 struct fme_perf_priv *priv = to_fme_perf_priv(event->pmu); 724142f8c42a7b Wu Hao 2020-04-27 790 724142f8c42a7b Wu Hao 2020-04-27 791 if (ops->event_destroy) 724142f8c42a7b Wu Hao 2020-04-27 792 ops->event_destroy(priv, event->hw.idx, event->hw.config_base); 724142f8c42a7b Wu Hao 2020-04-27 793 } 724142f8c42a7b Wu Hao 2020-04-27 794 724142f8c42a7b Wu Hao 2020-04-27 795 static int fme_perf_event_init(struct perf_event *event) 724142f8c42a7b Wu Hao 2020-04-27 796 { 724142f8c42a7b Wu Hao 2020-04-27 797 struct fme_perf_priv *priv = to_fme_perf_priv(event->pmu); 724142f8c42a7b Wu Hao 2020-04-27 798 struct hw_perf_event *hwc = &event->hw; 724142f8c42a7b Wu Hao 2020-04-27 799 struct fme_perf_event_ops *ops; 724142f8c42a7b Wu Hao 2020-04-27 800 u32 eventid, evtype, portid; 724142f8c42a7b Wu Hao 2020-04-27 801 724142f8c42a7b Wu Hao 2020-04-27 802 /* test the event attr type check for PMU enumeration */ 724142f8c42a7b Wu Hao 2020-04-27 803 if (event->attr.type != event->pmu->type) 724142f8c42a7b Wu Hao 2020-04-27 804 return -ENOENT; 724142f8c42a7b Wu Hao 2020-04-27 805 724142f8c42a7b Wu Hao 2020-04-27 806 /* 724142f8c42a7b Wu Hao 2020-04-27 807 * fme counters are shared across all cores. 724142f8c42a7b Wu Hao 2020-04-27 808 * Therefore, it does not support per-process mode. 724142f8c42a7b Wu Hao 2020-04-27 809 * Also, it does not support event sampling mode. 724142f8c42a7b Wu Hao 2020-04-27 810 */ 724142f8c42a7b Wu Hao 2020-04-27 811 if (is_sampling_event(event) || event->attach_state & PERF_ATTACH_TASK) 724142f8c42a7b Wu Hao 2020-04-27 812 return -EINVAL; 724142f8c42a7b Wu Hao 2020-04-27 813 724142f8c42a7b Wu Hao 2020-04-27 814 if (event->cpu < 0) 724142f8c42a7b Wu Hao 2020-04-27 815 return -EINVAL; 724142f8c42a7b Wu Hao 2020-04-27 816 724142f8c42a7b Wu Hao 2020-04-27 817 if (event->cpu != priv->cpu) 724142f8c42a7b Wu Hao 2020-04-27 818 return -EINVAL; 724142f8c42a7b Wu Hao 2020-04-27 819 724142f8c42a7b Wu Hao 2020-04-27 @820 eventid = get_event(event->attr.config); 724142f8c42a7b Wu Hao 2020-04-27 821 portid = get_portid(event->attr.config); 724142f8c42a7b Wu Hao 2020-04-27 822 evtype = get_evtype(event->attr.config); 724142f8c42a7b Wu Hao 2020-04-27 823 if (evtype > FME_EVTYPE_MAX) 724142f8c42a7b Wu Hao 2020-04-27 824 return -EINVAL; 724142f8c42a7b Wu Hao 2020-04-27 825 724142f8c42a7b Wu Hao 2020-04-27 826 hwc->event_base = evtype; 724142f8c42a7b Wu Hao 2020-04-27 827 hwc->idx = (int)eventid; 724142f8c42a7b Wu Hao 2020-04-27 828 hwc->config_base = portid; 724142f8c42a7b Wu Hao 2020-04-27 829 724142f8c42a7b Wu Hao 2020-04-27 830 event->destroy = fme_perf_event_destroy; 724142f8c42a7b Wu Hao 2020-04-27 831 724142f8c42a7b Wu Hao 2020-04-27 832 dev_dbg(priv->dev, "%s event=0x%x, evtype=0x%x, portid=0x%x,\n", 724142f8c42a7b Wu Hao 2020-04-27 833 __func__, eventid, evtype, portid); 724142f8c42a7b Wu Hao 2020-04-27 834 724142f8c42a7b Wu Hao 2020-04-27 835 ops = get_event_ops(evtype); 724142f8c42a7b Wu Hao 2020-04-27 836 if (ops->event_init) 724142f8c42a7b Wu Hao 2020-04-27 837 return ops->event_init(priv, eventid, portid); 724142f8c42a7b Wu Hao 2020-04-27 838 724142f8c42a7b Wu Hao 2020-04-27 839 return 0; 724142f8c42a7b Wu Hao 2020-04-27 840 } 724142f8c42a7b Wu Hao 2020-04-27 841 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org [-- Attachment #2: .config.gz --] [-- Type: application/gzip, Size: 28301 bytes --] ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2020-06-30 2:34 UTC | newest] Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2020-06-28 15:18 [PATCH] fpga: dfl: improve configuration of dfl pci devices trix 2020-06-29 2:19 ` Xu Yilun 2020-06-29 3:12 ` Wu, Hao 2020-06-29 13:28 ` Tom Rix 2020-06-30 2:34 ` Wu, Hao 2020-06-29 12:38 ` kernel test robot 2020-06-29 19:22 ` kernel test robot
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).