linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RFC v4 00/25] Re-use nvram module
@ 2015-07-12 10:25 Finn Thain
  2015-07-12 10:25 ` [RFC v4 01/25] scsi/atari_scsi: Dont select CONFIG_NVRAM Finn Thain
                   ` (25 more replies)
  0 siblings, 26 replies; 55+ messages in thread
From: Finn Thain @ 2015-07-12 10:25 UTC (permalink / raw)
  To: linux-kernel, linux-m68k, linuxppc-dev


The generic NVRAM module, drivers/char/generic_nvram, implements a
/dev/nvram misc device. It is used only by 32-bit PowerPC platforms and
isn't generic enough to be more widely used.

The RTC NVRAM module, drivers/char/nvram, also implements a /dev/nvram
misc device. It is used by x86, ARM and m68k.

The former module cannot be used on x86, ARM or m68k because it
cannot co-exist with the latter module, partly due to the Kconfig logic.

It is possible to modify the modules so that one kernel binary could
have either, neither or both. However, automatically loading the
appropriate module is then impossible; if both provide the
char-major-10-144 alias then the wrong module will end up being loaded.
Hence a multi-platform kernel binary needs a single generic nvram module
with alias char-major-10-144.

Therefore, drivers/char/nvram.c should be made more generic and the
arch-specific code therein should be moved to a more appropriate
place under arch/. Also, drivers/char/generic_nvram.c should be removed
to reduce code duplication.

In this patch series, Atari-specific code is moved from the nvram module
to arch/m68k/atari. More arch-specific code in the nvram module could
be moved, probably to arch/x86, but it is difficult to determine just
what code is relevant to ARM platforms and what code is x86-only.

In addressing code duplication, this patch series removes three
inconsistent /dev/nvram misc device implementations. One of these,
drivers/macintosh/nvram.c is entirely unused already. The other two,
drivers/char/generic_nvram.c and the misc device implementation in
arch/powerpc/kernel/nvram_64.c, are replaced by drivers/char/nvram.c.

A benefit of this work is better consistency -- between PPC32 and PPC64
as well as between PPC_PMAC and MAC. This new uniformity does have
implications for userspace, that is, some error codes for some ioctl calls
become consistent on all PowerPC platforms.

The drivers/char/nvram module becomes sufficiently generic to be useful
to other platforms and architectures, besides those with "CMOS" RTC. At the
end of this patch series the module is adopted by the m68k Mac port, which
already has PRAM access functions but lacks the /dev/nvram misc device.

This patch series has been compile-tested for arm, m68k, powerpc and x86.
The nvram and thinkpad_acpi modules were regression tested on a ThinkPad T43.
The /dev/nvram functionality was also regression tested on a G3 PowerMac.
The nvram module was also tested on a PowerBook 520 and Quadra 650.
Note that my testing doesn't cover PPC64 or Atari.

Changes since v1:
- Minor changes to patches 7, 15 and 20 as described in commit logs.
- Revised patches 21 and 24 to address comments from Geert.

Changes since v2:
- Dropped patch 1, "macintosh/nvram: Remove as unused", because it has
since been merged.
- Inserted a new patch, "m68k/mac: Use macros for RTC accesses not
magic numbers".
- Revised patches 21 and 23 to address comments from Geert.

Changes since v3:
- Split the patch, "m68k/atari: Move Atari-specific code out of
drivers/char/nvram.c", as suggested by Geert.
- Revised patches 11 and 25 to address comments from Geert.
- Minor change to patch 21 as described in commit log.

---
 arch/m68k/Kconfig                          |    3 
 arch/m68k/Kconfig.machine                  |    2 
 arch/m68k/atari/Makefile                   |    2 
 arch/m68k/atari/nvram.c                    |  291 +++++++++++
 arch/m68k/include/asm/atarihw.h            |    6 
 arch/m68k/include/asm/macintosh.h          |    4 
 arch/m68k/kernel/setup_mm.c                |  100 +++
 arch/m68k/mac/misc.c                       |  207 +++++---
 arch/powerpc/Kconfig                       |    5 
 arch/powerpc/include/asm/nvram.h           |    9 
 arch/powerpc/kernel/nvram_64.c             |  203 +------
 arch/powerpc/kernel/setup_32.c             |   27 -
 arch/powerpc/platforms/chrp/Makefile       |    2 
 arch/powerpc/platforms/chrp/nvram.c        |   14 
 arch/powerpc/platforms/chrp/setup.c        |    2 
 arch/powerpc/platforms/powermac/Makefile   |    5 
 arch/powerpc/platforms/powermac/nvram.c    |    9 
 arch/powerpc/platforms/powermac/setup.c    |    3 
 arch/powerpc/platforms/pseries/nvram.c     |    2 
 drivers/char/Kconfig                       |   13 
 drivers/char/Makefile                      |    6 
 drivers/char/generic_nvram.c               |  174 ------
 drivers/char/nvram.c                       |  742 ++++++++++++-----------------
 drivers/platform/x86/thinkpad_acpi.c       |   20 
 drivers/scsi/Kconfig                       |    6 
 drivers/scsi/atari_scsi.c                  |   16 
 drivers/video/fbdev/controlfb.c            |    4 
 drivers/video/fbdev/imsttfb.c              |    7 
 drivers/video/fbdev/matrox/matroxfb_base.c |    4 
 drivers/video/fbdev/platinumfb.c           |    4 
 drivers/video/fbdev/valkyriefb.c           |    4 
 include/linux/nvram.h                      |   23 
 include/uapi/linux/pmu.h                   |    2 
 33 files changed, 986 insertions(+), 935 deletions(-)





^ permalink raw reply	[flat|nested] 55+ messages in thread

* [RFC v4 01/25] scsi/atari_scsi: Dont select CONFIG_NVRAM
  2015-07-12 10:25 [RFC v4 00/25] Re-use nvram module Finn Thain
@ 2015-07-12 10:25 ` Finn Thain
  2015-07-12 10:25 ` [RFC v4 02/25] char/nvram: Use bitwise OR to obtain Atari video mode data Finn Thain
                   ` (24 subsequent siblings)
  25 siblings, 0 replies; 55+ messages in thread
From: Finn Thain @ 2015-07-12 10:25 UTC (permalink / raw)
  To: linux-kernel, linux-m68k, linuxppc-dev, Arnd Bergmann,
	Greg Kroah-Hartman, James E.J. Bottomley, Michael Schmitz,
	linux-scsi

[-- Attachment #1: atari-nvram-disable --]
[-- Type: text/plain, Size: 4082 bytes --]

On powerpc, setting CONFIG_NVRAM=n builds a kernel with no NVRAM support.
Setting CONFIG_NVRAM=m enables the /dev/nvram misc device module without
enabling NVRAM support in drivers. Setting CONFIG_NVRAM=y enables the
misc device (built-in) and also enables NVRAM support in drivers.

m68k shares the valkyriefb driver with powerpc, and since that driver uses
NVRAM, it is affected by CONFIG_ATARI_SCSI, because of the use of
"select NVRAM".

Adopt the powerpc convention on m68k to avoid surprises.

Signed-off-by: Finn Thain <fthain@telegraphics.com.au>

---

This patch temporarily disables CONFIG_NVRAM on Atari, to prevent build
failures when bisecting the rest of this patch series. It gets enabled
again with the introduction of CONFIG_HAVE_ARCH_NVRAM_OPS, once the
nvram_* global functions have been moved to an ops struct.

The removal of "select NVRAM" may mean that some kernel configs (such
as Debian/m68k) may need tweaking.

---
 drivers/char/Kconfig      |    5 +----
 drivers/scsi/Kconfig      |    6 +++---
 drivers/scsi/atari_scsi.c |    8 ++++----
 3 files changed, 8 insertions(+), 11 deletions(-)

Index: linux/drivers/char/Kconfig
===================================================================
--- linux.orig/drivers/char/Kconfig	2015-07-12 20:24:54.000000000 +1000
+++ linux/drivers/char/Kconfig	2015-07-12 20:24:54.000000000 +1000
@@ -247,7 +247,7 @@ source "drivers/char/hw_random/Kconfig"
 
 config NVRAM
 	tristate "/dev/nvram support"
-	depends on ATARI || X86 || (ARM && RTC_DRV_CMOS) || GENERIC_NVRAM
+	depends on X86 || (ARM && RTC_DRV_CMOS) || GENERIC_NVRAM
 	---help---
 	  If you say Y here and create a character special file /dev/nvram
 	  with major number 10 and minor number 144 using mknod ("man mknod"),
@@ -265,9 +265,6 @@ config NVRAM
 	  should NEVER idly tamper with it. See Ralf Brown's interrupt list
 	  for a guide to the use of CMOS bytes by your BIOS.
 
-	  On Atari machines, /dev/nvram is always configured and does not need
-	  to be selected.
-
 	  To compile this driver as a module, choose M here: the
 	  module will be called nvram.
 
Index: linux/drivers/scsi/Kconfig
===================================================================
--- linux.orig/drivers/scsi/Kconfig	2015-07-12 20:24:54.000000000 +1000
+++ linux/drivers/scsi/Kconfig	2015-07-12 20:24:54.000000000 +1000
@@ -1592,14 +1592,14 @@ config ATARI_SCSI
 	tristate "Atari native SCSI support"
 	depends on ATARI && SCSI
 	select SCSI_SPI_ATTRS
-	select NVRAM
 	---help---
 	  If you have an Atari with built-in NCR5380 SCSI controller (TT,
 	  Falcon, ...) say Y to get it supported. Of course also, if you have
 	  a compatible SCSI controller (e.g. for Medusa).
 
-	  To compile this driver as a module, choose M here: the
-	  module will be called atari_scsi.
+	  To compile this driver as a module, choose M here: the module will
+	  be called atari_scsi. If you also enable NVRAM support, the SCSI
+	  host's ID is taken from the setting in TT RTC NVRAM.
 
 	  This driver supports both styles of NCR integration into the
 	  system: the TT style (separate DMA), and the Falcon style (via
Index: linux/drivers/scsi/atari_scsi.c
===================================================================
--- linux.orig/drivers/scsi/atari_scsi.c	2015-07-12 20:24:54.000000000 +1000
+++ linux/drivers/scsi/atari_scsi.c	2015-07-12 20:24:54.000000000 +1000
@@ -875,9 +875,10 @@ static int __init atari_scsi_probe(struc
 	if (ATARIHW_PRESENT(TT_SCSI) && setup_sg_tablesize >= 0)
 		atari_scsi_template.sg_tablesize = setup_sg_tablesize;
 
-	if (setup_hostid >= 0) {
+	if (setup_hostid >= 0)
 		atari_scsi_template.this_id = setup_hostid & 7;
-	} else {
+#ifdef CONFIG_NVRAM
+	else
 		/* Test if a host id is set in the NVRam */
 		if (ATARIHW_PRESENT(TT_CLK) && nvram_check_checksum()) {
 			unsigned char b = nvram_read_byte(14);
@@ -888,8 +889,7 @@ static int __init atari_scsi_probe(struc
 			if (b & 0x80)
 				atari_scsi_template.this_id = b & 7;
 		}
-	}
-
+#endif
 
 #ifdef REAL_DMA
 	/* If running on a Falcon and if there's TT-Ram (i.e., more than one



^ permalink raw reply	[flat|nested] 55+ messages in thread

* [RFC v4 02/25] char/nvram: Use bitwise OR to obtain Atari video mode data
  2015-07-12 10:25 [RFC v4 00/25] Re-use nvram module Finn Thain
  2015-07-12 10:25 ` [RFC v4 01/25] scsi/atari_scsi: Dont select CONFIG_NVRAM Finn Thain
@ 2015-07-12 10:25 ` Finn Thain
  2015-07-12 10:25 ` [RFC v4 03/25] m68k/atari: Move Atari-specific code out of drivers/char/nvram.c Finn Thain
                   ` (23 subsequent siblings)
  25 siblings, 0 replies; 55+ messages in thread
From: Finn Thain @ 2015-07-12 10:25 UTC (permalink / raw)
  To: linux-kernel, linux-m68k, linuxppc-dev, Arnd Bergmann,
	Greg Kroah-Hartman
  Cc: Geert Uytterhoeven

[-- Attachment #1: atari-proc-driver-nvram --]
[-- Type: text/plain, Size: 779 bytes --]

Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
Acked-by: Geert Uytterhoeven <geert@linux-m68k.org>

---
 drivers/char/nvram.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Index: linux/drivers/char/nvram.c
===================================================================
--- linux.orig/drivers/char/nvram.c	2015-07-12 20:24:54.000000000 +1000
+++ linux/drivers/char/nvram.c	2015-07-12 20:24:55.000000000 +1000
@@ -702,7 +702,7 @@ static void atari_proc_infos(unsigned ch
 		seq_printf(seq, "%ds%s\n", nvram[10],
 		    nvram[10] < 8 ? ", no memory test" : "");
 
-	vmode = (nvram[14] << 8) || nvram[15];
+	vmode = (nvram[14] << 8) | nvram[15];
 	seq_printf(seq,
 	    "Video mode       : %s colors, %d columns, %s %s monitor\n",
 	    colors[vmode & 7],



^ permalink raw reply	[flat|nested] 55+ messages in thread

* [RFC v4 03/25] m68k/atari: Move Atari-specific code out of drivers/char/nvram.c
  2015-07-12 10:25 [RFC v4 00/25] Re-use nvram module Finn Thain
  2015-07-12 10:25 ` [RFC v4 01/25] scsi/atari_scsi: Dont select CONFIG_NVRAM Finn Thain
  2015-07-12 10:25 ` [RFC v4 02/25] char/nvram: Use bitwise OR to obtain Atari video mode data Finn Thain
@ 2015-07-12 10:25 ` Finn Thain
  2015-07-13 18:13   ` Andreas Schwab
  2015-07-12 10:25 ` [RFC v4 04/25] m68k/atari: Replace nvram_{read,write}_byte with arch_nvram_ops Finn Thain
                   ` (22 subsequent siblings)
  25 siblings, 1 reply; 55+ messages in thread
From: Finn Thain @ 2015-07-12 10:25 UTC (permalink / raw)
  To: linux-kernel, linux-m68k, linuxppc-dev, Geert Uytterhoeven,
	Arnd Bergmann, Greg Kroah-Hartman

[-- Attachment #1: atari-nvram-move-to-arch-m68k --]
[-- Type: text/plain, Size: 18001 bytes --]

Move the m68k-specific code elsewhere to make the driver generic.

Signed-off-by: Finn Thain <fthain@telegraphics.com.au>

---

BTW, I didn't change the SCSI ID location in NVRAM. This code says 16
whereas atari_scsi says 14. Which one is correct?

Changes since v3:
- Move the vmode fix to a separate patch as requested by Geert.

---
 arch/m68k/atari/Makefile |    2 
 arch/m68k/atari/nvram.c  |  255 ++++++++++++++++++++++++++++++++++++++++++
 drivers/char/nvram.c     |  280 +++++------------------------------------------
 3 files changed, 292 insertions(+), 245 deletions(-)

Index: linux/arch/m68k/atari/nvram.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux/arch/m68k/atari/nvram.c	2015-07-12 20:24:56.000000000 +1000
@@ -0,0 +1,255 @@
+/*
+ * CMOS/NV-RAM driver for Atari. Adapted from drivers/char/nvram.c.
+ * Copyright (C) 1997 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
+ * idea by and with help from Richard Jelinek <rj@suse.de>
+ * Portions copyright (c) 2001,2002 Sun Microsystems (thockin@sun.com)
+ * Further contributions from Cesar Barros, Erik Gilling, Tim Hockin and
+ * Wim Van Sebroeck.
+ */
+
+#include <linux/errno.h>
+#include <linux/init.h>
+#include <linux/mc146818rtc.h>
+#include <linux/module.h>
+#include <linux/nvram.h>
+#include <linux/proc_fs.h>
+#include <linux/seq_file.h>
+#include <linux/spinlock.h>
+#include <linux/types.h>
+#include <asm/atarihw.h>
+#include <asm/atariints.h>
+
+#define NVRAM_BYTES		50
+
+/* It is worth noting that these functions all access bytes of general
+ * purpose memory in the NVRAM - that is to say, they all add the
+ * NVRAM_FIRST_BYTE offset. Pass them offsets into NVRAM as if you did not
+ * know about the RTC cruft.
+ */
+
+/* Note that *all* calls to CMOS_READ and CMOS_WRITE must be done with
+ * rtc_lock held. Due to the index-port/data-port design of the RTC, we
+ * don't want two different things trying to get to it at once. (e.g. the
+ * periodic 11 min sync from kernel/time/ntp.c vs. this driver.)
+ */
+
+unsigned char __nvram_read_byte(int i)
+{
+	return CMOS_READ(NVRAM_FIRST_BYTE + i);
+}
+
+unsigned char nvram_read_byte(int i)
+{
+	unsigned long flags;
+	unsigned char c;
+
+	spin_lock_irqsave(&rtc_lock, flags);
+	c = __nvram_read_byte(i);
+	spin_unlock_irqrestore(&rtc_lock, flags);
+	return c;
+}
+EXPORT_SYMBOL(nvram_read_byte);
+
+/* This races nicely with trying to read with checksum checking */
+void __nvram_write_byte(unsigned char c, int i)
+{
+	CMOS_WRITE(c, NVRAM_FIRST_BYTE + i);
+}
+
+void nvram_write_byte(unsigned char c, int i)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(&rtc_lock, flags);
+	__nvram_write_byte(c, i);
+	spin_unlock_irqrestore(&rtc_lock, flags);
+}
+
+/* On Ataris, the checksum is over all bytes except the checksum bytes
+ * themselves; these are at the very end.
+ */
+#define ATARI_CKS_RANGE_START	0
+#define ATARI_CKS_RANGE_END	47
+#define ATARI_CKS_LOC		48
+
+int __nvram_check_checksum(void)
+{
+	int i;
+	unsigned char sum = 0;
+
+	for (i = ATARI_CKS_RANGE_START; i <= ATARI_CKS_RANGE_END; ++i)
+		sum += __nvram_read_byte(i);
+	return (__nvram_read_byte(ATARI_CKS_LOC) == (~sum & 0xff)) &&
+	       (__nvram_read_byte(ATARI_CKS_LOC + 1) == (sum & 0xff));
+}
+
+int nvram_check_checksum(void)
+{
+	unsigned long flags;
+	int rv;
+
+	spin_lock_irqsave(&rtc_lock, flags);
+	rv = __nvram_check_checksum();
+	spin_unlock_irqrestore(&rtc_lock, flags);
+	return rv;
+}
+EXPORT_SYMBOL(nvram_check_checksum);
+
+static void __nvram_set_checksum(void)
+{
+	int i;
+	unsigned char sum = 0;
+
+	for (i = ATARI_CKS_RANGE_START; i <= ATARI_CKS_RANGE_END; ++i)
+		sum += __nvram_read_byte(i);
+	__nvram_write_byte(~sum, ATARI_CKS_LOC);
+	__nvram_write_byte(sum, ATARI_CKS_LOC + 1);
+}
+
+#ifdef CONFIG_PROC_FS
+static struct {
+	unsigned char val;
+	char *name;
+} boot_prefs[] = {
+	{ 0x80, "TOS" },
+	{ 0x40, "ASV" },
+	{ 0x20, "NetBSD (?)" },
+	{ 0x10, "Linux" },
+	{ 0x00, "unspecified" },
+};
+
+static char *languages[] = {
+	"English (US)",
+	"German",
+	"French",
+	"English (UK)",
+	"Spanish",
+	"Italian",
+	"6 (undefined)",
+	"Swiss (French)",
+	"Swiss (German)",
+};
+
+static char *dateformat[] = {
+	"MM%cDD%cYY",
+	"DD%cMM%cYY",
+	"YY%cMM%cDD",
+	"YY%cDD%cMM",
+	"4 (undefined)",
+	"5 (undefined)",
+	"6 (undefined)",
+	"7 (undefined)",
+};
+
+static char *colors[] = {
+	"2", "4", "16", "256", "65536", "??", "??", "??"
+};
+
+static void atari_nvram_proc_read(unsigned char *nvram, struct seq_file *seq,
+                                  void *offset)
+{
+	int checksum;
+	int i;
+	unsigned vmode;
+
+	spin_lock_irq(&rtc_lock);
+	checksum = __nvram_check_checksum();
+	spin_unlock_irq(&rtc_lock);
+
+	seq_printf(seq, "Checksum status  : %svalid\n", checksum ? "" : "not ");
+
+	seq_puts(seq, "Boot preference  : ");
+	for (i = ARRAY_SIZE(boot_prefs) - 1; i >= 0; --i)
+		if (nvram[1] == boot_prefs[i].val) {
+			seq_printf(seq, "%s\n", boot_prefs[i].name);
+			break;
+		}
+	if (i < 0)
+		seq_printf(seq, "0x%02x (undefined)\n", nvram[1]);
+
+	seq_printf(seq, "SCSI arbitration : %s\n",
+	           (nvram[16] & 0x80) ? "on" : "off");
+	seq_puts(seq, "SCSI host ID     : ");
+	if (nvram[16] & 0x80)
+		seq_printf(seq, "%d\n", nvram[16] & 7);
+	else
+		seq_puts(seq, "n/a\n");
+
+	if (!MACH_IS_FALCON)
+		return;
+
+	seq_puts(seq, "OS language      : ");
+	if (nvram[6] < ARRAY_SIZE(languages))
+		seq_printf(seq, "%s\n", languages[nvram[6]]);
+	else
+		seq_printf(seq, "%u (undefined)\n", nvram[6]);
+	seq_puts(seq, "Keyboard language: ");
+	if (nvram[7] < ARRAY_SIZE(languages))
+		seq_printf(seq, "%s\n", languages[nvram[7]]);
+	else
+		seq_printf(seq, "%u (undefined)\n", nvram[7]);
+	seq_puts(seq, "Date format      : ");
+	seq_printf(seq, dateformat[nvram[8] & 7],
+	           nvram[9] ? nvram[9] : '/', nvram[9] ? nvram[9] : '/');
+	seq_printf(seq, ", %dh clock\n", nvram[8] & 16 ? 24 : 12);
+	seq_puts(seq, "Boot delay       : ");
+	if (nvram[10] == 0)
+		seq_puts(seq, "default");
+	else
+		seq_printf(seq, "%ds%s\n", nvram[10],
+		           nvram[10] < 8 ? ", no memory test" : "");
+
+	vmode = (nvram[14] << 8) | nvram[15];
+	seq_printf(seq,
+	           "Video mode       : %s colors, %d columns, %s %s monitor\n",
+	           colors[vmode & 7], vmode & 8 ? 80 : 40,
+	           vmode & 16 ? "VGA" : "TV", vmode & 32 ? "PAL" : "NTSC");
+	seq_printf(seq,
+	           "                   %soverscan, compat. mode %s%s\n",
+	           vmode & 64 ? "" : "no ", vmode & 128 ? "on" : "off",
+	           vmode & 256 ?
+	           (vmode & 16 ? ", line doubling" : ", half screen") : "");
+}
+
+static int nvram_proc_read(struct seq_file *seq, void *offset)
+{
+	unsigned char contents[NVRAM_BYTES];
+	int i;
+
+	spin_lock_irq(&rtc_lock);
+	for (i = 0; i < NVRAM_BYTES; ++i)
+		contents[i] = __nvram_read_byte(i);
+	spin_unlock_irq(&rtc_lock);
+
+	atari_nvram_proc_read(contents, seq, offset);
+
+	return 0;
+}
+
+static int nvram_proc_open(struct inode *inode, struct file *file)
+{
+	return single_open(file, nvram_proc_read, NULL);
+}
+
+static const struct file_operations nvram_proc_fops = {
+	.owner		= THIS_MODULE,
+	.open		= nvram_proc_open,
+	.read		= seq_read,
+	.llseek		= seq_lseek,
+	.release	= single_release,
+};
+
+static int __init atari_nvram_init(void)
+{
+	if (!(MACH_IS_ATARI && ATARIHW_PRESENT(TT_CLK)))
+		return -ENODEV;
+
+	if (!proc_create("driver/nvram", 0, NULL, &nvram_proc_fops)) {
+		pr_err("nvram: can't create /proc/driver/nvram\n");
+		return -ENOMEM;
+	}
+
+	return 0;
+}
+device_initcall(atari_nvram_init);
+#endif /* CONFIG_PROC_FS */
Index: linux/arch/m68k/atari/Makefile
===================================================================
--- linux.orig/arch/m68k/atari/Makefile	2015-07-12 20:24:54.000000000 +1000
+++ linux/arch/m68k/atari/Makefile	2015-07-12 20:24:56.000000000 +1000
@@ -6,3 +6,5 @@ obj-y		:= config.o time.o debug.o ataint
 			atasound.o stram.o
 
 obj-$(CONFIG_ATARI_KBD_CORE)	+= atakeyb.o
+
+obj-$(CONFIG_NVRAM:m=y)		+= nvram.o
Index: linux/drivers/char/nvram.c
===================================================================
--- linux.orig/drivers/char/nvram.c	2015-07-12 20:24:55.000000000 +1000
+++ linux/drivers/char/nvram.c	2015-07-12 20:24:56.000000000 +1000
@@ -21,13 +21,6 @@
  * ioctl(NVRAM_SETCKS) (doesn't change contents, just makes checksum valid
  * again; use with care!)
  *
- * This file also provides some functions for other parts of the kernel that
- * want to access the NVRAM: nvram_{read,write,check_checksum,set_checksum}.
- * Obviously this can be used only if this driver is always configured into
- * the kernel and is not a module. Since the functions are used by some Atari
- * drivers, this is the case on the Atari.
- *
- *
  * 	1.1	Cesar Barros: SMP locking fixes
  * 		added changelog
  * 	1.2	Erik Gilling: Cobalt Networks support
@@ -39,64 +32,6 @@
 
 #include <linux/module.h>
 #include <linux/nvram.h>
-
-#define PC		1
-#define ATARI		2
-
-/* select machine configuration */
-#if defined(CONFIG_ATARI)
-#  define MACH ATARI
-#elif defined(__i386__) || defined(__x86_64__) || defined(__arm__)  /* and ?? */
-#  define MACH PC
-#else
-#  error Cannot build nvram driver for this machine configuration.
-#endif
-
-#if MACH == PC
-
-/* RTC in a PC */
-#define CHECK_DRIVER_INIT()	1
-
-/* On PCs, the checksum is built only over bytes 2..31 */
-#define PC_CKS_RANGE_START	2
-#define PC_CKS_RANGE_END	31
-#define PC_CKS_LOC		32
-#define NVRAM_BYTES		(128-NVRAM_FIRST_BYTE)
-
-#define mach_check_checksum	pc_check_checksum
-#define mach_set_checksum	pc_set_checksum
-#define mach_proc_infos		pc_proc_infos
-
-#endif
-
-#if MACH == ATARI
-
-/* Special parameters for RTC in Atari machines */
-#include <asm/atarihw.h>
-#include <asm/atariints.h>
-#define RTC_PORT(x)		(TT_RTC_BAS + 2*(x))
-#define CHECK_DRIVER_INIT()	(MACH_IS_ATARI && ATARIHW_PRESENT(TT_CLK))
-
-#define NVRAM_BYTES		50
-
-/* On Ataris, the checksum is over all bytes except the checksum bytes
- * themselves; these are at the very end */
-#define ATARI_CKS_RANGE_START	0
-#define ATARI_CKS_RANGE_END	47
-#define ATARI_CKS_LOC		48
-
-#define mach_check_checksum	atari_check_checksum
-#define mach_set_checksum	atari_set_checksum
-#define mach_proc_infos		atari_proc_infos
-
-#endif
-
-/* Note that *all* calls to CMOS_READ and CMOS_WRITE must be done with
- * rtc_lock held. Due to the index-port/data-port design of the RTC, we
- * don't want two different things trying to get to it at once. (e.g. the
- * periodic 11 min sync from kernel/time/ntp.c vs. this driver.)
- */
-
 #include <linux/types.h>
 #include <linux/errno.h>
 #include <linux/miscdevice.h>
@@ -119,12 +54,9 @@ static int nvram_open_mode;	/* special o
 #define NVRAM_WRITE		1 /* opened for writing (exclusive) */
 #define NVRAM_EXCL		2 /* opened with O_EXCL */
 
-static int mach_check_checksum(void);
-static void mach_set_checksum(void);
-
 #ifdef CONFIG_PROC_FS
-static void mach_proc_infos(unsigned char *contents, struct seq_file *seq,
-								void *offset);
+static void pc_nvram_proc_read(unsigned char *contents, struct seq_file *seq,
+                               void *offset);
 #endif
 
 /*
@@ -138,6 +70,14 @@ static void mach_proc_infos(unsigned cha
  * know about the RTC cruft.
  */
 
+#define NVRAM_BYTES		(128 - NVRAM_FIRST_BYTE)
+
+/* Note that *all* calls to CMOS_READ and CMOS_WRITE must be done with
+ * rtc_lock held. Due to the index-port/data-port design of the RTC, we
+ * don't want two different things trying to get to it at once. (e.g. the
+ * periodic 11 min sync from kernel/time/ntp.c vs. this driver.)
+ */
+
 unsigned char __nvram_read_byte(int i)
 {
 	return CMOS_READ(NVRAM_FIRST_BYTE + i);
@@ -173,9 +113,22 @@ void nvram_write_byte(unsigned char c, i
 }
 EXPORT_SYMBOL(nvram_write_byte);
 
+/* On PCs, the checksum is built only over bytes 2..31 */
+#define PC_CKS_RANGE_START	2
+#define PC_CKS_RANGE_END	31
+#define PC_CKS_LOC		32
+
 int __nvram_check_checksum(void)
 {
-	return mach_check_checksum();
+	int i;
+	unsigned short sum = 0;
+	unsigned short expect;
+
+	for (i = PC_CKS_RANGE_START; i <= PC_CKS_RANGE_END; ++i)
+		sum += __nvram_read_byte(i);
+	expect = __nvram_read_byte(PC_CKS_LOC)<<8 |
+	    __nvram_read_byte(PC_CKS_LOC+1);
+	return (sum & 0xffff) == expect;
 }
 EXPORT_SYMBOL(__nvram_check_checksum);
 
@@ -193,7 +146,13 @@ EXPORT_SYMBOL(nvram_check_checksum);
 
 static void __nvram_set_checksum(void)
 {
-	mach_set_checksum();
+	int i;
+	unsigned short sum = 0;
+
+	for (i = PC_CKS_RANGE_START; i <= PC_CKS_RANGE_END; ++i)
+		sum += __nvram_read_byte(i);
+	__nvram_write_byte(sum >> 8, PC_CKS_LOC);
+	__nvram_write_byte(sum & 0xff, PC_CKS_LOC + 1);
 }
 
 #if 0
@@ -396,7 +355,7 @@ static int nvram_proc_read(struct seq_fi
 		contents[i] = __nvram_read_byte(i);
 	spin_unlock_irq(&rtc_lock);
 
-	mach_proc_infos(contents, seq, offset);
+	pc_nvram_proc_read(contents, seq, offset);
 
 	return 0;
 }
@@ -443,10 +402,6 @@ static int __init nvram_init(void)
 {
 	int ret;
 
-	/* First test whether the driver should init at all */
-	if (!CHECK_DRIVER_INIT())
-		return -ENODEV;
-
 	ret = misc_register(&nvram_dev);
 	if (ret) {
 		printk(KERN_ERR "nvram: can't misc_register on minor=%d\n",
@@ -476,36 +431,6 @@ static void __exit nvram_cleanup_module(
 module_init(nvram_init);
 module_exit(nvram_cleanup_module);
 
-/*
- * Machine specific functions
- */
-
-#if MACH == PC
-
-static int pc_check_checksum(void)
-{
-	int i;
-	unsigned short sum = 0;
-	unsigned short expect;
-
-	for (i = PC_CKS_RANGE_START; i <= PC_CKS_RANGE_END; ++i)
-		sum += __nvram_read_byte(i);
-	expect = __nvram_read_byte(PC_CKS_LOC)<<8 |
-	    __nvram_read_byte(PC_CKS_LOC+1);
-	return (sum & 0xffff) == expect;
-}
-
-static void pc_set_checksum(void)
-{
-	int i;
-	unsigned short sum = 0;
-
-	for (i = PC_CKS_RANGE_START; i <= PC_CKS_RANGE_END; ++i)
-		sum += __nvram_read_byte(i);
-	__nvram_write_byte(sum >> 8, PC_CKS_LOC);
-	__nvram_write_byte(sum & 0xff, PC_CKS_LOC + 1);
-}
-
 #ifdef CONFIG_PROC_FS
 
 static char *floppy_types[] = {
@@ -520,8 +445,8 @@ static char *gfx_types[] = {
 	"monochrome",
 };
 
-static void pc_proc_infos(unsigned char *nvram, struct seq_file *seq,
-								void *offset)
+static void pc_nvram_proc_read(unsigned char *nvram, struct seq_file *seq,
+                               void *offset)
 {
 	int checksum;
 	int type;
@@ -582,143 +507,8 @@ static void pc_proc_infos(unsigned char
 
 	return;
 }
-#endif
-
-#endif /* MACH == PC */
-
-#if MACH == ATARI
-
-static int atari_check_checksum(void)
-{
-	int i;
-	unsigned char sum = 0;
-
-	for (i = ATARI_CKS_RANGE_START; i <= ATARI_CKS_RANGE_END; ++i)
-		sum += __nvram_read_byte(i);
-	return (__nvram_read_byte(ATARI_CKS_LOC) == (~sum & 0xff)) &&
-	    (__nvram_read_byte(ATARI_CKS_LOC + 1) == (sum & 0xff));
-}
-
-static void atari_set_checksum(void)
-{
-	int i;
-	unsigned char sum = 0;
 
-	for (i = ATARI_CKS_RANGE_START; i <= ATARI_CKS_RANGE_END; ++i)
-		sum += __nvram_read_byte(i);
-	__nvram_write_byte(~sum, ATARI_CKS_LOC);
-	__nvram_write_byte(sum, ATARI_CKS_LOC + 1);
-}
-
-#ifdef CONFIG_PROC_FS
-
-static struct {
-	unsigned char val;
-	char *name;
-} boot_prefs[] = {
-	{ 0x80, "TOS" },
-	{ 0x40, "ASV" },
-	{ 0x20, "NetBSD (?)" },
-	{ 0x10, "Linux" },
-	{ 0x00, "unspecified" }
-};
-
-static char *languages[] = {
-	"English (US)",
-	"German",
-	"French",
-	"English (UK)",
-	"Spanish",
-	"Italian",
-	"6 (undefined)",
-	"Swiss (French)",
-	"Swiss (German)"
-};
-
-static char *dateformat[] = {
-	"MM%cDD%cYY",
-	"DD%cMM%cYY",
-	"YY%cMM%cDD",
-	"YY%cDD%cMM",
-	"4 (undefined)",
-	"5 (undefined)",
-	"6 (undefined)",
-	"7 (undefined)"
-};
-
-static char *colors[] = {
-	"2", "4", "16", "256", "65536", "??", "??", "??"
-};
-
-static void atari_proc_infos(unsigned char *nvram, struct seq_file *seq,
-								void *offset)
-{
-	int checksum = nvram_check_checksum();
-	int i;
-	unsigned vmode;
-
-	seq_printf(seq, "Checksum status  : %svalid\n", checksum ? "" : "not ");
-
-	seq_printf(seq, "Boot preference  : ");
-	for (i = ARRAY_SIZE(boot_prefs) - 1; i >= 0; --i) {
-		if (nvram[1] == boot_prefs[i].val) {
-			seq_printf(seq, "%s\n", boot_prefs[i].name);
-			break;
-		}
-	}
-	if (i < 0)
-		seq_printf(seq, "0x%02x (undefined)\n", nvram[1]);
-
-	seq_printf(seq, "SCSI arbitration : %s\n",
-	    (nvram[16] & 0x80) ? "on" : "off");
-	seq_printf(seq, "SCSI host ID     : ");
-	if (nvram[16] & 0x80)
-		seq_printf(seq, "%d\n", nvram[16] & 7);
-	else
-		seq_printf(seq, "n/a\n");
-
-	/* the following entries are defined only for the Falcon */
-	if ((atari_mch_cookie >> 16) != ATARI_MCH_FALCON)
-		return;
-
-	seq_printf(seq, "OS language      : ");
-	if (nvram[6] < ARRAY_SIZE(languages))
-		seq_printf(seq, "%s\n", languages[nvram[6]]);
-	else
-		seq_printf(seq, "%u (undefined)\n", nvram[6]);
-	seq_printf(seq, "Keyboard language: ");
-	if (nvram[7] < ARRAY_SIZE(languages))
-		seq_printf(seq, "%s\n", languages[nvram[7]]);
-	else
-		seq_printf(seq, "%u (undefined)\n", nvram[7]);
-	seq_printf(seq, "Date format      : ");
-	seq_printf(seq, dateformat[nvram[8] & 7],
-	    nvram[9] ? nvram[9] : '/', nvram[9] ? nvram[9] : '/');
-	seq_printf(seq, ", %dh clock\n", nvram[8] & 16 ? 24 : 12);
-	seq_printf(seq, "Boot delay       : ");
-	if (nvram[10] == 0)
-		seq_printf(seq, "default");
-	else
-		seq_printf(seq, "%ds%s\n", nvram[10],
-		    nvram[10] < 8 ? ", no memory test" : "");
-
-	vmode = (nvram[14] << 8) | nvram[15];
-	seq_printf(seq,
-	    "Video mode       : %s colors, %d columns, %s %s monitor\n",
-	    colors[vmode & 7],
-	    vmode & 8 ? 80 : 40,
-	    vmode & 16 ? "VGA" : "TV", vmode & 32 ? "PAL" : "NTSC");
-	seq_printf(seq, "                   %soverscan, compat. mode %s%s\n",
-	    vmode & 64 ? "" : "no ",
-	    vmode & 128 ? "on" : "off",
-	    vmode & 256 ?
-	    (vmode & 16 ? ", line doubling" : ", half screen") : "");
-
-	return;
-}
-#endif
-
-#endif /* MACH == ATARI */
+#endif /* CONFIG_PROC_FS */
 
 MODULE_LICENSE("GPL");
 MODULE_ALIAS_MISCDEV(NVRAM_MINOR);



^ permalink raw reply	[flat|nested] 55+ messages in thread

* [RFC v4 04/25] m68k/atari: Replace nvram_{read,write}_byte with arch_nvram_ops
  2015-07-12 10:25 [RFC v4 00/25] Re-use nvram module Finn Thain
                   ` (2 preceding siblings ...)
  2015-07-12 10:25 ` [RFC v4 03/25] m68k/atari: Move Atari-specific code out of drivers/char/nvram.c Finn Thain
@ 2015-07-12 10:25 ` Finn Thain
  2015-07-12 10:25 ` [RFC v4 05/25] char/nvram: Re-order functions to remove forward declarations and #ifdefs Finn Thain
                   ` (21 subsequent siblings)
  25 siblings, 0 replies; 55+ messages in thread
