Thread (36 messages) 36 messages, 4 authors, 2015-06-04

Re: [RFC 24/24] m68k: Dispatch nvram_ops calls to Atari or Mac functions

From: Geert Uytterhoeven <geert@linux-m68k.org>
Date: 2015-06-01 08:31:55
Also in: linux-m68k, lkml

Hi Finn,

On Sun, May 31, 2015 at 3:01 AM, Finn Thain [off-list ref] wrote:
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.
Thanks for your series!
quoted hunk ↗ jump to hunk
Signed-off-by: Finn Thain <redacted>

---
 arch/m68k/Kconfig                 |    2
 arch/m68k/atari/nvram.c           |   22 +++++----
 arch/m68k/include/asm/atarihw.h   |    6 ++
 arch/m68k/include/asm/macintosh.h |    4 +
 arch/m68k/kernel/setup_mm.c       |   89 ++++++++++++++++++++++++++++++++++++++
 arch/m68k/mac/misc.c              |    8 ++-
 6 files changed, 117 insertions(+), 14 deletions(-)

Index: linux/arch/m68k/atari/nvram.c
===================================================================
--- linux.orig/arch/m68k/atari/nvram.c  2015-05-31 11:01:21.000000000 +1000
+++ linux/arch/m68k/atari/nvram.c       2015-05-31 11:01:29.000000000 +1000
@@ -73,7 +73,7 @@ static void __nvram_set_checksum(void)
+#ifndef CONFIG_MAC
 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,
+       .read           = atari_nvram_read,
+       .write          = atari_nvram_write,
+       .get_size       = atari_nvram_get_size,
+       .set_checksum   = atari_nvram_set_checksum,
+       .initialize     = atari_nvram_initialize,
 };
 EXPORT_SYMBOL(arch_nvram_ops);
+#endif
IMHO, the #ifdef is ugly.
quoted hunk ↗ jump to hunk
 #ifdef CONFIG_PROC_FS
 static struct {
Index: linux/arch/m68k/mac/misc.c
===================================================================
--- linux.orig/arch/m68k/mac/misc.c     2015-05-31 11:01:28.000000000 +1000
+++ linux/arch/m68k/mac/misc.c  2015-05-31 11:01:29.000000000 +1000
@@ -489,7 +489,7 @@ void pmu_shutdown(void)
+#ifndef CONFIG_ATARI
 const struct nvram_ops arch_nvram_ops = {
        .read_byte      = mac_pram_read_byte,
        .write_byte     = mac_pram_write_byte,
        .get_size       = mac_pram_get_size,
 };
 EXPORT_SYMBOL(arch_nvram_ops);
+#endif
 #endif /* CONFIG_NVRAM */
Same here.
quoted hunk ↗ jump to hunk
Index: linux/arch/m68k/kernel/setup_mm.c
===================================================================
--- linux.orig/arch/m68k/kernel/setup_mm.c      2015-05-31 11:00:59.000000000 +1000
+++ linux/arch/m68k/kernel/setup_mm.c   2015-05-31 11:01:29.000000000 +1000
quoted hunk ↗ jump to hunk
@@ -568,3 +572,88 @@ static int __init adb_probe_sync_enable

 __setup("adb_sync", adb_probe_sync_enable);
 #endif /* CONFIG_ADB */
+
+#if IS_ENABLED(CONFIG_NVRAM) && defined(CONFIG_ATARI) && defined(CONFIG_MAC)
Likewise.
+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;
Isn't this handled already by the nvram core, based on the available operations
in nvram_ops? Same for the other nvram abstractions in this file.
+const struct nvram_ops arch_nvram_ops = {
+       .read           = m68k_nvram_read,
+       .write          = m68k_nvram_write,
+       .read_byte      = m68k_nvram_read_byte,
+       .write_byte     = m68k_nvram_write_byte,
+       .get_size       = m68k_nvram_get_size,
+       .set_checksum   = m68k_nvram_set_checksum,
+       .initialize     = m68k_nvram_initialize,
+};
+EXPORT_SYMBOL(arch_nvram_ops);
Can't you just fill in the mach specific pointers in the generic structure,
and be done with it?

If you handle this right, I think you can do without the temporary "def_bool
(ATARI && !MAC) || (MAC && !ATARI)" in "[RFC 22/24] m68k/mac: Adopt nvram
module", too.

Thanks!

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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help