2006-05-12 10:33:25

by Michael Büsch

[permalink] [raw]
Subject: [patch 5/9] Add Geode HW RNG driver

Signed-off-by: Michael Buesch <[email protected]>
Index: hwrng/drivers/char/hw_random/Kconfig
===================================================================
--- hwrng.orig/drivers/char/hw_random/Kconfig 2006-05-08 00:11:59.000000000 +0200
+++ hwrng/drivers/char/hw_random/Kconfig 2006-05-08 00:12:08.000000000 +0200
@@ -35,3 +35,16 @@
module will be called amd-rng.

If unsure, say Y.
+
+config HW_RANDOM_GEODE
+ tristate "AMD Geode HW Random Number Generator support"
+ depends on HW_RANDOM && (X86 || IA64) && PCI
+ default y
+ ---help---
+ This driver provides kernel-side support for the Random Number
+ Generator hardware found on AMD Geode based motherboards.
+
+ To compile this driver as a module, choose M here: the
+ module will be called geode-rng.
+
+ If unsure, say Y.
Index: hwrng/drivers/char/hw_random/Makefile
===================================================================
--- hwrng.orig/drivers/char/hw_random/Makefile 2006-05-08 00:11:52.000000000 +0200
+++ hwrng/drivers/char/hw_random/Makefile 2006-05-08 00:12:03.000000000 +0200
@@ -5,3 +5,4 @@
obj-$(CONFIG_HW_RANDOM) += core.o
obj-$(CONFIG_HW_RANDOM_INTEL) += intel-rng.o
obj-$(CONFIG_HW_RANDOM_AMD) += amd-rng.o
+obj-$(CONFIG_HW_RANDOM_GEODE) += geode-rng.o
Index: hwrng/drivers/char/hw_random/geode-rng.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ hwrng/drivers/char/hw_random/geode-rng.c 2006-05-08 00:12:03.000000000 +0200
@@ -0,0 +1,129 @@
+/*
+ * RNG driver for AMD Geode RNGs
+ *
+ * Copyright 2005 (c) MontaVista Software, Inc.
+ *
+ * with the majority of the code coming from:
+ *
+ * Hardware driver for the Intel/AMD/VIA Random Number Generators (RNG)
+ * (c) Copyright 2003 Red Hat Inc <[email protected]>
+ *
+ * derived from
+ *
+ * Hardware driver for the AMD 768 Random Number Generator (RNG)
+ * (c) Copyright 2001 Red Hat Inc <[email protected]>
+ *
+ * derived from
+ *
+ * Hardware driver for Intel i810 Random Number Generator (RNG)
+ * Copyright 2000,2001 Jeff Garzik <[email protected]>
+ * Copyright 2000,2001 Philipp Rumpf <[email protected]>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/pci.h>
+#include <linux/hw_random.h>
+#include <asm/io.h>
+
+
+#define PFX KBUILD_MODNAME ": "
+
+#define GEODE_RNG_DATA_REG 0x50
+#define GEODE_RNG_STATUS_REG 0x54
+
+/*
+ * Data for PCI driver interface
+ *
+ * This data only exists for exporting the supported
+ * PCI ids via MODULE_DEVICE_TABLE. We do not actually
+ * register a pci_driver, because someone else might one day
+ * want to register another driver on the same PCI id.
+ */
+static struct pci_device_id pci_tbl[] = {
+ { PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_LX_AES,
+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, },
+ { 0, }, /* terminate list */
+};
+MODULE_DEVICE_TABLE(pci, pci_tbl);
+
+
+static int geode_rng_data_read(struct hwrng *rng, u32 *data)
+{
+ void __iomem *mem = (void __iomem *)rng->priv;
+
+ *data = readl(mem + GEODE_RNG_DATA_REG);
+
+ return 4;
+}
+
+static int geode_rng_data_present(struct hwrng *rng)
+{
+ void __iomem *mem = (void __iomem *)rng->priv;
+
+ return !!(readl(mem + GEODE_RNG_STATUS_REG));
+}
+
+
+static struct hwrng geode_rng = {
+ .name = "geode",
+ .data_present = geode_rng_data_present,
+ .data_read = geode_rng_data_read,
+};
+
+
+static int __init mod_init(void)
+{
+ int err = -ENODEV;
+ struct pci_dev *pdev = NULL;
+ const struct pci_device_id *ent;
+ void __iomem *mem;
+ unsigned long rng_base;
+
+ for_each_pci_dev(pdev) {
+ ent = pci_match_id(pci_tbl, pdev);
+ if (ent)
+ goto found;
+ }
+ /* Device not found. */
+ goto out;
+
+found:
+ rng_base = pci_resource_start(pdev, 0);
+ if (rng_base == 0)
+ goto out;
+ err = -ENOMEM;
+ mem = ioremap(rng_base, 0x58);
+ if (!mem)
+ goto out;
+ geode_rng.priv = (unsigned long)mem;
+
+ printk(KERN_INFO "AMD Geode RNG detected\n");
+ err = hwrng_register(&geode_rng);
+ if (err) {
+ printk(KERN_ERR PFX "RNG registering failed (%d)\n",
+ err);
+ goto out;
+ }
+out:
+ return err;
+}
+
+static void __exit mod_exit(void)
+{
+ void __iomem *mem = (void __iomem *)geode_rng.priv;
+
+ hwrng_unregister(&geode_rng);
+ iounmap(mem);
+}
+
+subsys_initcall(mod_init);
+module_exit(mod_exit);
+
+MODULE_AUTHOR("The Linux Kernel team");
+MODULE_DESCRIPTION("H/W RNG driver for AMD Geode chipsets");
+MODULE_LICENSE("GPL");