From: Finn Thain @ 2015-07-12 10:25 UTC (permalink / raw)
  To: linux-kernel, linux-m68k, linuxppc-dev, Geert Uytterhoeven,
	Michael Schmitz, James E.J. Bottomley, linux-scsi

[-- Attachment #1: atari_scsi-convert-to-nvram_ops --]
[-- Type: text/plain, Size: 5266 bytes --]

By implementing an arch_nvram_ops struct, any platform can re-use the
drivers/char/nvram module without needing any arch-specific code
in that module. Atari does so here.

Atari has one user of nvram_check_checksum() whereas the other platforms
(i.e. x86 and ARM platforms) have none at all. Replace this
validate-checksum-and-read-byte sequence with the equivalent
rtc_nvram_ops.read() call and remove the now unused functions.

Signed-off-by: Finn Thain <fthain@telegraphics.com.au>

---

The advantage of the new ops struct over the old global nvram_* functions
is that the misc device module can be shared by different platforms
without requiring every platform to implement every nvram_* function.
E.g. only RTC "CMOS" NVRAMs have a checksum for the entire NVRAM
and only PowerPC platforms have a "sync" ioctl.

---
 arch/m68k/atari/nvram.c   |   89 ++++++++++++++++++++++++++++------------------
 drivers/scsi/atari_scsi.c |    8 ++--
 include/linux/nvram.h     |    9 ++++
 3 files changed, 70 insertions(+), 36 deletions(-)

Index: linux/arch/m68k/atari/nvram.c
===================================================================
--- linux.orig/arch/m68k/atari/nvram.c	2015-07-12 20:24:56.000000000 +1000
+++ linux/arch/m68k/atari/nvram.c	2015-07-12 20:24:58.000000000 +1000
@@ -38,33 +38,12 @@ unsigned char __nvram_read_byte(int i)
 	return CMOS_READ(NVRAM_FIRST_BYTE + i);
 }
 
-unsigned char nvram_read_byte(int i)
-{
-	unsigned long flags;
-	unsigned char c;
-
-	spin_lock_irqsave(&rtc_lock, flags);
-	c = __nvram_read_byte(i);
-	spin_unlock_irqrestore(&rtc_lock, flags);
-	return c;
-}
-EXPORT_SYMBOL(nvram_read_byte);
-
 /* This races nicely with trying to read with checksum checking */
 void __nvram_write_byte(unsigned char c, int i)
 {
 	CMOS_WRITE(c, NVRAM_FIRST_BYTE + i);
 }
 
-void nvram_write_byte(unsigned char c, int i)
-{
-	unsigned long flags;
-
-	spin_lock_irqsave(&rtc_lock, flags);
-	__nvram_write_byte(c, i);
-	spin_unlock_irqrestore(&rtc_lock, flags);
-}
-
 /* On Ataris, the checksum is over all bytes except the checksum bytes
  * themselves; these are at the very end.
  */
@@ -83,18 +62,6 @@ int __nvram_check_checksum(void)
 	       (__nvram_read_byte(ATARI_CKS_LOC + 1) == (sum & 0xff));
 }
 
-int nvram_check_checksum(void)
-{
-	unsigned long flags;
-	int rv;
-
-	spin_lock_irqsave(&rtc_lock, flags);
-	rv = __nvram_check_checksum();
-	spin_unlock_irqrestore(&rtc_lock, flags);
-	return rv;
-}
-EXPORT_SYMBOL(nvram_check_checksum);
-
 static void __nvram_set_checksum(void)
 {
 	int i;
@@ -106,6 +73,62 @@ static void __nvram_set_checksum(void)
 	__nvram_write_byte(sum, ATARI_CKS_LOC + 1);
 }
 
