All of lore.kernel.org
 help / color / mirror / Atom feed
From: Finn Thain <fthain@telegraphics.com.au>
To: linux-kernel@vger.kernel.org, linux-m68k@vger.kernel.org,
	linuxppc-dev@lists.ozlabs.org, Arnd Bergmann <arnd@arndb.de>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Subject: [RFC v3 05/24] char/nvram: Adopt arch_nvram_ops
Date: Sun, 28 Jun 2015 11:42:04 +1000	[thread overview]
Message-ID: <20150628014200.952604378@telegraphics.com.au> (raw)
In-Reply-To: 20150628014159.732792697@telegraphics.com.au

[-- Attachment #1: nvram-adopt-nvram_ops --]
[-- Type: text/plain, Size: 3990 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, if irrelevant to ARM platforms, 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.

---
 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-06-28 11:41:32.000000000 +1000
+++ linux/drivers/char/nvram.c	2015-06-28 11:41:34.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-06-28 11:41:31.000000000 +1000
+++ linux/include/linux/nvram.h	2015-06-28 11:41:34.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);
 };
 

WARNING: multiple messages have this Message-ID (diff)
From: Finn Thain <fthain@telegraphics.com.au>
To: <linux-kernel@vger.kernel.org>, <linux-m68k@vger.kernel.org>,
	<linuxppc-dev@lists.ozlabs.org>, Arnd Bergmann <arnd@arndb.de>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Subject: [RFC v3 05/24] char/nvram: Adopt arch_nvram_ops
Date: Sun, 28 Jun 2015 11:42:04 +1000	[thread overview]
Message-ID: <20150628014200.952604378@telegraphics.com.au> (raw)
In-Reply-To: 20150628014159.732792697@telegraphics.com.au

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, if irrelevant to ARM platforms, 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.

---
 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-06-28 11:41:32.000000000 +1000
+++ linux/drivers/char/nvram.c	2015-06-28 11:41:34.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-06-28 11:41:31.000000000 +1000
+++ linux/include/linux/nvram.h	2015-06-28 11:41:34.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);
 };
 

WARNING: multiple messages have this Message-ID (diff)
From: Finn Thain <fthain@telegraphics.com.au>
To: <linux-kernel@vger.kernel.org>, <linux-m68k@vger.kernel.org>,
	<linuxppc-dev@lists.ozlabs.org>, Arnd Bergmann <arnd@arndb.de>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Subject: [RFC v3 05/24] char/nvram: Adopt arch_nvram_ops
Date: Sun, 28 Jun 2015 11:42:04 +1000	[thread overview]
Message-ID: <20150628014200.952604378@telegraphics.com.au> (raw)
In-Reply-To: 20150628014159.732792697@telegraphics.com.au

[-- Attachment #1: nvram-adopt-nvram_ops --]
[-- Type: text/plain, Size: 3992 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, if irrelevant to ARM platforms, 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.

---
 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-06-28 11:41:32.000000000 +1000
+++ linux/drivers/char/nvram.c	2015-06-28 11:41:34.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-06-28 11:41:31.000000000 +1000
+++ linux/include/linux/nvram.h	2015-06-28 11:41:34.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);
 };
 



  parent reply	other threads:[~2015-06-28  1:50 UTC|newest]

Thread overview: 80+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-06-28  1:41 [RFC v3 00/24] Re-use nvram module Finn Thain
2015-06-28  1:41 ` Finn Thain
2015-06-28  1:42 ` [RFC v3 01/24] scsi/atari_scsi: Dont select CONFIG_NVRAM Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42 ` [RFC v3 02/24] m68k/atari: Move Atari-specific code out of drivers/char/nvram.c Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-29  7:26   ` Geert Uytterhoeven
2015-07-02  2:00     ` Finn Thain
2015-06-28  1:42 ` [RFC v3 03/24] m68k/atari: Replace nvram_{read, write}_byte with arch_nvram_ops Finn Thain
2015-06-28  1:42   ` [RFC v3 03/24] m68k/atari: Replace nvram_{read,write}_byte " Finn Thain
2015-06-28  1:42   ` [RFC v3 03/24] m68k/atari: Replace nvram_{read, write}_byte " Finn Thain
2015-06-28  1:42 ` [RFC v3 04/24] char/nvram: Re-order functions to remove forward declarations and #ifdefs Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42 ` Finn Thain [this message]
2015-06-28  1:42   ` [RFC v3 05/24] char/nvram: Adopt arch_nvram_ops Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42 ` [RFC v3 06/24] x86/thinkpad_acpi: Use arch_nvram_ops methods instead of nvram_read_byte() and nvram_write_byte() Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42 ` [RFC v3 07/24] char/nvram: Allow the set_checksum and initialize ioctls to be omitted Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42 ` [RFC v3 08/24] char/nvram: Implement NVRAM read/write methods Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42 ` [RFC v3 09/24] char/nvram: Use generic fixed_size_llseek() Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42 ` [RFC v3 10/24] m68k/atari: Implement arch_nvram_ops methods and enable CONFIG_HAVE_ARCH_NVRAM_OPS Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42 ` [RFC v3 11/24] char/nvram: Add "devname:nvram" module alias Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42 ` [RFC v3 12/24] powerpc: Cleanup nvram includes Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42 ` [RFC v3 13/24] powerpc: Add missing ppc_md.nvram_size for CHRP and PowerMac Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42 ` [RFC v3 14/24] powerpc: Implement arch_nvram_ops.get_size() and remove old nvram_* exports Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42 ` [RFC v3 15/24] powerpc: Implement nvram sync ioctl Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42 ` [RFC v3 16/24] powerpc, fbdev: Use arch_nvram_ops methods instead of nvram_read_byte() and nvram_wri Finn Thain
2015-06-28  1:42   ` [RFC v3 16/24] powerpc, fbdev: Use arch_nvram_ops methods instead of nvram_read_byte() and nvram_write_byte() Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42 ` [RFC v3 17/24] nvram: Drop nvram_* symbol exports and prototypes Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42 ` [RFC v3 18/24] powerpc: Remove CONFIG_GENERIC_NVRAM and adopt CONFIG_HAVE_ARCH_NVRAM_OPS Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42 ` [RFC v3 19/24] char/generic_nvram: Remove as unused Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42 ` [RFC v3 20/24] powerpc: Adopt nvram module for PPC64 Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42 ` [RFC v3 21/24] m68k/mac: Adopt naming and calling conventions for PRAM routines Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42 ` [RFC v3 22/24] m68k/mac: Use macros for RTC accesses not magic numbers Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42 ` [RFC v3 23/24] m68k/mac: Fix PRAM accessors Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42 ` [RFC v3 24/24] m68k: Dispatch nvram_ops calls to Atari or Mac functions Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-28  1:42   ` Finn Thain
2015-06-29  7:25   ` Geert Uytterhoeven
2015-07-02  2:07     ` Finn Thain

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150628014200.952604378@telegraphics.com.au \
    --to=fthain@telegraphics.com.au \
    --cc=arnd@arndb.de \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-m68k@vger.kernel.org \
    --cc=linuxppc-dev@lists.ozlabs.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.