From: Leon Romanovsky <leon@kernel.org>
To: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Cc: dledford@redhat.com, jgg@mellanox.com,
gregkh@linuxfoundation.org,
Mustafa Ismail <mustafa.ismail@intel.com>,
netdev@vger.kernel.org, linux-rdma@vger.kernel.org,
Shiraz Saleem <shiraz.saleem@intel.com>
Subject: Re: [RFC 04/20] RDMA/irdma: Add driver framework definitions
Date: Thu, 26 Sep 2019 20:30:46 +0300 [thread overview]
Message-ID: <20190926173046.GB14368@unreal> (raw)
In-Reply-To: <20190926164519.10471-5-jeffrey.t.kirsher@intel.com>
On Thu, Sep 26, 2019 at 09:45:03AM -0700, Jeff Kirsher wrote:
> From: Mustafa Ismail <mustafa.ismail@intel.com>
>
> Register irdma as a platform driver capable of supporting platform
> devices from multi-generation RDMA capable Intel HW. Establish the
> interface with all supported netdev peer devices and initialize HW.
>
> Signed-off-by: Mustafa Ismail <mustafa.ismail@intel.com>
> Signed-off-by: Shiraz Saleem <shiraz.saleem@intel.com>
> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
> ---
> drivers/infiniband/hw/irdma/i40iw_if.c | 270 +++++++++++
> drivers/infiniband/hw/irdma/irdma_if.c | 436 +++++++++++++++++
> drivers/infiniband/hw/irdma/main.c | 531 ++++++++++++++++++++
> drivers/infiniband/hw/irdma/main.h | 639 +++++++++++++++++++++++++
> 4 files changed, 1876 insertions(+)
> create mode 100644 drivers/infiniband/hw/irdma/i40iw_if.c
> create mode 100644 drivers/infiniband/hw/irdma/irdma_if.c
> create mode 100644 drivers/infiniband/hw/irdma/main.c
> create mode 100644 drivers/infiniband/hw/irdma/main.h
>
> diff --git a/drivers/infiniband/hw/irdma/i40iw_if.c b/drivers/infiniband/hw/irdma/i40iw_if.c
> new file mode 100644
> index 000000000000..3cddb091acfb
> --- /dev/null
> +++ b/drivers/infiniband/hw/irdma/i40iw_if.c
> @@ -0,0 +1,270 @@
> +// SPDX-License-Identifier: GPL-2.0 or Linux-OpenIB
> +/* Copyright (c) 2019, Intel Corporation. */
> +
> +#include <linux/module.h>
> +#include <linux/moduleparam.h>
> +#include <linux/netdevice.h>
> +#include <linux/etherdevice.h>
> +#include <net/addrconf.h>
> +#include "main.h"
> +#include "i40iw_hw.h"
> +#include <linux/net/intel/i40e_client.h>
> +
> +/**
> + * i40iw_request_reset - Request a reset
> + * @rf: RDMA PCI function
> + *
> + */
> +void i40iw_request_reset(struct irdma_pci_f *rf)
> +{
> + struct i40e_info *ldev = (struct i40e_info *)rf->ldev.if_ldev;
> +
> + ldev->ops->request_reset(ldev, rf->ldev.if_client, 1);
> +}
> +
> +/**
> + * i40iw_open - client interface operation open for iwarp/uda device
> + * @ldev: LAN device information
> + * @client: iwarp client information, provided during registration
> + *
> + * Called by the LAN driver during the processing of client register
> + * Create device resources, set up queues, pble and hmc objects and
> + * register the device with the ib verbs interface
> + * Return 0 if successful, otherwise return error
> + */
> +static int i40iw_open(struct i40e_info *ldev, struct i40e_client *client)
> +{
> + struct irdma_l2params l2params = {};
> + struct irdma_device *iwdev = NULL;
> + struct irdma_handler *hdl = NULL;
> + struct irdma_priv_ldev *pldev;
> + u16 last_qset = IRDMA_NO_QSET;
> + struct irdma_sc_dev *dev;
> + struct irdma_pci_f *rf;
> + int err_code = -EIO;
> + u16 qset;
> + int i;
> +
> + hdl = irdma_find_handler(ldev->pcidev);
> + if (hdl)
> + return 0;
> +
> + hdl = kzalloc((sizeof(*hdl) + sizeof(*iwdev)), GFP_KERNEL);
> + if (!hdl)
> + return -ENOMEM;
> +
> + iwdev = (struct irdma_device *)((u8 *)hdl + sizeof(*hdl));
> +
> + iwdev->param_wq = alloc_ordered_workqueue("l2params", WQ_MEM_RECLAIM);
> + if (!iwdev->param_wq)
> + goto error;
> +
> + rf = &hdl->rf;
> + rf->hdl = hdl;
> + dev = &rf->sc_dev;
> + dev->back_dev = rf;
> + rf->rdma_ver = IRDMA_GEN_1;
> + hdl->platform_dev = ldev->platform_dev;
> + irdma_init_rf_config_params(rf);
> + rf->init_hw = i40iw_init_hw;
> + rf->hw.hw_addr = ldev->hw_addr;
> + rf->pdev = ldev->pcidev;
> + rf->netdev = ldev->netdev;
> + dev->pci_rev = rf->pdev->revision;
> + iwdev->rf = rf;
> + iwdev->hdl = hdl;
> + iwdev->ldev = &rf->ldev;
> + iwdev->init_state = INITIAL_STATE;
> + iwdev->rcv_wnd = IRDMA_CM_DEFAULT_RCV_WND_SCALED;
> + iwdev->rcv_wscale = IRDMA_CM_DEFAULT_RCV_WND_SCALE;
> + iwdev->netdev = ldev->netdev;
> + iwdev->create_ilq = true;
> + iwdev->vsi_num = 0;
> +
> + pldev = &rf->ldev;
> + hdl->ldev = pldev;
> + pldev->if_client = client;
> + pldev->if_ldev = ldev;
> + pldev->fn_num = ldev->fid;
> + pldev->ftype = ldev->ftype;
> + pldev->pf_vsi_num = 0;
> + pldev->msix_count = ldev->msix_count;
> + pldev->msix_entries = ldev->msix_entries;
> +
> + if (irdma_ctrl_init_hw(rf))
> + goto error;
> +
> + l2params.mtu =
> + (ldev->params.mtu) ? ldev->params.mtu : IRDMA_DEFAULT_MTU;
> + for (i = 0; i < I40E_CLIENT_MAX_USER_PRIORITY; i++) {
> + qset = ldev->params.qos.prio_qos[i].qs_handle;
> + l2params.up2tc[i] = ldev->params.qos.prio_qos[i].tc;
> + l2params.qs_handle_list[i] = qset;
> + if (last_qset == IRDMA_NO_QSET)
> + last_qset = qset;
> + else if ((qset != last_qset) && (qset != IRDMA_NO_QSET))
> + iwdev->dcb = true;
> + }
> +
> + if (irdma_rt_init_hw(rf, iwdev, &l2params)) {
> + irdma_deinit_ctrl_hw(rf);
> + goto error;
> + }
> +
> + irdma_add_handler(hdl);
> + return 0;
> +error:
> + kfree(hdl);
> + return err_code;
> +}
> +
> +/**
> + * i40iw_l2params_worker - worker for l2 params change
> + * @work: work pointer for l2 params
> + */
> +static void i40iw_l2params_worker(struct work_struct *work)
> +{
> + struct l2params_work *dwork =
> + container_of(work, struct l2params_work, work);
> + struct irdma_device *iwdev = dwork->iwdev;
> +
> + irdma_change_l2params(&iwdev->vsi, &dwork->l2params);
> + atomic_dec(&iwdev->params_busy);
> + kfree(work);
> +}
> +
> +/**
> + * i40iw_l2param_change - handle qs handles for QoS and MSS change
> + * @ldev: LAN device information
> + * @client: client for parameter change
> + * @params: new parameters from L2
> + */
> +static void i40iw_l2param_change(struct i40e_info *ldev,
> + struct i40e_client *client,
> + struct i40e_params *params)
> +{
> + struct irdma_l2params *l2params;
> + struct l2params_work *work;
> + struct irdma_device *iwdev;
> + struct irdma_handler *hdl;
> + int i;
> +
> + hdl = irdma_find_handler(ldev->pcidev);
> + if (!hdl)
> + return;
> +
> + iwdev = (struct irdma_device *)((u8 *)hdl + sizeof(*hdl));
> +
> + if (atomic_read(&iwdev->params_busy))
> + return;
> + work = kzalloc(sizeof(*work), GFP_KERNEL);
> + if (!work)
> + return;
> +
> + atomic_inc(&iwdev->params_busy);
Changing parameters through workqueue and perform locking with atomic_t, exciting.
Please do proper locking scheme and better to avoid workqueue at all.
<...>
> +/* client interface functions */
> +static const struct i40e_client_ops i40e_ops = {
> + .open = i40iw_open,
> + .close = i40iw_close,
> + .l2_param_change = i40iw_l2param_change
> +};
> +
> +static struct i40e_client i40iw_client = {
> + .name = "irdma",
> + .ops = &i40e_ops,
> + .version.major = I40E_CLIENT_VERSION_MAJOR,
> + .version.minor = I40E_CLIENT_VERSION_MINOR,
> + .version.build = I40E_CLIENT_VERSION_BUILD,
> + .type = I40E_CLIENT_IWARP,
> +};
> +
> +int i40iw_probe(struct platform_device *pdev)
> +{
> + struct i40e_peer_dev_platform_data *pdata =
> + dev_get_platdata(&pdev->dev);
> + struct i40e_info *ldev;
> +
> + if (!pdata)
> + return -EINVAL;
> +
> + ldev = pdata->ldev;
> +
> + if (ldev->version.major != I40E_CLIENT_VERSION_MAJOR ||
> + ldev->version.minor != I40E_CLIENT_VERSION_MINOR) {
> + pr_err("version mismatch:\n");
> + pr_err("expected major ver %d, caller specified major ver %d\n",
> + I40E_CLIENT_VERSION_MAJOR, ldev->version.major);
> + pr_err("expected minor ver %d, caller specified minor ver %d\n",
> + I40E_CLIENT_VERSION_MINOR, ldev->version.minor);
> + return -EINVAL;
> + }
This is can't be in upstream code, we don't support out-of-tree modules,
everything else will have proper versions.
Thanks
next prev parent reply other threads:[~2019-09-26 17:30 UTC|newest]
Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-09-26 16:44 [RFC 00/20] Intel RDMA/IDC Driver series Jeff Kirsher
2019-09-26 16:45 ` [RFC 01/20] ice: Initialize and register multi-function device to provide RDMA Jeff Kirsher
2019-09-26 18:05 ` Greg KH
2019-09-26 23:39 ` Nguyen, Anthony L
2019-09-27 5:13 ` gregkh
2019-09-27 18:03 ` Ertman, David M
2019-10-23 17:44 ` Jason Gunthorpe
2019-10-23 17:55 ` Ertman, David M
2019-10-23 18:01 ` Jason Gunthorpe
2019-10-24 18:56 ` gregkh
2019-10-24 19:10 ` Jason Gunthorpe
2019-10-24 22:25 ` Ertman, David M
2019-10-25 1:30 ` gregkh
2019-10-25 22:27 ` Ertman, David M
2019-10-26 18:53 ` gregkh
2019-10-31 7:42 ` Tomas Winkler
2019-09-26 16:45 ` [RFC 02/20] ice: Implement peer communications Jeff Kirsher
2019-09-26 16:45 ` [RFC 03/20] i40e: Register multi-function device to provide RDMA Jeff Kirsher
2019-09-26 16:45 ` [RFC 04/20] RDMA/irdma: Add driver framework definitions Jeff Kirsher
2019-09-26 16:55 ` Jason Gunthorpe
2019-09-26 18:02 ` gregkh
2019-09-26 18:04 ` Jason Gunthorpe
2019-09-26 18:10 ` Saleem, Shiraz
2019-09-26 17:30 ` Leon Romanovsky [this message]
2019-09-26 19:51 ` Saleem, Shiraz
2019-10-04 20:12 ` Jeff Kirsher
2019-10-04 23:45 ` Jason Gunthorpe
2019-10-05 0:46 ` Jeff Kirsher
2019-10-05 6:28 ` Leon Romanovsky
2019-10-05 7:08 ` gregkh
2019-10-05 22:01 ` Jason Gunthorpe
2019-09-26 16:45 ` [RFC 05/20] RDMA/irdma: Implement device initialization definitions Jeff Kirsher
2019-09-26 16:45 ` [RFC 06/20] RDMA/irdma: Implement HW Admin Queue OPs Jeff Kirsher
2019-09-26 16:45 ` [RFC 07/20] RDMA/irdma: Add HMC backing store setup functions Jeff Kirsher
2019-09-26 16:45 ` [RFC 08/20] RDMA/irdma: Add privileged UDA queue implementation Jeff Kirsher
2019-09-26 16:45 ` [RFC 09/20] RDMA/irdma: Add QoS definitions Jeff Kirsher
2019-09-26 16:45 ` [RFC 10/20] RDMA/irdma: Add connection manager Jeff Kirsher
2019-09-26 16:45 ` [RFC 11/20] RDMA/irdma: Add PBLE resource manager Jeff Kirsher
2019-09-26 16:45 ` [RFC 12/20] RDMA/irdma: Implement device supported verb APIs Jeff Kirsher
2019-09-26 17:37 ` Leon Romanovsky
2019-09-26 17:40 ` Jason Gunthorpe
2019-09-26 19:50 ` Saleem, Shiraz
2019-09-26 19:49 ` Saleem, Shiraz
2019-09-27 4:50 ` Leon Romanovsky
2019-09-27 14:28 ` Saleem, Shiraz
2019-09-28 6:00 ` Leon Romanovsky
2019-09-30 14:14 ` Saleem, Shiraz
2019-09-26 16:45 ` [RFC 13/20] RDMA/irdma: Add RoCEv2 UD OP support Jeff Kirsher
2019-09-26 16:45 ` [RFC 14/20] RDMA/irdma: Add user/kernel shared libraries Jeff Kirsher
2019-09-26 16:45 ` [RFC 15/20] RDMA/irdma: Add miscellaneous utility definitions Jeff Kirsher
2019-09-26 17:49 ` Leon Romanovsky
2019-09-26 19:49 ` Saleem, Shiraz
2019-09-27 4:46 ` Leon Romanovsky
2019-09-27 14:28 ` Saleem, Shiraz
2019-09-27 18:23 ` gregkh
2019-09-28 5:53 ` Leon Romanovsky
2019-09-26 16:45 ` [RFC 16/20] RDMA/irdma: Add dynamic tracing for CM Jeff Kirsher
2019-09-26 16:45 ` [RFC 17/20] RDMA/irdma: Add ABI definitions Jeff Kirsher
2019-09-26 16:45 ` [RFC 18/20] RDMA/irdma: Update MAINTAINERS file Jeff Kirsher
2019-09-26 16:45 ` [RFC 19/20] RDMA/irdma: Add Kconfig and Makefile Jeff Kirsher
2019-09-26 16:45 ` [RFC 20/20] RDMA/i40iw: Mark i40iw as deprecated Jeff Kirsher
2019-09-26 17:40 ` Leon Romanovsky
2019-09-26 19:49 ` Saleem, Shiraz
2019-09-26 19:55 ` gregkh
2019-09-27 14:28 ` Saleem, Shiraz
2019-09-27 20:18 ` Doug Ledford
2019-09-27 20:17 ` Doug Ledford
2019-09-28 5:55 ` Leon Romanovsky
2019-10-02 21:15 ` Dennis Dalessandro
2019-10-03 8:23 ` Leon Romanovsky
2019-09-29 9:28 ` [RFC 00/20] Intel RDMA/IDC Driver series Or Gerlitz
2019-09-30 15:46 ` Jeff Kirsher
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=20190926173046.GB14368@unreal \
--to=leon@kernel.org \
--cc=dledford@redhat.com \
--cc=gregkh@linuxfoundation.org \
--cc=jeffrey.t.kirsher@intel.com \
--cc=jgg@mellanox.com \
--cc=linux-rdma@vger.kernel.org \
--cc=mustafa.ismail@intel.com \
--cc=netdev@vger.kernel.org \
--cc=shiraz.saleem@intel.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).