Received: by 2002:ab2:69cc:0:b0:1f4:be93:e15a with SMTP id n12csp1848943lqp; Mon, 15 Apr 2024 22:08:31 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCXJLQjAjblr+rYURIxxfWAAE7b5wHhfu3N/9wUZ8idEsvnkL11XqRTC8rYiJEhYlnyhqaU50j/GumwMTd1vXQrOHaRYT0luvIFSkvpELQ== X-Google-Smtp-Source: AGHT+IEKqZFq41lCq0eExKEQcd9YbRpSLrqAVyGaX2a48Tx6cR0qwoe2EzPejbSJ+v5GGai1XjUo X-Received: by 2002:a05:6808:6190:b0:3c7:a9b:74bc with SMTP id dn16-20020a056808619000b003c70a9b74bcmr7374614oib.31.1713244110429; Mon, 15 Apr 2024 22:08:30 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1713244110; cv=pass; d=google.com; s=arc-20160816; b=ryzvOpuZNIB9TDHOkKFkHdwGFEv6TRtMqTIi4Cu323STFrp3NMyZ/RYG7f4OCDka2u vJMkEV/kENLy2806FNyTD0cf9SwClt865dUTj4Z3Hy2wt0qMb5UHPMKF1aBQdJHBkGZI neS+yi6PrlbHs35xYAz1Xlt+Hht2+X5+IaFvgvxgOgTThT3lyicPvFBI3YDlrmDhx1kf E4kEznDzwYzYTXHgCH2nVnAcnMU6phGtKMPFpC/K069S16v+pAQg7/HzMKPIUBg2CQQA g/zHL/0qtSKPfkuD7StCwsuBcBVGggAgAxaR8JYwXqWYGxal0m4ep2evoB+ZqFIBD2FZ AtDw== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=mime-version:list-unsubscribe:list-subscribe:list-id:precedence :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=YSOQsDh6RYmpWrZDVp4bAvjs74PTvPkbyrmY8OWs7es=; fh=wPv/fmS7iNNmCH0mdUKjkT6XsNx1nMbXFeqwvq2D6q0=; b=tkqugfoMEhYtz7plZjxBhK1D/OPR7CVTSQBAbdDqOdtkAAXjn8eOvvHOZvZXUZ2z7/ xZpK+Ta0HaH9ZbxnmoAldsuz2eYHs/7gy0yNJnhTACYkC0aKjNZi8ZI10WhgyTDSVz0p Gga/VefXAWeZe+Fb+mZ6daSh+Zeh48/NsHCDU3jTSxYcCZjTOBGbqgWmaoO96scgOWVy fG73MtgQ2xYPuJprS45YZf2jixrhO/Mhv9IS2YG2nCFKouci7kImJR7Q6q8RD7Aue58S SCNrC5pdaenqXKgsz2oztK61G5xeRkb1KB+PB4eKBPsbxK2ggc8sJZ1o4ULosEjxWB+y bwdw==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@marvell.com header.s=pfpt0220 header.b=eHyZ4T6a; arc=pass (i=1 spf=pass spfdomain=marvell.com dkim=pass dkdomain=marvell.com dmarc=pass fromdomain=marvell.com); spf=pass (google.com: domain of linux-kernel+bounces-146253-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-146253-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=REJECT dis=NONE) header.from=marvell.com Return-Path: Received: from sy.mirrors.kernel.org (sy.mirrors.kernel.org. [2604:1380:40f1:3f00::1]) by mx.google.com with ESMTPS id lb9-20020a056a004f0900b006e74608ea4esi9153088pfb.344.2024.04.15.22.08.29 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 15 Apr 2024 22:08:30 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-146253-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) client-ip=2604:1380:40f1:3f00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@marvell.com header.s=pfpt0220 header.b=eHyZ4T6a; arc=pass (i=1 spf=pass spfdomain=marvell.com dkim=pass dkdomain=marvell.com dmarc=pass fromdomain=marvell.com); spf=pass (google.com: domain of linux-kernel+bounces-146253-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-146253-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=REJECT dis=NONE) header.from=marvell.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sy.mirrors.kernel.org (Postfix) with ESMTPS id F0973B230D4 for ; Tue, 16 Apr 2024 05:07:20 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 6ED5A3D0AF; Tue, 16 Apr 2024 05:06:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=marvell.com header.i=@marvell.com header.b="eHyZ4T6a" Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 94B783B796; Tue, 16 Apr 2024 05:06:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=67.231.156.173 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713244002; cv=none; b=MCP3KZ+N5Xe6Mq6jQnTz3x4EMxSB1WN1ceyh32L1e6Oq34iOZ8TQD5n7QgNfbKgJh8rvvmelrpCfAS1SK2XsK9P14AAD55/LSf47XV/J6J3doUlKw6XO2K90AxlJE/+O4MQ7lg/72xTYr1bVYVg2L6jrmbyUznnhtnPDGD93QO0= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713244002; c=relaxed/simple; bh=5+Dh31z/7Tiz1g9qPuRNlrrWXBn3kkAlnoQMtvS7zto=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=bo+HzU19dF2aU5ZljUCDlRy/0CkkRVWeKKw0tD/e/8oyxKj5tuwYiwRpAKwBQou9PigseZArY0POi8SGHJRdsoiA+/Pz+icTj5OYFnTko00G3pxGVVTl2zeuiCHy97JVku5fTjN1BBW3t47oS4rlq/Fsm+m8WLRlJucXsi03+Uc= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=marvell.com; spf=pass smtp.mailfrom=marvell.com; dkim=pass (2048-bit key) header.d=marvell.com header.i=@marvell.com header.b=eHyZ4T6a; arc=none smtp.client-ip=67.231.156.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=marvell.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=marvell.com Received: from pps.filterd (m0045851.ppops.net [127.0.0.1]) by mx0b-0016f401.pphosted.com (8.17.1.24/8.17.1.24) with ESMTP id 43G19ETb029786; Mon, 15 Apr 2024 22:06:33 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h= from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-type; s=pfpt0220; bh=YSOQsDh6RYmpWrZDVp4bA vjs74PTvPkbyrmY8OWs7es=; b=eHyZ4T6a4P+euXJXNzHuF6Rx/X7WhL2ArjZ7g teKyshc6OOCjQ5r2c2Aik4MXH0EdGVwUBfGwI4Ir4Ov0UURWhGpnPP1mKPsEY+90 /zwAeTKvE3J7C3NjOPhqFgPK9vB2XmGD442yf0lr4RRhKn3rE7ahvck2bVThQcT0 +UjyL+wu5EOCmW+2WrMpdxqKbCXEPwQtVtJ/XYHkoolIHlTRdZL7OU8M+I43512D W/CM+U6tQWzM43QE+n4MJO2QjS5CzqpvKRmd7cYey9ryX+couriXmlt6bZC4KbNG FpEliWtNaEBzGsJY+0syr/ieryQx2l6EHHGaPqd/ESYNfmGig== Received: from dc5-exch05.marvell.com ([199.233.59.128]) by mx0b-0016f401.pphosted.com (PPS) with ESMTPS id 3xhfdn0j7p-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 15 Apr 2024 22:06:33 -0700 (PDT) Received: from DC5-EXCH05.marvell.com (10.69.176.209) by DC5-EXCH05.marvell.com (10.69.176.209) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.4; Mon, 15 Apr 2024 22:06:31 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH05.marvell.com (10.69.176.209) with Microsoft SMTP Server id 15.2.1544.4 via Frontend Transport; Mon, 15 Apr 2024 22:06:31 -0700 Received: from hyd1soter3.marvell.com (unknown [10.29.37.12]) by maili.marvell.com (Postfix) with ESMTP id A3F6A3F7083; Mon, 15 Apr 2024 22:06:28 -0700 (PDT) From: Geetha sowjanya To: , CC: , , , , , , , Subject: [net-next PATCH 3/9] octeontx2-pf: Create representor netdev Date: Tue, 16 Apr 2024 10:36:10 +0530 Message-ID: <20240416050616.6056-4-gakula@marvell.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20240416050616.6056-1-gakula@marvell.com> References: <20240416050616.6056-1-gakula@marvell.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain X-Proofpoint-GUID: krK_d3LO-Y8oQeMoWdrzQiElwtFWSTIu X-Proofpoint-ORIG-GUID: krK_d3LO-Y8oQeMoWdrzQiElwtFWSTIu X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.272,Aquarius:18.0.1011,Hydra:6.0.619,FMLib:17.11.176.26 definitions=2024-04-16_02,2024-04-15_01,2023-05-22_02 Adds initial devlink support to set/get the switchdev mode. Representor netdevs are created for each rvu devices when the switch mode is set to 'switchdev'. These netdevs are be used to control and configure VFs. Signed-off-by: Geetha sowjanya --- .../marvell/octeontx2/nic/otx2_devlink.c | 48 ++++++ .../net/ethernet/marvell/octeontx2/nic/rep.c | 159 ++++++++++++++++++ .../net/ethernet/marvell/octeontx2/nic/rep.h | 2 + 3 files changed, 209 insertions(+) diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_devlink.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_devlink.c index 4e1130496573..f4f5f5d93c7e 100644 --- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_devlink.c +++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_devlink.c @@ -76,7 +76,53 @@ static const struct devlink_param otx2_dl_params[] = { otx2_dl_mcam_count_validate), }; +#ifdef CONFIG_RVU_ESWITCH +static int otx2_devlink_eswitch_mode_get(struct devlink *devlink, u16 *mode) +{ + struct otx2_devlink *otx2_dl = devlink_priv(devlink); + struct otx2_nic *pfvf = otx2_dl->pfvf; + + if (!is_rep_dev(pfvf->pdev)) + return -EOPNOTSUPP; + + *mode = pfvf->esw_mode; + + return 0; +} + +static int otx2_devlink_eswitch_mode_set(struct devlink *devlink, u16 mode, + struct netlink_ext_ack *extack) +{ + struct otx2_devlink *otx2_dl = devlink_priv(devlink); + struct otx2_nic *pfvf = otx2_dl->pfvf; + + if (!is_rep_dev(pfvf->pdev)) + return -EOPNOTSUPP; + + if (pfvf->esw_mode == mode) + return 0; + + pfvf->esw_mode = mode; + switch (mode) { + case DEVLINK_ESWITCH_MODE_LEGACY: + rvu_rep_destroy(pfvf); + break; + case DEVLINK_ESWITCH_MODE_SWITCHDEV: + rvu_rep_create(pfvf); + break; + default: + return -EINVAL; + } + + return 0; +} +#endif + static const struct devlink_ops otx2_devlink_ops = { +#ifdef CONFIG_RVU_ESWITCH + .eswitch_mode_get = otx2_devlink_eswitch_mode_get, + .eswitch_mode_set = otx2_devlink_eswitch_mode_set, +#endif }; int otx2_register_dl(struct otx2_nic *pfvf) @@ -112,6 +158,7 @@ int otx2_register_dl(struct otx2_nic *pfvf) devlink_free(dl); return err; } +EXPORT_SYMBOL(otx2_register_dl); void otx2_unregister_dl(struct otx2_nic *pfvf) { @@ -123,3 +170,4 @@ void otx2_unregister_dl(struct otx2_nic *pfvf) ARRAY_SIZE(otx2_dl_params)); devlink_free(dl); } +EXPORT_SYMBOL(otx2_unregister_dl); diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/rep.c b/drivers/net/ethernet/marvell/octeontx2/nic/rep.c index b892a7fe3ddc..fd55ef40c934 100644 --- a/drivers/net/ethernet/marvell/octeontx2/nic/rep.c +++ b/drivers/net/ethernet/marvell/octeontx2/nic/rep.c @@ -28,6 +28,159 @@ MODULE_DESCRIPTION(DRV_STRING); MODULE_LICENSE("GPL"); MODULE_DEVICE_TABLE(pci, rvu_rep_id_table); +static int rvu_rep_napi_init(struct otx2_nic *priv) +{ + struct otx2_cq_poll *cq_poll = NULL; + struct otx2_qset *qset = &priv->qset; + struct otx2_hw *hw = &priv->hw; + int err = 0, qidx, vec; + char *irq_name; + + qset->napi = kcalloc(hw->cint_cnt, sizeof(*cq_poll), GFP_KERNEL); + if (!qset->napi) + return -ENOMEM; + + /* Register NAPI handler */ + for (qidx = 0; qidx < hw->cint_cnt; qidx++) { + cq_poll = &qset->napi[qidx]; + cq_poll->cint_idx = qidx; + cq_poll->cq_ids[CQ_RX] = + (qidx < hw->rx_queues) ? qidx : CINT_INVALID_CQ; + cq_poll->cq_ids[CQ_TX] = (qidx < hw->tx_queues) ? + qidx + hw->rx_queues : CINT_INVALID_CQ; + cq_poll->cq_ids[CQ_XDP] = CINT_INVALID_CQ; + cq_poll->cq_ids[CQ_QOS] = CINT_INVALID_CQ; + + cq_poll->dev = (void *)priv; + netif_napi_add(priv->reps[qidx]->netdev, &cq_poll->napi, + otx2_napi_handler); + napi_enable(&cq_poll->napi); + } + /* Register CQ IRQ handlers */ + vec = hw->nix_msixoff + NIX_LF_CINT_VEC_START; + for (qidx = 0; qidx < hw->cint_cnt; qidx++) { + irq_name = &hw->irq_name[vec * NAME_SIZE]; + + snprintf(irq_name, NAME_SIZE, "rep%d-rxtx-%d", qidx, qidx); + + err = request_irq(pci_irq_vector(priv->pdev, vec), + otx2_cq_intr_handler, 0, irq_name, + &qset->napi[qidx]); + if (err) { + dev_err(priv->dev, + "RVU REP IRQ registration failed for CQ%d\n", qidx); + goto err_free_cints; + } + vec++; + + /* Enable CQ IRQ */ + otx2_write64(priv, NIX_LF_CINTX_INT(qidx), BIT_ULL(0)); + otx2_write64(priv, NIX_LF_CINTX_ENA_W1S(qidx), BIT_ULL(0)); + } + priv->flags &= ~OTX2_FLAG_INTF_DOWN; + return 0; + +err_free_cints: + otx2_free_cints(priv, qidx); + otx2_disable_napi(priv); + return err; +} + +static void rvu_rep_free_cq_rsrc(struct otx2_nic *priv) +{ + struct otx2_cq_poll *cq_poll = NULL; + struct otx2_qset *qset = &priv->qset; + int qidx, vec; + + /* Cleanup CQ NAPI and IRQ */ + vec = priv->hw.nix_msixoff + NIX_LF_CINT_VEC_START; + for (qidx = 0; qidx < priv->hw.cint_cnt; qidx++) { + /* Disable interrupt */ + otx2_write64(priv, NIX_LF_CINTX_ENA_W1C(qidx), BIT_ULL(0)); + + synchronize_irq(pci_irq_vector(priv->pdev, vec)); + + cq_poll = &qset->napi[qidx]; + napi_synchronize(&cq_poll->napi); + vec++; + } + otx2_free_cints(priv, priv->hw.cint_cnt); + otx2_disable_napi(priv); +} + +static void rvu_rep_free_netdev(struct otx2_nic *priv) +{ + struct rep_dev *rep; + int rep_id; + + for (rep_id = 0; rep_id < priv->rep_cnt; rep_id++) { + rep = priv->reps[rep_id]; + if (rep && rep->netdev->netdev_ops) { + unregister_netdev(rep->netdev); + free_netdev(rep->netdev); + } + } + devm_kfree(priv->dev, priv->reps); +} + +void rvu_rep_destroy(struct otx2_nic *priv) +{ + rvu_rep_free_cq_rsrc(priv); + rvu_rep_free_netdev(priv); +} + +int rvu_rep_create(struct otx2_nic *priv) +{ + int rep_cnt = priv->rep_cnt; + struct net_device *ndev; + struct rep_dev *rep; + int rep_id, err; + u16 pcifunc; + + priv->reps = devm_kcalloc(priv->dev, rep_cnt, sizeof(struct rep_dev), GFP_KERNEL); + if (!priv->reps) + return -ENOMEM; + + for (rep_id = 0; rep_id < rep_cnt; rep_id++) { + ndev = alloc_etherdev(sizeof(*rep)); + if (!ndev) { + dev_err(priv->dev, "PFVF representor:%d creation failed\n", rep_id); + err = -ENOMEM; + goto exit; + } + + rep = netdev_priv(ndev); + priv->reps[rep_id] = rep; + rep->mdev = priv; + rep->netdev = ndev; + rep->rep_id = rep_id; + + ndev->min_mtu = OTX2_MIN_MTU; + ndev->max_mtu = priv->hw.max_mtu; + pcifunc = priv->rep_pf_map[rep_id]; + rep->pcifunc = pcifunc; + + snprintf(ndev->name, sizeof(ndev->name), "r%dp%dv%d", rep_id, + rvu_get_pf(pcifunc), (pcifunc & RVU_PFVF_FUNC_MASK)); + + eth_hw_addr_random(ndev); + if (register_netdev(ndev)) { + dev_err(priv->dev, "PFVF reprentator registration failed\n"); + free_netdev(ndev); + ndev->netdev_ops = NULL; + goto exit; + } + } + err = rvu_rep_napi_init(priv); + if (err) + goto exit; + + return 0; +exit: + rvu_rep_free_netdev(priv); + return err; +} + static int rvu_rep_rsrc_free(struct otx2_nic *priv) { struct otx2_qset *qset = &priv->qset; @@ -162,6 +315,10 @@ static int rvu_rep_probe(struct pci_dev *pdev, const struct pci_device_id *id) if (err) goto err_detach_rsrc; + err = otx2_register_dl(priv); + if (err) + goto err_detach_rsrc; + return 0; err_detach_rsrc: @@ -183,6 +340,8 @@ static void rvu_rep_remove(struct pci_dev *pdev) { struct otx2_nic *priv = pci_get_drvdata(pdev); + otx2_unregister_dl(priv); + rvu_rep_destroy(priv); rvu_rep_rsrc_free(priv); otx2_detach_resources(&priv->mbox); if (priv->hw.lmt_info) diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/rep.h b/drivers/net/ethernet/marvell/octeontx2/nic/rep.h index 30cce17eb48b..be6c939e5cba 100644 --- a/drivers/net/ethernet/marvell/octeontx2/nic/rep.h +++ b/drivers/net/ethernet/marvell/octeontx2/nic/rep.h @@ -29,4 +29,6 @@ static inline bool is_rep_dev(struct pci_dev *pdev) return pdev->device == PCI_DEVID_RVU_REP; } +int rvu_rep_create(struct otx2_nic *priv); +void rvu_rep_destroy(struct otx2_nic *priv); #endif /* REP_H */ -- 2.25.1