From patchwork Sun Aug 6 18:24:04 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: matthew.gerlach@linux.intel.com X-Patchwork-Id: 798437 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.infradead.org (client-ip=65.50.211.133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="QgQaR48P"; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [65.50.211.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3xQTbv1swkz9s7g for ; Mon, 7 Aug 2017 04:25:15 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:References: In-Reply-To:Message-Id:Date:Subject:To:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=wjenQJ5L41BYSha/MBQ/R9JOGj7q6c1bvt0FnYN3kw4=; b=QgQaR48Pp7SDP1BeS/AHSdO/NF tS7jTaC1zmEwu3tfx94WVVBuv+5k+YRoc8cXhDpH0wI9WVLOjlngQLa7r30Lq9eDe8zh2gaKTXG7x SvoVGwpYKcj5tFkwYa/LgfmtOlbxGJzZaA3CS7gUUD6s0e6h9u2pV1taCztYpBJNM2Gh5zYHA5zEx sCrx9ydhRQ5XJR3BUrzx/vwG90M9JGVaLzH0aBieGmgDmB3ZS4sYbUUnLD1ka8mZw/3qBjMtc/044 TLMeATUR1Mg4iXLOySQejQC2noKDyHBgUt7nnbmqzCbb526aZNdFpM0PyO1ITipqX1KTF0OfpYkx9 Znub23ew==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.87 #1 (Red Hat Linux)) id 1deQEe-0004N3-Cz; Sun, 06 Aug 2017 18:25:08 +0000 Received: from mga04.intel.com ([192.55.52.120]) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1deQE8-0003hF-HY for linux-mtd@lists.infradead.org; Sun, 06 Aug 2017 18:24:38 +0000 Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 06 Aug 2017 11:24:13 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.41,333,1498546800"; d="scan'208";a="116218139" Received: from mgerlach-mobl.amr.corp.intel.com (HELO mgerlach-VirtualBox.amr.corp.intel.com) ([10.254.21.225]) by orsmga004.jf.intel.com with ESMTP; 06 Aug 2017 11:24:12 -0700 From: matthew.gerlach@linux.intel.com To: vndao@altera.com, dwmw2@infradead.org, computersforpeace@gmail.com, boris.brezillon@free-electrons.com, marek.vasut@gmail.com, richard@nod.at, cyrille.pitchen@wedev4u.fr, robh+dt@kernel.org, mark.rutland@arm.com, linux-mtd@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, gregkh@linuxfoundation.org, davem@davemloft.net, mchehab@kernel.org, linux-fpga@vger.kernel.org Subject: [PATCH 3/3] fpga: intel: Add QSPI FPGA Management Entity Feature Date: Sun, 6 Aug 2017 11:24:04 -0700 Message-Id: <1502043844-3626-4-git-send-email-matthew.gerlach@linux.intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1502043844-3626-1-git-send-email-matthew.gerlach@linux.intel.com> References: <1502043844-3626-1-git-send-email-matthew.gerlach@linux.intel.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20170806_112436_670361_1A09277F X-CRM114-Status: GOOD ( 14.15 ) X-Spam-Score: -4.2 (----) X-Spam-Report: SpamAssassin version 3.4.1 on bombadil.infradead.org summary: Content analysis details: (-4.2 points) pts rule name description ---- ---------------------- -------------------------------------------------- -2.3 RCVD_IN_DNSWL_MED RBL: Sender listed at http://www.dnswl.org/, medium trust [192.55.52.120 listed in list.dnswl.org] -0.0 RP_MATCHES_RCVD Envelope sender domain matches handover relay domain -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Matthew Gerlach MIME-Version: 1.0 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org From: Matthew Gerlach Add FPGA Management Entity Feature to support Atera ASMI Parallel 2 IP core. This feature allows the flash used to configure the FPGA at power up to be updated over PCIe using mtd-utils. Signed-off-by: Matthew Gerlach --- drivers/fpga/intel/feature-dev.h | 6 ++- drivers/fpga/intel/fme-main.c | 100 +++++++++++++++++++++++++++++++++++++++ drivers/fpga/intel/pcie.c | 7 +++ drivers/fpga/intel/pcie_check.c | 6 +++ 4 files changed, 117 insertions(+), 2 deletions(-) diff --git a/drivers/fpga/intel/feature-dev.h b/drivers/fpga/intel/feature-dev.h index 9303828..5ae799b 100644 --- a/drivers/fpga/intel/feature-dev.h +++ b/drivers/fpga/intel/feature-dev.h @@ -40,6 +40,7 @@ #define FME_FEATURE_GLOBAL_PERF "fme_gperf" #define FME_FEATURE_GLOBAL_ERR "fme_error" #define FME_FEATURE_PR_MGMT "fme_pr" +#define FME_FEATURE_QSPI_FLASH "fme_qspi_flash" #define PORT_FEATURE_HEADER "port_hdr" #define PORT_FEATURE_UAFU "port_uafu" @@ -60,6 +61,7 @@ #define FME_GLOBAL_PERF_REVISION 0 #define FME_GLOBAL_ERR_REVISION 0 #define FME_PR_MGMT_REVISION 1 +#define FME_QSPI_REVISION 0 #define PORT_HEADER_REVISION 0 /* UAFU's header info depends on the downloaded GBS */ @@ -1225,9 +1227,9 @@ enum fme_feature_id { FME_FEATURE_ID_GLOBAL_PERF = 0x3, FME_FEATURE_ID_GLOBAL_ERR = 0x4, FME_FEATURE_ID_PR_MGMT = 0x5, - + FME_FEATURE_ID_QSPI_FLASH = 0x6, /* one for fme header. */ - FME_FEATURE_ID_MAX = 0x6, + FME_FEATURE_ID_MAX = 0x7, }; enum port_feature_id { diff --git a/drivers/fpga/intel/fme-main.c b/drivers/fpga/intel/fme-main.c index 776fe36..03aacb3 100644 --- a/drivers/fpga/intel/fme-main.c +++ b/drivers/fpga/intel/fme-main.c @@ -27,6 +27,7 @@ #include #include #include +#include #include "feature-dev.h" #include "fme.h" @@ -659,6 +660,101 @@ struct feature_ops power_mgmt_ops = { .uinit = power_mgmt_uinit, }; +#define FLASH_CAPABILITY_OFT 8 + +static int qspi_flash_init(struct platform_device *pdev, + struct feature *feature) +{ + u64 reg; + struct altera_asmip2_plat_data qdata; + struct platform_device *cdev; + int ret = 0; + char name[40]; + + scnprintf(name, sizeof(name), "%s-%p", feature->name, feature->ioaddr); + + reg = readq(feature->ioaddr + FLASH_CAPABILITY_OFT); + dev_info(&pdev->dev, "%s %s %d 0x%llx 0x%x 0x%x\n", + __func__, name, feature->resource_index, + reg, readl(feature->ioaddr + FLASH_CAPABILITY_OFT), + readl(feature->ioaddr + FLASH_CAPABILITY_OFT + 4)); + + + cdev = platform_device_alloc(name, PLATFORM_DEVID_NONE); + + if (!cdev) { + dev_err(&pdev->dev, "platform_device_alloc failed in %s\n", + __func__); + return -ENOMEM; + } + + cdev->dev.parent = &pdev->dev; + + memset(&qdata, 0, sizeof(qdata)); + qdata.csr_base = feature->ioaddr + FLASH_CAPABILITY_OFT; + qdata.num_chip_sel = 1; + + ret = platform_device_add_data(cdev, &qdata, sizeof(qdata)); + + if (ret) { + dev_err(&pdev->dev, "platform_device_add_data in %s\n", + __func__); + goto error; + } + + cdev->driver_override = kstrdup(ALTERA_ASMIP2_DRV_NAME, GFP_KERNEL); + + ret = platform_device_add(cdev); + + if (ret) { + dev_err(&pdev->dev, "platform_device_add failed with %d\n", + ret); + goto error; + } + return ret; + +error: + platform_device_put(cdev); + return ret; +} + +static int qspi_match(struct device *dev, void *data) +{ + return !strcmp(dev_name(dev), data); +} + +static void qspi_flash_uinit(struct platform_device *pdev, + struct feature *feature) +{ + struct device *parent = &pdev->dev; + struct device *dev; + struct platform_device *cdev; + char name[40]; + + scnprintf(name, sizeof(name), "%s-%p", feature->name, feature->ioaddr); + + dev = device_find_child(parent, name, qspi_match); + + if (!dev) { + dev_err(&pdev->dev, "%s NOT found\n", ALTERA_ASMIP2_DRV_NAME); + return; + } + + cdev = to_platform_device(dev); + + if (!cdev) { + dev_err(&pdev->dev, "no platform container\n"); + return; + } + + platform_device_unregister(cdev); +} + +struct feature_ops qspi_flash_ops = { + .init = qspi_flash_init, + .uinit = qspi_flash_uinit, +}; + static struct feature_driver fme_feature_drvs[] = { { .name = FME_FEATURE_HEADER, @@ -685,6 +781,10 @@ static struct feature_driver fme_feature_drvs[] = { .ops = &global_perf_ops, }, { + .name = FME_FEATURE_QSPI_FLASH, + .ops = &qspi_flash_ops, + }, + { .ops = NULL, }, }; diff --git a/drivers/fpga/intel/pcie.c b/drivers/fpga/intel/pcie.c index a64151a..8f4f3e0 100644 --- a/drivers/fpga/intel/pcie.c +++ b/drivers/fpga/intel/pcie.c @@ -28,6 +28,7 @@ #include #include #include +#include #include "feature-dev.h" @@ -617,6 +618,12 @@ static struct feature_info fme_features[] = { .resource_size = sizeof(struct feature_fme_pr), .feature_index = FME_FEATURE_ID_PR_MGMT, .revision_id = FME_PR_MGMT_REVISION + }, + { + .name = FME_FEATURE_QSPI_FLASH, + .resource_size = ALTERA_ASMIP2_RESOURCE_SIZE, + .feature_index = FME_FEATURE_ID_QSPI_FLASH, + .revision_id = FME_QSPI_REVISION } }; diff --git a/drivers/fpga/intel/pcie_check.c b/drivers/fpga/intel/pcie_check.c index e707d72..f0027e1 100644 --- a/drivers/fpga/intel/pcie_check.c +++ b/drivers/fpga/intel/pcie_check.c @@ -51,6 +51,11 @@ #define FME_FEATURE_PR_MGMT_ID 0x5 #define FME_FEATURE_PR_MGMT_VERSION 0x0 +#define FME_FEATURE_QSPI_FLASH_TYPE DFH_TYPE_PRIVATE +#define FME_FEATURE_QSPI_FLASH_NEXT_OFFSET 0x2000 +#define FME_FEATURE_QSPI_FLASH_ID FME_FEATURE_ID_QSPI_FLASH +#define FME_FEATURE_QSPI_FLASH_VERSION FME_QSPI_REVISION + #define PORT_FEATURE_HEADER_TYPE DFH_TYPE_AFU #define PORT_FEATURE_HEADER_NEXT_OFFSET 0x1000 #define PORT_FEATURE_HEADER_ID DFH_CCI_VERSION @@ -91,6 +96,7 @@ static struct feature_header default_fme_feature_hdr[] = { DEFAULT_REG(FME_FEATURE_GLOBAL_PERF), DEFAULT_REG(FME_FEATURE_GLOBAL_ERR), DEFAULT_REG(FME_FEATURE_PR_MGMT), + DEFAULT_REG(FME_FEATURE_QSPI_FLASH), }; void check_features_header(struct pci_dev *pdev, struct feature_header *hdr,