Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp1326406pxv; Fri, 16 Jul 2021 06:56:38 -0700 (PDT) X-Google-Smtp-Source: ABdhPJygabhZNJxq5V3ax9Zk7CNOG2eTAoEfcfHeZ4fatN0e8asOWDvDDRCV6XxSt0SaVk2AAHlH X-Received: by 2002:a17:906:4e85:: with SMTP id v5mr11945086eju.67.1626443797844; Fri, 16 Jul 2021 06:56:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626443797; cv=none; d=google.com; s=arc-20160816; b=MGZwMd8lwq0skI9/wsLc/04XmRDSH54CusC4440WebQf/67aAZXigN/VBhxAxacWi0 1IGtM11RbBjBRziVLCVzFjMDFKOFUYUzXFxOvrPDlfqHBWhNM1V0XTBjmccurdYDw+zl +Nf0/97ulzcvcXmFKVH0f/NNDx4igHXxRiLmEMMuxi8mF0ubQIVE9ZDDfffvWoV4NlLc XmX4e9jNQqhhQ2WqLOMIXOzG2NWOQouZ2p9x3E4nK67iFpog+mJgd6AEz3ixfI8jsi6h H3zFKdMqmKYJWZ9UkcMfQElxQ8sLfnVNLDFb3nwj+j58JubConN1Yay39uGCgnEN1/p+ PWQQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=98TA5P6Rv0Z888dnhOJdanHWeSaphwPhVZySM0Y1mOk=; b=pXkkXcSpQTwHX/48bt5ehUNNOPscZJKFqJ0M5ge3m9v6qkQhNwJmyC77AtHyeA0rKn 9Mlzh/JhrC9ma0MLMaU2HludtTQKTwX/bFmghjHpA0tuc5j39yI169spD9g548iUmGbb mV7840r34/rWOMHU25tZjK/Nuiwe/GAQ5FQSgabmhEoKnMKJp80LtJzK3dBrKq0Kpneg OXOhvShyEpbNElSMCjEok5TmTv8H5zpzxkVTKE3og8vPl4TRLeRtn6AIpjg59wtJ0Wgq jvuXCnNKB/5UCGTGFu4yYsVvwKJZi6KTelREXMiNXTsvxn7S+fF9D95lGNgsuBKiD9wM J/mw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@geanix.com header.s=first header.b=BAWLfA8B; 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=pass (p=NONE sp=NONE dis=NONE) header.from=geanix.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id hg2si5492137ejc.326.2021.07.16.06.56.14; Fri, 16 Jul 2021 06:56:37 -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; dkim=pass header.i=@geanix.com header.s=first header.b=BAWLfA8B; 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=pass (p=NONE sp=NONE dis=NONE) header.from=geanix.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240101AbhGPN5z (ORCPT + 99 others); Fri, 16 Jul 2021 09:57:55 -0400 Received: from first.geanix.com ([116.203.34.67]:35062 "EHLO first.geanix.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232808AbhGPN5x (ORCPT ); Fri, 16 Jul 2021 09:57:53 -0400 Received: from zen.. (unknown [185.17.218.86]) by first.geanix.com (Postfix) with ESMTPSA id 26ACA4C7C48; Fri, 16 Jul 2021 13:54:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=geanix.com; s=first; t=1626443696; bh=F/AxVbqAVC3EqTlJsEexumFqSk49MJGE8lWAvwVeiQA=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=BAWLfA8BpVWJy6D+j7tT5MmfQWIDGBovMyrlmwvjFjbDqSvLjl7OqKNBAPg4L+3Wc qgt3eRkz9aMSVkTFQ7Bhz8cQ7HytnQy60gplFGAhw96u7CqLNZoqE/pSwz7V3KuuTu 8R4zsNOAqPC2So121rT8oR24LVAS15vtrebkDStmDDXF35GkLq/rpRto/oaN1MYkYY JuvM3elJR5Fuj5YJi1pxiWVN+ozDNQs0xFAiP4qfdfIPt7UCV8LH9soMxO/jvNRvDd lmKJcX1Vo1FJb+TRKEI0IDxdLywOjODHiATR8S3DRB2mZ4cg9+QgGChZQijVx7FiXw nM2qYt56D6lkQ== From: =?UTF-8?q?Martin=20Hundeb=C3=B8ll?= To: Wu Hao , Tom Rix , Moritz Fischer , Xu Yilun , Jean Delvare , Guenter Roeck , Mark Brown Cc: =?UTF-8?q?Martin=20Hundeb=C3=B8ll?= , linux-fpga@vger.kernel.org, linux-kernel@vger.kernel.org, linux-hwmon@vger.kernel.org, linux-spi@vger.kernel.org, Matthew Gerlach Subject: [PATCH v5 1/3] fpga: dfl: expose feature revision from struct dfl_device Date: Fri, 16 Jul 2021 15:54:39 +0200 Message-Id: <20210716135441.3235863-2-martin@geanix.com> X-Mailer: git-send-email 2.31.0 In-Reply-To: <20210716135441.3235863-1-martin@geanix.com> References: <20210716135441.3235863-1-martin@geanix.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-3.1 required=4.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,URIBL_BLOCKED autolearn=disabled version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on 93bd6fdb21b5 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Martin Hundebøll DFL device drivers have a common need for checking feature revision information from the DFL header, as well as other common DFL information like the already exposed feature id and type. This patch exposes the feature revision information directly via the DFL device data structure. Since the DFL core code has already read the DFL header, this this patch saves additional mmio reads from DFL device drivers too. Signed-off-by: Martin Hundebøll Acked-by: Wu Hao Acked-by: Matthew Gerlach --- Changes since v4: * Renamed 'rev' to 'revision' as per Tom's suggestion Changes since v3: * Added Hao's Acked-by * Added Matthew's Acked-by Changes since v2: * Reworded commit message as per Hao's suggestion Changes since v1: * This patch replaces the previous patch 2 and exposes the feature revision through struct dfl_device instead of a helper reading from io-mem drivers/fpga/dfl.c | 27 +++++++++++++++++---------- drivers/fpga/dfl.h | 1 + include/linux/dfl.h | 1 + 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/drivers/fpga/dfl.c b/drivers/fpga/dfl.c index 511b20ff35a3..e73a70053906 100644 --- a/drivers/fpga/dfl.c +++ b/drivers/fpga/dfl.c @@ -381,6 +381,7 @@ dfl_dev_add(struct dfl_feature_platform_data *pdata, ddev->type = feature_dev_id_type(pdev); ddev->feature_id = feature->id; + ddev->revision = feature->revision; ddev->cdev = pdata->dfl_cdev; /* add mmio resource */ @@ -717,6 +718,7 @@ struct build_feature_devs_info { */ struct dfl_feature_info { u16 fid; + u8 revision; struct resource mmio_res; void __iomem *ioaddr; struct list_head node; @@ -796,6 +798,7 @@ static int build_info_commit_dev(struct build_feature_devs_info *binfo) /* save resource information for each feature */ feature->dev = fdev; feature->id = finfo->fid; + feature->revision = finfo->revision; /* * the FIU header feature has some fundamental functions (sriov @@ -910,19 +913,17 @@ static void build_info_free(struct build_feature_devs_info *binfo) devm_kfree(binfo->dev, binfo); } -static inline u32 feature_size(void __iomem *start) +static inline u32 feature_size(u64 value) { - u64 v = readq(start + DFH); - u32 ofst = FIELD_GET(DFH_NEXT_HDR_OFST, v); + u32 ofst = FIELD_GET(DFH_NEXT_HDR_OFST, value); /* workaround for private features with invalid size, use 4K instead */ return ofst ? ofst : 4096; } -static u16 feature_id(void __iomem *start) +static u16 feature_id(u64 value) { - u64 v = readq(start + DFH); - u16 id = FIELD_GET(DFH_ID, v); - u8 type = FIELD_GET(DFH_TYPE, v); + u16 id = FIELD_GET(DFH_ID, value); + u8 type = FIELD_GET(DFH_TYPE, value); if (type == DFH_TYPE_FIU) return FEATURE_ID_FIU_HEADER; @@ -1021,10 +1022,15 @@ create_feature_instance(struct build_feature_devs_info *binfo, unsigned int irq_base, nr_irqs; struct dfl_feature_info *finfo; int ret; + u8 revision; + u64 v; + + v = readq(binfo->ioaddr + ofst); + revision = FIELD_GET(DFH_REVISION, v); /* read feature size and id if inputs are invalid */ - size = size ? size : feature_size(binfo->ioaddr + ofst); - fid = fid ? fid : feature_id(binfo->ioaddr + ofst); + size = size ? size : feature_size(v); + fid = fid ? fid : feature_id(v); if (binfo->len - ofst < size) return -EINVAL; @@ -1038,6 +1044,7 @@ create_feature_instance(struct build_feature_devs_info *binfo, return -ENOMEM; finfo->fid = fid; + finfo->revision = revision; finfo->mmio_res.start = binfo->start + ofst; finfo->mmio_res.end = finfo->mmio_res.start + size - 1; finfo->mmio_res.flags = IORESOURCE_MEM; @@ -1166,7 +1173,7 @@ static int parse_feature_private(struct build_feature_devs_info *binfo, { if (!is_feature_dev_detected(binfo)) { dev_err(binfo->dev, "the private feature 0x%x does not belong to any AFU.\n", - feature_id(binfo->ioaddr + ofst)); + feature_id(readq(binfo->ioaddr + ofst))); return -EINVAL; } diff --git a/drivers/fpga/dfl.h b/drivers/fpga/dfl.h index 2b82c96ba56c..422157cfd742 100644 --- a/drivers/fpga/dfl.h +++ b/drivers/fpga/dfl.h @@ -243,6 +243,7 @@ struct dfl_feature_irq_ctx { struct dfl_feature { struct platform_device *dev; u16 id; + u8 revision; int resource_index; void __iomem *ioaddr; struct dfl_feature_irq_ctx *irq_ctx; diff --git a/include/linux/dfl.h b/include/linux/dfl.h index 6cc10982351a..431636a0dc78 100644 --- a/include/linux/dfl.h +++ b/include/linux/dfl.h @@ -38,6 +38,7 @@ struct dfl_device { int id; u16 type; u16 feature_id; + u8 revision; struct resource mmio_res; int *irqs; unsigned int num_irqs; -- 2.31.0