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: [PATCH v7 07/26] char/nvram: Allow the set_checksum and initialize ioctls to be omitted
Date: Sun, 01 Nov 2015 21:42:09 +1100 [thread overview]
Message-ID: <20151101104204.051709378@telegraphics.com.au> (raw)
In-Reply-To: 20151101104202.301856132@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-11-01 21:41:30.000000000 +1100
+++ linux/drivers/char/nvram.c 2015-11-01 21:41:32.000000000 +1100
@@ -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-11-01 21:41:30.000000000 +1100
+++ linux/include/linux/nvram.h 2015-11-01 21:41:32.000000000 +1100
@@ -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;
next prev parent reply other threads:[~2015-11-01 10:52 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-11-01 10:42 [PATCH v7 00/26] Re-use nvram module Finn Thain
2015-11-01 10:42 ` [PATCH v7 01/26] scsi/atari_scsi: Dont select CONFIG_NVRAM Finn Thain
2015-11-01 10:42 ` [PATCH v7 02/26] m68k/atari: Move Atari-specific code out of drivers/char/nvram.c Finn Thain
2015-11-01 10:42 ` [PATCH v7 03/26] m68k/atari: Replace nvram_{read,write}_byte with arch_nvram_ops Finn Thain
2015-11-01 10:42 ` [PATCH v7 04/26] char/nvram: Re-order functions to remove forward declarations and #ifdefs Finn Thain
2015-11-01 10:42 ` [PATCH v7 05/26] char/nvram: Adopt arch_nvram_ops Finn Thain
2015-11-01 10:42 ` [PATCH v7 06/26] x86/thinkpad_acpi: Use arch_nvram_ops methods instead of nvram_read_byte() and nvram_write_byte() Finn Thain
2015-11-01 10:42 ` Finn Thain [this message]
2015-11-01 10:42 ` [PATCH v7 08/26] char/nvram: Implement NVRAM read/write methods Finn Thain
2015-11-01 10:42 ` [PATCH v7 09/26] char/nvram: Use generic fixed_size_llseek() Finn Thain
2015-11-01 10:42 ` [PATCH v7 10/26] m68k/atari: Implement arch_nvram_ops methods and enable CONFIG_HAVE_ARCH_NVRAM_OPS Finn Thain
2015-11-01 10:42 ` [PATCH v7 11/26] char/nvram: Add "devname:nvram" module alias Finn Thain
2015-11-01 10:42 ` [PATCH v7 12/26] powerpc: Cleanup nvram includes Finn Thain
2015-11-01 10:42 ` [PATCH v7 13/26] powerpc: Add missing ppc_md.nvram_size for CHRP and PowerMac Finn Thain
2015-11-01 10:42 ` [PATCH v7 14/26] powerpc: Implement arch_nvram_ops.get_size() and remove old nvram_* exports Finn Thain
2015-11-01 10:42 ` [PATCH v7 15/26] powerpc: Implement nvram sync ioctl Finn Thain
2015-11-01 10:42 ` [PATCH v7 16/26] powerpc, fbdev: Use NV_CMODE and NV_VMODE only when CONFIG_PPC32 and CONFIG_PPC_PMAC and CONFIG_NVRAM Finn Thain
2015-11-01 10:42 ` [PATCH v7 17/26] powerpc, fbdev: Use arch_nvram_ops methods instead of nvram_read_byte() and nvram_write_byte() Finn Thain
2015-11-01 10:42 ` [PATCH v7 18/26] nvram: Drop nvram_* symbol exports and prototypes Finn Thain
2015-11-01 10:42 ` [PATCH v7 19/26] powerpc: Remove CONFIG_GENERIC_NVRAM and adopt CONFIG_HAVE_ARCH_NVRAM_OPS Finn Thain
2015-11-01 10:42 ` [PATCH v7 20/26] char/generic_nvram: Remove as unused Finn Thain
2015-11-01 10:42 ` [PATCH v7 21/26] powerpc: Adopt nvram module for PPC64 Finn Thain
2015-11-01 10:42 ` [PATCH v7 22/26] powerpc: Remove pmac_xpram_{read,write} functions Finn Thain
2015-11-01 10:42 ` [PATCH v7 23/26] m68k/mac: Adopt naming and calling conventions for PRAM routines Finn Thain
2015-11-01 10:42 ` [PATCH v7 24/26] m68k/mac: Use macros for RTC accesses not magic numbers Finn Thain
2015-11-01 10:42 ` [PATCH v7 25/26] m68k/mac: Fix PRAM accessors Finn Thain
2015-11-01 10:42 ` [PATCH v7 26/26] 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=20151101104204.051709378@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).