source: mainline/arch/mips32/src/drivers/arc.c@ 7dd2561

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 7dd2561 was fbe058f, checked in by Ondrej Palkovsky <ondrap@…>, 20 years ago

Cleanup of unnecessary things.

  • Property mode set to 100644
File size: 6.7 KB
RevLine 
[3156582]1/*
2 * Copyright (C) 2005 Ondrej Palkovsky
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include <arch/drivers/arc.h>
30#include <arch/mm/page.h>
31#include <print.h>
32#include <arch.h>
33#include <arch/byteorder.h>
[939dfd7]34#include <arch/mm/frame.h>
35#include <mm/frame.h>
[973be64e]36#include <interrupt.h>
[c0b7f00]37#include <align.h>
[af9a7c5]38#include <console/console.h>
[3156582]39
40/* This is a good joke, SGI HAS different types than NT bioses... */
41/* Here is the SGI type */
42static char *basetypes[] = {
43 "ExceptionBlock",
44 "SystemParameterBlock",
45 "FreeContiguous",
46 "FreeMemory",
47 "BadMemory",
48 "LoadedProgram",
49 "FirmwareTemporary",
50 "FirmwarePermanent"
51};
52
[c7a7656]53static char *ctypes[] = {
54 "ARC_type",
55 "CPU_type",
56 "FPU_type",
57 "PrimaryICache",
58 "PrimaryDCache",
59 "SecondaryICache",
60 "SecondaryDCache",
61 "SecondaryCache",
62 "Memory",
63 "EISAAdapter",
64 "TCAdapter",
65 "SCSIAdapter",
66 "DTIAdapter",
67 "MultiFunctionAdapter",
68 "DiskController",
69 "TapeController",
70 "CDROMController",
71 "WORMController",
72 "SerialController",
73 "NetworkController",
74 "DisplayController",
75 "ParallelController",
76 "PointerController",
77 "KeyboardController",
78 "AudioController",
79 "OtherController",
80 "DiskPeripheral",
81 "FloppyDiskPeripheral",
82 "TapePeripheral",
83 "ModemPeripheral",
84 "MonitorPeripheral",
85 "PrinterPeripheral",
86 "PointerPeripheral",
87 "KeyboardPeripheral",
88 "TerminalPeripheral",
89 "OtherPeripheral",
90 "LinePeripheral",
91 "NetworkPeripheral"
92 "OtherPeripheral",
93 "XTalkAdapter",
94 "PCIAdapter",
95 "GIOAdapter",
96 "TPUAdapter",
97 "Anonymous"
98};
99
[3156582]100static arc_sbp *sbp = (arc_sbp *)PA2KA(0x1000);
101static arc_func_vector_t *arc_entry;
102
103
[973be64e]104static void arc_putchar(char ch);
[3156582]105
106/** Return true if ARC is available */
107int arc_enabled(void)
108{
109 return sbp != NULL;
110}
111
[c7a7656]112static void arc_print_component(arc_component *c)
113{
114 int i;
115
116 printf("%s: ",ctypes[c->type]);
117 for (i=0;i < c->identifier_len;i++)
[973be64e]118 arc_putchar(c->identifier[i]);
119 arc_putchar('\n');
[c7a7656]120}
121
122void arc_print_devices(void)
123{
124 arc_component *c,*next;
125
126 if (!arc_enabled())
127 return;
128
129 c = arc_entry->getchild(NULL);
130 while (c) {
131 arc_print_component(c);
132 next = arc_entry->getchild(c);
133 while (!next) {
134 next = arc_entry->getpeer(c);
135 if (!next)
136 c = arc_entry->getparent(c);
137 if (!c)
138 return;
139 }
140 c = next;
141 }
142}
143
[3156582]144void arc_print_memory_map(void)
145{
146 arc_memdescriptor_t *desc;
147
[4fade3e]148 if (!arc_enabled())
[3156582]149 return;
150
151 printf("Memory map:\n");
152
153 desc = arc_entry->getmemorydescriptor(NULL);
154 while (desc) {
155 printf("%s: %d (size: %dKB)\n",basetypes[desc->type],
[939dfd7]156 desc->basepage * ARC_FRAME,
157 desc->basecount*ARC_FRAME/1024);
[3156582]158 desc = arc_entry->getmemorydescriptor(desc);
159 }
160}
161
162/** Print charactor to console */
[973be64e]163static void arc_putchar(char ch)
[3156582]164{
165 __u32 cnt;
[22f7769]166 ipl_t ipl;
[3156582]167
168 /* TODO: Should be spinlock? */
[22f7769]169 ipl = interrupts_disable();
[3156582]170 arc_entry->write(1, &ch, 1, &cnt);
[22f7769]171 interrupts_restore(ipl);
[3156582]172
173}
[ac0cb2a]174
[973be64e]175/** Initialize ARC structure
176 *
177 * @return 0 - ARC OK, -1 - ARC does not exist
178 */
179int arc_init(void)
180{
181 if (sbp->signature != ARC_MAGIC) {
182 sbp = NULL;
183 return -1;
184 }
185 arc_entry = sbp->firmwarevector;
186
187 arc_putchar('A');
188 arc_putchar('R');
189 arc_putchar('C');
190 arc_putchar('\n');
191}
192
[6095342]193static bool kbd_polling_enabled;
[973be64e]194static chardev_t console;
195
[ac0cb2a]196/** Try to get character, return character or -1 if not available */
[973be64e]197static void arc_keyboard_poll(void)
[ac0cb2a]198{
199 char ch;
200 __u32 count;
201 long result;
[973be64e]202
203 if (! kbd_polling_enabled)
204 return;
[ac0cb2a]205
206 if (arc_entry->getreadstatus(0))
[973be64e]207 return;
[ac0cb2a]208 result = arc_entry->read(0, &ch, 1, &count);
209 if (result || count!=1) {
[973be64e]210 return;
[ac0cb2a]211 }
212 if (ch == '\r')
[973be64e]213 ch = '\n';
[e8a9dc3]214 if (ch == 0x7f)
215 ch = '\b';
216
[973be64e]217 chardev_push_character(&console, ch);
218}
219
[fbe058f]220static char arc_read(chardev_t *dev)
221{
222 char ch;
223 __u32 count;
224 long result;
225
226 result = arc_entry->read(0, &ch, 1, &count);
227 if (result || count!=1) {
228 printf("Error reading from ARC keyboard.\n");
229 cpu_halt();
230 }
231 if (ch == '\r')
232 return '\n';
233 if (ch == 0x7f)
234 return '\b';
235 return ch;
236}
237
[973be64e]238static void arc_write(chardev_t *dev, const char ch)
239{
240 arc_putchar(ch);
241}
242
243static void arc_enable(chardev_t *dev)
244{
[6095342]245 kbd_polling_enabled = true;
[973be64e]246}
247
248static void arc_disable(chardev_t *dev)
249{
[6095342]250 kbd_polling_enabled = false;
[973be64e]251}
252
253static chardev_operations_t arc_ops = {
254 .resume = arc_enable,
255 .suspend = arc_disable,
[fbe058f]256 .write = arc_write,
257 .read = arc_read
[973be64e]258};
259
260iroutine old_timer;
261/** Do polling on timer interrupt */
262static void timer_replace(int n, void *stack)
263{
264 arc_keyboard_poll();
265 old_timer(n, stack);
266 arc_keyboard_poll();
267}
268
[af9a7c5]269void arc_console(void)
[973be64e]270{
[6095342]271 kbd_polling_enabled = true;
[973be64e]272
273 chardev_initialize("arc_console", &console, &arc_ops);
[7a8c866a]274 old_timer = int_register(TIMER_IRQ, "arc_kb_poll", timer_replace);
[af9a7c5]275 stdin = &console;
276 stdout = &console;
[ac0cb2a]277}
[939dfd7]278
279/* Initialize frame zones from ARC firmware.
280 * In the future we may use even the FirmwareTemporary regions,
281 * currently we use the FreeMemory (what about the LoadedProgram?)
282 */
283void arc_frame_init(void)
284{
285 arc_memdescriptor_t *desc;
286 int total = 0;
[c0b7f00]287 __address base;
288 size_t basesize;
289 unsigned int i,j;
[939dfd7]290
291 desc = arc_entry->getmemorydescriptor(NULL);
292 while (desc) {
293 if (desc->type == FreeMemory ||
294 desc->type == FreeContiguous) {
[c0b7f00]295 base = desc->basepage*ARC_FRAME;
296 basesize = desc->basecount*ARC_FRAME;
297
298 if (base % FRAME_SIZE ) {
299 basesize -= FRAME_SIZE - (base % FRAME_SIZE);
300 base = ALIGN_UP(base, FRAME_SIZE);
301 }
302 basesize = ALIGN_DOWN(basesize, FRAME_SIZE);
303
304 total += basesize;
305 zone_create_in_region(base, basesize);
[939dfd7]306 }
307 desc = arc_entry->getmemorydescriptor(desc);
308 }
309
310 config.memory_size = total;
311}
312
Note: See TracBrowser for help on using the repository browser.