From patchwork Thu Sep 1 03:10:45 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jit Loon Lim X-Patchwork-Id: 1672614 X-Patchwork-Delegate: marek.vasut@gmail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=XdidPgZd; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4MJ5fJ4THKz1ygc for ; Thu, 1 Sep 2022 13:11:04 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 7346B845F3; Thu, 1 Sep 2022 05:10:59 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.b="XdidPgZd"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 0C1BA844E4; Thu, 1 Sep 2022 05:10:57 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=0.9 required=5.0 tests=AC_FROM_MANY_DOTS,BAYES_00, DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF, RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_NONE, T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.2 Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 1F24584223 for ; Thu, 1 Sep 2022 05:10:53 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: phobos.denx.de; spf=none smtp.mailfrom=jitloonl@ecsmtp.png.intel.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1662001854; x=1693537854; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=qpcf+zhN1vbXkFQp4KQCtXVE+EPui0M6EmQ8fpHh4VE=; b=XdidPgZdW2q7SHJPPem3xDrWYg9aiFkd/mARS3Xywom3lwY4nVj5xdIy 11YO0fS5rpEpUXlBNtdKryNsbCQGHOvtrqnx3LuxIrJwzydKGuOSeo9jp JGMcQkxa5YT/ANrqycWpzFs6rH7e4Z4ogKJhFq/4LQkMHG6N8ILB1+8cW HdMZj/0SnK3PHi4UbItYMYP+MQTB/LVP1kXCLqOoTH5p/WnOucPOVxCIB wDihWylOdC8Ycc6kII4dNJ5pV5CR6T8arlLRALcUfdgqIcbqf8HSsr7LN TVjOUURJacrRXCy2V21HmR+PaNG5wUZlwSgT0/V5IBHADEXA5La/05boI A==; X-IronPort-AV: E=McAfee;i="6500,9779,10456"; a="321747654" X-IronPort-AV: E=Sophos;i="5.93,280,1654585200"; d="scan'208";a="321747654" Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 31 Aug 2022 20:10:52 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.93,280,1654585200"; d="scan'208";a="715937590" Received: from pglmail07.png.intel.com ([10.221.193.207]) by fmsmga002.fm.intel.com with ESMTP; 31 Aug 2022 20:10:48 -0700 Received: from localhost (pgli0117.png.intel.com [10.221.240.80]) by pglmail07.png.intel.com (Postfix) with ESMTP id 787F732E3; Thu, 1 Sep 2022 11:10:47 +0800 (+08) Received: by localhost (Postfix, from userid 12048045) id 770C63D21; Thu, 1 Sep 2022 11:10:47 +0800 (+08) From: Jit Loon Lim To: u-boot@lists.denx.de Cc: Jagan Teki , Vignesh R , Marek , Simon , Tien Fong , Kok Kiang , Siew Chin , Sin Hui , Raaj , Dinesh , Boon Khai , Alif , Teik Heng , Hazim , Sieu Mun Tang , Jit Loon Lim , Chin Liang See Subject: [PATCH] driver: fpga: Adding Freeze Bridge for PR console support Date: Thu, 1 Sep 2022 11:10:45 +0800 Message-Id: <20220901031045.10890-1-jit.loon.lim@intel.com> X-Mailer: git-send-email 2.26.2 MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.39 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.6 at phobos.denx.de X-Virus-Status: Clean From: Chin Liang See Adding Partial Reconfiguration (pr) command at U-Boot console. The pr command will control the Freeze Controller which will freeze and unfreeze the Partial Reconfiguration region. The pr command also support multiple Partial Reconfiguration region by specifying the region ID. Here are the example of expected steps for partial reconfiguration $ bridge enable $ fatload mmc 0:1 100 pr_bitstream.rbf $ pr start 0 $ fpga load 0 100 $filesize $ pr end 0 Signed-off-by: Chin Liang See Signed-off-by: Jit Loon Lim --- drivers/fpga/Kconfig | 9 +++ drivers/fpga/Makefile | 1 + drivers/fpga/intel_pr.c | 141 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 151 insertions(+) create mode 100644 drivers/fpga/intel_pr.c diff --git a/drivers/fpga/Kconfig b/drivers/fpga/Kconfig index e07a9cf80e..6e542353fe 100644 --- a/drivers/fpga/Kconfig +++ b/drivers/fpga/Kconfig @@ -48,6 +48,15 @@ config FPGA_INTEL_SDM_MAILBOX Enable FPGA driver for writing full bitstream into Intel FPGA devices through SDM (Secure Device Manager) Mailbox. +config FPGA_INTEL_PR + bool "Enable Intel FPGA Partial Reconfiguration driver" + depends on FPGA_ALTERA + help + Say Y here to enable the Intel FPGA Partial Reconfiguration driver + + This provides basic functionality for partial reconfiguration which + include the freeze controller support. + config FPGA_XILINX bool "Enable Xilinx FPGA drivers" select FPGA diff --git a/drivers/fpga/Makefile b/drivers/fpga/Makefile index 83243fb107..2eff387100 100644 --- a/drivers/fpga/Makefile +++ b/drivers/fpga/Makefile @@ -22,4 +22,5 @@ obj-$(CONFIG_FPGA_STRATIX_V) += stratixv.o obj-$(CONFIG_FPGA_SOCFPGA) += socfpga.o obj-$(CONFIG_TARGET_SOCFPGA_GEN5) += socfpga_gen5.o obj-$(CONFIG_TARGET_SOCFPGA_ARRIA10) += socfpga_arria10.o +obj-$(CONFIG_FPGA_INTEL_PR) += intel_pr.o endif diff --git a/drivers/fpga/intel_pr.c b/drivers/fpga/intel_pr.c new file mode 100644 index 0000000000..05f2092600 --- /dev/null +++ b/drivers/fpga/intel_pr.c @@ -0,0 +1,141 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2017-2018 Intel Corporation + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +DECLARE_GLOBAL_DATA_PTR; + +#define FREEZE_CSR_STATUS_OFFSET 0 +#define FREEZE_CSR_CTRL_OFFSET 4 +#define FREEZE_CSR_ILLEGAL_REQ_OFFSET 8 +#define FREEZE_CSR_REG_VERSION 12 + +#define FREEZE_CSR_STATUS_FREEZE_REQ_DONE BIT(0) +#define FREEZE_CSR_STATUS_UNFREEZE_REQ_DONE BIT(1) + +#define FREEZE_CSR_CTRL_FREEZE_REQ BIT(0) +#define FREEZE_CSR_CTRL_RESET_REQ BIT(1) +#define FREEZE_CSR_CTRL_UNFREEZE_REQ BIT(2) + +#define FREEZE_TIMEOUT 20000 + +static int intel_get_freeze_br_addr(fdt_addr_t *addr, unsigned int region) +{ + int offset; + char freeze_br[12]; + + snprintf(freeze_br, sizeof(freeze_br), "freeze_br%d", region); + + const char *alias = fdt_get_alias(gd->fdt_blob, freeze_br); + + if (!alias) { + printf("alias %s not found in dts\n", freeze_br); + return -ENODEV; + } + + offset = fdt_path_offset(gd->fdt_blob, alias); + if (offset < 0) { + printf("%s not found in dts\n", alias); + return -ENODEV; + } + + *addr = fdtdec_get_addr(gd->fdt_blob, offset, "reg"); + if (*addr == FDT_ADDR_T_NONE) { + printf("%s has no 'reg' property!\n", freeze_br); + return -ENXIO; + } + + return 0; +} + +static int intel_freeze_br_do_freeze(unsigned int region) +{ + u32 status; + int ret; + fdt_addr_t addr; + + ret = intel_get_freeze_br_addr(&addr, region); + if (ret) + return ret; + + status = readl(addr + FREEZE_CSR_STATUS_OFFSET); + + if (status & FREEZE_CSR_STATUS_FREEZE_REQ_DONE) + return 0; + else if (!(status & FREEZE_CSR_STATUS_UNFREEZE_REQ_DONE)) + return -EINVAL; + + writel(FREEZE_CSR_CTRL_FREEZE_REQ, addr + FREEZE_CSR_CTRL_OFFSET); + + return wait_for_bit_le32((const u32 *)(addr + + FREEZE_CSR_STATUS_OFFSET), + FREEZE_CSR_STATUS_FREEZE_REQ_DONE, true, + FREEZE_TIMEOUT, false); +} + +static int intel_freeze_br_do_unfreeze(unsigned int region) +{ + u32 status; + int ret; + fdt_addr_t addr; + + ret = intel_get_freeze_br_addr(&addr, region); + if (ret) + return ret; + + status = readl(addr + FREEZE_CSR_STATUS_OFFSET); + + if (status & FREEZE_CSR_STATUS_UNFREEZE_REQ_DONE) + return 0; + else if (!(status & FREEZE_CSR_STATUS_FREEZE_REQ_DONE)) + return -EINVAL; + + writel(FREEZE_CSR_CTRL_UNFREEZE_REQ, addr + FREEZE_CSR_CTRL_OFFSET); + + return wait_for_bit_le32((const u32 *)(addr + + FREEZE_CSR_STATUS_OFFSET), + FREEZE_CSR_STATUS_UNFREEZE_REQ_DONE, true, + FREEZE_TIMEOUT, false); +} + +static int do_pr(struct cmd_tbl *cmdtp, int flag, int argc, char * const argv[]) +{ + const char *cmd; + char *region; + unsigned int region_num = 0; + + if (argc != 2 && argc != 3) + return CMD_RET_USAGE; + + cmd = argv[1]; + if (argc == 3) + region_num = simple_strtoul(argv[2], ®ion, 0); + + if (strcmp(cmd, "start") == 0) + return intel_freeze_br_do_freeze(region_num); + else if (strcmp(cmd, "end") == 0) + return intel_freeze_br_do_unfreeze(region_num); + + return CMD_RET_USAGE; +} + +U_BOOT_CMD( + pr, 3, 1, do_pr, + "SoCFPGA partial reconfiguration control", + "start [region] - Start the partial reconfiguration by freeze the\n" + "PR region\n" + "end [region] - End the partial reconfiguration by unfreeze the PR\n" + "region\n" + "" +);