From 659a244ee5c8fa315e035b2a6281fb66dc45d97b Mon Sep 17 00:00:00 2001 From: Lizhi Hou Date: Sun, 11 Jul 2021 02:26:34 -0400 Subject: [PATCH 1/4] move devctl to mfd/ --- drivers/fpga/xrt/lib/Makefile | 1 - drivers/fpga/xrt/lib/cdev.c | 2 +- drivers/fpga/xrt/lib/group.c | 15 +++- drivers/fpga/xrt/lib/lib-drv.c | 90 +++++++++++++++---- drivers/fpga/xrt/lib/lib-drv.h | 2 + drivers/fpga/xrt/lib/subdev.c | 9 +- drivers/fpga/xrt/lib/subdev_pool.h | 2 +- drivers/fpga/xrt/lib/xleaf/axigate.c | 6 +- drivers/fpga/xrt/lib/xleaf/clkfreq.c | 6 +- drivers/fpga/xrt/lib/xleaf/clock.c | 8 +- drivers/fpga/xrt/lib/xleaf/ddr_calibration.c | 6 +- drivers/fpga/xrt/lib/xleaf/icap.c | 8 +- drivers/fpga/xrt/lib/xleaf/ucs.c | 6 +- drivers/fpga/xrt/lib/xleaf/vsec.c | 6 +- drivers/fpga/xrt/lib/xroot.c | 6 +- drivers/fpga/xrt/mgmt/root.c | 4 +- drivers/fpga/xrt/mgmt/xmgmt-main-region.c | 8 +- drivers/fpga/xrt/mgmt/xmgmt-main.c | 14 +-- drivers/fpga/xrt/mgmt/xmgmt.h | 2 +- drivers/fpga/xrt/mgmt/xrt-mgr.c | 8 +- drivers/mfd/Kconfig | 8 ++ drivers/mfd/Makefile | 3 + .../xleaf/devctl.c => mfd/xrt-devctl-core.c} | 18 +++- include/linux/mod_devicetable.h | 5 ++ .../include => include/linux/xrt}/events.h | 0 .../xrt/include => include/linux/xrt}/group.h | 0 .../include => include/linux/xrt}/metadata.h | 0 .../include => include/linux/xrt}/subdev_id.h | 0 .../linux/xrt}/xclbin-helper.h | 0 .../include => include/linux/xrt}/xdevice.h | 7 ++ .../xrt/include => include/linux/xrt}/xleaf.h | 0 .../linux/xrt}/xleaf/axigate.h | 4 +- .../linux/xrt}/xleaf/clkfreq.h | 2 +- .../linux/xrt}/xleaf/clock.h | 2 +- .../linux/xrt}/xleaf/ddr_calibration.h | 2 +- .../linux/xrt}/xleaf/devctl.h | 2 +- .../linux/xrt}/xleaf/icap.h | 2 +- .../linux/xrt}/xmgmt-main.h | 0 .../xrt/include => include/linux/xrt}/xroot.h | 0 scripts/mod/devicetable-offsets.c | 3 + scripts/mod/file2alias.c | 12 +++ 41 files changed, 200 insertions(+), 79 deletions(-) rename drivers/{fpga/xrt/lib/xleaf/devctl.c => mfd/xrt-devctl-core.c} (89%) rename {drivers/fpga/xrt/include => include/linux/xrt}/events.h (100%) rename {drivers/fpga/xrt/include => include/linux/xrt}/group.h (100%) rename {drivers/fpga/xrt/include => include/linux/xrt}/metadata.h (100%) rename {drivers/fpga/xrt/include => include/linux/xrt}/subdev_id.h (100%) rename {drivers/fpga/xrt/include => include/linux/xrt}/xclbin-helper.h (100%) rename {drivers/fpga/xrt/include => include/linux/xrt}/xdevice.h (93%) rename {drivers/fpga/xrt/include => include/linux/xrt}/xleaf.h (100%) rename {drivers/fpga/xrt/include => include/linux/xrt}/xleaf/axigate.h (86%) rename {drivers/fpga/xrt/include => include/linux/xrt}/xleaf/clkfreq.h (92%) rename {drivers/fpga/xrt/include => include/linux/xrt}/xleaf/clock.h (94%) rename {drivers/fpga/xrt/include => include/linux/xrt}/xleaf/ddr_calibration.h (94%) rename {drivers/fpga/xrt/include => include/linux/xrt}/xleaf/devctl.h (95%) rename {drivers/fpga/xrt/include => include/linux/xrt}/xleaf/icap.h (93%) rename {drivers/fpga/xrt/include => include/linux/xrt}/xmgmt-main.h (100%) rename {drivers/fpga/xrt/include => include/linux/xrt}/xroot.h (100%) diff --git a/drivers/fpga/xrt/lib/Makefile b/drivers/fpga/xrt/lib/Makefile index 58563416efbf69..fbd807a878cf9d 100644 --- a/drivers/fpga/xrt/lib/Makefile +++ b/drivers/fpga/xrt/lib/Makefile @@ -19,7 +19,6 @@ xrt-lib-objs := \ group.o \ xleaf/vsec.o \ xleaf/axigate.o \ - xleaf/devctl.o \ xleaf/icap.o \ xleaf/clock.o \ xleaf/clkfreq.o \ diff --git a/drivers/fpga/xrt/lib/cdev.c b/drivers/fpga/xrt/lib/cdev.c index 3c20adac8c0326..7153a6b7d9c061 100644 --- a/drivers/fpga/xrt/lib/cdev.c +++ b/drivers/fpga/xrt/lib/cdev.c @@ -8,7 +8,7 @@ * Cheng Zhen */ -#include "xleaf.h" +#include #include "lib-drv.h" #define XRT_CDEV_DIR "xrt" diff --git a/drivers/fpga/xrt/lib/group.c b/drivers/fpga/xrt/lib/group.c index b45f05449e0bcd..efcc4676ebb7c6 100644 --- a/drivers/fpga/xrt/lib/group.c +++ b/drivers/fpga/xrt/lib/group.c @@ -9,10 +9,11 @@ */ #include -#include "xleaf.h" +#include +#include +#include +#include #include "subdev_pool.h" -#include "group.h" -#include "metadata.h" #include "lib-drv.h" #define XRT_GRP "xrt_group" @@ -136,6 +137,13 @@ static int xrt_grp_create_leaves(struct xrt_group *xg) xrt_info(xg->xdev, "bringing up leaves..."); memcpy(grp_dtb, pdata->xsp_dtb, mlen); for (did = 0; did < XRT_SUBDEV_NUM; did++) { + ret = xrt_drv_get(did); + if (ret) { + request_module("xrt:d%08X", did); + ret = xrt_drv_get(did); + } + if (ret) + continue; eps = xrt_drv_get_endpoints(did); while (eps && eps->xse_names) { char *dtb = NULL; @@ -169,6 +177,7 @@ static int xrt_grp_create_leaves(struct xrt_group *xg) vfree(dtb); /* Continue searching for the same instance from grp_dtb. */ } + xrt_drv_put(did); } xg->leaves_created = true; diff --git a/drivers/fpga/xrt/lib/lib-drv.c b/drivers/fpga/xrt/lib/lib-drv.c index ba4ac493082348..184280aa6c5117 100644 --- a/drivers/fpga/xrt/lib/lib-drv.c +++ b/drivers/fpga/xrt/lib/lib-drv.c @@ -10,8 +10,8 @@ #include #include #include -#include "xleaf.h" -#include "xroot.h" +#include +#include #include "lib-drv.h" #define XRT_IPLIB_MODULE_NAME "xrt-lib" @@ -23,7 +23,7 @@ struct xrt_find_drv_data { enum xrt_subdev_id id; - struct xrt_driver *xdrv; + void *arg; }; struct class *xrt_class; @@ -123,13 +123,57 @@ void xrt_unregister_driver(struct xrt_driver *drv) } EXPORT_SYMBOL_GPL(xrt_unregister_driver); -static int __find_driver(struct device_driver *drv, void *_data) +static int __get_driver(struct device_driver *drv, void *_data) { struct xrt_driver *xdrv = to_xrt_drv(drv); struct xrt_find_drv_data *data = _data; + int ret = 0; if (xdrv->subdev_id == data->id) { - data->xdrv = xdrv; + if (xdrv->driver.owner != THIS_MODULE) + ret = try_module_get(xdrv->driver.owner); + *(int *)data->arg = ret; + + return 1; + } + + return 0; +} + +static int __put_driver(struct device_driver *drv, void *_data) +{ + struct xrt_driver *xdrv = to_xrt_drv(drv); + struct xrt_find_drv_data *data = _data; + + if (xdrv->subdev_id == data->id) { + if (xdrv->driver.owner != THIS_MODULE) + module_put(xdrv->driver.owner); + return 1; + } + + return 0; +} + +static int __get_driver_name(struct device_driver *drv, void *_data) +{ + struct xrt_driver *xdrv = to_xrt_drv(drv); + struct xrt_find_drv_data *data = _data; + + if (xdrv->subdev_id == data->id) { + data->arg = (char *)XRT_DRVNAME(xdrv); + return 1; + } + + return 0; +} + +static int __get_driver_endpoints(struct device_driver *drv, void *_data) +{ + struct xrt_driver *xdrv = to_xrt_drv(drv); + struct xrt_find_drv_data *data = _data; + + if (xdrv->subdev_id == data->id) { + data->arg = xdrv->endpoints; return 1; } @@ -141,12 +185,9 @@ const char *xrt_drv_name(enum xrt_subdev_id id) struct xrt_find_drv_data data = { 0 }; data.id = id; - bus_for_each_drv(&xrt_bus_type, NULL, &data, __find_driver); - - if (data.xdrv) - return XRT_DRVNAME(data.xdrv); + bus_for_each_drv(&xrt_bus_type, NULL, &data, __get_driver_name); - return NULL; + return data.arg; } static int xrt_drv_get_instance(enum xrt_subdev_id id) @@ -167,17 +208,34 @@ static void xrt_drv_put_instance(enum xrt_subdev_id id, int instance) ida_free(&xrt_device_ida, xrt_instance_to_id(id, instance)); } -struct xrt_dev_endpoints *xrt_drv_get_endpoints(enum xrt_subdev_id id) +int xrt_drv_get(enum xrt_subdev_id id) +{ + struct xrt_find_drv_data data = { 0 }; + int ret; + + data.id = id; + data.arg = &ret; + bus_for_each_drv(&xrt_bus_type, NULL, &data, __get_driver); + + return ret; +} + +void xrt_drv_put(enum xrt_subdev_id id) { struct xrt_find_drv_data data = { 0 }; data.id = id; - bus_for_each_drv(&xrt_bus_type, NULL, &data, __find_driver); + bus_for_each_drv(&xrt_bus_type, NULL, &data, __put_driver); +} - if (data.xdrv) - return data.xdrv->endpoints; +struct xrt_dev_endpoints *xrt_drv_get_endpoints(enum xrt_subdev_id id) +{ + struct xrt_find_drv_data data = { 0 }; - return NULL; + data.id = id; + bus_for_each_drv(&xrt_bus_type, NULL, &data, __get_driver_endpoints); + + return data.arg; } static void xrt_device_release(struct device *dev) @@ -271,6 +329,7 @@ struct resource *xrt_get_resource(struct xrt_device *xdev, u32 type, u32 num) } return NULL; } +EXPORT_SYMBOL_GPL(xrt_get_resource); /* * Leaf driver's module init/fini callbacks. This is not a open infrastructure for dynamic @@ -279,7 +338,6 @@ struct resource *xrt_get_resource(struct xrt_device *xdev, u32 type, u32 num) static void (*leaf_init_fini_cbs[])(bool) = { group_leaf_init_fini, vsec_leaf_init_fini, - devctl_leaf_init_fini, axigate_leaf_init_fini, icap_leaf_init_fini, calib_leaf_init_fini, diff --git a/drivers/fpga/xrt/lib/lib-drv.h b/drivers/fpga/xrt/lib/lib-drv.h index 0276c28e009fe7..e463d4b9306388 100644 --- a/drivers/fpga/xrt/lib/lib-drv.h +++ b/drivers/fpga/xrt/lib/lib-drv.h @@ -17,5 +17,7 @@ extern struct bus_type xrt_bus_type; const char *xrt_drv_name(enum xrt_subdev_id id); struct xrt_dev_endpoints *xrt_drv_get_endpoints(enum xrt_subdev_id id); +int xrt_drv_get(enum xrt_subdev_id id); +void xrt_drv_put(enum xrt_subdev_id id); #endif /* _LIB_DRV_H_ */ diff --git a/drivers/fpga/xrt/lib/subdev.c b/drivers/fpga/xrt/lib/subdev.c index 350f67d5eb1eea..3bbea514615295 100644 --- a/drivers/fpga/xrt/lib/subdev.c +++ b/drivers/fpga/xrt/lib/subdev.c @@ -8,10 +8,10 @@ #include #include -#include "xleaf.h" +#include +#include #include "subdev_pool.h" #include "lib-drv.h" -#include "metadata.h" extern struct bus_type xrt_bus_type; @@ -349,6 +349,10 @@ xrt_subdev_create(struct device *parent, enum xrt_subdev_id id, if (xrt_subdev_cdev_auto_creation(xdev)) xleaf_devnode_create(xdev, DEV_FILE_OPS(xdev)->xsf_dev_name, NULL); + /* this should never fail */ + ret = xrt_drv_get(id); + WARN_ON(ret); + vfree(pdata); return sdev; @@ -376,6 +380,7 @@ static void xrt_subdev_destroy(struct xrt_subdev *sdev) sysfs_remove_link(&find_root(xdev)->kobj, dev_name(dev)); sysfs_remove_group(&dev->kobj, &xrt_subdev_attrgroup); xrt_device_unregister(xdev); + xrt_drv_put(sdev->xs_id); kfree(sdev); } diff --git a/drivers/fpga/xrt/lib/subdev_pool.h b/drivers/fpga/xrt/lib/subdev_pool.h index 03f617d7ffd708..e4573710d48c97 100644 --- a/drivers/fpga/xrt/lib/subdev_pool.h +++ b/drivers/fpga/xrt/lib/subdev_pool.h @@ -11,7 +11,7 @@ #include #include -#include "xroot.h" +#include /* * The struct xrt_subdev_pool manages a list of xrt_subdevs for root and group drivers. diff --git a/drivers/fpga/xrt/lib/xleaf/axigate.c b/drivers/fpga/xrt/lib/xleaf/axigate.c index 493707b782e450..72e9e41377ff0d 100644 --- a/drivers/fpga/xrt/lib/xleaf/axigate.c +++ b/drivers/fpga/xrt/lib/xleaf/axigate.c @@ -13,9 +13,9 @@ #include #include #include -#include "metadata.h" -#include "xleaf.h" -#include "xleaf/axigate.h" +#include +#include +#include #define XRT_AXIGATE "xrt_axigate" diff --git a/drivers/fpga/xrt/lib/xleaf/clkfreq.c b/drivers/fpga/xrt/lib/xleaf/clkfreq.c index 3d1f11152375e7..8b46b0fcf7627c 100644 --- a/drivers/fpga/xrt/lib/xleaf/clkfreq.c +++ b/drivers/fpga/xrt/lib/xleaf/clkfreq.c @@ -13,9 +13,9 @@ #include #include #include -#include "metadata.h" -#include "xleaf.h" -#include "xleaf/clkfreq.h" +#include +#include +#include #define CLKFREQ_ERR(clkfreq, fmt, arg...) \ xrt_err((clkfreq)->xdev, fmt "\n", ##arg) diff --git a/drivers/fpga/xrt/lib/xleaf/clock.c b/drivers/fpga/xrt/lib/xleaf/clock.c index eb3fc7021a97e9..f4b9d333ed5092 100644 --- a/drivers/fpga/xrt/lib/xleaf/clock.c +++ b/drivers/fpga/xrt/lib/xleaf/clock.c @@ -15,10 +15,10 @@ #include #include #include -#include "metadata.h" -#include "xleaf.h" -#include "xleaf/clock.h" -#include "xleaf/clkfreq.h" +#include +#include +#include +#include /* XRT_CLOCK_MAX_NUM_CLOCKS should be a concept from XCLBIN_ in the future */ #define XRT_CLOCK_MAX_NUM_CLOCKS 4 diff --git a/drivers/fpga/xrt/lib/xleaf/ddr_calibration.c b/drivers/fpga/xrt/lib/xleaf/ddr_calibration.c index 36a0937c9195ab..79e196f068fcb1 100644 --- a/drivers/fpga/xrt/lib/xleaf/ddr_calibration.c +++ b/drivers/fpga/xrt/lib/xleaf/ddr_calibration.c @@ -11,9 +11,9 @@ */ #include #include -#include "xclbin-helper.h" -#include "metadata.h" -#include "xleaf/ddr_calibration.h" +#include +#include +#include #define XRT_CALIB "xrt_calib" diff --git a/drivers/fpga/xrt/lib/xleaf/icap.c b/drivers/fpga/xrt/lib/xleaf/icap.c index 071923f61537f5..a617a144925831 100644 --- a/drivers/fpga/xrt/lib/xleaf/icap.c +++ b/drivers/fpga/xrt/lib/xleaf/icap.c @@ -15,10 +15,10 @@ #include #include #include -#include "metadata.h" -#include "xleaf.h" -#include "xleaf/icap.h" -#include "xclbin-helper.h" +#include +#include +#include +#include #define XRT_ICAP "xrt_icap" diff --git a/drivers/fpga/xrt/lib/xleaf/ucs.c b/drivers/fpga/xrt/lib/xleaf/ucs.c index a7a96ddde44f82..76b9e01d95b722 100644 --- a/drivers/fpga/xrt/lib/xleaf/ucs.c +++ b/drivers/fpga/xrt/lib/xleaf/ucs.c @@ -13,9 +13,9 @@ #include #include #include -#include "metadata.h" -#include "xleaf.h" -#include "xleaf/clock.h" +#include +#include +#include #define UCS_ERR(ucs, fmt, arg...) \ xrt_err((ucs)->xdev, fmt "\n", ##arg) diff --git a/drivers/fpga/xrt/lib/xleaf/vsec.c b/drivers/fpga/xrt/lib/xleaf/vsec.c index a6fa4f2ec83291..9085de77362020 100644 --- a/drivers/fpga/xrt/lib/xleaf/vsec.c +++ b/drivers/fpga/xrt/lib/xleaf/vsec.c @@ -9,9 +9,9 @@ */ #include -#include "metadata.h" -#include "xdevice.h" -#include "xleaf.h" +#include +#include +#include #define XRT_VSEC "xrt_vsec" diff --git a/drivers/fpga/xrt/lib/xroot.c b/drivers/fpga/xrt/lib/xroot.c index 7b3e540dd6c0dc..80d8aca8fc6dd7 100644 --- a/drivers/fpga/xrt/lib/xroot.c +++ b/drivers/fpga/xrt/lib/xroot.c @@ -10,10 +10,10 @@ #include #include -#include "xroot.h" +#include +#include +#include #include "subdev_pool.h" -#include "group.h" -#include "metadata.h" #define xroot_err(xr, fmt, args...) dev_err((xr)->dev, "%s: " fmt, __func__, ##args) #define xroot_warn(xr, fmt, args...) dev_warn((xr)->dev, "%s: " fmt, __func__, ##args) diff --git a/drivers/fpga/xrt/mgmt/root.c b/drivers/fpga/xrt/mgmt/root.c index 9f3c806a9eaa03..a979fb04460d9c 100644 --- a/drivers/fpga/xrt/mgmt/root.c +++ b/drivers/fpga/xrt/mgmt/root.c @@ -14,9 +14,9 @@ #include #include -#include "xroot.h" +#include +#include #include "xmgmt.h" -#include "metadata.h" #define XMGMT_MODULE_NAME "xrt-mgmt" #define XMGMT_DRIVER_VERSION "4.0.0" diff --git a/drivers/fpga/xrt/mgmt/xmgmt-main-region.c b/drivers/fpga/xrt/mgmt/xmgmt-main-region.c index 6e6a16b1325818..c0456ab1abc31e 100644 --- a/drivers/fpga/xrt/mgmt/xmgmt-main-region.c +++ b/drivers/fpga/xrt/mgmt/xmgmt-main-region.c @@ -11,10 +11,10 @@ #include #include #include -#include "metadata.h" -#include "xleaf.h" -#include "xleaf/axigate.h" -#include "xclbin-helper.h" +#include +#include +#include +#include #include "xmgmt.h" struct xmgmt_bridge { diff --git a/drivers/fpga/xrt/mgmt/xmgmt-main.c b/drivers/fpga/xrt/mgmt/xmgmt-main.c index 820c888e7918eb..6e8e64893cab61 100644 --- a/drivers/fpga/xrt/mgmt/xmgmt-main.c +++ b/drivers/fpga/xrt/mgmt/xmgmt-main.c @@ -11,15 +11,15 @@ #include #include #include -#include "xclbin-helper.h" -#include "metadata.h" -#include "xleaf.h" +#include +#include +#include #include -#include "xleaf/devctl.h" -#include "xmgmt-main.h" +#include +#include +#include +#include #include "xrt-mgr.h" -#include "xleaf/icap.h" -#include "xleaf/axigate.h" #include "xmgmt.h" #define XMGMT_MAIN "xmgmt_main" diff --git a/drivers/fpga/xrt/mgmt/xmgmt.h b/drivers/fpga/xrt/mgmt/xmgmt.h index 54ce3875471ad2..5b301913943d93 100644 --- a/drivers/fpga/xrt/mgmt/xmgmt.h +++ b/drivers/fpga/xrt/mgmt/xmgmt.h @@ -10,7 +10,7 @@ #ifndef _XMGMT_H_ #define _XMGMT_H_ -#include "xmgmt-main.h" +#include struct fpga_manager; int xmgmt_process_xclbin(struct xrt_device *xdev, diff --git a/drivers/fpga/xrt/mgmt/xrt-mgr.c b/drivers/fpga/xrt/mgmt/xrt-mgr.c index 41263a033d9d15..26da78a25c4bc1 100644 --- a/drivers/fpga/xrt/mgmt/xrt-mgr.c +++ b/drivers/fpga/xrt/mgmt/xrt-mgr.c @@ -13,11 +13,11 @@ #include #include -#include "xclbin-helper.h" -#include "xleaf.h" +#include +#include +#include +#include #include "xrt-mgr.h" -#include "xleaf/axigate.h" -#include "xleaf/icap.h" #include "xmgmt.h" struct xfpga_class { diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig index 8b99a13669bfc5..3b84a651f7e8be 100644 --- a/drivers/mfd/Kconfig +++ b/drivers/mfd/Kconfig @@ -2166,5 +2166,13 @@ config MFD_INTEL_M10_BMC additional drivers must be enabled in order to use the functionality of the device. +config XRT_DEVCTL + tristate "Xilinx XRT generic IO read and write driver" + depends on FPGA_XRT_LIB + select FPGA_XRT_METADATA + help + Select this option to enable XRT devctl driver. This driver provides + common support for read and write registers for Xilinx Alveo FPGA. + endmenu endif diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile index 1780019d24748f..6a6253fcf0f919 100644 --- a/drivers/mfd/Makefile +++ b/drivers/mfd/Makefile @@ -267,3 +267,6 @@ obj-$(CONFIG_MFD_KHADAS_MCU) += khadas-mcu.o obj-$(CONFIG_SGI_MFD_IOC3) += ioc3.o obj-$(CONFIG_MFD_SIMPLE_MFD_I2C) += simple-mfd-i2c.o obj-$(CONFIG_MFD_INTEL_M10_BMC) += intel-m10-bmc.o + +xrt-devctl-objs := xrt-devctl-core.o +obj-$(CONFIG_XRT_DEVCTL) += xrt-devctl.o diff --git a/drivers/fpga/xrt/lib/xleaf/devctl.c b/drivers/mfd/xrt-devctl-core.c similarity index 89% rename from drivers/fpga/xrt/lib/xleaf/devctl.c rename to drivers/mfd/xrt-devctl-core.c index fb2122be7e56e6..98bf932a61bd61 100644 --- a/drivers/fpga/xrt/lib/xleaf/devctl.c +++ b/drivers/mfd/xrt-devctl-core.c @@ -9,13 +9,14 @@ */ #include +#include #include #include #include #include -#include "metadata.h" -#include "xleaf.h" -#include "xleaf/devctl.h" +#include +#include +#include #define XRT_DEVCTL "xrt_devctl" @@ -156,6 +157,12 @@ static struct xrt_dev_endpoints xrt_devctl_endpoints[] = { { 0 }, }; +static const struct xrt_device_id xrt_devctl_ids[] = { + { XRT_SUBDEV_DEVCTL }, + { } +}; +MODULE_DEVICE_TABLE(xrt, xrt_devctl_ids); + static struct xrt_driver xrt_devctl_driver = { .driver = { .name = XRT_DEVCTL, @@ -165,5 +172,8 @@ static struct xrt_driver xrt_devctl_driver = { .probe = xrt_devctl_probe, .leaf_call = xrt_devctl_leaf_call, }; +module_xrt_driver(xrt_devctl_driver); -XRT_LEAF_INIT_FINI_FUNC(devctl); +MODULE_AUTHOR("XRT Team "); +MODULE_DESCRIPTION("Xilinx XRT devctl driver"); +MODULE_LICENSE("GPL v2"); diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h index 5b08a473cdba4d..303ae19c1122cd 100644 --- a/include/linux/mod_devicetable.h +++ b/include/linux/mod_devicetable.h @@ -838,4 +838,9 @@ struct mhi_device_id { kernel_ulong_t driver_data; }; +struct xrt_device_id { + __u32 dev_id; + kernel_ulong_t driver_data; +}; + #endif /* LINUX_MOD_DEVICETABLE_H */ diff --git a/drivers/fpga/xrt/include/events.h b/include/linux/xrt/events.h similarity index 100% rename from drivers/fpga/xrt/include/events.h rename to include/linux/xrt/events.h diff --git a/drivers/fpga/xrt/include/group.h b/include/linux/xrt/group.h similarity index 100% rename from drivers/fpga/xrt/include/group.h rename to include/linux/xrt/group.h diff --git a/drivers/fpga/xrt/include/metadata.h b/include/linux/xrt/metadata.h similarity index 100% rename from drivers/fpga/xrt/include/metadata.h rename to include/linux/xrt/metadata.h diff --git a/drivers/fpga/xrt/include/subdev_id.h b/include/linux/xrt/subdev_id.h similarity index 100% rename from drivers/fpga/xrt/include/subdev_id.h rename to include/linux/xrt/subdev_id.h diff --git a/drivers/fpga/xrt/include/xclbin-helper.h b/include/linux/xrt/xclbin-helper.h similarity index 100% rename from drivers/fpga/xrt/include/xclbin-helper.h rename to include/linux/xrt/xclbin-helper.h diff --git a/drivers/fpga/xrt/include/xdevice.h b/include/linux/xrt/xdevice.h similarity index 93% rename from drivers/fpga/xrt/include/xdevice.h rename to include/linux/xrt/xdevice.h index 3afd96989fc5d3..ef84e649e51fb9 100644 --- a/drivers/fpga/xrt/include/xdevice.h +++ b/include/linux/xrt/xdevice.h @@ -100,6 +100,13 @@ struct xrt_driver { #define to_xrt_dev(d) container_of(d, struct xrt_device, dev) #define to_xrt_drv(d) container_of(d, struct xrt_driver, driver) +/* + * module_xrt_driver() - Helper macro for drivers that don't do + * anything special in module init/exit. + */ +#define module_xrt_driver(__xrt_driver) \ + module_driver(__xrt_driver, xrt_register_driver, \ + xrt_unregister_driver) static inline void *xrt_get_drvdata(const struct xrt_device *xdev) { diff --git a/drivers/fpga/xrt/include/xleaf.h b/include/linux/xrt/xleaf.h similarity index 100% rename from drivers/fpga/xrt/include/xleaf.h rename to include/linux/xrt/xleaf.h diff --git a/drivers/fpga/xrt/include/xleaf/axigate.h b/include/linux/xrt/xleaf/axigate.h similarity index 86% rename from drivers/fpga/xrt/include/xleaf/axigate.h rename to include/linux/xrt/xleaf/axigate.h index 58f32c76dca111..05e5b35c2c21ab 100644 --- a/drivers/fpga/xrt/include/xleaf/axigate.h +++ b/include/linux/xrt/xleaf/axigate.h @@ -9,8 +9,8 @@ #ifndef _XRT_AXIGATE_H_ #define _XRT_AXIGATE_H_ -#include "xleaf.h" -#include "metadata.h" +#include +#include /* * AXIGATE driver leaf calls. diff --git a/drivers/fpga/xrt/include/xleaf/clkfreq.h b/include/linux/xrt/xleaf/clkfreq.h similarity index 92% rename from drivers/fpga/xrt/include/xleaf/clkfreq.h rename to include/linux/xrt/xleaf/clkfreq.h index 005441d5df78f3..2522424f40e04e 100644 --- a/drivers/fpga/xrt/include/xleaf/clkfreq.h +++ b/include/linux/xrt/xleaf/clkfreq.h @@ -9,7 +9,7 @@ #ifndef _XRT_CLKFREQ_H_ #define _XRT_CLKFREQ_H_ -#include "xleaf.h" +#include /* * CLKFREQ driver leaf calls. diff --git a/drivers/fpga/xrt/include/xleaf/clock.h b/include/linux/xrt/xleaf/clock.h similarity index 94% rename from drivers/fpga/xrt/include/xleaf/clock.h rename to include/linux/xrt/xleaf/clock.h index 6858473fd09602..b7908516befe72 100644 --- a/drivers/fpga/xrt/include/xleaf/clock.h +++ b/include/linux/xrt/xleaf/clock.h @@ -9,7 +9,7 @@ #ifndef _XRT_CLOCK_H_ #define _XRT_CLOCK_H_ -#include "xleaf.h" +#include #include /* diff --git a/drivers/fpga/xrt/include/xleaf/ddr_calibration.h b/include/linux/xrt/xleaf/ddr_calibration.h similarity index 94% rename from drivers/fpga/xrt/include/xleaf/ddr_calibration.h rename to include/linux/xrt/xleaf/ddr_calibration.h index 878740c26ca25c..6d23c457ae56d9 100644 --- a/drivers/fpga/xrt/include/xleaf/ddr_calibration.h +++ b/include/linux/xrt/xleaf/ddr_calibration.h @@ -9,7 +9,7 @@ #ifndef _XRT_DDR_CALIBRATION_H_ #define _XRT_DDR_CALIBRATION_H_ -#include "xleaf.h" +#include #include /* diff --git a/drivers/fpga/xrt/include/xleaf/devctl.h b/include/linux/xrt/xleaf/devctl.h similarity index 95% rename from drivers/fpga/xrt/include/xleaf/devctl.h rename to include/linux/xrt/xleaf/devctl.h index b97f3b6d932685..92ff5feadc2ec9 100644 --- a/drivers/fpga/xrt/include/xleaf/devctl.h +++ b/include/linux/xrt/xleaf/devctl.h @@ -9,7 +9,7 @@ #ifndef _XRT_DEVCTL_H_ #define _XRT_DEVCTL_H_ -#include "xleaf.h" +#include /* * DEVCTL driver leaf calls. diff --git a/drivers/fpga/xrt/include/xleaf/icap.h b/include/linux/xrt/xleaf/icap.h similarity index 93% rename from drivers/fpga/xrt/include/xleaf/icap.h rename to include/linux/xrt/xleaf/icap.h index 96d39a8934fa08..3cad7be95a43cb 100644 --- a/drivers/fpga/xrt/include/xleaf/icap.h +++ b/include/linux/xrt/xleaf/icap.h @@ -9,7 +9,7 @@ #ifndef _XRT_ICAP_H_ #define _XRT_ICAP_H_ -#include "xleaf.h" +#include /* * ICAP driver leaf calls. diff --git a/drivers/fpga/xrt/include/xmgmt-main.h b/include/linux/xrt/xmgmt-main.h similarity index 100% rename from drivers/fpga/xrt/include/xmgmt-main.h rename to include/linux/xrt/xmgmt-main.h diff --git a/drivers/fpga/xrt/include/xroot.h b/include/linux/xrt/xroot.h similarity index 100% rename from drivers/fpga/xrt/include/xroot.h rename to include/linux/xrt/xroot.h diff --git a/scripts/mod/devicetable-offsets.c b/scripts/mod/devicetable-offsets.c index 27007c18e75428..6370ab576664eb 100644 --- a/scripts/mod/devicetable-offsets.c +++ b/scripts/mod/devicetable-offsets.c @@ -243,5 +243,8 @@ int main(void) DEVID(mhi_device_id); DEVID_FIELD(mhi_device_id, chan); + DEVID(xrt_device_id); + DEVID_FIELD(xrt_device_id, dev_id); + return 0; } diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c index 2417dd1dee33cb..5d0d0f71e91b9e 100644 --- a/scripts/mod/file2alias.c +++ b/scripts/mod/file2alias.c @@ -1368,6 +1368,17 @@ static int do_mhi_entry(const char *filename, void *symval, char *alias) return 1; } +/* Looks like: xrt:dN */ +static int do_xrt_entry(const char *filename, void *symval, char *alias) +{ + DEF_FIELD(symval, xrt_device_id, dev_id); + + sprintf(alias, "xrt:d%08X", dev_id); + + add_wildcard(alias); + return 1; +} + /* Does namelen bytes of name exactly match the symbol? */ static bool sym_is(const char *name, unsigned namelen, const char *symbol) { @@ -1442,6 +1453,7 @@ static const struct devtable devtable[] = { {"tee", SIZE_tee_client_device_id, do_tee_entry}, {"wmi", SIZE_wmi_device_id, do_wmi_entry}, {"mhi", SIZE_mhi_device_id, do_mhi_entry}, + {"xrt", SIZE_xrt_device_id, do_xrt_entry}, }; /* Create MODULE_ALIAS() statements. From 81d1f5c99ddbd263fa1411886cac6e04db987217 Mon Sep 17 00:00:00 2001 From: Lizhi Hou Date: Sun, 11 Jul 2021 12:30:47 -0400 Subject: [PATCH 2/4] bug fix --- drivers/fpga/xrt/lib/lib-drv.c | 15 ++++++++------- drivers/fpga/xrt/lib/xclbin.c | 4 ++-- drivers/mfd/xrt-devctl-core.c | 1 + 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/drivers/fpga/xrt/lib/lib-drv.c b/drivers/fpga/xrt/lib/lib-drv.c index 184280aa6c5117..8b8c9a4a83439f 100644 --- a/drivers/fpga/xrt/lib/lib-drv.c +++ b/drivers/fpga/xrt/lib/lib-drv.c @@ -93,7 +93,6 @@ int xrt_register_driver(struct xrt_driver *drv) drv->file_ops.xsf_dev_t = (dev_t)-1; } - drv->driver.owner = THIS_MODULE; drv->driver.bus = &xrt_bus_type; rc = driver_register(&drv->driver); @@ -127,12 +126,14 @@ static int __get_driver(struct device_driver *drv, void *_data) { struct xrt_driver *xdrv = to_xrt_drv(drv); struct xrt_find_drv_data *data = _data; - int ret = 0; if (xdrv->subdev_id == data->id) { - if (xdrv->driver.owner != THIS_MODULE) - ret = try_module_get(xdrv->driver.owner); - *(int *)data->arg = ret; + if (xdrv->driver.owner && xdrv->driver.owner != THIS_MODULE) { + if (try_module_get(xdrv->driver.owner)) + *(int *)data->arg = 0; + } else { + *(int *)data->arg = 0; + } return 1; } @@ -146,7 +147,7 @@ static int __put_driver(struct device_driver *drv, void *_data) struct xrt_find_drv_data *data = _data; if (xdrv->subdev_id == data->id) { - if (xdrv->driver.owner != THIS_MODULE) + if (xdrv->driver.owner && xdrv->driver.owner != THIS_MODULE) module_put(xdrv->driver.owner); return 1; } @@ -211,7 +212,7 @@ static void xrt_drv_put_instance(enum xrt_subdev_id id, int instance) int xrt_drv_get(enum xrt_subdev_id id) { struct xrt_find_drv_data data = { 0 }; - int ret; + int ret = -EINVAL; data.id = id; data.arg = &ret; diff --git a/drivers/fpga/xrt/lib/xclbin.c b/drivers/fpga/xrt/lib/xclbin.c index 6edac3d418bee6..9517f2ad85214e 100644 --- a/drivers/fpga/xrt/lib/xclbin.c +++ b/drivers/fpga/xrt/lib/xclbin.c @@ -10,8 +10,8 @@ #include #include #include -#include "xclbin-helper.h" -#include "metadata.h" +#include +#include /* Used for parsing bitstream header */ #define BITSTREAM_EVEN_MAGIC_BYTE 0x0f diff --git a/drivers/mfd/xrt-devctl-core.c b/drivers/mfd/xrt-devctl-core.c index 98bf932a61bd61..e1e8221c507edd 100644 --- a/drivers/mfd/xrt-devctl-core.c +++ b/drivers/mfd/xrt-devctl-core.c @@ -166,6 +166,7 @@ MODULE_DEVICE_TABLE(xrt, xrt_devctl_ids); static struct xrt_driver xrt_devctl_driver = { .driver = { .name = XRT_DEVCTL, + .owner = THIS_MODULE, }, .subdev_id = XRT_SUBDEV_DEVCTL, .endpoints = xrt_devctl_endpoints, From 1406ac001be12f472ce0a261ad77ed7e31b7294f Mon Sep 17 00:00:00 2001 From: Lizhi Hou Date: Mon, 12 Jul 2021 19:58:36 -0400 Subject: [PATCH 3/4] code review comment --- drivers/fpga/xrt/lib/group.c | 4 ---- drivers/fpga/xrt/lib/lib-drv.c | 5 +++++ 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/drivers/fpga/xrt/lib/group.c b/drivers/fpga/xrt/lib/group.c index efcc4676ebb7c6..2fdbe8d9973bf5 100644 --- a/drivers/fpga/xrt/lib/group.c +++ b/drivers/fpga/xrt/lib/group.c @@ -138,10 +138,6 @@ static int xrt_grp_create_leaves(struct xrt_group *xg) memcpy(grp_dtb, pdata->xsp_dtb, mlen); for (did = 0; did < XRT_SUBDEV_NUM; did++) { ret = xrt_drv_get(did); - if (ret) { - request_module("xrt:d%08X", did); - ret = xrt_drv_get(did); - } if (ret) continue; eps = xrt_drv_get_endpoints(did); diff --git a/drivers/fpga/xrt/lib/lib-drv.c b/drivers/fpga/xrt/lib/lib-drv.c index 8b8c9a4a83439f..1418b3474d478a 100644 --- a/drivers/fpga/xrt/lib/lib-drv.c +++ b/drivers/fpga/xrt/lib/lib-drv.c @@ -218,6 +218,11 @@ int xrt_drv_get(enum xrt_subdev_id id) data.arg = &ret; bus_for_each_drv(&xrt_bus_type, NULL, &data, __get_driver); + if (ret) { + request_module("xrt:d%08X", id); + bus_for_each_drv(&xrt_bus_type, NULL, &data, __get_driver); + } + return ret; } From c764a382bc5be556c563a2276283e6e9eb2c5533 Mon Sep 17 00:00:00 2001 From: Lizhi Hou Date: Thu, 15 Jul 2021 00:15:53 -0400 Subject: [PATCH 4/4] V8 changes --- Documentation/fpga/xrt.rst | 4 +-- drivers/clk/Kconfig | 1 + drivers/clk/Makefile | 1 + drivers/clk/xrt/Kconfig | 23 +++++++++++++++ drivers/clk/xrt/Makefile | 13 +++++++++ .../{fpga/xrt/lib/xleaf => clk/xrt}/clkfreq.c | 15 ++++++++-- .../{fpga/xrt/lib/xleaf => clk/xrt}/clock.c | 15 ++++++++-- drivers/{fpga/xrt/lib/xleaf => clk/xrt}/ucs.c | 16 +++++++++-- .../xrt => drivers/fpga/xrt/include}/group.h | 2 +- .../xrt => drivers/fpga/xrt/include}/xroot.h | 11 +++----- drivers/fpga/xrt/lib/Makefile | 7 +---- drivers/fpga/xrt/lib/group.c | 2 +- drivers/fpga/xrt/lib/lib-drv.c | 8 +----- drivers/fpga/xrt/lib/lib-drv.h | 20 +++++++++++++ drivers/fpga/xrt/lib/subdev.c | 7 +++-- drivers/fpga/xrt/lib/subdev_pool.h | 2 +- drivers/fpga/xrt/lib/xleaf/axigate.c | 1 + drivers/fpga/xrt/lib/xleaf/icap.c | 1 + drivers/fpga/xrt/lib/xroot.c | 7 +++-- drivers/fpga/xrt/mgmt/root.c | 3 +- drivers/fpga/xrt/mgmt/xmgmt-main.c | 2 +- drivers/fpga/xrt/mgmt/xrt-mgr.c | 2 +- drivers/memory/Kconfig | 7 +++++ drivers/memory/Makefile | 1 + .../xrt-ddr-calibration.c} | 16 ++++++++++- drivers/mfd/Kconfig | 10 +++++-- drivers/mfd/Makefile | 2 +- .../mfd/{xrt-devctl-core.c => xrt-devctl.c} | 2 +- .../xrt/lib/xleaf/vsec.c => mfd/xrt-vsec.c} | 14 +++++++++- include/linux/xrt/metadata.h | 2 +- include/linux/xrt/xdevice.h | 3 +- include/linux/xrt/xleaf.h | 28 ++++--------------- 32 files changed, 177 insertions(+), 71 deletions(-) create mode 100644 drivers/clk/xrt/Kconfig create mode 100644 drivers/clk/xrt/Makefile rename drivers/{fpga/xrt/lib/xleaf => clk/xrt}/clkfreq.c (92%) rename drivers/{fpga/xrt/lib/xleaf => clk/xrt}/clock.c (97%) rename drivers/{fpga/xrt/lib/xleaf => clk/xrt}/ucs.c (89%) rename {include/linux/xrt => drivers/fpga/xrt/include}/group.h (93%) rename {include/linux/xrt => drivers/fpga/xrt/include}/xroot.h (90%) rename drivers/{fpga/xrt/lib/xleaf/ddr_calibration.c => memory/xrt-ddr-calibration.c} (90%) rename drivers/mfd/{xrt-devctl-core.c => xrt-devctl.c} (99%) rename drivers/{fpga/xrt/lib/xleaf/vsec.c => mfd/xrt-vsec.c} (95%) diff --git a/Documentation/fpga/xrt.rst b/Documentation/fpga/xrt.rst index 5a5b4d5a3bc6d9..84eb41be9ac174 100644 --- a/Documentation/fpga/xrt.rst +++ b/Documentation/fpga/xrt.rst @@ -275,7 +275,7 @@ fpga_bridge and fpga_region for the next region in the chain. fpga_bridge ----------- -Like the fpga_region, a fpga_bridge is created by walking the device tree +Like the fpga_region, an fpga_bridge is created by walking the device tree of the parent group. The bridge is used for isolation between a parent and its child. @@ -416,7 +416,7 @@ xclbin is compiled by end user using `Vitis `_ tool set from Xilinx. The xclbin contains sections describing user compiled acceleration engines/kernels, memory subsystems, clocking information etc. It also -contains a FPGA bitstream for the user partition, UUIDs, platform name, etc. +contains an FPGA bitstream for the user partition, UUIDs, platform name, etc. .. _xsabin_xclbin_container_format: diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig index c715d4681a0b81..68459c1511b7d5 100644 --- a/drivers/clk/Kconfig +++ b/drivers/clk/Kconfig @@ -384,5 +384,6 @@ source "drivers/clk/ti/Kconfig" source "drivers/clk/uniphier/Kconfig" source "drivers/clk/x86/Kconfig" source "drivers/clk/zynqmp/Kconfig" +source "drivers/clk/xrt/Kconfig" endif diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile index da8fcf147eb132..63fdde38236b91 100644 --- a/drivers/clk/Makefile +++ b/drivers/clk/Makefile @@ -121,6 +121,7 @@ obj-y += versatile/ ifeq ($(CONFIG_COMMON_CLK), y) obj-$(CONFIG_X86) += x86/ endif +obj-$(CONFIG_XRT_CLK_WIZ) += xrt/ obj-$(CONFIG_ARCH_ZX) += zte/ obj-$(CONFIG_ARCH_ZYNQ) += zynq/ obj-$(CONFIG_COMMON_CLK_ZYNQMP) += zynqmp/ diff --git a/drivers/clk/xrt/Kconfig b/drivers/clk/xrt/Kconfig new file mode 100644 index 00000000000000..e6f84269fa52ea --- /dev/null +++ b/drivers/clk/xrt/Kconfig @@ -0,0 +1,23 @@ +# SPDX-License-Identifier: GPL-2.0 + +config XRT_CLK_WIZ + tristate "Clock driver for Xilinx Alveo clocking wizard" + depends on FPGA_XRT_LIB + select XRT_CLK_FREQ + select XRT_CLK_UCS + help + Select this option to enable the Alveo clock controller driver. + +config XRT_CLK_FREQ + tristate "Driver for Xilinx Alveo clock frequency counter" + depends on FPGA_XRT_LIB + depends on XRT_CLK_WIZ + help + Select this option to enable the Alveo clock frequency counter driver. + +config XRT_CLK_UCS + tristate "Driver for Xilinx Alveo user clock subsystem controller" + depends on FPGA_XRT_LIB + depends on XRT_CLK_WIZ + help + Select this option to enable the Alveo user clock subsystem controller driver. diff --git a/drivers/clk/xrt/Makefile b/drivers/clk/xrt/Makefile new file mode 100644 index 00000000000000..d1042ee4839224 --- /dev/null +++ b/drivers/clk/xrt/Makefile @@ -0,0 +1,13 @@ +# SPDX-License-Identifier: GPL-2.0 +# +# Makefile for Xilinx Alveo clock devices +# + +xrt-clock-objs := clock.o +obj-$(CONFIG_XRT_CLK_WIZ) += xrt-clock.o + +xrt-clkfreq-objs := clkfreq.o +obj-$(CONFIG_XRT_CLK_FREQ) += xrt-clkfreq.o + +xrt-ucs-objs := ucs.o +obj-$(CONFIG_XRT_CLK_UCS) += xrt-ucs.o diff --git a/drivers/fpga/xrt/lib/xleaf/clkfreq.c b/drivers/clk/xrt/clkfreq.c similarity index 92% rename from drivers/fpga/xrt/lib/xleaf/clkfreq.c rename to drivers/clk/xrt/clkfreq.c index 8b46b0fcf7627c..a636e2393debc9 100644 --- a/drivers/fpga/xrt/lib/xleaf/clkfreq.c +++ b/drivers/clk/xrt/clkfreq.c @@ -8,7 +8,7 @@ * Lizhi Hou */ -#include +#include #include #include #include @@ -209,15 +209,26 @@ static struct xrt_dev_endpoints xrt_clkfreq_endpoints[] = { { 0 }, }; +static const struct xrt_device_id xrt_clkfreq_ids[] = { + { XRT_SUBDEV_CLKFREQ }, + { } +}; +MODULE_DEVICE_TABLE(xrt, xrt_clkfreq_ids); + static struct xrt_driver xrt_clkfreq_driver = { .driver = { .name = XRT_CLKFREQ, + .owner = THIS_MODULE, }, + .id_table = xrt_clkfreq_ids, .subdev_id = XRT_SUBDEV_CLKFREQ, .endpoints = xrt_clkfreq_endpoints, .probe = clkfreq_probe, .remove = clkfreq_remove, .leaf_call = xrt_clkfreq_leaf_call, }; +module_xrt_driver(xrt_clkfreq_driver); -XRT_LEAF_INIT_FINI_FUNC(clkfreq); +MODULE_AUTHOR("XRT Team "); +MODULE_DESCRIPTION("Xilinx XRT clock frequency counter driver"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/fpga/xrt/lib/xleaf/clock.c b/drivers/clk/xrt/clock.c similarity index 97% rename from drivers/fpga/xrt/lib/xleaf/clock.c rename to drivers/clk/xrt/clock.c index f4b9d333ed5092..8f7ecf2fcdf02e 100644 --- a/drivers/fpga/xrt/lib/xleaf/clock.c +++ b/drivers/clk/xrt/clock.c @@ -10,7 +10,7 @@ * David Zhang */ -#include +#include #include #include #include @@ -638,15 +638,26 @@ static struct xrt_dev_endpoints xrt_clock_endpoints[] = { { 0 }, }; +static const struct xrt_device_id xrt_clock_ids[] = { + { XRT_SUBDEV_CLOCK }, + { } +}; +MODULE_DEVICE_TABLE(xrt, xrt_clock_ids); + static struct xrt_driver xrt_clock_driver = { .driver = { .name = XRT_CLOCK, + .owner = THIS_MODULE, }, + .id_table = xrt_clock_ids, .subdev_id = XRT_SUBDEV_CLOCK, .endpoints = xrt_clock_endpoints, .probe = clock_probe, .remove = clock_remove, .leaf_call = xrt_clock_leaf_call, }; +module_xrt_driver(xrt_clock_driver); -XRT_LEAF_INIT_FINI_FUNC(clock); +MODULE_AUTHOR("XRT Team "); +MODULE_DESCRIPTION("Xilinx XRT clock driver"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/fpga/xrt/lib/xleaf/ucs.c b/drivers/clk/xrt/ucs.c similarity index 89% rename from drivers/fpga/xrt/lib/xleaf/ucs.c rename to drivers/clk/xrt/ucs.c index 76b9e01d95b722..c1b2dc80e96e5c 100644 --- a/drivers/fpga/xrt/lib/xleaf/ucs.c +++ b/drivers/clk/xrt/ucs.c @@ -8,7 +8,7 @@ * Lizhi Hou */ -#include +#include #include #include #include @@ -139,14 +139,26 @@ static struct xrt_dev_endpoints xrt_ucs_endpoints[] = { { 0 }, }; +static const struct xrt_device_id xrt_ucs_ids[] = { + { XRT_SUBDEV_UCS }, + { } +}; +MODULE_DEVICE_TABLE(xrt, xrt_ucs_ids); + static struct xrt_driver xrt_ucs_driver = { .driver = { .name = XRT_UCS, + .owner = THIS_MODULE, }, + .id_table = xrt_ucs_ids, .subdev_id = XRT_SUBDEV_UCS, .endpoints = xrt_ucs_endpoints, .probe = ucs_probe, .leaf_call = xrt_ucs_leaf_call, }; -XRT_LEAF_INIT_FINI_FUNC(ucs); +module_xrt_driver(xrt_ucs_driver); + +MODULE_AUTHOR("XRT Team "); +MODULE_DESCRIPTION("Xilinx XRT user clock subsystem controller driver"); +MODULE_LICENSE("GPL v2"); diff --git a/include/linux/xrt/group.h b/drivers/fpga/xrt/include/group.h similarity index 93% rename from include/linux/xrt/group.h rename to drivers/fpga/xrt/include/group.h index 09e9d03f53fe4f..ca5ba4ea8bc703 100644 --- a/include/linux/xrt/group.h +++ b/drivers/fpga/xrt/include/group.h @@ -9,7 +9,7 @@ #ifndef _XRT_GROUP_H_ #define _XRT_GROUP_H_ -#include "xleaf.h" +#include /* * Group driver leaf calls. diff --git a/include/linux/xrt/xroot.h b/drivers/fpga/xrt/include/xroot.h similarity index 90% rename from include/linux/xrt/xroot.h rename to drivers/fpga/xrt/include/xroot.h index 56461bcb07a968..614da1e879dc40 100644 --- a/include/linux/xrt/xroot.h +++ b/drivers/fpga/xrt/include/xroot.h @@ -9,13 +9,10 @@ #ifndef _XRT_ROOT_H_ #define _XRT_ROOT_H_ -#include "xdevice.h" -#include "subdev_id.h" -#include "events.h" - -typedef bool (*xrt_subdev_match_t)(enum xrt_subdev_id, struct xrt_device *, void *); -#define XRT_SUBDEV_MATCH_PREV ((xrt_subdev_match_t)-1) -#define XRT_SUBDEV_MATCH_NEXT ((xrt_subdev_match_t)-2) +#include +#include +#include +#include /* * Root calls. diff --git a/drivers/fpga/xrt/lib/Makefile b/drivers/fpga/xrt/lib/Makefile index fbd807a878cf9d..55cd6063a32439 100644 --- a/drivers/fpga/xrt/lib/Makefile +++ b/drivers/fpga/xrt/lib/Makefile @@ -17,13 +17,8 @@ xrt-lib-objs := \ subdev.o \ cdev.o \ group.o \ - xleaf/vsec.o \ xleaf/axigate.o \ - xleaf/icap.o \ - xleaf/clock.o \ - xleaf/clkfreq.o \ - xleaf/ucs.o \ - xleaf/ddr_calibration.o + xleaf/icap.o ccflags-y := -I$(FULL_XRT_PATH)/include \ -I$(FULL_DTC_PATH) diff --git a/drivers/fpga/xrt/lib/group.c b/drivers/fpga/xrt/lib/group.c index 2fdbe8d9973bf5..e175e17669ea4b 100644 --- a/drivers/fpga/xrt/lib/group.c +++ b/drivers/fpga/xrt/lib/group.c @@ -11,8 +11,8 @@ #include #include #include -#include #include +#include "group.h" #include "subdev_pool.h" #include "lib-drv.h" diff --git a/drivers/fpga/xrt/lib/lib-drv.c b/drivers/fpga/xrt/lib/lib-drv.c index 1418b3474d478a..45cfe9bdab439a 100644 --- a/drivers/fpga/xrt/lib/lib-drv.c +++ b/drivers/fpga/xrt/lib/lib-drv.c @@ -10,8 +10,7 @@ #include #include #include -#include -#include +#include "xroot.h" #include "lib-drv.h" #define XRT_IPLIB_MODULE_NAME "xrt-lib" @@ -343,13 +342,8 @@ EXPORT_SYMBOL_GPL(xrt_get_resource); */ static void (*leaf_init_fini_cbs[])(bool) = { group_leaf_init_fini, - vsec_leaf_init_fini, axigate_leaf_init_fini, icap_leaf_init_fini, - calib_leaf_init_fini, - clkfreq_leaf_init_fini, - clock_leaf_init_fini, - ucs_leaf_init_fini, }; static __init int xrt_lib_init(void) diff --git a/drivers/fpga/xrt/lib/lib-drv.h b/drivers/fpga/xrt/lib/lib-drv.h index e463d4b9306388..1ea6ffabd4927a 100644 --- a/drivers/fpga/xrt/lib/lib-drv.h +++ b/drivers/fpga/xrt/lib/lib-drv.h @@ -20,4 +20,24 @@ struct xrt_dev_endpoints *xrt_drv_get_endpoints(enum xrt_subdev_id id); int xrt_drv_get(enum xrt_subdev_id id); void xrt_drv_put(enum xrt_subdev_id id); +/* Module's init/fini routines for leaf driver in xrt-lib module */ +#define XRT_LEAF_INIT_FINI_FUNC(name) \ +void name##_leaf_init_fini(bool init) \ +{ \ + if (init) \ + xrt_register_driver(&xrt_##name##_driver); \ + else \ + xrt_unregister_driver(&xrt_##name##_driver); \ +} + +/* Module's init/fini routines for leaf driver in xrt-lib module */ +void group_leaf_init_fini(bool init); +void vsec_leaf_init_fini(bool init); +void axigate_leaf_init_fini(bool init); +void icap_leaf_init_fini(bool init); +void calib_leaf_init_fini(bool init); +void clkfreq_leaf_init_fini(bool init); +void clock_leaf_init_fini(bool init); +void ucs_leaf_init_fini(bool init); + #endif /* _LIB_DRV_H_ */ diff --git a/drivers/fpga/xrt/lib/subdev.c b/drivers/fpga/xrt/lib/subdev.c index 3bbea514615295..acac264ea60eb2 100644 --- a/drivers/fpga/xrt/lib/subdev.c +++ b/drivers/fpga/xrt/lib/subdev.c @@ -65,14 +65,16 @@ static struct xrt_subdev *xrt_subdev_alloc(void) int xrt_subdev_root_request(struct xrt_device *self, u32 cmd, void *arg) { - struct device *dev = DEV(self); struct xrt_subdev_platdata *pdata = DEV_PDATA(self); + struct device *dev = DEV(self); + xrt_subdev_root_cb_t root_cb; if (!pdata->xsp_root_cb) { dev_err(dev, "invalid root callback"); return -EINVAL; } - return (*pdata->xsp_root_cb)(dev->parent, pdata->xsp_root_cb_arg, cmd, arg); + root_cb = pdata->xsp_root_cb; + return (*root_cb)(dev->parent, pdata->xsp_root_cb_arg, cmd, arg); } /* @@ -827,6 +829,7 @@ void xleaf_get_root_res(struct xrt_device *xdev, u32 region_id, struct resource xrt_subdev_root_request(xdev, XRT_ROOT_GET_RESOURCE, &arg); *res = arg.xpigr_res; } +EXPORT_SYMBOL_GPL(xleaf_get_root_res); void xleaf_get_root_id(struct xrt_device *xdev, unsigned short *vendor, unsigned short *device, unsigned short *subvendor, unsigned short *subdevice) diff --git a/drivers/fpga/xrt/lib/subdev_pool.h b/drivers/fpga/xrt/lib/subdev_pool.h index e4573710d48c97..03f617d7ffd708 100644 --- a/drivers/fpga/xrt/lib/subdev_pool.h +++ b/drivers/fpga/xrt/lib/subdev_pool.h @@ -11,7 +11,7 @@ #include #include -#include +#include "xroot.h" /* * The struct xrt_subdev_pool manages a list of xrt_subdevs for root and group drivers. diff --git a/drivers/fpga/xrt/lib/xleaf/axigate.c b/drivers/fpga/xrt/lib/xleaf/axigate.c index 72e9e41377ff0d..85cd7154fa5351 100644 --- a/drivers/fpga/xrt/lib/xleaf/axigate.c +++ b/drivers/fpga/xrt/lib/xleaf/axigate.c @@ -16,6 +16,7 @@ #include #include #include +#include "../lib-drv.h" #define XRT_AXIGATE "xrt_axigate" diff --git a/drivers/fpga/xrt/lib/xleaf/icap.c b/drivers/fpga/xrt/lib/xleaf/icap.c index a617a144925831..9dc784c33e962e 100644 --- a/drivers/fpga/xrt/lib/xleaf/icap.c +++ b/drivers/fpga/xrt/lib/xleaf/icap.c @@ -19,6 +19,7 @@ #include #include #include +#include "../lib-drv.h" #define XRT_ICAP "xrt_icap" diff --git a/drivers/fpga/xrt/lib/xroot.c b/drivers/fpga/xrt/lib/xroot.c index 80d8aca8fc6dd7..d04a697b6bcf2e 100644 --- a/drivers/fpga/xrt/lib/xroot.c +++ b/drivers/fpga/xrt/lib/xroot.c @@ -10,9 +10,10 @@ #include #include -#include -#include #include +#include +#include "xroot.h" +#include "group.h" #include "subdev_pool.h" #define xroot_err(xr, fmt, args...) dev_err((xr)->dev, "%s: " fmt, __func__, ##args) @@ -427,7 +428,7 @@ static void xroot_bringup_group_work(struct work_struct *work) r = xleaf_call(xdev, XRT_GROUP_INIT_CHILDREN, NULL); xroot_put_group(xr, xdev); if (r == -EEXIST) - continue; /* Already brough up, nothing to do. */ + continue; /* Already brought up, nothing to do. */ if (r) atomic_inc(&xr->groups.bringup_failed_cnt); diff --git a/drivers/fpga/xrt/mgmt/root.c b/drivers/fpga/xrt/mgmt/root.c index a979fb04460d9c..65228674151409 100644 --- a/drivers/fpga/xrt/mgmt/root.c +++ b/drivers/fpga/xrt/mgmt/root.c @@ -13,9 +13,8 @@ #include #include #include - #include -#include +#include "xroot.h" #include "xmgmt.h" #define XMGMT_MODULE_NAME "xrt-mgmt" diff --git a/drivers/fpga/xrt/mgmt/xmgmt-main.c b/drivers/fpga/xrt/mgmt/xmgmt-main.c index 6e8e64893cab61..385968802fbd53 100644 --- a/drivers/fpga/xrt/mgmt/xmgmt-main.c +++ b/drivers/fpga/xrt/mgmt/xmgmt-main.c @@ -142,7 +142,7 @@ static ssize_t VBNV_show(struct device *dev, struct device_attribute *da, char * } static DEVICE_ATTR_RO(VBNV); -/* logic uuid is the uuid uniquely identfy the partition */ +/* logic uuid is the uuid uniquely identify the partition */ static ssize_t logic_uuids_show(struct device *dev, struct device_attribute *da, char *buf) { struct xrt_device *xdev = to_xrt_dev(dev); diff --git a/drivers/fpga/xrt/mgmt/xrt-mgr.c b/drivers/fpga/xrt/mgmt/xrt-mgr.c index 26da78a25c4bc1..8bf82e600cbf51 100644 --- a/drivers/fpga/xrt/mgmt/xrt-mgr.c +++ b/drivers/fpga/xrt/mgmt/xrt-mgr.c @@ -115,7 +115,7 @@ static int xmgmt_pr_write_init(struct fpga_manager *mgr, } /* - * The implementation requries full xclbin image before we can start + * The implementation requires full xclbin image before we can start * programming the hardware via ICAP subsystem. The full image is required * for checking the validity of xclbin and walking the sections to * discover the bitstream. diff --git a/drivers/memory/Kconfig b/drivers/memory/Kconfig index 00e013b14703ed..02d9ad518b2227 100644 --- a/drivers/memory/Kconfig +++ b/drivers/memory/Kconfig @@ -216,6 +216,13 @@ config STM32_FMC2_EBI devices (like SRAM, ethernet adapters, FPGAs, LCD displays, ...) on SOCs containing the FMC2 External Bus Interface. +config XRT_DDR_CALIB + tristate "Support for Xilinx Alveo DDR calibration controller" + depends on FPGA_XRT_LIB + help + Selete this option to enable the Xilinx Alveo DDR calibration + controller. + source "drivers/memory/samsung/Kconfig" source "drivers/memory/tegra/Kconfig" diff --git a/drivers/memory/Makefile b/drivers/memory/Makefile index e71cf7b9964130..63cd884d9c83c3 100644 --- a/drivers/memory/Makefile +++ b/drivers/memory/Makefile @@ -24,6 +24,7 @@ obj-$(CONFIG_DA8XX_DDRCTL) += da8xx-ddrctl.o obj-$(CONFIG_PL353_SMC) += pl353-smc.o obj-$(CONFIG_RENESAS_RPCIF) += renesas-rpc-if.o obj-$(CONFIG_STM32_FMC2_EBI) += stm32-fmc2-ebi.o +obj-$(CONFIG_XRT_DDR_CALIB) += xrt-ddr-calibration.o obj-$(CONFIG_SAMSUNG_MC) += samsung/ obj-$(CONFIG_TEGRA_MC) += tegra/ diff --git a/drivers/fpga/xrt/lib/xleaf/ddr_calibration.c b/drivers/memory/xrt-ddr-calibration.c similarity index 90% rename from drivers/fpga/xrt/lib/xleaf/ddr_calibration.c rename to drivers/memory/xrt-ddr-calibration.c index 79e196f068fcb1..7fc54c1a9e96bc 100644 --- a/drivers/fpga/xrt/lib/xleaf/ddr_calibration.c +++ b/drivers/memory/xrt-ddr-calibration.c @@ -9,10 +9,12 @@ * Authors: * Lizhi Hou */ +#include #include #include #include #include +#include #include #define XRT_CALIB "xrt_calib" @@ -196,10 +198,18 @@ static struct xrt_dev_endpoints xrt_calib_endpoints[] = { { 0 }, }; +static const struct xrt_device_id xrt_calib_ids[] = { + { XRT_SUBDEV_CALIB }, + { } +}; +MODULE_DEVICE_TABLE(xrt, xrt_calib_ids); + static struct xrt_driver xrt_calib_driver = { .driver = { .name = XRT_CALIB, + .owner = THIS_MODULE, }, + .id_table = xrt_calib_ids, .subdev_id = XRT_SUBDEV_CALIB, .endpoints = xrt_calib_endpoints, .probe = xrt_calib_probe, @@ -207,4 +217,8 @@ static struct xrt_driver xrt_calib_driver = { .leaf_call = xrt_calib_leaf_call, }; -XRT_LEAF_INIT_FINI_FUNC(calib); +module_xrt_driver(xrt_calib_driver); + +MODULE_AUTHOR("XRT Team "); +MODULE_DESCRIPTION("Xilinx XRT DDR calibration controller driver"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig index 3b84a651f7e8be..491fa1168ae9bb 100644 --- a/drivers/mfd/Kconfig +++ b/drivers/mfd/Kconfig @@ -2167,12 +2167,18 @@ config MFD_INTEL_M10_BMC of the device. config XRT_DEVCTL - tristate "Xilinx XRT generic IO read and write driver" + tristate "Xilinx Alveo generic IO read and write driver" depends on FPGA_XRT_LIB - select FPGA_XRT_METADATA help Select this option to enable XRT devctl driver. This driver provides common support for read and write registers for Xilinx Alveo FPGA. +config XRT_VSEC + tristate "Xilinx Alveo VSEC driver" + depends on FPGA_XRT_LIB + help + Select this option to enable XRT VSEC driver. This driver provides + support for read and parse VSEC information for Xilinx Alveo FPGA. + endmenu endif diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile index 6a6253fcf0f919..7416a54c172676 100644 --- a/drivers/mfd/Makefile +++ b/drivers/mfd/Makefile @@ -268,5 +268,5 @@ obj-$(CONFIG_SGI_MFD_IOC3) += ioc3.o obj-$(CONFIG_MFD_SIMPLE_MFD_I2C) += simple-mfd-i2c.o obj-$(CONFIG_MFD_INTEL_M10_BMC) += intel-m10-bmc.o -xrt-devctl-objs := xrt-devctl-core.o obj-$(CONFIG_XRT_DEVCTL) += xrt-devctl.o +obj-$(CONFIG_XRT_VSEC) += xrt-vsec.o diff --git a/drivers/mfd/xrt-devctl-core.c b/drivers/mfd/xrt-devctl.c similarity index 99% rename from drivers/mfd/xrt-devctl-core.c rename to drivers/mfd/xrt-devctl.c index e1e8221c507edd..5ab8047864f9c3 100644 --- a/drivers/mfd/xrt-devctl-core.c +++ b/drivers/mfd/xrt-devctl.c @@ -8,7 +8,6 @@ * Lizhi Hou */ -#include #include #include #include @@ -168,6 +167,7 @@ static struct xrt_driver xrt_devctl_driver = { .name = XRT_DEVCTL, .owner = THIS_MODULE, }, + .id_table = xrt_devctl_ids, .subdev_id = XRT_SUBDEV_DEVCTL, .endpoints = xrt_devctl_endpoints, .probe = xrt_devctl_probe, diff --git a/drivers/fpga/xrt/lib/xleaf/vsec.c b/drivers/mfd/xrt-vsec.c similarity index 95% rename from drivers/fpga/xrt/lib/xleaf/vsec.c rename to drivers/mfd/xrt-vsec.c index 9085de77362020..79d18287856e80 100644 --- a/drivers/fpga/xrt/lib/xleaf/vsec.c +++ b/drivers/mfd/xrt-vsec.c @@ -8,6 +8,7 @@ * Lizhi Hou */ +#include #include #include #include @@ -358,15 +359,26 @@ static struct xrt_dev_endpoints xrt_vsec_endpoints[] = { { 0 }, }; +static const struct xrt_device_id xrt_vsec_ids[] = { + { XRT_SUBDEV_VSEC }, + { } +}; +MODULE_DEVICE_TABLE(xrt, xrt_vsec_ids); + static struct xrt_driver xrt_vsec_driver = { .driver = { .name = XRT_VSEC, + .owner = THIS_MODULE, }, + .id_table = xrt_vsec_ids, .subdev_id = XRT_SUBDEV_VSEC, .endpoints = xrt_vsec_endpoints, .probe = xrt_vsec_probe, .remove = xrt_vsec_remove, .leaf_call = xrt_vsec_leaf_call, }; +module_xrt_driver(xrt_vsec_driver); -XRT_LEAF_INIT_FINI_FUNC(vsec); +MODULE_AUTHOR("XRT Team "); +MODULE_DESCRIPTION("Xilinx XRT VSEC driver"); +MODULE_LICENSE("GPL v2"); diff --git a/include/linux/xrt/metadata.h b/include/linux/xrt/metadata.h index c4df88262f8ab1..f48d6d42f5ef92 100644 --- a/include/linux/xrt/metadata.h +++ b/include/linux/xrt/metadata.h @@ -194,7 +194,7 @@ int xrt_md_get_interface_uuids(struct device *dev, const char *blob, /* * The firmware provides a 128 bit hash string as a unique id to the * partition/interface. - * Existing hw does not yet use the cononical form, so it is necessary to + * Existing hw does not yet use the canonical form, so it is necessary to * use a translation function. */ static inline void xrt_md_trans_uuid2str(const uuid_t *uuid, char *uuidstr) diff --git a/include/linux/xrt/xdevice.h b/include/linux/xrt/xdevice.h index ef84e649e51fb9..36c055a2dab1b0 100644 --- a/include/linux/xrt/xdevice.h +++ b/include/linux/xrt/xdevice.h @@ -74,7 +74,7 @@ struct xrt_dev_endpoints { /* * struct xrt_driver - represent a xrt device driver * - * drv: driver model structure. + * driver: driver model structure. * id_table: pointer to table of device IDs the driver is interested in. * { } member terminated. * probe: mandatory callback for device binding. @@ -82,6 +82,7 @@ struct xrt_dev_endpoints { */ struct xrt_driver { struct device_driver driver; + const struct xrt_device_id *id_table; u32 subdev_id; struct xrt_dev_file_ops file_ops; struct xrt_dev_endpoints *endpoints; diff --git a/include/linux/xrt/xleaf.h b/include/linux/xrt/xleaf.h index f065fc766e0fd9..5913187f5c7927 100644 --- a/include/linux/xrt/xleaf.h +++ b/include/linux/xrt/xleaf.h @@ -13,7 +13,6 @@ #include #include "xdevice.h" #include "subdev_id.h" -#include "xroot.h" #include "events.h" /* All subdev drivers should use below common routines to print out msg. */ @@ -70,7 +69,7 @@ struct xrt_subdev_platdata { * Per driver instance callback. The xdev points to the instance. * Should always be defined for subdev driver to get service from root. */ - xrt_subdev_root_cb_t xsp_root_cb; + void *xsp_root_cb; void *xsp_root_cb_arg; /* Something to associate w/ root for msg printing. */ @@ -110,6 +109,10 @@ struct subdev_match_arg { int instance; }; +typedef bool (*xrt_subdev_match_t)(enum xrt_subdev_id, struct xrt_device *, void *); +#define XRT_SUBDEV_MATCH_PREV ((xrt_subdev_match_t)-1) +#define XRT_SUBDEV_MATCH_NEXT ((xrt_subdev_match_t)-2) + bool xleaf_has_endpoint(struct xrt_device *xdev, const char *endpoint_name); struct xrt_device *xleaf_get_leaf(struct xrt_device *xdev, xrt_subdev_match_t cb, void *arg); @@ -181,25 +184,4 @@ struct xrt_device *xleaf_devnode_open_excl(struct inode *inode); struct xrt_device *xleaf_devnode_open(struct inode *inode); void xleaf_devnode_close(struct inode *inode); -/* Module's init/fini routines for leaf driver in xrt-lib module */ -#define XRT_LEAF_INIT_FINI_FUNC(name) \ -void name##_leaf_init_fini(bool init) \ -{ \ - if (init) \ - xrt_register_driver(&xrt_##name##_driver); \ - else \ - xrt_unregister_driver(&xrt_##name##_driver); \ -} - -/* Module's init/fini routines for leaf driver in xrt-lib module */ -void group_leaf_init_fini(bool init); -void vsec_leaf_init_fini(bool init); -void devctl_leaf_init_fini(bool init); -void axigate_leaf_init_fini(bool init); -void icap_leaf_init_fini(bool init); -void calib_leaf_init_fini(bool init); -void clkfreq_leaf_init_fini(bool init); -void clock_leaf_init_fini(bool init); -void ucs_leaf_init_fini(bool init); - #endif /* _XRT_LEAF_H_ */