2 * Hardware Random Number Generator support for Cavium, Inc.
3 * Thunder processor family.
5 * This file is subject to the terms and conditions of the GNU General Public
6 * License. See the file "COPYING" in the main directory of this archive
9 * Copyright (C) 2016 Cavium, Inc.
12 #include <linux/hw_random.h>
14 #include <linux/module.h>
15 #include <linux/pci.h>
16 #include <linux/pci_ids.h>
23 /* Read data from the RNG unit */
24 static int cavium_rng_read(struct hwrng
*rng
, void *dat
, size_t max
, bool wait
)
26 struct cavium_rng
*p
= container_of(rng
, struct cavium_rng
, ops
);
27 unsigned int size
= max
;
30 *((u64
*)dat
) = readq(p
->result
);
35 *((u8
*)dat
) = readb(p
->result
);
42 /* Map Cavium RNG to an HWRNG object */
43 static int cavium_rng_probe_vf(struct pci_dev
*pdev
,
44 const struct pci_device_id
*id
)
46 struct cavium_rng
*rng
;
49 rng
= devm_kzalloc(&pdev
->dev
, sizeof(*rng
), GFP_KERNEL
);
53 /* Map the RNG result */
54 rng
->result
= pcim_iomap(pdev
, 0, 0);
56 dev_err(&pdev
->dev
, "Error iomap failed retrieving result.\n");
60 rng
->ops
.name
= "cavium rng";
61 rng
->ops
.read
= cavium_rng_read
;
62 rng
->ops
.quality
= 1000;
64 pci_set_drvdata(pdev
, rng
);
66 ret
= hwrng_register(&rng
->ops
);
68 dev_err(&pdev
->dev
, "Error registering device as HWRNG.\n");
76 void cavium_rng_remove_vf(struct pci_dev
*pdev
)
78 struct cavium_rng
*rng
;
80 rng
= pci_get_drvdata(pdev
);
81 hwrng_unregister(&rng
->ops
);
84 static const struct pci_device_id cavium_rng_vf_id_table
[] = {
85 { PCI_DEVICE(PCI_VENDOR_ID_CAVIUM
, 0xa033), 0, 0, 0},
88 MODULE_DEVICE_TABLE(pci
, cavium_rng_vf_id_table
);
90 static struct pci_driver cavium_rng_vf_driver
= {
91 .name
= "cavium_rng_vf",
92 .id_table
= cavium_rng_vf_id_table
,
93 .probe
= cavium_rng_probe_vf
,
94 .remove
= cavium_rng_remove_vf
,
96 module_pci_driver(cavium_rng_vf_driver
);
98 MODULE_AUTHOR("Omer Khaliq <okhaliq@caviumnetworks.com>");
99 MODULE_LICENSE("GPL");