From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932657AbcHXACR (ORCPT ); Tue, 23 Aug 2016 20:02:17 -0400 Received: from mail-bl2nam02on0071.outbound.protection.outlook.com ([104.47.38.71]:27168 "EHLO NAM02-BL2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753364AbcHXACP (ORCPT ); Tue, 23 Aug 2016 20:02:15 -0400 X-Greylist: delayed 2075 seconds by postgrey-1.27 at vger.kernel.org; Tue, 23 Aug 2016 20:02:14 EDT Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Omer.Khaliq@cavium.com; From: Omer Khaliq To: , , , , , , , , , CC: Omer Khaliq Subject: [PATCH v2 2/2] HWRNG: thunderx: Add Cavium HWRNG driver for ThunderX SoC. Date: Tue, 23 Aug 2016 16:27:15 -0700 Message-ID: <1471994835-2423-3-git-send-email-okhaliq@caviumnetworks.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1471994835-2423-1-git-send-email-okhaliq@caviumnetworks.com> References: <1471994835-2423-1-git-send-email-okhaliq@caviumnetworks.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [50.233.148.156] X-ClientProxiedBy: SN1PR07CA0028.namprd07.prod.outlook.com (10.162.170.166) To MWHPR07MB2957.namprd07.prod.outlook.com (10.169.231.145) X-MS-Office365-Filtering-Correlation-Id: 58ab41fd-4c7e-4faf-5142-08d3cbad21e3 X-Microsoft-Exchange-Diagnostics: 1;MWHPR07MB2957;2:ONTctMs/jYbl/wm3r2ZehA1b/Mz/WI7EFhQ0n2K/zETSFkYPRuc3HeD7ae9QozjtyObV/kuugT2SicCaIL/HwcYlGbfeyYrAkDfE9FoyzxlTsg0vzciWcaHx5xpU2wgW7IMQT6FgRtUBHT4vxEmQ127/fJQjR03E/yxbz9nB5pE8EWaidbxANIRagcjsG+GC;3:xNC+uZmgVV245/zPqJ42zGTy9kWxI5Iy5esOPqUteWHAXdzLzbaaRn1mibveNTvTwHNHw6AULOIL8KRaxRPswUVUsV3aOsJ8dY5Jn/4jK+CUsc7ZdxFkNj/3CB1RGGM+ X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:MWHPR07MB2957; X-Microsoft-Exchange-Diagnostics: 1;MWHPR07MB2957;25:DwwEDaapuu6xwD319Bbdvbt5G6QDEkDkFcOmC2t81FU0HLLUOUMXPQhagtfDI2LbHT5HS6jkHmxp4wCnli/9TAEETuQe0yO9KVfNZDZtc8FmdCGW6DN7ZBV9Z/kNeM4DpoXUJcBwPMq6jyPZHhEcSAoaEFWjDyooXpJno0h4RG323qgg1X1VgX2t8FY165JlxTPGx4vF3mylOdQowbIE9E0k0EAvLt1S0Bf9+eMspeRGYJL3kv61ousUtN+r5/nip7HUc40I+F82NzCi5jnXMzuc4bBkWJXXdA2srGXACS0jKiwnBR6vD7LLFnNmS8VFhvLzBKL+fiIccCXqGD76DsVSPuWLCWjrwzE5ihKP8FVUGYlek8sj3ptruhtg7dsNj/j0KUa7sqrGT3TFkNCu0PKPlc1gn7ldi1r3BGl9VkNYJyC0gYri9iLMQORCfat+7cTR4TykdaDiw+Kj91b5D133drqh6KSExb8UwXTsaipUPCHQxJimM5r+NGqlE21BNzq38AeLn0K1eKlrascVH1ax48A2ZKa7uJPEeCUlRohb1GNeQfXAjrzJXADXOd0SlfiOXWxwp87bNKBQ89uUU7yjv+WdduMEl/O91Oy7HNwQPcrqTMIL4ssNnD/o0QUCWLcEpDoW1nCBQWsDoAWXDDykSo8U99nBjmCKJjt/T0g+vd5VQhB14CXtttHBtmgCG68ateWt3wudi4RIT7sVH2lYj9lyF9OD1J0KFbkqElRqy3InMtV5A7b6UX56gN7S X-Microsoft-Exchange-Diagnostics: 1;MWHPR07MB2957;31:mq4kpkNIy193hbMEFZNpYkiiOUaHvw6dSOoj7+rbOwg/g3JYaqK1ukPAKMEjw5PRZ12/tVBbuIQWMme4sZnnALlrS1q2mwaJgtW+7kI5aJUc60SBf9k6y+0RyN5zPSY7qj8dLAMmnuCiQZz8nZ5z3xJeTWMb2bGP30GQjvAy2rWntUCKlF9T9VsDoNVfW2F7yqOZNYZgw29v/LooJE1zKhXRtvrZgv4Bw3z7PlcV5Ds=;20:1AEkLSeimu03t6uowvQ9WtJEgi++O5emovZ+vUwdMsO7sUlCXIQogKXhoHCXPGujXXLa6Jiv7xSgnPTlSalxP1MQU65mVUJrxhtBcqeI9JRNz/23Zoj9ZzSIptwK6vBALu+M4Pmo50v8a5x9/rCr3ibtG2uEd7u/YJQh43ZhIuNJcTBX1ELfqnSQCLO30ghZbtASYrRNlholwqFZ0xRwn5DIUgKdlSli9hgUdkqBS9IDa8KuqAHeUkmqJZydiFhd2fZK5+8opZjPjRB6RhyK8p2o/VTG5X0e0kWL/TuMmOLDhRITnWOHiVC05uLfCs3yZWu/tu6CIAC1JTqo1fYy0tJKjFYyV2y5ClEuPKa/5hvtpzUD2Ms1AZiy8mcjh5axD2C9pmxxTvqRq8r/PdrkI4W65yhw8meWl6HdmGTgTRuW33X4lX3rOh/ESUaa/2SwpuCbqbI0spJuh3LJErimH5N0SPsmOVkrxfsDk6zJ2CBwGRn4VQe0GsS/f3VIdrLwTgX40+da0+EUvxsRT9QiFvqz+p6Ry5kgYKoQNGZcjvXlO81p3SbT6YzRSg6LUg/i5IlkXqOu3Mamqos9iAkC7Qp4kh36GXLgu2jxcfb3/+g= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040176)(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046);SRVR:MWHPR07MB2957;BCL:0;PCL:0;RULEID:;SRVR:MWHPR07MB2957; X-Microsoft-Exchange-Diagnostics: 1;MWHPR07MB2957;4:hULumkcDzUao4mzryfOdX/ERGyD5LMWZJfdyViXGhksCkXfgm9BaIUtdul9t0C/kNLqL3c5EMCkty4dtSG5ZKn75U1/AxBKIW4EO35tOfWf3hd/Z7PB+/Ka+lzxbc1WrbWodrmyCZf1pzW4CvCMbuMAEDc/FGiXhTZWw0PoxT2mA9pGUYO2+GGE3BbjMGANXlM4mGNl0YVZyVK9AjPJ19WVWUfCFyWC/Du37Q0mfT0nQntldMMHoJo3pzUTyZkzfocC9DzljeMlC6tQTsf4vggFZKSofXutinA6pppea6P4Ya2OeWl1ogshWYJGICcIAi3JKjuksJE2WliAT6M4B9S97BI2JLOxjz195ppxBGmi8qQAZIc3P0/N7yuJDtiovvM8Gn3VyhmWbioewC3zv3A== X-Forefront-PRVS: 004395A01C X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(6069001)(7916002)(189002)(199003)(33646002)(2906002)(81166006)(6116002)(4001430100002)(3846002)(586003)(305945005)(42186005)(50226002)(68736007)(2201001)(101416001)(19580405001)(48376002)(7736002)(76176999)(2950100001)(575784001)(105586002)(36756003)(19580395003)(50986999)(81156014)(7846002)(97736004)(106356001)(47776003)(77096005)(92566002)(5003940100001)(8676002)(66066001)(189998001)(107886002)(4326007)(50466002)(229853001)(5001770100001)(5660300001)(921003)(83996005)(1121003)(2101003);DIR:OUT;SFP:1101;SCL:1;SRVR:MWHPR07MB2957;H:localhost.localdomain;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;MWHPR07MB2957;23:5rFAPtb+ntkYNEcYQABGIe2u025QBZuIxdP+i4ecN?= =?us-ascii?Q?QDyeorypqCnzNveKQUDVhJmhSwUAHrLl0v1kn7GQLWnNFwZwPKLwvrvSdGgh?= =?us-ascii?Q?756MzsKoZF0Ej1u+Nz/Z9Qqxa7APv0pfsPYw5EpfL5Ku4roAbAu/XVmaS4bo?= =?us-ascii?Q?s587ASovCK+PRX8Q7t6Yya3aUmvLwKfGkkW1fz4A3NKCmsLR0nWwMM51H3cu?= =?us-ascii?Q?8NjBvotZkUujq7u4B/no8+uNFGgYZVAawGWDG3TOayt7KDXT2DXQjugzbZn7?= =?us-ascii?Q?S7SuVzDLc0CyrLcvrLmmbuf1qOhvJDCmUAlXVyq2SHJSFQj4gUhKorslLHBO?= =?us-ascii?Q?ScfrLFcyRZBMUUYRk5uGV9J6cnbzz34jrZ5oXqyR6feqv5XGVhOk+bK8ePMu?= =?us-ascii?Q?/J+hK0aJLlE1diiCaGtsUSkbPAd/FKu0hxMEzHlCyk7jCXtLxB+ahJiJ0A5j?= =?us-ascii?Q?68rrxldZ3k2NL53batN8WkZ2w8c19FAIeffUbXPJXRkf6J9SEvhYyOYEvjoU?= =?us-ascii?Q?zfVChl/U8CLODB5SuAtqItMWgt/ByHQ71AWbF9C6ubyEAYmIH1Ps8y581eHp?= =?us-ascii?Q?KiGkhZls2U/yysE/oDg26I8mAof+52SkMqSrdNvhnHZO+IzJvPFZfoU2M4Bu?= =?us-ascii?Q?3EU/RRJWAJ4guB/DH8FQgoUvB7dBHKiktkEz3RI10xFBGGIJJ8oc0uXI+l1g?= =?us-ascii?Q?GpP1nI10ccTLJt7APkXkx/yEOoIJuzhTGeUoH4IFVXZknnHy4zy1uHHEQm2F?= =?us-ascii?Q?6z7kY+2sAvhhhZaUSWtUKFndUX6Q8ErVqnxKIdMh06Xy6IlekfD+8jEKri1C?= =?us-ascii?Q?5ei0oSuodVx4Blb4GU1hqGrlw83a5I6Gk4yo63qOxVJJmIgIh54LxwizD7+l?= =?us-ascii?Q?1y4l27inXJoCK0m5QCsP3trZPvmK1OU/ZkZfUy4NlrTkysrP9fzUulQjXuz7?= =?us-ascii?Q?gTn25uVeov8qgyzZwKjzzAEkyWcFzoxFmiU/sZsPX2FsMzm314ANtB0CsIjb?= =?us-ascii?Q?MnArkfHpHXfwtLwnHoTlw/nSfLS6UUOn+N3VDFaLjW061dIyDKFYKauSPaBB?= =?us-ascii?Q?JhgTMAB4YCFAJKWjnN8CfBe/+kHMovABNjvY365xvw6bGWnpa90B52PHT04N?= =?us-ascii?Q?mdDyt0fJYWH86RYBJV+8lBwjTgYdwr9enPZHNNaPC8f+04Q9M5ZriOkZhGIz?= =?us-ascii?Q?6ULQTdNyIrRtKL5cNvlf/pq8MK+zFnxI4/QTYY0OhjVhSW7sYZ1o6lk0o3Q/?= =?us-ascii?Q?JZlyeJgrucyfBc+bZU=3D?= X-Microsoft-Exchange-Diagnostics: 1;MWHPR07MB2957;6:/OBmdFwcjq4hJXDqg4HHpN1ka9N1COA0FLRIVCWvGbNBvTqrccy+buGoDoZ00E/x158IUw6nzFiMvIx8RQgiWgWNtBnxp60PYwAXkdp1t5QdC7VdIW4WPom4f9dvDQUgL2GCFLNy29ty3NjL42HCKP/0GOAiu1YvwquJylqwJf+33rqp6GLbBN/IE0wa811w8sy5fapNTC//nXkyPheYObUb9E6SdO4UKnn9w2YJn4darxj5YiM5oO2uc7ssmEfqdTlRQp5r0EtkGMvpa+IAVP8BSOLBRr7aE3uIIDX8lD0=;5:Eh51LGogFUeLJvVQM7ugrVLmZjgvNSufE/E/VJd/smwirwCm0i/uuqU/eG1CW+0rz37zLKG1gdIrOBZPqWVaLxBBe9saUfFQatwXkiP34AlsGISPx04t9BNBPhX7DfGC1G6wP3QRiSL0q29fKlAEBA==;24:Nhg6JXz3gqckupACGEm9uS++6zxqk+VjeBNqBXpnvqTt/Ap0qtkLVdWO0JgfO8r0NQbNSmYl+8X5/CaG2YuUw3mky5dFBZBbbaxziaNmsKg=;7:2Lc813JoE8ie6OeBW8MKoSSeXPgMVn8wmJun+1iRxc0HQXtz4xAET4cimKwzox0iGy180qdpdkkUTR28IV5+pWAvhjYdACMX+QJBdhP+5odtUAA5sL6Eh2o7pE3O/i6QCFUwT88Vr5qarAxgAcfMF9FoVAKudWW4FDFDJP89V4j7JN6nu9zR4uYpcUx6tvsssQ76ul9SR+fjPJ+XKIxK6GMHkIEClcKVXqKTqIKncmKFiOEkqtMwtYE5yweoenhP SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Aug 2016 23:28:03.6218 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR07MB2957 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@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 | 99 ++++++++++++++++++++++++++++++++++ drivers/char/hw_random/cavium-rng.c | 94 ++++++++++++++++++++++++++++++++ 4 files changed, 207 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..066ae0e --- /dev/null +++ b/drivers/char/hw_random/cavium-rng-vf.c @@ -0,0 +1,99 @@ +/* + * 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 + +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..a944e0a --- /dev/null +++ b/drivers/char/hw_random/cavium-rng.c @@ -0,0 +1,94 @@ +/* + * 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 + +#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); + + /* Enable the Cavium RNG as a VF */ + iov_err = pci_enable_sriov(pdev, 1); + if (iov_err != 0) { + /* Disable the RNG hardware and entropy source */ + writeq(0, rng->control_status); + 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"); -- 1.9.1