brintos

brintos / linux-shallow public Read only

0
0
Text · 2.2 KiB · d9d7b60 Raw
93 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * Hardware Random Number Generator support.4 * Cavium Thunder, Marvell OcteonTx/Tx2 processor families.5 *6 * Copyright (C) 2016 Cavium, Inc.7 */8 9#include <linux/hw_random.h>10#include <linux/io.h>11#include <linux/module.h>12#include <linux/pci.h>13#include <linux/pci_ids.h>14 15#define THUNDERX_RNM_ENT_EN     0x116#define THUNDERX_RNM_RNG_EN     0x217 18struct cavium_rng_pf {19	void __iomem *control_status;20};21 22/* Enable the RNG hardware and activate the VF */23static int cavium_rng_probe(struct pci_dev *pdev,24			const struct pci_device_id *id)25{26	struct	cavium_rng_pf *rng;27	int	iov_err;28 29	rng = devm_kzalloc(&pdev->dev, sizeof(*rng), GFP_KERNEL);30	if (!rng)31		return -ENOMEM;32 33	/*Map the RNG control */34	rng->control_status = pcim_iomap(pdev, 0, 0);35	if (!rng->control_status) {36		dev_err(&pdev->dev,37			"Error iomap failed retrieving control_status.\n");38		return -ENOMEM;39	}40 41	/* Enable the RNG hardware and entropy source */42	writeq(THUNDERX_RNM_RNG_EN | THUNDERX_RNM_ENT_EN,43		rng->control_status);44 45	pci_set_drvdata(pdev, rng);46 47	/* Enable the Cavium RNG as a VF */48	iov_err = pci_enable_sriov(pdev, 1);49	if (iov_err != 0) {50		/* Disable the RNG hardware and entropy source */51		writeq(0, rng->control_status);52		dev_err(&pdev->dev,53			"Error initializing RNG virtual function,(%i).\n",54			iov_err);55		return iov_err;56	}57 58	return 0;59}60 61/* Disable VF and RNG Hardware */62static void cavium_rng_remove(struct pci_dev *pdev)63{64	struct cavium_rng_pf *rng;65 66	rng = pci_get_drvdata(pdev);67 68	/* Remove the VF */69	pci_disable_sriov(pdev);70 71	/* Disable the RNG hardware and entropy source */72	writeq(0, rng->control_status);73}74 75static const struct pci_device_id cavium_rng_pf_id_table[] = {76	{ PCI_DEVICE(PCI_VENDOR_ID_CAVIUM, 0xa018), 0, 0, 0}, /* Thunder RNM */77	{0,},78};79 80MODULE_DEVICE_TABLE(pci, cavium_rng_pf_id_table);81 82static struct pci_driver cavium_rng_pf_driver = {83	.name		= "cavium_rng_pf",84	.id_table	= cavium_rng_pf_id_table,85	.probe		= cavium_rng_probe,86	.remove		= cavium_rng_remove,87};88 89module_pci_driver(cavium_rng_pf_driver);90MODULE_AUTHOR("Omer Khaliq <okhaliq@caviumnetworks.com>");91MODULE_DESCRIPTION("Cavium ThunderX Random Number Generator support");92MODULE_LICENSE("GPL v2");93