Commit | Line | Data |
---|---|---|
65cd577d PS |
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 | ||
a4df02a2 | 12 | #include <linux/init.h> |
65cd577d PS |
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 | ||
55490050 | 22 | extern long nf_get_id_phys(unsigned long feature_name); |
e8184e10 | 23 | |
65cd577d | 24 | asm("\n" |
55490050 GU |
25 | " .global nf_get_id_phys,nf_call\n" |
26 | "nf_get_id_phys:\n" | |
65cd577d PS |
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" | |
55490050 | 35 | " .long nf_get_id_phys,1b\n" |
65cd577d PS |
36 | " .long nf_call,1b\n" |
37 | " .previous"); | |
65cd577d PS |
38 | EXPORT_SYMBOL_GPL(nf_call); |
39 | ||
e8184e10 GU |
40 | long 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 | ||
55490050 | 50 | return nf_get_id_phys(virt_to_phys(name_copy)); |
e8184e10 GU |
51 | } |
52 | EXPORT_SYMBOL_GPL(nf_get_id); | |
53 | ||
65cd577d PS |
54 | void 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); | |
55490050 | 62 | nf_call(nf_get_id("NF_STDERR"), virt_to_phys(buf)); |
65cd577d PS |
63 | va_end(ap); |
64 | } | |
65 | ||
65cd577d PS |
66 | static void nf_poweroff(void) |
67 | { | |
68 | long id = nf_get_id("NF_SHUTDOWN"); | |
69 | ||
70 | if (id) | |
71 | nf_call(id); | |
72 | } | |
73 | ||
a4df02a2 | 74 | void __init nf_init(void) |
65cd577d PS |
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; | |
55490050 | 87 | nf_call(id, virt_to_phys(buf), 256); |
65cd577d PS |
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 | } |