--


2006-05-12 11:05:48

by David Vrabel

[permalink] [raw]
Subject: Re: [patch 5/9] Add Geode HW RNG driver

[email protected] wrote:
> Signed-off-by: Michael Buesch <[email protected]>
> Index: hwrng/drivers/char/hw_random/Kconfig
> ===================================================================
> --- hwrng.orig/drivers/char/hw_random/Kconfig 2006-05-08 00:11:59.000000000 +0200
> +++ hwrng/drivers/char/hw_random/Kconfig 2006-05-08 00:12:08.000000000 +0200
> @@ -35,3 +35,16 @@
> module will be called amd-rng.
>
> If unsure, say Y.
> +
> +config HW_RANDOM_GEODE
> + tristate "AMD Geode HW Random Number Generator support"
> + depends on HW_RANDOM && (X86 || IA64) && PCI
^^^^^^^
IA64?

> + default y
> + ---help---
> + This driver provides kernel-side support for the Random Number
> + Generator hardware found on AMD Geode based motherboards.
> +
> + To compile this driver as a module, choose M here: the
> + module will be called geode-rng.

You need to state which members of the Geode family have this hardware.
e.g., Is it only the Geode LX CPUs?

David Vrabel

2006-05-12 20:41:12

by Michael Büsch

[permalink] [raw]
Subject: Re: [patch 5/9] Add Geode HW RNG driver

On Friday 12 May 2006 13:05, you wrote:
> [email protected] wrote:
> > Signed-off-by: Michael Buesch <[email protected]>
> > Index: hwrng/drivers/char/hw_random/Kconfig
> > ===================================================================
> > --- hwrng.orig/drivers/char/hw_random/Kconfig 2006-05-08 00:11:59.000000000 +0200
> > +++ hwrng/drivers/char/hw_random/Kconfig 2006-05-08 00:12:08.000000000 +0200
> > @@ -35,3 +35,16 @@
> > module will be called amd-rng.
> >
> > If unsure, say Y.
> > +
> > +config HW_RANDOM_GEODE
> > + tristate "AMD Geode HW Random Number Generator support"
> > + depends on HW_RANDOM && (X86 || IA64) && PCI
> ^^^^^^^
> IA64?

I have no idea. I neither wrote the driver, nor do I have the device.
So, drop IA64?

