Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp2162276ybt; Mon, 15 Jun 2020 21:16:21 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwuO0Qg7WPxZW476kUBvcZfbFM5LIeTcm2KtP+a+vtd64EQwBAGK3u9psfIIrBFahJwVURJ X-Received: by 2002:a1c:3b43:: with SMTP id i64mr1119617wma.112.1592280981497; Mon, 15 Jun 2020 21:16:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1592280981; cv=none; d=google.com; s=arc-20160816; b=GyuMTF7IqnT2KwRKbHjd8b/X3Gsdb65MHZ/paVSSWBvlslVr4m3JKmG/g6KjRNBcOk r5Q67W1uOCDMXhNnIlK3OBOx3TVlazb5BHip51iqxLrtqDSFj0R7uGkLmd0tkOP282HF h+5OI6fzc5rtS0dm2ZQ0vjrzhukB9teYw4bfJD8OCVWUQYsZyL31eArYXctw/FvLjlqH 3C22KcRme7JrGkxNyEVwo54BGWgXLfZtm4WqC/1l0KQG0mt6CccV8B5j26/SVm8fkCdX NufwyQCACsagE8gTl0s+Q84WnHUfyNlbpzdBNPuEIinsc8IcArZN1fm3Yf5ZqkA2tx/+ /1Eg== 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:ironport-sdr:ironport-sdr; bh=U12H3LMGF06yCks5WlVlYmCsafMLF/T0UzAcu3Q4E1s=; b=A85XaZu8lqL2Q2Tyl41T9IcVYwiemDifgp1FlPmL+fOrz1sB9nkJQg3Meevkawu/bX ioRwgujO4abYZIagkLCGB+aHEYKYEbgFueIsyEIpITaUNiLQ19Qy9Upzm8kfmXGCEa/g QvAy5Nz4QbO8ias6yBG6EcIJUpZaScr5GNTo5uX5wmSl+3xuIoYjUvVbBwC0YOckv7a9 Vm5oSMDvkkuHKYcX0A+wket62LHPo1OxmnXZkGJY0wnC0cE/iP3+gOILHbc7mH5Uwnyo f04/xFdHUUK0ViY1J+hPo8ysXt1m0xGtx5z8oySvjryrHed3CtAxq6TLO949jaWEdYq8 6waw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id b5si12075981edz.386.2020.06.15.21.15.59; Mon, 15 Jun 2020 21:16:21 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726909AbgFPENK (ORCPT + 99 others); Tue, 16 Jun 2020 00:13:10 -0400 Received: from mga14.intel.com ([192.55.52.115]:64734 "EHLO mga14.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725306AbgFPENI (ORCPT ); Tue, 16 Jun 2020 00:13:08 -0400 IronPort-SDR: ncnNi3CtAJDCUdbmXbhBPuQOcBWedghBXOc2vu97ID5+Nt1Ydgz1DBRmc7J8HlvnE1rcAgzY2Z Z9XWrm7uacHQ== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Jun 2020 21:13:07 -0700 IronPort-SDR: 5WYWfa8og97tWU6+vI5Sy4eRHRWkzY+LBx3rVlkywkTQBfLbJP6tDDrXKYgyLrHz81O+2hpjs3 vgtwJstflrJQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.73,517,1583222400"; d="scan'208";a="261298543" Received: from yilunxu-optiplex-7050.sh.intel.com ([10.239.159.141]) by fmsmga007.fm.intel.com with ESMTP; 15 Jun 2020 21:13:03 -0700 From: Xu Yilun To: mdf@kernel.org, linux-fpga@vger.kernel.org, linux-kernel@vger.kernel.org Cc: trix@redhat.com, bhu@redhat.com, mtosatti@redhat.com, gregkh@linuxfoundation.org, Xu Yilun , Luwei Kang , Wu Hao Subject: [PATCH v7 5/7] fpga: dfl: fme: add interrupt support for global error reporting Date: Tue, 16 Jun 2020 12:08:46 +0800 Message-Id: <1592280528-6350-6-git-send-email-yilun.xu@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1592280528-6350-1-git-send-email-yilun.xu@intel.com> References: <1592280528-6350-1-git-send-email-yilun.xu@intel.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Error reporting interrupt is very useful to notify users that some errors are detected by the hardware. Once users are notified, they could query hardware logged error states, no need to continuously poll on these states. This patch adds interrupt support for fme global error reporting sub feature. It follows the common DFL interrupt notification and handling mechanism. And it implements two ioctls below for user to query number of irqs supported, and set/unset interrupt triggers. Ioctls: * DFL_FPGA_FME_ERR_GET_IRQ_NUM get the number of irqs, which is used to determine whether/how many interrupts fme error reporting feature supports. * DFL_FPGA_FME_ERR_SET_IRQ set/unset given eventfds as fme error reporting interrupt triggers. Signed-off-by: Luwei Kang Signed-off-by: Wu Hao Signed-off-by: Xu Yilun Reviewed-by: Marcelo Tosatti Acked-by: Wu Hao --- v2: use DFL_FPGA_FME_ERR_GET_IRQ_NUM instead of DFL_FPGA_FME_ERR_GET_INFO Delete flags field for DFL_FPGA_FME_ERR_SET_IRQ v3: put_user() instead of copy_to_user() improves comments v4: use common functions to handle irq ioctls v5: Minor fixes for Hao's comments v6: No change v7: No change --- drivers/fpga/dfl-fme-error.c | 18 ++++++++++++++++++ drivers/fpga/dfl-fme-main.c | 6 ++++++ include/uapi/linux/fpga-dfl.h | 23 +++++++++++++++++++++++ 3 files changed, 47 insertions(+) diff --git a/drivers/fpga/dfl-fme-error.c b/drivers/fpga/dfl-fme-error.c index f897d41..51c2892 100644 --- a/drivers/fpga/dfl-fme-error.c +++ b/drivers/fpga/dfl-fme-error.c @@ -15,6 +15,7 @@ * Mitchel, Henry */ +#include #include #include "dfl.h" @@ -348,6 +349,22 @@ static void fme_global_err_uinit(struct platform_device *pdev, fme_err_mask(&pdev->dev, true); } +static long +fme_global_error_ioctl(struct platform_device *pdev, + struct dfl_feature *feature, + unsigned int cmd, unsigned long arg) +{ + switch (cmd) { + case DFL_FPGA_FME_ERR_GET_IRQ_NUM: + return dfl_feature_ioctl_get_num_irqs(pdev, feature, arg); + case DFL_FPGA_FME_ERR_SET_IRQ: + return dfl_feature_ioctl_set_irq(pdev, feature, arg); + default: + dev_dbg(&pdev->dev, "%x cmd not handled", cmd); + return -ENODEV; + } +} + const struct dfl_feature_id fme_global_err_id_table[] = { {.id = FME_FEATURE_ID_GLOBAL_ERR,}, {0,} @@ -356,4 +373,5 @@ const struct dfl_feature_id fme_global_err_id_table[] = { const struct dfl_feature_ops fme_global_err_ops = { .init = fme_global_err_init, .uinit = fme_global_err_uinit, + .ioctl = fme_global_error_ioctl, }; diff --git a/drivers/fpga/dfl-fme-main.c b/drivers/fpga/dfl-fme-main.c index fc210d4..77ea04d 100644 --- a/drivers/fpga/dfl-fme-main.c +++ b/drivers/fpga/dfl-fme-main.c @@ -620,11 +620,17 @@ static int fme_release(struct inode *inode, struct file *filp) { struct dfl_feature_platform_data *pdata = filp->private_data; struct platform_device *pdev = pdata->dev; + struct dfl_feature *feature; dev_dbg(&pdev->dev, "Device File Release\n"); mutex_lock(&pdata->lock); dfl_feature_dev_use_end(pdata); + + if (!dfl_feature_dev_use_count(pdata)) + dfl_fpga_dev_for_each_feature(pdata, feature) + dfl_fpga_set_irq_triggers(feature, 0, + feature->nr_irqs, NULL); mutex_unlock(&pdata->lock); return 0; diff --git a/include/uapi/linux/fpga-dfl.h b/include/uapi/linux/fpga-dfl.h index 6c71c9d..b6495ea 100644 --- a/include/uapi/linux/fpga-dfl.h +++ b/include/uapi/linux/fpga-dfl.h @@ -230,4 +230,27 @@ struct dfl_fpga_fme_port_pr { */ #define DFL_FPGA_FME_PORT_ASSIGN _IOW(DFL_FPGA_MAGIC, DFL_FME_BASE + 2, int) +/** + * DFL_FPGA_FME_ERR_GET_IRQ_NUM - _IOR(DFL_FPGA_MAGIC, DFL_FME_BASE + 3, + * __u32 num_irqs) + * + * Get the number of irqs supported by the fpga fme error reporting private + * feature. Currently hardware supports up to 1 irq. + * Return: 0 on success, -errno on failure. + */ +#define DFL_FPGA_FME_ERR_GET_IRQ_NUM _IOR(DFL_FPGA_MAGIC, \ + DFL_FME_BASE + 3, __u32) + +/** + * DFL_FPGA_FME_ERR_SET_IRQ - _IOW(DFL_FPGA_MAGIC, DFL_FME_BASE + 4, + * struct dfl_fpga_irq_set) + * + * Set fpga fme error reporting interrupt trigger if evtfds[n] is valid. + * Unset related interrupt trigger if evtfds[n] is a negative value. + * Return: 0 on success, -errno on failure. + */ +#define DFL_FPGA_FME_ERR_SET_IRQ _IOW(DFL_FPGA_MAGIC, \ + DFL_FME_BASE + 4, \ + struct dfl_fpga_irq_set) + #endif /* _UAPI_LINUX_FPGA_DFL_H */ -- 2.7.4