Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933909AbdC3MRI (ORCPT ); Thu, 30 Mar 2017 08:17:08 -0400 Received: from mga11.intel.com ([192.55.52.93]:59275 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932679AbdC3MQM (ORCPT ); Thu, 30 Mar 2017 08:16:12 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.36,246,1486454400"; d="scan'208";a="840018326" From: Wu Hao To: atull@kernel.org, moritz.fischer@ettus.com, linux-fpga@vger.kernel.org, linux-kernel@vger.kernel.org Cc: luwei.kang@intel.com, yi.z.zhang@intel.com, hao.wu@intel.com, Tim Whisonant , Enno Luebbers , Shiva Rao , Christopher Rauer , Xiao Guangrong Subject: [PATCH 12/16] fpga: intel: add FPGA Accelerated Function Unit driver basic framework Date: Thu, 30 Mar 2017 20:08:12 +0800 Message-Id: <1490875696-15145-13-git-send-email-hao.wu@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1490875696-15145-1-git-send-email-hao.wu@intel.com> References: <1490875696-15145-1-git-send-email-hao.wu@intel.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 6230 Lines: 222 On Intel FPGA devices, the Accelerated Function Unit (AFU), can be reprogrammed for different functions. It connects to the FPGA infrastructure("blue bistream") via a Port. Port CSRs are implemented separately from the AFU CSRs to provide control and status of the Port. Once valid green bitstream is programmed into the AFU, it allows access to the AFU CSRs in the AFU MMIO space. This patch only implements basic driver framework for AFU, including device file operation framework. Signed-off-by: Tim Whisonant Signed-off-by: Enno Luebbers Signed-off-by: Shiva Rao Signed-off-by: Christopher Rauer Signed-off-by: Xiao Guangrong Signed-off-by: Wu Hao --- drivers/fpga/intel/Kconfig | 9 +++ drivers/fpga/intel/Makefile | 2 + drivers/fpga/intel/afu-main.c | 161 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 172 insertions(+) create mode 100644 drivers/fpga/intel/afu-main.c diff --git a/drivers/fpga/intel/Kconfig b/drivers/fpga/intel/Kconfig index 62e2160..0e7112f 100644 --- a/drivers/fpga/intel/Kconfig +++ b/drivers/fpga/intel/Kconfig @@ -32,4 +32,13 @@ config INTEL_FPGA_FME all FPGA platform level management features. There shall be 1 FME per Intel FPGA. +config INTEL_FPGA_AFU + tristate "Intel FPGA AFU Driver" + depends on INTEL_FPGA_PCI + help + This is the driver for FPGA Accelerated Function Unit (AFU) which + implements AFU and Port management features. A User AFU connects + to the FPGA infrastructure via a Port. There may be more than 1 + Port/AFU per Intel FPGA. + endif diff --git a/drivers/fpga/intel/Makefile b/drivers/fpga/intel/Makefile index 0452cb6..53a54ab 100644 --- a/drivers/fpga/intel/Makefile +++ b/drivers/fpga/intel/Makefile @@ -1,5 +1,7 @@ obj-$(CONFIG_INTEL_FPGA_PCI) += intel-fpga-pci.o obj-$(CONFIG_INTEL_FPGA_FME) += intel-fpga-fme.o +obj-$(CONFIG_INTEL_FPGA_AFU) += intel-fpga-afu.o intel-fpga-pci-objs := pcie.o feature-dev.o intel-fpga-fme-objs := fme-main.o fme-pr.o +intel-fpga-afu-objs := afu-main.o diff --git a/drivers/fpga/intel/afu-main.c b/drivers/fpga/intel/afu-main.c new file mode 100644 index 0000000..1c2035b --- /dev/null +++ b/drivers/fpga/intel/afu-main.c @@ -0,0 +1,161 @@ +/* + * Driver for Intel FPGA Accelerated Function Unit (AFU) + * + * Copyright (C) 2017 Intel Corporation, Inc. + * + * Authors: + * Wu Hao + * Xiao Guangrong + * Joseph Grecco + * Enno Luebbers + * Tim Whisonant + * Ananda Ravuri + * Henry Mitchel + * + * This work is licensed under a dual BSD/GPLv2 license. When using or + * redistributing this file, you may do so under either license. See the + * LICENSE.BSD file under this directory for the BSD license and see + * the COPYING file in the top-level directory for the GPLv2 license. + */ + +#include +#include + +#include "feature-dev.h" + +static int port_hdr_init(struct platform_device *pdev, struct feature *feature) +{ + dev_dbg(&pdev->dev, "PORT HDR Init.\n"); + + return 0; +} + +static void port_hdr_uinit(struct platform_device *pdev, + struct feature *feature) +{ + dev_dbg(&pdev->dev, "PORT HDR UInit.\n"); +} + +struct feature_ops port_hdr_ops = { + .init = port_hdr_init, + .uinit = port_hdr_uinit, +}; + +static struct feature_driver port_feature_drvs[] = { + { + .name = PORT_FEATURE_HEADER, + .ops = &port_hdr_ops, + }, + { + .ops = NULL, + } +}; + +static int afu_open(struct inode *inode, struct file *filp) +{ + struct platform_device *fdev = fpga_inode_to_feature_dev(inode); + struct feature_platform_data *pdata; + int ret; + + pdata = dev_get_platdata(&fdev->dev); + if (WARN_ON(!pdata)) + return -ENODEV; + + ret = feature_dev_use_begin(pdata); + if (ret) + return ret; + + dev_dbg(&fdev->dev, "Device File Open\n"); + filp->private_data = fdev; + + return 0; +} + +static int afu_release(struct inode *inode, struct file *filp) +{ + struct platform_device *pdev = filp->private_data; + struct feature_platform_data *pdata = dev_get_platdata(&pdev->dev); + + dev_dbg(&pdev->dev, "Device File Release\n"); + + feature_dev_use_end(pdata); + return 0; +} + +static long afu_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) +{ + struct platform_device *pdev = filp->private_data; + struct feature_platform_data *pdata = dev_get_platdata(&pdev->dev); + struct feature *f; + long ret; + + dev_dbg(&pdev->dev, "%s cmd 0x%x\n", __func__, cmd); + + switch (cmd) { + default: + /* + * Let sub-feature's ioctl function to handle the cmd + * Sub-feature's ioctl returns -ENODEV when cmd is not + * handled in this sub feature, and returns 0 and other + * error code if cmd is handled. + */ + fpga_dev_for_each_feature(pdata, f) + if (f->ops && f->ops->ioctl) { + ret = f->ops->ioctl(pdev, f, cmd, arg); + if (ret == -ENODEV) + continue; + else + return ret; + } + } + + return -EINVAL; +} + +static const struct file_operations afu_fops = { + .owner = THIS_MODULE, + .open = afu_open, + .release = afu_release, + .unlocked_ioctl = afu_ioctl, +}; + +static int afu_probe(struct platform_device *pdev) +{ + int ret; + + dev_dbg(&pdev->dev, "%s\n", __func__); + + ret = fpga_dev_feature_init(pdev, port_feature_drvs); + if (ret) + return ret; + + ret = fpga_register_dev_ops(pdev, &afu_fops, THIS_MODULE); + if (ret) + fpga_dev_feature_uinit(pdev); + + return ret; +} + +static int afu_remove(struct platform_device *pdev) +{ + dev_dbg(&pdev->dev, "%s\n", __func__); + + fpga_dev_feature_uinit(pdev); + fpga_unregister_dev_ops(pdev); + return 0; +} + +static struct platform_driver afu_driver = { + .driver = { + .name = "intel-fpga-port", + }, + .probe = afu_probe, + .remove = afu_remove, +}; + +module_platform_driver(afu_driver); + +MODULE_DESCRIPTION("Intel FPGA Accelerated Function Unit driver"); +MODULE_AUTHOR("Intel Corporation"); +MODULE_LICENSE("Dual BSD/GPL"); +MODULE_ALIAS("platform:intel-fpga-port"); -- 2.7.4