From: Alan Tull <atull@kernel.org>
To: Shubhrajyoti Datta <shubhrajyoti.datta@gmail.com>
Cc: Moritz Fischer <mdf@kernel.org>,
linux-fpga@vger.kernel.org, Rob Herring <robh+dt@kernel.org>,
Michal Simek <michal.simek@xilinx.com>,
"open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS"
<devicetree@vger.kernel.org>,
nofooter@xilinx.com,
Shubhrajyoti Datta <shubhrajyoti.datta@xilinx.com>
Subject: Re: [PATCH 2/2] fpga: reset bridge: Add the reset bridge
Date: Fri, 2 Mar 2018 20:43:19 -0600 [thread overview]
Message-ID: <CANk1AXSOrfY6YyN+BfFneCPZEwTth8LrGNkKXgZ6kXuxkRT7QA@mail.gmail.com> (raw)
In-Reply-To: <CAKfKVtGc4rn0UWbs3TVzqS_2=UL24gRcQR4+5e4XOnrztOy06A@mail.gmail.com>
On Fri, Mar 2, 2018 at 1:24 AM, Shubhrajyoti Datta
<shubhrajyoti.datta@gmail.com> wrote:
> Hi Moritz,
>
> <snip>
>>> >
>>> > Normally, as Moritz is saying, the reset would be handled by the
>>> > driver for the fabric-based hardware.
>>> I didnt understand you mean the platform-fpga.c ?
>>
>> I don't understand this sentence ;-) I'll try to re-explain:
>>
>> Say you have an AXI DMA engine in there that needs a reset to be toggled
>> after programming the FPGA then you are in either one of these cases:
>>
>> a) You're doing a full reprogram of the entire fabric, at which point
>> you can reset everything by asserting them in the driver like in
>> drivers/fpga/zynq-fpga.c
> That would work however I was thinking the reset technically should be in
> the region and not the fpga manager as it is more related to the region than
> the manager.
OK now I understand that this is supporting a reset that is resetting
all the hardware in a region of fabric. The region could contain
multiple devices. This change isn't meant to support toggling a
single fpga-based device's reset (that would be handled in the
device's driver).
> Ofcourse manager could proxy for the region.
Mapping the reset to the region is the more general case. It will
support resets that either apply to a single PR region or resetting a
whole fabric of a FPGA that is doing full reconfig, i
>
> how about [1]
[1] makes sense to me now. That is a better solution than making this
be a bridge.
>
>>
>> b) You're doing a partial reconfiguration in which case the regions that
>> are being reconfigured contain some peripherals you want to selectively
>> reset. If you need a software reset, the driver for this peripheral can
>> request a reset through the normal reset API.
>
> So if the ip was written in full bitstream case the fpga manager does
> the request.
> In PRR case the driver would do it ?
>
> I would have preferred to keep that(full or PRR case) agnostic to the driver.
>>
>> Am I missing somehting here? Why do you need the bridge to do the reset?
>>
>> - Moritz
> [1]
> diff --git a/Documentation/devicetree/bindings/fpga/fpga-region.txt
> b/Documentation/devicetree/bindings/fpga/fpga-region.txt
> index 6db8aed..955a863 100644
> --- a/Documentation/devicetree/bindings/fpga/fpga-region.txt
> +++ b/Documentation/devicetree/bindings/fpga/fpga-region.txt
> @@ -196,6 +196,7 @@ Optional properties:
> - config-complete-timeout-us : The maximum time in microseconds time for the
> FPGA to go to operating mode after the region has been programmed.
> - child nodes : devices in the FPGA after programming.
> +- resets : Phandle and reset specifier for this region
>
> In the example below, when an overlay is applied targeting fpga-region0,
> fpga_mgr is used to program the FPGA. Two bridges are controlled during
> diff --git a/drivers/fpga/fpga-region.c b/drivers/fpga/fpga-region.c
> index 58789b9..8c87a6b 100644
> --- a/drivers/fpga/fpga-region.c
> +++ b/drivers/fpga/fpga-region.c
> @@ -25,6 +25,7 @@
> #include <linux/of_platform.h>
> #include <linux/slab.h>
> #include <linux/spinlock.h>
> +#include <linux/reset.h>
>
> /**
> * struct fpga_region - FPGA Region structure
> @@ -235,6 +236,8 @@ static int fpga_region_program_fpga(struct
> fpga_region *region,
> {
> struct fpga_manager *mgr;
> int ret;
> + struct device *dev = ®ion->dev;
> + struct reset_control *rstc;
>
> region = fpga_region_get(region);
> if (IS_ERR(region)) {
> @@ -273,6 +276,15 @@ static int fpga_region_program_fpga(struct
> fpga_region *region,
> goto err_put_br;
> }
>
> + rstc = of_reset_control_array_get(dev->of_node, false, true);
> + if (IS_ERR(rstc)) {
> + goto err_put_br;
> + }
> +
> + reset_control_reset(rstc);
> + reset_control_put(rstc);
> +
This looks good to me. This allows there to be a reset that's not
dedicated to a specific device, but really is resetting a whole PR
region. Or resetting the whole FPGA, it handles both cases. And we
get that pretty pain-free, just add the reset to the fpga region in
the device tree, if this device tree is being used, for example.
Alan
> fpga_bridges_put(®ion->bridge_list);
> fpga_mgr_put(mgr);
> fpga_region_put(region);
next prev parent reply other threads:[~2018-03-03 2:43 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-02-21 4:53 [PATCH 1/2] doc: fpga: Add reset bridge support shubhrajyoti.datta
2018-02-21 4:53 ` [PATCH 2/2] fpga: reset bridge: Add the reset bridge shubhrajyoti.datta
2018-02-26 22:53 ` Alan Tull
2018-02-27 0:28 ` Moritz Fischer
2018-02-27 4:46 ` Shubhrajyoti Datta
2018-02-27 17:00 ` Alan Tull
2018-03-01 10:49 ` Shubhrajyoti Datta
2018-03-02 5:00 ` Moritz Fischer
2018-03-02 7:24 ` Shubhrajyoti Datta
2018-03-03 2:43 ` Alan Tull [this message]
2018-03-03 3:23 ` Moritz Fischer
2018-03-03 3:54 ` Alan Tull
2018-03-08 22:32 ` Alan Tull
2018-02-27 5:04 ` Shubhrajyoti Datta
2018-02-21 17:44 ` [PATCH 1/2] doc: fpga: Add reset bridge support Moritz Fischer
2018-02-22 9:47 ` Shubhrajyoti Datta
-- strict thread matches above, loose matches on Subject: below --
2018-02-20 8:42 Shubhrajyoti Datta
2018-02-20 8:42 ` [PATCH 2/2] fpga: reset bridge: Add the reset bridge Shubhrajyoti Datta
2018-02-20 8:40 [PATCH 1/2] doc: fpga: Add reset bridge support Shubhrajyoti Datta
2018-02-20 8:40 ` [PATCH 2/2] fpga: reset bridge: Add the reset bridge Shubhrajyoti Datta
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CANk1AXSOrfY6YyN+BfFneCPZEwTth8LrGNkKXgZ6kXuxkRT7QA@mail.gmail.com \
--to=atull@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=linux-fpga@vger.kernel.org \
--cc=mdf@kernel.org \
--cc=michal.simek@xilinx.com \
--cc=nofooter@xilinx.com \
--cc=robh+dt@kernel.org \
--cc=shubhrajyoti.datta@gmail.com \
--cc=shubhrajyoti.datta@xilinx.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).