> > + default y
> > + ---help---
> > + This driver provides kernel-side support for the Random Number
> > + Generator hardware found on AMD Geode based motherboards.
> > +
> > + To compile this driver as a module, choose M here: the
> > + module will be called geode-rng.
>
> You need to state which members of the Geode family have this hardware.
> e.g., Is it only the Geode LX CPUs?

Well, no idea. It was not stated in the existing old help text either.

--
Greetings Michael.

2006-05-12 21:06:50

by David Vrabel

[permalink] [raw]
Subject: Re: [patch 5/9] Add Geode HW RNG driver

Michael Buesch wrote:
> On Friday 12 May 2006 13:05, you wrote:
>> [email protected] wrote:
>>> Signed-off-by: Michael Buesch <[email protected]>
>>> Index: hwrng/drivers/char/hw_random/Kconfig
>>> ===================================================================
>>> --- hwrng.orig/drivers/char/hw_random/Kconfig 2006-05-08 00:11:59.000000000 +0200
>>> +++ hwrng/drivers/char/hw_random/Kconfig 2006-05-08 00:12:08.000000000 +0200
>>> @@ -35,3 +35,16 @@
>>> module will be called amd-rng.
>>>
>>> If unsure, say Y.
>>> +
>>> +config HW_RANDOM_GEODE
>>> + tristate "AMD Geode HW Random Number Generator support"
>>> + depends on HW_RANDOM && (X86 || IA64) && PCI
>> ^^^^^^^
>> IA64?
>
> I have no idea. I neither wrote the driver, nor do I have the device.
> So, drop IA64?

Yes, the AMD Geode CPUs are all x86.

>>> + default y
>>> + ---help---
>>> + This driver provides kernel-side support for the Random Number
>>> + Generator hardware found on AMD Geode based motherboards.
>>> +
>>> + To compile this driver as a module, choose M here: the
>>> + module will be called geode-rng.
>> You need to state which members of the Geode family have this hardware.
>> e.g., Is it only the Geode LX CPUs?
>
> Well, no idea. It was not stated in the existing old help text either.

I checked the datasheets for the Geode GX, Geode LX and Geode NX and
only the Geode LX has an on-chip random number generator. So this
driver must be for the Geode LX only.

David Vrabel

2006-05-15 18:59:44

by Jordan Crouse

[permalink] [raw]
Subject: Re: Add Geode HW RNG driver

On 12/05/06 22:46 +0200, "Michael Buesch" wrote:
> On Friday 12 May 2006 13:05, you wrote:
> > [email protected] wrote:
> > > Signed-off-by: Michael Buesch <[email protected]>
> > > Index: hwrng/drivers/char/hw_random/Kconfig
> > > ===================================================================
> > > --- hwrng.orig/drivers/char/hw_random/Kconfig 2006-05-08 00:11:59.000000000 +0200
> > > +++ hwrng/drivers/char/hw_random/Kconfig 2006-05-08 00:12:08.000000000 +0200
> > > @@ -35,3 +35,16 @@
> > > module will be called amd-rng.
> > >
> > > If unsure, say Y.
> > > +
> > > +config HW_RANDOM_GEODE
> > > + tristate "AMD Geode HW Random Number Generator support"
> > > + depends on HW_RANDOM && (X86 || IA64) && PCI
> > ^^^^^^^
> > IA64?
>
> I have no idea. I neither wrote the driver, nor do I have the device.
> So, drop IA64?

Wow - where did that come from? Yeah, drop it!

> > > + default y
> > > + ---help---
> > > + This driver provides kernel-side support for the Random Number
> > > + Generator hardware found on AMD Geode based motherboards.
> > > +
> > > + To compile this driver as a module, choose M here: the
> > > + module will be called geode-rng.
> >
> > You need to state which members of the Geode family have this hardware.
> > e.g., Is it only the Geode LX CPUs?
>
> Well, no idea. It was not stated in the existing old help text either.

Its just the Geode LX - that help text should be more specific in that
regard.

Regards,
Jordan

--
Jordan Crouse
Senior Linux Engineer
AMD - Personal Connectivity Solutions Group
<http://www.amd.com/embeddedprocessors>