From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR01-HE1-obe.outbound.protection.outlook.com (mail-he1eur01on0064.outbound.protection.outlook.com [104.47.0.64]) by dpdk.org (Postfix) with ESMTP id E3E8C2BE5 for ; Thu, 3 May 2018 17:52:33 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=lLYE0ifu0S4CEcNDUbMk6qUHCm+mY8CRV/+NwkMaPZA=; b=DMgRV1wF/X1VCcFVQoXy5y56s4ZaMnfrrEsjuXmi9S2G5zECFUYWdU1czFETMAf4xd6tLFOz+U5205+vj+xl8zk8R3G36azTcr8Ul899l/B+3PD427gQ0lx1rpMAv+C4wZddYAMWaem+W1lsCriVcnqEUwpDY990uuf7Hc0QAdw= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=nipun.gupta@nxp.com; Received: from b27504-OptiPlex-790.ap.freescale.net (14.142.187.166) by VI1PR0401MB2429.eurprd04.prod.outlook.com (2603:10a6:800:2a::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.715.24; Thu, 3 May 2018 15:52:30 +0000 From: Nipun Gupta To: thomas@monjalon.net, hemant.agrawal@nxp.com, shreyansh.jain@nxp.com Cc: dev@dpdk.org, Nipun Gupta , Cristian Sovaiala Date: Thu, 3 May 2018 21:21:56 +0530 Message-Id: <1525362722-32726-3-git-send-email-nipun.gupta@nxp.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1525362722-32726-1-git-send-email-nipun.gupta@nxp.com> References: <1525280972-27736-1-git-send-email-nipun.gupta@nxp.com> <1525362722-32726-1-git-send-email-nipun.gupta@nxp.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [14.142.187.166] X-ClientProxiedBy: MA1PR0101CA0046.INDPRD01.PROD.OUTLOOK.COM (2603:1096:a00:22::32) To VI1PR0401MB2429.eurprd04.prod.outlook.com (2603:10a6:800:2a::22) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(48565401081)(5600026)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(2017052603328)(7153060)(7193020); SRVR:VI1PR0401MB2429; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0401MB2429; 3:lor5JPgfzkgniyuDRhK0AWRFLxx6opdzSW5G6HMisoW0CI8htnOBpRhGhdDL+o5p8Fl16Rb8IPV9Q4PYU/zkLY6ELVb8ueXwE2Jigteg6q7QJ/oWvznBDHII2PI10isbK+1H2WDn83EtmxOK/uMW9XxV9YWONyfOpUWeJW5X6fODxHustF1VoGpoWs43caCL4cb+zRxkVpOBu8Cn8z50Nic/mMbXoGFJaTEdV6paCatYFsfJdefvz7+cwyNqtm+4; 25:7AIj/j5p8z/4jS6m/JCSfAOvDBmLPLn9LSPRs3SAS/FLYDrH5wK2vJ3r7SmbLIErGfnfRbeJqLQi0e9QSkIWURc7WUBSC4v5Qv0w1+epGrtDSEzMFBmI30Y35MqE8gknjvepHuwf1dunBzeeAu18D2scQzEv1UUjuqdGyra3b7vMDXaMXAl7cVfH++6OAedA1gItZTefcHH10gHBG5b5Q5pODwlddSbmPmtzpM2XlC1pTXCjt6lfOBaTtWfLV4gqAMBblxlGUixMxGqaZko1NEUNzoJDchXIkndoB600ycXSBk8Y5MjgnzRx+k2jIGFRkFdz/Kts3E6sj5ZDsYZGVQ==; 31:qDIwx1sjJuLjnH5Eyiowsx7HEbe69kk7FQ/Ql9Lbm2ZgDXET6lv0kkNesXUNHzX5RC5rvCIwl2lTTpeoRzKVWKgZBvaWfZgjA0HnAruI7+d4qXFrVJ1tOJQVPeONbHW8O7xS8aYhhXc0XOr9qBy7jF4jwWzc76F6TevC9oIQQY6uicCN0CACLbhUGAFo3Z2y3ugNBHRisnLiLVM++IVN0q6Tq4RqydEbaCEHcEfKsu0= X-MS-TrafficTypeDiagnostic: VI1PR0401MB2429: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0401MB2429; 20:Y5hsSxej/peFeBy6NHj/kVEWmlRy5quAl0YAhxcYs2PfKhejMZwNH9ULW9E8AOK983dVqr+ky8+SCNUazFITTJzKqO6TuvmP5PDn2XvBqorXvazag2xNaQPMd7fktBwqYICO4z5+KbqDNwphR7HrU3gAS7ITK6Gx47TY+UlS1QO97naTq7lggk45dTDd7rK6LKv7wCmf9ec/aGxuBUrC2rx3Ld3twEKQ6PlZVwNkwYDR/bRtpwDLTsxaAS4U+l4kIsHkx+GWhSZ+XiDFM0H/DHK00PI4c9xO6NSFX3+wXvrT77McBejdaTx5cFSsgJgm2is9EQJ5M6+PLilzFGggdWZZz7rJhvx3W6HKCYtxfJFaT0IaGUjRz2G79BUTyFyNN/IgZFChyEJF8ITs2VIIPW1jGASZvgnEJ/dI0Kkga7KAaU/MPeZGon0ihhy022whR4X/akDkVU/aH9uqUOX7DynrdBar+Rt3At2egah4D4UTyMBR0Lh+fDQzxrE5t/Me; 4:50C+8XRHRMpR7GHxJAMiLvBZpsCbguw3NuROfygB9Kfwt+FK3Pk+RfCeMF+7IIBYMY2gQ46D7yvyHgW8VGBXd0JcU6lB/bfxrhXnHTAK1eYUSuok488qqIGWyOcXEfyNau1CfTWs4hO6S7jHHwNKmQruzrLUEJJYCSoKSD+VtyWvgrlGPQa/iz3eHgbMfaaTOgbbnkoVvi3nxslWbQIzlxtUqN59TwX4dU7WFnBKmAssEXVdvpyZjzqLzWYz6Ppy6MgQPk5uzpoLlSnaFuxpYmM+6bD8zcNXLvfI71gIvQTMAGMFRuyimuppjLvvieDBgGv5bWIY4buHxBf/pTm1s/q5CJZ1YjDbtWzfrrqFFZA= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197)(275809806118684); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(10201501046)(93006095)(93001095)(3231254)(944501410)(52105095)(3002001)(6055026)(6041310)(20161123558120)(20161123562045)(20161123564045)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(6072148)(201708071742011); SRVR:VI1PR0401MB2429; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0401MB2429; X-Forefront-PRVS: 066153096A X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(376002)(366004)(396003)(39380400002)(346002)(39860400002)(199004)(189003)(6666003)(50466002)(6636002)(4326008)(68736007)(6512007)(5009440100003)(25786009)(97736004)(6486002)(36756003)(106356001)(105586002)(2906002)(81166006)(6506007)(316002)(386003)(52116002)(59450400001)(66066001)(47776003)(86362001)(478600001)(54906003)(446003)(305945005)(7736002)(48376002)(16586007)(76176011)(51416003)(55236004)(6116002)(486006)(186003)(476003)(16526019)(2616005)(11346002)(956004)(81156014)(3846002)(26005)(5660300001)(44832011)(50226002)(53936002)(8676002)(8936002)(575784001)(110426005); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR0401MB2429; H:b27504-OptiPlex-790.ap.freescale.net; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; Received-SPF: None (protection.outlook.com: nxp.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0401MB2429; 23:bAOj1yTVv58AZJK3660daUKaXJ24Q/d/qje943v?= =?us-ascii?Q?jZTw/UvP/XkzFbTCYAjnCT/ryyrG28DT8jn+yq00wpI1pPq4AfGQ6dsBUh4Q?= =?us-ascii?Q?y/hpbOUCUIqjGOjQ534DJJS8Rg5xvoCA68Nk51iUysdBFPBcxXGZN7RA8Noz?= =?us-ascii?Q?i6nPgjgKTuL/VgOYPudyVZNXOoOdqx4LuKwIzTZ3DJqfIn07BQ2AOVGy/WLH?= =?us-ascii?Q?V0SvnybIC8lO7YWtQvHGccL3qANhDoq3ol5g+IvAzaYGdDoxVkNlTqO40Zep?= =?us-ascii?Q?saicX/J+mnx9AcFRN+K0upge3kqO7b/57Pefb7yVbJDTifSe/5OMH9JyX5X8?= =?us-ascii?Q?Dwmy4LCrXTpgahGH5CtpnaDaUcf+klpIFbgVyM6beQzB3kZuLlWp4n32TWNY?= =?us-ascii?Q?R1CnINyGlL54vpMf5mJmwWDDl7A986LprAAOwy3uU5poaIbJNRUi5LTn8/8V?= =?us-ascii?Q?3un2ogp+vXQNymFAI6r7WKzQxmcEXc6jKMSQlslHy+GaFLUHHHKRAqhxyFmh?= =?us-ascii?Q?O7hBPRR4ctMzLe2x9SAKklyvmK82YHBfknOqNsbjbgP+ahIF++hRUygRj3fQ?= =?us-ascii?Q?gnY/g9MDFfSB29bUGjy8xWnj/pN6QgShWK+1Xtg2u808MolF/SsuBvSQUlV3?= =?us-ascii?Q?HzRAd0vecJFiSblG5oeYg5Ui+gLrFWGMLmeZ+aaJ4SjD38lRxV2rOLuV8zQQ?= =?us-ascii?Q?Bc7q1W4pjaGCpLD0EpdBweifE7NYQWStZN4yj3OBHO0pCdvMO0g3gpRNqCkp?= =?us-ascii?Q?7YSRk/Bpx0LGe0YSN8ZIQkc2njYaVtgVu1s8UEqXRJY/Xdxr1cekrIy78Ct/?= =?us-ascii?Q?IGGlkV+RvS3JD47yIBCR+s2wxLp8QIE1YRK3/Knd9S31nS2R6oxnGRkKP8yY?= =?us-ascii?Q?BGnLU0vstZP0L4cKS2UGCwCUN2uQMaQGekg4+Z1pKvZcjhc5aNrHb/yc6jft?= =?us-ascii?Q?3CIpHepSOqCAyo4+Qc88lcAMb5DpKKJpbZ64V6pEqVdhW1jR4IEw8krAM0MQ?= =?us-ascii?Q?JeK8rzsxtMMILjWUs6AEHwrWD8TXFkthdlLbxQJIE6y5enYFj0LGoOfuw5Fb?= =?us-ascii?Q?2AyIn+T8ZtaxH0885INCdBvg/FTV+U9jnQEMPI4re5EOx//2AXVFv1/p+I1b?= =?us-ascii?Q?Z7FZZFsA6fGOOWYSd3eAOOUffaxVwvi9lTBMjvebJ/h/h15SFJ7oIU0ly0pQ?= =?us-ascii?Q?LjqxuLA98o0BqgHAzdsi3O0PIwjZXNjmxo3Oq7vwhb08M7oURGWZcGTbDx/P?= =?us-ascii?Q?muj8+eMAPqF+JBZbf8hF1+Op/UtSEeElvvwxvuHglK9G3yFf03d2Bh31A8/H?= =?us-ascii?Q?04+nqxHZLaEC/5drVs48gbMGVxmM/M0hXhE9k194IjnRFwsd27TktJZGjkRi?= =?us-ascii?Q?/gu4qww=3D=3D?= X-Microsoft-Antispam-Message-Info: u20y6nO17/Gv0qw9b7ZuibyfFVSNtxKyPPoJeHVPZto1XM9ZSzRjjP0+e8qYcFK0o95HTPtNylmfIT3M38czbVAh1FYB082TuvW2DAODEeA2Raq4/R7Jfn3yuXnS1J3T1D7zsX0rvHnonJM2ZBdOk5R5pIQy26dB6R6QqmAezB2huhZ/0iAoQzeucknLBlqT X-Microsoft-Exchange-Diagnostics: 1; VI1PR0401MB2429; 6:9ebRW6IVkM7aTWD6i+E8ukt1rmSiYz7lhg3AqOS6S6dwAifsUapLi2L6RJlRsIO7K9OVNSEBqFrf1QlJVDyGR5bNVIHERC4yDn2fR8wsxUc7u7ROGQhecGSbPCUAYuzeIQdl0ISBftu/qJAImVSIWpqLEzrxKD+2W+6YMpr20QtKiMvKLr082bAlhBEPyU2qh0t8GqKsyrBqwuAy58wa7lsVDTR7vaeEEXNKWJymnBmPONLpJWPIGs3uTQzcd8FJ2NH0iOaVlTlFaqB/QLjur5VMAZtIuni3ayWyvCRTC0mCzfD/0c/o0cJK0Xp/zKtftPeO7CflUyNBIzsSFxydXEku8xBELHt/gIU1IdIyUv5L5n/8AdeKAwkycgNCtGoCV2pA3b+Xx2UxMf4tTjAxTg1kYKQEvCVYi3PI9nbkx8N61nqqJjr72qHKb64IVEtxyapEn19prmI3mNA7SbebFw==; 5:5ercaT0N4CUlMHFFUzrl7VbORjst1OGPClH2zA7HBtAE/znSgcmjue+DeX4EJSQktN65Ym50UpHA8lDUm+yhEEiUFyIUQu2HCAtvMkeHJYVXtYvGAehnAEQeHVLLoGB6Em2CvsYQt5cu4wrmh+uOSEs8MDF6BI9JvFYRQfmx1Oo=; 24:2/UyCZhhYVbTUpR4ZBzcbhopRRdnZZgaKDOdVjd2i3+jYbApETui7u4CtCMm8zKk2fMhruedQnTIXXSfCxyZvXjfcvZfmPyuCXpP6bph58E= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0401MB2429; 7:1y2HlUq3HG+cmGm8auWCf5/IIEreOCjPAl/s0MEDSWRID4CWPmCsNr6+X/Jizbl3r9Ln7GARgyw3J8/c/1+QCrlOVx2pElTv1DrdCkTVNBHdVr0Oua1iv4ZBMBsJNS1nNW86clayqAQdbWZY9xy501T4wA78KM6XTOgyd4TicAb5tfTqwZhM0a/bzItfPzZLAv2giFJ/eCykSB+JFyrfuQcHj97aOukasGCmcEwrB271LOnFZlRAiWlpFjegxPti X-MS-Office365-Filtering-Correlation-Id: da029144-320f-4210-863c-08d5b10de1d3 X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 May 2018 15:52:30.8440 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: da029144-320f-4210-863c-08d5b10de1d3 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0401MB2429 Subject: [dpdk-dev] [PATCH v7 2/8] bus/fslmc: support MC DPDMAI object X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 03 May 2018 15:52:34 -0000 This patch adds the DPDMAI (Data Path DMA Interface) object support in MC driver. Signed-off-by: Cristian Sovaiala Signed-off-by: Nipun Gupta Acked-by: Shreyansh Jain --- drivers/bus/fslmc/Makefile | 9 +- drivers/bus/fslmc/mc/dpdmai.c | 429 ++++++++++++++++++++++++++++ drivers/bus/fslmc/mc/fsl_dpdmai.h | 189 ++++++++++++ drivers/bus/fslmc/mc/fsl_dpdmai_cmd.h | 107 +++++++ drivers/bus/fslmc/meson.build | 1 + drivers/bus/fslmc/rte_bus_fslmc_version.map | 9 + 6 files changed, 740 insertions(+), 4 deletions(-) create mode 100644 drivers/bus/fslmc/mc/dpdmai.c create mode 100644 drivers/bus/fslmc/mc/fsl_dpdmai.h create mode 100644 drivers/bus/fslmc/mc/fsl_dpdmai_cmd.h diff --git a/drivers/bus/fslmc/Makefile b/drivers/bus/fslmc/Makefile index 3aa34e2..515d0f5 100644 --- a/drivers/bus/fslmc/Makefile +++ b/drivers/bus/fslmc/Makefile @@ -32,11 +32,12 @@ SRCS-$(CONFIG_RTE_LIBRTE_FSLMC_BUS) += \ SRCS-$(CONFIG_RTE_LIBRTE_FSLMC_BUS) += \ mc/dpmng.c \ - mc/dpbp.c \ - mc/dpio.c \ - mc/mc_sys.c \ + mc/dpbp.c \ + mc/dpio.c \ + mc/mc_sys.c \ mc/dpcon.c \ - mc/dpci.c + mc/dpci.c \ + mc/dpdmai.c SRCS-$(CONFIG_RTE_LIBRTE_FSLMC_BUS) += portal/dpaa2_hw_dpio.c SRCS-$(CONFIG_RTE_LIBRTE_FSLMC_BUS) += portal/dpaa2_hw_dpbp.c diff --git a/drivers/bus/fslmc/mc/dpdmai.c b/drivers/bus/fslmc/mc/dpdmai.c new file mode 100644 index 0000000..528889d --- /dev/null +++ b/drivers/bus/fslmc/mc/dpdmai.c @@ -0,0 +1,429 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2018 NXP + */ + +#include +#include +#include +#include + +/** + * dpdmai_open() - Open a control session for the specified object + * @mc_io: Pointer to MC portal's I/O object + * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' + * @dpdmai_id: DPDMAI unique ID + * @token: Returned token; use in subsequent API calls + * + * This function can be used to open a control session for an + * already created object; an object may have been declared in + * the DPL or by calling the dpdmai_create() function. + * This function returns a unique authentication token, + * associated with the specific object ID and the specific MC + * portal; this token must be used in all subsequent commands for + * this specific object. + * + * Return: '0' on Success; Error code otherwise. + */ +int dpdmai_open(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, + int dpdmai_id, + uint16_t *token) +{ + struct dpdmai_cmd_open *cmd_params; + struct mc_command cmd = { 0 }; + int err; + + /* prepare command */ + cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_OPEN, + cmd_flags, + 0); + cmd_params = (struct dpdmai_cmd_open *)cmd.params; + cmd_params->dpdmai_id = cpu_to_le32(dpdmai_id); + + /* send command to mc*/ + err = mc_send_command(mc_io, &cmd); + if (err) + return err; + + /* retrieve response parameters */ + *token = mc_cmd_hdr_read_token(&cmd); + + return 0; +} + +/** + * dpdmai_close() - Close the control session of the object + * @mc_io: Pointer to MC portal's I/O object + * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' + * @token: Token of DPDMAI object + * + * After this function is called, no further operations are + * allowed on the object without opening a new control session. + * + * Return: '0' on Success; Error code otherwise. + */ +int dpdmai_close(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, + uint16_t token) +{ + struct mc_command cmd = { 0 }; + + /* prepare command */ + cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_CLOSE, + cmd_flags, token); + + /* send command to mc*/ + return mc_send_command(mc_io, &cmd); +} + +/** + * dpdmai_create() - Create the DPDMAI object + * @mc_io: Pointer to MC portal's I/O object + * @dprc_token: Parent container token; '0' for default container + * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' + * @cfg: Configuration structure + * @obj_id: Returned object id + * + * Create the DPDMAI object, allocate required resources and + * perform required initialization. + * + * The object can be created either by declaring it in the + * DPL file, or by calling this function. + * + * The function accepts an authentication token of a parent + * container that this object should be assigned to. The token + * can be '0' so the object will be assigned to the default container. + * The newly created object can be opened with the returned + * object id and using the container's associated tokens and MC portals. + * + * Return: '0' on Success; Error code otherwise. + */ +int dpdmai_create(struct fsl_mc_io *mc_io, + uint16_t dprc_token, + uint32_t cmd_flags, + const struct dpdmai_cfg *cfg, + uint32_t *obj_id) +{ + struct dpdmai_cmd_create *cmd_params; + struct mc_command cmd = { 0 }; + int err; + + /* prepare command */ + cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_CREATE, + cmd_flags, + dprc_token); + cmd_params = (struct dpdmai_cmd_create *)cmd.params; + cmd_params->priorities[0] = cfg->priorities[0]; + cmd_params->priorities[1] = cfg->priorities[1]; + + /* send command to mc*/ + err = mc_send_command(mc_io, &cmd); + if (err) + return err; + + /* retrieve response parameters */ + *obj_id = mc_cmd_read_object_id(&cmd); + + return 0; +} + +/** + * dpdmai_destroy() - Destroy the DPDMAI object and release all its resources. + * @mc_io: Pointer to MC portal's I/O object + * @dprc_token: Parent container token; '0' for default container + * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' + * @object_id: The object id; it must be a valid id within the container that + * created this object; + * + * The function accepts the authentication token of the parent container that + * created the object (not the one that currently owns the object). The object + * is searched within parent using the provided 'object_id'. + * All tokens to the object must be closed before calling destroy. + * + * Return: '0' on Success; error code otherwise. + */ +int dpdmai_destroy(struct fsl_mc_io *mc_io, + uint16_t dprc_token, + uint32_t cmd_flags, + uint32_t object_id) +{ + struct dpdmai_cmd_destroy *cmd_params; + struct mc_command cmd = { 0 }; + + /* prepare command */ + cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_DESTROY, + cmd_flags, + dprc_token); + cmd_params = (struct dpdmai_cmd_destroy *)cmd.params; + cmd_params->dpdmai_id = cpu_to_le32(object_id); + + /* send command to mc*/ + return mc_send_command(mc_io, &cmd); +} + +/** + * dpdmai_enable() - Enable the DPDMAI, allow sending and receiving frames. + * @mc_io: Pointer to MC portal's I/O object + * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' + * @token: Token of DPDMAI object + * + * Return: '0' on Success; Error code otherwise. + */ +int dpdmai_enable(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, + uint16_t token) +{ + struct mc_command cmd = { 0 }; + + /* prepare command */ + cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_ENABLE, + cmd_flags, + token); + + /* send command to mc*/ + return mc_send_command(mc_io, &cmd); +} + +/** + * dpdmai_disable() - Disable the DPDMAI, stop sending and receiving frames. + * @mc_io: Pointer to MC portal's I/O object + * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' + * @token: Token of DPDMAI object + * + * Return: '0' on Success; Error code otherwise. + */ +int dpdmai_disable(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, + uint16_t token) +{ + struct mc_command cmd = { 0 }; + + /* prepare command */ + cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_DISABLE, + cmd_flags, + token); + + /* send command to mc*/ + return mc_send_command(mc_io, &cmd); +} + +/** + * dpdmai_is_enabled() - Check if the DPDMAI is enabled. + * @mc_io: Pointer to MC portal's I/O object + * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' + * @token: Token of DPDMAI object + * @en: Returns '1' if object is enabled; '0' otherwise + * + * Return: '0' on Success; Error code otherwise. + */ +int dpdmai_is_enabled(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, + uint16_t token, + int *en) +{ + struct dpdmai_rsp_is_enabled *rsp_params; + struct mc_command cmd = { 0 }; + int err; + + /* prepare command */ + cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_IS_ENABLED, + cmd_flags, + token); + + /* send command to mc*/ + err = mc_send_command(mc_io, &cmd); + if (err) + return err; + + /* retrieve response parameters */ + rsp_params = (struct dpdmai_rsp_is_enabled *)cmd.params; + *en = dpdmai_get_field(rsp_params->en, ENABLE); + + return 0; +} + +/** + * dpdmai_reset() - Reset the DPDMAI, returns the object to initial state. + * @mc_io: Pointer to MC portal's I/O object + * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' + * @token: Token of DPDMAI object + * + * Return: '0' on Success; Error code otherwise. + */ +int dpdmai_reset(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, + uint16_t token) +{ + struct mc_command cmd = { 0 }; + + /* prepare command */ + cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_RESET, + cmd_flags, + token); + + /* send command to mc*/ + return mc_send_command(mc_io, &cmd); +} + +/** + * dpdmai_get_attributes() - Retrieve DPDMAI attributes. + * @mc_io: Pointer to MC portal's I/O object + * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' + * @token: Token of DPDMAI object + * @attr: Returned object's attributes + * + * Return: '0' on Success; Error code otherwise. + */ +int dpdmai_get_attributes(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, + uint16_t token, + struct dpdmai_attr *attr) +{ + struct dpdmai_rsp_get_attr *rsp_params; + struct mc_command cmd = { 0 }; + int err; + + /* prepare command */ + cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_GET_ATTR, + cmd_flags, + token); + + /* send command to mc*/ + err = mc_send_command(mc_io, &cmd); + if (err) + return err; + + /* retrieve response parameters */ + rsp_params = (struct dpdmai_rsp_get_attr *)cmd.params; + attr->id = le32_to_cpu(rsp_params->id); + attr->num_of_priorities = rsp_params->num_of_priorities; + + return 0; +} + +/** + * dpdmai_set_rx_queue() - Set Rx queue configuration + * @mc_io: Pointer to MC portal's I/O object + * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' + * @token: Token of DPDMAI object + * @priority: Select the queue relative to number of + * priorities configured at DPDMAI creation; use + * DPDMAI_ALL_QUEUES to configure all Rx queues + * identically. + * @cfg: Rx queue configuration + * + * Return: '0' on Success; Error code otherwise. + */ +int dpdmai_set_rx_queue(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, + uint16_t token, + uint8_t priority, + const struct dpdmai_rx_queue_cfg *cfg) +{ + struct dpdmai_cmd_set_rx_queue *cmd_params; + struct mc_command cmd = { 0 }; + + /* prepare command */ + cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_SET_RX_QUEUE, + cmd_flags, + token); + cmd_params = (struct dpdmai_cmd_set_rx_queue *)cmd.params; + cmd_params->dest_id = cpu_to_le32(cfg->dest_cfg.dest_id); + cmd_params->dest_priority = cfg->dest_cfg.priority; + cmd_params->priority = priority; + cmd_params->user_ctx = cpu_to_le64(cfg->user_ctx); + cmd_params->options = cpu_to_le32(cfg->options); + dpdmai_set_field(cmd_params->dest_type, + DEST_TYPE, + cfg->dest_cfg.dest_type); + + /* send command to mc*/ + return mc_send_command(mc_io, &cmd); +} + +/** + * dpdmai_get_rx_queue() - Retrieve Rx queue attributes. + * @mc_io: Pointer to MC portal's I/O object + * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' + * @token: Token of DPDMAI object + * @priority: Select the queue relative to number of + * priorities configured at DPDMAI creation + * @attr: Returned Rx queue attributes + * + * Return: '0' on Success; Error code otherwise. + */ +int dpdmai_get_rx_queue(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, + uint16_t token, + uint8_t priority, + struct dpdmai_rx_queue_attr *attr) +{ + struct dpdmai_cmd_get_queue *cmd_params; + struct dpdmai_rsp_get_rx_queue *rsp_params; + struct mc_command cmd = { 0 }; + int err; + + /* prepare command */ + cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_GET_RX_QUEUE, + cmd_flags, + token); + cmd_params = (struct dpdmai_cmd_get_queue *)cmd.params; + cmd_params->priority = priority; + + /* send command to mc*/ + err = mc_send_command(mc_io, &cmd); + if (err) + return err; + + /* retrieve response parameters */ + rsp_params = (struct dpdmai_rsp_get_rx_queue *)cmd.params; + attr->user_ctx = le64_to_cpu(rsp_params->user_ctx); + attr->fqid = le32_to_cpu(rsp_params->fqid); + attr->dest_cfg.dest_id = le32_to_cpu(rsp_params->dest_id); + attr->dest_cfg.priority = le32_to_cpu(rsp_params->dest_priority); + attr->dest_cfg.dest_type = dpdmai_get_field(rsp_params->dest_type, + DEST_TYPE); + + return 0; +} + +/** + * dpdmai_get_tx_queue() - Retrieve Tx queue attributes. + * @mc_io: Pointer to MC portal's I/O object + * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' + * @token: Token of DPDMAI object + * @priority: Select the queue relative to number of + * priorities configured at DPDMAI creation + * @attr: Returned Tx queue attributes + * + * Return: '0' on Success; Error code otherwise. + */ +int dpdmai_get_tx_queue(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, + uint16_t token, + uint8_t priority, + struct dpdmai_tx_queue_attr *attr) +{ + struct dpdmai_cmd_get_queue *cmd_params; + struct dpdmai_rsp_get_tx_queue *rsp_params; + struct mc_command cmd = { 0 }; + int err; + + /* prepare command */ + cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_GET_TX_QUEUE, + cmd_flags, + token); + cmd_params = (struct dpdmai_cmd_get_queue *)cmd.params; + cmd_params->priority = priority; + + /* send command to mc*/ + err = mc_send_command(mc_io, &cmd); + if (err) + return err; + + /* retrieve response parameters */ + rsp_params = (struct dpdmai_rsp_get_tx_queue *)cmd.params; + attr->fqid = le32_to_cpu(rsp_params->fqid); + + return 0; +} diff --git a/drivers/bus/fslmc/mc/fsl_dpdmai.h b/drivers/bus/fslmc/mc/fsl_dpdmai.h new file mode 100644 index 0000000..03e46ec --- /dev/null +++ b/drivers/bus/fslmc/mc/fsl_dpdmai.h @@ -0,0 +1,189 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2018 NXP + */ + +#ifndef __FSL_DPDMAI_H +#define __FSL_DPDMAI_H + +struct fsl_mc_io; + +/* Data Path DMA Interface API + * Contains initialization APIs and runtime control APIs for DPDMAI + */ + +/* General DPDMAI macros */ + +/** + * Maximum number of Tx/Rx priorities per DPDMAI object + */ +#define DPDMAI_PRIO_NUM 2 + +/** + * All queues considered; see dpdmai_set_rx_queue() + */ +#define DPDMAI_ALL_QUEUES (uint8_t)(-1) + +int dpdmai_open(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, + int dpdmai_id, + uint16_t *token); + +int dpdmai_close(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, + uint16_t token); + +/** + * struct dpdmai_cfg - Structure representing DPDMAI configuration + * @priorities: Priorities for the DMA hardware processing; valid priorities are + * configured with values 1-8; the entry following last valid entry + * should be configured with 0 + */ +struct dpdmai_cfg { + uint8_t priorities[DPDMAI_PRIO_NUM]; +}; + +int dpdmai_create(struct fsl_mc_io *mc_io, + uint16_t dprc_token, + uint32_t cmd_flags, + const struct dpdmai_cfg *cfg, + uint32_t *obj_id); + +int dpdmai_destroy(struct fsl_mc_io *mc_io, + uint16_t dprc_token, + uint32_t cmd_flags, + uint32_t object_id); + +int dpdmai_enable(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, + uint16_t token); + +int dpdmai_disable(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, + uint16_t token); + +int dpdmai_is_enabled(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, + uint16_t token, + int *en); + +int dpdmai_reset(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, + uint16_t token); + +/** + * struct dpdmai_attr - Structure representing DPDMAI attributes + * @id: DPDMAI object ID + * @num_of_priorities: number of priorities + */ +struct dpdmai_attr { + int id; + uint8_t num_of_priorities; +}; + +int dpdmai_get_attributes(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, + uint16_t token, + struct dpdmai_attr *attr); + +/** + * enum dpdmai_dest - DPDMAI destination types + * @DPDMAI_DEST_NONE: Unassigned destination; The queue is set in parked mode + * and does not generate FQDAN notifications; user is expected to dequeue + * from the queue based on polling or other user-defined method + * @DPDMAI_DEST_DPIO: The queue is set in schedule mode and generates FQDAN + * notifications to the specified DPIO; user is expected to dequeue + * from the queue only after notification is received + * @DPDMAI_DEST_DPCON: The queue is set in schedule mode and does not generate + * FQDAN notifications, but is connected to the specified DPCON object; + * user is expected to dequeue from the DPCON channel + */ +enum dpdmai_dest { + DPDMAI_DEST_NONE = 0, + DPDMAI_DEST_DPIO = 1, + DPDMAI_DEST_DPCON = 2 +}; + +/** + * struct dpdmai_dest_cfg - Structure representing DPDMAI destination parameters + * @dest_type: Destination type + * @dest_id: Either DPIO ID or DPCON ID, depending on the destination type + * @priority: Priority selection within the DPIO or DPCON channel; valid values + * are 0-1 or 0-7, depending on the number of priorities in that + * channel; not relevant for 'DPDMAI_DEST_NONE' option + */ +struct dpdmai_dest_cfg { + enum dpdmai_dest dest_type; + int dest_id; + uint8_t priority; +}; + +/* DPDMAI queue modification options */ + +/** + * Select to modify the user's context associated with the queue + */ +#define DPDMAI_QUEUE_OPT_USER_CTX 0x00000001 + +/** + * Select to modify the queue's destination + */ +#define DPDMAI_QUEUE_OPT_DEST 0x00000002 + +/** + * struct dpdmai_rx_queue_cfg - DPDMAI RX queue configuration + * @options: Flags representing the suggested modifications to the queue; + * Use any combination of 'DPDMAI_QUEUE_OPT_' flags + * @user_ctx: User context value provided in the frame descriptor of each + * dequeued frame; + * valid only if 'DPDMAI_QUEUE_OPT_USER_CTX' is contained in 'options' + * @dest_cfg: Queue destination parameters; + * valid only if 'DPDMAI_QUEUE_OPT_DEST' is contained in 'options' + */ +struct dpdmai_rx_queue_cfg { + uint32_t options; + uint64_t user_ctx; + struct dpdmai_dest_cfg dest_cfg; + +}; + +int dpdmai_set_rx_queue(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, + uint16_t token, + uint8_t priority, + const struct dpdmai_rx_queue_cfg *cfg); + +/** + * struct dpdmai_rx_queue_attr - Structure representing attributes of Rx queues + * @user_ctx: User context value provided in the frame descriptor of each + * dequeued frame + * @dest_cfg: Queue destination configuration + * @fqid: Virtual FQID value to be used for dequeue operations + */ +struct dpdmai_rx_queue_attr { + uint64_t user_ctx; + struct dpdmai_dest_cfg dest_cfg; + uint32_t fqid; +}; + +int dpdmai_get_rx_queue(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, + uint16_t token, + uint8_t priority, + struct dpdmai_rx_queue_attr *attr); + +/** + * struct dpdmai_tx_queue_attr - Structure representing attributes of Tx queues + * @fqid: Virtual FQID to be used for sending frames to DMA hardware + */ + +struct dpdmai_tx_queue_attr { + uint32_t fqid; +}; + +int dpdmai_get_tx_queue(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, + uint16_t token, + uint8_t priority, + struct dpdmai_tx_queue_attr *attr); + +#endif /* __FSL_DPDMAI_H */ diff --git a/drivers/bus/fslmc/mc/fsl_dpdmai_cmd.h b/drivers/bus/fslmc/mc/fsl_dpdmai_cmd.h new file mode 100644 index 0000000..618e19e --- /dev/null +++ b/drivers/bus/fslmc/mc/fsl_dpdmai_cmd.h @@ -0,0 +1,107 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2018 NXP + */ + +#ifndef _FSL_DPDMAI_CMD_H +#define _FSL_DPDMAI_CMD_H + +/* DPDMAI Version */ +#define DPDMAI_VER_MAJOR 3 +#define DPDMAI_VER_MINOR 2 + +/* Command versioning */ +#define DPDMAI_CMD_BASE_VERSION 1 +#define DPDMAI_CMD_ID_OFFSET 4 + +#define DPDMAI_CMD(id) ((id << DPDMAI_CMD_ID_OFFSET) | DPDMAI_CMD_BASE_VERSION) + +/* Command IDs */ +#define DPDMAI_CMDID_CLOSE DPDMAI_CMD(0x800) +#define DPDMAI_CMDID_OPEN DPDMAI_CMD(0x80E) +#define DPDMAI_CMDID_CREATE DPDMAI_CMD(0x90E) +#define DPDMAI_CMDID_DESTROY DPDMAI_CMD(0x98E) +#define DPDMAI_CMDID_GET_API_VERSION DPDMAI_CMD(0xa0E) + +#define DPDMAI_CMDID_ENABLE DPDMAI_CMD(0x002) +#define DPDMAI_CMDID_DISABLE DPDMAI_CMD(0x003) +#define DPDMAI_CMDID_GET_ATTR DPDMAI_CMD(0x004) +#define DPDMAI_CMDID_RESET DPDMAI_CMD(0x005) +#define DPDMAI_CMDID_IS_ENABLED DPDMAI_CMD(0x006) + +#define DPDMAI_CMDID_SET_RX_QUEUE DPDMAI_CMD(0x1A0) +#define DPDMAI_CMDID_GET_RX_QUEUE DPDMAI_CMD(0x1A1) +#define DPDMAI_CMDID_GET_TX_QUEUE DPDMAI_CMD(0x1A2) + +/* Macros for accessing command fields smaller than 1byte */ +#define DPDMAI_MASK(field) \ + GENMASK(DPDMAI_##field##_SHIFT + DPDMAI_##field##_SIZE - 1, \ + DPDMAI_##field##_SHIFT) +#define dpdmai_set_field(var, field, val) \ + ((var) |= (((val) << DPDMAI_##field##_SHIFT) & DPDMAI_MASK(field))) +#define dpdmai_get_field(var, field) \ + (((var) & DPDMAI_MASK(field)) >> DPDMAI_##field##_SHIFT) + +#pragma pack(push, 1) +struct dpdmai_cmd_open { + uint32_t dpdmai_id; +}; + +struct dpdmai_cmd_create { + uint8_t pad; + uint8_t priorities[2]; +}; + +struct dpdmai_cmd_destroy { + uint32_t dpdmai_id; +}; + +#define DPDMAI_ENABLE_SHIFT 0 +#define DPDMAI_ENABLE_SIZE 1 + +struct dpdmai_rsp_is_enabled { + /* only the LSB bit */ + uint8_t en; +}; + +struct dpdmai_rsp_get_attr { + uint32_t id; + uint8_t num_of_priorities; +}; + +#define DPDMAI_DEST_TYPE_SHIFT 0 +#define DPDMAI_DEST_TYPE_SIZE 4 + +struct dpdmai_cmd_set_rx_queue { + uint32_t dest_id; + uint8_t dest_priority; + uint8_t priority; + /* from LSB: dest_type:4 */ + uint8_t dest_type; + uint8_t pad; + uint64_t user_ctx; + uint32_t options; +}; + +struct dpdmai_cmd_get_queue { + uint8_t pad[5]; + uint8_t priority; +}; + +struct dpdmai_rsp_get_rx_queue { + uint32_t dest_id; + uint8_t dest_priority; + uint8_t pad1; + /* from LSB: dest_type:4 */ + uint8_t dest_type; + uint8_t pad2; + uint64_t user_ctx; + uint32_t fqid; +}; + +struct dpdmai_rsp_get_tx_queue { + uint64_t pad; + uint32_t fqid; +}; + +#pragma pack(pop) +#endif /* _FSL_DPDMAI_CMD_H */ diff --git a/drivers/bus/fslmc/meson.build b/drivers/bus/fslmc/meson.build index 890d6c0..22a56a6 100644 --- a/drivers/bus/fslmc/meson.build +++ b/drivers/bus/fslmc/meson.build @@ -11,6 +11,7 @@ sources = files('fslmc_bus.c', 'mc/dpbp.c', 'mc/dpci.c', 'mc/dpcon.c', + 'mc/dpdmai.c', 'mc/dpio.c', 'mc/dpmng.c', 'mc/mc_sys.c', diff --git a/drivers/bus/fslmc/rte_bus_fslmc_version.map b/drivers/bus/fslmc/rte_bus_fslmc_version.map index f519651..70fb719 100644 --- a/drivers/bus/fslmc/rte_bus_fslmc_version.map +++ b/drivers/bus/fslmc/rte_bus_fslmc_version.map @@ -105,5 +105,14 @@ DPDK_18.05 { global: dpaa2_affine_qbman_ethrx_swp; + dpdmai_close; + dpdmai_disable; + dpdmai_enable; + dpdmai_get_attributes; + dpdmai_get_rx_queue; + dpdmai_get_tx_queue; + dpdmai_open; + dpdmai_set_rx_queue; + dpdmai_set_tx_queue; } DPDK_18.02; -- 1.9.1