From patchwork Fri Aug 19 22:32:13 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Omer Khaliq X-Patchwork-Id: 661081 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3sGMCw5pzJz9srZ for ; Sat, 20 Aug 2016 11:08:44 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=CAVIUMNETWORKS.onmicrosoft.com header.i=@CAVIUMNETWORKS.onmicrosoft.com header.b=HFs0LBwm; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755785AbcHTBIT (ORCPT ); Fri, 19 Aug 2016 21:08:19 -0400 Received: from mail-bn3nam01on0057.outbound.protection.outlook.com ([104.47.33.57]:55872 "EHLO NAM01-BN3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754781AbcHTBIR (ORCPT ); Fri, 19 Aug 2016 21:08:17 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=8V5q3v2pfcZp1e06YwN8YBLFTqAyLsWy7gqp+fDXKvw=; b=HFs0LBwm0X8EiduWURumqajhTgz6gH+6t2M/PlZDThqOpGfq+gpBMoIdc19zObICBAs4Ciq9rvvyd9m5S+eMVLECTrs5ZRSMII6C3KCGL31g0Wm5wM/B03p6i1ZLc/lZLOqr7a+Qb5hpL7auNcI283VHdrjQ/5SrhHhubzUqKyA= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Omer.Khaliq@cavium.com; Received: from localhost.localdomain (50.233.148.156) by CY4PR07MB2951.namprd07.prod.outlook.com (10.169.253.13) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384) id 15.1.557.21; Fri, 19 Aug 2016 22:33:04 +0000 From: Omer Khaliq To: , , , , , , , , CC: Omer Khaliq Subject: [PATCH 2/2] hwrng: thunderx: Add Cavium HWRNG driver for ThunderX SoC. Date: Fri, 19 Aug 2016 15:32:13 -0700 Message-ID: <1471645933-3643-3-git-send-email-okhaliq@caviumnetworks.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1471645933-3643-1-git-send-email-okhaliq@caviumnetworks.com> References: <1471645933-3643-1-git-send-email-okhaliq@caviumnetworks.com> MIME-Version: 1.0 X-Originating-IP: [50.233.148.156] X-ClientProxiedBy: BN6PR07CA0038.namprd07.prod.outlook.com (10.172.104.24) To CY4PR07MB2951.namprd07.prod.outlook.com (10.169.253.13) X-MS-Office365-Filtering-Correlation-Id: 859ed024-96a0-4542-f3f5-08d3c880ca35 X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB2951; 2:14VEpAlOh8+GaZgZuF3U/xF4W87ZfsYTsCnL4rW33NrxKMCcJR0xRdCw89/CDp2iiDDkSMM91kPvuLxTdcf+CTOs/wZBgPGZ8a2Pwvqii8qx3lUiyoyosSx1trxIdglLAkDFYps/QC2OdFaz84EJwpZRZXu1eiB2Oxl4zQSI8X7XwBi7twe4u+1cpGu0d8YH; 3:c508oTcDoxCI9LNkMaMCvmUd6qDEkXORnV4CPJSxiaf1h8KXBItjBMIlRDOne30HrDmbQr+4vyvYewYIDh+4EUn0/Wue7YK+0pycm9afmpyAGCS9TYOffmm4B9uFBMDb; 25:B7S3PEIOGruqb0AAZa0+hl6SLzYypQt5SeuJScrRFl7R6K8qAmCuokJATkNwOIuOPrZQI8OmMhjNZgglvrTWuKpAGUYi58ltyRTcEeVxmIaL4zAbi+sAxMNid+F2BNg6eQGoYHjYzMShOVmopnMNlhJBJlW6yT3J0uFqL8HzRX2IlWsTGQiRiD+YZTWqec1ORUldAuULZjV6QeuS0wfuhW8atzHih8aXatPmJqJQtCdZAezQab7OUx92aqMiXk/rkDJ0955FaWa0qsYlE37aKrL3ElIPo51W5iXpGu/1sYBuDkilnD1HeMHmxsqfUFnKExytGzodQxlDvZATqVPFQFHfhe3AFznnfsVuGsel7ttvnVXRZGAPCWk1GHIuB6c0Ns1/RLr8ksE0P9GrlaFQSN0zK7y80r82JOv6rkhTe/M= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY4PR07MB2951; X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB2951; 31:q7mU4Y+9myHnaTPoWUoHApYKDOAINyV8TJ09S4M9BS2Wug1Ep3NKI8v4EFcATOFf6i+H8Be3ZfzqHRhUZ2RVUA5/7juUDMu2Ie41T1wwpi+5AS8uBtbtsAdXq6TzBwHo1aksfR3AIBzS+ARdKL5IbSLwlDsoGZKY39hOc/Uznq6Gd9bi4e7iEop7iIKd4czWdjiKUCdDXmja5r04h1jDxSj2LfaxdqpsU8SAW0JXfco=; 20:X5h7d+G5wu331mKamayrzUF3Fb6oZhSGNK5rqmFmO66WpD5LidxgsSbWyxM9MnWrKcEVsq1qTyDufrY8pZqZ54M2d3fsPHaKQVkHtfMoXeOO4nHGHLbBRNXCSj2VQWF4qYye3PEhrt8ANSCDoEFg48ZDE9fb1NI/Vn6UvLkKP4/xvMIaCbLNEOiErQF7aWCyFbe288PcWOLaZCUjSPA8OfCdbCSermYNCYNys8Eg5bpSnIaO+b+JoAvty42W5fUwHMpSK72BJbIEnvYF7FU+Wg/uhkLQFBaRDgeQXSiKwRy5E9lRoGe57f1USDlEnqZeg+05gUl8/N2E903kZvxTwgI/ai6Ni5AFK3tko4yqycIC8Db0s1Z0JaHGphmLkSLySC1zJ6vvwvdgxObp4t4oJIublsfWpkHuRzLr9Jz70RSrGe0rrSh79DLGWECrqbwR8m/x2IsZMKqpxIVDPANv9aLubmEXaLW+XH/M+8LvCD5t6tR1w9V2iCilzfp7MwABMg7l/8Ln4074/FNkq/FYuNee7lTDn/n58T/FxmKlaImlT8FpXj40O7ruJ0lWk8sNQvQBHiEDxGfiDdGALBgVsOcKdS8ByHv9Tq468/gmN8g= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040176)(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046); SRVR:CY4PR07MB2951; BCL:0; PCL:0; RULEID:; SRVR:CY4PR07MB2951; X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB2951; 4:JH/oSSiAnu0lXcPWrn+E6vKwG2Fi0Z8fOQnM1P97CxV4jleeoSs/1HORBbbbEf+pYR7YDio2oqXz8/XNHtrED9TOyjpbMB4E/81vgjNk7CK+AOuyHBWrP95FSUTYJE4JVbzzEcAPHxE0IZ2/6HmxkVN/UdlxqWC6qhtkEufnrmfxSMYjF92X/Sl30Y0tQssunaDFGfuPJ8URDi5WRIkNwKqs79GSkR+X4lm7Yqyb209BDhWeoUWdO3xnHHrZJo0IOERqmAefs2fNOHwEw4lhBvQIluizPVs164VIP/VqtB0KjaOfRscQzlkWaLhgYr4RG0EF61HC8fliyfvIS0FgMAvy1kNs53ymE5BGaNKSQHoKJi6bbAZMOfr0OMfFj64+lzTAe4yW2MCYgL0AUbc4qA== X-Forefront-PRVS: 0039C6E5C5 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(6009001)(6069001)(7916002)(189002)(199003)(47776003)(33646002)(48376002)(50226002)(7846002)(5001770100001)(586003)(7736002)(4326007)(97736004)(101416001)(19580405001)(66066001)(305945005)(50466002)(5003940100001)(107886002)(2950100001)(189998001)(3846002)(76176999)(19580395003)(6116002)(4001450100002)(42186005)(4001430100002)(36756003)(2201001)(575784001)(77096005)(81166006)(8676002)(229853001)(106356001)(81156014)(105586002)(50986999)(92566002)(68736007)(2906002)(5660300001); DIR:OUT; SFP:1101; SCL:1; SRVR:CY4PR07MB2951; H:localhost.localdomain; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: cavium.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY4PR07MB2951; 23:OyOKdsUON8fMtiP5YCZsxQvLH9aKwJ74EgasdQiLH?= =?us-ascii?Q?WVixbCsjytdh2OIzqH0mTVReg+3bnVSSAHhYGAr5QGfcZhgNRfqqByAb0aPh?= =?us-ascii?Q?tdNKEOzqs5YYDbIBlcbFwEIeU2oA74kwPw0xPY+UwOgli0h8Oi1+uS+ku848?= =?us-ascii?Q?Tf8LD4v9pAJwYxB78FOz1Dj6oIWwVPPSCGIU8cVsf4OmGTwOqyXgAgnTo5qQ?= =?us-ascii?Q?S2U2Lnp0lnL9Hg+G/pHYeFhxMDC8MiZvBzgam9Y3M1ajBUq3jWfeh5IOKQ+d?= =?us-ascii?Q?CwuqkUpVL/M7RKcKVLh1fxQbXqL0XQC014YyLp0VNU/REwpz3XpEnlLQxjCc?= =?us-ascii?Q?eTVJ/UTZt6aSchbwLrCX9sZwum55rMkK+wC69SCjhp6IfMoiQxvN8cYTAvIz?= =?us-ascii?Q?nRhlRiYK5dKkxYHebk6lmm87q43WAotZnpZjZZ3gpkW7WlubYXLXzgZx5DWF?= =?us-ascii?Q?ggg8KlyXrXjlPLDXt6lNOymInZnfNDW8K/42rsn8/CmiXTfVpu8OE8lM/6l7?= =?us-ascii?Q?WwB5tpPm6DvXRVTQYKMXFXmaN7I4aIkwgfDvoQGK5Tv69WUXLSkyaM2hQCcU?= =?us-ascii?Q?59OvZnU3qa81LyR1dKemfPppLzuQYeQdpJfMaKdVpA7QPUwnpcpLFYMSpowe?= =?us-ascii?Q?Kb9PQ5fLclsMmNFOxFtSwPp2tq4eQuQuhsI4i4Wwoe3uB7Kr17vabY2+iib4?= =?us-ascii?Q?cM/ded5xpaJX9aps56u364npr962VWNhShsCL+aag+s79hWdURv0yAa6V6LV?= =?us-ascii?Q?sEyAhhMIgOxkMo+v4S13pAND5L+jfJEg8UgWjuJaqPy7ARuv38paGkvvt90n?= =?us-ascii?Q?dAb0w97Lc5glegf26NpplxaTTw1TuhZ143C5inmK0liUleOras6c8HI/MEXq?= =?us-ascii?Q?hvsBcsIjngg4Ps8htui8aOojb4Wbo17XwJLlDEzNfX0GMhGw0Lw7G34y+ok4?= =?us-ascii?Q?XZU1T1YEOxEteDxD9M1kWuQ5Fmvfc/hGVLO5PP7j7skVPYLq0PVsJ3TqDpEm?= =?us-ascii?Q?0eEhoGmHFXQwD+L6ExWjXBFRoZRYr2lk6MsmJ+/Pm6oRy5oYRXKDwtoW4+1k?= =?us-ascii?Q?h1V7frhMBH2DmzHTQ7NlAAyp3uocwZNKIWDpHW5awz8wr2Run+j6jOgch6Th?= =?us-ascii?Q?k7qzvb6EDzIgMTrdT5wnow6M0f3URiI+SuD5iejwemz1TZp14OF4aMJJDh8l?= =?us-ascii?Q?evNTrDc5Kiwo17sX7QgsMpFFi9NtkwVu4C0?= X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB2951; 6:/TkspfG2yMXFFuJcuWa8juNUW+5Z/X+SHwC2FvzqemrEWbvDkSizlVLk6aehZz9izDPpA46tdFl/v3MJff80t55aFv9KEDScEh7XJdV0HIiivQbuGX/gsxU3vQmD5w6g0v2ppjrtAfT6Ng7ml0tDfV2HmqHUREacsfp1bRRE4S/HuAXt8H0frKAhKl+e7rFpshEpDOeM6T83ES5zAOtRBp/JPPCBYlZMiBFOtGY/dlvwfX2kYoc/tdITIvNZzTuoZx/DJ1hXI9SlRjULh1z35TROBO+rhIl/9bFhx2D9xgw=; 5:teE2pplOkbg7f4qsr2XltQdmPsbQjhXAEqINEnWBDsKFwzT+EIvGVLkU1dcFG4BzARTB80uBxUHTbLvrL8ASmCROeewQsZ5qi5/YmoglQLWknigk82LYVJZdN97fcXU1ute+eYksFjUuwJI2BCa3oA==; 24:1nUnBub6JyNGeflIIhWokIVqQBNqBo8YHMB4IUnOB9n7tG9f23VSYeF7rx6O727j4jv1uvSxDQnnB9Epljyzu8UIbL9rxSRMMZwH/0uDc+o=; 7:WTd7Zxj4Ha4t4uDULoHvvj6GbjZz9qyQhyXSzQMz9Km6iCddc0KCb7D40xamiyQ0HA1LkATEgW5XLfl05LyV78KngJrhrHzfLLjniuhS+WmMYA2MYMCeenyPxZKZ8zGEym6927MLDIJ4dGTGrPGWqAeR2QiNfLJwKA84yX6/JZ4dHxaya/cBardwtwKOVElbtpaU5CUCla/C8VWnhCseO/W3HfSV+V/5snRt1w/7Fea0zjD5hWEfJbVtAcgWPHVS SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Aug 2016 22:33:04.8722 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY4PR07MB2951 Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org The Cavium ThunderX SoC has a hardware random number generator. This driver provides support using the HWRNG framework. Signed-off-by: Omer Khaliq Signed-off-by: Ananth Jasty Acked-by: David Daney --- drivers/char/hw_random/Kconfig | 13 +++++ drivers/char/hw_random/Makefile | 1 + drivers/char/hw_random/cavium-rng-vf.c | 102 ++++++++++++++++++++++++++++++++ drivers/char/hw_random/cavium-rng.c | 103 +++++++++++++++++++++++++++++++++ 4 files changed, 219 insertions(+) create mode 100644 drivers/char/hw_random/cavium-rng-vf.c create mode 100644 drivers/char/hw_random/cavium-rng.c diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig index 56ad5a5..fb9c7ad 100644 --- a/drivers/char/hw_random/Kconfig +++ b/drivers/char/hw_random/Kconfig @@ -410,6 +410,19 @@ config HW_RANDOM_MESON If unsure, say Y. +config HW_RANDOM_CAVIUM + tristate "Cavium ThunderX Random Number Generator support" + depends on HW_RANDOM && PCI && (ARM64 || (COMPILE_TEST && 64BIT)) + default HW_RANDOM + ---help--- + This driver provides kernel-side support for the Random Number + Generator hardware found on Cavium SoCs. + + To compile this driver as a module, choose M here: the + module will be called cavium_rng. + + If unsure, say Y. + endif # HW_RANDOM config UML_RANDOM diff --git a/drivers/char/hw_random/Makefile b/drivers/char/hw_random/Makefile index 04bb0b0..5f52b1e 100644 --- a/drivers/char/hw_random/Makefile +++ b/drivers/char/hw_random/Makefile @@ -35,3 +35,4 @@ obj-$(CONFIG_HW_RANDOM_XGENE) += xgene-rng.o obj-$(CONFIG_HW_RANDOM_STM32) += stm32-rng.o obj-$(CONFIG_HW_RANDOM_PIC32) += pic32-rng.o obj-$(CONFIG_HW_RANDOM_MESON) += meson-rng.o +obj-$(CONFIG_HW_RANDOM_CAVIUM) += cavium-rng.o cavium-rng-vf.o diff --git a/drivers/char/hw_random/cavium-rng-vf.c b/drivers/char/hw_random/cavium-rng-vf.c new file mode 100644 index 0000000..8e80bce --- /dev/null +++ b/drivers/char/hw_random/cavium-rng-vf.c @@ -0,0 +1,102 @@ +/* + * Hardware Random Number Generator support for Cavium, Inc. + * Thunder processor family. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 2016 Cavium, Inc. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct cavium_rng { + struct hwrng ops; + void __iomem *result; +}; + +/* Read data from the RNG unit */ +static int cavium_rng_read(struct hwrng *rng, void *dat, size_t max, bool wait) +{ + struct cavium_rng *p = container_of(rng, struct cavium_rng, ops); + unsigned int size = max; + + while (size >= 8) { + *((u64 *)dat) = readq(p->result); + size -= 8; + dat += 8; + } + while (size > 0) { + *((u8 *)dat) = readb(p->result); + size--; + dat++; + } + return max; +} + +/* Map Cavium RNG to an HWRNG object */ +static int cavium_rng_probe_vf(struct pci_dev *pdev, + const struct pci_device_id *id) +{ + struct cavium_rng *rng; + int ret; + + rng = devm_kzalloc(&pdev->dev, sizeof(*rng), GFP_KERNEL); + if (!rng) + return -ENOMEM; + + /* Map the RNG result */ + rng->result = pcim_iomap(pdev, 0, 0); + if (!rng->result) { + dev_err(&pdev->dev, "Error iomap failed retrieving result.\n"); + return -ENOMEM; + } + + rng->ops.name = "cavium rng"; + rng->ops.read = cavium_rng_read; + rng->ops.quality = 1000; + + pci_set_drvdata(pdev, rng); + + ret = hwrng_register(&rng->ops); + if (ret) { + dev_err(&pdev->dev, "Error registering device as HWRNG.\n"); + return ret; + } + + return 0; +} + +/* Remove the VF */ +void cavium_rng_remove_vf(struct pci_dev *pdev) +{ + struct cavium_rng *rng; + + rng = pci_get_drvdata(pdev); + hwrng_unregister(&rng->ops); +} + +static const struct pci_device_id cavium_rng_vf_id_table[] = { + { PCI_DEVICE(PCI_VENDOR_ID_CAVIUM, 0xa033), 0, 0, 0}, + {0,}, +}; +MODULE_DEVICE_TABLE(pci, cavium_rng_vf_id_table); + +static struct pci_driver cavium_rng_vf_driver = { + .name = "cavium_rng_vf", + .id_table = cavium_rng_vf_id_table, + .probe = cavium_rng_probe_vf, + .remove = cavium_rng_remove_vf, +}; +module_pci_driver(cavium_rng_vf_driver); + +MODULE_AUTHOR("Omer Khaliq"); +MODULE_LICENSE("GPL"); diff --git a/drivers/char/hw_random/cavium-rng.c b/drivers/char/hw_random/cavium-rng.c new file mode 100644 index 0000000..7f09ee4 --- /dev/null +++ b/drivers/char/hw_random/cavium-rng.c @@ -0,0 +1,103 @@ +/* + * Hardware Random Number Generator support for Cavium Inc. + * Thunder processor family. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 2016 Cavium, Inc. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define THUNDERX_RNM_ENT_EN 0x1 +#define THUNDERX_RNM_RNG_EN 0x2 + +struct cavium_rng_pf { + void __iomem *control_status; +}; + + +/* Enable the RNG hardware and activate the VF */ +static int cavium_rng_probe(struct pci_dev *pdev, + const struct pci_device_id *id) +{ + struct cavium_rng_pf *rng; + int iov_err; + + + rng = devm_kzalloc(&pdev->dev, sizeof(*rng), GFP_KERNEL); + if (!rng) + return -ENOMEM; + + /*Map the RNG control */ + rng->control_status = pcim_iomap(pdev, 0, 0); + if (!rng->control_status) { + dev_err(&pdev->dev, + "Error iomap failed retrieving control_status.\n"); + return -ENOMEM; + } + + /* Enable the RNG hardware and entropy source */ + writeq(THUNDERX_RNM_RNG_EN | THUNDERX_RNM_ENT_EN, + rng->control_status); + + pci_set_drvdata(pdev, rng); + + /* Fix for improper link id reported for cn88XX */ + if (pdev->subsystem_device == 0xa118) + pci_sriov_fdl_override(pdev, pdev->devfn); + + /* Enable the Cavium RNG as a VF */ + iov_err = pci_enable_sriov(pdev, 1); + if (iov_err != 0) { + dev_err(&pdev->dev, + "Error initializing RNG virtual function,(%i).\n", + iov_err); + return iov_err; + } + + return 0; +} + +/* Disable VF and RNG Hardware */ +void cavium_rng_remove(struct pci_dev *pdev) +{ + struct cavium_rng_pf *rng; + + rng = pci_get_drvdata(pdev); + + /* Remove the VF */ + pci_disable_sriov(pdev); + + /* Disable the RNG hardware and entropy source */ + writeq(0, rng->control_status); +} + +static const struct pci_device_id cavium_rng_pf_id_table[] = { + { PCI_DEVICE(PCI_VENDOR_ID_CAVIUM, 0xa018), 0, 0, 0}, /* Thunder RNM */ + {0,}, +}; + +MODULE_DEVICE_TABLE(pci, cavium_rng_pf_id_table); + +static struct pci_driver cavium_rng_pf_driver = { + .name = "cavium_rng_pf", + .id_table = cavium_rng_pf_id_table, + .probe = cavium_rng_probe, + .remove = cavium_rng_remove, +}; + +module_pci_driver(cavium_rng_pf_driver); +MODULE_AUTHOR("Omer Khaliq"); +MODULE_LICENSE("GPL");