Re: [PATCH V3 XRT Alveo 08/18] fpga: xrt: main platform driver for management function device
On 3/16/21 2:23 PM, Lizhi Hou wrote: > Hi Tom, > > > On 02/26/2021 09:22 AM, Tom Rix wrote: >> On 2/17/21 10:40 PM, Lizhi Hou wrote: >>> platform driver that handles IOCTLs, such as hot reset and xclbin download. >>> >>> Signed-off-by: Sonal Santan >>> Signed-off-by: Max Zhen >>> Signed-off-by: Lizhi Hou >>> --- >>> drivers/fpga/xrt/include/xmgmt-main.h | 37 ++ >>> drivers/fpga/xrt/mgmt/main-impl.h | 37 ++ >>> drivers/fpga/xrt/mgmt/main.c | 693 ++ >>> include/uapi/linux/xrt/xmgmt-ioctl.h | 46 ++ >>> 4 files changed, 813 insertions(+) >>> create mode 100644 drivers/fpga/xrt/include/xmgmt-main.h >>> create mode 100644 drivers/fpga/xrt/mgmt/main-impl.h >>> create mode 100644 drivers/fpga/xrt/mgmt/main.c >>> create mode 100644 include/uapi/linux/xrt/xmgmt-ioctl.h >>> >>> diff --git a/drivers/fpga/xrt/include/xmgmt-main.h >>> b/drivers/fpga/xrt/include/xmgmt-main.h >>> new file mode 100644 >>> index ..1216d1881f8e >>> --- /dev/null >>> +++ b/drivers/fpga/xrt/include/xmgmt-main.h >>> @@ -0,0 +1,37 @@ >>> +/* SPDX-License-Identifier: GPL-2.0 */ >>> +/* >>> + * Header file for Xilinx Runtime (XRT) driver >>> + * >>> + * Copyright (C) 2020-2021 Xilinx, Inc. >>> + * >>> + * Authors: >>> + * Cheng Zhen >>> + */ >>> + >>> +#ifndef _XMGMT_MAIN_H_ >>> +#define _XMGMT_MAIN_H_ >>> + >>> +#include >>> +#include "xleaf.h" >>> + >>> +enum xrt_mgmt_main_ioctl_cmd { >>> + /* section needs to be vfree'd by caller */ >>> + XRT_MGMT_MAIN_GET_AXLF_SECTION = XRT_XLEAF_CUSTOM_BASE, /* See >>> comments in xleaf.h */ >> the must free instructions should go with the pointer needing freeing > Sure. Will move the free instructions. >>> + /* vbnv needs to be kfree'd by caller */ >>> + XRT_MGMT_MAIN_GET_VBNV, >>> +}; >>> + >>> +enum provider_kind { >>> + XMGMT_BLP, >>> + XMGMT_PLP, >>> + XMGMT_ULP, >> what do these three mean ? > Will add comment > > /* There are three kind of partitions. Each of them is programmed > independently. */ > enum provider_kind { > XMGMT_BLP, /* Base Logic Partition */ > XMGMT_PLP, /* Provider Logic Partition */ > XMGMT_ULP, /* User Logic Partition */ > }; > looks good >>> +}; >>> + >>> +struct xrt_mgmt_main_ioctl_get_axlf_section { >>> + enum provider_kind xmmigas_axlf_kind; >>> + enum axlf_section_kind xmmigas_section_kind; >>> + void *xmmigas_section; >>> + u64 xmmigas_section_size; >>> +}; >>> + >>> +#endif /* _XMGMT_MAIN_H_ */ >>> diff --git a/drivers/fpga/xrt/mgmt/main-impl.h >>> b/drivers/fpga/xrt/mgmt/main-impl.h >> From prefix used in the functions, a better name for this file would be >> xmgnt.h > Will change. >>> new file mode 100644 >>> index ..dd1b3e3773cc >>> --- /dev/null >>> +++ b/drivers/fpga/xrt/mgmt/main-impl.h >>> @@ -0,0 +1,37 @@ >>> +/* SPDX-License-Identifier: GPL-2.0 */ >>> +/* >>> + * Header file for Xilinx Alveo Management Function Driver >>> + * >>> + * Copyright (C) 2020-2021 Xilinx, Inc. >>> + * >>> + * Authors: >>> + * Lizhi Hou >>> + * Cheng Zhen >>> + */ >>> + >>> +#ifndef _XMGMT_MAIN_IMPL_H_ >>> +#define _XMGMT_MAIN_IMPL_H_ >>> + >>> +#include >>> +#include "xmgmt-main.h" >>> + >>> +struct fpga_manager; >>> +int xmgmt_process_xclbin(struct platform_device *pdev, >>> + struct fpga_manager *fmgr, >>> + const struct axlf *xclbin, >>> + enum provider_kind kind); >>> +void xmgmt_region_cleanup_all(struct platform_device *pdev); >>> + >>> +int bitstream_axlf_mailbox(struct platform_device *pdev, const void >>> *xclbin); >> the prefix should be consistent > Will fix this. >>> +int xmgmt_hot_reset(struct platform_device *pdev); >>> + >>> +/* Getting dtb for specified group. Caller should vfree returned dtb .*/ >>> +char *xmgmt_get_dtb(struct platform_device *pdev, enum provider_kind kind); >>> +char *xmgmt_get_vbnv(struct platform_device *pdev); >>> +int xmgmt_get_provider_uuid(struct platform_device *pdev, >>> + enum provider_kind kind, uuid_t *uuid); >>> + >>> +int xmgmt_main_register_leaf(void); >>> +void xmgmt_main_unregister_leaf(void); >> is _main_ needed ? > Will remove. >>> + >>> +#endif /* _XMGMT_MAIN_IMPL_H_ */ >>> diff --git a/drivers/fpga/xrt/mgmt/main.c b/drivers/fpga/xrt/mgmt/main.c >>> new file mode 100644 >>> index ..66ffb4e7029d >>> --- /dev/null >>> +++ b/drivers/fpga/xrt/mgmt/main.c >>> @@ -0,0 +1,693 @@ >>> +// SPDX-License-Identifier: GPL-2.0 >>> +/* >>> + * Xilinx Alveo FPGA MGMT PF entry point driver >>> + * >>> + * Copyright (C) 2020-2021 Xilinx, Inc. >>> + * >>> + * Authors: >>> + * Sonal Santan >>> + */ >>> + >>> +#include >>> +#include >>> +#include "xclbin-helper.h" >>> +#include "metadata.h" >>> +#include "xleaf.h" >>> +#include >>> +#include "xleaf/devctl.h" >>> +#include "xmgmt-main.h" >>> +#include "fmgr.h" >>> +#include "xleaf/icap.h" >>> +#include "xleaf/axigate.h"
Re: [PATCH V3 XRT Alveo 08/18] fpga: xrt: main platform driver for management function device
Hi Tom, On 02/26/2021 09:22 AM, Tom Rix wrote: On 2/17/21 10:40 PM, Lizhi Hou wrote: platform driver that handles IOCTLs, such as hot reset and xclbin download. Signed-off-by: Sonal Santan Signed-off-by: Max Zhen Signed-off-by: Lizhi Hou --- drivers/fpga/xrt/include/xmgmt-main.h | 37 ++ drivers/fpga/xrt/mgmt/main-impl.h | 37 ++ drivers/fpga/xrt/mgmt/main.c | 693 ++ include/uapi/linux/xrt/xmgmt-ioctl.h | 46 ++ 4 files changed, 813 insertions(+) create mode 100644 drivers/fpga/xrt/include/xmgmt-main.h create mode 100644 drivers/fpga/xrt/mgmt/main-impl.h create mode 100644 drivers/fpga/xrt/mgmt/main.c create mode 100644 include/uapi/linux/xrt/xmgmt-ioctl.h diff --git a/drivers/fpga/xrt/include/xmgmt-main.h b/drivers/fpga/xrt/include/xmgmt-main.h new file mode 100644 index ..1216d1881f8e --- /dev/null +++ b/drivers/fpga/xrt/include/xmgmt-main.h @@ -0,0 +1,37 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Header file for Xilinx Runtime (XRT) driver + * + * Copyright (C) 2020-2021 Xilinx, Inc. + * + * Authors: + * Cheng Zhen + */ + +#ifndef _XMGMT_MAIN_H_ +#define _XMGMT_MAIN_H_ + +#include +#include "xleaf.h" + +enum xrt_mgmt_main_ioctl_cmd { + /* section needs to be vfree'd by caller */ + XRT_MGMT_MAIN_GET_AXLF_SECTION = XRT_XLEAF_CUSTOM_BASE, /* See comments in xleaf.h */ the must free instructions should go with the pointer needing freeing Sure. Will move the free instructions. + /* vbnv needs to be kfree'd by caller */ + XRT_MGMT_MAIN_GET_VBNV, +}; + +enum provider_kind { + XMGMT_BLP, + XMGMT_PLP, + XMGMT_ULP, what do these three mean ? Will add comment /* There are three kind of partitions. Each of them is programmed independently. */ enum provider_kind { XMGMT_BLP, /* Base Logic Partition */ XMGMT_PLP, /* Provider Logic Partition */ XMGMT_ULP, /* User Logic Partition */ }; +}; + +struct xrt_mgmt_main_ioctl_get_axlf_section { + enum provider_kind xmmigas_axlf_kind; + enum axlf_section_kind xmmigas_section_kind; + void *xmmigas_section; + u64 xmmigas_section_size; +}; + +#endif /* _XMGMT_MAIN_H_ */ diff --git a/drivers/fpga/xrt/mgmt/main-impl.h b/drivers/fpga/xrt/mgmt/main-impl.h From prefix used in the functions, a better name for this file would be xmgnt.h Will change. new file mode 100644 index ..dd1b3e3773cc --- /dev/null +++ b/drivers/fpga/xrt/mgmt/main-impl.h @@ -0,0 +1,37 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Header file for Xilinx Alveo Management Function Driver + * + * Copyright (C) 2020-2021 Xilinx, Inc. + * + * Authors: + * Lizhi Hou + * Cheng Zhen + */ + +#ifndef _XMGMT_MAIN_IMPL_H_ +#define _XMGMT_MAIN_IMPL_H_ + +#include +#include "xmgmt-main.h" + +struct fpga_manager; +int xmgmt_process_xclbin(struct platform_device *pdev, + struct fpga_manager *fmgr, + const struct axlf *xclbin, + enum provider_kind kind); +void xmgmt_region_cleanup_all(struct platform_device *pdev); + +int bitstream_axlf_mailbox(struct platform_device *pdev, const void *xclbin); the prefix should be consistent Will fix this. +int xmgmt_hot_reset(struct platform_device *pdev); + +/* Getting dtb for specified group. Caller should vfree returned dtb .*/ +char *xmgmt_get_dtb(struct platform_device *pdev, enum provider_kind kind); +char *xmgmt_get_vbnv(struct platform_device *pdev); +int xmgmt_get_provider_uuid(struct platform_device *pdev, + enum provider_kind kind, uuid_t *uuid); + +int xmgmt_main_register_leaf(void); +void xmgmt_main_unregister_leaf(void); is _main_ needed ? Will remove. + +#endif /* _XMGMT_MAIN_IMPL_H_ */ diff --git a/drivers/fpga/xrt/mgmt/main.c b/drivers/fpga/xrt/mgmt/main.c new file mode 100644 index ..66ffb4e7029d --- /dev/null +++ b/drivers/fpga/xrt/mgmt/main.c @@ -0,0 +1,693 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Xilinx Alveo FPGA MGMT PF entry point driver + * + * Copyright (C) 2020-2021 Xilinx, Inc. + * + * Authors: + * Sonal Santan + */ + +#include +#include +#include "xclbin-helper.h" +#include "metadata.h" +#include "xleaf.h" +#include +#include "xleaf/devctl.h" +#include "xmgmt-main.h" +#include "fmgr.h" +#include "xleaf/icap.h" +#include "xleaf/axigate.h" +#include "main-impl.h" + +#define XMGMT_MAIN "xmgmt_main" + +struct xmgmt_main { + struct platform_device *pdev; + struct axlf *firmware_blp; + struct axlf *firmware_plp; + struct axlf *firmware_ulp; + bool flash_ready; + bool devctl_ready; could combine in a bitfield Will change. + struct fpga_manager *fmgr; + struct mutex busy_mutex; /* busy lock */ busy_mutex ? maybe just call this 'lock' Will change. + + uuid_t *blp_intf_uuids; + u32 blp_intf_uuid_num; expand intf to interface Will change. +}; + +/* Caller should be responsible for freeing the returned
Re: [PATCH V3 XRT Alveo 08/18] fpga: xrt: main platform driver for management function device
On 2/17/21 10:40 PM, Lizhi Hou wrote: > platform driver that handles IOCTLs, such as hot reset and xclbin download. > > Signed-off-by: Sonal Santan > Signed-off-by: Max Zhen > Signed-off-by: Lizhi Hou > --- > drivers/fpga/xrt/include/xmgmt-main.h | 37 ++ > drivers/fpga/xrt/mgmt/main-impl.h | 37 ++ > drivers/fpga/xrt/mgmt/main.c | 693 ++ > include/uapi/linux/xrt/xmgmt-ioctl.h | 46 ++ > 4 files changed, 813 insertions(+) > create mode 100644 drivers/fpga/xrt/include/xmgmt-main.h > create mode 100644 drivers/fpga/xrt/mgmt/main-impl.h > create mode 100644 drivers/fpga/xrt/mgmt/main.c > create mode 100644 include/uapi/linux/xrt/xmgmt-ioctl.h > > diff --git a/drivers/fpga/xrt/include/xmgmt-main.h > b/drivers/fpga/xrt/include/xmgmt-main.h > new file mode 100644 > index ..1216d1881f8e > --- /dev/null > +++ b/drivers/fpga/xrt/include/xmgmt-main.h > @@ -0,0 +1,37 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Header file for Xilinx Runtime (XRT) driver > + * > + * Copyright (C) 2020-2021 Xilinx, Inc. > + * > + * Authors: > + * Cheng Zhen > + */ > + > +#ifndef _XMGMT_MAIN_H_ > +#define _XMGMT_MAIN_H_ > + > +#include > +#include "xleaf.h" > + > +enum xrt_mgmt_main_ioctl_cmd { > + /* section needs to be vfree'd by caller */ > + XRT_MGMT_MAIN_GET_AXLF_SECTION = XRT_XLEAF_CUSTOM_BASE, /* See comments > in xleaf.h */ the must free instructions should go with the pointer needing freeing > + /* vbnv needs to be kfree'd by caller */ > + XRT_MGMT_MAIN_GET_VBNV, > +}; > + > +enum provider_kind { > + XMGMT_BLP, > + XMGMT_PLP, > + XMGMT_ULP, what do these three mean ? > +}; > + > +struct xrt_mgmt_main_ioctl_get_axlf_section { > + enum provider_kind xmmigas_axlf_kind; > + enum axlf_section_kind xmmigas_section_kind; > + void *xmmigas_section; > + u64 xmmigas_section_size; > +}; > + > +#endif /* _XMGMT_MAIN_H_ */ > diff --git a/drivers/fpga/xrt/mgmt/main-impl.h > b/drivers/fpga/xrt/mgmt/main-impl.h >From prefix used in the functions, a better name for this file would be xmgnt.h > new file mode 100644 > index ..dd1b3e3773cc > --- /dev/null > +++ b/drivers/fpga/xrt/mgmt/main-impl.h > @@ -0,0 +1,37 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Header file for Xilinx Alveo Management Function Driver > + * > + * Copyright (C) 2020-2021 Xilinx, Inc. > + * > + * Authors: > + * Lizhi Hou > + * Cheng Zhen > + */ > + > +#ifndef _XMGMT_MAIN_IMPL_H_ > +#define _XMGMT_MAIN_IMPL_H_ > + > +#include > +#include "xmgmt-main.h" > + > +struct fpga_manager; > +int xmgmt_process_xclbin(struct platform_device *pdev, > + struct fpga_manager *fmgr, > + const struct axlf *xclbin, > + enum provider_kind kind); > +void xmgmt_region_cleanup_all(struct platform_device *pdev); > + > +int bitstream_axlf_mailbox(struct platform_device *pdev, const void *xclbin); the prefix should be consistent > +int xmgmt_hot_reset(struct platform_device *pdev); > + > +/* Getting dtb for specified group. Caller should vfree returned dtb .*/ > +char *xmgmt_get_dtb(struct platform_device *pdev, enum provider_kind kind); > +char *xmgmt_get_vbnv(struct platform_device *pdev); > +int xmgmt_get_provider_uuid(struct platform_device *pdev, > + enum provider_kind kind, uuid_t *uuid); > + > +int xmgmt_main_register_leaf(void); > +void xmgmt_main_unregister_leaf(void); is _main_ needed ? > + > +#endif /* _XMGMT_MAIN_IMPL_H_ */ > diff --git a/drivers/fpga/xrt/mgmt/main.c b/drivers/fpga/xrt/mgmt/main.c > new file mode 100644 > index ..66ffb4e7029d > --- /dev/null > +++ b/drivers/fpga/xrt/mgmt/main.c > @@ -0,0 +1,693 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Xilinx Alveo FPGA MGMT PF entry point driver > + * > + * Copyright (C) 2020-2021 Xilinx, Inc. > + * > + * Authors: > + * Sonal Santan > + */ > + > +#include > +#include > +#include "xclbin-helper.h" > +#include "metadata.h" > +#include "xleaf.h" > +#include > +#include "xleaf/devctl.h" > +#include "xmgmt-main.h" > +#include "fmgr.h" > +#include "xleaf/icap.h" > +#include "xleaf/axigate.h" > +#include "main-impl.h" > + > +#define XMGMT_MAIN "xmgmt_main" > + > +struct xmgmt_main { > + struct platform_device *pdev; > + struct axlf *firmware_blp; > + struct axlf *firmware_plp; > + struct axlf *firmware_ulp; > + bool flash_ready; > + bool devctl_ready; could combine in a bitfield > + struct fpga_manager *fmgr; > + struct mutex busy_mutex; /* busy lock */ busy_mutex ? maybe just call this 'lock' > + > + uuid_t *blp_intf_uuids; > + u32 blp_intf_uuid_num; expand intf to interface > +}; > + > +/* Caller should be responsible for freeing the returned string. */ should be -> is > +char *xmgmt_get_vbnv(struct platform_device *pdev) what is 'vbnv' ? > +{ > + struct xmgmt_main *xmm = platform_get_drvdata(pdev); > + const
[PATCH V3 XRT Alveo 08/18] fpga: xrt: main platform driver for management function device
platform driver that handles IOCTLs, such as hot reset and xclbin download. Signed-off-by: Sonal Santan Signed-off-by: Max Zhen Signed-off-by: Lizhi Hou --- drivers/fpga/xrt/include/xmgmt-main.h | 37 ++ drivers/fpga/xrt/mgmt/main-impl.h | 37 ++ drivers/fpga/xrt/mgmt/main.c | 693 ++ include/uapi/linux/xrt/xmgmt-ioctl.h | 46 ++ 4 files changed, 813 insertions(+) create mode 100644 drivers/fpga/xrt/include/xmgmt-main.h create mode 100644 drivers/fpga/xrt/mgmt/main-impl.h create mode 100644 drivers/fpga/xrt/mgmt/main.c create mode 100644 include/uapi/linux/xrt/xmgmt-ioctl.h diff --git a/drivers/fpga/xrt/include/xmgmt-main.h b/drivers/fpga/xrt/include/xmgmt-main.h new file mode 100644 index ..1216d1881f8e --- /dev/null +++ b/drivers/fpga/xrt/include/xmgmt-main.h @@ -0,0 +1,37 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Header file for Xilinx Runtime (XRT) driver + * + * Copyright (C) 2020-2021 Xilinx, Inc. + * + * Authors: + * Cheng Zhen + */ + +#ifndef _XMGMT_MAIN_H_ +#define _XMGMT_MAIN_H_ + +#include +#include "xleaf.h" + +enum xrt_mgmt_main_ioctl_cmd { + /* section needs to be vfree'd by caller */ + XRT_MGMT_MAIN_GET_AXLF_SECTION = XRT_XLEAF_CUSTOM_BASE, /* See comments in xleaf.h */ + /* vbnv needs to be kfree'd by caller */ + XRT_MGMT_MAIN_GET_VBNV, +}; + +enum provider_kind { + XMGMT_BLP, + XMGMT_PLP, + XMGMT_ULP, +}; + +struct xrt_mgmt_main_ioctl_get_axlf_section { + enum provider_kind xmmigas_axlf_kind; + enum axlf_section_kind xmmigas_section_kind; + void *xmmigas_section; + u64 xmmigas_section_size; +}; + +#endif /* _XMGMT_MAIN_H_ */ diff --git a/drivers/fpga/xrt/mgmt/main-impl.h b/drivers/fpga/xrt/mgmt/main-impl.h new file mode 100644 index ..dd1b3e3773cc --- /dev/null +++ b/drivers/fpga/xrt/mgmt/main-impl.h @@ -0,0 +1,37 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Header file for Xilinx Alveo Management Function Driver + * + * Copyright (C) 2020-2021 Xilinx, Inc. + * + * Authors: + * Lizhi Hou + * Cheng Zhen + */ + +#ifndef _XMGMT_MAIN_IMPL_H_ +#define _XMGMT_MAIN_IMPL_H_ + +#include +#include "xmgmt-main.h" + +struct fpga_manager; +int xmgmt_process_xclbin(struct platform_device *pdev, +struct fpga_manager *fmgr, +const struct axlf *xclbin, +enum provider_kind kind); +void xmgmt_region_cleanup_all(struct platform_device *pdev); + +int bitstream_axlf_mailbox(struct platform_device *pdev, const void *xclbin); +int xmgmt_hot_reset(struct platform_device *pdev); + +/* Getting dtb for specified group. Caller should vfree returned dtb .*/ +char *xmgmt_get_dtb(struct platform_device *pdev, enum provider_kind kind); +char *xmgmt_get_vbnv(struct platform_device *pdev); +int xmgmt_get_provider_uuid(struct platform_device *pdev, + enum provider_kind kind, uuid_t *uuid); + +int xmgmt_main_register_leaf(void); +void xmgmt_main_unregister_leaf(void); + +#endif /* _XMGMT_MAIN_IMPL_H_ */ diff --git a/drivers/fpga/xrt/mgmt/main.c b/drivers/fpga/xrt/mgmt/main.c new file mode 100644 index ..66ffb4e7029d --- /dev/null +++ b/drivers/fpga/xrt/mgmt/main.c @@ -0,0 +1,693 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Xilinx Alveo FPGA MGMT PF entry point driver + * + * Copyright (C) 2020-2021 Xilinx, Inc. + * + * Authors: + * Sonal Santan + */ + +#include +#include +#include "xclbin-helper.h" +#include "metadata.h" +#include "xleaf.h" +#include +#include "xleaf/devctl.h" +#include "xmgmt-main.h" +#include "fmgr.h" +#include "xleaf/icap.h" +#include "xleaf/axigate.h" +#include "main-impl.h" + +#define XMGMT_MAIN "xmgmt_main" + +struct xmgmt_main { + struct platform_device *pdev; + struct axlf *firmware_blp; + struct axlf *firmware_plp; + struct axlf *firmware_ulp; + bool flash_ready; + bool devctl_ready; + struct fpga_manager *fmgr; + struct mutex busy_mutex; /* busy lock */ + + uuid_t *blp_intf_uuids; + u32 blp_intf_uuid_num; +}; + +/* Caller should be responsible for freeing the returned string. */ +char *xmgmt_get_vbnv(struct platform_device *pdev) +{ + struct xmgmt_main *xmm = platform_get_drvdata(pdev); + const char *vbnv; + char *ret; + int i; + + if (xmm->firmware_plp) + vbnv = xmm->firmware_plp->m_header.m_platformVBNV; + else if (xmm->firmware_blp) + vbnv = xmm->firmware_blp->m_header.m_platformVBNV; + else + return NULL; + + ret = kstrdup(vbnv, GFP_KERNEL); + if (!ret) + return NULL; + + for (i = 0; i < strlen(ret); i++) { + if (ret[i] == ':' || ret[i] == '.') + ret[i] = '_'; + } + return ret; +} + +static int get_dev_uuid(struct platform_device *pdev, char *uuidstr, size_t len) +{ + char