Received: by 10.223.185.116 with SMTP id b49csp1194957wrg; Wed, 14 Feb 2018 13:09:16 -0800 (PST) X-Google-Smtp-Source: AH8x225eg0kWnipqtBKiOAQc//+D4YFK1Rv+Ek4I/dlDSeDEfTQIrWMKL8vsOQ0br4aY2qRaBWM7 X-Received: by 2002:a17:902:8a94:: with SMTP id p20-v6mr297057plo.373.1518642556217; Wed, 14 Feb 2018 13:09:16 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518642556; cv=none; d=google.com; s=arc-20160816; b=y+oW2KHXjjkMverVcuy0o7yfN+Kk+AFkNftuED0RIjr3TIljarmTbn3ONjwVqqPxxS Nu4F9mo1rFOzsQiEb2DSezaMepU01+NvWgcpUdinTOC+4qhY25V3VpbMbEiZ5I3srvi5 OK32fqi91bbAelTZ8AVSy68nlVvNKY+6SHZ8IbGG0NvbB6alEdgKUcuMNn7QXKKDw3jk huGLu6fKy11wYQL8ENN5QBGVqyh+0Gbo45QltctoxqediLfEwb2SIVWsd+vjOxlD8FuZ vJN0xB5tHHRJhguGQ0Xvm7I5+MJ7K9J+9chVQhi0BxgbPcf/tDX3XQzIPq2kDo6YWkRe pGcw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:arc-authentication-results; bh=lMu65Oj8dparUwPObWLRsOIyhqWM1EHQyrkt0YBJWkQ=; b=UtIZzxo2W+uWHeq1inYMMvsSD4gMBZmYWDUILNLzqPAZfaFaDLHRtPaXGa8HXJ9q+U mFw7X8/5FD0V4fJmLuLilKzQqPSgXiU48KQ6AnE/xnIxfXz6waHcwic04Nbhr2UFPeWe Db7F8ET6mtSX9Qi3QpXm4nQE/CbpE5691GlhDI5fpfMc5xPa9EQ1xYkrBaOveZkqW7YP JFlBkTTEEJ36dAdsIBYIcG2V63RaLizwyB/DV3GvlM43K1hB/r6jTX3wLHu4ht278Gze uBFDpj77jW8Wj7fcZmnlVfOJ8w7hkXz4L2yRt+tz3TNFitK7/0qrRwbAHJr+21b8LZUk Ekcw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id t74si8437380pgc.649.2018.02.14.13.09.00; Wed, 14 Feb 2018 13:09:16 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1030977AbeBNVIU (ORCPT + 99 others); Wed, 14 Feb 2018 16:08:20 -0500 Received: from mail-pl0-f65.google.com ([209.85.160.65]:40743 "EHLO mail-pl0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1030501AbeBNVIR (ORCPT ); Wed, 14 Feb 2018 16:08:17 -0500 Received: by mail-pl0-f65.google.com with SMTP id g18so9227910plo.7 for ; Wed, 14 Feb 2018 13:08:17 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=lMu65Oj8dparUwPObWLRsOIyhqWM1EHQyrkt0YBJWkQ=; b=hEHJ6oYwy3MAbI+R/eTvd+dDvl3ss5yfFyPuzIAwTugJn95oXAw71sOfzkUzhIO/jB h/Z+t0F5dJLyxllrKxsaPdkxyNwO6SNxbZpoWQpIMb5dFhuAVou1Po/9NcMn1uttC212 HmIYAtDaQcaYZa8qXxrmrLjzN0cY4jemyyDuz5+tuBjuJJzFAwSkdrYolzWyXRa6/wUz Gu3pld9yKlCMHI5c8kJpdnR7MW5fu+uEqoQEPyt/zcqsL+yADFu6C7Q8iEIRQoow9a1B hgwmYT4WdWOg9Kh/fL9JNhAT43/ssxvxuvQRp/1TGQa8RFNQAt3wbOiu/aRwzGDqg/+W VfBQ== X-Gm-Message-State: APf1xPAmY9jtK01wByBKu1tOAfGcntYPGPNbKlAhq5M5U6YrFOsfVVwU R7rDeXQBMfz2/V2n0jvroiaSfw== X-Received: by 2002:a17:902:594c:: with SMTP id e12-v6mr301613plj.323.1518642496858; Wed, 14 Feb 2018 13:08:16 -0800 (PST) Received: from localhost (207-114-172-147.static.twtelecom.net. [207.114.172.147]) by smtp.gmail.com with ESMTPSA id z10sm33121757pgs.17.2018.02.14.13.08.15 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 14 Feb 2018 13:08:15 -0800 (PST) Date: Wed, 14 Feb 2018 13:03:19 -0800 From: Moritz Fischer To: Wu Hao Cc: atull@kernel.org, mdf@kernel.org, linux-fpga@vger.kernel.org, linux-kernel@vger.kernel.org, linux-api@vger.kernel.org, luwei.kang@intel.com, yi.z.zhang@intel.com, Xiao Guangrong , Tim Whisonant , Enno Luebbers , Shiva Rao , Christopher Rauer Subject: Re: [PATCH v4 07/24] fpga: dfl: add feature device infrastructure Message-ID: <20180214210319.GC25618@tyrael.ni.corp.natinst.com> References: <1518513893-4719-1-git-send-email-hao.wu@intel.com> <1518513893-4719-8-git-send-email-hao.wu@intel.com> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="da4uJneut+ArUgXk" Content-Disposition: inline In-Reply-To: <1518513893-4719-8-git-send-email-hao.wu@intel.com> User-Agent: Mutt/1.9.3 (2018-01-21) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org --da4uJneut+ArUgXk Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable HI Hao, On Tue, Feb 13, 2018 at 05:24:36PM +0800, Wu Hao wrote: > From: Xiao Guangrong >=20 > This patch abstracts the common operations of the sub features, and defin= es > the feature_ops data structure, including init, uinit and ioctl function > pointers. And this patch adds some common helper functions for FME and AFU > drivers, e.g feature_dev_use_begin/end which are used to ensure exclusive > usage of the feature device file. >=20 > Signed-off-by: Tim Whisonant > Signed-off-by: Enno Luebbers > Signed-off-by: Shiva Rao > Signed-off-by: Christopher Rauer > Signed-off-by: Kang Luwei > Signed-off-by: Zhang Yi > Signed-off-by: Xiao Guangrong > Signed-off-by: Wu Hao > --- > v2: rebased > v3: use const for feature_ops. > replace pci related function. > v4: rebase and add more comments in code. > --- > drivers/fpga/dfl.c | 59 +++++++++++++++++++++++++++++++++++++ > drivers/fpga/dfl.h | 85 ++++++++++++++++++++++++++++++++++++++++++++++++= +++++- > 2 files changed, 143 insertions(+), 1 deletion(-) >=20 > diff --git a/drivers/fpga/dfl.c b/drivers/fpga/dfl.c > index 38dc819..c0aad87 100644 > --- a/drivers/fpga/dfl.c > +++ b/drivers/fpga/dfl.c > @@ -74,6 +74,65 @@ static enum fpga_id_type feature_dev_id_type(struct pl= atform_device *pdev) > return FPGA_ID_MAX; > } > =20 > +void fpga_dev_feature_uinit(struct platform_device *pdev) > +{ > + struct feature *feature; > + struct feature_platform_data *pdata =3D dev_get_platdata(&pdev->dev); See comment below w.r.t ordering declarations. Not a must for sure. > + > + fpga_dev_for_each_feature(pdata, feature) > + if (feature->ops) { > + feature->ops->uinit(pdev, feature); > + feature->ops =3D NULL; > + } > +} > +EXPORT_SYMBOL_GPL(fpga_dev_feature_uinit); > + > +static int > +feature_instance_init(struct platform_device *pdev, > + struct feature_platform_data *pdata, > + struct feature *feature, struct feature_driver *drv) > +{ > + int ret; > + > + WARN_ON(!feature->ioaddr); Not sure I understand correctly, is the !feature->ioaddr a use-case that happens? If not just return early. > + > + ret =3D drv->ops->init(pdev, feature); > + if (ret) > + return ret; > + > + feature->ops =3D drv->ops; > + > + return ret; > +} > + > +int fpga_dev_feature_init(struct platform_device *pdev, > + struct feature_driver *feature_drvs) > +{ > + struct feature *feature; > + struct feature_driver *drv =3D feature_drvs; > + struct feature_platform_data *pdata =3D dev_get_platdata(&pdev->dev); > + int ret; We don't have clear guidelines here, but some subsystems want reverse X-Mas tree declarations. > + > + while (drv->ops) { > + fpga_dev_for_each_feature(pdata, feature) { > + /* match feature and drv using id */ > + if (feature->id =3D=3D drv->id) { > + ret =3D feature_instance_init(pdev, pdata, > + feature, drv); > + if (ret) > + goto exit; > + } > + } > + drv++; > + } > + > + return 0; > +exit: > + fpga_dev_feature_uinit(pdev); > + return ret; > +} > +EXPORT_SYMBOL_GPL(fpga_dev_feature_init); > + > struct fpga_chardev_info { > const char *name; > dev_t devt; > diff --git a/drivers/fpga/dfl.h b/drivers/fpga/dfl.h > index d6ecda1..ede1e95 100644 > --- a/drivers/fpga/dfl.h > +++ b/drivers/fpga/dfl.h > @@ -132,6 +132,17 @@ > #define PORT_CTRL_SFTRST_ACK BIT(4) /* HW ack for reset */ > =20 > /** > + * struct feature_driver - sub feature's driver > + * > + * @id: sub feature id. > + * @ops: ops of this sub feature. > + */ > +struct feature_driver { > + u64 id; > + const struct feature_ops *ops; > +}; > + > +/** > * struct feature - sub feature of the feature devices > * > * @id: sub feature id. > @@ -139,13 +150,17 @@ > * this index is used to find its mmio resource from the > * feature dev (platform device)'s reources. > * @ioaddr: mapped mmio resource address. > + * @ops: ops of this sub feature. > */ > struct feature { > u64 id; > int resource_index; > void __iomem *ioaddr; > + const struct feature_ops *ops; > }; > =20 > +#define DEV_STATUS_IN_USE 0 > + > /** > * struct feature_platform_data - platform data for feature devices > * > @@ -155,6 +170,8 @@ struct feature { > * @dev: ptr to platform device linked with this platform data. > * @disable_count: count for port disable. > * @num: number for sub features. > + * @dev_status: dev status (e.g DEV_STATUS_IN_USE). > + * @private: ptr to feature dev private data. > * @features: sub features of this feature dev. > */ > struct feature_platform_data { > @@ -163,11 +180,44 @@ struct feature_platform_data { > struct cdev cdev; > struct platform_device *dev; > unsigned int disable_count; > - > + unsigned long dev_status; > + void *private; > int num; > struct feature features[0]; > }; > =20 > +static inline int feature_dev_use_begin(struct feature_platform_data *pd= ata) > +{ > + /* Test and set IN_USE flags to ensure file is exclusively used */ > + if (test_and_set_bit_lock(DEV_STATUS_IN_USE, &pdata->dev_status)) > + return -EBUSY; > + > + return 0; > +} > + > +static inline void feature_dev_use_end(struct feature_platform_data *pda= ta) > +{ > + clear_bit_unlock(DEV_STATUS_IN_USE, &pdata->dev_status); > +} > + > +static inline void > +fpga_pdata_set_private(struct feature_platform_data *pdata, void *privat= e) > +{ > + pdata->private =3D private; > +} > + > +static inline void *fpga_pdata_get_private(struct feature_platform_data = *pdata) > +{ > + return pdata->private; > +} > + > +struct feature_ops { > + int (*init)(struct platform_device *pdev, struct feature *feature); > + void (*uinit)(struct platform_device *pdev, struct feature *feature); > + long (*ioctl)(struct platform_device *pdev, struct feature *feature, > + unsigned int cmd, unsigned long arg); > +}; > + > #define FPGA_FEATURE_DEV_FME "dfl-fme" > #define FPGA_FEATURE_DEV_PORT "dfl-port" > =20 > @@ -177,6 +227,10 @@ static inline int feature_platform_data_size(const i= nt num) > num * sizeof(struct feature); > } > =20 > +void fpga_dev_feature_uinit(struct platform_device *pdev); > +int fpga_dev_feature_init(struct platform_device *pdev, > + struct feature_driver *feature_drvs); > + > enum fpga_devt_type { > FPGA_DEVT_FME, > FPGA_DEVT_PORT, > @@ -257,6 +311,15 @@ static inline int fpga_port_reset(struct platform_de= vice *pdev) > return ret; > } > =20 > +static inline > +struct platform_device *fpga_inode_to_feature_dev(struct inode *inode) > +{ > + struct feature_platform_data *pdata; > + > + pdata =3D container_of(inode->i_cdev, struct feature_platform_data, cde= v); > + return pdata->dev; > +} > + > #define fpga_dev_for_each_feature(pdata, feature) \ > for ((feature) =3D (pdata)->features; \ > (feature) < (pdata)->features + (pdata)->num; (feature)++) > @@ -284,6 +347,17 @@ static inline void __iomem *get_feature_ioaddr_by_id= (struct device *dev, u64 id) > return NULL; > } > =20 > +static inline bool is_feature_present(struct device *dev, u64 id) > +{ > + return !!get_feature_ioaddr_by_id(dev, id); > +} > + > +static inline struct device * > +fpga_pdata_to_parent(struct feature_platform_data *pdata) > +{ > + return pdata->dev->dev.parent->parent; > +} > + > static inline bool feature_is_fme(void __iomem *base) > { > u64 v =3D readq(base + DFH); > @@ -376,4 +450,13 @@ fpga_cdev_find_port(struct fpga_cdev *cdev, void *da= ta, > =20 > return pdev; > } > + > +static inline struct fpga_cdev * > +fpga_pdata_to_fpga_cdev(struct feature_platform_data *pdata) > +{ > + struct device *dev =3D pdata->dev->dev.parent; > + struct fpga_region *region =3D to_fpga_region(dev); > + > + return container_of(region, struct fpga_cdev, region); > +} > #endif /* __FPGA_DFL_H */ > --=20 > 2.7.4 >=20 Thanks, Moritz --da4uJneut+ArUgXk Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEEowQ4eJSlIZpNWnl2UVwKRFcJcNgFAlqEpBQACgkQUVwKRFcJ cNjSRAf+LhReDDmB8JFHGcb/vTAOftz0Pd8wWYUo7Qw7vTLnP8xocPKYzqnekilQ 9nihgsoeoE2ezwbt2L2xRMyqstDYk2r26sD98WqeQi788TXxB4U1c4+16f5hV9In 0L+epZd5Ocm+mo0cfb1Yvwg1QCLDbauWEgJgkaPm0sPmAtRVy9+2v1LhpLCwO03u O6ccWlEy9hO/hy6ENlpdGJuqX/fr7RJL6yEYnuisLSw6nMzSNe5qmpVPExx3MUJX Pb/44/XbFcdr2akqKP6IxMRO1NOybhIHJtlVLldnyoZRQmuExRDplrYMo+Ad/iY9 AYCpBIPy0VHLGeDOH1YVlKl/aSUh2w== =kobZ -----END PGP SIGNATURE----- --da4uJneut+ArUgXk--