From patchwork Wed May 19 20:42:56 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Rix X-Patchwork-Id: 12268559 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.1 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id ED4C3C433ED for ; Wed, 19 May 2021 20:45:35 +0000 (UTC) Received: from desiato.infradead.org (desiato.infradead.org [90.155.92.199]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 635A4611AE for ; Wed, 19 May 2021 20:45:35 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 635A4611AE Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=desiato.20200630; h=Sender:Content-Transfer-Encoding :Content-Type:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:Cc:To:From: Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender :Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References:List-Owner; bh=7KJzdkxKNJbc7EBTtRwIaQuPo6elkwHxn1P4rXdLqS0=; b=Y1S/cNF0fIaOR9mscWkqGsNXqE EeD+IaJq+MpSMIuSzM2reXZWAzKiTSHPfZDzujAXHAcu4E55hYvyh83aGkiwyg5uCqvSusNadTX4R gz+ds9f8vC+iz7UIctx4Q1Z+cbSh/4Jn+AHnIpbPCzkNVXFQJloaaVaPuQgRysMD5r4PzIipS6IVM 6L++pRb7+tvWcd8WyQ9fJFKI88gxUJviU9ibhrLdSW3VGuNVrc+TY3XcSzjv5AMGWJyExkuLqJWmY a5Gixbxe3md9E7Gx3OdWJMQTx7msjBfC2FMpg6d5RJLgJquGNAkpKlYSU6akhiS5/kUYQyKt8sp5r ZTKz7G8g==; Received: from localhost ([::1] helo=desiato.infradead.org) by desiato.infradead.org with esmtp (Exim 4.94 #2 (Red Hat Linux)) id 1ljT2P-0054Kr-OS; Wed, 19 May 2021 20:43:33 +0000 Received: from bombadil.infradead.org ([2607:7c80:54:e::133]) by desiato.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1ljT26-0054Im-DE for linux-arm-kernel@desiato.infradead.org; Wed, 19 May 2021 20:43:19 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20210309; h=Content-Type: Content-Transfer-Encoding:MIME-Version:Message-Id:Date:Subject:Cc:To:From: Sender:Reply-To:Content-ID:Content-Description:In-Reply-To:References; bh=ZuFtfWXXiGzws9aQIqYrC67/CSxQ4w0n/vwtJ1KfrnQ=; b=gmB+R8WIy60fGzicC7tTZG602f UzXQXrZEW9oQI3GCrUSWlk/9kWxMQXRzhN7zWlVKLkT66T9k09gPeM6BdHIx543KBIYMMtKvlAvY6 G886jEzN3sfkPLd4Npk940BK7TMnm74BVEq/67SGs521sCanAxw+YA4tgpBmluW9AhFaI1U/V9abJ X0YUKvLU91kCATI7xyRJDVScZCv4KqIWxgIfS+b1lhmIXNIYUSz+ikJ0+NqSRAqCPH436kYBsHHlo SzIAGSO5YgYKKOszbS9f5gfWzV1S7/BP8G2VX4j8NyhpRuBa5XsgdpBKJWpiuFA9l4soyn+mIu5p2 ALTds26w==; Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by bombadil.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1ljT22-00FmQ7-LA for linux-arm-kernel@lists.infradead.org; Wed, 19 May 2021 20:43:08 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1621456984; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=ZuFtfWXXiGzws9aQIqYrC67/CSxQ4w0n/vwtJ1KfrnQ=; b=XLdxLdP7P1bVAKZGXh+Qo/5dK67DGtJ0f7agHsspk+ZjtUtK1EBud+ArEHoH5jGgRRlu9Q R/z5F0nxgniLtcqS82w1Le7XU8LEWoqexQTHkojCyh16Px9nNFzES7dd3Y/mE0l6wjVag6 HO6iU//6KwL7eM2msnrmK9KCpBrSpsk= Received: from mail-qk1-f200.google.com (mail-qk1-f200.google.com [209.85.222.200]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-100-isUa5uYZO2u5x8r5ZKtwcA-1; Wed, 19 May 2021 16:43:02 -0400 X-MC-Unique: isUa5uYZO2u5x8r5ZKtwcA-1 Received: by mail-qk1-f200.google.com with SMTP id d201-20020ae9efd20000b02902e9e9d8d9dcso10730281qkg.10 for ; Wed, 19 May 2021 13:43:02 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=ZuFtfWXXiGzws9aQIqYrC67/CSxQ4w0n/vwtJ1KfrnQ=; b=ZIt6Pd0SN2V+vcmPxvGOOxVfgB8iFXVZgdhrhsWGKWVnLeizmk4Z09RoNkFg1ni86C KAIYirhpJ+cHKwRHoIzZZ1TDxOzmx1Sz3U0nn9XfTAj1MmrVeQrC1DTmpCK/+EjBF2O9 pRXxPzp5xB6RNnOkuMfG/eXgisw7fZkzbGC2KyNo/Stev/kVxHczMWyzNWLyF5as6532 ZuaCElXHlB7sLU8Z7AXsQKNjoQcQX5zzQdeWtwdEtJV+MwRnwtD3Q3v+uUqkQ/zFrmgV ctfb2zirdImB+c1e2Z50Ram15nV6i2Fw+/ngRww8ystYoQ3BNgFL88Icoph1hw/S9ict 34Bw== X-Gm-Message-State: AOAM531Cw9W4agKzbGlqSFssqwb8esxJkCrG0/g9jK6oMlHe+0+C8zhN gaMjByC8V6eMMl5uXVjwtCWwkDfp8iACVjOfFmOU2VHKOpJVw5OwRuHQFBYB734Ahyuyw8PlB2N Bp971Xo1C8sGB1nX6S7dLtGeTHhXZGG0kPzs= X-Received: by 2002:ac8:65d8:: with SMTP id t24mr1585467qto.332.1621456981290; Wed, 19 May 2021 13:43:01 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxiMNJpn7sKIdbn/Q0+MN4ihM6/Fz3xCvaujadpb3hI1pDh7CzJGFGjO1dOwzMuhSjJehdvhQ== X-Received: by 2002:ac8:65d8:: with SMTP id t24mr1585437qto.332.1621456980957; Wed, 19 May 2021 13:43:00 -0700 (PDT) Received: from localhost.localdomain.com (075-142-250-213.res.spectrum.com. [75.142.250.213]) by smtp.gmail.com with ESMTPSA id e5sm421044qtg.96.2021.05.19.13.42.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 19 May 2021 13:43:00 -0700 (PDT) From: trix@redhat.com To: mdf@kernel.org, hao.wu@intel.com, michal.simek@xilinx.com Cc: linux-fpga@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Tom Rix Subject: [PATCH 1/2] fpga: generalize updating to partial and full Date: Wed, 19 May 2021 13:42:56 -0700 Message-Id: <20210519204256.1975957-1-trix@redhat.com> X-Mailer: git-send-email 2.26.3 MIME-Version: 1.0 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=trix@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210519_134306_880204_A84F3239 X-CRM114-Status: GOOD ( 19.96 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org From: Tom Rix There is a need to update the whole card. The user area, the shell and even the card firmware. This needs to be handled differently than the existing partial updating in the fpga manager. Move the write_* ops out of fpga_manager_ops and into a new fpga_manager_update_ops struct. Add two update_ops back to fpga_manager_ops, partial_update for the exiting functionality and full_update for the new functionity. Rewire fpga devs to use new partial_update ops Signed-off-by: Tom Rix --- drivers/fpga/altera-cvp.c | 8 ++++---- drivers/fpga/altera-pr-ip-core.c | 8 ++++---- drivers/fpga/altera-ps-spi.c | 8 ++++---- drivers/fpga/dfl-fme-mgr.c | 10 +++++----- drivers/fpga/fpga-mgr.c | 23 ++++++++++++----------- drivers/fpga/ice40-spi.c | 8 ++++---- drivers/fpga/machxo2-spi.c | 8 ++++---- drivers/fpga/socfpga-a10.c | 10 +++++----- drivers/fpga/socfpga.c | 8 ++++---- drivers/fpga/xilinx-spi.c | 8 ++++---- drivers/fpga/zynq-fpga.c | 10 +++++----- drivers/fpga/zynqmp-fpga.c | 8 ++++---- include/linux/fpga/fpga-mgr.h | 32 +++++++++++++++++++++----------- 13 files changed, 80 insertions(+), 69 deletions(-) diff --git a/drivers/fpga/altera-cvp.c b/drivers/fpga/altera-cvp.c index 4e0edb60bfba6..f90126ffd6c62 100644 --- a/drivers/fpga/altera-cvp.c +++ b/drivers/fpga/altera-cvp.c @@ -516,10 +516,10 @@ static int altera_cvp_write_complete(struct fpga_manager *mgr, } static const struct fpga_manager_ops altera_cvp_ops = { - .state = altera_cvp_state, - .write_init = altera_cvp_write_init, - .write = altera_cvp_write, - .write_complete = altera_cvp_write_complete, + .state = altera_cvp_state, + .partial_update.write_init = altera_cvp_write_init, + .partial_update.write = altera_cvp_write, + .partial_update.write_complete = altera_cvp_write_complete, }; static const struct cvp_priv cvp_priv_v1 = { diff --git a/drivers/fpga/altera-pr-ip-core.c b/drivers/fpga/altera-pr-ip-core.c index 5b130c4d98829..bd2c1470d1712 100644 --- a/drivers/fpga/altera-pr-ip-core.c +++ b/drivers/fpga/altera-pr-ip-core.c @@ -167,10 +167,10 @@ static int alt_pr_fpga_write_complete(struct fpga_manager *mgr, } static const struct fpga_manager_ops alt_pr_ops = { - .state = alt_pr_fpga_state, - .write_init = alt_pr_fpga_write_init, - .write = alt_pr_fpga_write, - .write_complete = alt_pr_fpga_write_complete, + .state = alt_pr_fpga_state, + .partial_update.write_init = alt_pr_fpga_write_init, + .partial_update.write = alt_pr_fpga_write, + .partial_update.write_complete = alt_pr_fpga_write_complete, }; int alt_pr_register(struct device *dev, void __iomem *reg_base) diff --git a/drivers/fpga/altera-ps-spi.c b/drivers/fpga/altera-ps-spi.c index 23bfd4d1ad0f7..80699d23a4fa8 100644 --- a/drivers/fpga/altera-ps-spi.c +++ b/drivers/fpga/altera-ps-spi.c @@ -231,10 +231,10 @@ static int altera_ps_write_complete(struct fpga_manager *mgr, } static const struct fpga_manager_ops altera_ps_ops = { - .state = altera_ps_state, - .write_init = altera_ps_write_init, - .write = altera_ps_write, - .write_complete = altera_ps_write_complete, + .state = altera_ps_state, + .partial_update.write_init = altera_ps_write_init, + .partial_update.write = altera_ps_write, + .partial_update.write_complete = altera_ps_write_complete, }; static const struct altera_ps_data *id_to_data(const struct spi_device_id *id) diff --git a/drivers/fpga/dfl-fme-mgr.c b/drivers/fpga/dfl-fme-mgr.c index d5861d13b3069..9772b0c239072 100644 --- a/drivers/fpga/dfl-fme-mgr.c +++ b/drivers/fpga/dfl-fme-mgr.c @@ -265,11 +265,11 @@ static u64 fme_mgr_status(struct fpga_manager *mgr) } static const struct fpga_manager_ops fme_mgr_ops = { - .write_init = fme_mgr_write_init, - .write = fme_mgr_write, - .write_complete = fme_mgr_write_complete, - .state = fme_mgr_state, - .status = fme_mgr_status, + .state = fme_mgr_state, + .status = fme_mgr_status, + .partial_update.write_init = fme_mgr_write_init, + .partial_update.write = fme_mgr_write, + .partial_update.write_complete = fme_mgr_write_complete, }; static void fme_mgr_get_compat_id(void __iomem *fme_pr, diff --git a/drivers/fpga/fpga-mgr.c b/drivers/fpga/fpga-mgr.c index b85bc47c91a9a..969dd400410c9 100644 --- a/drivers/fpga/fpga-mgr.c +++ b/drivers/fpga/fpga-mgr.c @@ -83,9 +83,9 @@ static int fpga_mgr_write_init_buf(struct fpga_manager *mgr, mgr->state = FPGA_MGR_STATE_WRITE_INIT; if (!mgr->mops->initial_header_size) - ret = mgr->mops->write_init(mgr, info, NULL, 0); + ret = mgr->mops->partial_update.write_init(mgr, info, NULL, 0); else - ret = mgr->mops->write_init( + ret = mgr->mops->partial_update.write_init( mgr, info, buf, min(mgr->mops->initial_header_size, count)); if (ret) { @@ -147,7 +147,7 @@ static int fpga_mgr_write_complete(struct fpga_manager *mgr, int ret; mgr->state = FPGA_MGR_STATE_WRITE_COMPLETE; - ret = mgr->mops->write_complete(mgr, info); + ret = mgr->mops->partial_update.write_complete(mgr, info); if (ret) { dev_err(&mgr->dev, "Error after writing image data to FPGA\n"); mgr->state = FPGA_MGR_STATE_WRITE_COMPLETE_ERR; @@ -187,14 +187,14 @@ static int fpga_mgr_buf_load_sg(struct fpga_manager *mgr, /* Write the FPGA image to the FPGA. */ mgr->state = FPGA_MGR_STATE_WRITE; - if (mgr->mops->write_sg) { - ret = mgr->mops->write_sg(mgr, sgt); + if (mgr->mops->partial_update.write_sg) { + ret = mgr->mops->partial_update.write_sg(mgr, sgt); } else { struct sg_mapping_iter miter; sg_miter_start(&miter, sgt->sgl, sgt->nents, SG_MITER_FROM_SG); while (sg_miter_next(&miter)) { - ret = mgr->mops->write(mgr, miter.addr, miter.length); + ret = mgr->mops->partial_update.write(mgr, miter.addr, miter.length); if (ret) break; } @@ -224,7 +224,7 @@ static int fpga_mgr_buf_load_mapped(struct fpga_manager *mgr, * Write the FPGA image to the FPGA. */ mgr->state = FPGA_MGR_STATE_WRITE; - ret = mgr->mops->write(mgr, buf, count); + ret = mgr->mops->partial_update.write(mgr, buf, count); if (ret) { dev_err(&mgr->dev, "Error while writing image data to FPGA\n"); mgr->state = FPGA_MGR_STATE_WRITE_ERR; @@ -264,7 +264,7 @@ static int fpga_mgr_buf_load(struct fpga_manager *mgr, * contiguous kernel buffer and the driver doesn't require SG, non-SG * drivers will still work on the slow path. */ - if (mgr->mops->write) + if (mgr->mops->partial_update.write) return fpga_mgr_buf_load_mapped(mgr, info, buf, count); /* @@ -568,9 +568,10 @@ struct fpga_manager *fpga_mgr_create(struct device *dev, const char *name, struct fpga_manager *mgr; int id, ret; - if (!mops || !mops->write_complete || !mops->state || - !mops->write_init || (!mops->write && !mops->write_sg) || - (mops->write && mops->write_sg)) { + if (!mops || !mops->partial_update.write_complete || !mops->state || + !mops->partial_update.write_init || (!mops->partial_update.write && + !mops->partial_update.write_sg) || + (mops->partial_update.write && mops->partial_update.write_sg)) { dev_err(dev, "Attempt to register without fpga_manager_ops\n"); return NULL; } diff --git a/drivers/fpga/ice40-spi.c b/drivers/fpga/ice40-spi.c index 69dec5af23c36..e6a7424e937b0 100644 --- a/drivers/fpga/ice40-spi.c +++ b/drivers/fpga/ice40-spi.c @@ -126,10 +126,10 @@ static int ice40_fpga_ops_write_complete(struct fpga_manager *mgr, } static const struct fpga_manager_ops ice40_fpga_ops = { - .state = ice40_fpga_ops_state, - .write_init = ice40_fpga_ops_write_init, - .write = ice40_fpga_ops_write, - .write_complete = ice40_fpga_ops_write_complete, + .state = ice40_fpga_ops_state, + .partial_update.write_init = ice40_fpga_ops_write_init, + .partial_update.write = ice40_fpga_ops_write, + .partial_update.write_complete = ice40_fpga_ops_write_complete, }; static int ice40_fpga_probe(struct spi_device *spi) diff --git a/drivers/fpga/machxo2-spi.c b/drivers/fpga/machxo2-spi.c index 114a64d2b7a4d..2b4e828e5f000 100644 --- a/drivers/fpga/machxo2-spi.c +++ b/drivers/fpga/machxo2-spi.c @@ -350,10 +350,10 @@ static int machxo2_write_complete(struct fpga_manager *mgr, } static const struct fpga_manager_ops machxo2_ops = { - .state = machxo2_spi_state, - .write_init = machxo2_write_init, - .write = machxo2_write, - .write_complete = machxo2_write_complete, + .state = machxo2_spi_state, + .partial_update.write_init = machxo2_write_init, + .partial_update.write = machxo2_write, + .partial_update.write_complete = machxo2_write_complete, }; static int machxo2_spi_probe(struct spi_device *spi) diff --git a/drivers/fpga/socfpga-a10.c b/drivers/fpga/socfpga-a10.c index 573d88bdf7307..1479a16c027d5 100644 --- a/drivers/fpga/socfpga-a10.c +++ b/drivers/fpga/socfpga-a10.c @@ -458,11 +458,11 @@ static enum fpga_mgr_states socfpga_a10_fpga_state(struct fpga_manager *mgr) } static const struct fpga_manager_ops socfpga_a10_fpga_mgr_ops = { - .initial_header_size = (RBF_DECOMPRESS_OFFSET + 1) * 4, - .state = socfpga_a10_fpga_state, - .write_init = socfpga_a10_fpga_write_init, - .write = socfpga_a10_fpga_write, - .write_complete = socfpga_a10_fpga_write_complete, + .initial_header_size = (RBF_DECOMPRESS_OFFSET + 1) * 4, + .state = socfpga_a10_fpga_state, + .partial_update.write_init = socfpga_a10_fpga_write_init, + .partial_update.write = socfpga_a10_fpga_write, + .partial_update.write_complete = socfpga_a10_fpga_write_complete, }; static int socfpga_a10_fpga_probe(struct platform_device *pdev) diff --git a/drivers/fpga/socfpga.c b/drivers/fpga/socfpga.c index 1f467173fc1f3..ac369921d0bb2 100644 --- a/drivers/fpga/socfpga.c +++ b/drivers/fpga/socfpga.c @@ -534,10 +534,10 @@ static enum fpga_mgr_states socfpga_fpga_ops_state(struct fpga_manager *mgr) } static const struct fpga_manager_ops socfpga_fpga_ops = { - .state = socfpga_fpga_ops_state, - .write_init = socfpga_fpga_ops_configure_init, - .write = socfpga_fpga_ops_configure_write, - .write_complete = socfpga_fpga_ops_configure_complete, + .state = socfpga_fpga_ops_state, + .partial_update.write_init = socfpga_fpga_ops_configure_init, + .partial_update.write = socfpga_fpga_ops_configure_write, + .partial_update.write_complete = socfpga_fpga_ops_configure_complete, }; static int socfpga_fpga_probe(struct platform_device *pdev) diff --git a/drivers/fpga/xilinx-spi.c b/drivers/fpga/xilinx-spi.c index fee4d0abf6bfe..269af904f8057 100644 --- a/drivers/fpga/xilinx-spi.c +++ b/drivers/fpga/xilinx-spi.c @@ -214,10 +214,10 @@ static int xilinx_spi_write_complete(struct fpga_manager *mgr, } static const struct fpga_manager_ops xilinx_spi_ops = { - .state = xilinx_spi_state, - .write_init = xilinx_spi_write_init, - .write = xilinx_spi_write, - .write_complete = xilinx_spi_write_complete, + .state = xilinx_spi_state, + .partial_update.write_init = xilinx_spi_write_init, + .partial_update.write = xilinx_spi_write, + .partial_update.write_complete = xilinx_spi_write_complete, }; static int xilinx_spi_probe(struct spi_device *spi) diff --git a/drivers/fpga/zynq-fpga.c b/drivers/fpga/zynq-fpga.c index 07fa8d9ec6750..160f529cd12e6 100644 --- a/drivers/fpga/zynq-fpga.c +++ b/drivers/fpga/zynq-fpga.c @@ -543,11 +543,11 @@ static enum fpga_mgr_states zynq_fpga_ops_state(struct fpga_manager *mgr) } static const struct fpga_manager_ops zynq_fpga_ops = { - .initial_header_size = 128, - .state = zynq_fpga_ops_state, - .write_init = zynq_fpga_ops_write_init, - .write_sg = zynq_fpga_ops_write, - .write_complete = zynq_fpga_ops_write_complete, + .initial_header_size = 128, + .state = zynq_fpga_ops_state, + .partial_update.write_init = zynq_fpga_ops_write_init, + .partial_update.write_sg = zynq_fpga_ops_write, + .partial_update.write_complete = zynq_fpga_ops_write_complete, }; static int zynq_fpga_probe(struct platform_device *pdev) diff --git a/drivers/fpga/zynqmp-fpga.c b/drivers/fpga/zynqmp-fpga.c index 125743c9797ff..de77b8b2fb028 100644 --- a/drivers/fpga/zynqmp-fpga.c +++ b/drivers/fpga/zynqmp-fpga.c @@ -84,10 +84,10 @@ static enum fpga_mgr_states zynqmp_fpga_ops_state(struct fpga_manager *mgr) } static const struct fpga_manager_ops zynqmp_fpga_ops = { - .state = zynqmp_fpga_ops_state, - .write_init = zynqmp_fpga_ops_write_init, - .write = zynqmp_fpga_ops_write, - .write_complete = zynqmp_fpga_ops_write_complete, + .state = zynqmp_fpga_ops_state, + .partial_update.write_init = zynqmp_fpga_ops_write_init, + .partial_update.write = zynqmp_fpga_ops_write, + .partial_update.write_complete = zynqmp_fpga_ops_write_complete, }; static int zynqmp_fpga_probe(struct platform_device *pdev) diff --git a/include/linux/fpga/fpga-mgr.h b/include/linux/fpga/fpga-mgr.h index 2bc3030a69e54..ab68280f3b4a4 100644 --- a/include/linux/fpga/fpga-mgr.h +++ b/include/linux/fpga/fpga-mgr.h @@ -106,14 +106,29 @@ struct fpga_image_info { }; /** - * struct fpga_manager_ops - ops for low level fpga manager drivers - * @initial_header_size: Maximum number of bytes that should be passed into write_init - * @state: returns an enum value of the FPGA's state - * @status: returns status of the FPGA, including reconfiguration error code + * struct fpga_manager_update_ops - ops updating fpga * @write_init: prepare the FPGA to receive confuration data * @write: write count bytes of configuration data to the FPGA * @write_sg: write the scatter list of configuration data to the FPGA * @write_complete: set FPGA to operating state after writing is done + */ +struct fpga_manager_update_ops { + int (*write_init)(struct fpga_manager *mgr, + struct fpga_image_info *info, + const char *buf, size_t count); + int (*write)(struct fpga_manager *mgr, const char *buf, size_t count); + int (*write_sg)(struct fpga_manager *mgr, struct sg_table *sgt); + int (*write_complete)(struct fpga_manager *mgr, + struct fpga_image_info *info); +}; + +/** + * struct fpga_manager_ops - ops for low level fpga manager drivers + * @initial_header_size: Maximum number of bytes that should be passed into write_init + * @state: returns an enum value of the FPGA's state + * @status: returns status of the FPGA, including reconfiguration error code + * @partial_update: ops for doing partial reconfiguration + * @full_update: ops for doing a full card update, user,shell,fw ie. the works * @fpga_remove: optional: Set FPGA into a specific state during driver remove * @groups: optional attribute groups. * @@ -125,13 +140,8 @@ struct fpga_manager_ops { size_t initial_header_size; enum fpga_mgr_states (*state)(struct fpga_manager *mgr); u64 (*status)(struct fpga_manager *mgr); - int (*write_init)(struct fpga_manager *mgr, - struct fpga_image_info *info, - const char *buf, size_t count); - int (*write)(struct fpga_manager *mgr, const char *buf, size_t count); - int (*write_sg)(struct fpga_manager *mgr, struct sg_table *sgt); - int (*write_complete)(struct fpga_manager *mgr, - struct fpga_image_info *info); + struct fpga_manager_update_ops partial_update; + struct fpga_manager_update_ops full_update; void (*fpga_remove)(struct fpga_manager *mgr); const struct attribute_group **groups; };