From patchwork Wed Sep 11 07:22:54 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michal Simek X-Patchwork-Id: 1160704 X-Patchwork-Delegate: monstr@monstr.eu 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.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=xilinx.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=monstr-eu.20150623.gappssmtp.com header.i=@monstr-eu.20150623.gappssmtp.com header.b="WuP7O7Bc"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 46StfK1qXlz9sCJ for ; Wed, 11 Sep 2019 17:23:05 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id EEE0BC21D65; Wed, 11 Sep 2019 07:23:00 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RCVD_IN_MSPIKE_H2, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id D18CBC21C2C; Wed, 11 Sep 2019 07:22:58 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 28B9AC21C2C; Wed, 11 Sep 2019 07:22:57 +0000 (UTC) Received: from mail-wm1-f67.google.com (mail-wm1-f67.google.com [209.85.128.67]) by lists.denx.de (Postfix) with ESMTPS id C3D56C21C29 for ; Wed, 11 Sep 2019 07:22:56 +0000 (UTC) Received: by mail-wm1-f67.google.com with SMTP id n10so2160546wmj.0 for ; Wed, 11 Sep 2019 00:22:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=monstr-eu.20150623.gappssmtp.com; s=20150623; h=sender:from:to:cc:subject:date:message-id; bh=Wx9Q0ae+qZpNdiN/8y0dQvMqkQKErvaON6gYUmRDAVU=; b=WuP7O7BcT2KhC047kulXZJmuVnhA3gpF+towGCNyoKZ0NsAjyB8FCr1RcqLke09rHW 0ZnDWRazp4+L8s1cRGe8s3cLrygR+6+9KHTG1Gw4Du2kTBESgvWE+qOZhffKkueENx6r qdZaTWD2PxngfxiJTbNAv9Qx7qpfwDO/tZC8K3xk+D9JJ/Hj5KsXsJV1QuHVRuoQYt+o LTvhduQ1lfJ3/VtNV6p8KJlbw1FQ7xS2Bhy23y7/sLmKeVt3gynhSETjlFwVydWDcDyE gJ2UgCJyGWOf+jf2KPNeluUaH0JEypu2UTIDxJgnktZc+yF9J8/d9K4kBt2BvhjronvO AL6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id; bh=Wx9Q0ae+qZpNdiN/8y0dQvMqkQKErvaON6gYUmRDAVU=; b=U07gLi5T4bbWFqpTGndfVofqoGZ4SxMDT0o1TsjjRRsgc8f6x1erOqCU+Oq/rWeKgy fwzLPOxaXrRLmlZhgRbx0e0AW6j0RpyzzpfI8tCnbcORgvNl2ZSbVV3GLyjy91zvapiA ad7UgeA4oF9EOihHwq+P9DyfpsmA+4HE0iAJ1RjA+BDlO4hbMokzSti6F92y2KZ6IpR3 o5z+su4OC+vKNhLux9wktcj4F27BYvI1ubFrH2ueWJJl03RFgo9nGWWQX5UklFrKEHPP GUOcrkG5PRnHwkAd7pSQnhR4d23DT/zC0F8ojKt+blYuFS4Rnyxc9GlH30HGq+d1Onw0 ChXw== X-Gm-Message-State: APjAAAV9mxUHhKorTFZgehMlZ1lzdtZX+EW1LPbt6HHq2lY6v/kQ1BZW UHrdpMNIHqNL/UsVYj7quF5VXv7Y1WM= X-Google-Smtp-Source: APXvYqzrwWMw5NCKYkUm+ifKhOEgcqUKtxKzE1YaWB1sU232QFcT4XEJA9hu5nnxtzTiqu6RlrdBmg== X-Received: by 2002:a7b:c1cc:: with SMTP id a12mr2488356wmj.73.1568186576114; Wed, 11 Sep 2019 00:22:56 -0700 (PDT) Received: from localhost (nat-35.starnet.cz. [178.255.168.35]) by smtp.gmail.com with ESMTPSA id q25sm2396531wmj.22.2019.09.11.00.22.55 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 11 Sep 2019 00:22:55 -0700 (PDT) From: Michal Simek To: u-boot@lists.denx.de, git@xilinx.com Date: Wed, 11 Sep 2019 09:22:54 +0200 Message-Id: X-Mailer: git-send-email 2.17.1 Subject: [U-Boot] [PATCH] arm64: versal: fpga: Add PL bit stream load support X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" From: Siva Durga Prasad Paladugu This patch adds PL bitstream load support for Versal platform. The PL bitstream is loaded by making an SMC to ATF which in turn communicates with platform firmware which configures and loads PL bitstream on to PL. Signed-off-by: Siva Durga Prasad Paladugu Signed-off-by: Michal Simek --- board/xilinx/versal/board.c | 10 ++++++++ drivers/fpga/Kconfig | 9 +++++++ drivers/fpga/Makefile | 1 + drivers/fpga/versalpl.c | 51 +++++++++++++++++++++++++++++++++++++ drivers/fpga/xilinx.c | 8 +++++- include/versalpl.h | 20 +++++++++++++++ include/xilinx.h | 2 ++ 7 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 drivers/fpga/versalpl.c create mode 100644 include/versalpl.h diff --git a/board/xilinx/versal/board.c b/board/xilinx/versal/board.c index b5ddd0c5ad24..a2b00aa0b662 100644 --- a/board/xilinx/versal/board.c +++ b/board/xilinx/versal/board.c @@ -11,13 +11,23 @@ #include #include #include +#include DECLARE_GLOBAL_DATA_PTR; +#if defined(CONFIG_FPGA_VERSALPL) +static xilinx_desc versalpl = XILINX_VERSAL_DESC; +#endif + int board_init(void) { printf("EL Level:\tEL%d\n", current_el()); +#if defined(CONFIG_FPGA_VERSALPL) + fpga_init(); + fpga_add(fpga_xilinx, &versalpl); +#endif + return 0; } diff --git a/drivers/fpga/Kconfig b/drivers/fpga/Kconfig index 105a299812f5..fe398a1d4965 100644 --- a/drivers/fpga/Kconfig +++ b/drivers/fpga/Kconfig @@ -56,6 +56,15 @@ config FPGA_ZYNQMPPL Enable FPGA driver for loading bitstream in BIT and BIN format on Xilinx Zynq UltraScale+ (ZynqMP) device. +config FPGA_VERSALPL + bool "Enable Xilinx FPGA driver for Versal" + depends on FPGA_XILINX + help + Enable FPGA driver for loading bitstream in PDI format on Xilinx + Versal device. PDI is a new programmable device image format for + Versal. The bitstream will only be generated as PDI for Versal + platform. + config FPGA_SPARTAN3 bool "Enable Spartan3 FPGA driver" depends on FPGA_XILINX diff --git a/drivers/fpga/Makefile b/drivers/fpga/Makefile index 5a778c10e801..04e6480f202c 100644 --- a/drivers/fpga/Makefile +++ b/drivers/fpga/Makefile @@ -6,6 +6,7 @@ obj-y += fpga.o obj-$(CONFIG_FPGA_SPARTAN2) += spartan2.o obj-$(CONFIG_FPGA_SPARTAN3) += spartan3.o +obj-$(CONFIG_FPGA_VERSALPL) += versalpl.o obj-$(CONFIG_FPGA_VIRTEX2) += virtex2.o obj-$(CONFIG_FPGA_ZYNQPL) += zynqpl.o obj-$(CONFIG_FPGA_ZYNQMPPL) += zynqmppl.o diff --git a/drivers/fpga/versalpl.c b/drivers/fpga/versalpl.c new file mode 100644 index 000000000000..69617a9b1d7f --- /dev/null +++ b/drivers/fpga/versalpl.c @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * (C) Copyright 2019, Xilinx, Inc, + * Siva Durga Prasad Paladugu + */ + +#include +#include +#include +#include + +static ulong versal_align_dma_buffer(ulong *buf, u32 len) +{ + ulong *new_buf; + + if ((ulong)buf != ALIGN((ulong)buf, ARCH_DMA_MINALIGN)) { + new_buf = (ulong *)ALIGN((ulong)buf, ARCH_DMA_MINALIGN); + memcpy(new_buf, buf, len); + buf = new_buf; + } + + return (ulong)buf; +} + +static int versal_load(xilinx_desc *desc, const void *buf, size_t bsize, + bitstream_type bstype) +{ + ulong bin_buf; + int ret; + u32 buf_lo, buf_hi; + u32 ret_payload[5]; + + bin_buf = versal_align_dma_buffer((ulong *)buf, bsize); + + debug("%s called!\n", __func__); + flush_dcache_range(bin_buf, bin_buf + bsize); + + buf_lo = lower_32_bits(bin_buf); + buf_hi = upper_32_bits(bin_buf); + + ret = versal_pm_request(VERSAL_PM_LOAD_PDI, VERSAL_PM_PDI_TYPE, buf_lo, + buf_hi, 0, ret_payload); + if (ret) + puts("PL FPGA LOAD fail\n"); + + return ret; +} + +struct xilinx_fpga_op versal_op = { + .load = versal_load, +}; diff --git a/drivers/fpga/xilinx.c b/drivers/fpga/xilinx.c index f5135504eeb6..4b0334b6beb6 100644 --- a/drivers/fpga/xilinx.c +++ b/drivers/fpga/xilinx.c @@ -226,7 +226,10 @@ int xilinx_info(xilinx_desc *desc) case xilinx_zynqmp: printf("ZynqMP PL\n"); break; - /* Add new family types here */ + case xilinx_versal: + printf("Versal PL\n"); + break; + /* Add new family types here */ default: printf ("Unknown family type, %d\n", desc->family); } @@ -257,6 +260,9 @@ int xilinx_info(xilinx_desc *desc) case csu_dma: printf("csu_dma configuration interface (ZynqMP)\n"); break; + case cfi: + printf("CFI configuration interface (Versal)\n"); + break; /* Add new interface types here */ default: printf ("Unsupported interface type, %d\n", desc->iface); diff --git a/include/versalpl.h b/include/versalpl.h new file mode 100644 index 000000000000..b94c82e6e666 --- /dev/null +++ b/include/versalpl.h @@ -0,0 +1,20 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * (C) Copyright 2019 Xilinx, Inc, + * Siva Durga Prasad Paladugu + */ + +#ifndef _VERSALPL_H_ +#define _VERSALPL_H_ + +#include + +#define VERSAL_PM_LOAD_PDI 0x701 +#define VERSAL_PM_PDI_TYPE 0xF + +extern struct xilinx_fpga_op versal_op; + +#define XILINX_VERSAL_DESC \ +{ xilinx_versal, csu_dma, 1, &versal_op, 0, &versal_op } + +#endif /* _VERSALPL_H_ */ diff --git a/include/xilinx.h b/include/xilinx.h index af40befa52de..ab4537becfad 100644 --- a/include/xilinx.h +++ b/include/xilinx.h @@ -21,6 +21,7 @@ typedef enum { /* typedef xilinx_iface */ slave_selectmap, /* slave SelectMap (virtex2) */ devcfg, /* devcfg interface (zynq) */ csu_dma, /* csu_dma interface (zynqmp) */ + cfi, /* CFI interface(versal) */ max_xilinx_iface_type /* insert all new types before this */ } xilinx_iface; /* end, typedef xilinx_iface */ @@ -32,6 +33,7 @@ typedef enum { /* typedef xilinx_family */ xilinx_spartan3, /* Spartan-III Family */ xilinx_zynq, /* Zynq Family */ xilinx_zynqmp, /* ZynqMP Family */ + xilinx_versal, /* Versal Family */ max_xilinx_type /* insert all new types before this */ } xilinx_family; /* end, typedef xilinx_family */