| 1 | /*
 | 
|---|
| 2 |  * Copyright (c) 2005 Jakub Jermar
 | 
|---|
| 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 | /** @addtogroup sparc64
 | 
|---|
| 30 |  * @{
 | 
|---|
| 31 |  */
 | 
|---|
| 32 | /** @file
 | 
|---|
| 33 |  */
 | 
|---|
| 34 | 
 | 
|---|
| 35 | #include <arch/console.h>
 | 
|---|
| 36 | #include <arch/types.h>
 | 
|---|
| 37 | 
 | 
|---|
| 38 | #include <arch/drivers/scr.h>
 | 
|---|
| 39 | #include <arch/drivers/kbd.h>
 | 
|---|
| 40 | #include <arch/drivers/sgcn.h>
 | 
|---|
| 41 | #include <genarch/srln/srln.h>
 | 
|---|
| 42 | #include <console/chardev.h>
 | 
|---|
| 43 | #include <console/console.h>
 | 
|---|
| 44 | #include <arch/asm.h>
 | 
|---|
| 45 | #include <arch/register.h>
 | 
|---|
| 46 | #include <proc/thread.h>
 | 
|---|
| 47 | #include <arch/mm/tlb.h>
 | 
|---|
| 48 | #include <genarch/ofw/ofw_tree.h>
 | 
|---|
| 49 | #include <arch.h>
 | 
|---|
| 50 | #include <panic.h>
 | 
|---|
| 51 | #include <string.h>
 | 
|---|
| 52 | #include <print.h>
 | 
|---|
| 53 | 
 | 
|---|
| 54 | #define KEYBOARD_POLL_PAUSE     50000   /* 50ms */
 | 
|---|
| 55 | 
 | 
|---|
| 56 | /**
 | 
|---|
| 57 |  * Initialize kernel console to use framebuffer and keyboard directly.
 | 
|---|
| 58 |  * Called on UltraSPARC machines with standard keyboard and framebuffer.
 | 
|---|
| 59 |  *
 | 
|---|
| 60 |  * @param aliases       the "/aliases" OBP node 
 | 
|---|
| 61 |  */
 | 
|---|
| 62 | static void standard_console_init(ofw_tree_node_t *aliases)
 | 
|---|
| 63 | {
 | 
|---|
| 64 | #ifdef CONFIG_FB
 | 
|---|
| 65 |         ofw_tree_property_t *prop_scr = ofw_tree_getprop(aliases, "screen");
 | 
|---|
| 66 |         if (!prop_scr)
 | 
|---|
| 67 |                 panic("Cannot find property 'screen'.");
 | 
|---|
| 68 |         if (!prop_scr->value)
 | 
|---|
| 69 |                 panic("Cannot find screen alias.");
 | 
|---|
| 70 |         ofw_tree_node_t *screen = ofw_tree_lookup(prop_scr->value);
 | 
|---|
| 71 |         if (!screen)
 | 
|---|
| 72 |                 panic("Cannot find %s.", prop_scr->value);
 | 
|---|
| 73 |         
 | 
|---|
| 74 |         scr_init(screen);
 | 
|---|
| 75 | #endif
 | 
|---|
| 76 | 
 | 
|---|
| 77 | #ifdef CONFIG_SUN_KBD
 | 
|---|
| 78 |         ofw_tree_property_t *prop_kbd = ofw_tree_getprop(aliases, "keyboard");
 | 
|---|
| 79 |         if (!prop_kbd)
 | 
|---|
| 80 |                 panic("Cannot find property 'keyboard'.");
 | 
|---|
| 81 |         if (!prop_kbd->value)
 | 
|---|
| 82 |                 panic("Cannot find keyboard alias.");
 | 
|---|
| 83 |         ofw_tree_node_t *keyboard = ofw_tree_lookup(prop_kbd->value);
 | 
|---|
| 84 |         if (!keyboard)
 | 
|---|
| 85 |                 panic("Cannot find %s.", prop_kbd->value);
 | 
|---|
| 86 |         
 | 
|---|
| 87 |         kbd_init(keyboard);
 | 
|---|
| 88 | #endif
 | 
|---|
| 89 | }
 | 
|---|
| 90 | 
 | 
|---|
| 91 | /** Initilize I/O on the Serengeti machine. */
 | 
|---|
| 92 | static void serengeti_init(void)
 | 
|---|
| 93 | {
 | 
|---|
| 94 | #ifdef CONFIG_SGCN_KBD
 | 
|---|
| 95 |         sgcn_instance_t *sgcn_instance = sgcnin_init();
 | 
|---|
| 96 |         if (sgcn_instance) {
 | 
|---|
| 97 |                 srln_instance_t *srln_instance = srln_init();
 | 
|---|
| 98 |                 if (srln_instance) {
 | 
|---|
| 99 |                         indev_t *sink = stdin_wire();
 | 
|---|
| 100 |                         indev_t *srln = srln_wire(srln_instance, sink);
 | 
|---|
| 101 |                         sgcnin_wire(sgcn_instance, srln);
 | 
|---|
| 102 |                 }
 | 
|---|
| 103 |         }
 | 
|---|
| 104 | #endif
 | 
|---|
| 105 |         
 | 
|---|
| 106 | #ifdef CONFIG_SGCN_PRN
 | 
|---|
| 107 |         outdev_t *sgcndev = sgcnout_init();
 | 
|---|
| 108 |         if (sgcndev)
 | 
|---|
| 109 |                 stdout_wire(sgcndev);
 | 
|---|
| 110 | #endif
 | 
|---|
| 111 | }
 | 
|---|
| 112 | 
 | 
|---|
| 113 | /**
 | 
|---|
| 114 |  * Initialize input/output. Auto-detects the type of machine
 | 
|---|
| 115 |  * and calls the appropriate I/O init routine. 
 | 
|---|
| 116 |  */
 | 
|---|
| 117 | void standalone_sparc64_console_init(void)
 | 
|---|
| 118 | {
 | 
|---|
| 119 |         ofw_tree_node_t *aliases;
 | 
|---|
| 120 |         ofw_tree_property_t *prop;
 | 
|---|
| 121 |         
 | 
|---|
| 122 |         aliases = ofw_tree_lookup("/aliases");
 | 
|---|
| 123 |         if (!aliases)
 | 
|---|
| 124 |                 panic("Cannot find '/aliases'.");
 | 
|---|
| 125 |         
 | 
|---|
| 126 |         /* "def-cn" = "default console" */
 | 
|---|
| 127 |         prop = ofw_tree_getprop(aliases, "def-cn");
 | 
|---|
| 128 |         
 | 
|---|
| 129 |         if ((!prop) || (!prop->value) || (str_cmp(prop->value, "/sgcn") != 0)) {
 | 
|---|
| 130 |                 standard_console_init(aliases);
 | 
|---|
| 131 |         } else {
 | 
|---|
| 132 |                 serengeti_init();
 | 
|---|
| 133 |         }
 | 
|---|
| 134 | }
 | 
|---|
| 135 | 
 | 
|---|
| 136 | /** @}
 | 
|---|
| 137 |  */
 | 
|---|