+static ssize_t nvram_read(char *buf, size_t count, loff_t *ppos)
+{
+	char *p = buf;
+	loff_t i;
+
+	spin_lock_irq(&rtc_lock);
+
+	if (!__nvram_check_checksum()) {
+		spin_unlock_irq(&rtc_lock);
+		return -EIO;
+	}
+
+	for (i = *ppos; count > 0 && i < NVRAM_BYTES; --count, ++i, ++p)
+		*p = __nvram_read_byte(i);
+
+	spin_unlock_irq(&rtc_lock);
+
+	*ppos = i;
+	return p - buf;
+}
+
+static ssize_t nvram_write(char *buf, size_t count, loff_t *ppos)
+{
+	char *p = buf;
+	loff_t i;
+
+	spin_lock_irq(&rtc_lock);
+
+	if (!__nvram_check_checksum()) {
+		spin_unlock_irq(&rtc_lock);
+		return -EIO;
+	}
+
+	for (i = *ppos; count > 0 && i < NVRAM_BYTES; --count, ++i, ++p)
+		__nvram_write_byte(*p, i);
+
+	__nvram_set_checksum();
+
+	spin_unlock_irq(&rtc_lock);
+
+	*ppos = i;
+	return p - buf;
+}
+
+static ssize_t nvram_get_size(void)
+{
+	return NVRAM_BYTES;
+}
+
+const struct nvram_ops arch_nvram_ops = {
+	.read           = nvram_read,
+	.write          = nvram_write,
+	.get_size       = nvram_get_size,
+};
+EXPORT_SYMBOL(arch_nvram_ops);
+
 #ifdef CONFIG_PROC_FS
 static struct {
 	unsigned char val;
Index: linux/drivers/scsi/atari_scsi.c
===================================================================
--- linux.orig/drivers/scsi/atari_scsi.c	2015-07-12 20:24:54.000000000 +1000
+++ linux/drivers/scsi/atari_scsi.c	2015-07-12 20:24:58.000000000 +1000
@@ -880,13 +880,15 @@ static int __init atari_scsi_probe(struc
 #ifdef CONFIG_NVRAM
 	else
 		/* Test if a host id is set in the NVRam */
-		if (ATARIHW_PRESENT(TT_CLK) && nvram_check_checksum()) {
-			unsigned char b = nvram_read_byte(14);
+		if (ATARIHW_PRESENT(TT_CLK)) {
+			unsigned char b;
+			loff_t offset = 14;
+			ssize_t count = arch_nvram_ops.read(&b, 1, &offset);
 
 			/* Arbitration enabled? (for TOS)
 			 * If yes, use configured host ID
 			 */
-			if (b & 0x80)
+			if ((count == 1) && (b & 0x80))
 				atari_scsi_template.this_id = b & 7;
 		}
 #endif
Index: linux/include/linux/nvram.h
===================================================================
--- linux.orig/include/linux/nvram.h	2015-07-12 20:24:53.000000000 +1000
+++ linux/include/linux/nvram.h	2015-07-12 20:24:58.000000000 +1000
@@ -10,4 +10,13 @@ extern void __nvram_write_byte(unsigned
 extern void nvram_write_byte(unsigned char c, int i);
 extern int __nvram_check_checksum(void);
 extern int nvram_check_checksum(void);
+
+struct nvram_ops {
+	ssize_t         (*read)(char *, size_t, loff_t *);
+	ssize_t         (*write)(char *, size_t, loff_t *);
+	ssize_t         (*get_size)(void);
+};
+
+extern const struct nvram_ops arch_nvram_ops;
+
 #endif  /* _LINUX_NVRAM_H */



^ permalink raw reply	[flat|nested] 55+ messages in thread

* [RFC v4 05/25] char/nvram: Re-order functions to remove forward declarations and #ifdefs
  2015-07-12 10:25 [RFC v4 00/25] Re-use nvram module Finn Thain
                   ` (3 preceding siblings ...)
  2015-07-12 10:25 ` [RFC v4 04/25] m68k/atari: Replace nvram_{read,write}_byte with arch_nvram_ops Finn Thain
@ 2015-07-12 10:25 ` Finn Thain
  2015-07-12 10:25 ` [RFC v4 06/25] char/nvram: Adopt arch_nvram_ops Finn Thain
                   ` (20 subsequent siblings)
  25 siblings, 0 replies; 55+ messages in thread
From: Finn Thain @ 2015-07-12 10:25 UTC (permalink / raw)
  To: linux-kernel, linux-m68k, linuxppc-dev, Arnd Bergmann,
	Greg Kroah-Hartman

[-- Attachment #1: nvram-reorder-functions --]
[-- Type: text/plain, Size: 6909 bytes --]

Also give functions more sensible names: nvram_misc_* for misc device ops,
nvram_proc_* for proc file ops and nvram_module_* for init and exit
functions. This makes them distict from nvram_ops members.

Signed-off-by: Finn Thain <fthain@telegraphics.com.au>

---
 drivers/char/nvram.c |  194 ++++++++++++++++++++++-----------------------------
 1 file changed, 86 insertions(+), 108 deletions(-)

Index: linux/drivers/char/nvram.c
===================================================================
--- linux.orig/drivers/char/nvram.c	2015-07-12 20:24:56.000000000 +1000
+++ linux/drivers/char/nvram.c	2015-07-12 20:24:59.000000000 +1000
@@ -54,11 +54,6 @@ static int nvram_open_mode;	/* special o
 #define NVRAM_WRITE		1 /* opened for writing (exclusive) */
 #define NVRAM_EXCL		2 /* opened with O_EXCL */
 
-#ifdef CONFIG_PROC_FS
-static void pc_nvram_proc_read(unsigned char *contents, struct seq_file *seq,
-                               void *offset);
-#endif
-
 /*
  * These functions are provided to be called internally or by other parts of
  * the kernel. It's up to the caller to ensure correct checksum before reading
@@ -170,7 +165,7 @@ void nvram_set_checksum(void)
  * The are the file operation function for user access to /dev/nvram
  */
 
-static loff_t nvram_llseek(struct file *file, loff_t offset, int origin)
+static loff_t nvram_misc_llseek(struct file *file, loff_t offset, int origin)
 {
 	switch (origin) {
 	case 0:
@@ -189,8 +184,8 @@ static loff_t nvram_llseek(struct file *
 	return (offset >= 0) ? (file->f_pos = offset) : -EINVAL;
 }
 
-static ssize_t nvram_read(struct file *file, char __user *buf,
-						size_t count, loff_t *ppos)
+static ssize_t nvram_misc_read(struct file *file, char __user *buf,
+                               size_t count, loff_t *ppos)
 {
 	unsigned char contents[NVRAM_BYTES];
 	unsigned i = *ppos;
@@ -218,8 +213,8 @@ checksum_err:
 	return -EIO;
 }
 
-static ssize_t nvram_write(struct file *file, const char __user *buf,
-						size_t count, loff_t *ppos)
+static ssize_t nvram_misc_write(struct file *file, const char __user *buf,
+                                size_t count, loff_t *ppos)
 {
 	unsigned char contents[NVRAM_BYTES];
 	unsigned i = *ppos;
@@ -257,8 +252,8 @@ checksum_err:
 	return -EIO;
 }
 
-static long nvram_ioctl(struct file *file, unsigned int cmd,
-			unsigned long arg)
+static long nvram_misc_ioctl(struct file *file, unsigned int cmd,
+                             unsigned long arg)
 {
 	int i;
 
@@ -298,7 +293,7 @@ static long nvram_ioctl(struct file *fil
 	}
 }
 
-static int nvram_open(struct inode *inode, struct file *file)
+static int nvram_misc_open(struct inode *inode, struct file *file)
 {
 	spin_lock(&nvram_state_lock);
 
@@ -320,7 +315,7 @@ static int nvram_open(struct inode *inod
 	return 0;
 }
 
-static int nvram_release(struct inode *inode, struct file *file)
+static int nvram_misc_release(struct inode *inode, struct file *file)
 {
 	spin_lock(&nvram_state_lock);
 
@@ -337,100 +332,6 @@ static int nvram_release(struct inode *i
 	return 0;
 }
 
-#ifndef CONFIG_PROC_FS
-static int nvram_add_proc_fs(void)
-{
-	return 0;
-}
-
-#else
-
-static int nvram_proc_read(struct seq_file *seq, void *offset)
-{
-	unsigned char contents[NVRAM_BYTES];
-	int i = 0;
-
-	spin_lock_irq(&rtc_lock);
-	for (i = 0; i < NVRAM_BYTES; ++i)
-		contents[i] = __nvram_read_byte(i);
-	spin_unlock_irq(&rtc_lock);
-
-	pc_nvram_proc_read(contents, seq, offset);
-
-	return 0;
-}
-
-static int nvram_proc_open(struct inode *inode, struct file *file)
-{
-	return single_open(file, nvram_proc_read, NULL);
-}
-
-static const struct file_operations nvram_proc_fops = {
-	.owner		= THIS_MODULE,
-	.open		= nvram_proc_open,
-	.read		= seq_read,
-	.llseek		= seq_lseek,
-	.release	= single_release,
-};
-
-static int nvram_add_proc_fs(void)
-{
-	if (!proc_create("driver/nvram", 0, NULL, &nvram_proc_fops))
-		return -ENOMEM;
-	return 0;
-}
-
-#endif /* CONFIG_PROC_FS */
-
-static const struct file_operations nvram_fops = {
-	.owner		= THIS_MODULE,
-	.llseek		= nvram_llseek,
-	.read		= nvram_read,
-	.write		= nvram_write,
-	.unlocked_ioctl	= nvram_ioctl,
-	.open		= nvram_open,
-	.release	= nvram_release,
-};
-
-static struct miscdevice nvram_dev = {
-	NVRAM_MINOR,
-	"nvram",
-	&nvram_fops
-};
-
-static int __init nvram_init(void)
-{
-	int ret;
-
-	ret = misc_register(&nvram_dev);
-	if (ret) {
-		printk(KERN_ERR "nvram: can't misc_register on minor=%d\n",
-		    NVRAM_MINOR);
-		goto out;
-	}
-	ret = nvram_add_proc_fs();
-	if (ret) {
-		printk(KERN_ERR "nvram: can't create /proc/driver/nvram\n");
-		goto outmisc;
-	}
-	ret = 0;
-	printk(KERN_INFO "Non-volatile memory driver v" NVRAM_VERSION "\n");
-out:
-	return ret;
-outmisc:
-	misc_deregister(&nvram_dev);
-	goto out;
-}
-
-static void __exit nvram_cleanup_module(void)
-{
-	remove_proc_entry("driver/nvram", NULL);
-	misc_deregister(&nvram_dev);
-}
-
-module_init(nvram_init);
-module_exit(nvram_cleanup_module);
-
 #ifdef CONFIG_PROC_FS
 
 static char *floppy_types[] = {
@@ -508,7 +409,84 @@ static void pc_nvram_proc_read(unsigned
 	return;
 }
 
+static int nvram_proc_read(struct seq_file *seq, void *offset)
+{
+	unsigned char contents[NVRAM_BYTES];
+	int i = 0;
+
+	spin_lock_irq(&rtc_lock);
+	for (i = 0; i < NVRAM_BYTES; ++i)
+		contents[i] = __nvram_read_byte(i);
+	spin_unlock_irq(&rtc_lock);
+
+	pc_nvram_proc_read(contents, seq, offset);
+
+	return 0;
+}
+
+static int nvram_proc_open(struct inode *inode, struct file *file)
+{
+	return single_open(file, nvram_proc_read, NULL);
+}
+
+static const struct file_operations nvram_proc_fops = {
+	.owner		= THIS_MODULE,
+	.open		= nvram_proc_open,
+	.read		= seq_read,
+	.llseek		= seq_lseek,
+	.release	= single_release,
+};
+
 #endif /* CONFIG_PROC_FS */
 
+static const struct file_operations nvram_misc_fops = {
+	.owner		= THIS_MODULE,
+	.llseek		= nvram_misc_llseek,
+	.read		= nvram_misc_read,
+	.write		= nvram_misc_write,
+	.unlocked_ioctl	= nvram_misc_ioctl,
+	.open		= nvram_misc_open,
+	.release	= nvram_misc_release,
+};
+
+static struct miscdevice nvram_misc = {
+	NVRAM_MINOR,
+	"nvram",
+	&nvram_misc_fops,
+};
+
+static int __init nvram_module_init(void)
+{
+	int ret;
+
+	ret = misc_register(&nvram_misc);
+	if (ret) {
+		pr_err("nvram: can't misc_register on minor=%d\n", NVRAM_MINOR);
+		return ret;
+	}
+
+#ifdef CONFIG_PROC_FS
+	if (!proc_create("driver/nvram", 0, NULL, &nvram_proc_fops)) {
+		pr_err("nvram: can't create /proc/driver/nvram\n");
+		misc_deregister(&nvram_misc);
+		return -ENOMEM;
+	}
+#endif
+
+	pr_info("Non-volatile memory driver v" NVRAM_VERSION "\n");
+	return 0;
+}
+
+static void __exit nvram_module_exit(void)
+{
+#ifdef CONFIG_PROC_FS
+	remove_proc_entry("driver/nvram", NULL);
+#endif
+	misc_deregister(&nvram_misc);
+}
+
+module_init(nvram_module_init);
+module_exit(nvram_module_exit);
+
 MODULE_LICENSE("GPL");
 MODULE_ALIAS_MISCDEV(NVRAM_MINOR);



^ permalink raw reply	[flat|nested] 55+ messages in thread

* [RFC v4 06/25] char/nvram: Adopt arch_nvram_ops
  2015-07-12 10:25 [RFC v4 00/25] Re-use nvram module Finn Thain
                   ` (4 preceding siblings ...)
  2015-07-12 10:25 ` [RFC v4 05/25] char/nvram: Re-order functions to remove forward declarations and #ifdefs Finn Thain
@ 2015-07-12 10:25 ` Finn Thain
  2015-07-12 10:25 ` [RFC v4 07/25] x86/thinkpad_acpi: Use arch_nvram_ops methods instead of nvram_read_byte() and nvram_write_byte() Finn Thain
                   ` (19 subsequent siblings)
  25 siblings, 0 replies; 55+ messages in thread
From: Finn Thain @ 2015-07-12 10:25 UTC (permalink / raw)
  To: linux-kernel, linux-m68k, linuxppc-dev, Arnd Bergmann,
	Greg Kroah-Hartman

[-- Attachment #1: nvram-adopt-nvram_ops --]
[-- Type: text/plain, Size: 4040 bytes --]

Different platforms and architectures offer different NVRAM sizes and
access methods. E.g. PPC32 has byte-at-a-time read/write functions whereas
PPC64 has byte-range read/write functions. Adopt the nvram_ops struct so
the nvram module can call such functions as are defined by the various 
platforms and architectures.

Signed-off-by: Finn Thain <fthain@telegraphics.com.au>

---

The #ifdefs here restrict the procfs and checksumming code to those
architectures with PC-style RTC NVRAM. There may be a better place for
that code but it's an open question. See https://lkml.org/lkml/2015/2/3/22

The procfs code here, unless relevant to an ARM platform, could be moved to
arch/x86 (like the earlier patch does for m68k code) and the nvram ops
could be implemented and exported by the rtc-cmos driver instead. This
would eliminate these #ifdefs and almost eliminate the arch-specific code.

---
 drivers/char/nvram.c  |   30 +++++++++++++++++++++++++++---
 include/linux/nvram.h |    2 ++
 2 files changed, 29 insertions(+), 3 deletions(-)

Index: linux/drivers/char/nvram.c
===================================================================
--- linux.orig/drivers/char/nvram.c	2015-07-12 20:24:59.000000000 +1000
+++ linux/drivers/char/nvram.c	2015-07-12 20:25:00.000000000 +1000
@@ -51,9 +51,12 @@ static DEFINE_MUTEX(nvram_mutex);
 static DEFINE_SPINLOCK(nvram_state_lock);
 static int nvram_open_cnt;	/* #times opened */
 static int nvram_open_mode;	/* special open modes */
+static ssize_t nvram_size;
 #define NVRAM_WRITE		1 /* opened for writing (exclusive) */
 #define NVRAM_EXCL		2 /* opened with O_EXCL */
 
+#if defined(CONFIG_X86) || defined(CONFIG_ARM)
+
 /*
  * These functions are provided to be called internally or by other parts of
  * the kernel. It's up to the caller to ensure correct checksum before reading
@@ -161,6 +164,20 @@ void nvram_set_checksum(void)
 }
 #endif  /*  0  */
 
+static ssize_t nvram_get_size(void)
+{
+	return NVRAM_BYTES;
+}
+
+const struct nvram_ops arch_nvram_ops = {
+	.read_byte      = nvram_read_byte,
+	.write_byte     = nvram_write_byte,
+	.get_size       = nvram_get_size,
+};
+EXPORT_SYMBOL(arch_nvram_ops);
+
+#endif /* CONFIG_X86 || CONFIG_ARM */
+
 /*
  * The are the file operation function for user access to /dev/nvram
  */
@@ -332,7 +349,7 @@ static int nvram_misc_release(struct ino
 	return 0;
 }
 
-#ifdef CONFIG_PROC_FS
+#if defined(CONFIG_PROC_FS) && (defined(CONFIG_X86) || defined(CONFIG_ARM))
 
 static char *floppy_types[] = {
 	"none", "5.25'' 360k", "5.25'' 1.2M", "3.5'' 720k", "3.5'' 1.44M",
@@ -459,13 +476,20 @@ static int __init nvram_module_init(void
 {
 	int ret;
 
+	if (arch_nvram_ops.get_size == NULL)
+		return -ENODEV;
+
+	nvram_size = arch_nvram_ops.get_size();
+	if (nvram_size < 0)
+		return nvram_size;
+
 	ret = misc_register(&nvram_misc);
 	if (ret) {
 		pr_err("nvram: can't misc_register on minor=%d\n", NVRAM_MINOR);
 		return ret;
 	}
 
-#ifdef CONFIG_PROC_FS
+#if defined(CONFIG_PROC_FS) && (defined(CONFIG_X86) || defined(CONFIG_ARM))
 	if (!proc_create("driver/nvram", 0, NULL, &nvram_proc_fops)) {
 		pr_err("nvram: can't create /proc/driver/nvram\n");
 		misc_deregister(&nvram_misc);
@@ -479,7 +503,7 @@ static int __init nvram_module_init(void
 
 static void __exit nvram_module_exit(void)
 {
-#ifdef CONFIG_PROC_FS
+#if defined(CONFIG_PROC_FS) && (defined(CONFIG_X86) || defined(CONFIG_ARM))
 	remove_proc_entry("driver/nvram", NULL);
 #endif
 	misc_deregister(&nvram_misc);
Index: linux/include/linux/nvram.h
===================================================================
--- linux.orig/include/linux/nvram.h	2015-07-12 20:24:58.000000000 +1000
+++ linux/include/linux/nvram.h	2015-07-12 20:25:00.000000000 +1000
@@ -14,6 +14,8 @@ extern int nvram_check_checksum(void);
 struct nvram_ops {
 	ssize_t         (*read)(char *, size_t, loff_t *);
 	ssize_t         (*write)(char *, size_t, loff_t *);
+	unsigned char   (*read_byte)(int);
+	void            (*write_byte)(unsigned char, int);
 	ssize_t         (*get_size)(void);
 };
 



^ permalink raw reply	[flat|nested] 55+ messages in thread

* [RFC v4 07/25] x86/thinkpad_acpi: Use arch_nvram_ops methods instead of nvram_read_byte() and nvram_write_byte()
  2015-07-12 10:25 [RFC v4 00/25] Re-use nvram module Finn Thain
                   ` (5 preceding siblings ...)
  2015-07-12 10:25 ` [RFC v4 06/25] char/nvram: Adopt arch_nvram_ops Finn Thain
@ 2015-07-12 10:25 ` Finn Thain
  2015-07-12 10:25 ` [RFC v4 08/25] char/nvram: Allow the set_checksum and initialize ioctls to be omitted Finn Thain
                   ` (18 subsequent siblings)
  25 siblings, 0 replies; 55+ messages in thread
From: Finn Thain @ 2015-07-12 10:25 UTC (permalink / raw)
  To: linux-kernel, linux-m68k, linuxppc-dev,
	Henrique de Moraes Holschuh, Darren Hart, ibm-acpi-devel,
	platform-driver-x86
  Cc: Henrique de Moraes Holschuh

[-- Attachment #1: pc-rtc-replace-exported-nvram-functions --]
[-- Type: text/plain, Size: 3940 bytes --]

Make use of arch_nvram_ops in the thinkpad_acpi driver so that the
nvram_* function exports can be removed.

This patch series was tested on a ThinkPad T43.

Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
Acked-by: Henrique de Moraes Holschuh <hmh@hmh.eng.br>
Reviewed-by: Darren Hart <dvhart@linux.intel.com>

---
 drivers/platform/x86/thinkpad_acpi.c |   20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

Index: linux/drivers/platform/x86/thinkpad_acpi.c
===================================================================
--- linux.orig/drivers/platform/x86/thinkpad_acpi.c	2015-07-12 20:24:53.000000000 +1000
+++ linux/drivers/platform/x86/thinkpad_acpi.c	2015-07-12 20:25:01.000000000 +1000
@@ -2311,30 +2311,30 @@ static void hotkey_read_nvram(struct tp_
 	u8 d;
 
 	if (m & TP_NVRAM_HKEY_GROUP_HK2) {
-		d = nvram_read_byte(TP_NVRAM_ADDR_HK2);
+		d = arch_nvram_ops.read_byte(TP_NVRAM_ADDR_HK2);
 		n->thinkpad_toggle = !!(d & TP_NVRAM_MASK_HKT_THINKPAD);
 		n->zoom_toggle = !!(d & TP_NVRAM_MASK_HKT_ZOOM);
 		n->display_toggle = !!(d & TP_NVRAM_MASK_HKT_DISPLAY);
 		n->hibernate_toggle = !!(d & TP_NVRAM_MASK_HKT_HIBERNATE);
 	}
 	if (m & TP_ACPI_HKEY_THNKLGHT_MASK) {
-		d = nvram_read_byte(TP_NVRAM_ADDR_THINKLIGHT);
+		d = arch_nvram_ops.read_byte(TP_NVRAM_ADDR_THINKLIGHT);
 		n->thinklight_toggle = !!(d & TP_NVRAM_MASK_THINKLIGHT);
 	}
 	if (m & TP_ACPI_HKEY_DISPXPAND_MASK) {
-		d = nvram_read_byte(TP_NVRAM_ADDR_VIDEO);
+		d = arch_nvram_ops.read_byte(TP_NVRAM_ADDR_VIDEO);
 		n->displayexp_toggle =
 				!!(d & TP_NVRAM_MASK_HKT_DISPEXPND);
 	}
 	if (m & TP_NVRAM_HKEY_GROUP_BRIGHTNESS) {
-		d = nvram_read_byte(TP_NVRAM_ADDR_BRIGHTNESS);
+		d = arch_nvram_ops.read_byte(TP_NVRAM_ADDR_BRIGHTNESS);
 		n->brightness_level = (d & TP_NVRAM_MASK_LEVEL_BRIGHTNESS)
 				>> TP_NVRAM_POS_LEVEL_BRIGHTNESS;
 		n->brightness_toggle =
 				!!(d & TP_NVRAM_MASK_HKT_BRIGHTNESS);
 	}
 	if (m & TP_NVRAM_HKEY_GROUP_VOLUME) {
-		d = nvram_read_byte(TP_NVRAM_ADDR_MIXER);
+		d = arch_nvram_ops.read_byte(TP_NVRAM_ADDR_MIXER);
 		n->volume_level = (d & TP_NVRAM_MASK_LEVEL_VOLUME)
 				>> TP_NVRAM_POS_LEVEL_VOLUME;
 		n->mute = !!(d & TP_NVRAM_MASK_MUTE);
@@ -6155,7 +6155,7 @@ static unsigned int tpacpi_brightness_nv
 {
 	u8 lnvram;
 
-	lnvram = (nvram_read_byte(TP_NVRAM_ADDR_BRIGHTNESS)
+	lnvram = (arch_nvram_ops.read_byte(TP_NVRAM_ADDR_BRIGHTNESS)
 		  & TP_NVRAM_MASK_LEVEL_BRIGHTNESS)
 		  >> TP_NVRAM_POS_LEVEL_BRIGHTNESS;
 	lnvram &= bright_maxlvl;
@@ -6180,7 +6180,7 @@ static void tpacpi_brightness_checkpoint
 	if (unlikely(!acpi_ec_read(TP_EC_BACKLIGHT, &lec)))
 		goto unlock;
 	lec &= TP_EC_BACKLIGHT_LVLMSK;
-	b_nvram = nvram_read_byte(TP_NVRAM_ADDR_BRIGHTNESS);
+	b_nvram = arch_nvram_ops.read_byte(TP_NVRAM_ADDR_BRIGHTNESS);
 
 	if (lec != ((b_nvram & TP_NVRAM_MASK_LEVEL_BRIGHTNESS)
 			     >> TP_NVRAM_POS_LEVEL_BRIGHTNESS)) {
@@ -6188,7 +6188,7 @@ static void tpacpi_brightness_checkpoint
 		b_nvram &= ~(TP_NVRAM_MASK_LEVEL_BRIGHTNESS <<
 				TP_NVRAM_POS_LEVEL_BRIGHTNESS);
 		b_nvram |= lec;
-		nvram_write_byte(b_nvram, TP_NVRAM_ADDR_BRIGHTNESS);
+		arch_nvram_ops.write_byte(b_nvram, TP_NVRAM_ADDR_BRIGHTNESS);
 		dbg_printk(TPACPI_DBG_BRGHT,
 			   "updated NVRAM backlight level to %u (0x%02x)\n",
 			   (unsigned int) lec, (unsigned int) b_nvram);
@@ -6796,13 +6796,13 @@ static void tpacpi_volume_checkpoint_nvr
 	if (unlikely(!acpi_ec_read(TP_EC_AUDIO, &lec)))
 		goto unlock;
 	lec &= ec_mask;
-	b_nvram = nvram_read_byte(TP_NVRAM_ADDR_MIXER);
+	b_nvram = arch_nvram_ops.read_byte(TP_NVRAM_ADDR_MIXER);
 
 	if (lec != (b_nvram & ec_mask)) {
 		/* NVRAM needs update */
 		b_nvram &= ~ec_mask;
 		b_nvram |= lec;
-		nvram_write_byte(b_nvram, TP_NVRAM_ADDR_MIXER);
+		arch_nvram_ops.write_byte(b_nvram, TP_NVRAM_ADDR_MIXER);
 		dbg_printk(TPACPI_DBG_MIXER,
 			   "updated NVRAM mixer status to 0x%02x (0x%02x)\n",
 			   (unsigned int) lec, (unsigned int) b_nvram);



^ permalink raw reply	[flat|nested] 55+ messages in thread

* [RFC v4 08/25] char/nvram: Allow the set_checksum and initialize ioctls to be omitted
  2015-07-12 10:25 [RFC v4 00/25] Re-use nvram module Finn Thain
                   ` (6 preceding siblings ...)
  2015-07-12 10:25 ` [RFC v4 07/25] x86/thinkpad_acpi: Use arch_nvram_ops methods instead of nvram_read_byte() and nvram_write_byte() Finn Thain
@ 2015-07-12 10:25 ` Finn Thain
  2015-07-12 10:25 ` [RFC v4 09/25] char/nvram: Implement NVRAM read/write methods Finn Thain
                   ` (17 subsequent siblings)
  25 siblings, 0 replies; 55+ messages in thread
From: Finn Thain @ 2015-07-12 10:25 UTC (permalink / raw)
  To: linux-kernel, linux-m68k, linuxppc-dev, Arnd Bergmann,
	Greg Kroah-Hartman

[-- Attachment #1: nvram-generalize-ioctl --]
[-- Type: text/plain, Size: 4422 bytes --]

The drivers/char/nvram module has previously only supported RTC "CMOS"
NVRAM, for which it provides appropriate checksum ioctls. Make these
ioctls optional so the module can be re-used with other kinds of NVRAM.

The ops struct methods that implement the ioctls now return error
codes so that a multi-platform kernel binary can do the right thing when
running on hardware without suitable NVRAM.

Signed-off-by: Finn Thain <fthain@telegraphics.com.au>

---

Changed since v1:
- Don't bother acquiring the mutex for unimplemented ioctls.

---
 drivers/char/nvram.c  |   71 ++++++++++++++++++++++++++++----------------------
 include/linux/nvram.h |    2 +
 2 files changed, 43 insertions(+), 30 deletions(-)

Index: linux/drivers/char/nvram.c
===================================================================
--- linux.orig/drivers/char/nvram.c	2015-07-12 20:25:00.000000000 +1000
+++ linux/drivers/char/nvram.c	2015-07-12 20:25:02.000000000 +1000
@@ -153,16 +153,25 @@ static void __nvram_set_checksum(void)
 	__nvram_write_byte(sum & 0xff, PC_CKS_LOC + 1);
 }
 
-#if 0
-void nvram_set_checksum(void)
+static long nvram_set_checksum(void)
 {
-	unsigned long flags;
+	spin_lock_irq(&rtc_lock);
+	__nvram_set_checksum();
+	spin_unlock_irq(&rtc_lock);
+	return 0;
+}
+
+static long nvram_initialize(void)
+{
+	ssize_t i;
 
-	spin_lock_irqsave(&rtc_lock, flags);
+	spin_lock_irq(&rtc_lock);
+	for (i = 0; i < NVRAM_BYTES; ++i)
+		__nvram_write_byte(0, i);
 	__nvram_set_checksum();
-	spin_unlock_irqrestore(&rtc_lock, flags);
+	spin_unlock_irq(&rtc_lock);
+	return 0;
 }
-#endif  /*  0  */
 
 static ssize_t nvram_get_size(void)
 {
@@ -173,6 +182,8 @@ const struct nvram_ops arch_nvram_ops =
 	.read_byte      = nvram_read_byte,
 	.write_byte     = nvram_write_byte,
 	.get_size       = nvram_get_size,
+	.set_checksum   = nvram_set_checksum,
+	.initialize     = nvram_initialize,
 };
 EXPORT_SYMBOL(arch_nvram_ops);
 
@@ -272,51 +283,51 @@ checksum_err:
 static long nvram_misc_ioctl(struct file *file, unsigned int cmd,
                              unsigned long arg)
 {
-	int i;
+	long ret = -ENOTTY;
 
 	switch (cmd) {
-
 	case NVRAM_INIT:
 		/* initialize NVRAM contents and checksum */
 		if (!capable(CAP_SYS_ADMIN))
 			return -EACCES;
 
-		mutex_lock(&nvram_mutex);
-		spin_lock_irq(&rtc_lock);
-
-		for (i = 0; i < NVRAM_BYTES; ++i)
-			__nvram_write_byte(0, i);
-		__nvram_set_checksum();
-
-		spin_unlock_irq(&rtc_lock);
-		mutex_unlock(&nvram_mutex);
-		return 0;
-
+		if (arch_nvram_ops.initialize != NULL) {
+			mutex_lock(&nvram_mutex);
+			ret = arch_nvram_ops.initialize();
+			mutex_unlock(&nvram_mutex);
+		}
+		break;
 	case NVRAM_SETCKS:
 		/* just set checksum, contents unchanged (maybe useful after
 		 * checksum garbaged somehow...) */
 		if (!capable(CAP_SYS_ADMIN))
 			return -EACCES;
 
-		mutex_lock(&nvram_mutex);
-		spin_lock_irq(&rtc_lock);
-		__nvram_set_checksum();
-		spin_unlock_irq(&rtc_lock);
-		mutex_unlock(&nvram_mutex);
-		return 0;
-
-	default:
-		return -ENOTTY;
+		if (arch_nvram_ops.set_checksum != NULL) {
+			mutex_lock(&nvram_mutex);
+			ret = arch_nvram_ops.set_checksum();
+			mutex_unlock(&nvram_mutex);
+		}
+		break;
 	}
+	return ret;
 }
 
 static int nvram_misc_open(struct inode *inode, struct file *file)
 {
 	spin_lock(&nvram_state_lock);
 
+	/* Prevent multiple readers/writers if desired. */
 	if ((nvram_open_cnt && (file->f_flags & O_EXCL)) ||
-	    (nvram_open_mode & NVRAM_EXCL) ||
-	    ((file->f_mode & FMODE_WRITE) && (nvram_open_mode & NVRAM_WRITE))) {
+	    (nvram_open_mode & NVRAM_EXCL)) {
+		spin_unlock(&nvram_state_lock);
+		return -EBUSY;
+	}
+
+	/* Prevent multiple writers if the set_checksum ioctl is implemented. */
+	if ((arch_nvram_ops.set_checksum != NULL) &&
+	    (file->f_mode & FMODE_WRITE) &&
+	    (nvram_open_mode & NVRAM_WRITE)) {
 		spin_unlock(&nvram_state_lock);
 		return -EBUSY;
 	}
Index: linux/include/linux/nvram.h
===================================================================
--- linux.orig/include/linux/nvram.h	2015-07-12 20:25:00.000000000 +1000
+++ linux/include/linux/nvram.h	2015-07-12 20:25:02.000000000 +1000
@@ -17,6 +17,8 @@ struct nvram_ops {
 	unsigned char   (*read_byte)(int);
 	void            (*write_byte)(unsigned char, int);
 	ssize_t         (*get_size)(void);
+	long            (*set_checksum)(void);
+	long            (*initialize)(void);
 };
 
 extern const struct nvram_ops arch_nvram_ops;



^ permalink raw reply	[flat|nested] 55+ messages in thread

* [RFC v4 09/25] char/nvram: Implement NVRAM read/write methods
  2015-07-12 10:25 [RFC v4 00/25] Re-use nvram module Finn Thain
                   ` (7 preceding siblings ...)
  2015-07-12 10:25 ` [RFC v4 08/25] char/nvram: Allow the set_checksum and initialize ioctls to be omitted Finn Thain
@ 2015-07-12 10:25 ` Finn Thain
  2015-07-12 10:25 ` [RFC v4 10/25] char/nvram: Use generic fixed_size_llseek() Finn Thain
                   ` (16 subsequent siblings)
  25 siblings, 0 replies; 55+ messages in thread
From: Finn Thain @ 2015-07-12 10:25 UTC (permalink / raw)
  To: linux-kernel, linux-m68k, linuxppc-dev, Arnd Bergmann,
	Greg Kroah-Hartman

[-- Attachment #1: nvram-generalize-read-write --]
[-- Type: text/plain, Size: 5677 bytes --]

Refactor the RTC "CMOS" NVRAM functions so that they can be used as
arch_nvram_ops methods. Checksumming logic is moved from the misc device
operations to the nvram read/write operations.

This makes the misc device implementation more generic. This also
preserves the locking semantics such that "read if checksum valid" and
"write and update checksum" remain atomic operations.

PPC64 implements byte-range read/write methods which are similar to
file_operations struct methods. Other platforms provide only
byte-at-a-time functions. So the misc device prefers the former but
will fall back on the latter.

Signed-off-by: Finn Thain <fthain@telegraphics.com.au>

---
 drivers/char/nvram.c |  162 +++++++++++++++++++++++++++++++++++----------------
 1 file changed, 114 insertions(+), 48 deletions(-)

Index: linux/drivers/char/nvram.c
===================================================================
--- linux.orig/drivers/char/nvram.c	2015-07-12 20:25:02.000000000 +1000
+++ linux/drivers/char/nvram.c	2015-07-12 20:25:03.000000000 +1000
@@ -41,6 +41,7 @@
 #include <linux/init.h>
 #include <linux/proc_fs.h>
 #include <linux/seq_file.h>
+#include <linux/slab.h>
 #include <linux/spinlock.h>
 #include <linux/io.h>
 #include <linux/uaccess.h>
@@ -178,9 +179,48 @@ static ssize_t nvram_get_size(void)
 	return NVRAM_BYTES;
 }
 
+static ssize_t nvram_read(char *buf, size_t count, loff_t *ppos)
+{
+	char *p = buf;
+	loff_t i;
+
+	spin_lock_irq(&rtc_lock);
+	if (!__nvram_check_checksum()) {
+		spin_unlock_irq(&rtc_lock);
+		return -EIO;
+	}
+	for (i = *ppos; count > 0 && i < NVRAM_BYTES; --count, ++i, ++p)
+		*p = __nvram_read_byte(i);
+	spin_unlock_irq(&rtc_lock);
+
+	*ppos = i;
+	return p - buf;
+}
+
+static ssize_t nvram_write(char *buf, size_t count, loff_t *ppos)
+{
+	char *p = buf;
+	loff_t i;
+
+	spin_lock_irq(&rtc_lock);
+	if (!__nvram_check_checksum()) {
+		spin_unlock_irq(&rtc_lock);
+		return -EIO;
+	}
+	for (i = *ppos; count > 0 && i < NVRAM_BYTES; --count, ++i, ++p)
+		__nvram_write_byte(*p, i);
+	__nvram_set_checksum();
+	spin_unlock_irq(&rtc_lock);
+
+	*ppos = i;
+	return p - buf;
+}
+
 const struct nvram_ops arch_nvram_ops = {
 	.read_byte      = nvram_read_byte,
 	.write_byte     = nvram_write_byte,
+	.read           = nvram_read,
+	.write          = nvram_write,
 	.get_size       = nvram_get_size,
 	.set_checksum   = nvram_set_checksum,
 	.initialize     = nvram_initialize,
@@ -215,69 +255,95 @@ static loff_t nvram_misc_llseek(struct f
 static ssize_t nvram_misc_read(struct file *file, char __user *buf,
                                size_t count, loff_t *ppos)
 {
-	unsigned char contents[NVRAM_BYTES];
-	unsigned i = *ppos;
-	unsigned char *tmp;
-
-	spin_lock_irq(&rtc_lock);
+	loff_t i;
+	char __user *p = buf;
 
-	if (!__nvram_check_checksum())
-		goto checksum_err;
-
-	for (tmp = contents; count-- > 0 && i < NVRAM_BYTES; ++i, ++tmp)
-		*tmp = __nvram_read_byte(i);
-
-	spin_unlock_irq(&rtc_lock);
-
-	if (copy_to_user(buf, contents, tmp - contents))
+	if (!access_ok(VERIFY_WRITE, buf, count))
 		return -EFAULT;
+	if (*ppos >= nvram_size)
+		return 0;
 
-	*ppos = i;
-
-	return tmp - contents;
+	/* If the arch provided a byte range read op, use it. Otherwise
+	 * fall back on the byte-at-a-time accessor.
+	 */
+	if (arch_nvram_ops.read != NULL) {
+		char *tmp;
+		ssize_t ret;
+
+		count = min_t(size_t, count, nvram_size - *ppos);
+		count = min_t(size_t, count, PAGE_SIZE);
+
+		tmp = kmalloc(count, GFP_KERNEL);
+		if (!tmp)
+			return -ENOMEM;
+
+		ret = arch_nvram_ops.read(tmp, count, ppos);
+		if (ret <= 0)
+			goto out;
+
+		if (copy_to_user(buf, tmp, ret)) {
+			*ppos -= ret;
+			ret = -EFAULT;
+		}
+
+out:
+		kfree(tmp);
+		return ret;
+	}
 
-checksum_err:
-	spin_unlock_irq(&rtc_lock);
-	return -EIO;
+	for (i = *ppos; count > 0 && i < nvram_size; ++i, ++p, --count)
+		if (__put_user(arch_nvram_ops.read_byte(i), p))
+			return -EFAULT;
+	*ppos = i;
+	return p - buf;
 }
 
 static ssize_t nvram_misc_write(struct file *file, const char __user *buf,
                                 size_t count, loff_t *ppos)
 {
-	unsigned char contents[NVRAM_BYTES];
-	unsigned i = *ppos;
-	unsigned char *tmp;
-
-	if (i >= NVRAM_BYTES)
-		return 0;	/* Past EOF */
-
-	if (count > NVRAM_BYTES - i)
-		count = NVRAM_BYTES - i;
-	if (count > NVRAM_BYTES)
-		return -EFAULT;	/* Can't happen, but prove it to gcc */
+	loff_t i;
+	const char __user *p = buf;
 
-	if (copy_from_user(contents, buf, count))
+	if (!access_ok(VERIFY_READ, buf, count))
 		return -EFAULT;
+	if (*ppos >= nvram_size)
+		return 0;
 
-	spin_lock_irq(&rtc_lock);
-
-	if (!__nvram_check_checksum())
-		goto checksum_err;
-
-	for (tmp = contents; count--; ++i, ++tmp)
-		__nvram_write_byte(*tmp, i);
-
-	__nvram_set_checksum();
+	/* If the arch provided a byte range write op, use it. Otherwise
+	 * fall back on the byte-at-a-time accessor.
+	 */
+	if (arch_nvram_ops.write != NULL) {
+		char *tmp;
+		ssize_t ret;
+
+		count = min_t(size_t, count, nvram_size - *ppos);
+		count = min_t(size_t, count, PAGE_SIZE);
+
+		tmp = kmalloc(count, GFP_KERNEL);
+		if (!tmp)
+			return -ENOMEM;
+
+		if (copy_from_user(tmp, buf, count)) {
+			ret = -EFAULT;
+			goto out;
+		}
+
+		ret = arch_nvram_ops.write(tmp, count, ppos);
+
+out:
+		kfree(tmp);
+		return ret;
+	}
 
-	spin_unlock_irq(&rtc_lock);
+	for (i = *ppos; count > 0 && i < nvram_size; ++i, ++p, --count) {
+		char c;
 
+		if (__get_user(c, p))
+			return -EFAULT;
+		arch_nvram_ops.write_byte(c, i);
+	}
 	*ppos = i;
-
-	return tmp - contents;
-
-checksum_err:
-	spin_unlock_irq(&rtc_lock);
-	return -EIO;
+	return p - buf;
 }
 
 static long nvram_misc_ioctl(struct file *file, unsigned int cmd,



^ permalink raw reply	[flat|nested] 55+ messages in thread

* [RFC v4 10/25] char/nvram: Use generic fixed_size_llseek()
  2015-07-12 10:25 [RFC v4 00/25] Re-use nvram module Finn Thain
                   ` (8 preceding siblings ...)
  2015-07-12 10:25 ` [RFC v4 09/25] char/nvram: Implement NVRAM read/write methods Finn Thain
@ 2015-07-12 10:25 ` Finn Thain
  2015-07-12 10:25 ` [RFC v4 11/25] m68k/atari: Implement arch_nvram_ops methods and enable CONFIG_HAVE_ARCH_NVRAM_OPS Finn Thain
                   ` (15 subsequent siblings)
  25 siblings, 0 replies; 55+ messages in thread
From: Finn Thain @ 2015-07-12 10:25 UTC (permalink / raw)
  To: linux-kernel, linux-m68k, linuxppc-dev, Arnd Bergmann,
	Greg Kroah-Hartman

[-- Attachment #1: nvram-generic-llseek --]
[-- Type: text/plain, Size: 921 bytes --]

Signed-off-by: Finn Thain <fthain@telegraphics.com.au>

---
 drivers/char/nvram.c |   16 +---------------
 1 file changed, 1 insertion(+), 15 deletions(-)

Index: linux/drivers/char/nvram.c
===================================================================
--- linux.orig/drivers/char/nvram.c	2015-07-12 20:25:03.000000000 +1000
+++ linux/drivers/char/nvram.c	2015-07-12 20:25:05.000000000 +1000
@@ -235,21 +235,7 @@ EXPORT_SYMBOL(arch_nvram_ops);
 
 static loff_t nvram_misc_llseek(struct file *file, loff_t offset, int origin)
 {
-	switch (origin) {
-	case 0:
-		/* nothing to do */
-		break;
-	case 1:
-		offset += file->f_pos;
-		break;
-	case 2:
-		offset += NVRAM_BYTES;
-		break;
-	default:
-		return -EINVAL;
-	}
-
-	return (offset >= 0) ? (file->f_pos = offset) : -EINVAL;
+	return fixed_size_llseek(file, offset, origin, nvram_size);
 }
 
 static ssize_t nvram_misc_read(struct file *file, char __user *buf,



^ permalink raw reply	[flat|nested] 55+ messages in thread

* [RFC v4 11/25] m68k/atari: Implement arch_nvram_ops methods and enable CONFIG_HAVE_ARCH_NVRAM_OPS
  2015-07-12 10:25 [RFC v4 00/25] Re-use nvram module Finn Thain
                   ` (9 preceding siblings ...)
  2015-07-12 10:25 ` [RFC v4 10/25] char/nvram: Use generic fixed_size_llseek() Finn Thain
@ 2015-07-12 10:25 ` Finn Thain
  2015-07-12 10:25 ` [RFC v4 12/25] char/nvram: Add "devname:nvram" module alias Finn Thain
                   ` (14 subsequent siblings)
  25 siblings, 0 replies; 55+ messages in thread
From: Finn Thain @ 2015-07-12 10:25 UTC (permalink / raw)
  To: linux-kernel, linux-m68k, linuxppc-dev, Geert Uytterhoeven,
	Arnd Bergmann, Greg Kroah-Hartman

[-- Attachment #1: atari-hook-up-misc-device --]
[-- Type: text/plain, Size: 3485 bytes --]

Atari RTC NVRAM has a checksum so implement the remaining arch_nvram_ops
methods for the set_checksum and initialize ioctls. Enable
CONFIG_HAVE_ARCH_NVRAM_OPS.

Signed-off-by: Finn Thain <fthain@telegraphics.com.au>

---

This re-enables the nvram module for Atari.

Changes since v3:
- Use bool (and select) instead of def_bool in the definition of the
HAVE_ARCH_NVRAM_OPS Kconfig symbol, as requested by Geert.

---
 arch/m68k/Kconfig         |    3 +++
 arch/m68k/Kconfig.machine |    1 +
 arch/m68k/atari/nvram.c   |   24 ++++++++++++++++++++++++
 drivers/char/Kconfig      |    2 +-
 4 files changed, 29 insertions(+), 1 deletion(-)

Index: linux/arch/m68k/atari/nvram.c
===================================================================
--- linux.orig/arch/m68k/atari/nvram.c	2015-07-12 20:24:58.000000000 +1000
+++ linux/arch/m68k/atari/nvram.c	2015-07-12 20:25:05.000000000 +1000
@@ -73,6 +73,26 @@ static void __nvram_set_checksum(void)
 	__nvram_write_byte(sum, ATARI_CKS_LOC + 1);
 }
 
+static long nvram_set_checksum(void)
+{
+	spin_lock_irq(&rtc_lock);
+	__nvram_set_checksum();
+	spin_unlock_irq(&rtc_lock);
+	return 0;
+}
+
+static long nvram_initialize(void)
+{
+	loff_t i;
+
+	spin_lock_irq(&rtc_lock);
+	for (i = 0; i < NVRAM_BYTES; ++i)
+		__nvram_write_byte(0, i);
+	__nvram_set_checksum();
+	spin_unlock_irq(&rtc_lock);
+	return 0;
+}
+
 static ssize_t nvram_read(char *buf, size_t count, loff_t *ppos)
 {
 	char *p = buf;
@@ -119,6 +139,8 @@ static ssize_t nvram_write(char *buf, si
 
 static ssize_t nvram_get_size(void)
 {
+	if (!MACH_IS_ATARI)
+		return -ENODEV;
 	return NVRAM_BYTES;
 }
 
@@ -126,6 +148,8 @@ const struct nvram_ops arch_nvram_ops =
 	.read           = nvram_read,
 	.write          = nvram_write,
 	.get_size       = nvram_get_size,
+	.set_checksum   = nvram_set_checksum,
+	.initialize     = nvram_initialize,
 };
 EXPORT_SYMBOL(arch_nvram_ops);
 
Index: linux/drivers/char/Kconfig
===================================================================
--- linux.orig/drivers/char/Kconfig	2015-07-12 20:24:54.000000000 +1000
+++ linux/drivers/char/Kconfig	2015-07-12 20:25:05.000000000 +1000
@@ -247,7 +247,7 @@ source "drivers/char/hw_random/Kconfig"
 
 config NVRAM
 	tristate "/dev/nvram support"
-	depends on X86 || (ARM && RTC_DRV_CMOS) || GENERIC_NVRAM
+	depends on X86 || (ARM && RTC_DRV_CMOS) || GENERIC_NVRAM || HAVE_ARCH_NVRAM_OPS
 	---help---
 	  If you say Y here and create a character special file /dev/nvram
 	  with major number 10 and minor number 144 using mknod ("man mknod"),
Index: linux/arch/m68k/Kconfig
===================================================================
--- linux.orig/arch/m68k/Kconfig	2015-07-12 20:24:53.000000000 +1000
+++ linux/arch/m68k/Kconfig	2015-07-12 20:25:05.000000000 +1000
@@ -71,6 +71,9 @@ config PGTABLE_LEVELS
 	default 2 if SUN3 || COLDFIRE
 	default 3
 
+config HAVE_ARCH_NVRAM_OPS
+	bool
+
 source "init/Kconfig"
 
 source "kernel/Kconfig.freezer"
Index: linux/arch/m68k/Kconfig.machine
===================================================================
--- linux.orig/arch/m68k/Kconfig.machine	2015-07-12 20:24:53.000000000 +1000
+++ linux/arch/m68k/Kconfig.machine	2015-07-12 20:25:05.000000000 +1000
@@ -15,6 +15,7 @@ config ATARI
 	bool "Atari support"
 	depends on MMU
 	select MMU_MOTOROLA if MMU
+	select HAVE_ARCH_NVRAM_OPS
 	help
 	  This option enables support for the 68000-based Atari series of
 	  computers (including the TT, Falcon and Medusa). If you plan to use



^ permalink raw reply	[flat|nested] 55+ messages in thread

* [RFC v4 12/25] char/nvram: Add "devname:nvram" module alias
  2015-07-12 10:25 [RFC v4 00/25] Re-use nvram module Finn Thain
                   ` (10 preceding siblings ...)
  2015-07-12 10:25 ` [RFC v4 11/25] m68k/atari: Implement arch_nvram_ops methods and enable CONFIG_HAVE_ARCH_NVRAM_OPS Finn Thain
@ 2015-07-12 10:25 ` Finn Thain
  2015-07-12 10:25 ` [RFC v4 13/25] powerpc: Cleanup nvram includes Finn Thain
                   ` (13 subsequent siblings)
  25 siblings, 0 replies; 55+ messages in thread
From: Finn Thain @ 2015-07-12 10:25 UTC (permalink / raw)
  To: linux-kernel, linux-m68k, linuxppc-dev, Arnd Bergmann,
	Greg Kroah-Hartman

[-- Attachment #1: nvram-module-alias --]
[-- Type: text/plain, Size: 513 bytes --]

Signed-off-by: Finn Thain <fthain@telegraphics.com.au>

---
 drivers/char/nvram.c |    1 +
 1 file changed, 1 insertion(+)

Index: linux/drivers/char/nvram.c
===================================================================
--- linux.orig/drivers/char/nvram.c	2015-07-12 20:25:05.000000000 +1000
+++ linux/drivers/char/nvram.c	2015-07-12 20:25:07.000000000 +1000
@@ -577,3 +577,4 @@ module_exit(nvram_module_exit);
 
 MODULE_LICENSE("GPL");
 MODULE_ALIAS_MISCDEV(NVRAM_MINOR);
+MODULE_ALIAS("devname:nvram");



^ permalink raw reply	[flat|nested] 55+ messages in thread

* [RFC v4 13/25] powerpc: Cleanup nvram includes
  2015-07-12 10:25 [RFC v4 00/25] Re-use nvram module Finn Thain
                   ` (11 preceding siblings ...)
  2015-07-12 10:25 ` [RFC v4 12/25] char/nvram: Add "devname:nvram" module alias Finn Thain
@ 2015-07-12 10:25 ` Finn Thain
  2015-07-12 10:25 ` [RFC v4 14/25] powerpc: Add missing ppc_md.nvram_size for CHRP and PowerMac Finn Thain
                   ` (12 subsequent siblings)
  25 siblings, 0 replies; 55+ messages in thread
From: Finn Thain @ 2015-07-12 10:25 UTC (permalink / raw)
  To: linux-kernel, linux-m68k, linuxppc-dev, Benjamin Herrenschmidt,
	Paul Mackerras, Michael Ellerman, Arnd Bergmann,
	Greg Kroah-Hartman, Jean-Christophe Plagniol-Villard,
	Tomi Valkeinen, linux-fbdev

[-- Attachment #1: powerpc-fix-nvram-includes --]
[-- Type: text/plain, Size: 2773 bytes --]

The nvram_read_byte() and nvram_write_byte() definitions in asm/nvram.h
duplicate those in linux/nvram.h. Get rid of the former to prepare for
adoption of struct arch_nvram_ops (which is defined in linux/nvram.h for
general use).

Signed-off-by: Finn Thain <fthain@telegraphics.com.au>

---
 arch/powerpc/include/asm/nvram.h           |    3 ---
 arch/powerpc/kernel/setup_32.c             |    1 +
 drivers/char/generic_nvram.c               |    4 +++-
 drivers/video/fbdev/matrox/matroxfb_base.c |    2 +-
 4 files changed, 5 insertions(+), 5 deletions(-)

Index: linux/arch/powerpc/include/asm/nvram.h
===================================================================
--- linux.orig/arch/powerpc/include/asm/nvram.h	2015-07-12 20:24:53.000000000 +1000
+++ linux/arch/powerpc/include/asm/nvram.h	2015-07-12 20:25:08.000000000 +1000
@@ -101,7 +101,4 @@ extern int nvram_write_os_partition(stru
 /* Determine NVRAM size */
 extern ssize_t nvram_get_size(void);
 
-/* Normal access to NVRAM */
-extern unsigned char nvram_read_byte(int i);
-extern void nvram_write_byte(unsigned char c, int i);
 #endif /* _ASM_POWERPC_NVRAM_H */
Index: linux/arch/powerpc/kernel/setup_32.c
===================================================================
--- linux.orig/arch/powerpc/kernel/setup_32.c	2015-07-12 20:24:53.000000000 +1000
+++ linux/arch/powerpc/kernel/setup_32.c	2015-07-12 20:25:08.000000000 +1000
@@ -16,6 +16,7 @@
 #include <linux/cpu.h>
 #include <linux/console.h>
 #include <linux/memblock.h>
+#include <linux/nvram.h>
 
 #include <asm/io.h>
 #include <asm/prom.h>
Index: linux/drivers/char/generic_nvram.c
===================================================================
--- linux.orig/drivers/char/generic_nvram.c	2015-07-12 20:24:53.000000000 +1000
+++ linux/drivers/char/generic_nvram.c	2015-07-12 20:25:08.000000000 +1000
@@ -20,9 +20,11 @@
 #include <linux/fcntl.h>
 #include <linux/init.h>
 #include <linux/mutex.h>
+#include <linux/nvram.h>
 #include <asm/uaccess.h>
-#include <asm/nvram.h>
+
 #ifdef CONFIG_PPC_PMAC
+#include <asm/nvram.h>
 #include <asm/machdep.h>
 #endif
 
Index: linux/drivers/video/fbdev/matrox/matroxfb_base.c
===================================================================
--- linux.orig/drivers/video/fbdev/matrox/matroxfb_base.c	2015-07-12 20:24:53.000000000 +1000
+++ linux/drivers/video/fbdev/matrox/matroxfb_base.c	2015-07-12 20:25:08.000000000 +1000
@@ -111,12 +111,12 @@
 #include "matroxfb_g450.h"
 #include <linux/matroxfb.h>
 #include <linux/interrupt.h>
+#include <linux/nvram.h>
 #include <linux/slab.h>
 #include <linux/uaccess.h>
 
 #ifdef CONFIG_PPC_PMAC
 #include <asm/machdep.h>
-unsigned char nvram_read_byte(int);
 static int default_vmode = VMODE_NVRAM;
 static int default_cmode = CMODE_NVRAM;
 #endif



^ permalink raw reply	[flat|nested] 55+ messages in thread

* [RFC v4 14/25] powerpc: Add missing ppc_md.nvram_size for CHRP and PowerMac
  2015-07-12 10:25 [RFC v4 00/25] Re-use nvram module Finn Thain
                   ` (12 preceding siblings ...)
  2015-07-12 10:25 ` [RFC v4 13/25] powerpc: Cleanup nvram includes Finn Thain
@ 2015-07-12 10:25 ` Finn Thain
  2015-07-12 10:25 ` [RFC v4 15/25] powerpc: Implement arch_nvram_ops.get_size() and remove old nvram_* exports Finn Thain
                   ` (11 subsequent siblings)
  25 siblings, 0 replies; 55+ messages in thread
From: Finn Thain @ 2015-07-12 10:25 UTC (permalink / raw)
  To: linux-kernel, linux-m68k, linuxppc-dev, Benjamin Herrenschmidt,
	Paul Mackerras, Michael Ellerman

[-- Attachment #1: fix-powerpc-machdep-inconsistencies --]
[-- Type: text/plain, Size: 3794 bytes --]

Add the nvram_size() function to those PowerPC platforms that don't already
have one: CHRP and PowerMac. This means that the ppc_md.nvram_size()
function can be used to implement arch_nvram_ops.get_size()

Since we are addressing inconsistencies here, also rename chrp_nvram_read
and chrp_nvram_write, which break the naming convention used across
PowerPC platforms for NVRAM accessor functions.

Signed-off-by: Finn Thain <fthain@telegraphics.com.au>

---
 arch/powerpc/platforms/chrp/nvram.c     |   14 ++++++++++----
 arch/powerpc/platforms/powermac/nvram.c |    9 +++++++++
 2 files changed, 19 insertions(+), 4 deletions(-)

Index: linux/arch/powerpc/platforms/chrp/nvram.c
===================================================================
--- linux.orig/arch/powerpc/platforms/chrp/nvram.c	2015-07-12 20:24:53.000000000 +1000
+++ linux/arch/powerpc/platforms/chrp/nvram.c	2015-07-12 20:25:09.000000000 +1000
@@ -23,7 +23,7 @@ static unsigned int nvram_size;
 static unsigned char nvram_buf[4];
 static DEFINE_SPINLOCK(nvram_lock);
 
-static unsigned char chrp_nvram_read(int addr)
+static unsigned char chrp_nvram_read_byte(int addr)
 {
 	unsigned int done;
 	unsigned long flags;
@@ -45,7 +45,7 @@ static unsigned char chrp_nvram_read(int
 	return ret;
 }
 
-static void chrp_nvram_write(int addr, unsigned char val)
+static void chrp_nvram_write_byte(int addr, unsigned char val)
 {
 	unsigned int done;
 	unsigned long flags;
@@ -63,6 +63,11 @@ static void chrp_nvram_write(int addr, u
 	spin_unlock_irqrestore(&nvram_lock, flags);
 }
 
+static ssize_t chrp_nvram_size(void)
+{
+	return nvram_size;
+}
+
 void __init chrp_nvram_init(void)
 {
 	struct device_node *nvram;
@@ -84,8 +89,9 @@ void __init chrp_nvram_init(void)
 	printk(KERN_INFO "CHRP nvram contains %u bytes\n", nvram_size);
 	of_node_put(nvram);
 
-	ppc_md.nvram_read_val = chrp_nvram_read;
-	ppc_md.nvram_write_val = chrp_nvram_write;
+	ppc_md.nvram_read_val  = chrp_nvram_read_byte;
+	ppc_md.nvram_write_val = chrp_nvram_write_byte;
+	ppc_md.nvram_size      = chrp_nvram_size;
 
 	return;
 }
Index: linux/arch/powerpc/platforms/powermac/nvram.c
===================================================================
--- linux.orig/arch/powerpc/platforms/powermac/nvram.c	2015-07-12 20:24:53.000000000 +1000
+++ linux/arch/powerpc/platforms/powermac/nvram.c	2015-07-12 20:25:09.000000000 +1000
@@ -147,6 +147,11 @@ static ssize_t core99_nvram_size(void)
 static volatile unsigned char __iomem *nvram_addr;
 static int nvram_mult;
 
+static ssize_t ppc32_nvram_size(void)
+{
+	return NVRAM_SIZE;
+}
+
 static unsigned char direct_nvram_read_byte(int addr)
 {
 	return in_8(&nvram_data[(addr & (NVRAM_SIZE - 1)) * nvram_mult]);
@@ -590,21 +595,25 @@ int __init pmac_nvram_init(void)
 		nvram_mult = 1;
 		ppc_md.nvram_read_val	= direct_nvram_read_byte;
 		ppc_md.nvram_write_val	= direct_nvram_write_byte;
+		ppc_md.nvram_size	= ppc32_nvram_size;
 	} else if (nvram_naddrs == 1) {
 		nvram_data = ioremap(r1.start, s1);
 		nvram_mult = (s1 + NVRAM_SIZE - 1) / NVRAM_SIZE;
 		ppc_md.nvram_read_val	= direct_nvram_read_byte;
 		ppc_md.nvram_write_val	= direct_nvram_write_byte;
+		ppc_md.nvram_size	= ppc32_nvram_size;
 	} else if (nvram_naddrs == 2) {
 		nvram_addr = ioremap(r1.start, s1);
 		nvram_data = ioremap(r2.start, s2);
 		ppc_md.nvram_read_val	= indirect_nvram_read_byte;
 		ppc_md.nvram_write_val	= indirect_nvram_write_byte;
+		ppc_md.nvram_size	= ppc32_nvram_size;
 	} else if (nvram_naddrs == 0 && sys_ctrler == SYS_CTRLER_PMU) {
 #ifdef CONFIG_ADB_PMU
 		nvram_naddrs = -1;
 		ppc_md.nvram_read_val	= pmu_nvram_read_byte;
 		ppc_md.nvram_write_val	= pmu_nvram_write_byte;
+		ppc_md.nvram_size	= ppc32_nvram_size;
 #endif /* CONFIG_ADB_PMU */
 	} else {
 		printk(KERN_ERR "Incompatible type of NVRAM\n");



^ permalink raw reply	[flat|nested] 55+ messages in thread

* [RFC v4 15/25] powerpc: Implement arch_nvram_ops.get_size() and remove old nvram_* exports
  2015-07-12 10:25 [RFC v4 00/25] Re-use nvram module Finn Thain
                   ` (13 preceding siblings ...)
  2015-07-12 10:25 ` [RFC v4 14/25] powerpc: Add missing ppc_md.nvram_size for CHRP and PowerMac Finn Thain
@ 2015-07-12 10:25 ` Finn Thain
  2015-07-12 10:25 ` [RFC v4 16/25] powerpc: Implement nvram sync ioctl Finn Thain
                   ` (10 subsequent siblings)
  25 siblings, 0 replies; 55+ messages in thread
From: Finn Thain @ 2015-07-12 10:25 UTC (permalink / raw)
  To: linux-kernel, linux-m68k, linuxppc-dev, Benjamin Herrenschmidt,
	Paul Mackerras, Michael Ellerman, Arnd Bergmann,
	Greg Kroah-Hartman

[-- Attachment #1: ppc32-introduce-nvram_ops-get_size --]
[-- Type: text/plain, Size: 2875 bytes --]

Implement arch_nvram_ops for PPC32 and make use of it in the generic_nvram
misc device module so that the nvram_* function exports can be removed.

Signed-off-by: Finn Thain <fthain@telegraphics.com.au>

---
 arch/powerpc/include/asm/nvram.h |    3 ---
 arch/powerpc/kernel/setup_32.c   |   10 +++++++---
 drivers/char/generic_nvram.c     |   24 ++++++++++++------------
 3 files changed, 19 insertions(+), 18 deletions(-)

Index: linux/arch/powerpc/include/asm/nvram.h
===================================================================
--- linux.orig/arch/powerpc/include/asm/nvram.h	2015-07-12 20:25:08.000000000 +1000
+++ linux/arch/powerpc/include/asm/nvram.h	2015-07-12 20:25:10.000000000 +1000
@@ -98,7 +98,4 @@ extern int nvram_write_os_partition(stru
 				    unsigned int err_type,
 				    unsigned int error_log_cnt);
 
-/* Determine NVRAM size */
-extern ssize_t nvram_get_size(void);
-
 #endif /* _ASM_POWERPC_NVRAM_H */
Index: linux/arch/powerpc/kernel/setup_32.c
===================================================================
--- linux.orig/arch/powerpc/kernel/setup_32.c	2015-07-12 20:25:08.000000000 +1000
+++ linux/arch/powerpc/kernel/setup_32.c	2015-07-12 20:25:10.000000000 +1000
@@ -186,13 +186,12 @@ void nvram_write_byte(unsigned char val,
 }
 EXPORT_SYMBOL(nvram_write_byte);
 
-ssize_t nvram_get_size(void)
+static ssize_t ppc_nvram_get_size(void)
 {
 	if (ppc_md.nvram_size)
 		return ppc_md.nvram_size();
-	return -1;
+	return -ENODEV;
 }
-EXPORT_SYMBOL(nvram_get_size);
 
 void nvram_sync(void)
 {
@@ -201,6 +200,11 @@ void nvram_sync(void)
 }
 EXPORT_SYMBOL(nvram_sync);
 
+const struct nvram_ops arch_nvram_ops = {
+	.get_size       = ppc_nvram_get_size,
+};
+EXPORT_SYMBOL(arch_nvram_ops);
+
 #endif /* CONFIG_NVRAM */
 
 int __init ppc_init(void)
Index: linux/drivers/char/generic_nvram.c
===================================================================
--- linux.orig/drivers/char/generic_nvram.c	2015-07-12 20:25:08.000000000 +1000
+++ linux/drivers/char/generic_nvram.c	2015-07-12 20:25:10.000000000 +1000
@@ -28,8 +28,6 @@
 #include <asm/machdep.h>
 #endif
 
-#define NVRAM_SIZE	8192
-
 static DEFINE_MUTEX(nvram_mutex);
 static ssize_t nvram_len;
 
@@ -150,20 +148,22 @@ static struct miscdevice nvram_dev = {
 
 int __init nvram_init(void)
 {
-	int ret = 0;
+	int ret;
 
-	printk(KERN_INFO "Generic non-volatile memory driver v%s\n",
-		NVRAM_VERSION);
-	ret = misc_register(&nvram_dev);
-	if (ret != 0)
-		goto out;
+	if (arch_nvram_ops.get_size == NULL)
+		return -ENODEV;
 
-	nvram_len = nvram_get_size();
+	nvram_len = arch_nvram_ops.get_size();
 	if (nvram_len < 0)
-		nvram_len = NVRAM_SIZE;
+		return nvram_len;
 
-out:
-	return ret;
+	ret = misc_register(&nvram_dev);
+	if (ret)
+		return ret;
+
+	pr_info("Generic non-volatile memory driver v%s\n", NVRAM_VERSION);
+
+	return 0;
 }
 
 void __exit nvram_cleanup(void)



^ permalink raw reply	[flat|nested] 55+ messages in thread

* [RFC v4 16/25] powerpc: Implement nvram sync ioctl
  2015-07-12 10:25 [RFC v4 00/25] Re-use nvram module Finn Thain
                   ` (14 preceding siblings ...)
  2015-07-12 10:25 ` [RFC v4 15/25] powerpc: Implement arch_nvram_ops.get_size() and remove old nvram_* exports Finn Thain
@ 2015-07-12 10:25 ` Finn Thain
  2015-07-12 10:25 ` [RFC v4 17/25] powerpc, fbdev: Use arch_nvram_ops methods instead of nvram_read_byte() and nvram_write_byte() Finn Thain
                   ` (9 subsequent siblings)
  25 siblings, 0 replies; 55+ messages in thread
From: Finn Thain @ 2015-07-12 10:25 UTC (permalink / raw)
  To: linux-kernel, linux-m68k, linuxppc-dev, Benjamin Herrenschmidt,
	Paul Mackerras, Michael Ellerman, Arnd Bergmann,
	Greg Kroah-Hartman

[-- Attachment #1: nvram-add-powerpc-ioctls --]
[-- Type: text/plain, Size: 5578 bytes --]

Add the powerpc-specific sync() method to struct nvram_ops and implement
the corresponding ioctl in the nvram module. This allows the nvram module
to replace the generic_nvram module.

Signed-off-by: Finn Thain <fthain@telegraphics.com.au>

---

On PPC32, the IOC_NVRAM_SYNC ioctl call always returns 0, even for those
platforms that don't implement ppc_md.nvram_sync. This patch retains
that quirk. It might be better to return failure (which is what PPC64 does).

Changed since v1:
- Don't bother acquiring the mutex for unimplemented ioctls.

---
 arch/powerpc/include/asm/nvram.h |    3 ---
 arch/powerpc/kernel/setup_32.c   |    6 +++---
 drivers/char/generic_nvram.c     |    2 +-
 drivers/char/nvram.c             |   39 +++++++++++++++++++++++++++++++++++++++
 include/linux/nvram.h            |    4 ++++
 5 files changed, 47 insertions(+), 7 deletions(-)

Index: linux/drivers/char/nvram.c
===================================================================
--- linux.orig/drivers/char/nvram.c	2015-07-12 20:25:07.000000000 +1000
+++ linux/drivers/char/nvram.c	2015-07-12 20:25:11.000000000 +1000
@@ -48,6 +48,11 @@
 #include <linux/mutex.h>
 
 
+#ifdef CONFIG_PPC
+#include <asm/nvram.h>
+#include <asm/machdep.h>
+#endif
+
 static DEFINE_MUTEX(nvram_mutex);
 static DEFINE_SPINLOCK(nvram_state_lock);
 static int nvram_open_cnt;	/* #times opened */
@@ -338,6 +343,37 @@ static long nvram_misc_ioctl(struct file
 	long ret = -ENOTTY;
 
 	switch (cmd) {
+#ifdef CONFIG_PPC
+#ifdef CONFIG_PPC_PMAC
+	case OBSOLETE_PMAC_NVRAM_GET_OFFSET:
+		pr_warn("nvram: Using obsolete PMAC_NVRAM_GET_OFFSET ioctl\n");
+		/* fall through */
+	case IOC_NVRAM_GET_OFFSET: {
+		int part, offset;
+
+		if (!machine_is(powermac))
+			return -EINVAL;
+		if (copy_from_user(&part,
+		                   (void __user *)arg, sizeof(part)) != 0)
+			return -EFAULT;
+		if (part < pmac_nvram_OF || part > pmac_nvram_NR)
+			return -EINVAL;
+		offset = pmac_get_partition(part);
+		if (copy_to_user((void __user *)arg,
+		                 &offset, sizeof(offset)) != 0)
+			return -EFAULT;
+		ret = 0;
+		break;
+	}
+#endif
+	case IOC_NVRAM_SYNC:
+		if (arch_nvram_ops.sync != NULL) {
+			mutex_lock(&nvram_mutex);
+			ret = arch_nvram_ops.sync();
+			mutex_unlock(&nvram_mutex);
+		}
+		break;
+#else /* !CONFIG_PPC */
 	case NVRAM_INIT:
 		/* initialize NVRAM contents and checksum */
 		if (!capable(CAP_SYS_ADMIN))
@@ -361,6 +397,7 @@ static long nvram_misc_ioctl(struct file
 			mutex_unlock(&nvram_mutex);
 		}
 		break;
+#endif /* CONFIG_PPC */
 	}
 	return ret;
 }
@@ -376,6 +413,7 @@ static int nvram_misc_open(struct inode
 		return -EBUSY;
 	}
 
+#ifndef CONFIG_PPC
 	/* Prevent multiple writers if the set_checksum ioctl is implemented. */
 	if ((arch_nvram_ops.set_checksum != NULL) &&
 	    (file->f_mode & FMODE_WRITE) &&
@@ -383,6 +421,7 @@ static int nvram_misc_open(struct inode
 		spin_unlock(&nvram_state_lock);
 		return -EBUSY;
 	}
+#endif
 
 	if (file->f_flags & O_EXCL)
 		nvram_open_mode |= NVRAM_EXCL;
Index: linux/include/linux/nvram.h
===================================================================
--- linux.orig/include/linux/nvram.h	2015-07-12 20:25:02.000000000 +1000
+++ linux/include/linux/nvram.h	2015-07-12 20:25:11.000000000 +1000
@@ -17,8 +17,12 @@ struct nvram_ops {
 	unsigned char   (*read_byte)(int);
 	void            (*write_byte)(unsigned char, int);
 	ssize_t         (*get_size)(void);
+#ifdef CONFIG_PPC
+	long            (*sync)(void);
+#else
 	long            (*set_checksum)(void);
 	long            (*initialize)(void);
+#endif
 };
 
 extern const struct nvram_ops arch_nvram_ops;
Index: linux/arch/powerpc/include/asm/nvram.h
===================================================================
--- linux.orig/arch/powerpc/include/asm/nvram.h	2015-07-12 20:25:10.000000000 +1000
+++ linux/arch/powerpc/include/asm/nvram.h	2015-07-12 20:25:11.000000000 +1000
@@ -78,9 +78,6 @@ extern int	pmac_get_partition(int partit
 extern u8	pmac_xpram_read(int xpaddr);
 extern void	pmac_xpram_write(int xpaddr, u8 data);
 
-/* Synchronize NVRAM */
-extern void	nvram_sync(void);
-
 /* Initialize NVRAM OS partition */
 extern int __init nvram_init_os_partition(struct nvram_os_partition *part);
 
Index: linux/arch/powerpc/kernel/setup_32.c
===================================================================
--- linux.orig/arch/powerpc/kernel/setup_32.c	2015-07-12 20:25:10.000000000 +1000
+++ linux/arch/powerpc/kernel/setup_32.c	2015-07-12 20:25:11.000000000 +1000
@@ -170,7 +170,6 @@ __setup("l3cr=", ppc_setup_l3cr);
 
 #ifdef CONFIG_GENERIC_NVRAM
 
-/* Generic nvram hooks used by drivers/char/gen_nvram.c */
 unsigned char nvram_read_byte(int addr)
 {
 	if (ppc_md.nvram_read_val)
@@ -193,15 +192,16 @@ static ssize_t ppc_nvram_get_size(void)
 	return -ENODEV;
 }
 
-void nvram_sync(void)
+static long ppc_nvram_sync(void)
 {
 	if (ppc_md.nvram_sync)
 		ppc_md.nvram_sync();
+	return 0;
 }
-EXPORT_SYMBOL(nvram_sync);
 
 const struct nvram_ops arch_nvram_ops = {
 	.get_size       = ppc_nvram_get_size,
+	.sync           = ppc_nvram_sync,
 };
 EXPORT_SYMBOL(arch_nvram_ops);
 
Index: linux/drivers/char/generic_nvram.c
===================================================================
--- linux.orig/drivers/char/generic_nvram.c	2015-07-12 20:25:10.000000000 +1000
+++ linux/drivers/char/generic_nvram.c	2015-07-12 20:25:11.000000000 +1000
@@ -112,7 +112,7 @@ static int nvram_ioctl(struct file *file
 	}
 #endif /* CONFIG_PPC_PMAC */
 	case IOC_NVRAM_SYNC:
-		nvram_sync();
+		arch_nvram_ops.sync();
 		break;
 	default:
 		return -EINVAL;



^ permalink raw reply	[flat|nested] 55+ messages in thread

* [RFC v4 17/25] powerpc, fbdev: Use arch_nvram_ops methods instead of nvram_read_byte() and nvram_write_byte()
  2015-07-12 10:25 [RFC v4 00/25] Re-use nvram module Finn Thain
                   ` (15 preceding siblings ...)
  2015-07-12 10:25 ` [RFC v4 16/25] powerpc: Implement nvram sync ioctl Finn Thain
@ 2015-07-12 10:25 ` Finn Thain
  2015-07-14  7:58   ` Finn Thain
  2015-07-12 10:25 ` [RFC v4 18/25] nvram: Drop nvram_* symbol exports and prototypes Finn Thain
                   ` (8 subsequent siblings)
  25 siblings, 1 reply; 55+ messages in thread
From: Finn Thain @ 2015-07-12 10:25 UTC (permalink / raw)
  To: linux-kernel, linux-m68k, linuxppc-dev, Benjamin Herrenschmidt,
	Paul Mackerras, Michael Ellerman, Arnd Bergmann,
	Greg Kroah-Hartman, Jean-Christophe Plagniol-Villard,
	Tomi Valkeinen, linux-fbdev

[-- Attachment #1: ppc32-replace-exported-nvram-functions --]
[-- Type: text/plain, Size: 7388 bytes --]

Make use of arch_nvram_ops in device drivers so that the nvram_*
function exports can be removed.

Since they are no longer global symbols, rename the PPC32 nvram_* functions
appropriately.

Add the missing CONFIG_NVRAM test to imsttfb to avoid a build failure.

Signed-off-by: Finn Thain <fthain@telegraphics.com.au>

---
 arch/powerpc/kernel/setup_32.c             |    8 ++++----
 drivers/char/generic_nvram.c               |    4 ++--
 drivers/video/fbdev/controlfb.c            |    4 ++--
 drivers/video/fbdev/imsttfb.c              |    7 +++----
 drivers/video/fbdev/matrox/matroxfb_base.c |    2 +-
 drivers/video/fbdev/platinumfb.c           |    4 ++--
 drivers/video/fbdev/valkyriefb.c           |    4 ++--
 7 files changed, 16 insertions(+), 17 deletions(-)

Index: linux/arch/powerpc/kernel/setup_32.c
===================================================================
--- linux.orig/arch/powerpc/kernel/setup_32.c	2015-07-12 20:25:11.000000000 +1000
+++ linux/arch/powerpc/kernel/setup_32.c	2015-07-12 20:25:13.000000000 +1000
@@ -170,20 +170,18 @@ __setup("l3cr=", ppc_setup_l3cr);
 
 #ifdef CONFIG_GENERIC_NVRAM
 
-unsigned char nvram_read_byte(int addr)
+static unsigned char ppc_nvram_read_byte(int addr)
 {
 	if (ppc_md.nvram_read_val)
 		return ppc_md.nvram_read_val(addr);
 	return 0xff;
 }
-EXPORT_SYMBOL(nvram_read_byte);
 
-void nvram_write_byte(unsigned char val, int addr)
+static void ppc_nvram_write_byte(unsigned char val, int addr)
 {
 	if (ppc_md.nvram_write_val)
 		ppc_md.nvram_write_val(addr, val);
 }
-EXPORT_SYMBOL(nvram_write_byte);
 
 static ssize_t ppc_nvram_get_size(void)
 {
@@ -200,6 +198,8 @@ static long ppc_nvram_sync(void)
 }
 
 const struct nvram_ops arch_nvram_ops = {
+	.read_byte      = ppc_nvram_read_byte,
+	.write_byte     = ppc_nvram_write_byte,
 	.get_size       = ppc_nvram_get_size,
 	.sync           = ppc_nvram_sync,
 };
Index: linux/drivers/char/generic_nvram.c
===================================================================
--- linux.orig/drivers/char/generic_nvram.c	2015-07-12 20:25:11.000000000 +1000
+++ linux/drivers/char/generic_nvram.c	2015-07-12 20:25:13.000000000 +1000
@@ -64,7 +64,7 @@ static ssize_t read_nvram(struct file *f
 	if (*ppos >= nvram_len)
 		return 0;
 	for (i = *ppos; count > 0 && i < nvram_len; ++i, ++p, --count)
-		if (__put_user(nvram_read_byte(i), p))
+		if (__put_user(arch_nvram_ops.read_byte(i), p))
 			return -EFAULT;
 	*ppos = i;
 	return p - buf;
@@ -84,7 +84,7 @@ static ssize_t write_nvram(struct file *
 	for (i = *ppos; count > 0 && i < nvram_len; ++i, ++p, --count) {
 		if (__get_user(c, p))
 			return -EFAULT;
-		nvram_write_byte(c, i);
+		arch_nvram_ops.write_byte(c, i);
 	}
 	*ppos = i;
 	return p - buf;
Index: linux/drivers/video/fbdev/controlfb.c
===================================================================
--- linux.orig/drivers/video/fbdev/controlfb.c	2015-07-12 20:24:53.000000000 +1000
+++ linux/drivers/video/fbdev/controlfb.c	2015-07-12 20:25:13.000000000 +1000
@@ -415,7 +415,7 @@ static int __init init_control(struct fb
 	/* Try to pick a video mode out of NVRAM if we have one. */
 #ifdef CONFIG_NVRAM
 	if (default_cmode == CMODE_NVRAM) {
-		cmode = nvram_read_byte(NV_CMODE);
+		cmode = arch_nvram_ops.read_byte(NV_CMODE);
 		if(cmode < CMODE_8 || cmode > CMODE_32)
 			cmode = CMODE_8;
 	} else
@@ -423,7 +423,7 @@ static int __init init_control(struct fb
 		cmode=default_cmode;
 #ifdef CONFIG_NVRAM
 	if (default_vmode == VMODE_NVRAM) {
-		vmode = nvram_read_byte(NV_VMODE);
+		vmode = arch_nvram_ops.read_byte(NV_VMODE);
 		if (vmode < 1 || vmode > VMODE_MAX ||
 		    control_mac_modes[vmode - 1].m[full] < cmode) {
 			sense = read_control_sense(p);
Index: linux/drivers/video/fbdev/matrox/matroxfb_base.c
===================================================================
--- linux.orig/drivers/video/fbdev/matrox/matroxfb_base.c	2015-07-12 20:25:08.000000000 +1000
+++ linux/drivers/video/fbdev/matrox/matroxfb_base.c	2015-07-12 20:25:13.000000000 +1000
@@ -1888,7 +1888,7 @@ static int initMatrox2(struct matrox_fb_
 			default_vmode = VMODE_640_480_60;
 #ifdef CONFIG_NVRAM
 		if (default_cmode == CMODE_NVRAM)
-			default_cmode = nvram_read_byte(NV_CMODE);
+			default_cmode = arch_nvram_ops.read_byte(NV_CMODE);
 #endif
 		if (default_cmode < CMODE_8 || default_cmode > CMODE_32)
 			default_cmode = CMODE_8;
Index: linux/drivers/video/fbdev/platinumfb.c
===================================================================
--- linux.orig/drivers/video/fbdev/platinumfb.c	2015-07-12 20:24:53.000000000 +1000
+++ linux/drivers/video/fbdev/platinumfb.c	2015-07-12 20:25:13.000000000 +1000
@@ -349,7 +349,7 @@ static int platinum_init_fb(struct fb_in
 	printk(KERN_INFO "platinumfb: Monitor sense value = 0x%x, ", sense);
 	if (default_vmode == VMODE_NVRAM) {
 #ifdef CONFIG_NVRAM
-		default_vmode = nvram_read_byte(NV_VMODE);
+		default_vmode = arch_nvram_ops.read_byte(NV_VMODE);
 		if (default_vmode <= 0 || default_vmode > VMODE_MAX ||
 		    !platinum_reg_init[default_vmode-1])
 #endif
@@ -362,7 +362,7 @@ static int platinum_init_fb(struct fb_in
 		default_vmode = VMODE_640_480_60;
 #ifdef CONFIG_NVRAM
 	if (default_cmode == CMODE_NVRAM)
-		default_cmode = nvram_read_byte(NV_CMODE);
+		default_cmode = arch_nvram_ops.read_byte(NV_CMODE);
 #endif
 	if (default_cmode < CMODE_8 || default_cmode > CMODE_32)
 		default_cmode = CMODE_8;
Index: linux/drivers/video/fbdev/valkyriefb.c
===================================================================
--- linux.orig/drivers/video/fbdev/valkyriefb.c	2015-07-12 20:24:53.000000000 +1000
+++ linux/drivers/video/fbdev/valkyriefb.c	2015-07-12 20:25:13.000000000 +1000
@@ -287,7 +287,7 @@ static void __init valkyrie_choose_mode(
 	/* Try to pick a video mode out of NVRAM if we have one. */
 #if !defined(CONFIG_MAC) && defined(CONFIG_NVRAM)
 	if (default_vmode == VMODE_NVRAM) {
-		default_vmode = nvram_read_byte(NV_VMODE);
+		default_vmode = arch_nvram_ops.read_byte(NV_VMODE);
 		if (default_vmode <= 0
 		 || default_vmode > VMODE_MAX
 		 || !valkyrie_reg_init[default_vmode - 1])
@@ -300,7 +300,7 @@ static void __init valkyrie_choose_mode(
 		default_vmode = VMODE_640_480_67;
 #if !defined(CONFIG_MAC) && defined(CONFIG_NVRAM)
 	if (default_cmode == CMODE_NVRAM)
-		default_cmode = nvram_read_byte(NV_CMODE);
+		default_cmode = arch_nvram_ops.read_byte(NV_CMODE);
 #endif
 
 	/*
Index: linux/drivers/video/fbdev/imsttfb.c
===================================================================
--- linux.orig/drivers/video/fbdev/imsttfb.c	2015-07-12 20:24:53.000000000 +1000
+++ linux/drivers/video/fbdev/imsttfb.c	2015-07-12 20:25:13.000000000 +1000
@@ -328,7 +328,6 @@ enum {
 	TVP = 1
 };
 
-#define USE_NV_MODES		1
 #define INIT_BPP		8
 #define INIT_XRES		640
 #define INIT_YRES		480
@@ -1391,17 +1390,17 @@ static void init_imstt(struct fb_info *i
 		}
 	}
 
-#if USE_NV_MODES && defined(CONFIG_PPC32)
+#if defined(CONFIG_NVRAM) && defined(CONFIG_PPC32)
 	{
 		int vmode = init_vmode, cmode = init_cmode;
 
 		if (vmode == -1) {
-			vmode = nvram_read_byte(NV_VMODE);
+			vmode = arch_nvram_ops.read_byte(NV_VMODE);
 			if (vmode <= 0 || vmode > VMODE_MAX)
 				vmode = VMODE_640_480_67;
 		}
 		if (cmode == -1) {
-			cmode = nvram_read_byte(NV_CMODE);
+			cmode = arch_nvram_ops.read_byte(NV_CMODE);
 			if (cmode < CMODE_8 || cmode > CMODE_32)
 				cmode = CMODE_8;
 		}



^ permalink raw reply	[flat|nested] 55+ messages in thread

* [RFC v4 18/25] nvram: Drop nvram_* symbol exports and prototypes
  2015-07-12 10:25 [RFC v4 00/25] Re-use nvram module Finn Thain
                   ` (16 preceding siblings ...)
  2015-07-12 10:25 ` [RFC v4 17/25] powerpc, fbdev: Use arch_nvram_ops methods instead of nvram_read_byte() and nvram_write_byte() Finn Thain
@ 2015-07-12 10:25 ` Finn Thain
  2015-07-12 10:25 ` [RFC v4 19/25] powerpc: Remove CONFIG_GENERIC_NVRAM and adopt CONFIG_HAVE_ARCH_NVRAM_OPS Finn Thain
                   ` (7 subsequent siblings)
  25 siblings, 0 replies; 55+ messages in thread
From: Finn Thain @ 2015-07-12 10:25 UTC (permalink / raw)
  To: linux-kernel, linux-m68k, linuxppc-dev, Geert Uytterhoeven,
	Arnd Bergmann, Greg Kroah-Hartman

[-- Attachment #1: remove-exported-nvram-functions --]
[-- Type: text/plain, Size: 4200 bytes --]

Drivers now use the arch_nvram_ops calls so remove the function exports and
prototypes. nvram_check_checksum() is unused so remove it.

Signed-off-by: Finn Thain <fthain@telegraphics.com.au>

---
 arch/m68k/atari/nvram.c |    6 +++---
 drivers/char/nvram.c    |   27 +++++----------------------
 include/linux/nvram.h   |    8 --------
 3 files changed, 8 insertions(+), 33 deletions(-)

Index: linux/drivers/char/nvram.c
===================================================================
--- linux.orig/drivers/char/nvram.c	2015-07-12 20:25:11.000000000 +1000
+++ linux/drivers/char/nvram.c	2015-07-12 20:25:15.000000000 +1000
@@ -82,13 +82,12 @@ static ssize_t nvram_size;
  * periodic 11 min sync from kernel/time/ntp.c vs. this driver.)
  */
 
-unsigned char __nvram_read_byte(int i)
+static unsigned char __nvram_read_byte(int i)
 {
 	return CMOS_READ(NVRAM_FIRST_BYTE + i);
 }
-EXPORT_SYMBOL(__nvram_read_byte);
 
-unsigned char nvram_read_byte(int i)
+static unsigned char nvram_read_byte(int i)
 {
 	unsigned long flags;
 	unsigned char c;
@@ -98,16 +97,14 @@ unsigned char nvram_read_byte(int i)
 	spin_unlock_irqrestore(&rtc_lock, flags);
 	return c;
 }
-EXPORT_SYMBOL(nvram_read_byte);
 
 /* This races nicely with trying to read with checksum checking (nvram_read) */
-void __nvram_write_byte(unsigned char c, int i)
+static void __nvram_write_byte(unsigned char c, int i)
 {
 	CMOS_WRITE(c, NVRAM_FIRST_BYTE + i);
 }
-EXPORT_SYMBOL(__nvram_write_byte);
 
-void nvram_write_byte(unsigned char c, int i)
+static void nvram_write_byte(unsigned char c, int i)
 {
 	unsigned long flags;
 
@@ -115,14 +112,13 @@ void nvram_write_byte(unsigned char c, i
 	__nvram_write_byte(c, i);
 	spin_unlock_irqrestore(&rtc_lock, flags);
 }
-EXPORT_SYMBOL(nvram_write_byte);
 
 /* On PCs, the checksum is built only over bytes 2..31 */
 #define PC_CKS_RANGE_START	2
 #define PC_CKS_RANGE_END	31
 #define PC_CKS_LOC		32
 
-int __nvram_check_checksum(void)
+static int __nvram_check_checksum(void)
 {
 	int i;
 	unsigned short sum = 0;
@@ -134,19 +130,6 @@ int __nvram_check_checksum(void)
 	    __nvram_read_byte(PC_CKS_LOC+1);
 	return (sum & 0xffff) == expect;
 }
-EXPORT_SYMBOL(__nvram_check_checksum);
-
-int nvram_check_checksum(void)
-{
-	unsigned long flags;
-	int rv;
-
-	spin_lock_irqsave(&rtc_lock, flags);
-	rv = __nvram_check_checksum();
-	spin_unlock_irqrestore(&rtc_lock, flags);
-	return rv;
-}
-EXPORT_SYMBOL(nvram_check_checksum);
 
 static void __nvram_set_checksum(void)
 {
Index: linux/include/linux/nvram.h
===================================================================
--- linux.orig/include/linux/nvram.h	2015-07-12 20:25:11.000000000 +1000
+++ linux/include/linux/nvram.h	2015-07-12 20:25:15.000000000 +1000
@@ -3,14 +3,6 @@
 
 #include <uapi/linux/nvram.h>
 
-/* __foo is foo without grabbing the rtc_lock - get it yourself */
-extern unsigned char __nvram_read_byte(int i);
-extern unsigned char nvram_read_byte(int i);
-extern void __nvram_write_byte(unsigned char c, int i);
-extern void nvram_write_byte(unsigned char c, int i);
-extern int __nvram_check_checksum(void);
-extern int nvram_check_checksum(void);
-
 struct nvram_ops {
 	ssize_t         (*read)(char *, size_t, loff_t *);
 	ssize_t         (*write)(char *, size_t, loff_t *);
Index: linux/arch/m68k/atari/nvram.c
===================================================================
--- linux.orig/arch/m68k/atari/nvram.c	2015-07-12 20:25:05.000000000 +1000
+++ linux/arch/m68k/atari/nvram.c	2015-07-12 20:25:15.000000000 +1000
@@ -33,13 +33,13 @@
  * periodic 11 min sync from kernel/time/ntp.c vs. this driver.)
  */
 
-unsigned char __nvram_read_byte(int i)
+static unsigned char __nvram_read_byte(int i)
 {
 	return CMOS_READ(NVRAM_FIRST_BYTE + i);
 }
 
 /* This races nicely with trying to read with checksum checking */
-void __nvram_write_byte(unsigned char c, int i)
+static void __nvram_write_byte(unsigned char c, int i)
 {
 	CMOS_WRITE(c, NVRAM_FIRST_BYTE + i);
 }
@@ -51,7 +51,7 @@ void __nvram_write_byte(unsigned char c,
 #define ATARI_CKS_RANGE_END	47
 #define ATARI_CKS_LOC		48
 
-int __nvram_check_checksum(void)
+static int __nvram_check_checksum(void)
 {
 	int i;
 	unsigned char sum = 0;



^ permalink raw reply	[flat|nested] 55+ messages in thread

* [RFC v4 19/25] powerpc: Remove CONFIG_GENERIC_NVRAM and adopt CONFIG_HAVE_ARCH_NVRAM_OPS
  2015-07-12 10:25 [RFC v4 00/25] Re-use nvram module Finn Thain
                   ` (17 preceding siblings ...)
  2015-07-12 10:25 ` [RFC v4 18/25] nvram: Drop nvram_* symbol exports and prototypes Finn Thain
@ 2015-07-12 10:25 ` Finn Thain
  2015-07-12 10:25 ` [RFC v4 20/25] char/generic_nvram: Remove as unused Finn Thain
                   ` (6 subsequent siblings)
  25 siblings, 0 replies; 55+ messages in thread
From: Finn Thain @ 2015-07-12 10:25 UTC (permalink / raw)
  To: linux-kernel, linux-m68k, linuxppc-dev, Benjamin Herrenschmidt,
	Paul Mackerras, Michael Ellerman, Arnd Bergmann,
	Greg Kroah-Hartman

[-- Attachment #1: powerpc-adopt-arch_nvram_ops --]
[-- Type: text/plain, Size: 5265 bytes --]

Switch PPC32 kernels from the generic_nvram module to the nvram module.

Also fix a theoretical bug where CHRP omits the chrp_nvram_init()
call when CONFIG_NVRAM_MODULE=m.

As before, when CONFIG_PPC && !CONFIG_PPC_PMAC, the IOC_NVRAM_GET_OFFSET
ioctl is unimplemented. For the nvram module, unimplemented ioctls return
-ENOTTY. Whereas, for the superseded generic_nvram module they would
return -EINVAL.

Signed-off-by: Finn Thain <fthain@telegraphics.com.au>

---

This ioctl change is visible to userspace code but only in an error path.
I didn't find any userspace code that uses the IOC_NVRAM_GET_OFFSET ioctl.

The change in the name of the module is also visible. The module that
implements /dev/nvram on PowerPC now has suitable aliases, i.e.
MODULE_ALIAS_MISCDEV(NVRAM_MINOR);
MODULE_ALIAS("devname:nvram"); 
so that the device special file can be automatically created and the
module automatically loaded when needed. Previously this was not the case.

---

Changes since v1:
- Small indentation fix.

---
 arch/powerpc/Kconfig                    |    2 +-
 arch/powerpc/kernel/setup_32.c          |    2 +-
 arch/powerpc/platforms/chrp/Makefile    |    2 +-
 arch/powerpc/platforms/chrp/setup.c     |    2 +-
 arch/powerpc/platforms/powermac/setup.c |    3 +--
 drivers/char/Kconfig                    |   10 ++++++----
 6 files changed, 11 insertions(+), 10 deletions(-)

Index: linux/arch/powerpc/Kconfig
===================================================================
--- linux.orig/arch/powerpc/Kconfig	2015-07-12 20:24:53.000000000 +1000
+++ linux/arch/powerpc/Kconfig	2015-07-12 20:25:16.000000000 +1000
@@ -178,7 +178,7 @@ config SYSVIPC_COMPAT
 	default y
 
 # All PPC32s use generic nvram driver through ppc_md
-config GENERIC_NVRAM
+config HAVE_ARCH_NVRAM_OPS
 	bool
 	default y if PPC32
 
Index: linux/arch/powerpc/kernel/setup_32.c
===================================================================
--- linux.orig/arch/powerpc/kernel/setup_32.c	2015-07-12 20:25:13.000000000 +1000
+++ linux/arch/powerpc/kernel/setup_32.c	2015-07-12 20:25:16.000000000 +1000
@@ -168,7 +168,7 @@ int __init ppc_setup_l3cr(char *str)
 }
 __setup("l3cr=", ppc_setup_l3cr);
 
-#ifdef CONFIG_GENERIC_NVRAM
+#if IS_ENABLED(CONFIG_NVRAM)
 
 static unsigned char ppc_nvram_read_byte(int addr)
 {
Index: linux/arch/powerpc/platforms/chrp/Makefile
===================================================================
--- linux.orig/arch/powerpc/platforms/chrp/Makefile	2015-07-12 20:24:53.000000000 +1000
+++ linux/arch/powerpc/platforms/chrp/Makefile	2015-07-12 20:25:16.000000000 +1000
@@ -1,3 +1,3 @@
 obj-y				+= setup.o time.o pegasos_eth.o pci.o
 obj-$(CONFIG_SMP)		+= smp.o
-obj-$(CONFIG_NVRAM)		+= nvram.o
+obj-$(CONFIG_NVRAM:m=y)		+= nvram.o
Index: linux/arch/powerpc/platforms/chrp/setup.c
===================================================================
--- linux.orig/arch/powerpc/platforms/chrp/setup.c	2015-07-12 20:24:53.000000000 +1000
+++ linux/arch/powerpc/platforms/chrp/setup.c	2015-07-12 20:25:16.000000000 +1000
@@ -557,7 +557,7 @@ void __init chrp_init_IRQ(void)
 void __init
 chrp_init2(void)
 {
-#ifdef CONFIG_NVRAM
+#if IS_ENABLED(CONFIG_NVRAM)
 	chrp_nvram_init();
 #endif
 
Index: linux/arch/powerpc/platforms/powermac/setup.c
===================================================================
--- linux.orig/arch/powerpc/platforms/powermac/setup.c	2015-07-12 20:24:53.000000000 +1000
+++ linux/arch/powerpc/platforms/powermac/setup.c	2015-07-12 20:25:16.000000000 +1000
@@ -321,8 +321,7 @@ static void __init pmac_setup_arch(void)
 	find_via_pmu();
 	smu_init();
 
-#if defined(CONFIG_NVRAM) || defined(CONFIG_NVRAM_MODULE) || \
-    defined(CONFIG_PPC64)
+#if IS_ENABLED(CONFIG_NVRAM) || defined(CONFIG_PPC64)
 	pmac_nvram_init();
 #endif
 
Index: linux/drivers/char/Kconfig
===================================================================
--- linux.orig/drivers/char/Kconfig	2015-07-12 20:25:05.000000000 +1000
+++ linux/drivers/char/Kconfig	2015-07-12 20:25:16.000000000 +1000
@@ -247,7 +247,7 @@ source "drivers/char/hw_random/Kconfig"
 
 config NVRAM
 	tristate "/dev/nvram support"
-	depends on X86 || (ARM && RTC_DRV_CMOS) || GENERIC_NVRAM || HAVE_ARCH_NVRAM_OPS
+	depends on X86 || (ARM && RTC_DRV_CMOS) || HAVE_ARCH_NVRAM_OPS
 	---help---
 	  If you say Y here and create a character special file /dev/nvram
 	  with major number 10 and minor number 144 using mknod ("man mknod"),
@@ -256,9 +256,11 @@ config NVRAM
 	  and most Ataris.  The actual number of bytes varies, depending on the
 	  nvram in the system, but is usually 114 (128-14 for the RTC).
 
-	  This memory is conventionally called "CMOS RAM" on PCs and "NVRAM"
-	  on Ataris. /dev/nvram may be used to view settings there, or to
-	  change them (with some utility). It could also be used to frequently
+	  This memory is conventionally called "CMOS RAM" on PCs,
+	  "NVRAM" on Ataris and "PRAM" on Macintoshes.
+
+	  /dev/nvram may be used to view settings in NVRAM, or to change them
+	  (with some utility). It could also be used to frequently
 	  save a few bits of very important data that may not be lost over
 	  power-off and for which writing to disk is too insecure. Note
 	  however that most NVRAM space in a PC belongs to the BIOS and you



^ permalink raw reply	[flat|nested] 55+ messages in thread

* [RFC v4 20/25] char/generic_nvram: Remove as unused
  2015-07-12 10:25 [RFC v4 00/25] Re-use nvram module Finn Thain
                   ` (18 preceding siblings ...)
  2015-07-12 10:25 ` [RFC v4 19/25] powerpc: Remove CONFIG_GENERIC_NVRAM and adopt CONFIG_HAVE_ARCH_NVRAM_OPS Finn Thain
@ 2015-07-12 10:25 ` Finn Thain
  2015-07-12 10:25 ` [RFC v4 21/25] powerpc: Adopt nvram module for PPC64 Finn Thain
                   ` (5 subsequent siblings)
  25 siblings, 0 replies; 55+ messages in thread
From: Finn Thain @ 2015-07-12 10:25 UTC (permalink / raw)
  To: linux-kernel, linux-m68k, linuxppc-dev, Arnd Bergmann,
	Greg Kroah-Hartman

[-- Attachment #1: generic_nvram-remove --]
[-- Type: text/plain, Size: 4969 bytes --]

And thus eliminate some twisted CONFIG_GENERIC_NVRAM logic.

Signed-off-by: Finn Thain <fthain@telegraphics.com.au>

---
 drivers/char/Makefile        |    6 -
 drivers/char/generic_nvram.c |  176 -------------------------------------------
 2 files changed, 1 insertion(+), 181 deletions(-)

Index: linux/drivers/char/Makefile
===================================================================
--- linux.orig/drivers/char/Makefile	2015-07-12 20:24:53.000000000 +1000
+++ linux/drivers/char/Makefile	2015-07-12 20:25:18.000000000 +1000
@@ -30,11 +30,7 @@ obj-$(CONFIG_GEN_RTC)		+= genrtc.o
 obj-$(CONFIG_EFI_RTC)		+= efirtc.o
 obj-$(CONFIG_DS1302)		+= ds1302.o
 obj-$(CONFIG_XILINX_HWICAP)	+= xilinx_hwicap/
-ifeq ($(CONFIG_GENERIC_NVRAM),y)
-  obj-$(CONFIG_NVRAM)	+= generic_nvram.o
-else
-  obj-$(CONFIG_NVRAM)	+= nvram.o
-endif
+obj-$(CONFIG_NVRAM)		+= nvram.o
 obj-$(CONFIG_TOSHIBA)		+= toshiba.o
 obj-$(CONFIG_I8K)		+= i8k.o
 obj-$(CONFIG_DS1620)		+= ds1620.o
Index: linux/drivers/char/generic_nvram.c
===================================================================
--- linux.orig/drivers/char/generic_nvram.c	2015-07-12 20:25:13.000000000 +1000
+++ /dev/null	1970-01-01 00:00:00.000000000 +0000
@@ -1,176 +0,0 @@
-/*
- * Generic /dev/nvram driver for architectures providing some
- * "generic" hooks, that is :
- *
- * nvram_read_byte, nvram_write_byte, nvram_sync, nvram_get_size
- *
- * Note that an additional hook is supported for PowerMac only
- * for getting the nvram "partition" informations
- *
- */
-
-#define NVRAM_VERSION "1.1"
-
-#include <linux/module.h>
-
-#include <linux/types.h>
-#include <linux/errno.h>
-#include <linux/fs.h>
-#include <linux/miscdevice.h>
-#include <linux/fcntl.h>
-#include <linux/init.h>
-#include <linux/mutex.h>
-#include <linux/nvram.h>
-#include <asm/uaccess.h>
-
-#ifdef CONFIG_PPC_PMAC
-#include <asm/nvram.h>
-#include <asm/machdep.h>
-#endif
-
-static DEFINE_MUTEX(nvram_mutex);
-static ssize_t nvram_len;
-
-static loff_t nvram_llseek(struct file *file, loff_t offset, int origin)
-{
-	switch (origin) {
-	case 0:
-		break;
-	case 1:
-		offset += file->f_pos;
-		break;
-	case 2:
-		offset += nvram_len;
-		break;
-	default:
-		offset = -1;
-	}
-	if (offset < 0)
-		return -EINVAL;
-
-	file->f_pos = offset;
-
-	return file->f_pos;
-}
-
-static ssize_t read_nvram(struct file *file, char __user *buf,
-			  size_t count, loff_t *ppos)
-{
-	unsigned int i;
-	char __user *p = buf;
-
-	if (!access_ok(VERIFY_WRITE, buf, count))
-		return -EFAULT;
-	if (*ppos >= nvram_len)
-		return 0;
-	for (i = *ppos; count > 0 && i < nvram_len; ++i, ++p, --count)
-		if (__put_user(arch_nvram_ops.read_byte(i), p))
-			return -EFAULT;
-	*ppos = i;
-	return p - buf;
-}
-
-static ssize_t write_nvram(struct file *file, const char __user *buf,
-			   size_t count, loff_t *ppos)
-{
-	unsigned int i;
-	const char __user *p = buf;
-	char c;
-
-	if (!access_ok(VERIFY_READ, buf, count))
-		return -EFAULT;
-	if (*ppos >= nvram_len)
-		return 0;
-	for (i = *ppos; count > 0 && i < nvram_len; ++i, ++p, --count) {
-		if (__get_user(c, p))
-			return -EFAULT;
-		arch_nvram_ops.write_byte(c, i);
-	}
-	*ppos = i;
-	return p - buf;
-}
-
-static int nvram_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
-{
-	switch(cmd) {
-#ifdef CONFIG_PPC_PMAC
-	case OBSOLETE_PMAC_NVRAM_GET_OFFSET:
-		printk(KERN_WARNING "nvram: Using obsolete PMAC_NVRAM_GET_OFFSET ioctl\n");
-	case IOC_NVRAM_GET_OFFSET: {
-		int part, offset;
-
-		if (!machine_is(powermac))
-			return -EINVAL;
-		if (copy_from_user(&part, (void __user*)arg, sizeof(part)) != 0)
-			return -EFAULT;
-		if (part < pmac_nvram_OF || part > pmac_nvram_NR)
-			return -EINVAL;
-		offset = pmac_get_partition(part);
-		if (copy_to_user((void __user*)arg, &offset, sizeof(offset)) != 0)
-			return -EFAULT;
-		break;
-	}
-#endif /* CONFIG_PPC_PMAC */
-	case IOC_NVRAM_SYNC:
-		arch_nvram_ops.sync();
-		break;
-	default:
-		return -EINVAL;
-	}
-
-	return 0;
-}
-
-static long nvram_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
-{
-	int ret;
-
-	mutex_lock(&nvram_mutex);
-	ret = nvram_ioctl(file, cmd, arg);
-	mutex_unlock(&nvram_mutex);
-
-	return ret;
-}
-
-const struct file_operations nvram_fops = {
-	.owner		= THIS_MODULE,
-	.llseek		= nvram_llseek,
-	.read		= read_nvram,
-	.write		= write_nvram,
-	.unlocked_ioctl	= nvram_unlocked_ioctl,
-};
-
-static struct miscdevice nvram_dev = {
-	NVRAM_MINOR,
-	"nvram",
-	&nvram_fops
-};
-
-int __init nvram_init(void)
-{
-	int ret;
-
-	if (arch_nvram_ops.get_size == NULL)
-		return -ENODEV;
-
-	nvram_len = arch_nvram_ops.get_size();
-	if (nvram_len < 0)
-		return nvram_len;
-
-	ret = misc_register(&nvram_dev);
-	if (ret)
-		return ret;
-
-	pr_info("Generic non-volatile memory driver v%s\n", NVRAM_VERSION);
-
-	return 0;
-}
-
-void __exit nvram_cleanup(void)
-{
-        misc_deregister( &nvram_dev );
-}
-
-module_init(nvram_init);
-module_exit(nvram_cleanup);
-MODULE_LICENSE("GPL");



^ permalink raw reply	[flat|nested] 55+ messages in thread

* [RFC v4 21/25] powerpc: Adopt nvram module for PPC64
  2015-07-12 10:25 [RFC v4 00/25] Re-use nvram module Finn Thain
                   ` (19 preceding siblings ...)
  2015-07-12 10:25 ` [RFC v4 20/25] char/generic_nvram: Remove as unused Finn Thain
@ 2015-07-12 10:25 ` Finn Thain
  2015-07-12 10:25 ` [RFC v4 22/25] m68k/mac: Adopt naming and calling conventions for PRAM routines Finn Thain
                   ` (4 subsequent siblings)
  25 siblings, 0 replies; 55+ messages in thread
From: Finn Thain @ 2015-07-12 10:25 UTC (permalink / raw)
  To: linux-kernel, linux-m68k, linuxppc-dev, Benjamin Herrenschmidt,
	Paul Mackerras, Michael Ellerman, Arnd Bergmann,
	Greg Kroah-Hartman

[-- Attachment #1: ppc64-adopt-drivers-char-nvram --]
[-- Type: text/plain, Size: 9967 bytes --]

Adopt nvram module to reduce code duplication.

The IOC_NVRAM_GET_OFFSET ioctl as implemented on PPC64 validates the offset
returned by pmac_get_partition(). Add this test to the nvram module.

Note that the old PPC32 generic_nvram module lacked this test.
So when CONFIG_PPC32 && CONFIG_PPC_PMAC, the IOC_NVRAM_GET_OFFSET ioctl
would have returned 0 (always). But when CONFIG_PPC64 && CONFIG_PPC_PMAC,
the IOC_NVRAM_GET_OFFSET ioctl would have returned -1 (which is -EPERM)
when the requested partition was not found.

With this patch, the result is now -EINVAL on both PPC32 and PPC64 when
the requested PowerMac NVRAM partition is not found.

This is a userspace-visible change, in the non-existent partition case,
which would be in an error path for an IOC_NVRAM_GET_OFFSET ioctl syscall.

Signed-off-by: Finn Thain <fthain@telegraphics.com.au>

---

BTW, the IOC_NVRAM_SYNC ioctl call returns -EINVAL on PPC64. This patch
retains this behaviour though it might be better to actually perform a sync.
Both PPC64 and PPC32 kernels implement ppc_md.nvram_sync() for Core99,
but on PPC64 the ioctl is unimplemented (unlike PPC32).

---

Changed since v1:
- The -ENOENT that appeared in v1 was changed to -EINVAL, to be
consistent with existing logic, that is,
	if (part < pmac_nvram_OF || part > pmac_nvram_NR)
		return -EINVAL;

Changed since v3:
- Fixed comment in powerpc/platforms/pseries/nvram.c

---
 arch/powerpc/Kconfig                     |    3 
 arch/powerpc/kernel/nvram_64.c           |  203 ++++---------------------------
 arch/powerpc/platforms/powermac/Makefile |    5 
 arch/powerpc/platforms/powermac/setup.c  |    2 
 arch/powerpc/platforms/pseries/nvram.c   |    2 
 drivers/char/nvram.c                     |    2 
 6 files changed, 36 insertions(+), 181 deletions(-)

Index: linux/arch/powerpc/Kconfig
===================================================================
--- linux.orig/arch/powerpc/Kconfig	2015-07-12 20:25:16.000000000 +1000
+++ linux/arch/powerpc/Kconfig	2015-07-12 20:25:19.000000000 +1000
@@ -177,10 +177,9 @@ config SYSVIPC_COMPAT
 	depends on COMPAT && SYSVIPC
 	default y
 
-# All PPC32s use generic nvram driver through ppc_md
 config HAVE_ARCH_NVRAM_OPS
 	bool
-	default y if PPC32
+	default y
 
 config SCHED_OMIT_FRAME_POINTER
 	bool
Index: linux/arch/powerpc/kernel/nvram_64.c
===================================================================
--- linux.orig/arch/powerpc/kernel/nvram_64.c	2015-07-12 20:24:53.000000000 +1000
+++ linux/arch/powerpc/kernel/nvram_64.c	2015-07-12 20:25:19.000000000 +1000
@@ -7,12 +7,6 @@
  *      2 of the License, or (at your option) any later version.
  *
  * /dev/nvram driver for PPC64
- *
- * This perhaps should live in drivers/char
- *
- * TODO: Split the /dev/nvram part (that one can use
- *       drivers/char/generic_nvram.c) from the arch & partition
- *       parsing code.
  */
 
 #include <linux/module.h>
@@ -731,153 +725,6 @@ static void oops_to_nvram(struct kmsg_du
 	spin_unlock_irqrestore(&lock, flags);
 }
 
-static loff_t dev_nvram_llseek(struct file *file, loff_t offset, int origin)
-{
-	int size;
-
-	if (ppc_md.nvram_size == NULL)
-		return -ENODEV;
-	size = ppc_md.nvram_size();
-
-	switch (origin) {
-	case 1:
-		offset += file->f_pos;
-		break;
-	case 2:
-		offset += size;
-		break;
-	}
-	if (offset < 0)
-		return -EINVAL;
-	file->f_pos = offset;
-	return file->f_pos;
-}
-
-
-static ssize_t dev_nvram_read(struct file *file, char __user *buf,
-			  size_t count, loff_t *ppos)
-{
-	ssize_t ret;
-	char *tmp = NULL;
-	ssize_t size;
-
-	if (!ppc_md.nvram_size) {
-		ret = -ENODEV;
-		goto out;
-	}
-
-	size = ppc_md.nvram_size();
-	if (size < 0) {
-		ret = size;
-		goto out;
-	}
-
-	if (*ppos >= size) {
-		ret = 0;
-		goto out;
-	}
-
-	count = min_t(size_t, count, size - *ppos);
-	count = min(count, PAGE_SIZE);
-
-	tmp = kmalloc(count, GFP_KERNEL);
-	if (!tmp) {
-		ret = -ENOMEM;
-		goto out;
-	}
-
-	ret = ppc_md.nvram_read(tmp, count, ppos);
-	if (ret <= 0)
-		goto out;
-
-	if (copy_to_user(buf, tmp, ret))
-		ret = -EFAULT;
-
-out:
-	kfree(tmp);
-	return ret;
-
-}
-
-static ssize_t dev_nvram_write(struct file *file, const char __user *buf,
-			  size_t count, loff_t *ppos)
-{
-	ssize_t ret;
-	char *tmp = NULL;
-	ssize_t size;
-
-	ret = -ENODEV;
-	if (!ppc_md.nvram_size)
-		goto out;
-
-	ret = 0;
-	size = ppc_md.nvram_size();
-	if (*ppos >= size || size < 0)
-		goto out;
-
-	count = min_t(size_t, count, size - *ppos);
-	count = min(count, PAGE_SIZE);
-
-	ret = -ENOMEM;
-	tmp = kmalloc(count, GFP_KERNEL);
-	if (!tmp)
-		goto out;
-
-	ret = -EFAULT;
-	if (copy_from_user(tmp, buf, count))
-		goto out;
-
-	ret = ppc_md.nvram_write(tmp, count, ppos);
-
-out:
-	kfree(tmp);
-	return ret;
-
-}
-
-static long dev_nvram_ioctl(struct file *file, unsigned int cmd,
-			    unsigned long arg)
-{
-	switch(cmd) {
-#ifdef CONFIG_PPC_PMAC
-	case OBSOLETE_PMAC_NVRAM_GET_OFFSET:
-		printk(KERN_WARNING "nvram: Using obsolete PMAC_NVRAM_GET_OFFSET ioctl\n");
-	case IOC_NVRAM_GET_OFFSET: {
-		int part, offset;
-
-		if (!machine_is(powermac))
-			return -EINVAL;
-		if (copy_from_user(&part, (void __user*)arg, sizeof(part)) != 0)
-			return -EFAULT;
-		if (part < pmac_nvram_OF || part > pmac_nvram_NR)
-			return -EINVAL;
-		offset = pmac_get_partition(part);
-		if (offset < 0)
-			return offset;
-		if (copy_to_user((void __user*)arg, &offset, sizeof(offset)) != 0)
-			return -EFAULT;
-		return 0;
-	}
-#endif /* CONFIG_PPC_PMAC */
-	default:
-		return -EINVAL;
-	}
-}
-
-const struct file_operations nvram_fops = {
-	.owner		= THIS_MODULE,
-	.llseek		= dev_nvram_llseek,
-	.read		= dev_nvram_read,
-	.write		= dev_nvram_write,
-	.unlocked_ioctl	= dev_nvram_ioctl,
-};
-
-static struct miscdevice nvram_dev = {
-	NVRAM_MINOR,
-	"nvram",
-	&nvram_fops
-};
-
 
 #ifdef DEBUG_NVRAM
 static void __init nvram_print_partitions(char * label)
@@ -1026,6 +873,8 @@ loff_t __init nvram_create_partition(con
 	long size = 0;
 	int rc;
 
+	BUILD_BUG_ON(NVRAM_BLOCK_LEN != 16);
+
 	/* Convert sizes from bytes to blocks */
 	req_size = _ALIGN_UP(req_size, NVRAM_BLOCK_LEN) / NVRAM_BLOCK_LEN;
 	min_size = _ALIGN_UP(min_size, NVRAM_BLOCK_LEN) / NVRAM_BLOCK_LEN;
@@ -1226,29 +1075,41 @@ int __init nvram_scan_partitions(void)
 	return err;
 }
 
-static int __init nvram_init(void)
+
+#if IS_ENABLED(CONFIG_NVRAM)
+
+static ssize_t ppc_nvram_read(char *buf, size_t count, loff_t *index)
 {
-	int rc;
-	
-	BUILD_BUG_ON(NVRAM_BLOCK_LEN != 16);
+	if (ppc_md.nvram_read)
+		return ppc_md.nvram_read(buf, count, index);
+	return -EINVAL;
+}
 
-	if (ppc_md.nvram_size == NULL || ppc_md.nvram_size() <= 0)
-		return  -ENODEV;
+static ssize_t ppc_nvram_write(char *buf, size_t count, loff_t *index)
+{
+	if (ppc_md.nvram_write)
+		return ppc_md.nvram_write(buf, count, index);
+	return -EINVAL;
+}
 
-  	rc = misc_register(&nvram_dev);
-	if (rc != 0) {
-		printk(KERN_ERR "nvram_init: failed to register device\n");
-		return rc;
-	}
-  	
-  	return rc;
+static ssize_t ppc_nvram_get_size(void)
+{
+	if (ppc_md.nvram_size)
+		return ppc_md.nvram_size();
+	return -ENODEV;
 }
 
-static void __exit nvram_cleanup(void)
+static long ppc_nvram_sync(void)
 {
-        misc_deregister( &nvram_dev );
+	return -EINVAL;
 }
 
-module_init(nvram_init);
-module_exit(nvram_cleanup);
-MODULE_LICENSE("GPL");
+const struct nvram_ops arch_nvram_ops = {
+	.read           = ppc_nvram_read,
+	.write          = ppc_nvram_write,
+	.get_size       = ppc_nvram_get_size,
+	.sync           = ppc_nvram_sync,
+};
+EXPORT_SYMBOL(arch_nvram_ops);
+
+#endif /* CONFIG_NVRAM */
Index: linux/arch/powerpc/platforms/powermac/Makefile
===================================================================
--- linux.orig/arch/powerpc/platforms/powermac/Makefile	2015-07-12 20:24:53.000000000 +1000
+++ linux/arch/powerpc/platforms/powermac/Makefile	2015-07-12 20:25:19.000000000 +1000
@@ -9,11 +9,6 @@ obj-y				+= pic.o setup.o time.o feature
 				   sleep.o low_i2c.o cache.o pfunc_core.o \
 				   pfunc_base.o udbg_scc.o udbg_adb.o
 obj-$(CONFIG_PMAC_BACKLIGHT)	+= backlight.o
-# CONFIG_NVRAM is an arch. independent tristate symbol, for pmac32 we really
-# need this to be a bool.  Cheat here and pretend CONFIG_NVRAM=m is really
-# CONFIG_NVRAM=y
 obj-$(CONFIG_NVRAM:m=y)		+= nvram.o
-# ppc64 pmac doesn't define CONFIG_NVRAM but needs nvram stuff
-obj-$(CONFIG_PPC64)		+= nvram.o
 obj-$(CONFIG_PPC32)		+= bootx_init.o
 obj-$(CONFIG_SMP)		+= smp.o
Index: linux/arch/powerpc/platforms/powermac/setup.c
===================================================================
--- linux.orig/arch/powerpc/platforms/powermac/setup.c	2015-07-12 20:25:16.000000000 +1000
+++ linux/arch/powerpc/platforms/powermac/setup.c	2015-07-12 20:25:19.000000000 +1000
@@ -321,7 +321,7 @@ static void __init pmac_setup_arch(void)
 	find_via_pmu();
 	smu_init();
 
-#if IS_ENABLED(CONFIG_NVRAM) || defined(CONFIG_PPC64)
+#if IS_ENABLED(CONFIG_NVRAM)
 	pmac_nvram_init();
 #endif
 
Index: linux/drivers/char/nvram.c
===================================================================
--- linux.orig/drivers/char/nvram.c	2015-07-12 20:25:15.000000000 +1000
+++ linux/drivers/char/nvram.c	2015-07-12 20:25:19.000000000 +1000
@@ -342,6 +342,8 @@ static long nvram_misc_ioctl(struct file
 		if (part < pmac_nvram_OF || part > pmac_nvram_NR)
 			return -EINVAL;
 		offset = pmac_get_partition(part);
+		if (offset < 0)
+			return -EINVAL;
 		if (copy_to_user((void __user *)arg,
 		                 &offset, sizeof(offset)) != 0)
 			return -EFAULT;
Index: linux/arch/powerpc/platforms/pseries/nvram.c
===================================================================
--- linux.orig/arch/powerpc/platforms/pseries/nvram.c	2015-07-12 20:24:53.000000000 +1000
+++ linux/arch/powerpc/platforms/pseries/nvram.c	2015-07-12 20:25:19.000000000 +1000
@@ -7,8 +7,6 @@
  *      2 of the License, or (at your option) any later version.
  *
  * /dev/nvram driver for PPC64
- *
- * This perhaps should live in drivers/char
  */
 
 



^ permalink raw reply	[flat|nested] 55+ messages in thread

* [RFC v4 22/25] m68k/mac: Adopt naming and calling conventions for PRAM routines
  2015-07-12 10:25 [RFC v4 00/25] Re-use nvram module Finn Thain
                   ` (20 preceding siblings ...)
  2015-07-12 10:25 ` [RFC v4 21/25] powerpc: Adopt nvram module for PPC64 Finn Thain
@ 2015-07-12 10:25 ` Finn Thain
  2015-07-12 10:25 ` [RFC v4 23/25] m68k/mac: Use macros for RTC accesses not magic numbers Finn Thain
                   ` (3 subsequent siblings)
  25 siblings, 0 replies; 55+ messages in thread
From: Finn Thain @ 2015-07-12 10:25 UTC (permalink / raw)
  To: linux-kernel, linux-m68k, linuxppc-dev, Geert Uytterhoeven

[-- Attachment #1: mac68k-pram-function-names-and-signatures --]
[-- Type: text/plain, Size: 6554 bytes --]

Adopt the existing *_read_byte and *_write_byte naming convention.
Rename via_pram_readbyte and via_pram_writebyte to avoid confusion.
Adjust calling conventions of mac_pram_* functions to match the
arch_nvram_ops struct methods.

Signed-off-by: Finn Thain <fthain@telegraphics.com.au>

---

Changes since v1:
- Don't introduce the arch_nvram_ops struct in this patch, even if it 
would form a logical progression. Since the struct would get replaced
later on, some might see it as churn.

Changes since v2:
- Rename via_pram_send() and via_pram_recv() as
via_rtc_send() and via_rtc_recv() resp.

---
 arch/m68k/mac/misc.c |   91 +++++++++++++++++++++++++--------------------------
 1 file changed, 46 insertions(+), 45 deletions(-)

Index: linux/arch/m68k/mac/misc.c
===================================================================
--- linux.orig/arch/m68k/mac/misc.c	2015-07-12 20:24:53.000000000 +1000
+++ linux/arch/m68k/mac/misc.c	2015-07-12 20:25:20.000000000 +1000
@@ -61,7 +61,7 @@ static void cuda_write_time(long data)
 		cuda_poll();
 }
 
-static __u8 cuda_read_pram(int offset)
+static unsigned char cuda_pram_read_byte(int offset)
 {
 	struct adb_request req;
 	if (cuda_request(&req, NULL, 4, CUDA_PACKET, CUDA_GET_PRAM,
@@ -72,7 +72,7 @@ static __u8 cuda_read_pram(int offset)
 	return req.reply[3];
 }
 
-static void cuda_write_pram(int offset, __u8 data)
+static void cuda_pram_write_byte(unsigned char data, int offset)
 {
 	struct adb_request req;
 	if (cuda_request(&req, NULL, 5, CUDA_PACKET, CUDA_SET_PRAM,
@@ -84,8 +84,8 @@ static void cuda_write_pram(int offset,
 #else
 #define cuda_read_time() 0
 #define cuda_write_time(n)
-#define cuda_read_pram NULL
-#define cuda_write_pram NULL
+#define cuda_pram_read_byte NULL
+#define cuda_pram_write_byte NULL
 #endif
 
 #ifdef CONFIG_ADB_PMU68K
@@ -116,7 +116,7 @@ static void pmu_write_time(long data)
 		pmu_poll();
 }
 
-static __u8 pmu_read_pram(int offset)
+static unsigned char pmu_pram_read_byte(int offset)
 {
 	struct adb_request req;
 	if (pmu_request(&req, NULL, 3, PMU_READ_NVRAM,
@@ -127,7 +127,7 @@ static __u8 pmu_read_pram(int offset)
 	return req.reply[3];
 }
 
-static void pmu_write_pram(int offset, __u8 data)
+static void pmu_pram_write_byte(unsigned char data, int offset)
 {
 	struct adb_request req;
 	if (pmu_request(&req, NULL, 4, PMU_WRITE_NVRAM,
@@ -139,8 +139,8 @@ static void pmu_write_pram(int offset, _
 #else
 #define pmu_read_time() 0
 #define pmu_write_time(n)
-#define pmu_read_pram NULL
-#define pmu_write_pram NULL
+#define pmu_pram_read_byte NULL
+#define pmu_pram_write_byte NULL
 #endif
 
 #if 0 /* def CONFIG_ADB_MACIISI */
@@ -169,7 +169,7 @@ static void maciisi_write_time(long data
 			(data >> 8) & 0xFF, data & 0xFF);
 }
 
-static __u8 maciisi_read_pram(int offset)
+static unsigned char maciisi_pram_read_byte(int offset)
 {
 	struct adb_request req;
 	if (maciisi_request(&req, NULL, 4, CUDA_PACKET, CUDA_GET_PRAM,
@@ -178,7 +178,7 @@ static __u8 maciisi_read_pram(int offset
 	return req.reply[3];
 }
 
-static void maciisi_write_pram(int offset, __u8 data)
+static void maciisi_pram_write_byte(unsigned char data, int offset)
 {
 	struct adb_request req;
 	maciisi_request(&req, NULL, 5, CUDA_PACKET, CUDA_SET_PRAM,
@@ -187,8 +187,8 @@ static void maciisi_write_pram(int offse
 #else
 #define maciisi_read_time() 0
 #define maciisi_write_time(n)
-#define maciisi_read_pram NULL
-#define maciisi_write_pram NULL
+#define maciisi_pram_read_byte NULL
+#define maciisi_pram_write_byte NULL
 #endif
 
 /*
@@ -198,7 +198,7 @@ static void maciisi_write_pram(int offse
  * the RTC should be enabled.
  */
 
-static __u8 via_pram_readbyte(void)
+static __u8 via_rtc_recv(void)
 {
 	int	i,reg;
 	__u8	data;
@@ -225,7 +225,7 @@ static __u8 via_pram_readbyte(void)
 	return data;
 }
 
-static void via_pram_writebyte(__u8 data)
+static void via_rtc_send(__u8 data)
 {
 	int	i,reg,bit;
 
@@ -262,17 +262,17 @@ static void via_pram_command(int command
 	via1[vBufB] = (via1[vBufB] | VIA1B_vRTCClk) & ~VIA1B_vRTCEnb;
 
 	if (command & 0xFF00) {		/* extended (two-byte) command */
-		via_pram_writebyte((command & 0xFF00) >> 8);
-		via_pram_writebyte(command & 0xFF);
+		via_rtc_send((command & 0xFF00) >> 8);
+		via_rtc_send(command & 0xFF);
 		is_read = command & 0x8000;
 	} else {			/* one-byte command */
-		via_pram_writebyte(command);
+		via_rtc_send(command);
 		is_read = command & 0x80;
 	}
 	if (is_read) {
-		*data = via_pram_readbyte();
+		*data = via_rtc_recv();
 	} else {
-		via_pram_writebyte(*data);
+		via_rtc_send(*data);
 	}
 
 	/* All done, disable the RTC */
@@ -282,12 +282,12 @@ static void via_pram_command(int command
 	local_irq_restore(flags);
 }
 
-static __u8 via_read_pram(int offset)
+static unsigned char via_pram_read_byte(int offset)
 {
 	return 0;
 }
 
-static void via_write_pram(int offset, __u8 data)
+static void via_pram_write_byte(unsigned char data, int offset)
 {
 }
 
@@ -453,50 +453,51 @@ void pmu_shutdown(void)
  *-------------------------------------------------------------------
  */
 
-void mac_pram_read(int offset, __u8 *buffer, int len)
+unsigned char mac_pram_read_byte(int addr)
 {
-	__u8 (*func)(int);
-	int i;
+	unsigned char (*func)(int);
 
 	switch(macintosh_config->adb_type) {
 	case MAC_ADB_IISI:
-		func = maciisi_read_pram; break;
+		func = maciisi_pram_read_byte;
+		break;
 	case MAC_ADB_PB1:
 	case MAC_ADB_PB2:
-		func = pmu_read_pram; break;
+		func = pmu_pram_read_byte;
+		break;
 	case MAC_ADB_CUDA:
-		func = cuda_read_pram; break;
+		func = cuda_pram_read_byte;
+		break;
 	default:
-		func = via_read_pram;
-	}
-	if (!func)
-		return;
-	for (i = 0 ; i < len ; i++) {
-		buffer[i] = (*func)(offset++);
+		func = via_pram_read_byte;
 	}
+
+	if (func)
+		return (*func)(addr);
+	return 0xff;
 }
 
-void mac_pram_write(int offset, __u8 *buffer, int len)
+void mac_pram_write_byte(unsigned char val, int addr)
 {
-	void (*func)(int, __u8);
-	int i;
+	void (*func)(unsigned char, int);
 
 	switch(macintosh_config->adb_type) {
 	case MAC_ADB_IISI:
-		func = maciisi_write_pram; break;
+		func = maciisi_pram_write_byte;
+		break;
 	case MAC_ADB_PB1:
 	case MAC_ADB_PB2:
-		func = pmu_write_pram; break;
+		func = pmu_pram_write_byte;
+		break;
 	case MAC_ADB_CUDA:
-		func = cuda_write_pram; break;
+		func = cuda_pram_write_byte;
+		break;
 	default:
-		func = via_write_pram;
-	}
-	if (!func)
-		return;
-	for (i = 0 ; i < len ; i++) {
-		(*func)(offset++, buffer[i]);
+		func = via_pram_write_byte;
 	}
+
+	if (func)
+		(*func)(val, addr);
 }
 
 void mac_poweroff(void)



^ permalink raw reply	[flat|nested] 55+ messages in thread

* [RFC v4 23/25] m68k/mac: Use macros for RTC accesses not magic numbers
  2015-07-12 10:25 [RFC v4 00/25] Re-use nvram module Finn Thain
                   ` (21 preceding siblings ...)
  2015-07-12 10:25 ` [RFC v4 22/25] m68k/mac: Adopt naming and calling conventions for PRAM routines Finn Thain
@ 2015-07-12 10:25 ` Finn Thain
  2015-07-12 10:25 ` [RFC v4 24/25] m68k/mac: Fix PRAM accessors Finn Thain
                   ` (2 subsequent siblings)
  25 siblings, 0 replies; 55+ messages in thread
From: Finn Thain @ 2015-07-12 10:25 UTC (permalink / raw)
  To: linux-kernel, linux-m68k, linuxppc-dev, Geert Uytterhoeven

[-- Attachment #1: mac68k-rtc-macros --]
[-- Type: text/plain, Size: 4675 bytes --]

Signed-off-by: Finn Thain <fthain@telegraphics.com.au>

---

This is intended to improve code style and not affect code behaviour.
I've tested this on a Quadra 650.

I don't know the meanings of the 4 undocumented write protect register
bits 0x55, so I decided against defining 4 macros for those bits.

---
 arch/m68k/mac/misc.c |   59 +++++++++++++++++++++++++++++++++++----------------
 1 file changed, 41 insertions(+), 18 deletions(-)

Index: linux/arch/m68k/mac/misc.c
===================================================================
--- linux.orig/arch/m68k/mac/misc.c	2015-07-12 20:25:20.000000000 +1000
+++ linux/arch/m68k/mac/misc.c	2015-07-12 20:25:22.000000000 +1000
@@ -242,6 +242,21 @@ static void via_rtc_send(__u8 data)
 }
 
 /*
+ * These values can be found in Inside Macintosh vol. III ch. 2
+ * which has a description of the RTC chip in the original Mac.
+ */
+
+#define RTC_FLG_READ            BIT(7)
+#define RTC_FLG_WRITE_PROTECT   BIT(7)
+#define RTC_CMD_READ(r)         (RTC_FLG_READ | (r << 2))
+#define RTC_CMD_WRITE(r)        (r << 2)
+#define RTC_REG_SECONDS_0       0
+#define RTC_REG_SECONDS_1       1
+#define RTC_REG_SECONDS_2       2
+#define RTC_REG_SECONDS_3       3
+#define RTC_REG_WRITE_PROTECT   13
+
+/*
  * Execute a VIA PRAM/RTC command. For read commands
  * data should point to a one-byte buffer for the
  * resulting data. For write commands it should point
@@ -250,13 +265,17 @@ static void via_rtc_send(__u8 data)
  * This function disables all interrupts while running.
  */
 
-static void via_pram_command(int command, __u8 *data)
+static void via_rtc_command(int command, __u8 *data)
 {
 	unsigned long flags;
 	int	is_read;
 
 	local_irq_save(flags);
 
+	/* The least significant bits must be 0b01 according to Inside Mac */
+
+	command = (command & ~3) | 1;
+
 	/* Enable the RTC and make sure the strobe line is high */
 
 	via1[vBufB] = (via1[vBufB] | VIA1B_vRTCClk) & ~VIA1B_vRTCEnb;
@@ -264,10 +283,10 @@ static void via_pram_command(int command
 	if (command & 0xFF00) {		/* extended (two-byte) command */
 		via_rtc_send((command & 0xFF00) >> 8);
 		via_rtc_send(command & 0xFF);
-		is_read = command & 0x8000;
+		is_read = command & (RTC_FLG_READ << 8);
 	} else {			/* one-byte command */
 		via_rtc_send(command);
-		is_read = command & 0x80;
+		is_read = command & RTC_FLG_READ;
 	}
 	if (is_read) {
 		*data = via_rtc_recv();
@@ -306,10 +325,10 @@ static long via_read_time(void)
 	} result, last_result;
 	int count = 1;
 
-	via_pram_command(0x81, &last_result.cdata[3]);
-	via_pram_command(0x85, &last_result.cdata[2]);
-	via_pram_command(0x89, &last_result.cdata[1]);
-	via_pram_command(0x8D, &last_result.cdata[0]);
+	via_rtc_command(RTC_CMD_READ(RTC_REG_SECONDS_0), &last_result.cdata[3]);
+	via_rtc_command(RTC_CMD_READ(RTC_REG_SECONDS_1), &last_result.cdata[2]);
+	via_rtc_command(RTC_CMD_READ(RTC_REG_SECONDS_2), &last_result.cdata[1]);
+	via_rtc_command(RTC_CMD_READ(RTC_REG_SECONDS_3), &last_result.cdata[0]);
 
 	/*
 	 * The NetBSD guys say to loop until you get the same reading
@@ -317,10 +336,14 @@ static long via_read_time(void)
 	 */
 
 	while (1) {
-		via_pram_command(0x81, &result.cdata[3]);
-		via_pram_command(0x85, &result.cdata[2]);
-		via_pram_command(0x89, &result.cdata[1]);
-		via_pram_command(0x8D, &result.cdata[0]);
+		via_rtc_command(RTC_CMD_READ(RTC_REG_SECONDS_0),
+		                &result.cdata[3]);
+		via_rtc_command(RTC_CMD_READ(RTC_REG_SECONDS_1),
+		                &result.cdata[2]);
+		via_rtc_command(RTC_CMD_READ(RTC_REG_SECONDS_2),
+		                &result.cdata[1]);
+		via_rtc_command(RTC_CMD_READ(RTC_REG_SECONDS_3),
+		                &result.cdata[0]);
 
 		if (result.idata == last_result.idata)
 			return result.idata - RTC_OFFSET;
@@ -356,18 +379,18 @@ static void via_write_time(long time)
 	/* Clear the write protect bit */
 
 	temp = 0x55;
-	via_pram_command(0x35, &temp);
+	via_rtc_command(RTC_CMD_WRITE(RTC_REG_WRITE_PROTECT), &temp);
 
 	data.idata = time + RTC_OFFSET;
-	via_pram_command(0x01, &data.cdata[3]);
-	via_pram_command(0x05, &data.cdata[2]);
-	via_pram_command(0x09, &data.cdata[1]);
-	via_pram_command(0x0D, &data.cdata[0]);
+	via_rtc_command(RTC_CMD_WRITE(RTC_REG_SECONDS_0), &data.cdata[3]);
+	via_rtc_command(RTC_CMD_WRITE(RTC_REG_SECONDS_1), &data.cdata[2]);
+	via_rtc_command(RTC_CMD_WRITE(RTC_REG_SECONDS_2), &data.cdata[1]);
+	via_rtc_command(RTC_CMD_WRITE(RTC_REG_SECONDS_3), &data.cdata[0]);
 
 	/* Set the write protect bit */
 
-	temp = 0xD5;
-	via_pram_command(0x35, &temp);
+	temp = 0x55 | RTC_FLG_WRITE_PROTECT;
+	via_rtc_command(RTC_CMD_WRITE(RTC_REG_WRITE_PROTECT), &temp);
 }
 
 static void via_shutdown(void)



^ permalink raw reply	[flat|nested] 55+ messages in thread

* [RFC v4 24/25] m68k/mac: Fix PRAM accessors
  2015-07-12 10:25 [RFC v4 00/25] Re-use nvram module Finn Thain
                   ` (22 preceding siblings ...)
  2015-07-12 10:25 ` [RFC v4 23/25] m68k/mac: Use macros for RTC accesses not magic numbers Finn Thain
@ 2015-07-12 10:25 ` Finn Thain
  2015-07-12 10:25 ` [RFC v4 25/25] m68k: Dispatch nvram_ops calls to Atari or Mac functions Finn Thain
  2015-07-13  7:55 ` [RFC v4 00/25] Re-use nvram module Geert Uytterhoeven
  25 siblings, 0 replies; 55+ messages in thread
From: Finn Thain @ 2015-07-12 10:25 UTC (permalink / raw)
  To: linux-kernel, linux-m68k, linuxppc-dev, Geert Uytterhoeven, linux-api

[-- Attachment #1: mac68k-fix-pram-accessors --]
[-- Type: text/plain, Size: 3453 bytes --]

Signed-off-by: Finn Thain <fthain@telegraphics.com.au>

---

Tested on a PowerBook 520 and Quadra 650.

Changes since v2:
- Make use of the RTC_* macros from the previous patch and add a few more
besides.

---
 arch/m68k/mac/misc.c     |   39 +++++++++++++++++++++++++++++++++------
 include/uapi/linux/pmu.h |    2 ++
 2 files changed, 35 insertions(+), 6 deletions(-)

Index: linux/arch/m68k/mac/misc.c
===================================================================
--- linux.orig/arch/m68k/mac/misc.c	2015-07-12 20:25:22.000000000 +1000
+++ linux/arch/m68k/mac/misc.c	2015-07-12 20:25:23.000000000 +1000
@@ -119,19 +119,22 @@ static void pmu_write_time(long data)
 static unsigned char pmu_pram_read_byte(int offset)
 {
 	struct adb_request req;
-	if (pmu_request(&req, NULL, 3, PMU_READ_NVRAM,
-			(offset >> 8) & 0xFF, offset & 0xFF) < 0)
+
+	if (pmu_request(&req, NULL, 3, PMU_READ_XPRAM,
+	                offset & 0xFF, 1) < 0)
 		return 0;
 	while (!req.complete)
 		pmu_poll();
-	return req.reply[3];
+
+	return req.reply[1];
 }
 
 static void pmu_pram_write_byte(unsigned char data, int offset)
 {
 	struct adb_request req;
-	if (pmu_request(&req, NULL, 4, PMU_WRITE_NVRAM,
-			(offset >> 8) & 0xFF, offset & 0xFF, data) < 0)
+
+	if (pmu_request(&req, NULL, 4, PMU_WRITE_XPRAM,
+	                offset & 0xFF, 1, data) < 0)
 		return;
 	while (!req.complete)
 		pmu_poll();
@@ -257,6 +260,16 @@ static void via_rtc_send(__u8 data)
 #define RTC_REG_WRITE_PROTECT   13
 
 /*
+ * Inside Mac has no information about two-byte RTC commands but
+ * the MESS source code has the essentials.
+ */
+
+#define RTC_REG_XPRAM           14
+#define RTC_CMD_XPRAM_READ      (RTC_CMD_READ(RTC_REG_XPRAM) << 8)
+#define RTC_CMD_XPRAM_WRITE     (RTC_CMD_WRITE(RTC_REG_XPRAM) << 8)
+#define RTC_CMD_XPRAM_ARG(a)    (((a & 0xE0) << 3) | ((a & 0x1F) << 2))
+
+/*
  * Execute a VIA PRAM/RTC command. For read commands
  * data should point to a one-byte buffer for the
  * resulting data. For write commands it should point
@@ -303,11 +316,25 @@ static void via_rtc_command(int command,
 
 static unsigned char via_pram_read_byte(int offset)
 {
-	return 0;
+	unsigned char temp;
+
+	via_rtc_command(RTC_CMD_XPRAM_READ | RTC_CMD_XPRAM_ARG(offset), &temp);
+
+	return temp;
 }
 
 static void via_pram_write_byte(unsigned char data, int offset)
 {
+	unsigned char temp;
+
+	temp = 0x55;
+	via_rtc_command(RTC_CMD_WRITE(RTC_REG_WRITE_PROTECT), &temp);
+
+	temp = data;
+	via_rtc_command(RTC_CMD_XPRAM_WRITE | RTC_CMD_XPRAM_ARG(offset), &temp);
+
+	temp = 0x55 | RTC_FLG_WRITE_PROTECT;
+	via_rtc_command(RTC_CMD_WRITE(RTC_REG_WRITE_PROTECT), &temp);
 }
 
 /*
Index: linux/include/uapi/linux/pmu.h
===================================================================
--- linux.orig/include/uapi/linux/pmu.h	2015-07-12 20:24:53.000000000 +1000
+++ linux/include/uapi/linux/pmu.h	2015-07-12 20:25:23.000000000 +1000
@@ -18,7 +18,9 @@
 #define PMU_POWER_CTRL		0x11	/* control power of some devices */
 #define PMU_ADB_CMD		0x20	/* send ADB packet */
 #define PMU_ADB_POLL_OFF	0x21	/* disable ADB auto-poll */
+#define PMU_WRITE_XPRAM		0x32	/* write eXtended Parameter RAM */
 #define PMU_WRITE_NVRAM		0x33	/* write non-volatile RAM */
+#define PMU_READ_XPRAM		0x3a	/* read eXtended Parameter RAM */
 #define PMU_READ_NVRAM		0x3b	/* read non-volatile RAM */
 #define PMU_SET_RTC		0x30	/* set real-time clock */
 #define PMU_READ_RTC		0x38	/* read real-time clock */



^ permalink raw reply	[flat|nested] 55+ messages in thread

* [RFC v4 25/25] m68k: Dispatch nvram_ops calls to Atari or Mac functions
  2015-07-12 10:25 [RFC v4 00/25] Re-use nvram module Finn Thain
                   ` (23 preceding siblings ...)
  2015-07-12 10:25 ` [RFC v4 24/25] m68k/mac: Fix PRAM accessors Finn Thain
@ 2015-07-12 10:25 ` Finn Thain
  2015-07-13  7:55 ` [RFC v4 00/25] Re-use nvram module Geert Uytterhoeven
  25 siblings, 0 replies; 55+ messages in thread
From: Finn Thain @ 2015-07-12 10:25 UTC (permalink / raw)
  To: linux-kernel, linux-m68k, linuxppc-dev, Geert Uytterhoeven

[-- Attachment #1: m68k-introduce-arch_nvram_ops --]
[-- Type: text/plain, Size: 10373 bytes --]

A multi-platform kernel binary needs to decide at run-time how to dispatch
the arch_nvram_ops calls. Add platform-independent arch_nvram_ops, for use
when multiple platform-specific NVRAM ops implementations are needed.

Enable CONFIG_HAVE_ARCH_NVRAM_OPS for Macs.

Signed-off-by: Finn Thain <fthain@telegraphics.com.au>

---

Changed since v1:
- Removed Mac and Atari ops struct definitions and the associated #ifdefs.
- Moved extern declarations for fewer lines of code and better readability.
- The IS_ENABLED(CONFIG_NVRAM) tests were moved to this patch, because it is
now in this patch that CONFIG_HAVE_ARCH_NVRAM_OPS is enabled for Macs.

Changes since v3:
- Use bool (and select) instead of def_bool in the definition of the
HAVE_ARCH_NVRAM_OPS Kconfig symbol, as requested by Geert.
- Moved extern declarations back to the header files (like in v1)
as requested by Geert.

---
 arch/m68k/Kconfig.machine         |    1 
 arch/m68k/atari/nvram.c           |   21 +------
 arch/m68k/include/asm/atarihw.h   |    6 ++
 arch/m68k/include/asm/macintosh.h |    4 +
 arch/m68k/kernel/setup_mm.c       |  100 +++++++++++++++++++++++++++++++++++++-
 arch/m68k/mac/misc.c              |   18 ++++++
 6 files changed, 133 insertions(+), 17 deletions(-)

Index: linux/arch/m68k/mac/misc.c
===================================================================
--- linux.orig/arch/m68k/mac/misc.c	2015-07-12 20:25:23.000000000 +1000
+++ linux/arch/m68k/mac/misc.c	2015-07-12 20:25:24.000000000 +1000
@@ -61,6 +61,7 @@ static void cuda_write_time(long data)
 		cuda_poll();
 }
 
+#if IS_ENABLED(CONFIG_NVRAM)
 static unsigned char cuda_pram_read_byte(int offset)
 {
 	struct adb_request req;
@@ -81,6 +82,8 @@ static void cuda_pram_write_byte(unsigne
 	while (!req.complete)
 		cuda_poll();
 }
+#endif /* CONFIG_NVRAM */
+
 #else
 #define cuda_read_time() 0
 #define cuda_write_time(n)
@@ -116,6 +119,7 @@ static void pmu_write_time(long data)
 		pmu_poll();
 }
 
+#if IS_ENABLED(CONFIG_NVRAM)
 static unsigned char pmu_pram_read_byte(int offset)
 {
 	struct adb_request req;
@@ -139,6 +143,8 @@ static void pmu_pram_write_byte(unsigned
 	while (!req.complete)
 		pmu_poll();
 }
+#endif /* CONFIG_NVRAM */
+
 #else
 #define pmu_read_time() 0
 #define pmu_write_time(n)
@@ -172,6 +178,7 @@ static void maciisi_write_time(long data
 			(data >> 8) & 0xFF, data & 0xFF);
 }
 
+#if IS_ENABLED(CONFIG_NVRAM)
 static unsigned char maciisi_pram_read_byte(int offset)
 {
 	struct adb_request req;
@@ -187,6 +194,8 @@ static void maciisi_pram_write_byte(unsi
 	maciisi_request(&req, NULL, 5, CUDA_PACKET, CUDA_SET_PRAM,
 			(offset >> 8) & 0xFF, offset & 0xFF, data);
 }
+#endif /* CONFIG_NVRAM */
+
 #else
 #define maciisi_read_time() 0
 #define maciisi_write_time(n)
@@ -314,6 +323,7 @@ static void via_rtc_command(int command,
 	local_irq_restore(flags);
 }
 
+#if IS_ENABLED(CONFIG_NVRAM)
 static unsigned char via_pram_read_byte(int offset)
 {
 	unsigned char temp;
@@ -336,6 +346,7 @@ static void via_pram_write_byte(unsigned
 	temp = 0x55 | RTC_FLG_WRITE_PROTECT;
 	via_rtc_command(RTC_CMD_WRITE(RTC_REG_WRITE_PROTECT), &temp);
 }
+#endif /* CONFIG_NVRAM */
 
 /*
  * Return the current time in seconds since January 1, 1904.
@@ -503,6 +514,7 @@ void pmu_shutdown(void)
  *-------------------------------------------------------------------
  */
 
+#if IS_ENABLED(CONFIG_NVRAM)
 unsigned char mac_pram_read_byte(int addr)
 {
 	unsigned char (*func)(int);
@@ -550,6 +562,12 @@ void mac_pram_write_byte(unsigned char v
 		(*func)(val, addr);
 }
 
+ssize_t mac_pram_get_size(void)
+{
+	return 256;
+}
+#endif /* CONFIG_NVRAM */
+
 void mac_poweroff(void)
 {
 	/*
Index: linux/arch/m68k/atari/nvram.c
===================================================================
--- linux.orig/arch/m68k/atari/nvram.c	2015-07-12 20:25:15.000000000 +1000
+++ linux/arch/m68k/atari/nvram.c	2015-07-12 20:25:24.000000000 +1000
@@ -73,7 +73,7 @@ static void __nvram_set_checksum(void)
 	__nvram_write_byte(sum, ATARI_CKS_LOC + 1);
 }
 
-static long nvram_set_checksum(void)
+long atari_nvram_set_checksum(void)
 {
 	spin_lock_irq(&rtc_lock);
 	__nvram_set_checksum();
@@ -81,7 +81,7 @@ static long nvram_set_checksum(void)
 	return 0;
 }
 
-static long nvram_initialize(void)
+long atari_nvram_initialize(void)
 {
 	loff_t i;
 
@@ -93,7 +93,7 @@ static long nvram_initialize(void)
 	return 0;
 }
 
-static ssize_t nvram_read(char *buf, size_t count, loff_t *ppos)
+ssize_t atari_nvram_read(char *buf, size_t count, loff_t *ppos)
 {
 	char *p = buf;
 	loff_t i;
@@ -114,7 +114,7 @@ static ssize_t nvram_read(char *buf, siz
 	return p - buf;
 }
 
-static ssize_t nvram_write(char *buf, size_t count, loff_t *ppos)
+ssize_t atari_nvram_write(char *buf, size_t count, loff_t *ppos)
 {
 	char *p = buf;
 	loff_t i;
@@ -137,22 +137,11 @@ static ssize_t nvram_write(char *buf, si
 	return p - buf;
 }
 
-static ssize_t nvram_get_size(void)
+ssize_t atari_nvram_get_size(void)
 {
-	if (!MACH_IS_ATARI)
-		return -ENODEV;
 	return NVRAM_BYTES;
 }
 
-const struct nvram_ops arch_nvram_ops = {
-	.read           = nvram_read,
-	.write          = nvram_write,
-	.get_size       = nvram_get_size,
-	.set_checksum   = nvram_set_checksum,
-	.initialize     = nvram_initialize,
-};
-EXPORT_SYMBOL(arch_nvram_ops);
-
 #ifdef CONFIG_PROC_FS
 static struct {
 	unsigned char val;
Index: linux/arch/m68k/kernel/setup_mm.c
===================================================================
--- linux.orig/arch/m68k/kernel/setup_mm.c	2015-07-12 20:24:53.000000000 +1000
+++ linux/arch/m68k/kernel/setup_mm.c	2015-07-12 20:25:24.000000000 +1000
@@ -23,6 +23,7 @@
 #include <linux/proc_fs.h>
 #include <linux/seq_file.h>
 #include <linux/module.h>
+#include <linux/nvram.h>
 #include <linux/initrd.h>
 
 #include <asm/bootinfo.h>
@@ -36,13 +37,14 @@
 #ifdef CONFIG_AMIGA
 #include <asm/amigahw.h>
 #endif
-#ifdef CONFIG_ATARI
 #include <asm/atarihw.h>
+#ifdef CONFIG_ATARI
 #include <asm/atari_stram.h>
 #endif
 #ifdef CONFIG_SUN3X
 #include <asm/dvma.h>
 #endif
+#include <asm/macintosh.h>
 #include <asm/natfeat.h>
 
 #if !FPSTATESIZE || !NR_IRQS
@@ -568,3 +570,99 @@ static int __init adb_probe_sync_enable
 
 __setup("adb_sync", adb_probe_sync_enable);
 #endif /* CONFIG_ADB */
+
+#if IS_ENABLED(CONFIG_NVRAM)
+#ifdef CONFIG_MAC
+static unsigned char m68k_nvram_read_byte(int addr)
+{
+	if (MACH_IS_MAC)
+		return mac_pram_read_byte(addr);
+	return 0xff;
+}
+
+static void m68k_nvram_write_byte(unsigned char val, int addr)
+{
+	if (MACH_IS_MAC)
+		mac_pram_write_byte(val, addr);
+}
+#endif /* CONFIG_MAC */
+
+#ifdef CONFIG_ATARI
+static ssize_t m68k_nvram_read(char *buf, size_t count, loff_t *ppos)
+{
+	if (MACH_IS_ATARI)
+		return atari_nvram_read(buf, count, ppos);
+	else if (MACH_IS_MAC) {
+		ssize_t size = mac_pram_get_size();
+		char *p = buf;
+		loff_t i;
+
+		for (i = *ppos; count > 0 && i < size; --count, ++i, ++p)
+			*p = mac_pram_read_byte(i);
+
+		*ppos = i;
+		return p - buf;
+	}
+	return -EINVAL;
+}
+
+static ssize_t m68k_nvram_write(char *buf, size_t count, loff_t *ppos)
+{
+	if (MACH_IS_ATARI)
+		return atari_nvram_write(buf, count, ppos);
+	else if (MACH_IS_MAC) {
+		ssize_t size = mac_pram_get_size();
+		char *p = buf;
+		loff_t i;
+
+		for (i = *ppos; count > 0 && i < size; --count, ++i, ++p)
+			mac_pram_write_byte(*p, i);
+
+		*ppos = i;
+		return p - buf;
+	}
+	return -EINVAL;
+}
+
+static long m68k_nvram_set_checksum(void)
+{
+	if (MACH_IS_ATARI)
+		return atari_nvram_set_checksum();
+	return -EINVAL;
+}
+
+static long m68k_nvram_initialize(void)
+{
+	if (MACH_IS_ATARI)
+		return atari_nvram_initialize();
+	return -EINVAL;
+}
+#endif /* CONFIG_ATARI */
+
+static ssize_t m68k_nvram_get_size(void)
+{
+	if (MACH_IS_ATARI)
+		return atari_nvram_get_size();
+	else if (MACH_IS_MAC)
+		return mac_pram_get_size();
+	return -ENODEV;
+}
+
+/* Atari device drivers call .read (to get checksum validation) whereas
+ * Mac and PowerMac device drivers just use .read_byte.
+ */
+const struct nvram_ops arch_nvram_ops = {
+#ifdef CONFIG_MAC
+	.read_byte      = m68k_nvram_read_byte,
+	.write_byte     = m68k_nvram_write_byte,
+#endif
+#ifdef CONFIG_ATARI
+	.read           = m68k_nvram_read,
+	.write          = m68k_nvram_write,
+	.set_checksum   = m68k_nvram_set_checksum,
+	.initialize     = m68k_nvram_initialize,
+#endif
+	.get_size       = m68k_nvram_get_size,
+};
+EXPORT_SYMBOL(arch_nvram_ops);
+#endif /* CONFIG_NVRAM */
Index: linux/arch/m68k/Kconfig.machine
===================================================================
--- linux.orig/arch/m68k/Kconfig.machine	2015-07-12 20:25:05.000000000 +1000
+++ linux/arch/m68k/Kconfig.machine	2015-07-12 20:25:24.000000000 +1000
@@ -26,6 +26,7 @@ config MAC
 	bool "Macintosh support"
 	depends on MMU
 	select MMU_MOTOROLA if MMU
+	select HAVE_ARCH_NVRAM_OPS
 	help
 	  This option enables support for the Apple Macintosh series of
 	  computers (yes, there is experimental support now, at least for part
Index: linux/arch/m68k/include/asm/atarihw.h
===================================================================
--- linux.orig/arch/m68k/include/asm/atarihw.h	2015-07-12 20:24:53.000000000 +1000
+++ linux/arch/m68k/include/asm/atarihw.h	2015-07-12 20:25:24.000000000 +1000
@@ -32,6 +32,12 @@ extern int atari_dont_touch_floppy_selec
 
 extern int atari_SCC_reset_done;
 
+extern ssize_t atari_nvram_read(char *, size_t, loff_t *);
+extern ssize_t atari_nvram_write(char *, size_t, loff_t *);
+extern ssize_t atari_nvram_get_size(void);
+extern long atari_nvram_set_checksum(void);
+extern long atari_nvram_initialize(void);
+
 /* convenience macros for testing machine type */
 #define MACH_IS_ST	((atari_mch_cookie >> 16) == ATARI_MCH_ST)
 #define MACH_IS_STE	((atari_mch_cookie >> 16) == ATARI_MCH_STE && \
Index: linux/arch/m68k/include/asm/macintosh.h
===================================================================
--- linux.orig/arch/m68k/include/asm/macintosh.h	2015-07-12 20:24:53.000000000 +1000
+++ linux/arch/m68k/include/asm/macintosh.h	2015-07-12 20:25:24.000000000 +1000
@@ -18,6 +18,10 @@ extern void mac_init_IRQ(void);
 extern void mac_irq_enable(struct irq_data *data);
 extern void mac_irq_disable(struct irq_data *data);
 
+extern unsigned char mac_pram_read_byte(int);
+extern void mac_pram_write_byte(unsigned char, int);
+extern ssize_t mac_pram_get_size(void);
+
 /*
  *	Macintosh Table
  */



^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [RFC v4 00/25] Re-use nvram module
  2015-07-12 10:25 [RFC v4 00/25] Re-use nvram module Finn Thain
                   ` (24 preceding siblings ...)
  2015-07-12 10:25 ` [RFC v4 25/25] m68k: Dispatch nvram_ops calls to Atari or Mac functions Finn Thain
@ 2015-07-13  7:55 ` Geert Uytterhoeven
  2015-07-14  7:57   ` Finn Thain
  25 siblings, 1 reply; 55+ messages in thread
From: Geert Uytterhoeven @ 2015-07-13  7:55 UTC (permalink / raw)
  To: Finn Thain; +Cc: linux-kernel, Linux/m68k, linuxppc-dev

Hi Finn,

On Sun, Jul 12, 2015 at 12:25 PM, Finn Thain <fthain@telegraphics.com.au> wrote:
> The generic NVRAM module, drivers/char/generic_nvram, implements a
> /dev/nvram misc device. It is used only by 32-bit PowerPC platforms and
> isn't generic enough to be more widely used.

[...]

Thanks for your work!

How are we gonna merge this?
Have you looked into the dependencies?
Are there (large) parts we can merge in parallel?

Thanks again!

Gr{oetje,eeting}s,

                        Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [RFC v4 03/25] m68k/atari: Move Atari-specific code out of drivers/char/nvram.c
  2015-07-12 10:25 ` [RFC v4 03/25] m68k/atari: Move Atari-specific code out of drivers/char/nvram.c Finn Thain
@ 2015-07-13 18:13   ` Andreas Schwab
  2015-07-14  8:17     ` Finn Thain
  0 siblings, 1 reply; 55+ messages in thread
From: Andreas Schwab @ 2015-07-13 18:13 UTC (permalink / raw)
  To: Finn Thain
  Cc: linux-kernel, linux-m68k, linuxppc-dev, Geert Uytterhoeven,
	Arnd Bergmann, Greg Kroah-Hartman

Finn Thain <fthain@telegraphics.com.au> writes:

> BTW, I didn't change the SCSI ID location in NVRAM. This code says 16
> whereas atari_scsi says 14. Which one is correct?

I think atari_scsi is wrong.  The best source I could find
(http://www.gratifiant.com/nvram-falcon-t561185) places it after the
video mode byte, thus at byte 16.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [RFC v4 00/25] Re-use nvram module
  2015-07-13  7:55 ` [RFC v4 00/25] Re-use nvram module Geert Uytterhoeven
@ 2015-07-14  7:57   ` Finn Thain
  0 siblings, 0 replies; 55+ messages in thread
From: Finn Thain @ 2015-07-14  7:57 UTC (permalink / raw)
  To: Geert Uytterhoeven; +Cc: linux-kernel, linux-m68k, linuxppc-dev


On Mon, 13 Jul 2015, Geert Uytterhoeven wrote:

> 
> How are we gonna merge this?

I think the series would have to be merged almost whole. For the most 
part, no maintainer can merge any of this without ACKs from others:

- to improve code re-use by replacing an API shared by arch-specific code 
  and a variety of drivers means getting ACKs from everyone concerned (or 
  the old API can't be removed).

- to move arch-specific code out of a generic driver means getting ACKs 
  from both arch maintainer and driver maintainer. Some of this 
  arch-specific code is shared by m68k, x86 and arm (but not powerpc) and 
  this complicates things.

- to adopt a new Kconfig convention in a uniform and consistent way seems 
  to require simultaneous changes in various drivers and architectures.

> Have you looked into the dependencies?

What I saw was not pretty.

> Are there (large) parts we can merge in parallel?

Not AFAICT. Two patches could be cherry picked, that might make sense to 
merge by themselves. Those are patches 2 and 12. Either or both could be 
reviewed and merged by the char device maintainers.

There are a couple of other small patches that could probably be cherry 
picked without breaking anything but these changes are not justified 
except by subsequent patches.

> 
> Thanks again!

No worries.

-- 

> 
> Gr{oetje,eeting}s,
> 
>                         Geert
> 

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [RFC v4 17/25] powerpc, fbdev: Use arch_nvram_ops methods instead of nvram_read_byte() and nvram_write_byte()
  2015-07-12 10:25 ` [RFC v4 17/25] powerpc, fbdev: Use arch_nvram_ops methods instead of nvram_read_byte() and nvram_write_byte() Finn Thain
@ 2015-07-14  7:58   ` Finn Thain
  2015-07-14 11:52     ` Benjamin Herrenschmidt
  0 siblings, 1 reply; 55+ messages in thread
From: Finn Thain @ 2015-07-14  7:58 UTC (permalink / raw)
  To: linux-kernel, linux-m68k, linuxppc-dev, Benjamin Herrenschmidt,
	Paul Mackerras, Michael Ellerman, Arnd Bergmann,
	Greg Kroah-Hartman, Jean-Christophe Plagniol-Villard,
	Tomi Valkeinen, linux-fbdev


Make use of arch_nvram_ops in device drivers so that the nvram_* function 
exports can be removed.

Since they are no longer global symbols, rename the PPC32 nvram_* 
functions appropriately.

Add the missing CONFIG_NVRAM test to imsttfb to avoid a build failure.

Add a CONFIG_PPC32 test to matroxfb because PPC64 doesn't implement the 
read_byte() method.

Signed-off-by: Finn Thain <fthain@telegraphics.com.au>

---

Changed since v4:
- Added CONFIG_PPC32 test to matroxfb.

---
 arch/powerpc/kernel/setup_32.c             |    8 ++++----
 drivers/char/generic_nvram.c               |    4 ++--
 drivers/video/fbdev/controlfb.c            |    4 ++--
 drivers/video/fbdev/imsttfb.c              |    7 +++----
 drivers/video/fbdev/matrox/matroxfb_base.c |    4 ++--
 drivers/video/fbdev/platinumfb.c           |    4 ++--
 drivers/video/fbdev/valkyriefb.c           |    4 ++--
 7 files changed, 17 insertions(+), 18 deletions(-)

Index: linux/arch/powerpc/kernel/setup_32.c
===================================================================
--- linux.orig/arch/powerpc/kernel/setup_32.c	2015-07-13 21:33:01.000000000 +1000
+++ linux/arch/powerpc/kernel/setup_32.c	2015-07-13 21:33:02.000000000 +1000
@@ -170,20 +170,18 @@ __setup("l3cr=", ppc_setup_l3cr);
 
 #ifdef CONFIG_GENERIC_NVRAM
 
-unsigned char nvram_read_byte(int addr)
+static unsigned char ppc_nvram_read_byte(int addr)
 {
 	if (ppc_md.nvram_read_val)
 		return ppc_md.nvram_read_val(addr);
 	return 0xff;
 }
-EXPORT_SYMBOL(nvram_read_byte);
 
-void nvram_write_byte(unsigned char val, int addr)
+static void ppc_nvram_write_byte(unsigned char val, int addr)
 {
 	if (ppc_md.nvram_write_val)
 		ppc_md.nvram_write_val(addr, val);
 }
-EXPORT_SYMBOL(nvram_write_byte);
 
 static ssize_t ppc_nvram_get_size(void)
 {
@@ -200,6 +198,8 @@ static long ppc_nvram_sync(void)
 }
 
 const struct nvram_ops arch_nvram_ops = {
+	.read_byte      = ppc_nvram_read_byte,
+	.write_byte     = ppc_nvram_write_byte,
 	.get_size       = ppc_nvram_get_size,
 	.sync           = ppc_nvram_sync,
 };
Index: linux/drivers/char/generic_nvram.c
===================================================================
--- linux.orig/drivers/char/generic_nvram.c	2015-07-13 21:33:01.000000000 +1000
+++ linux/drivers/char/generic_nvram.c	2015-07-13 21:33:02.000000000 +1000
@@ -64,7 +64,7 @@ static ssize_t read_nvram(struct file *f
 	if (*ppos >= nvram_len)
 		return 0;
 	for (i = *ppos; count > 0 && i < nvram_len; ++i, ++p, --count)
-		if (__put_user(nvram_read_byte(i), p))
+		if (__put_user(arch_nvram_ops.read_byte(i), p))
 			return -EFAULT;
 	*ppos = i;
 	return p - buf;
@@ -84,7 +84,7 @@ static ssize_t write_nvram(struct file *
 	for (i = *ppos; count > 0 && i < nvram_len; ++i, ++p, --count) {
 		if (__get_user(c, p))
 			return -EFAULT;
-		nvram_write_byte(c, i);
+		arch_nvram_ops.write_byte(c, i);
 	}
 	*ppos = i;
 	return p - buf;
Index: linux/drivers/video/fbdev/controlfb.c
===================================================================
--- linux.orig/drivers/video/fbdev/controlfb.c	2015-07-13 21:32:43.000000000 +1000
+++ linux/drivers/video/fbdev/controlfb.c	2015-07-13 21:33:02.000000000 +1000
@@ -415,7 +415,7 @@ static int __init init_control(struct fb
 	/* Try to pick a video mode out of NVRAM if we have one. */
 #ifdef CONFIG_NVRAM
 	if (default_cmode == CMODE_NVRAM) {
-		cmode = nvram_read_byte(NV_CMODE);
+		cmode = arch_nvram_ops.read_byte(NV_CMODE);
 		if(cmode < CMODE_8 || cmode > CMODE_32)
 			cmode = CMODE_8;
 	} else
@@ -423,7 +423,7 @@ static int __init init_control(struct fb
 		cmode=default_cmode;
 #ifdef CONFIG_NVRAM
 	if (default_vmode == VMODE_NVRAM) {
-		vmode = nvram_read_byte(NV_VMODE);
+		vmode = arch_nvram_ops.read_byte(NV_VMODE);
 		if (vmode < 1 || vmode > VMODE_MAX ||
 		    control_mac_modes[vmode - 1].m[full] < cmode) {
 			sense = read_control_sense(p);
Index: linux/drivers/video/fbdev/matrox/matroxfb_base.c
===================================================================
--- linux.orig/drivers/video/fbdev/matrox/matroxfb_base.c	2015-07-13 21:32:57.000000000 +1000
+++ linux/drivers/video/fbdev/matrox/matroxfb_base.c	2015-07-13 21:33:02.000000000 +1000
@@ -1886,9 +1886,9 @@ static int initMatrox2(struct matrox_fb_
 		struct fb_var_screeninfo var;
 		if (default_vmode <= 0 || default_vmode > VMODE_MAX)
 			default_vmode = VMODE_640_480_60;
-#ifdef CONFIG_NVRAM
+#if defined(CONFIG_NVRAM) && defined(CONFIG_PPC32)
 		if (default_cmode == CMODE_NVRAM)
-			default_cmode = nvram_read_byte(NV_CMODE);
+			default_cmode = arch_nvram_ops.read_byte(NV_CMODE);
 #endif
 		if (default_cmode < CMODE_8 || default_cmode > CMODE_32)
 			default_cmode = CMODE_8;
Index: linux/drivers/video/fbdev/platinumfb.c
===================================================================
--- linux.orig/drivers/video/fbdev/platinumfb.c	2015-07-13 21:32:43.000000000 +1000
+++ linux/drivers/video/fbdev/platinumfb.c	2015-07-13 21:33:02.000000000 +1000
@@ -349,7 +349,7 @@ static int platinum_init_fb(struct fb_in
 	printk(KERN_INFO "platinumfb: Monitor sense value = 0x%x, ", sense);
 	if (default_vmode == VMODE_NVRAM) {
 #ifdef CONFIG_NVRAM
-		default_vmode = nvram_read_byte(NV_VMODE);
+		default_vmode = arch_nvram_ops.read_byte(NV_VMODE);
 		if (default_vmode <= 0 || default_vmode > VMODE_MAX ||
 		    !platinum_reg_init[default_vmode-1])
 #endif
@@ -362,7 +362,7 @@ static int platinum_init_fb(struct fb_in
 		default_vmode = VMODE_640_480_60;
 #ifdef CONFIG_NVRAM
 	if (default_cmode == CMODE_NVRAM)
-		default_cmode = nvram_read_byte(NV_CMODE);
+		default_cmode = arch_nvram_ops.read_byte(NV_CMODE);
 #endif
 	if (default_cmode < CMODE_8 || default_cmode > CMODE_32)
 		default_cmode = CMODE_8;
Index: linux/drivers/video/fbdev/valkyriefb.c
===================================================================
--- linux.orig/drivers/video/fbdev/valkyriefb.c	2015-07-13 21:32:43.000000000 +1000
+++ linux/drivers/video/fbdev/valkyriefb.c	2015-07-13 21:33:02.000000000 +1000
@@ -287,7 +287,7 @@ static void __init valkyrie_choose_mode(
 	/* Try to pick a video mode out of NVRAM if we have one. */
 #if !defined(CONFIG_MAC) && defined(CONFIG_NVRAM)
 	if (default_vmode == VMODE_NVRAM) {
-		default_vmode = nvram_read_byte(NV_VMODE);
+		default_vmode = arch_nvram_ops.read_byte(NV_VMODE);
 		if (default_vmode <= 0
 		 || default_vmode > VMODE_MAX
 		 || !valkyrie_reg_init[default_vmode - 1])
@@ -300,7 +300,7 @@ static void __init valkyrie_choose_mode(
 		default_vmode = VMODE_640_480_67;
 #if !defined(CONFIG_MAC) && defined(CONFIG_NVRAM)
 	if (default_cmode == CMODE_NVRAM)
-		default_cmode = nvram_read_byte(NV_CMODE);
+		default_cmode = arch_nvram_ops.read_byte(NV_CMODE);
 #endif
 
 	/*
Index: linux/drivers/video/fbdev/imsttfb.c
===================================================================
--- linux.orig/drivers/video/fbdev/imsttfb.c	2015-07-13 21:32:43.000000000 +1000
+++ linux/drivers/video/fbdev/imsttfb.c	2015-07-13 21:33:02.000000000 +1000
@@ -328,7 +328,6 @@ enum {
 	TVP = 1
 };
 
-#define USE_NV_MODES		1
 #define INIT_BPP		8
 #define INIT_XRES		640
 #define INIT_YRES		480
@@ -1391,17 +1390,17 @@ static void init_imstt(struct fb_info *i
 		}
 	}
 
-#if USE_NV_MODES && defined(CONFIG_PPC32)
+#if defined(CONFIG_NVRAM) && defined(CONFIG_PPC32)
 	{
 		int vmode = init_vmode, cmode = init_cmode;
 
 		if (vmode == -1) {
-			vmode = nvram_read_byte(NV_VMODE);
+			vmode = arch_nvram_ops.read_byte(NV_VMODE);
 			if (vmode <= 0 || vmode > VMODE_MAX)
 				vmode = VMODE_640_480_67;
 		}
 		if (cmode == -1) {
-			cmode = nvram_read_byte(NV_CMODE);
+			cmode = arch_nvram_ops.read_byte(NV_CMODE);
 			if (cmode < CMODE_8 || cmode > CMODE_32)
 				cmode = CMODE_8;
 		}


^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [RFC v4 03/25] m68k/atari: Move Atari-specific code out of drivers/char/nvram.c
  2015-07-13 18:13   ` Andreas Schwab
@ 2015-07-14  8:17     ` Finn Thain
  2015-07-14  8:23       ` Geert Uytterhoeven
  2015-07-22  3:52       ` Michael Schmitz
  0 siblings, 2 replies; 55+ messages in thread
From: Finn Thain @ 2015-07-14  8:17 UTC (permalink / raw)
  To: Andreas Schwab
  Cc: linux-kernel, linux-m68k, linuxppc-dev, Geert Uytterhoeven,
	Arnd Bergmann, Greg Kroah-Hartman


On Mon, 13 Jul 2015, Andreas Schwab wrote:

> Finn Thain <fthain@telegraphics.com.au> writes:
> 
> > BTW, I didn't change the SCSI ID location in NVRAM. This code says 16 
> > whereas atari_scsi says 14. Which one is correct?
> 
> I think atari_scsi is wrong.  The best source I could find 
> (http://www.gratifiant.com/nvram-falcon-t561185) places it after the 
> video mode byte, thus at byte 16.

Thanks for that. BTW, I googled a phrase from that page and found this one
  http://toshyp.atari.org/en/004009.html
which may be closer to the source.

I'll send a patch if someone can offer to test such a change to atari_scsi 
(or merely confirm that the SCSI ID setting in TOS does not match this_id 
given in dmesg).

-- 

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [RFC v4 03/25] m68k/atari: Move Atari-specific code out of drivers/char/nvram.c
  2015-07-14  8:17     ` Finn Thain
@ 2015-07-14  8:23       ` Geert Uytterhoeven
  2015-07-14  8:33         ` Andreas Schwab
  2015-07-22  3:52       ` Michael Schmitz
  1 sibling, 1 reply; 55+ messages in thread
From: Geert Uytterhoeven @ 2015-07-14  8:23 UTC (permalink / raw)
  To: Finn Thain
  Cc: Andreas Schwab, linux-kernel, Linux/m68k, linuxppc-dev,
	Arnd Bergmann, Greg Kroah-Hartman

On Tue, Jul 14, 2015 at 10:17 AM, Finn Thain <fthain@telegraphics.com.au> wrote:
> On Mon, 13 Jul 2015, Andreas Schwab wrote:
>> Finn Thain <fthain@telegraphics.com.au> writes:
>> > BTW, I didn't change the SCSI ID location in NVRAM. This code says 16
>> > whereas atari_scsi says 14. Which one is correct?
>>
>> I think atari_scsi is wrong.  The best source I could find
>> (http://www.gratifiant.com/nvram-falcon-t561185) places it after the
>> video mode byte, thus at byte 16.
>
> Thanks for that. BTW, I googled a phrase from that page and found this one
>   http://toshyp.atari.org/en/004009.html
> which may be closer to the source.

Hence "int" is 16-bits in all those references?

Gr{oetje,eeting}s,

                        Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [RFC v4 03/25] m68k/atari: Move Atari-specific code out of drivers/char/nvram.c
  2015-07-14  8:23       ` Geert Uytterhoeven
@ 2015-07-14  8:33         ` Andreas Schwab
  0 siblings, 0 replies; 55+ messages in thread
From: Andreas Schwab @ 2015-07-14  8:33 UTC (permalink / raw)
  To: Geert Uytterhoeven
  Cc: Finn Thain, linux-kernel, Linux/m68k, linuxppc-dev,
	Arnd Bergmann, Greg Kroah-Hartman

Geert Uytterhoeven <geert@linux-m68k.org> writes:

> On Tue, Jul 14, 2015 at 10:17 AM, Finn Thain <fthain@telegraphics.com.au> wrote:
>> On Mon, 13 Jul 2015, Andreas Schwab wrote:
>>> Finn Thain <fthain@telegraphics.com.au> writes:
>>> > BTW, I didn't change the SCSI ID location in NVRAM. This code says 16
>>> > whereas atari_scsi says 14. Which one is correct?
>>>
>>> I think atari_scsi is wrong.  The best source I could find
>>> (http://www.gratifiant.com/nvram-falcon-t561185) places it after the
>>> video mode byte, thus at byte 16.
>>
>> Thanks for that. BTW, I googled a phrase from that page and found this one
>>   http://toshyp.atari.org/en/004009.html
>> which may be closer to the source.
>
> Hence "int" is 16-bits in all those references?

Yes, TOS uses 16-bit ints throughout.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [RFC v4 17/25] powerpc, fbdev: Use arch_nvram_ops methods instead of nvram_read_byte() and nvram_write_byte()
  2015-07-14  7:58   ` Finn Thain
@ 2015-07-14 11:52     ` Benjamin Herrenschmidt
  2015-07-15  5:21       ` Finn Thain
  0 siblings, 1 reply; 55+ messages in thread
From: Benjamin Herrenschmidt @ 2015-07-14 11:52 UTC (permalink / raw)
  To: Finn Thain
  Cc: linux-kernel, linux-m68k, linuxppc-dev, Paul Mackerras,
	Michael Ellerman, Arnd Bergmann, Greg Kroah-Hartman,
	Jean-Christophe Plagniol-Villard, Tomi Valkeinen, linux-fbdev

On Tue, 2015-07-14 at 17:58 +1000, Finn Thain wrote:
> Make use of arch_nvram_ops in device drivers so that the nvram_* function 
> exports can be removed.
> 
> Since they are no longer global symbols, rename the PPC32 nvram_* 
> functions appropriately.
> 
> Add the missing CONFIG_NVRAM test to imsttfb to avoid a build failure.
> 
> Add a CONFIG_PPC32 test to matroxfb because PPC64 doesn't implement the 
> read_byte() method.

This is a bit fishy in a way because some of that nvram stuff is really
about powermac/apple nvram offsets, ie, "XPRAM". Maybe we
should have a dedicated accessor for "mac_xpram" and NULL-check it
rather than using ifdef's ?

> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
> 
> ---
> 
> Changed since v4:
> - Added CONFIG_PPC32 test to matroxfb.
> 
> ---
>  arch/powerpc/kernel/setup_32.c             |    8 ++++----
>  drivers/char/generic_nvram.c               |    4 ++--
>  drivers/video/fbdev/controlfb.c            |    4 ++--
>  drivers/video/fbdev/imsttfb.c              |    7 +++----
>  drivers/video/fbdev/matrox/matroxfb_base.c |    4 ++--
>  drivers/video/fbdev/platinumfb.c           |    4 ++--
>  drivers/video/fbdev/valkyriefb.c           |    4 ++--
>  7 files changed, 17 insertions(+), 18 deletions(-)
> 
> Index: linux/arch/powerpc/kernel/setup_32.c
> ===================================================================
> --- linux.orig/arch/powerpc/kernel/setup_32.c	2015-07-13 21:33:01.000000000 +1000
> +++ linux/arch/powerpc/kernel/setup_32.c	2015-07-13 21:33:02.000000000 +1000
> @@ -170,20 +170,18 @@ __setup("l3cr=", ppc_setup_l3cr);
>  
>  #ifdef CONFIG_GENERIC_NVRAM
>  
> -unsigned char nvram_read_byte(int addr)
> +static unsigned char ppc_nvram_read_byte(int addr)
>  {
>  	if (ppc_md.nvram_read_val)
>  		return ppc_md.nvram_read_val(addr);
>  	return 0xff;
>  }
> -EXPORT_SYMBOL(nvram_read_byte);
>  
> -void nvram_write_byte(unsigned char val, int addr)
> +static void ppc_nvram_write_byte(unsigned char val, int addr)
>  {
>  	if (ppc_md.nvram_write_val)
>  		ppc_md.nvram_write_val(addr, val);
>  }
> -EXPORT_SYMBOL(nvram_write_byte);
>  
>  static ssize_t ppc_nvram_get_size(void)
>  {
> @@ -200,6 +198,8 @@ static long ppc_nvram_sync(void)
>  }
>  
>  const struct nvram_ops arch_nvram_ops = {
> +	.read_byte      = ppc_nvram_read_byte,
> +	.write_byte     = ppc_nvram_write_byte,
>  	.get_size       = ppc_nvram_get_size,
>  	.sync           = ppc_nvram_sync,
>  };
> Index: linux/drivers/char/generic_nvram.c
> ===================================================================
> --- linux.orig/drivers/char/generic_nvram.c	2015-07-13 21:33:01.000000000 +1000
> +++ linux/drivers/char/generic_nvram.c	2015-07-13 21:33:02.000000000 +1000
> @@ -64,7 +64,7 @@ static ssize_t read_nvram(struct file *f
>  	if (*ppos >= nvram_len)
>  		return 0;
>  	for (i = *ppos; count > 0 && i < nvram_len; ++i, ++p, --count)
> -		if (__put_user(nvram_read_byte(i), p))
> +		if (__put_user(arch_nvram_ops.read_byte(i), p))
>  			return -EFAULT;
>  	*ppos = i;
>  	return p - buf;
> @@ -84,7 +84,7 @@ static ssize_t write_nvram(struct file *
>  	for (i = *ppos; count > 0 && i < nvram_len; ++i, ++p, --count) {
>  		if (__get_user(c, p))
>  			return -EFAULT;
> -		nvram_write_byte(c, i);
> +		arch_nvram_ops.write_byte(c, i);
>  	}
>  	*ppos = i;
>  	return p - buf;
> Index: linux/drivers/video/fbdev/controlfb.c
> ===================================================================
> --- linux.orig/drivers/video/fbdev/controlfb.c	2015-07-13 21:32:43.000000000 +1000
> +++ linux/drivers/video/fbdev/controlfb.c	2015-07-13 21:33:02.000000000 +1000
> @@ -415,7 +415,7 @@ static int __init init_control(struct fb
>  	/* Try to pick a video mode out of NVRAM if we have one. */
>  #ifdef CONFIG_NVRAM
>  	if (default_cmode == CMODE_NVRAM) {
> -		cmode = nvram_read_byte(NV_CMODE);
> +		cmode = arch_nvram_ops.read_byte(NV_CMODE);
>  		if(cmode < CMODE_8 || cmode > CMODE_32)
>  			cmode = CMODE_8;
>  	} else
> @@ -423,7 +423,7 @@ static int __init init_control(struct fb
>  		cmode=default_cmode;
>  #ifdef CONFIG_NVRAM
>  	if (default_vmode == VMODE_NVRAM) {
> -		vmode = nvram_read_byte(NV_VMODE);
> +		vmode = arch_nvram_ops.read_byte(NV_VMODE);
>  		if (vmode < 1 || vmode > VMODE_MAX ||
>  		    control_mac_modes[vmode - 1].m[full] < cmode) {
>  			sense = read_control_sense(p);
> Index: linux/drivers/video/fbdev/matrox/matroxfb_base.c
> ===================================================================
> --- linux.orig/drivers/video/fbdev/matrox/matroxfb_base.c	2015-07-13 21:32:57.000000000 +1000
> +++ linux/drivers/video/fbdev/matrox/matroxfb_base.c	2015-07-13 21:33:02.000000000 +1000
> @@ -1886,9 +1886,9 @@ static int initMatrox2(struct matrox_fb_
>  		struct fb_var_screeninfo var;
>  		if (default_vmode <= 0 || default_vmode > VMODE_MAX)
>  			default_vmode = VMODE_640_480_60;
> -#ifdef CONFIG_NVRAM
> +#if defined(CONFIG_NVRAM) && defined(CONFIG_PPC32)
>  		if (default_cmode == CMODE_NVRAM)
> -			default_cmode = nvram_read_byte(NV_CMODE);
> +			default_cmode = arch_nvram_ops.read_byte(NV_CMODE);
>  #endif
>  		if (default_cmode < CMODE_8 || default_cmode > CMODE_32)
>  			default_cmode = CMODE_8;
> Index: linux/drivers/video/fbdev/platinumfb.c
> ===================================================================
> --- linux.orig/drivers/video/fbdev/platinumfb.c	2015-07-13 21:32:43.000000000 +1000
> +++ linux/drivers/video/fbdev/platinumfb.c	2015-07-13 21:33:02.000000000 +1000
> @@ -349,7 +349,7 @@ static int platinum_init_fb(struct fb_in
>  	printk(KERN_INFO "platinumfb: Monitor sense value = 0x%x, ", sense);
>  	if (default_vmode == VMODE_NVRAM) {
>  #ifdef CONFIG_NVRAM
> -		default_vmode = nvram_read_byte(NV_VMODE);
> +		default_vmode = arch_nvram_ops.read_byte(NV_VMODE);
>  		if (default_vmode <= 0 || default_vmode > VMODE_MAX ||
>  		    !platinum_reg_init[default_vmode-1])
>  #endif
> @@ -362,7 +362,7 @@ static int platinum_init_fb(struct fb_in
>  		default_vmode = VMODE_640_480_60;
>  #ifdef CONFIG_NVRAM
>  	if (default_cmode == CMODE_NVRAM)
> -		default_cmode = nvram_read_byte(NV_CMODE);
> +		default_cmode = arch_nvram_ops.read_byte(NV_CMODE);
>  #endif
>  	if (default_cmode < CMODE_8 || default_cmode > CMODE_32)
>  		default_cmode = CMODE_8;
> Index: linux/drivers/video/fbdev/valkyriefb.c
> ===================================================================
> --- linux.orig/drivers/video/fbdev/valkyriefb.c	2015-07-13 21:32:43.000000000 +1000
> +++ linux/drivers/video/fbdev/valkyriefb.c	2015-07-13 21:33:02.000000000 +1000
> @@ -287,7 +287,7 @@ static void __init valkyrie_choose_mode(
>  	/* Try to pick a video mode out of NVRAM if we have one. */
>  #if !defined(CONFIG_MAC) && defined(CONFIG_NVRAM)
>  	if (default_vmode == VMODE_NVRAM) {
> -		default_vmode = nvram_read_byte(NV_VMODE);
> +		default_vmode = arch_nvram_ops.read_byte(NV_VMODE);
>  		if (default_vmode <= 0
>  		 || default_vmode > VMODE_MAX
>  		 || !valkyrie_reg_init[default_vmode - 1])
> @@ -300,7 +300,7 @@ static void __init valkyrie_choose_mode(
>  		default_vmode = VMODE_640_480_67;
>  #if !defined(CONFIG_MAC) && defined(CONFIG_NVRAM)
>  	if (default_cmode == CMODE_NVRAM)
> -		default_cmode = nvram_read_byte(NV_CMODE);
> +		default_cmode = arch_nvram_ops.read_byte(NV_CMODE);
>  #endif
>  
>  	/*
> Index: linux/drivers/video/fbdev/imsttfb.c
> ===================================================================
> --- linux.orig/drivers/video/fbdev/imsttfb.c	2015-07-13 21:32:43.000000000 +1000
> +++ linux/drivers/video/fbdev/imsttfb.c	2015-07-13 21:33:02.000000000 +1000
> @@ -328,7 +328,6 @@ enum {
>  	TVP = 1
>  };
>  
> -#define USE_NV_MODES		1
>  #define INIT_BPP		8
>  #define INIT_XRES		640
>  #define INIT_YRES		480
> @@ -1391,17 +1390,17 @@ static void init_imstt(struct fb_info *i
>  		}
>  	}
>  
> -#if USE_NV_MODES && defined(CONFIG_PPC32)
> +#if defined(CONFIG_NVRAM) && defined(CONFIG_PPC32)
>  	{
>  		int vmode = init_vmode, cmode = init_cmode;
>  
>  		if (vmode == -1) {
> -			vmode = nvram_read_byte(NV_VMODE);
> +			vmode = arch_nvram_ops.read_byte(NV_VMODE);
>  			if (vmode <= 0 || vmode > VMODE_MAX)
>  				vmode = VMODE_640_480_67;
>  		}
>  		if (cmode == -1) {
> -			cmode = nvram_read_byte(NV_CMODE);
> +			cmode = arch_nvram_ops.read_byte(NV_CMODE);
>  			if (cmode < CMODE_8 || cmode > CMODE_32)
>  				cmode = CMODE_8;
>  		}



^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [RFC v4 17/25] powerpc, fbdev: Use arch_nvram_ops methods instead of nvram_read_byte() and nvram_write_byte()
  2015-07-14 11:52     ` Benjamin Herrenschmidt
@ 2015-07-15  5:21       ` Finn Thain
  2015-07-16  6:01         ` Finn Thain
  0 siblings, 1 reply; 55+ messages in thread
From: Finn Thain @ 2015-07-15  5:21 UTC (permalink / raw)
  To: Benjamin Herrenschmidt
  Cc: linux-kernel, linux-m68k, linuxppc-dev, Paul Mackerras,
	Michael Ellerman, Arnd Bergmann, Greg Kroah-Hartman,
	Jean-Christophe Plagniol-Villard, Tomi Valkeinen, linux-fbdev


On Tue, 14 Jul 2015, Benjamin Herrenschmidt wrote:

> On Tue, 2015-07-14 at 17:58 +1000, Finn Thain wrote:
> > Make use of arch_nvram_ops in device drivers so that the nvram_* 
> > function exports can be removed.
> > 
> > Since they are no longer global symbols, rename the PPC32 nvram_* 
> > functions appropriately.
> > 
> > Add the missing CONFIG_NVRAM test to imsttfb to avoid a build failure.
> > 
> > Add a CONFIG_PPC32 test to matroxfb because PPC64 doesn't implement 
> > the read_byte() method.
> 
> This is a bit fishy in a way because some of that nvram stuff is really 
> about powermac/apple nvram offsets, ie, "XPRAM".

Yes, the generalization that PPC64 does not have XPRAM is wrong, but that 
wasn't originally my doing. If we were to address that issue, this patch 
series may not be the best place to do so.

The situation presently is that CONFIG_NVRAM cannot be enabled on PPC64. I 
took advantage of that simplification, despite the corner cases where it 
fails.

The corner cases are found among PPC64 systems with Matrox cards. The 
other PowerMac video drivers are not really relevant here due to "depends 
on PPC32" or "#if defined(CONFIG_PPC32)", meaning that nvram_read_byte() 
isn't a problem there.

Perhaps only dual-boot systems are at issue because AFAIK only Mac OS 
offers a user friendly way to edit XPRAM settings (?) Further, does the 
video mode setting in XPRAM relate only to the MacOS main screen and not 
to other devices? That is, are we concerned here only with dual-boot PPC64 
machines with one matrox card, as the main screen, and no Linux desktop 
environment and no video mode settings on the kernel command line?

> Maybe we should have a dedicated accessor for "mac_xpram" and NULL-check 
> it rather than using ifdef's ?

I wanted arch_nvram_ops to be const data, which means a NULL check won't 
work, because defined(CONFIG_PPC_PMAC) does not imply availability of 
XPRAM at run-time.

There is a similar situation in the m68k portion of this patch series: a 
multi-platform kernel binary might run on an Atari or a Mac. On m68k I 
resolved this with MACH_IS_MAC(), which is analogous to 
machine_is(powermac).

So I can see how to implement XPRAM for matroxfb and imsttfb on PPC64. But 
this is an enhancement that I would defer unless the present limitation is 
already problematic.

-- 

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [RFC v4 17/25] powerpc, fbdev: Use arch_nvram_ops methods instead of nvram_read_byte() and nvram_write_byte()
  2015-07-15  5:21       ` Finn Thain
@ 2015-07-16  6:01         ` Finn Thain
  2015-09-18  8:17           ` Finn Thain
  0 siblings, 1 reply; 55+ messages in thread
From: Finn Thain @ 2015-07-16  6:01 UTC (permalink / raw)
  To: Benjamin Herrenschmidt
  Cc: linux-kernel, linux-m68k, linuxppc-dev, Paul Mackerras,
	Michael Ellerman, Arnd Bergmann, Greg Kroah-Hartman,
	Jean-Christophe Plagniol-Villard, Tomi Valkeinen, linux-fbdev


On Wed, 15 Jul 2015, I wrote:

> On Tue, 14 Jul 2015, Benjamin Herrenschmidt wrote:
> 
> > Maybe we should have a dedicated accessor for "mac_xpram" ...
> 
> ... I can see how to implement XPRAM for matroxfb and imsttfb 

I'll have to retract that. The video mode and color mode settings used by 
the PowerMac framebuffer drivers don't exist in the PRAM portion of NVRAM.

Addresses 0x140F and 0x1410 are found in the partition reserved by Apple 
for "Name Registry properties", according to Designing PCI Cards and 
Drivers for Power Macintosh Computers. There is no equivalent on m68k 
Macs, AFAIK.

This is NVRAM partition 2 on my beige g3, which begins at 0x1400. I'm not 
sure that this is true on New World PowerMacs, and I suspect that the 
framebuffer drivers should be calling pmac_get_partition() to determine 
the offset of the beginning of the Name Registry partition.

The arch_nvram_ops methods don't deal with structures like partitions. 
They treat the entire 8 KiB as unstructured, because that's how /dev/nvram 
treats it.

-- 

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [RFC v4 03/25] m68k/atari: Move Atari-specific code out of drivers/char/nvram.c
  2015-07-14  8:17     ` Finn Thain
  2015-07-14  8:23       ` Geert Uytterhoeven
@ 2015-07-22  3:52       ` Michael Schmitz
  2015-07-22  4:22         ` Finn Thain
  1 sibling, 1 reply; 55+ messages in thread
From: Michael Schmitz @ 2015-07-22  3:52 UTC (permalink / raw)
  To: Finn Thain, Andreas Schwab
  Cc: linux-kernel, linux-m68k, linuxppc-dev, Geert Uytterhoeven,
	Arnd Bergmann, Greg Kroah-Hartman

Hi Finn,

I'm afraid I cannot test anything on Atari hardware at present - my 
Falcon ate it's IDE disk partition table with all the fun that entails. 
Haven't even begun to try and recover that yet.

If you send a patch I could build a kernel and send that to Christian 
for testing (if he's got his Falcon up and running - might be a tad warm 
in the attic for that, in fact).

Cheers,

     Michael


Am 14.07.15 um 20:17 schrieb Finn Thain:
> On Mon, 13 Jul 2015, Andreas Schwab wrote:
>
>> Finn Thain <fthain@telegraphics.com.au> writes:
>>
>>> BTW, I didn't change the SCSI ID location in NVRAM. This code says 16
>>> whereas atari_scsi says 14. Which one is correct?
>> I think atari_scsi is wrong.  The best source I could find
>> (http://www.gratifiant.com/nvram-falcon-t561185) places it after the
>> video mode byte, thus at byte 16.
> Thanks for that. BTW, I googled a phrase from that page and found this one
>    http://toshyp.atari.org/en/004009.html
> which may be closer to the source.
>
> I'll send a patch if someone can offer to test such a change to atari_scsi
> (or merely confirm that the SCSI ID setting in TOS does not match this_id
> given in dmesg).
>


^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [RFC v4 03/25] m68k/atari: Move Atari-specific code out of drivers/char/nvram.c
  2015-07-22  3:52       ` Michael Schmitz
@ 2015-07-22  4:22         ` Finn Thain
  2015-07-22 14:32           ` Christian T. Steigies
  2015-07-23  9:21           ` Christian T. Steigies
  0 siblings, 2 replies; 55+ messages in thread
From: Finn Thain @ 2015-07-22  4:22 UTC (permalink / raw)
  To: Michael Schmitz
  Cc: Andreas Schwab, linux-kernel, linux-m68k, linuxppc-dev,
	Geert Uytterhoeven, Arnd Bergmann, Greg Kroah-Hartman


On Wed, 22 Jul 2015, Michael Schmitz wrote:

> Hi Finn,
> 
> I'm afraid I cannot test anything on Atari hardware at present - my 
> Falcon ate it's IDE disk partition table with all the fun that entails. 

That doesn't sound good.

> Haven't even begun to try and recover that yet.
> 
> If you send a patch I could build a kernel and send that to Christian 
> for testing (if he's got his Falcon up and running - might be a tad warm 
> in the attic for that, in fact).

Anyone with a suitable Atari, i.e. ATARIHW_PRESENT(TT_CLK), who can boot 
both TOS and Linux could resolve the question. (Perhaps with an emulator?)

Any old kernel binary would do, since atari_scsi should print either 
"HOSTID=n" or "this_id n" at startup.

If n doesn't agree with what TOS says about the host's SCSI ID, then I 
think a trivial patch is safe enough. Especially if cat /proc/driver/nvram 
produces a "SCSI host ID : m" that does agree with TOS.

Regards,
Finn

> 
> Cheers,
> 
>     Michael
> 
> 
> Am 14.07.15 um 20:17 schrieb Finn Thain:
> > On Mon, 13 Jul 2015, Andreas Schwab wrote:
> >
> > > Finn Thain <fthain@telegraphics.com.au> writes:
> > >
> > > > BTW, I didn't change the SCSI ID location in NVRAM. This code says 16
> > > > whereas atari_scsi says 14. Which one is correct?
> > > I think atari_scsi is wrong.  The best source I could find
> > > (http://www.gratifiant.com/nvram-falcon-t561185) places it after the
> > > video mode byte, thus at byte 16.
> > Thanks for that. BTW, I googled a phrase from that page and found this one
> >    http://toshyp.atari.org/en/004009.html
> > which may be closer to the source.
> >
> > I'll send a patch if someone can offer to test such a change to atari_scsi
> > (or merely confirm that the SCSI ID setting in TOS does not match this_id
> > given in dmesg).
> >
> 

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [RFC v4 03/25] m68k/atari: Move Atari-specific code out of drivers/char/nvram.c
  2015-07-22  4:22         ` Finn Thain
@ 2015-07-22 14:32           ` Christian T. Steigies
  2015-07-22 23:46             ` Michael Schmitz
  2015-07-23  9:21           ` Christian T. Steigies
  1 sibling, 1 reply; 55+ messages in thread
From: Christian T. Steigies @ 2015-07-22 14:32 UTC (permalink / raw)
  To: Finn Thain
  Cc: Michael Schmitz, Andreas Schwab, linux-kernel, linux-m68k,
	linuxppc-dev, Geert Uytterhoeven, Arnd Bergmann,
	Greg Kroah-Hartman

On Wed, Jul 22, 2015 at 02:22:21PM +1000, Finn Thain wrote:
> 
> On Wed, 22 Jul 2015, Michael Schmitz wrote:
> 
> > Hi Finn,
> > 
> > I'm afraid I cannot test anything on Atari hardware at present - my 
> > Falcon ate it's IDE disk partition table with all the fun that entails. 
> 
> That doesn't sound good.
> 
> > Haven't even begun to try and recover that yet.
> > 
> > If you send a patch I could build a kernel and send that to Christian 
> > for testing (if he's got his Falcon up and running - might be a tad warm 
> > in the attic for that, in fact).
> 
> Anyone with a suitable Atari, i.e. ATARIHW_PRESENT(TT_CLK), who can boot 
> both TOS and Linux could resolve the question. (Perhaps with an emulator?)

The Falcon is not powered on currently but it should still work. What should
I test?

> Any old kernel binary would do, since atari_scsi should print either 
> "HOSTID=n" or "this_id n" at startup.
> 
> If n doesn't agree with what TOS says about the host's SCSI ID, then I 
> think a trivial patch is safe enough. Especially if cat /proc/driver/nvram 
> produces a "SCSI host ID : m" that does agree with TOS.

Christian

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [RFC v4 03/25] m68k/atari: Move Atari-specific code out of drivers/char/nvram.c
  2015-07-22 14:32           ` Christian T. Steigies
@ 2015-07-22 23:46             ` Michael Schmitz
  2015-07-23  0:49               ` Finn Thain
  0 siblings, 1 reply; 55+ messages in thread
From: Michael Schmitz @ 2015-07-22 23:46 UTC (permalink / raw)
  To: Finn Thain, Michael Schmitz, Andreas Schwab,
	Linux Kernel Development, Linux/m68k, linuxppc-dev,
	Geert Uytterhoeven, Arnd Bergmann, Greg Kroah-Hartman

Hi Christian,

if I understand Finn right, he needs the SCSI host ID reported for the
Falcon SCSI chip, as found in this kernel log line:

scsi host0: Atari native SCSI, io_port 0x0, n_io_port 0, base 0x0, irq
15, can_queue 8, cmd_per_lun 1, sg_tablesize 0, this_id 7, flags { },
options { REAL_DMA SUPPORT_TAGS }

(see this_id; output from one of my ARAnyM instances, kernel 3.19rc6).
Also, the SCSI host ID reported by cat /proc/drivers/nvram (also 7, in
my case)

TOS reports the SCSI host ID during boot (when scannig for bootable
disks) IIRC. There may be some control panel to view the NVRAM
settings as well (stuff like default video mode was accessible from
the CT60 control panel so the SCSI host ID might be there as well).

Cheers,

  Michael



On Thu, Jul 23, 2015 at 2:32 AM, Christian T. Steigies <cts@debian.org> wrote:
> On Wed, Jul 22, 2015 at 02:22:21PM +1000, Finn Thain wrote:
>>
>> On Wed, 22 Jul 2015, Michael Schmitz wrote:
>>
>> > Hi Finn,
>> >
>> > I'm afraid I cannot test anything on Atari hardware at present - my
>> > Falcon ate it's IDE disk partition table with all the fun that entails.
>>
>> That doesn't sound good.
>>
>> > Haven't even begun to try and recover that yet.
>> >
>> > If you send a patch I could build a kernel and send that to Christian
>> > for testing (if he's got his Falcon up and running - might be a tad warm
>> > in the attic for that, in fact).
>>
>> Anyone with a suitable Atari, i.e. ATARIHW_PRESENT(TT_CLK), who can boot
>> both TOS and Linux could resolve the question. (Perhaps with an emulator?)
>
> The Falcon is not powered on currently but it should still work. What should
> I test?
>
>> Any old kernel binary would do, since atari_scsi should print either
>> "HOSTID=n" or "this_id n" at startup.
>>
>> If n doesn't agree with what TOS says about the host's SCSI ID, then I
>> think a trivial patch is safe enough. Especially if cat /proc/driver/nvram
>> produces a "SCSI host ID : m" that does agree with TOS.
>
> Christian

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [RFC v4 03/25] m68k/atari: Move Atari-specific code out of drivers/char/nvram.c
  2015-07-22 23:46             ` Michael Schmitz
@ 2015-07-23  0:49               ` Finn Thain
  0 siblings, 0 replies; 55+ messages in thread
From: Finn Thain @ 2015-07-23  0:49 UTC (permalink / raw)
  To: Michael Schmitz
  Cc: Andreas Schwab, Linux Kernel Development, Linux/m68k,
	linuxppc-dev, Geert Uytterhoeven, Arnd Bergmann,
	Greg Kroah-Hartman


On Thu, 23 Jul 2015, Michael Schmitz wrote:

> Hi Christian,
> 
> if I understand Finn right, he needs the SCSI host ID reported for the 
> Falcon SCSI chip, as found in this kernel log line:

What I'd really like is a regression test for this patch series. The SCSI 
host ID issue is a separate one; these patches won't fix that bug.

> 
> scsi host0: Atari native SCSI, io_port 0x0, n_io_port 0, base 0x0, irq 
> 15, can_queue 8, cmd_per_lun 1, sg_tablesize 0, this_id 7, flags { }, 
> options { REAL_DMA SUPPORT_TAGS }
> 
> (see this_id; output from one of my ARAnyM instances, kernel 3.19rc6). 
> Also, the SCSI host ID reported by cat /proc/drivers/nvram (also 7, in 
> my case)

This seems inconclusive to me. Perhaps if you were to change a setting in 
TOS such that the two values became unequal...

> 
> TOS reports the SCSI host ID during boot (when scannig for bootable 
> disks) IIRC. There may be some control panel to view the NVRAM settings 
> as well (stuff like default video mode was accessible from the CT60 
> control panel so the SCSI host ID might be there as well).

Can that be done in Aranym also?

-- 

> 
> Cheers,
> 
>   Michael
> 
> 
> 
> On Thu, Jul 23, 2015 at 2:32 AM, Christian T. Steigies <cts@debian.org> wrote:
> > On Wed, Jul 22, 2015 at 02:22:21PM +1000, Finn Thain wrote:
> >>
> >> On Wed, 22 Jul 2015, Michael Schmitz wrote:
> >>
> >> > Hi Finn,
> >> >
> >> > I'm afraid I cannot test anything on Atari hardware at present - my
> >> > Falcon ate it's IDE disk partition table with all the fun that entails.
> >>
> >> That doesn't sound good.
> >>
> >> > Haven't even begun to try and recover that yet.
> >> >
> >> > If you send a patch I could build a kernel and send that to Christian
> >> > for testing (if he's got his Falcon up and running - might be a tad warm
> >> > in the attic for that, in fact).
> >>
> >> Anyone with a suitable Atari, i.e. ATARIHW_PRESENT(TT_CLK), who can boot
> >> both TOS and Linux could resolve the question. (Perhaps with an emulator?)
> >
> > The Falcon is not powered on currently but it should still work. What should
> > I test?
> >
> >> Any old kernel binary would do, since atari_scsi should print either
> >> "HOSTID=n" or "this_id n" at startup.
> >>
> >> If n doesn't agree with what TOS says about the host's SCSI ID, then I
> >> think a trivial patch is safe enough. Especially if cat /proc/driver/nvram
> >> produces a "SCSI host ID : m" that does agree with TOS.
> >
> > Christian
> --
> To unsubscribe from this list: send the line "unsubscribe linux-m68k" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [RFC v4 03/25] m68k/atari: Move Atari-specific code out of drivers/char/nvram.c
  2015-07-22  4:22         ` Finn Thain
  2015-07-22 14:32           ` Christian T. Steigies
@ 2015-07-23  9:21           ` Christian T. Steigies
  2015-07-24  2:56             ` Michael Schmitz
  1 sibling, 1 reply; 55+ messages in thread
From: Christian T. Steigies @ 2015-07-23  9:21 UTC (permalink / raw)
  To: Finn Thain
  Cc: Michael Schmitz, Andreas Schwab, linux-kernel, linux-m68k,
	linuxppc-dev, Geert Uytterhoeven, Arnd Bergmann,
	Greg Kroah-Hartman

On Wed, Jul 22, 2015 at 02:22:21PM +1000, Finn Thain wrote:
> 
> Anyone with a suitable Atari, i.e. ATARIHW_PRESENT(TT_CLK), who can boot 
> both TOS and Linux could resolve the question. (Perhaps with an emulator?)
> 
> Any old kernel binary would do, since atari_scsi should print either 
> "HOSTID=n" or "this_id n" at startup.
> 
> If n doesn't agree with what TOS says about the host's SCSI ID, then I 
> think a trivial patch is safe enough. Especially if cat /proc/driver/nvram 
> produces a "SCSI host ID : m" that does agree with TOS.

root@garkin:~>cat /proc/hardware 
Model:          Atari Falcon
System Memory:  522752K
        510 MB at 0x01000000 (alternate RAM)
Detected hardware:
        Falcon Shifter
        Programmable Sound Generator
        PCM 8 Bit Sound
        CODEC Sound
        SCSI Controller NCR5380 (Falcon style)
        IDE Interface
        8/16 Mhz Switch for FDC
        Multi Function Peripheral MFP 68901
        Serial Communications Controller SCC 8530
        Paddle Interface
        DMA Controller for SCC
        Clock Chip MC146818A
        Blitter
        DSP56001 processor

root@garkin:~>dmesg |grep SCSI
[    0.000000] Atari hardware found: VIDEL STDMA-SCSI ST_MFP YM2149 PCM CODEC DSP56K SCC_DMA SCC ANALOG_JOY BLITTER IDE TT_CLK FDC_SPEED 
[    0.410000] SCSI subsystem initialized
[    0.850000] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 251)
[    4.230000] Atari SCSI: resetting the SCSI bus... done
[    6.750000] scsi host0: Atari native SCSI, io_port 0x0, n_io_port 0, base 0x0, irq 15, can_queue 8, cmd_per_lun 1, sg_tablesize 0, this_id 7, flags { }, options { REAL_DMA SUPPORT_TAGS } 

root@garkin:~>cat /proc/driver/nvram
Checksum status  : not valid
Boot preference  : 0xff (undefined)
SCSI arbitration : on
SCSI host ID     : 7
OS language      : 255 (undefined)
Keyboard language: 255 (undefined)
Date format      : 7 (undefined), 24h clock
Boot delay       : 255s
Video mode       : 4 colors, 40 columns, TV NTSC monitor
                   no overscan, compat. mode off


Let me know if you need more info.

Christian

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [RFC v4 03/25] m68k/atari: Move Atari-specific code out of drivers/char/nvram.c
  2015-07-23  9:21           ` Christian T. Steigies
@ 2015-07-24  2:56             ` Michael Schmitz
  2015-07-24 19:07               ` Christian T. Steigies
  0 siblings, 1 reply; 55+ messages in thread
From: Michael Schmitz @ 2015-07-24  2:56 UTC (permalink / raw)
  To: Finn Thain, Michael Schmitz, Andreas Schwab,
	Linux Kernel Development, Linux/m68k, linuxppc-dev,
	Geert Uytterhoeven, Arnd Bergmann, Greg Kroah-Hartman

Hi Christian,

here's what Finn asked me to run as tests:

# dmesg | grep this_id > nvram.out
# cat /proc/driver/nvram >> nvram.out
# hexdump -C /dev/nvram >> nvram.out
# cp /dev/nvram /tmp/nvram
# cp /tmp/nvram /dev/nvram
# md5sum /dev/nvram /tmp/nvram >> nvram.out

What you sent so far looks OK. I've tested the change of SCSI ID
(using EmuTOS) along with a trivial patch to atari_scsi.c (replace
offset 14 by 16) and the driver now uses the stored ID properly. I'll
sent kernels to test Finn's NVRAM patch for regression ASAP.

Thanks for your offer of help!

Cheers,

  Michael


On Thu, Jul 23, 2015 at 9:21 PM, Christian T. Steigies <cts@debian.org> wrote:
> On Wed, Jul 22, 2015 at 02:22:21PM +1000, Finn Thain wrote:
>>
>> Anyone with a suitable Atari, i.e. ATARIHW_PRESENT(TT_CLK), who can boot
>> both TOS and Linux could resolve the question. (Perhaps with an emulator?)
>>
>> Any old kernel binary would do, since atari_scsi should print either
>> "HOSTID=n" or "this_id n" at startup.
>>
>> If n doesn't agree with what TOS says about the host's SCSI ID, then I
>> think a trivial patch is safe enough. Especially if cat /proc/driver/nvram
>> produces a "SCSI host ID : m" that does agree with TOS.
>
> root@garkin:~>cat /proc/hardware
> Model:          Atari Falcon
> System Memory:  522752K
>         510 MB at 0x01000000 (alternate RAM)
> Detected hardware:
>         Falcon Shifter
>         Programmable Sound Generator
>         PCM 8 Bit Sound
>         CODEC Sound
>         SCSI Controller NCR5380 (Falcon style)
>         IDE Interface
>         8/16 Mhz Switch for FDC
>         Multi Function Peripheral MFP 68901
>         Serial Communications Controller SCC 8530
>         Paddle Interface
>         DMA Controller for SCC
>         Clock Chip MC146818A
>         Blitter
>         DSP56001 processor
>
> root@garkin:~>dmesg |grep SCSI
> [    0.000000] Atari hardware found: VIDEL STDMA-SCSI ST_MFP YM2149 PCM CODEC DSP56K SCC_DMA SCC ANALOG_JOY BLITTER IDE TT_CLK FDC_SPEED
> [    0.410000] SCSI subsystem initialized
> [    0.850000] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 251)
> [    4.230000] Atari SCSI: resetting the SCSI bus... done
> [    6.750000] scsi host0: Atari native SCSI, io_port 0x0, n_io_port 0, base 0x0, irq 15, can_queue 8, cmd_per_lun 1, sg_tablesize 0, this_id 7, flags { }, options { REAL_DMA SUPPORT_TAGS }
>
> root@garkin:~>cat /proc/driver/nvram
> Checksum status  : not valid
> Boot preference  : 0xff (undefined)
> SCSI arbitration : on
> SCSI host ID     : 7
> OS language      : 255 (undefined)
> Keyboard language: 255 (undefined)
> Date format      : 7 (undefined), 24h clock
> Boot delay       : 255s
> Video mode       : 4 colors, 40 columns, TV NTSC monitor
>                    no overscan, compat. mode off
>
>
> Let me know if you need more info.
>
> Christian

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [RFC v4 03/25] m68k/atari: Move Atari-specific code out of drivers/char/nvram.c
  2015-07-24  2:56             ` Michael Schmitz
@ 2015-07-24 19:07               ` Christian T. Steigies
  2015-07-25  0:35                 ` Finn Thain
  2015-07-25  0:51                 ` Michael Schmitz
  0 siblings, 2 replies; 55+ messages in thread
From: Christian T. Steigies @ 2015-07-24 19:07 UTC (permalink / raw)
  To: Michael Schmitz
  Cc: Finn Thain, Andreas Schwab, Linux Kernel Development, Linux/m68k,
	linuxppc-dev, Geert Uytterhoeven, Arnd Bergmann,
	Greg Kroah-Hartman

Moin,
On Fri, Jul 24, 2015 at 02:56:26PM +1200, Michael Schmitz wrote:
> 
> here's what Finn asked me to run as tests:
> 
> # dmesg | grep this_id > nvram.out
> # cat /proc/driver/nvram >> nvram.out
> # hexdump -C /dev/nvram >> nvram.out
> # cp /dev/nvram /tmp/nvram
> # cp /tmp/nvram /dev/nvram
> # md5sum /dev/nvram /tmp/nvram >> nvram.out

It seems I could successfully reset the nvram under TOS with bootconf.
Here is nvram.out, using the new kernel you sent me:

root@garkin:~>uname -a
Linux garkin 4.2.0-rc2-atari-269994-gc1e9d12 #327 Fri Jul 24 19:34:44 NZST 2015 m68k GNU/Linux

PS it seems LVM is working with this kernel as well!

Christian


[    7.000000] scsi host0: Atari native SCSI, io_port 0x0, n_io_port 0, base 0x0, irq 15, can_queue 8, cmd_per_lun 1, sg_tablesize 0, this_id 7, flags { }, options { REAL_DMA SUPPORT_TAGS } 
Checksum status  : valid
Boot preference  : unspecified
SCSI arbitration : on
SCSI host ID     : 7
OS language      : English (US)
Keyboard language: English (UK)
Date format      : YYÿDDÿMM, 24h clock
Boot delay       : 10s
Video mode       : ?? colors, 80 columns, VGA PAL monitor
                   overscan, compat. mode off, line doubling
00000000  00 00 ff ff ff ff 00 03  13 ff 0a ff ff ff 01 7f  |................|
00000010  87 ff 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000030  e1 1e                                             |..|
00000032
3b5801864975cf23bcacb52f648e74cc  /dev/nvram
3b5801864975cf23bcacb52f648e74cc  /tmp/nvram

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [RFC v4 03/25] m68k/atari: Move Atari-specific code out of drivers/char/nvram.c
  2015-07-24 19:07               ` Christian T. Steigies
@ 2015-07-25  0:35                 ` Finn Thain
  2015-07-25  1:00                   ` Michael Ellerman
  2015-07-25  0:51                 ` Michael Schmitz
  1 sibling, 1 reply; 55+ messages in thread
From: Finn Thain @ 2015-07-25  0:35 UTC (permalink / raw)
  To: Christian T. Steigies
  Cc: Michael Schmitz, Andreas Schwab, Linux Kernel Development,
	Linux/m68k, linuxppc-dev, Geert Uytterhoeven, Arnd Bergmann,
	Greg Kroah-Hartman


On Fri, 24 Jul 2015, Christian T. Steigies wrote:

> Moin,
> On Fri, Jul 24, 2015 at 02:56:26PM +1200, Michael Schmitz wrote:
> > 
> > here's what Finn asked me to run as tests:
> > 
> > # dmesg | grep this_id > nvram.out
> > # cat /proc/driver/nvram >> nvram.out
> > # hexdump -C /dev/nvram >> nvram.out
> > # cp /dev/nvram /tmp/nvram
> > # cp /tmp/nvram /dev/nvram
> > # md5sum /dev/nvram /tmp/nvram >> nvram.out
> 
> It seems I could successfully reset the nvram under TOS with bootconf.
> Here is nvram.out, using the new kernel you sent me:
> 
> root@garkin:~>uname -a
> Linux garkin 4.2.0-rc2-atari-269994-gc1e9d12 #327 Fri Jul 24 19:34:44 NZST 2015 m68k GNU/Linux
> 
> PS it seems LVM is working with this kernel as well!
> 
> Christian
> 
> 
> [    7.000000] scsi host0: Atari native SCSI, io_port 0x0, n_io_port 0, base 0x0, irq 15, can_queue 8, cmd_per_lun 1, sg_tablesize 0, this_id 7, flags { }, options { REAL_DMA SUPPORT_TAGS } 
> Checksum status  : valid
> Boot preference  : unspecified
> SCSI arbitration : on
> SCSI host ID     : 7
> OS language      : English (US)
> Keyboard language: English (UK)
> Date format      : YY?DD?MM, 24h clock
> Boot delay       : 10s
> Video mode       : ?? colors, 80 columns, VGA PAL monitor
>                    overscan, compat. mode off, line doubling
> 00000000  00 00 ff ff ff ff 00 03  13 ff 0a ff ff ff 01 7f  |................|
> 00000010  87 ff 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
> 00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
> 00000030  e1 1e                                             |..|
> 00000032
> 3b5801864975cf23bcacb52f648e74cc  /dev/nvram
> 3b5801864975cf23bcacb52f648e74cc  /tmp/nvram


Thanks for helping with this, Christian. I'll add your name in "Tested-by" 
tags on the relevant patches. These are rudimentary tests but combined 
with my own testing on m68k, ppc32 and x86, coverage is quite good. Some 
testing on ppc64 is still lacking though.

-- 

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [RFC v4 03/25] m68k/atari: Move Atari-specific code out of drivers/char/nvram.c
  2015-07-24 19:07               ` Christian T. Steigies
  2015-07-25  0:35                 ` Finn Thain
@ 2015-07-25  0:51                 ` Michael Schmitz
  2015-07-25  7:27                   ` Finn Thain
  1 sibling, 1 reply; 55+ messages in thread
From: Michael Schmitz @ 2015-07-25  0:51 UTC (permalink / raw)
  To: Finn Thain, Linux Kernel Development, Linux/m68k, linuxppc-dev,
	Geert Uytterhoeven, Arnd Bergmann, Greg Kroah-Hartman

Hi Christian,

good to know this worked - for the record (Finn), this is the kernel 
with Finn's patch applied.

I'll build the missing LVM module so Christian can run the tests on the 
unpatched kernel as well.

Thanks for testing!

     Michael


Am 25.07.15 um 07:07 schrieb Christian T. Steigies:
> Moin,
> On Fri, Jul 24, 2015 at 02:56:26PM +1200, Michael Schmitz wrote:
>> here's what Finn asked me to run as tests:
>>
>> # dmesg | grep this_id > nvram.out
>> # cat /proc/driver/nvram >> nvram.out
>> # hexdump -C /dev/nvram >> nvram.out
>> # cp /dev/nvram /tmp/nvram
>> # cp /tmp/nvram /dev/nvram
>> # md5sum /dev/nvram /tmp/nvram >> nvram.out
> It seems I could successfully reset the nvram under TOS with bootconf.
> Here is nvram.out, using the new kernel you sent me:
>
> root@garkin:~>uname -a
> Linux garkin 4.2.0-rc2-atari-269994-gc1e9d12 #327 Fri Jul 24 19:34:44 NZST 2015 m68k GNU/Linux
>
> PS it seems LVM is working with this kernel as well!
>
> Christian
>
>
> [    7.000000] scsi host0: Atari native SCSI, io_port 0x0, n_io_port 0, base 0x0, irq 15, can_queue 8, cmd_per_lun 1, sg_tablesize 0, this_id 7, flags { }, options { REAL_DMA SUPPORT_TAGS }
> Checksum status  : valid
> Boot preference  : unspecified
> SCSI arbitration : on
> SCSI host ID     : 7
> OS language      : English (US)
> Keyboard language: English (UK)
> Date format      : YYÿDDÿMM, 24h clock
> Boot delay       : 10s
> Video mode       : ?? colors, 80 columns, VGA PAL monitor
>                     overscan, compat. mode off, line doubling
> 00000000  00 00 ff ff ff ff 00 03  13 ff 0a ff ff ff 01 7f  |................|
> 00000010  87 ff 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
> 00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
> 00000030  e1 1e                                             |..|
> 00000032
> 3b5801864975cf23bcacb52f648e74cc  /dev/nvram
> 3b5801864975cf23bcacb52f648e74cc  /tmp/nvram


^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [RFC v4 03/25] m68k/atari: Move Atari-specific code out of drivers/char/nvram.c
  2015-07-25  0:35                 ` Finn Thain
@ 2015-07-25  1:00                   ` Michael Ellerman
  2015-07-25  7:38                     ` Finn Thain
  2015-07-26  1:37                     ` Finn Thain
  0 siblings, 2 replies; 55+ messages in thread
From: Michael Ellerman @ 2015-07-25  1:00 UTC (permalink / raw)
  To: Finn Thain
  Cc: Christian T. Steigies, Michael Schmitz, Linux/m68k,
	Arnd Bergmann, Greg Kroah-Hartman, Linux Kernel Development,
	Andreas Schwab, Geert Uytterhoeven, linuxppc-dev

On Sat, 2015-07-25 at 10:35 +1000, Finn Thain wrote:
> On Fri, 24 Jul 2015, Christian T. Steigies wrote:
> > 3b5801864975cf23bcacb52f648e74cc  /dev/nvram
> > 3b5801864975cf23bcacb52f648e74cc  /tmp/nvram
> 
> Thanks for helping with this, Christian. I'll add your name in "Tested-by" 
> tags on the relevant patches. These are rudimentary tests but combined 
> with my own testing on m68k, ppc32 and x86, coverage is quite good. Some 
> testing on ppc64 is still lacking though.

*Blush*

I'll try and get to it next week promise!

cheers



^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [RFC v4 03/25] m68k/atari: Move Atari-specific code out of drivers/char/nvram.c
  2015-07-25  0:51                 ` Michael Schmitz
@ 2015-07-25  7:27                   ` Finn Thain
  2015-07-26  1:02                     ` Michael Schmitz
  0 siblings, 1 reply; 55+ messages in thread
From: Finn Thain @ 2015-07-25  7:27 UTC (permalink / raw)
  To: Michael Schmitz
  Cc: Linux Kernel Development, Linux/m68k, linuxppc-dev,
	Geert Uytterhoeven, Arnd Bergmann, Greg Kroah-Hartman


On Sat, 25 Jul 2015, Michael Schmitz wrote:

> Hi Christian,
> 
> good to know this worked - for the record (Finn), this is the kernel 
> with Finn's patch applied.

That was v5 of this patch series. I will send that out to the lists now. 
It has some minor changes that relate to powerpc.

Thanks for your help with this, Michael.

Finn

> 
> I'll build the missing LVM module so Christian can run the tests on the 
> unpatched kernel as well.
> 
> Thanks for testing!
> 
>     Michael
> 
> 

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [RFC v4 03/25] m68k/atari: Move Atari-specific code out of drivers/char/nvram.c
  2015-07-25  1:00                   ` Michael Ellerman
@ 2015-07-25  7:38                     ` Finn Thain
  2015-07-26  1:37                     ` Finn Thain
  1 sibling, 0 replies; 55+ messages in thread
From: Finn Thain @ 2015-07-25  7:38 UTC (permalink / raw)
  To: Michael Ellerman
  Cc: Christian T. Steigies, Michael Schmitz, Linux/m68k,
	Arnd Bergmann, Greg Kroah-Hartman, Linux Kernel Development,
	Andreas Schwab, Geert Uytterhoeven, linuxppc-dev


On Sat, 25 Jul 2015, Michael Ellerman wrote:

> On Sat, 2015-07-25 at 10:35 +1000, Finn Thain wrote:
> > 
> > Thanks for helping with this, Christian. I'll add your name in 
> > "Tested-by" tags on the relevant patches. These are rudimentary tests 
> > but combined with my own testing on m68k, ppc32 and x86, coverage is 
> > quite good. Some testing on ppc64 is still lacking though.
> 
> *Blush*
> 
> I'll try and get to it next week promise!

That would be a great help. Unfortunately I don't have any ppc64 hardware. 
I wish ;-)

-- 

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [RFC v4 03/25] m68k/atari: Move Atari-specific code out of drivers/char/nvram.c
  2015-07-25  7:27                   ` Finn Thain
@ 2015-07-26  1:02                     ` Michael Schmitz
  2015-07-26  1:19                       ` Finn Thain
  0 siblings, 1 reply; 55+ messages in thread
From: Michael Schmitz @ 2015-07-26  1:02 UTC (permalink / raw)
  To: Finn Thain
  Cc: Linux Kernel Development, Linux/m68k, linuxppc-dev,
	Geert Uytterhoeven, Arnd Bergmann, Greg Kroah-Hartman

Hi Finn,

For the sake of completeness: further testing on ARAnyM shows no 
difference between original and patched kernel in the NVRAM proc and 
diff outputs:

scsi host0: Atari native SCSI, io_port 0x0, n_io_port 0, base 0x0, irq 
15, can_queue 8, cmd_per_lun 1, sg_tablesize 0, this_id 7, flags { }, 
options { REAL_DMA SUPPORT_TAGS }
Checksum status  : valid
Boot preference  : unspecified
SCSI arbitration : on
SCSI host ID     : 7
OS language      : English (US)
Keyboard language: English (US)
Date format      : DD.MM.YY, 24h clock
Boot delay       : 32s
Video mode       : 4 colors, 40 columns, TV NTSC monitor
                    no overscan, compat. mode off
00000000  00 00 00 00 00 00 00 00  11 2e 20 01 ff 00 00 3b |.......... 
....;|
00000010  87 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 
|................|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 
|................|
00000030  de 21                                             |.!|
00000032
d640bf7d535b54e39582fabdc016d7ca  /dev/nvram
d640bf7d535b54e39582fabdc016d7ca  /tmp/nvram

Happy to help ...

Cheers,

     Michael

> On Sat, 25 Jul 2015, Michael Schmitz wrote:
>
>> Hi Christian,
>>
>> good to know this worked - for the record (Finn), this is the kernel
>> with Finn's patch applied.
> That was v5 of this patch series. I will send that out to the lists now.
> It has some minor changes that relate to powerpc.
>
> Thanks for your help with this, Michael.
>
> Finn
>
>> I'll build the missing LVM module so Christian can run the tests on the
>> unpatched kernel as well.
>>
>> Thanks for testing!
>>
>>      Michael
>>
>>


^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [RFC v4 03/25] m68k/atari: Move Atari-specific code out of drivers/char/nvram.c
  2015-07-26  1:02                     ` Michael Schmitz
@ 2015-07-26  1:19                       ` Finn Thain
  2015-07-27  2:23                         ` Michael Schmitz
  0 siblings, 1 reply; 55+ messages in thread
From: Finn Thain @ 2015-07-26  1:19 UTC (permalink / raw)
  To: Michael Schmitz
  Cc: Linux Kernel Development, Linux/m68k, linuxppc-dev,
	Geert Uytterhoeven, Arnd Bergmann, Greg Kroah-Hartman


On Sun, 26 Jul 2015, Michael Schmitz wrote:

> Hi Finn,
> 
> For the sake of completeness: further testing on ARAnyM shows no difference
> between original and patched kernel in the NVRAM proc and diff outputs:
> 
> scsi host0: Atari native SCSI, io_port 0x0, n_io_port 0, base 0x0, irq 15,
> can_queue 8, cmd_per_lun 1, sg_tablesize 0, this_id 7, flags { }, options {
> REAL_DMA SUPPORT_TAGS }
> Checksum status  : valid
> Boot preference  : unspecified
> SCSI arbitration : on
> SCSI host ID     : 7
> OS language      : English (US)
> Keyboard language: English (US)
> Date format      : DD.MM.YY, 24h clock
> Boot delay       : 32s
> Video mode       : 4 colors, 40 columns, TV NTSC monitor
>                    no overscan, compat. mode off
> 00000000  00 00 00 00 00 00 00 00  11 2e 20 01 ff 00 00 3b |.......... ....;|
> 00000010  87 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |................|
> 00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |................|
> 00000030  de 21                                            |.!|
> 00000032

I'd expect to see a change in the Video mode above, because of patch 2.

With 0x3B in byte 15, I'd expect the patched kernel to produce something 
similar to Christian's /proc/driver/nvram results.

-- 

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [RFC v4 03/25] m68k/atari: Move Atari-specific code out of drivers/char/nvram.c
  2015-07-25  1:00                   ` Michael Ellerman
  2015-07-25  7:38                     ` Finn Thain
@ 2015-07-26  1:37                     ` Finn Thain
  1 sibling, 0 replies; 55+ messages in thread
From: Finn Thain @ 2015-07-26  1:37 UTC (permalink / raw)
  To: Michael Ellerman
  Cc: Christian T. Steigies, Michael Schmitz, Linux/m68k,
	Arnd Bergmann, Greg Kroah-Hartman, Linux Kernel Development,
	Andreas Schwab, Geert Uytterhoeven, linuxppc-dev


On Sat, 25 Jul 2015, Michael Ellerman wrote:

> On Sat, 2015-07-25 at 10:35 +1000, Finn Thain wrote:
> > 
> > ... These are rudimentary tests but combined with my own testing on 
> > m68k, ppc32 and x86, coverage is quite good. Some testing on ppc64 is 
> > still lacking though.

Here's some code I wrote some time ago to help me test these patches, 
maybe it will help others (though independent results may be more 
valuable...)


-- -- 8< -- -- 


#!/bin/sh
set -e -u -x
temp=`mktemp /root/nvram.XXXX`
test -f "$temp"
cat /proc/version
if ! test -e /dev/nvram ; then
    mknod /dev/nvram c 10 144
fi
ls -l /dev/nvram
if test -c /dev/nvram ; then
    cp /dev/nvram "$temp"
    hexdump -C "$temp"
    cp /dev/zero /dev/nvram || true
    hexdump -C /dev/nvram
    cp "$temp" /dev/nvram
    hexdump -C /dev/nvram
fi


-- -- 8< -- -- 


#include <stdio.h>
#include <sys/ioctl.h>
#include <errno.h>

#if defined(__powerpc__)
#include <asm/nvram.h>
#elif defined(__i386__) || defined(__mc68020__)
#include <linux/nvram.h>
#endif

int main(void) {
        int result, i;
        FILE *f;

        f = fopen("/dev/nvram", "r+");
        if (!f) {
                perror("fopen");
                return 1;
        }

#if defined(__powerpc__)
        result = ioctl(fileno(f), IOC_NVRAM_SYNC);
	fprintf(stderr, "ioctl IOC_NVRAM_SYNC: result %d, errno %m\n", result);

        for (i = 0; i <= 8; ++i) {
                int arg = i;

                result = ioctl(fileno(f), IOC_NVRAM_GET_OFFSET, (long)&arg);
		fprintf(stderr, "ioctl IOC_NVRAM_GET_OFFSET: i %d, result %d, offset %d, errno %m\n", i, result, arg);
        }
#elif defined(__i386__) || defined(__mc68020__)
        result = ioctl(fileno(f), NVRAM_INIT);
	fprintf(stderr, "ioctl NVRAM_INIT: result %d, errno %m\n", result);

        result = ioctl(fileno(f), NVRAM_SETCKS);
	fprintf(stderr, "ioctl NVRAM_SETCKS: result %d, errno %m\n", result);
#endif

        return 0;
}


-- 

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [RFC v4 03/25] m68k/atari: Move Atari-specific code out of drivers/char/nvram.c
  2015-07-26  1:19                       ` Finn Thain
@ 2015-07-27  2:23                         ` Michael Schmitz
  2015-07-27  5:51                           ` Finn Thain
  0 siblings, 1 reply; 55+ messages in thread
From: Michael Schmitz @ 2015-07-27  2:23 UTC (permalink / raw)
  To: Finn Thain
  Cc: Linux Kernel Development, Linux/m68k, linuxppc-dev,
	Geert Uytterhoeven, Arnd Bergmann, Greg Kroah-Hartman

Finn,

my bad - there is indeed a change in the /proc/driver/nvram output:

--- nvram-4.out    2015-07-24 12:32:44.000000000 +1200
+++ nvram-4p2.out    2015-07-27 13:56:06.000000000 +1200
@@ -7,7 +7,7 @@
 Keyboard language: English (US)
 Date format      : DD.MM.YY, 24h clock
 Boot delay       : 32s
-Video mode       : 4 colors, 40 columns, TV NTSC monitor
+Video mode       : 256 colors, 80 columns, VGA PAL monitor
                    no overscan, compat. mode off
 00000000  00 00 00 00 00 00 00 00  11 2e 20 01 ff 00 00 3b  |.......... ....;|
 00000010  84 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|


That video mode is indeed the one set in the NVRAM (by ARAnyM config,
if running emulated)

Cheers,

  Michael


On Sun, Jul 26, 2015 at 1:19 PM, Finn Thain <fthain@telegraphics.com.au> wrote:
>
> On Sun, 26 Jul 2015, Michael Schmitz wrote:
>
>> Hi Finn,
>>
>> For the sake of completeness: further testing on ARAnyM shows no difference
>> between original and patched kernel in the NVRAM proc and diff outputs:
>>
>> scsi host0: Atari native SCSI, io_port 0x0, n_io_port 0, base 0x0, irq 15,
>> can_queue 8, cmd_per_lun 1, sg_tablesize 0, this_id 7, flags { }, options {
>> REAL_DMA SUPPORT_TAGS }
>> Checksum status  : valid
>> Boot preference  : unspecified
>> SCSI arbitration : on
>> SCSI host ID     : 7
>> OS language      : English (US)
>> Keyboard language: English (US)
>> Date format      : DD.MM.YY, 24h clock
>> Boot delay       : 32s
>> Video mode       : 4 colors, 40 columns, TV NTSC monitor
>>                    no overscan, compat. mode off
>> 00000000  00 00 00 00 00 00 00 00  11 2e 20 01 ff 00 00 3b |.......... ....;|
>> 00000010  87 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |................|
>> 00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |................|
>> 00000030  de 21                                            |.!|
>> 00000032
>
> I'd expect to see a change in the Video mode above, because of patch 2.
>
> With 0x3B in byte 15, I'd expect the patched kernel to produce something
> similar to Christian's /proc/driver/nvram results.
>
> --

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [RFC v4 03/25] m68k/atari: Move Atari-specific code out of drivers/char/nvram.c
  2015-07-27  2:23                         ` Michael Schmitz
@ 2015-07-27  5:51                           ` Finn Thain
  0 siblings, 0 replies; 55+ messages in thread
From: Finn Thain @ 2015-07-27  5:51 UTC (permalink / raw)
  To: Michael Schmitz
  Cc: Linux Kernel Development, Linux/m68k, linuxppc-dev,
	Geert Uytterhoeven, Arnd Bergmann, Greg Kroah-Hartman


On Mon, 27 Jul 2015, Michael Schmitz wrote:

> Finn,
> 
> my bad - there is indeed a change in the /proc/driver/nvram output:
> 
> --- nvram-4.out    2015-07-24 12:32:44.000000000 +1200
> +++ nvram-4p2.out    2015-07-27 13:56:06.000000000 +1200
> @@ -7,7 +7,7 @@
>  Keyboard language: English (US)
>  Date format      : DD.MM.YY, 24h clock
>  Boot delay       : 32s
> -Video mode       : 4 colors, 40 columns, TV NTSC monitor
> +Video mode       : 256 colors, 80 columns, VGA PAL monitor
>                     no overscan, compat. mode off
>  00000000  00 00 00 00 00 00 00 00  11 2e 20 01 ff 00 00 3b  |.......... ....;|
>  00000010  84 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
> 
> 
> That video mode is indeed the one set in the NVRAM (by ARAnyM config,
> if running emulated)

All's well then.

Thanks.

Finn

> 
> Cheers,
> 
>   Michael
> 

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [RFC v4 17/25] powerpc, fbdev: Use arch_nvram_ops methods instead of nvram_read_byte() and nvram_write_byte()
  2015-07-16  6:01         ` Finn Thain
@ 2015-09-18  8:17           ` Finn Thain
  0 siblings, 0 replies; 55+ messages in thread
From: Finn Thain @ 2015-09-18  8:17 UTC (permalink / raw)
  To: Benjamin Herrenschmidt
  Cc: linux-kernel, linux-m68k, linuxppc-dev, Paul Mackerras,
	Michael Ellerman, Arnd Bergmann, Greg Kroah-Hartman,
	Jean-Christophe Plagniol-Villard, Tomi Valkeinen, linux-fbdev


Hi Ben,

On Thu, 16 Jul 2015, I wrote:

> On Wed, 15 Jul 2015, I wrote:
> 
> > On Tue, 14 Jul 2015, Benjamin Herrenschmidt wrote:
> > 
> > > Maybe we should have a dedicated accessor for "mac_xpram" ...
> > 
> ...
> 
> The arch_nvram_ops methods don't deal with structures like partitions ...

Instead of the accessor you suggested, perhaps it would be better to add a 
method like arch_nvram_ops.get_partition, to replace the 
pmac_get_partition() exported function?

The call sites for pmac_get_partition() are in the implementation of the 
IOC_NVRAM_GET_OFFSET ioctl that's used with /dev/nvram, and in 
pmac_xpram_read(). pmac_xpram_write() has no caller and could be removed.

But this doesn't have much to do with linux-fbdev. I think the old 
NV_CMODE/NV_VMODE issues*, which this patch avoids, are irrelevant to the 
problem of nvram module re-use, which is the aim of this patch series.

But if those issues really are relevant then we should move the discussion 
to the revised patch, that is, [RFC v6 16/25] powerpc, fbdev: Use NV_CMODE 
and NV_VMODE only when CONFIG_PPC32 and CONFIG_PPC_PMAC and CONFIG_NVRAM.

(There was no response to any patch in RFC v6 from any PowerPC 
maintainers, which is why I've revived this thread.)

* https://lists.ozlabs.org/pipermail/linuxppc-dev/2001-November/012662.html

-- 

^ permalink raw reply	[flat|nested] 55+ messages in thread

end of thread, other threads:[~2015-09-18  8:18 UTC | newest]

Thread overview: 55+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-07-12 10:25 [RFC v4 00/25] Re-use nvram module Finn Thain
2015-07-12 10:25 ` [RFC v4 01/25] scsi/atari_scsi: Dont select CONFIG_NVRAM Finn Thain
2015-07-12 10:25 ` [RFC v4 02/25] char/nvram: Use bitwise OR to obtain Atari video mode data Finn Thain
2015-07-12 10:25 ` [RFC v4 03/25] m68k/atari: Move Atari-specific code out of drivers/char/nvram.c Finn Thain
2015-07-13 18:13   ` Andreas Schwab
2015-07-14  8:17     ` Finn Thain
2015-07-14  8:23       ` Geert Uytterhoeven
2015-07-14  8:33         ` Andreas Schwab
2015-07-22  3:52       ` Michael Schmitz
2015-07-22  4:22         ` Finn Thain
2015-07-22 14:32           ` Christian T. Steigies
2015-07-22 23:46             ` Michael Schmitz
2015-07-23  0:49               ` Finn Thain
2015-07-23  9:21           ` Christian T. Steigies
2015-07-24  2:56             ` Michael Schmitz
2015-07-24 19:07               ` Christian T. Steigies
2015-07-25  0:35                 ` Finn Thain
2015-07-25  1:00                   ` Michael Ellerman
2015-07-25  7:38                     ` Finn Thain
2015-07-26  1:37                     ` Finn Thain
2015-07-25  0:51                 ` Michael Schmitz
2015-07-25  7:27                   ` Finn Thain
2015-07-26  1:02                     ` Michael Schmitz
2015-07-26  1:19                       ` Finn Thain
2015-07-27  2:23                         ` Michael Schmitz
2015-07-27  5:51                           ` Finn Thain
2015-07-12 10:25 ` [RFC v4 04/25] m68k/atari: Replace nvram_{read,write}_byte with arch_nvram_ops Finn Thain
2015-07-12 10:25 ` [RFC v4 05/25] char/nvram: Re-order functions to remove forward declarations and #ifdefs Finn Thain
2015-07-12 10:25 ` [RFC v4 06/25] char/nvram: Adopt arch_nvram_ops Finn Thain
2015-07-12 10:25 ` [RFC v4 07/25] x86/thinkpad_acpi: Use arch_nvram_ops methods instead of nvram_read_byte() and nvram_write_byte() Finn Thain
2015-07-12 10:25 ` [RFC v4 08/25] char/nvram: Allow the set_checksum and initialize ioctls to be omitted Finn Thain
2015-07-12 10:25 ` [RFC v4 09/25] char/nvram: Implement NVRAM read/write methods Finn Thain
2015-07-12 10:25 ` [RFC v4 10/25] char/nvram: Use generic fixed_size_llseek() Finn Thain
2015-07-12 10:25 ` [RFC v4 11/25] m68k/atari: Implement arch_nvram_ops methods and enable CONFIG_HAVE_ARCH_NVRAM_OPS Finn Thain
2015-07-12 10:25 ` [RFC v4 12/25] char/nvram: Add "devname:nvram" module alias Finn Thain
2015-07-12 10:25 ` [RFC v4 13/25] powerpc: Cleanup nvram includes Finn Thain
2015-07-12 10:25 ` [RFC v4 14/25] powerpc: Add missing ppc_md.nvram_size for CHRP and PowerMac Finn Thain
2015-07-12 10:25 ` [RFC v4 15/25] powerpc: Implement arch_nvram_ops.get_size() and remove old nvram_* exports Finn Thain
2015-07-12 10:25 ` [RFC v4 16/25] powerpc: Implement nvram sync ioctl Finn Thain
2015-07-12 10:25 ` [RFC v4 17/25] powerpc, fbdev: Use arch_nvram_ops methods instead of nvram_read_byte() and nvram_write_byte() Finn Thain
2015-07-14  7:58   ` Finn Thain
2015-07-14 11:52     ` Benjamin Herrenschmidt
2015-07-15  5:21       ` Finn Thain
2015-07-16  6:01         ` Finn Thain
2015-09-18  8:17           ` Finn Thain
2015-07-12 10:25 ` [RFC v4 18/25] nvram: Drop nvram_* symbol exports and prototypes Finn Thain
2015-07-12 10:25 ` [RFC v4 19/25] powerpc: Remove CONFIG_GENERIC_NVRAM and adopt CONFIG_HAVE_ARCH_NVRAM_OPS Finn Thain
2015-07-12 10:25 ` [RFC v4 20/25] char/generic_nvram: Remove as unused Finn Thain
2015-07-12 10:25 ` [RFC v4 21/25] powerpc: Adopt nvram module for PPC64 Finn Thain
2015-07-12 10:25 ` [RFC v4 22/25] m68k/mac: Adopt naming and calling conventions for PRAM routines Finn Thain
2015-07-12 10:25 ` [RFC v4 23/25] m68k/mac: Use macros for RTC accesses not magic numbers Finn Thain
2015-07-12 10:25 ` [RFC v4 24/25] m68k/mac: Fix PRAM accessors Finn Thain
2015-07-12 10:25 ` [RFC v4 25/25] m68k: Dispatch nvram_ops calls to Atari or Mac functions Finn Thain
2015-07-13  7:55 ` [RFC v4 00/25] Re-use nvram module Geert Uytterhoeven
2015-07-14  7:57   ` Finn Thain

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).