Subversion Repositories HelenOS-historic

Rev

Rev 534 | Rev 575 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  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>
  34.  
  35. /* This is a good joke, SGI HAS different types than NT bioses... */
  36. /* Here is the SGI type */
  37. static char *basetypes[] = {
  38.     "ExceptionBlock",
  39.     "SystemParameterBlock",
  40.     "FreeContiguous",
  41.     "FreeMemory",
  42.     "BadMemory",
  43.     "LoadedProgram",
  44.     "FirmwareTemporary",
  45.     "FirmwarePermanent"
  46. };
  47.  
  48. static char *ctypes[] = {
  49.     "ARC_type",
  50.     "CPU_type",
  51.     "FPU_type",
  52.     "PrimaryICache",
  53.     "PrimaryDCache",
  54.     "SecondaryICache",
  55.     "SecondaryDCache",
  56.     "SecondaryCache",
  57.     "Memory",
  58.     "EISAAdapter",
  59.     "TCAdapter",
  60.     "SCSIAdapter",
  61.     "DTIAdapter",
  62.     "MultiFunctionAdapter",
  63.     "DiskController",
  64.     "TapeController",
  65.     "CDROMController",
  66.     "WORMController",
  67.     "SerialController",
  68.     "NetworkController",
  69.     "DisplayController",
  70.     "ParallelController",
  71.     "PointerController",
  72.     "KeyboardController",
  73.     "AudioController",
  74.     "OtherController",
  75.     "DiskPeripheral",
  76.     "FloppyDiskPeripheral",
  77.     "TapePeripheral",
  78.     "ModemPeripheral",
  79.     "MonitorPeripheral",
  80.     "PrinterPeripheral",
  81.     "PointerPeripheral",
  82.     "KeyboardPeripheral",
  83.     "TerminalPeripheral",
  84.     "OtherPeripheral",
  85.     "LinePeripheral",
  86.     "NetworkPeripheral"
  87.     "OtherPeripheral",
  88.     "XTalkAdapter",
  89.     "PCIAdapter",
  90.     "GIOAdapter",
  91.     "TPUAdapter",
  92.     "Anonymous"
  93. };
  94.  
  95. static arc_sbp *sbp = (arc_sbp *)PA2KA(0x1000);
  96. static arc_func_vector_t *arc_entry;
  97.  
  98. static void _arc_putchar(char ch);
  99.  
  100. /** Initialize ARC structure
  101.  *
  102.  * @return 0 - ARC OK, -1 - ARC does not exist
  103.  */
  104. int init_arc(void)
  105. {
  106.     if (sbp->signature != ARC_MAGIC) {
  107.         sbp = NULL;
  108.         return -1;
  109.     }
  110.     arc_entry = sbp->firmwarevector;
  111.  
  112.     arc_putchar('A');
  113.     arc_putchar('R');
  114.     arc_putchar('C');
  115.     arc_putchar('\n');
  116. }
  117.  
  118. /** Return true if ARC is available */
  119. int arc_enabled(void)
  120. {
  121.     return sbp != NULL;
  122. }
  123.  
  124. static void arc_print_component(arc_component *c)
  125. {
  126.     int i;
  127.  
  128.     printf("%s: ",ctypes[c->type]);
  129.     for (i=0;i < c->identifier_len;i++)
  130.         putchar(c->identifier[i]);
  131.     putchar('\n');
  132. }
  133.  
  134. void arc_print_devices(void)
  135. {
  136.     arc_component *c,*next;
  137.  
  138.     if (!arc_enabled())
  139.         return;
  140.  
  141.     c = arc_entry->getchild(NULL);
  142.     while (c) {
  143.         arc_print_component(c);
  144.         next = arc_entry->getchild(c);
  145.         while (!next) {
  146.             next = arc_entry->getpeer(c);
  147.             if (!next)
  148.                 c = arc_entry->getparent(c);
  149.             if (!c)
  150.                 return;
  151.         }
  152.         c = next;
  153.     }
  154. }
  155.  
  156. void arc_print_memory_map(void)
  157. {
  158.     arc_memdescriptor_t *desc;
  159.  
  160.     if (!arc_enabled())
  161.         return;
  162.  
  163.     printf("Memory map:\n");
  164.  
  165.     desc = arc_entry->getmemorydescriptor(NULL);
  166.     while (desc) {
  167.         printf("%s: %d (size: %dKB)\n",basetypes[desc->type],
  168.                desc->basepage * 4096,
  169.                desc->basecount*4);
  170.         desc = arc_entry->getmemorydescriptor(desc);
  171.     }
  172. }
  173.  
  174. /** Print charactor to console */
  175. void arc_putchar(char ch)
  176. {
  177.     __u32 cnt;
  178.     ipl_t ipl;
  179.  
  180.     /* TODO: Should be spinlock? */
  181.     ipl = interrupts_disable();
  182.     arc_entry->write(1, &ch, 1, &cnt);
  183.     interrupts_restore(ipl);
  184.    
  185. }
  186.  
  187. /** Try to get character, return character or -1 if not available */
  188. int arc_getchar(void)
  189. {
  190.     char ch;
  191.     __u32 count;
  192.     long result;
  193.  
  194.     if (arc_entry->getreadstatus(0))
  195.         return -1;
  196.     result = arc_entry->read(0, &ch, 1, &count);
  197.     if (result || count!=1) {
  198.         cpu_halt();
  199.         return -1;
  200.     }
  201.     if (ch == '\r')
  202.         return '\n';
  203.     return ch;
  204. }
  205.