cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

powernv-rng.c (1534B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * Copyright 2013 Michael Ellerman, Guo Chao, IBM Corp.
      4 */
      5
      6#define pr_fmt(fmt)	KBUILD_MODNAME ": " fmt
      7
      8#include <linux/module.h>
      9#include <linux/mod_devicetable.h>
     10#include <linux/kernel.h>
     11#include <linux/platform_device.h>
     12#include <linux/random.h>
     13#include <linux/hw_random.h>
     14
     15static int powernv_rng_read(struct hwrng *rng, void *data, size_t max, bool wait)
     16{
     17	unsigned long *buf;
     18	int i, len;
     19
     20	/* We rely on rng_buffer_size() being >= sizeof(unsigned long) */
     21	len = max / sizeof(unsigned long);
     22
     23	buf = (unsigned long *)data;
     24
     25	for (i = 0; i < len; i++)
     26		powernv_get_random_long(buf++);
     27
     28	return len * sizeof(unsigned long);
     29}
     30
     31static struct hwrng powernv_hwrng = {
     32	.name = "powernv-rng",
     33	.read = powernv_rng_read,
     34};
     35
     36static int powernv_rng_probe(struct platform_device *pdev)
     37{
     38	int rc;
     39
     40	rc = devm_hwrng_register(&pdev->dev, &powernv_hwrng);
     41	if (rc) {
     42		/* We only register one device, ignore any others */
     43		if (rc == -EEXIST)
     44			rc = -ENODEV;
     45
     46		return rc;
     47	}
     48
     49	pr_info("Registered powernv hwrng.\n");
     50
     51	return 0;
     52}
     53
     54static const struct of_device_id powernv_rng_match[] = {
     55	{ .compatible	= "ibm,power-rng",},
     56	{},
     57};
     58MODULE_DEVICE_TABLE(of, powernv_rng_match);
     59
     60static struct platform_driver powernv_rng_driver = {
     61	.driver = {
     62		.name = "powernv_rng",
     63		.of_match_table = powernv_rng_match,
     64	},
     65	.probe	= powernv_rng_probe,
     66};
     67module_platform_driver(powernv_rng_driver);
     68
     69MODULE_LICENSE("GPL");
     70MODULE_DESCRIPTION("Bare metal HWRNG driver for POWER7+ and above");