linux-kernel.vger.kernel.org archive mirror
 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 v2 08/24] char/nvram: Allow the set_checksum and initialize ioctls to be omitted
Date: Sun, 14 Jun 2015 17:46:15 +1000	[thread overview]
Message-ID: <20150614074609.304843710@telegraphics.com.au> (raw)
In-Reply-To: 20150614074607.242676098@telegraphics.com.au

[-- 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-06-14 17:45:41.000000000 +1000
+++ linux/drivers/char/nvram.c	2015-06-14 17:45:43.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-06-14 17:45:41.000000000 +1000
+++ linux/include/linux/nvram.h	2015-06-14 17:45:43.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;



  parent reply	other threads:[~2015-06-14 13:09 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-06-14  7:46 [RFC v2 00/24] Re-use nvram module Finn Thain
2015-06-14  7:46 ` [RFC v2 01/24] macintosh/nvram: Remove as unused Finn Thain
2015-06-15  6:41   ` [RFC,v2,01/24] " Michael Ellerman
2015-06-14  7:46 ` [RFC v2 02/24] scsi/atari_scsi: Dont select CONFIG_NVRAM Finn Thain
2015-06-14  7:46 ` [RFC v2 03/24] m68k/atari: Move Atari-specific code out of drivers/char/nvram.c Finn Thain
2015-06-14  7:46 ` [RFC v2 04/24] m68k/atari: Replace nvram_{read,write}_byte with arch_nvram_ops Finn Thain
2015-06-14  7:46 ` [RFC v2 05/24] char/nvram: Re-order functions to remove forward declarations and #ifdefs Finn Thain
2015-06-14  7:46 ` [RFC v2 06/24] char/nvram: Adopt arch_nvram_ops Finn Thain
2015-06-14  7:46 ` [RFC v2 07/24] x86/thinkpad_acpi: Use arch_nvram_ops methods instead of nvram_read_byte() and nvram_write_byte() Finn Thain
2015-06-14  7:46 ` Finn Thain [this message]
2015-06-14  7:46 ` [RFC v2 09/24] char/nvram: Implement NVRAM read/write methods Finn Thain
2015-06-14  7:46 ` [RFC v2 10/24] char/nvram: Use generic fixed_size_llseek() Finn Thain
2015-06-14  7:46 ` [RFC v2 11/24] m68k/atari: Implement arch_nvram_ops methods and enable CONFIG_HAVE_ARCH_NVRAM_OPS Finn Thain
2015-06-14  7:46 ` [RFC v2 12/24] char/nvram: Add "devname:nvram" module alias Finn Thain
2015-06-14  7:46 ` [RFC v2 13/24] powerpc: Cleanup nvram includes Finn Thain
2015-06-14  7:46 ` [RFC v2 14/24] powerpc: Add missing ppc_md.nvram_size for CHRP and PowerMac Finn Thain
2015-06-14  7:46 ` [RFC v2 15/24] powerpc: Implement arch_nvram_ops.get_size() and remove old nvram_* exports Finn Thain
2015-06-14  7:46 ` [RFC v2 16/24] powerpc: Implement nvram sync ioctl Finn Thain
2015-06-14  7:46 ` [RFC v2 17/24] powerpc, fbdev: Use arch_nvram_ops methods instead of nvram_read_byte() and nvram_write_byte() Finn Thain
2015-06-14  7:46 ` [RFC v2 18/24] nvram: Drop nvram_* symbol exports and prototypes Finn Thain
2015-06-14  7:46 ` [RFC v2 19/24] powerpc: Remove CONFIG_GENERIC_NVRAM and adopt CONFIG_HAVE_ARCH_NVRAM_OPS Finn Thain
2015-06-14  7:46 ` [RFC v2 20/24] char/generic_nvram: Remove as unused Finn Thain
2015-06-14  7:46 ` [RFC v2 21/24] powerpc: Adopt nvram module for PPC64 Finn Thain
2015-06-14  7:46 ` [RFC v2 22/24] m68k/mac: Adopt naming and calling conventions for PRAM routines Finn Thain
2015-06-14  7:46 ` [RFC v2 23/24] m68k/mac: Fix PRAM accessors Finn Thain
2015-06-15  8:23   ` Geert Uytterhoeven
2015-06-16  3:10     ` Finn Thain
2015-06-18  4:49       ` Finn Thain
2015-06-18  6:59         ` Geert Uytterhoeven
2015-06-18 16:52       ` Andreas Schwab
2015-06-14  7:46 ` [RFC v2 24/24] m68k: Dispatch nvram_ops calls to Atari or Mac functions 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=20150614074609.304843710@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 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).