From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753982AbdLHJqX (ORCPT ); Fri, 8 Dec 2017 04:46:23 -0500 Received: from mga12.intel.com ([192.55.52.136]:58719 "EHLO mga12.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753396AbdLHJo2 (ORCPT ); Fri, 8 Dec 2017 04:44:28 -0500 X-Greylist: delayed 577 seconds by postgrey-1.27 at vger.kernel.org; Fri, 08 Dec 2017 04:44:28 EST X-Amp-Result: UNKNOWN X-Amp-Original-Verdict: FILE UNKNOWN X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.45,377,1508828400"; d="scan'208";a="1125617" Date: Fri, 8 Dec 2017 17:25:11 +0800 From: Wu Hao To: Alan Tull Cc: Moritz Fischer , linux-fpga@vger.kernel.org, linux-kernel , linux-api@vger.kernel.org, "Kang, Luwei" , "Zhang, Yi Z" , Tim Whisonant , Enno Luebbers , Shiva Rao , Christopher Rauer , Xiao Guangrong Subject: Re: [PATCH v3 09/21] fpga: intel-dfl-pci: add enumeration for feature devices Message-ID: <20171208092511.GA513@hao-dev> References: <1511764948-20972-1-git-send-email-hao.wu@intel.com> <1511764948-20972-10-git-send-email-hao.wu@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Dec 07, 2017 at 03:41:41PM -0600, Alan Tull wrote: > On Mon, Nov 27, 2017 at 12:42 AM, Wu Hao wrote: > > > +/* enumerate feature devices under pci device */ > > +static int cci_enumerate_feature_devs(struct pci_dev *pcidev) > > +{ > > + struct cci_drvdata *drvdata = pci_get_drvdata(pcidev); > > + struct fpga_cdev *cdev; > > + struct fpga_enum_info *info; > > + resource_size_t start, len; > > + void __iomem *base; > > + int port_num, bar, i, ret = 0; > > + u32 offset; > > + u64 v; > > + > > + /* allocate enumeration info via pci_dev */ > > + info = fpga_enum_info_alloc(&pcidev->dev); > > + if (!info) > > + return -ENOMEM; > > + > > + /* start to find Device Feature List from Bar 0 */ > > + base = cci_pci_ioremap_bar(pcidev, 0); > > + if (!base) { > > + ret = -ENOMEM; > > + goto enum_info_free_exit; > > + } > > + > > + /* > > + * PF device has FME and Ports/AFUs, and VF device only has 1 Port/AFU. > > + * check them and add related "Device Feature List" info for the next > > + * step enumeration. > > + */ > > + if (feature_is_fme(base)) { > > + start = pci_resource_start(pcidev, 0); > > + len = pci_resource_len(pcidev, 0); > > + > > + fpga_enum_info_add_dfl(info, start, len, base); > > + > > + /* > > + * find more Device Feature Lists (e.g Ports) per information > > + * indicated by FME module. > > + */ > > + v = readq(base + FME_HDR_CAP); > > + port_num = FIELD_GET(FME_CAP_NUM_PORTS, v); > > + > > + WARN_ON(port_num > MAX_FPGA_PORT_NUM); > > + > > + for (i = 0; i < port_num; i++) { > > + v = readq(base + FME_HDR_PORT_OFST(i)); > > + > > + /* skip ports which are not implemented. */ > > + if (!(v & FME_PORT_OFST_IMP)) > > + continue; > > + > > + /* > > + * add Port's Device Feature List information for next > > + * step enumeration. > > + */ > > + bar = FIELD_GET(FME_PORT_OFST_BAR_ID, v); > > + offset = FIELD_GET(FME_PORT_OFST_DFH_OFST, v); > > + base = cci_pci_ioremap_bar(pcidev, bar); > > + if (!base) > > + continue; > > + > > + start = pci_resource_start(pcidev, bar) + offset; > > + len = pci_resource_len(pcidev, bar) - offset; > > + > > + fpga_enum_info_add_dfl(info, start, len, base + offset); > > + } > > + } else if (feature_is_port(base)) { > > + start = pci_resource_start(pcidev, 0); > > + len = pci_resource_len(pcidev, 0); > > + > > + fpga_enum_info_add_dfl(info, start, len, base); > > + } else { > > + ret = -ENODEV; > > + goto enum_info_free_exit; > > + } > > + > > + /* start enumeration with prepared enumeration information */ > > + cdev = fpga_enumerate_feature_devs(info); > > Hi Hao, > > I appreciate you separating the DFL enumeration code from this PCIe > module. This made the pcie part quite small. It should work for > embedded platforms just by adding a platform device whose function is > to find the DFL structures at some address and then call these same > fpga_enum_info_add_dfl adn fpga_enumerate_feature_devs functions. Yes, I think this is the right direction as you suggested. : ) Thanks Hao > > Alan