From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR02-HE1-obe.outbound.protection.outlook.com (mail-eopbgr10077.outbound.protection.outlook.com [40.107.1.77]) by dpdk.org (Postfix) with ESMTP id 5E5F158CB for ; Mon, 22 Oct 2018 15:31:15 +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:X-MS-Exchange-SenderADCheck; bh=i0jxaFCHv4g/FyLrN6hR+3HbQW/xbGcGjf1cdVr+GWg=; b=kaYpUyBDfeiojpjuNnJh7wzSV1I3+f0j9GpFfZTK33kxy8thhpLAexbeWmPDdmeZyjp9iXwoY2d926o+EW7PZSti+e/4bwl1L4MttctrBEkZsZpIMBNdp3QQD6ZOvglBTTCAj9x1K1GwvZYf6MelbiBVSsl32xj7NNacVNF91lw= Received: from HE1PR04MB1530.eurprd04.prod.outlook.com (10.164.48.20) by HE1PR04MB3131.eurprd04.prod.outlook.com (10.171.196.142) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1250.30; Mon, 22 Oct 2018 13:31:11 +0000 Received: from HE1PR04MB1530.eurprd04.prod.outlook.com ([fe80::95cd:198:d5c5:59a4]) by HE1PR04MB1530.eurprd04.prod.outlook.com ([fe80::95cd:198:d5c5:59a4%5]) with mapi id 15.20.1250.028; Mon, 22 Oct 2018 13:31:11 +0000 From: Gagandeep Singh To: "dev@dpdk.org" , Akhil Goyal CC: Gagandeep Singh , Hemant Agrawal Thread-Topic: [PATCH v3 05/15] crypto/caam_jr: add basic job ring routines Thread-Index: AQHUagt/xlvpz2sSqESh1Z3JN4jVpw== Date: Mon, 22 Oct 2018 13:31:11 +0000 Message-ID: <20181022133021.11264-6-g.singh@nxp.com> References: <20181012144055.9461-1-g.singh@nxp.com> <20181022133021.11264-1-g.singh@nxp.com> In-Reply-To: <20181022133021.11264-1-g.singh@nxp.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-clientproxiedby: BM1PR0101CA0016.INDPRD01.PROD.OUTLOOK.COM (2603:1096:b00:18::26) To HE1PR04MB1530.eurprd04.prod.outlook.com (2a01:111:e400:59a8::20) authentication-results: spf=none (sender IP is ) smtp.mailfrom=G.Singh@nxp.com; x-ms-exchange-messagesentrepresentingtype: 1 x-originating-ip: [14.142.187.166] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; HE1PR04MB3131; 6:ETlC/bgJkk6vCA0F/U3/uu9J1wGGWKMaHSgLu9r/NnBVHRg2PoUj0yTfp3fH9tHz+YL/wYarMmqaQVBYRSQoG9fdeIZMJ/cKBT/IMtfoqUKAW9+UjMdw4awbxLMsIOmFNufuZhMosY47wmPb8Qnwez+/4QvlfQir2eB4Pb57jIhIetnlgGy6ILNWJtsilez5C7dIAzmeeORUxAU3JJRqMJpRU1r3ywzOQdq2B12mT//7zKaCNG9K71VmTP7ueGaQNwpEoCeYVpYYImXry+V6c04wvT0L7rfb+LPue8blTa0dMjnneuooowrScp+5cuJwVuCzCgoqaC2yCF600PjA4WY3KZjKp5mQMXsdckNSJQs/XcO0dwz1pc3PUkEwLm8ynuM40b6Xh2gkgP25ChzEAmNVyLprvaX96bmvuVV/zRPETfkiGpkzu/YzlYDlyKol4cGw2PvwJFxRYWhip0agtg==; 5:B4/ujQCDppWqeou7JHzv67JVXKwZ55euXi8nJhuzcN+r6+jcgt6WNIDwquTd9JOyIhjS8N6mdMxM7nYgIUW8ww+2b1WgElyNIoLS3/N9/HpsjHJtI9IEcqoY75IK8QWWeWnsmEew8Jaq7oDZN5uAZe4Q89kgZi2RVn7yA2kMOkQ=; 7:KIxJj580zDsbf9Z0F9MftO4ER8o77VrUIMDVuRXMa7VoF7tiJraAmmCY5L/vUwCrRIYYRERLQbLC8/hj/x3WMPVHSMuaYWNXgxISTGg9mdZCRNtF5A8ThrmWJ4Msso+omyZrBNCb92Wr1i0EOHfJ2Ar1MaONNLTeIR61yeEhZSEoKf+LkF45KJ1qYsbBbJpk9G1YWlu0ARj2J472VK3UoKfcP9RlDZt3vWhQ9ysekwQwxkuZ67CNeHwyPiMhta0s x-ms-office365-filtering-correlation-id: 6aa534f9-9ef0-4f20-fc6a-08d63822a199 x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0; PCL:0; RULEID:(7020095)(4652040)(4534185)(7168020)(4627221)(201703031133081)(201702281549075)(5600074)(711020)(4618075)(2017052603328)(7153060)(7193020); SRVR:HE1PR04MB3131; x-ms-traffictypediagnostic: HE1PR04MB3131: x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:(192374486261705)(185117386973197); x-ms-exchange-senderadcheck: 1 x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(93006095)(93001095)(10201501046)(3002001)(3231355)(944501410)(52105095)(6055026)(148016)(149066)(150057)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123562045)(20161123564045)(20161123560045)(201708071742011)(7699051)(76991095); SRVR:HE1PR04MB3131; BCL:0; PCL:0; RULEID:; SRVR:HE1PR04MB3131; x-forefront-prvs: 08331F819E x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(366004)(376002)(39860400002)(136003)(346002)(396003)(189003)(199004)(110136005)(99286004)(316002)(54906003)(81156014)(14454004)(25786009)(72206003)(81166006)(2900100001)(8936002)(106356001)(8676002)(6116002)(3846002)(86362001)(2616005)(476003)(6506007)(386003)(102836004)(1076002)(11346002)(446003)(26005)(186003)(305945005)(478600001)(4326008)(2906002)(76176011)(68736007)(7736002)(6636002)(97736004)(486006)(52116002)(36756003)(55236004)(105586002)(71190400001)(5660300001)(4744004)(6436002)(6486002)(78486010)(53936002)(14444005)(2501003)(256004)(66066001)(71200400001)(5250100002)(6512007); DIR:OUT; SFP:1101; SCL:1; SRVR:HE1PR04MB3131; H:HE1PR04MB1530.eurprd04.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:3; A:1; received-spf: None (protection.outlook.com: nxp.com does not designate permitted sender hosts) x-microsoft-antispam-message-info: iX0yxqZa3Z9JqGk/MjaTOkh3rywDRPry//zdVPrm02Dl2ZkgajSWU+sFITEFAAosuZe/nDCs3tL+A/53gEomaFJRwPF5FpZe9p5lwKHyyWfhNVbue+MnEqOV5yTbdUGquPy5wIO2pweQqJsu73kKzb+2ROe4SAtd/2HeqNvdrszt4v3wyQv8x/sXroZsn6fMIf66W4IOnscNPTTh0RxMAjNitWe9Wjytd9dZ+SAkLc/YCnoHf3y/oMUuicFPyixP0IB/Ui+Ip6DMpu6REJ6wjpR6ocrJ8r2cU7b/wrSDCvht5obKOHiaS0kjuOonRyE/9mcWwnqt9MpL5MnUEhE/dDyZf4APxLt5m6EIYIQJe0k= spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 6aa534f9-9ef0-4f20-fc6a-08d63822a199 X-MS-Exchange-CrossTenant-originalarrivaltime: 22 Oct 2018 13:31:11.7936 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR04MB3131 Subject: [dpdk-dev] [PATCH v3 05/15] crypto/caam_jr: add basic job ring routines 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: Mon, 22 Oct 2018 13:31:16 -0000 This patch adds following job ring routines - init_job_ring (configure hw/sw resources) - shutdown_job_ring (releases hw/sw resources) - close_job_ring (flush job ring) Signed-off-by: Gagandeep Singh Signed-off-by: Hemant Agrawal Acked-by: Akhil Goyal --- drivers/crypto/caam_jr/caam_jr.c | 329 ++++++++++++++++++++++++++++++- 1 file changed, 327 insertions(+), 2 deletions(-) diff --git a/drivers/crypto/caam_jr/caam_jr.c b/drivers/crypto/caam_jr/caam= _jr.c index 27331194a..cb024a979 100644 --- a/drivers/crypto/caam_jr/caam_jr.c +++ b/drivers/crypto/caam_jr/caam_jr.c @@ -17,12 +17,142 @@ #include #include =20 +#include +#include +#include #include =20 +/* RTA header files */ +#include +#include + #define CRYPTODEV_NAME_CAAM_JR_PMD crypto_caam_jr static uint8_t cryptodev_driver_id; int caam_jr_logtype; =20 +enum rta_sec_era rta_sec_era; + +/* Lists the states possible for the SEC user space driver. */ +enum sec_driver_state_e { + SEC_DRIVER_STATE_IDLE, /* Driver not initialized */ + SEC_DRIVER_STATE_STARTED, /* Driver initialized and can be used*/ + SEC_DRIVER_STATE_RELEASE, /* Driver release is in progress */ +}; + +/* Job rings used for communication with SEC HW */ +static struct sec_job_ring_t g_job_rings[MAX_SEC_JOB_RINGS]; + +/* The current state of SEC user space driver */ +static enum sec_driver_state_e g_driver_state =3D SEC_DRIVER_STATE_IDLE; + +/* The number of job rings used by SEC user space driver */ +static int g_job_rings_no; +static int g_job_rings_max; + +/* @brief Poll the HW for already processed jobs in the JR + * and silently discard the available jobs or notify them to UA + * with indicated error code. + * + * @param [in,out] job_ring The job ring to poll. + * @param [in] do_notify Can be #TRUE or #FALSE. Indicates if + * descriptors are to be discarded + * or notified to UA with given error_cod= e. + * @param [out] notified_descs Number of notified descriptors. Can be N= ULL + * if do_notify is #FALSE + */ +static void +hw_flush_job_ring(struct sec_job_ring_t *job_ring, + uint32_t do_notify, + uint32_t *notified_descs) +{ + int32_t jobs_no_to_discard =3D 0; + int32_t discarded_descs_no =3D 0; + + PMD_INIT_FUNC_TRACE(); + CAAM_JR_DEBUG("Jr[%p] pi[%d] ci[%d].Flushing jr notify desc=3D[%d]", + job_ring, job_ring->pidx, job_ring->cidx, do_notify); + + jobs_no_to_discard =3D hw_get_no_finished_jobs(job_ring); + + /* Discard all jobs */ + CAAM_JR_DEBUG("Jr[%p] pi[%d] ci[%d].Discarding %d descs", + job_ring, job_ring->pidx, job_ring->cidx, + jobs_no_to_discard); + + while (jobs_no_to_discard > discarded_descs_no) { + discarded_descs_no++; + /* Now increment the consumer index for the current job ring, + * AFTER saving job in temporary location! + * Increment the consumer index for the current job ring + */ + job_ring->cidx =3D SEC_CIRCULAR_COUNTER(job_ring->cidx, + SEC_JOB_RING_SIZE); + + hw_remove_entries(job_ring, 1); + } + + if (do_notify =3D=3D true) { + ASSERT(notified_descs !=3D NULL); + *notified_descs =3D discarded_descs_no; + } +} + + +/* @brief Flush job rings of any processed descs. + * The processed descs are silently dropped, + * WITHOUT being notified to UA. + */ +static void +close_job_ring(struct sec_job_ring_t *job_ring) +{ + PMD_INIT_FUNC_TRACE(); + if (job_ring->irq_fd) { + /* Producer index is frozen. If consumer index is not equal + * with producer index, then we have descs to flush. + */ + while (job_ring->pidx !=3D job_ring->cidx) + hw_flush_job_ring(job_ring, false, NULL); + + /* free the uio job ring */ + free_job_ring(job_ring->irq_fd); + job_ring->irq_fd =3D 0; + caam_jr_dma_free(job_ring->input_ring); + caam_jr_dma_free(job_ring->output_ring); + g_job_rings_no--; + } +} + +/** @brief Release the software and hardware resources tied to a job ring. + * @param [in] job_ring The job ring + * + * @retval 0 for success + * @retval -1 for error + */ +static int +shutdown_job_ring(struct sec_job_ring_t *job_ring) +{ + int ret =3D 0; + + PMD_INIT_FUNC_TRACE(); + ASSERT(job_ring !=3D NULL); + ret =3D hw_shutdown_job_ring(job_ring); + SEC_ASSERT(ret =3D=3D 0, ret, + "Failed to shutdown hardware job ring %p", + job_ring); + + if (job_ring->coalescing_en) + hw_job_ring_disable_coalescing(job_ring); + + if (job_ring->jr_mode !=3D SEC_NOTIFICATION_TYPE_POLL) { + ret =3D caam_jr_disable_irqs(job_ring->irq_fd); + SEC_ASSERT(ret =3D=3D 0, ret, + "Failed to disable irqs for job ring %p", + job_ring); + } + + return ret; +} + /* * @brief Release the resources used by the SEC user space driver. * @@ -40,28 +170,195 @@ int caam_jr_logtype; static int caam_jr_dev_uninit(struct rte_cryptodev *dev) { + struct sec_job_ring_t *internals; + + PMD_INIT_FUNC_TRACE(); if (dev =3D=3D NULL) return -ENODEV; =20 + internals =3D dev->data->dev_private; + rte_free(dev->security_ctx); + + /* If any descriptors in flight , poll and wait + * until all descriptors are received and silently discarded. + */ + if (internals) { + shutdown_job_ring(internals); + close_job_ring(internals); + rte_mempool_free(internals->ctx_pool); + } + CAAM_JR_INFO("Closing crypto device %s", dev->data->name); =20 - return 0; + /* last caam jr instance) */ + if (g_job_rings_no =3D=3D 0) + g_driver_state =3D SEC_DRIVER_STATE_IDLE; + + return SEC_SUCCESS; +} + +/* @brief Initialize the software and hardware resources tied to a job rin= g. + * @param [in] jr_mode; Model to be used by SEC Driver to receive + * notifications from SEC. Can be either + * of the three: #SEC_NOTIFICATION_TYPE_NAPI + * #SEC_NOTIFICATION_TYPE_IRQ or + * #SEC_NOTIFICATION_TYPE_POLL + * @param [in] NAPI_mode The NAPI work mode to configure a job ring at + * startup. Used only when #SEC_NOTIFICATION_TYPE + * is set to #SEC_NOTIFICATION_TYPE_NAPI. + * @param [in] irq_coalescing_timer This value determines the maximum + * amount of time after processing a + * descriptor before raising an interrupt. + * @param [in] irq_coalescing_count This value determines how many + * descriptors are completed before + * raising an interrupt. + * @param [in] reg_base_addr, The job ring base address register + * @param [in] irq_id The job ring interrupt identification number. + * @retval job_ring_handle for successful job ring configuration + * @retval NULL on error + * + */ +static void * +init_job_ring(void *reg_base_addr, uint32_t irq_id) +{ + struct sec_job_ring_t *job_ring =3D NULL; + int i, ret =3D 0; + int jr_mode =3D SEC_NOTIFICATION_TYPE_POLL; + int napi_mode =3D 0; + int irq_coalescing_timer =3D 0; + int irq_coalescing_count =3D 0; + + for (i =3D 0; i < MAX_SEC_JOB_RINGS; i++) { + if (g_job_rings[i].irq_fd =3D=3D 0) { + job_ring =3D &g_job_rings[i]; + g_job_rings_no++; + break; + } + } + if (job_ring =3D=3D NULL) { + CAAM_JR_ERR("No free job ring\n"); + return NULL; + } + + job_ring->register_base_addr =3D reg_base_addr; + job_ring->jr_mode =3D jr_mode; + job_ring->napi_mode =3D 0; + job_ring->irq_fd =3D irq_id; + + /* Allocate mem for input and output ring */ + + /* Allocate memory for input ring */ + job_ring->input_ring =3D caam_jr_dma_mem_alloc(L1_CACHE_BYTES, + SEC_DMA_MEM_INPUT_RING_SIZE); + memset(job_ring->input_ring, 0, SEC_DMA_MEM_INPUT_RING_SIZE); + + /* Allocate memory for output ring */ + job_ring->output_ring =3D caam_jr_dma_mem_alloc(L1_CACHE_BYTES, + SEC_DMA_MEM_OUTPUT_RING_SIZE); + memset(job_ring->output_ring, 0, SEC_DMA_MEM_OUTPUT_RING_SIZE); + + /* Reset job ring in SEC hw and configure job ring registers */ + ret =3D hw_reset_job_ring(job_ring); + if (ret !=3D 0) { + CAAM_JR_ERR("Failed to reset hardware job ring"); + goto cleanup; + } + + if (jr_mode =3D=3D SEC_NOTIFICATION_TYPE_NAPI) { + /* When SEC US driver works in NAPI mode, the UA can select + * if the driver starts with IRQs on or off. + */ + if (napi_mode =3D=3D SEC_STARTUP_INTERRUPT_MODE) { + CAAM_JR_INFO("Enabling DONE IRQ generationon job ring - %p", + job_ring); + ret =3D caam_jr_enable_irqs(job_ring->irq_fd); + if (ret !=3D 0) { + CAAM_JR_ERR("Failed to enable irqs for job ring"); + goto cleanup; + } + } + } else if (jr_mode =3D=3D SEC_NOTIFICATION_TYPE_IRQ) { + /* When SEC US driver works in pure interrupt mode, + * IRQ's are always enabled. + */ + CAAM_JR_INFO("Enabling DONE IRQ generation on job ring - %p", + job_ring); + ret =3D caam_jr_enable_irqs(job_ring->irq_fd); + if (ret !=3D 0) { + CAAM_JR_ERR("Failed to enable irqs for job ring"); + goto cleanup; + } + } + if (irq_coalescing_timer || irq_coalescing_count) { + hw_job_ring_set_coalescing_param(job_ring, + irq_coalescing_timer, + irq_coalescing_count); + + hw_job_ring_enable_coalescing(job_ring); + job_ring->coalescing_en =3D 1; + } + + job_ring->jr_state =3D SEC_JOB_RING_STATE_STARTED; + job_ring->max_nb_queue_pairs =3D RTE_CAAM_MAX_NB_SEC_QPS; + job_ring->max_nb_sessions =3D RTE_CAAM_JR_PMD_MAX_NB_SESSIONS; + + return job_ring; +cleanup: + caam_jr_dma_free(job_ring->output_ring); + caam_jr_dma_free(job_ring->input_ring); + return NULL; } =20 + static int caam_jr_dev_init(const char *name, struct rte_vdev_device *vdev, struct rte_cryptodev_pmd_init_params *init_params) { struct rte_cryptodev *dev; + struct uio_job_ring *job_ring; + char str[RTE_CRYPTODEV_NAME_MAX_LEN]; =20 PMD_INIT_FUNC_TRACE(); =20 + /* Validate driver state */ + if (g_driver_state =3D=3D SEC_DRIVER_STATE_IDLE) { + g_job_rings_max =3D sec_configure(); + if (!g_job_rings_max) { + CAAM_JR_ERR("No job ring detected on UIO !!!!"); + return -1; + } + /* Update driver state */ + g_driver_state =3D SEC_DRIVER_STATE_STARTED; + } + + if (g_job_rings_no >=3D g_job_rings_max) { + CAAM_JR_ERR("No more job rings available max=3D%d!!!!", + g_job_rings_max); + return -1; + } + + job_ring =3D config_job_ring(); + if (job_ring =3D=3D NULL) { + CAAM_JR_ERR("failed to create job ring"); + goto init_error; + } + + snprintf(str, sizeof(str), "caam_jr%d", job_ring->jr_id); + dev =3D rte_cryptodev_pmd_create(name, &vdev->device, init_params); if (dev =3D=3D NULL) { CAAM_JR_ERR("failed to create cryptodev vdev"); goto cleanup; } + /*TODO free it during teardown*/ + dev->data->dev_private =3D init_job_ring(job_ring->register_base_addr, + job_ring->uio_fd); + + if (!dev->data->dev_private) { + CAAM_JR_ERR("Ring memory allocation failed\n"); + goto cleanup2; + } =20 dev->driver_id =3D cryptodev_driver_id; dev->dev_ops =3D NULL; @@ -79,7 +376,12 @@ caam_jr_dev_init(const char *name, =20 return 0; =20 +cleanup2: + caam_jr_dev_uninit(dev); + rte_cryptodev_pmd_release_device(dev); cleanup: + free_job_ring(job_ring->uio_fd); +init_error: CAAM_JR_ERR("driver %s: cryptodev_caam_jr_create failed", init_params->name); =20 @@ -92,7 +394,7 @@ cryptodev_caam_jr_probe(struct rte_vdev_device *vdev) { struct rte_cryptodev_pmd_init_params init_params =3D { "", - 128, + sizeof(struct sec_job_ring_t), rte_socket_id(), RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_QUEUE_PAIRS }; @@ -106,6 +408,29 @@ cryptodev_caam_jr_probe(struct rte_vdev_device *vdev) input_args =3D rte_vdev_device_args(vdev); rte_cryptodev_pmd_parse_input_args(&init_params, input_args); =20 + /* if sec device version is not configured */ + if (!rta_get_sec_era()) { + const struct device_node *caam_node; + + for_each_compatible_node(caam_node, NULL, "fsl,sec-v4.0") { + const uint32_t *prop =3D of_get_property(caam_node, + "fsl,sec-era", + NULL); + if (prop) { + rta_set_sec_era( + INTL_SEC_ERA(cpu_to_caam32(*prop))); + break; + } + } + } +#ifdef RTE_LIBRTE_PMD_CAAM_JR_BE + if (rta_get_sec_era() > RTA_SEC_ERA_8) { + RTE_LOG(ERR, PMD, + "CAAM is compiled in BE mode for device with sec era > 8???\n"); + return -EINVAL; + } +#endif + return caam_jr_dev_init(name, vdev, &init_params); } =20 --=20 2.17.1