From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S935173AbdBQV4A (ORCPT ); Fri, 17 Feb 2017 16:56:00 -0500 Received: from mail-qk0-f195.google.com ([209.85.220.195]:35284 "EHLO mail-qk0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S935115AbdBQVzz (ORCPT ); Fri, 17 Feb 2017 16:55:55 -0500 MIME-Version: 1.0 In-Reply-To: <20c28527-8a58-7aa0-489c-5bef7228a159@linux.intel.com> References: <1487175261-7051-1-git-send-email-atull@kernel.org> <1487175261-7051-5-git-send-email-atull@kernel.org> <20c28527-8a58-7aa0-489c-5bef7228a159@linux.intel.com> From: Alan Tull Date: Fri, 17 Feb 2017 15:55:37 -0600 Message-ID: Subject: Re: [RFC 4/8] doc: fpga-mgr: separate getting/locking FPGA manager To: "Li, Yi" Cc: Moritz Fischer , Jason Gunthorpe , linux-kernel , linux-fpga@vger.kernel.org Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Feb 17, 2017 at 11:14 AM, Li, Yi wrote: > hi Alan > > > On 2/15/2017 10:14 AM, Alan Tull wrote: >> >> Document that getting a reference to a FPGA Manager has been >> separated from locking the FPGA Mangager for use. >> >> fpga_mgr_lock/unlock functions get/release mutex. >> >> of_fpga_mgr_get, fpga_mgr_get, and fpga_mgr_put no longer lock >> the FPGA manager mutex. >> >> This makes it more straigtforward to save a reference to >> a FPGA manager and only attempting to lock it when programming >> the FPGA. > > > New to the FPGA world, but I like the idea of shorter lock. Separating the > lock from fpga_mgr_get will give underline FPGA device drivers more > flexibility to acquire the mgr pointer. > One newbie question, since the underline FPGA device driver does the > fpga_mgr_register during probe, each manager instance belongs to that FPGA > device only. What's the use to keep tracking the usage reference with > fpga_mgr_put/get function, or is it enough to increase/decrease dev > reference count in fpga_mgr_register/unregister function? Hi Yi, That's a good though but the code that creates the fpga mgr device might not be the code that needs to hold a reference to it. The device tree implementation is an example of this. The fpga mgr devices are created completely separately from the fpga regions. Alan > > Thanks, > Yi > >> >> Signed-off-by: Alan Tull >> --- >> Documentation/fpga/fpga-mgr.txt | 19 ++++++++++++++++++- >> 1 file changed, 18 insertions(+), 1 deletion(-) >> >> diff --git a/Documentation/fpga/fpga-mgr.txt >> b/Documentation/fpga/fpga-mgr.txt >> index 78f197f..06d5d5b 100644 >> --- a/Documentation/fpga/fpga-mgr.txt >> +++ b/Documentation/fpga/fpga-mgr.txt >> @@ -53,13 +53,26 @@ To get/put a reference to a FPGA manager: >> struct fpga_manager *of_fpga_mgr_get(struct device_node *node); >> struct fpga_manager *fpga_mgr_get(struct device *dev); >> -Given a DT node or device, get an exclusive reference to a FPGA >> manager. >> +Given a DT node or device, get an reference to a FPGA manager. Pointer >> +can be saved until you are ready to program the FPGA. >> void fpga_mgr_put(struct fpga_manager *mgr); >> Release the reference. >> +To get exclusive control of a FPGA manager: >> +------------------------------------------- >> + >> + int fpga_mgr_lock(struct fpga_magager *mgr); >> + >> +Call fpga_mgr_lock and verify that it returns 0 before attempting to >> +program the FPGA. >> + >> + void fpga_mgr_unlock(struct fpga_magager *mgr); >> + >> +Call fpga_mgr_unlock when done programming the FPGA. >> + >> To register or unregister the low level FPGA-specific driver: >> ------------------------------------------------------------- >> @@ -95,11 +108,13 @@ int ret; >> /* Get exclusive control of FPGA manager */ >> struct fpga_manager *mgr = of_fpga_mgr_get(mgr_node); >> +ret = fpga_mgr_lock(mgr); >> /* Load the buffer to the FPGA */ >> ret = fpga_mgr_buf_load(mgr, &info, buf, count); >> /* Release the FPGA manager */ >> +fpga_mgr_unlock(mgr); >> fpga_mgr_put(mgr); >> @@ -124,11 +139,13 @@ int ret; >> /* Get exclusive control of FPGA manager */ >> struct fpga_manager *mgr = of_fpga_mgr_get(mgr_node); >> +ret = fpga_mgr_lock(mgr); >> /* Get the firmware image (path) and load it to the FPGA */ >> ret = fpga_mgr_firmware_load(mgr, &info, path); >> /* Release the FPGA manager */ >> +fpga_mgr_unlock(mgr); >> fpga_mgr_put(mgr); >> > >