Re: [PATCH V4 XRT Alveo 04/20] fpga: xrt: xrt-lib platform driver manager
Hi Tom, On 3/29/21 12:44 PM, Tom Rix wrote: bisectablity may be/is an issue. Moritz, building happens on the last patch, so in theory there will never be a build break needing bisection. Do we care about the misordering of serveral of these patches? The general idea about ordering of patches is that global defines should be introduced before the user. On 3/23/21 10:29 PM, Lizhi Hou wrote: xrt-lib kernel module infrastructure code to register and manage all leaf driver modules. Signed-off-by: Sonal Santan Signed-off-by: Max Zhen Signed-off-by: Lizhi Hou --- drivers/fpga/xrt/include/subdev_id.h | 38 drivers/fpga/xrt/include/xleaf.h | 264 + drivers/fpga/xrt/lib/lib-drv.c | 277 +++ ok drivers/fpga/xrt/lib/lib-drv.h | 17 ++ 4 files changed, 596 insertions(+) create mode 100644 drivers/fpga/xrt/include/subdev_id.h create mode 100644 drivers/fpga/xrt/include/xleaf.h create mode 100644 drivers/fpga/xrt/lib/lib-drv.c create mode 100644 drivers/fpga/xrt/lib/lib-drv.h diff --git a/drivers/fpga/xrt/include/subdev_id.h b/drivers/fpga/xrt/include/subdev_id.h new file mode 100644 index ..42fbd6f5e80a --- /dev/null +++ b/drivers/fpga/xrt/include/subdev_id.h @@ -0,0 +1,38 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (C) 2020-2021 Xilinx, Inc. + * + * Authors: + * Cheng Zhen + */ + +#ifndef _XRT_SUBDEV_ID_H_ +#define _XRT_SUBDEV_ID_H_ + +/* + * Every subdev driver has an ID for others to refer to it. There can be multiple number of + * instances of a subdev driver. A tuple is a unique identification + * of a specific instance of a subdev driver. + */ +enum xrt_subdev_id { + XRT_SUBDEV_GRP = 0, not necessary to initialize all unless there are gaps. Yeah, just trying to avoid any issue when things are accidentally reordered. + XRT_SUBDEV_VSEC = 1, + XRT_SUBDEV_VSEC_GOLDEN = 2, + XRT_SUBDEV_DEVCTL = 3, + XRT_SUBDEV_AXIGATE = 4, + XRT_SUBDEV_ICAP = 5, + XRT_SUBDEV_TEST = 6, + XRT_SUBDEV_MGMT_MAIN = 7, + XRT_SUBDEV_QSPI = 8, + XRT_SUBDEV_MAILBOX = 9, + XRT_SUBDEV_CMC = 10, + XRT_SUBDEV_CALIB = 11, + XRT_SUBDEV_CLKFREQ = 12, + XRT_SUBDEV_CLOCK = 13, + XRT_SUBDEV_SRSR = 14, + XRT_SUBDEV_UCS = 15, + XRT_SUBDEV_NUM = 16, /* Total number of subdevs. */ + XRT_ROOT = -1, /* Special ID for root driver. */ +}; + +#endif /* _XRT_SUBDEV_ID_H_ */ diff --git a/drivers/fpga/xrt/include/xleaf.h b/drivers/fpga/xrt/include/xleaf.h new file mode 100644 index ..acb500df04b0 --- /dev/null +++ b/drivers/fpga/xrt/include/xleaf.h @@ -0,0 +1,264 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (C) 2020-2021 Xilinx, Inc. + * + * Authors: + *Cheng Zhen + *Sonal Santan + */ + +#ifndef _XRT_XLEAF_H_ +#define _XRT_XLEAF_H_ + +#include +#include +#include +#include "subdev_id.h" +#include "xroot.h" +#include "events.h" + +/* All subdev drivers should use below common routines to print out msg. */ +#define DEV(pdev)(&(pdev)->dev) +#define DEV_PDATA(pdev) \ + ((struct xrt_subdev_platdata *)dev_get_platdata(DEV(pdev))) +#define DEV_DRVDATA(pdev)\ + ((struct xrt_subdev_drvdata *) \ + platform_get_device_id(pdev)->driver_data) +#define FMT_PRT(prt_fn, pdev, fmt, args...) \ + ({typeof(pdev) (_pdev) = (pdev);\ + prt_fn(DEV(_pdev), "%s %s: " fmt, \ + DEV_PDATA(_pdev)->xsp_root_name, __func__, ##args); }) +#define xrt_err(pdev, fmt, args...) FMT_PRT(dev_err, pdev, fmt, ##args) +#define xrt_warn(pdev, fmt, args...) FMT_PRT(dev_warn, pdev, fmt, ##args) +#define xrt_info(pdev, fmt, args...) FMT_PRT(dev_info, pdev, fmt, ##args) +#define xrt_dbg(pdev, fmt, args...) FMT_PRT(dev_dbg, pdev, fmt, ##args) + +enum { + /* Starting cmd for common leaf cmd implemented by all leaves. */ + XRT_XLEAF_COMMON_BASE = 0, + /* Starting cmd for leaves' specific leaf cmds. */ + XRT_XLEAF_CUSTOM_BASE = 64, +}; + +enum xrt_xleaf_common_leaf_cmd { + XRT_XLEAF_EVENT = XRT_XLEAF_COMMON_BASE, +}; + +/* + * If populated by subdev driver, infra will handle the mechanics of + * char device (un)registration. + */ +enum xrt_subdev_file_mode { + /* Infra create cdev, default file name */ + XRT_SUBDEV_FILE_DEFAULT = 0, + /* Infra create cdev, need to encode inst num in file name */ + XRT_SUBDEV_FILE_MULTI_INST, + /* No auto creation of cdev by infra, leaf handles it by itself */ + XRT_SUBDEV_FILE_NO_AUTO, +}; + +struct xrt_subdev_file_ops { + const struct file_operations xsf_ops; + dev_t xsf_dev_t; + const char *xsf_dev_name; + enum xrt_subdev_file_mode xsf_mode; +}; + +/* + * Subdev driver callbacks populated by subdev driver. + */ +struct xrt_subdev_drv_ops { + /* + * Per driver instance callback. The pdev points to the
Re: [PATCH V4 XRT Alveo 04/20] fpga: xrt: xrt-lib platform driver manager
bisectablity may be/is an issue. Moritz, building happens on the last patch, so in theory there will never be a build break needing bisection. Do we care about the misordering of serveral of these patches? On 3/23/21 10:29 PM, Lizhi Hou wrote: > xrt-lib kernel module infrastructure code to register and manage all > leaf driver modules. > > Signed-off-by: Sonal Santan > Signed-off-by: Max Zhen > Signed-off-by: Lizhi Hou > --- > drivers/fpga/xrt/include/subdev_id.h | 38 > drivers/fpga/xrt/include/xleaf.h | 264 + > drivers/fpga/xrt/lib/lib-drv.c | 277 +++ ok > drivers/fpga/xrt/lib/lib-drv.h | 17 ++ > 4 files changed, 596 insertions(+) > create mode 100644 drivers/fpga/xrt/include/subdev_id.h > create mode 100644 drivers/fpga/xrt/include/xleaf.h > create mode 100644 drivers/fpga/xrt/lib/lib-drv.c > create mode 100644 drivers/fpga/xrt/lib/lib-drv.h > > diff --git a/drivers/fpga/xrt/include/subdev_id.h > b/drivers/fpga/xrt/include/subdev_id.h > new file mode 100644 > index ..42fbd6f5e80a > --- /dev/null > +++ b/drivers/fpga/xrt/include/subdev_id.h > @@ -0,0 +1,38 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Copyright (C) 2020-2021 Xilinx, Inc. > + * > + * Authors: > + * Cheng Zhen > + */ > + > +#ifndef _XRT_SUBDEV_ID_H_ > +#define _XRT_SUBDEV_ID_H_ > + > +/* > + * Every subdev driver has an ID for others to refer to it. There can be > multiple number of > + * instances of a subdev driver. A tuple is a > unique identification > + * of a specific instance of a subdev driver. > + */ > +enum xrt_subdev_id { > + XRT_SUBDEV_GRP = 0, not necessary to initialize all unless there are gaps. > + XRT_SUBDEV_VSEC = 1, > + XRT_SUBDEV_VSEC_GOLDEN = 2, > + XRT_SUBDEV_DEVCTL = 3, > + XRT_SUBDEV_AXIGATE = 4, > + XRT_SUBDEV_ICAP = 5, > + XRT_SUBDEV_TEST = 6, > + XRT_SUBDEV_MGMT_MAIN = 7, > + XRT_SUBDEV_QSPI = 8, > + XRT_SUBDEV_MAILBOX = 9, > + XRT_SUBDEV_CMC = 10, > + XRT_SUBDEV_CALIB = 11, > + XRT_SUBDEV_CLKFREQ = 12, > + XRT_SUBDEV_CLOCK = 13, > + XRT_SUBDEV_SRSR = 14, > + XRT_SUBDEV_UCS = 15, > + XRT_SUBDEV_NUM = 16, /* Total number of subdevs. */ > + XRT_ROOT = -1, /* Special ID for root driver. */ > +}; > + > +#endif /* _XRT_SUBDEV_ID_H_ */ > diff --git a/drivers/fpga/xrt/include/xleaf.h > b/drivers/fpga/xrt/include/xleaf.h > new file mode 100644 > index ..acb500df04b0 > --- /dev/null > +++ b/drivers/fpga/xrt/include/xleaf.h > @@ -0,0 +1,264 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Copyright (C) 2020-2021 Xilinx, Inc. > + * > + * Authors: > + *Cheng Zhen > + *Sonal Santan > + */ > + > +#ifndef _XRT_XLEAF_H_ > +#define _XRT_XLEAF_H_ > + > +#include > +#include > +#include > +#include "subdev_id.h" > +#include "xroot.h" > +#include "events.h" > + > +/* All subdev drivers should use below common routines to print out msg. */ > +#define DEV(pdev)(&(pdev)->dev) > +#define DEV_PDATA(pdev) \ > + ((struct xrt_subdev_platdata *)dev_get_platdata(DEV(pdev))) > +#define DEV_DRVDATA(pdev)\ > + ((struct xrt_subdev_drvdata *) \ > + platform_get_device_id(pdev)->driver_data) > +#define FMT_PRT(prt_fn, pdev, fmt, args...) \ > + ({typeof(pdev) (_pdev) = (pdev);\ > + prt_fn(DEV(_pdev), "%s %s: " fmt, \ > + DEV_PDATA(_pdev)->xsp_root_name, __func__, ##args); }) > +#define xrt_err(pdev, fmt, args...) FMT_PRT(dev_err, pdev, fmt, ##args) > +#define xrt_warn(pdev, fmt, args...) FMT_PRT(dev_warn, pdev, fmt, ##args) > +#define xrt_info(pdev, fmt, args...) FMT_PRT(dev_info, pdev, fmt, ##args) > +#define xrt_dbg(pdev, fmt, args...) FMT_PRT(dev_dbg, pdev, fmt, ##args) > + > +enum { > + /* Starting cmd for common leaf cmd implemented by all leaves. */ > + XRT_XLEAF_COMMON_BASE = 0, > + /* Starting cmd for leaves' specific leaf cmds. */ > + XRT_XLEAF_CUSTOM_BASE = 64, > +}; > + > +enum xrt_xleaf_common_leaf_cmd { > + XRT_XLEAF_EVENT = XRT_XLEAF_COMMON_BASE, > +}; > + > +/* > + * If populated by subdev driver, infra will handle the mechanics of > + * char device (un)registration. > + */ > +enum xrt_subdev_file_mode { > + /* Infra create cdev, default file name */ > + XRT_SUBDEV_FILE_DEFAULT = 0, > + /* Infra create cdev, need to encode inst num in file name */ > + XRT_SUBDEV_FILE_MULTI_INST, > + /* No auto creation of cdev by infra, leaf handles it by itself */ > + XRT_SUBDEV_FILE_NO_AUTO, > +}; > + > +struct xrt_subdev_file_ops { > + const struct file_operations xsf_ops; > + dev_t xsf_dev_t; > + const char *xsf_dev_name; > + enum xrt_subdev_file_mode xsf_mode; > +}; > + > +/* > + * Subdev driver callbacks populated by subdev driver. > + */ > +struct xrt_subdev_drv_ops { > + /* > + * Per driver instance cal
[PATCH V4 XRT Alveo 04/20] fpga: xrt: xrt-lib platform driver manager
xrt-lib kernel module infrastructure code to register and manage all leaf driver modules. Signed-off-by: Sonal Santan Signed-off-by: Max Zhen Signed-off-by: Lizhi Hou --- drivers/fpga/xrt/include/subdev_id.h | 38 drivers/fpga/xrt/include/xleaf.h | 264 + drivers/fpga/xrt/lib/lib-drv.c | 277 +++ drivers/fpga/xrt/lib/lib-drv.h | 17 ++ 4 files changed, 596 insertions(+) create mode 100644 drivers/fpga/xrt/include/subdev_id.h create mode 100644 drivers/fpga/xrt/include/xleaf.h create mode 100644 drivers/fpga/xrt/lib/lib-drv.c create mode 100644 drivers/fpga/xrt/lib/lib-drv.h diff --git a/drivers/fpga/xrt/include/subdev_id.h b/drivers/fpga/xrt/include/subdev_id.h new file mode 100644 index ..42fbd6f5e80a --- /dev/null +++ b/drivers/fpga/xrt/include/subdev_id.h @@ -0,0 +1,38 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (C) 2020-2021 Xilinx, Inc. + * + * Authors: + * Cheng Zhen + */ + +#ifndef _XRT_SUBDEV_ID_H_ +#define _XRT_SUBDEV_ID_H_ + +/* + * Every subdev driver has an ID for others to refer to it. There can be multiple number of + * instances of a subdev driver. A tuple is a unique identification + * of a specific instance of a subdev driver. + */ +enum xrt_subdev_id { + XRT_SUBDEV_GRP = 0, + XRT_SUBDEV_VSEC = 1, + XRT_SUBDEV_VSEC_GOLDEN = 2, + XRT_SUBDEV_DEVCTL = 3, + XRT_SUBDEV_AXIGATE = 4, + XRT_SUBDEV_ICAP = 5, + XRT_SUBDEV_TEST = 6, + XRT_SUBDEV_MGMT_MAIN = 7, + XRT_SUBDEV_QSPI = 8, + XRT_SUBDEV_MAILBOX = 9, + XRT_SUBDEV_CMC = 10, + XRT_SUBDEV_CALIB = 11, + XRT_SUBDEV_CLKFREQ = 12, + XRT_SUBDEV_CLOCK = 13, + XRT_SUBDEV_SRSR = 14, + XRT_SUBDEV_UCS = 15, + XRT_SUBDEV_NUM = 16, /* Total number of subdevs. */ + XRT_ROOT = -1, /* Special ID for root driver. */ +}; + +#endif /* _XRT_SUBDEV_ID_H_ */ diff --git a/drivers/fpga/xrt/include/xleaf.h b/drivers/fpga/xrt/include/xleaf.h new file mode 100644 index ..acb500df04b0 --- /dev/null +++ b/drivers/fpga/xrt/include/xleaf.h @@ -0,0 +1,264 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (C) 2020-2021 Xilinx, Inc. + * + * Authors: + *Cheng Zhen + *Sonal Santan + */ + +#ifndef _XRT_XLEAF_H_ +#define _XRT_XLEAF_H_ + +#include +#include +#include +#include "subdev_id.h" +#include "xroot.h" +#include "events.h" + +/* All subdev drivers should use below common routines to print out msg. */ +#define DEV(pdev) (&(pdev)->dev) +#define DEV_PDATA(pdev)\ + ((struct xrt_subdev_platdata *)dev_get_platdata(DEV(pdev))) +#define DEV_DRVDATA(pdev) \ + ((struct xrt_subdev_drvdata *) \ + platform_get_device_id(pdev)->driver_data) +#define FMT_PRT(prt_fn, pdev, fmt, args...)\ + ({typeof(pdev) (_pdev) = (pdev);\ + prt_fn(DEV(_pdev), "%s %s: " fmt, \ + DEV_PDATA(_pdev)->xsp_root_name, __func__, ##args); }) +#define xrt_err(pdev, fmt, args...) FMT_PRT(dev_err, pdev, fmt, ##args) +#define xrt_warn(pdev, fmt, args...) FMT_PRT(dev_warn, pdev, fmt, ##args) +#define xrt_info(pdev, fmt, args...) FMT_PRT(dev_info, pdev, fmt, ##args) +#define xrt_dbg(pdev, fmt, args...) FMT_PRT(dev_dbg, pdev, fmt, ##args) + +enum { + /* Starting cmd for common leaf cmd implemented by all leaves. */ + XRT_XLEAF_COMMON_BASE = 0, + /* Starting cmd for leaves' specific leaf cmds. */ + XRT_XLEAF_CUSTOM_BASE = 64, +}; + +enum xrt_xleaf_common_leaf_cmd { + XRT_XLEAF_EVENT = XRT_XLEAF_COMMON_BASE, +}; + +/* + * If populated by subdev driver, infra will handle the mechanics of + * char device (un)registration. + */ +enum xrt_subdev_file_mode { + /* Infra create cdev, default file name */ + XRT_SUBDEV_FILE_DEFAULT = 0, + /* Infra create cdev, need to encode inst num in file name */ + XRT_SUBDEV_FILE_MULTI_INST, + /* No auto creation of cdev by infra, leaf handles it by itself */ + XRT_SUBDEV_FILE_NO_AUTO, +}; + +struct xrt_subdev_file_ops { + const struct file_operations xsf_ops; + dev_t xsf_dev_t; + const char *xsf_dev_name; + enum xrt_subdev_file_mode xsf_mode; +}; + +/* + * Subdev driver callbacks populated by subdev driver. + */ +struct xrt_subdev_drv_ops { + /* +* Per driver instance callback. The pdev points to the instance. +* If defined, these are called by other leaf drivers. +* Note that root driver may call into xsd_leaf_call of a group driver. +*/ + int (*xsd_leaf_call)(struct platform_device *pdev, u32 cmd, void *arg); +}; + +/* + * Defined and populated by subdev driver, exported as driver_data in + * struct platform_device_id. + */ +struct xrt_subdev_drvdata { + struct xrt_subdev_file_ops xsd_file_ops; + struct xrt_subdev_drv_ops xsd_