Received: by 10.223.185.116 with SMTP id b49csp3392273wrg; Tue, 13 Feb 2018 01:42:11 -0800 (PST) X-Google-Smtp-Source: AH8x225aA8UDvsfRLDCWIwK/3ivKbatFkSXjALqTToc0z0LksPSF6jwpu12WdfgqV83xW3PWUhUW X-Received: by 10.167.129.195 with SMTP id c3mr466771pfn.14.1518514931097; Tue, 13 Feb 2018 01:42:11 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518514931; cv=none; d=google.com; s=arc-20160816; b=dUHQ8xSRfNzbARHdrszcLxWaBq+ZibhpbB45oHU5poB1iSPfX0B4VPABjZxfpGtk1R dPS5634/BhUOZqDJUfQ9P1B+RZyqyowg5pLfEUyeTbiExWI5L1qCjKC56wjVDv4tCt9B V4x9RQduGtCxEclsG03h3XUlUnrCEJlWy/74dC3nn11XreyBggzixe65LHGr2bDY68rp bUIDZNEpyIUU4+H8jHt0imt2Z2L4KrzVkr5r20zvTYbAzK8xCAY9Qz2TQLh2goj7Dad3 pSI0FzUdCUlW5KMsNkdKlvM0iMMSsEsv6niyK9Z1kat0HjXDfB+/XUPgKHnDc3bFiygK MYgA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=OIz0m7/up0cJGloxaZPJFv3UHZMjVNb+ht8eTwj06hk=; b=YfnHp2U+YjnOJhxZQ8FtakPlc7avZAXsnqOd3775pELgFznCTFR2h5pFoKKdebHqsa dWJTNHS0HKAkH0WafC2M/JiVyj9CigZwGqHYVjCD2qNNC5jZXNAkkFoEFHOufESOyW3F nRFED9FmiXYNNEu90K2nDtfgxorfrnpYdm9K8WU+wML5H6mo95Ja12uwf9+0HEY/80Xs hoJOqYdBBAejjIJmoBqpHg8+s0T1p6EB70eBgdhvto5re8I28gbMf/bpzlF47DBfebb1 rYtTA41HvZjb+Vve/rIFPTrbL16ZLKbKnF4JBASDNK9W5EjDUJefCMUQC7jYlknrY6oE Dd1w== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u12-v6si3876484plr.462.2018.02.13.01.41.55; Tue, 13 Feb 2018 01:42:11 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933881AbeBMJji (ORCPT + 99 others); Tue, 13 Feb 2018 04:39:38 -0500 Received: from mga03.intel.com ([134.134.136.65]:27146 "EHLO mga03.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934560AbeBMJgE (ORCPT ); Tue, 13 Feb 2018 04:36:04 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 13 Feb 2018 01:36:03 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.46,507,1511856000"; d="scan'208";a="26889646" Received: from hao-dev.bj.intel.com ([10.238.157.61]) by FMSMGA003.fm.intel.com with ESMTP; 13 Feb 2018 01:36:01 -0800 From: Wu Hao To: atull@kernel.org, mdf@kernel.org, linux-fpga@vger.kernel.org, linux-kernel@vger.kernel.org Cc: linux-api@vger.kernel.org, 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 v4 21/24] fpga: dfl: afu: add header sub feature support Date: Tue, 13 Feb 2018 17:24:50 +0800 Message-Id: <1518513893-4719-22-git-send-email-hao.wu@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1518513893-4719-1-git-send-email-hao.wu@intel.com> References: <1518513893-4719-1-git-send-email-hao.wu@intel.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The port header register set is always present for port, it is mainly for capability, control and status of the ports that AFU connected to. This patch implements header sub feature support. Below user interfaces are created by this patch. Sysfs interface: * /sys/class/fpga_region///id Read-only. Port ID. Ioctl interface: * FPGA_PORT_RESET Reset the FPGA Port and its AFU. 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 Acked-by: Alan Tull --- v3: rename driver name to fpga-dfl-afu add more description for reset ioctl. fix some checkpatch issues. v4: rebase. add Acked-by from Alan. --- Documentation/ABI/testing/sysfs-platform-dfl-port | 7 ++++ drivers/fpga/dfl-afu-main.c | 44 ++++++++++++++++++++++- include/uapi/linux/fpga-dfl.h | 17 +++++++++ 3 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 Documentation/ABI/testing/sysfs-platform-dfl-port diff --git a/Documentation/ABI/testing/sysfs-platform-dfl-port b/Documentation/ABI/testing/sysfs-platform-dfl-port new file mode 100644 index 0000000..79e8332 --- /dev/null +++ b/Documentation/ABI/testing/sysfs-platform-dfl-port @@ -0,0 +1,7 @@ +What: /sys/bus/platform/devices/dfl-port.0/id +Date: Februray 2018 +KernelVersion: 4.16 +Contact: Wu Hao +Description: Read-only. It returns id of this port. One DFL FPGA device + may have more than one port. Userspace could use this id to + distinguish different ports under same FPGA device. diff --git a/drivers/fpga/dfl-afu-main.c b/drivers/fpga/dfl-afu-main.c index 70db28c..b2f8798 100644 --- a/drivers/fpga/dfl-afu-main.c +++ b/drivers/fpga/dfl-afu-main.c @@ -16,25 +16,66 @@ #include #include +#include #include "dfl.h" +static ssize_t +id_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int id = fpga_port_id(to_platform_device(dev)); + + return scnprintf(buf, PAGE_SIZE, "%d\n", id); +} +static DEVICE_ATTR_RO(id); + +static const struct attribute *port_hdr_attrs[] = { + &dev_attr_id.attr, + NULL, +}; + static int port_hdr_init(struct platform_device *pdev, struct feature *feature) { dev_dbg(&pdev->dev, "PORT HDR Init.\n"); - return 0; + fpga_port_reset(pdev); + + return sysfs_create_files(&pdev->dev.kobj, port_hdr_attrs); } static void port_hdr_uinit(struct platform_device *pdev, struct feature *feature) { dev_dbg(&pdev->dev, "PORT HDR UInit.\n"); + + sysfs_remove_files(&pdev->dev.kobj, port_hdr_attrs); +} + +static long +port_hdr_ioctl(struct platform_device *pdev, struct feature *feature, + unsigned int cmd, unsigned long arg) +{ + long ret; + + switch (cmd) { + case FPGA_PORT_RESET: + if (!arg) + ret = fpga_port_reset(pdev); + else + ret = -EINVAL; + break; + default: + dev_dbg(&pdev->dev, "%x cmd not handled", cmd); + ret = -ENODEV; + } + + return ret; } static const struct feature_ops port_hdr_ops = { .init = port_hdr_init, .uinit = port_hdr_uinit, + .ioctl = port_hdr_ioctl, }; static struct feature_driver port_feature_drvs[] = { @@ -74,6 +115,7 @@ static int afu_release(struct inode *inode, struct file *filp) dev_dbg(&pdev->dev, "Device File Release\n"); + fpga_port_reset(pdev); feature_dev_use_end(pdata); return 0; diff --git a/include/uapi/linux/fpga-dfl.h b/include/uapi/linux/fpga-dfl.h index 50ee831..727bec2 100644 --- a/include/uapi/linux/fpga-dfl.h +++ b/include/uapi/linux/fpga-dfl.h @@ -28,8 +28,11 @@ #define FPGA_MAGIC 0xB6 #define FPGA_BASE 0 +#define PORT_BASE 0x40 #define FME_BASE 0x80 +/* Common IOCTLs for both FME and AFU file descriptor */ + /** * FPGA_GET_API_VERSION - _IO(FPGA_MAGIC, FPGA_BASE + 0) * @@ -48,6 +51,20 @@ #define FPGA_CHECK_EXTENSION _IO(FPGA_MAGIC, FPGA_BASE + 1) +/* IOCTLs for AFU file descriptor */ + +/** + * FPGA_PORT_RESET - _IO(FPGA_MAGIC, PORT_BASE + 0) + * + * Reset the FPGA Port and its AFU. No parameters are supported. + * Userspace can do Port reset at any time, e.g during DMA or PR. But + * it should never cause any system level issue, only functional failure + * (e.g DMA or PR operation failure) and be recoverable from the failure. + * Return: 0 on success, -errno of failure + */ + +#define FPGA_PORT_RESET _IO(FPGA_MAGIC, PORT_BASE + 0) + /* IOCTLs for FME file descriptor */ /** -- 2.7.4