linux/arch/m68k/emu/natfeat.c
<<
>>
Prefs
   1/*
   2 * natfeat.c - ARAnyM hardware support via Native Features (natfeats)
   3 *
   4 * Copyright (c) 2005 Petr Stehlik of ARAnyM dev team
   5 *
   6 * Reworked for Linux by Roman Zippel <zippel@linux-m68k.org>
   7 *
   8 * This software may be used and distributed according to the terms of
   9 * the GNU General Public License (GPL), incorporated herein by reference.
  10 */
  11
  12#include <linux/init.h>
  13#include <linux/types.h>
  14#include <linux/console.h>
  15#include <linux/string.h>
  16#include <linux/kernel.h>
  17#include <linux/module.h>
  18#include <linux/io.h>
  19#include <asm/machdep.h>
  20#include <asm/natfeat.h>
  21
  22extern long nf_get_id_phys(unsigned long feature_name);
  23
  24asm("\n"
  25"       .global nf_get_id_phys,nf_call\n"
  26"nf_get_id_phys:\n"
  27"       .short  0x7300\n"
  28"       rts\n"
  29"nf_call:\n"
  30"       .short  0x7301\n"
  31"       rts\n"
  32"1:     moveq.l #0,%d0\n"
  33"       rts\n"
  34"       .section __ex_table,\"a\"\n"
  35"       .long   nf_get_id_phys,1b\n"
  36"       .long   nf_call,1b\n"
  37"       .previous");
  38EXPORT_SYMBOL_GPL(nf_call);
  39
  40long nf_get_id(const char *feature_name)
  41{
  42        /* feature_name may be in vmalloc()ed memory, so make a copy */
  43        char name_copy[32];
  44        size_t n;
  45
  46        n = strlcpy(name_copy, feature_name, sizeof(name_copy));
  47        if (n >= sizeof(name_copy))
  48                return 0;
  49
  50        return nf_get_id_phys(virt_to_phys(name_copy));
  51}
  52EXPORT_SYMBOL_GPL(nf_get_id);
  53
  54void nfprint(const char *fmt, ...)
  55{
  56        static char buf[256];
  57        va_list ap;
  58        int n;
  59
  60        va_start(ap, fmt);
  61        n = vsnprintf(buf, 256, fmt, ap);
  62        nf_call(nf_get_id("NF_STDERR"), virt_to_phys(buf));
  63        va_end(ap);
  64}
  65
  66static void nf_poweroff(void)
  67{
  68        long id = nf_get_id("NF_SHUTDOWN");
  69
  70        if (id)
  71                nf_call(id);
  72}
  73
  74void __init nf_init(void)
  75{
  76        unsigned long id, version;
  77        char buf[256];
  78
  79        id = nf_get_id("NF_VERSION");
  80        if (!id)
  81                return;
  82        version = nf_call(id);
  83
  84        id = nf_get_id("NF_NAME");
  85        if (!id)
  86                return;
  87        nf_call(id, virt_to_phys(buf), 256);
  88        buf[255] = 0;
  89
  90        pr_info("NatFeats found (%s, %lu.%lu)\n", buf, version >> 16,
  91                version & 0xffff);
  92
  93        mach_power_off = nf_poweroff;
  94}
  95