Subversion Repositories HelenOS-historic

Rev

Rev 590 | Rev 606 | 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. #include <arch/mm/frame.h>
  35. #include <mm/frame.h>
  36. #include <interrupt.h>
  37. #include <align.h>
  38.  
  39. /* This is a good joke, SGI HAS different types than NT bioses... */
  40. /* Here is the SGI type */
  41. static char *basetypes[] = {
  42.     "ExceptionBlock",
  43.     "SystemParameterBlock",
  44.     "FreeContiguous",
  45.     "FreeMemory",
  46.     "BadMemory",
  47.     "LoadedProgram",
  48.     "FirmwareTemporary",
  49.     "FirmwarePermanent"
  50. };
  51.  
  52. static char *ctypes[] = {
  53.     "ARC_type",
  54.     "CPU_type",
  55.     "FPU_type",
  56.     "PrimaryICache",
  57.     "PrimaryDCache",
  58.     "SecondaryICache",
  59.     "SecondaryDCache",
  60.     "SecondaryCache",
  61.     "Memory",
  62.     "EISAAdapter",
  63.     "TCAdapter",
  64.     "SCSIAdapter",
  65.     "DTIAdapter",
  66.     "MultiFunctionAdapter",
  67.     "DiskController",
  68.     "TapeController",
  69.     "CDROMController",
  70.     "WORMController",
  71.     "SerialController",
  72.     "NetworkController",
  73.     "DisplayController",
  74.     "ParallelController",
  75.     "PointerController",
  76.     "KeyboardController",
  77.     "AudioController",
  78.     "OtherController",
  79.     "DiskPeripheral",
  80.     "FloppyDiskPeripheral",
  81.     "TapePeripheral",
  82.     "ModemPeripheral",
  83.     "MonitorPeripheral",
  84.     "PrinterPeripheral",
  85.     "PointerPeripheral",
  86.     "KeyboardPeripheral",
  87.     "TerminalPeripheral",
  88.     "OtherPeripheral",
  89.     "LinePeripheral",
  90.     "NetworkPeripheral"
  91.     "OtherPeripheral",
  92.     "XTalkAdapter",
  93.     "PCIAdapter",
  94.     "GIOAdapter",
  95.     "TPUAdapter",
  96.     "Anonymous"
  97. };
  98.  
  99. static arc_sbp *sbp = (arc_sbp *)PA2KA(0x1000);
  100. static arc_func_vector_t *arc_entry;
  101.  
  102.  
  103. static void arc_putchar(char ch);
  104.  
  105. /** Return true if ARC is available */
  106. int arc_enabled(void)
  107. {
  108.     return sbp != NULL;
  109. }
  110.  
  111. static void arc_print_component(arc_component *c)
  112. {
  113.     int i;
  114.  
  115.     printf("%s: ",ctypes[c->type]);
  116.     for (i=0;i < c->identifier_len;i++)
  117.         arc_putchar(c->identifier[i]);
  118.     arc_putchar('\n');
  119. }
  120.  
  121. void arc_print_devices(void)
  122. {
  123.     arc_component *c,*next;
  124.  
  125.     if (!arc_enabled())
  126.         return;
  127.  
  128.     c = arc_entry->getchild(NULL);
  129.     while (c) {
  130.         arc_print_component(c);
  131.         next = arc_entry->getchild(c);
  132.         while (!next) {
  133.             next = arc_entry->getpeer(c);
  134.             if (!next)
  135.                 c = arc_entry->getparent(c);
  136.             if (!c)
  137.                 return;
  138.         }
  139.         c = next;
  140.     }
  141. }
  142.  
  143. void arc_print_memory_map(void)
  144. {
  145.     arc_memdescriptor_t *desc;
  146.  
  147.     if (!arc_enabled())
  148.         return;
  149.  
  150.     printf("Memory map:\n");
  151.  
  152.     desc = arc_entry->getmemorydescriptor(NULL);
  153.     while (desc) {
  154.         printf("%s: %d (size: %dKB)\n",basetypes[desc->type],
  155.                desc->basepage * ARC_FRAME,
  156.                desc->basecount*ARC_FRAME/1024);
  157.         desc = arc_entry->getmemorydescriptor(desc);
  158.     }
  159. }
  160.  
  161. /** Print charactor to console */
  162. static void arc_putchar(char ch)
  163. {
  164.     __u32 cnt;
  165.     ipl_t ipl;
  166.  
  167.     /* TODO: Should be spinlock? */
  168.     ipl = interrupts_disable();
  169.     arc_entry->write(1, &ch, 1, &cnt);
  170.     interrupts_restore(ipl);
  171.    
  172. }
  173.  
  174. /** Initialize ARC structure
  175.  *
  176.  * @return 0 - ARC OK, -1 - ARC does not exist
  177.  */
  178. int arc_init(void)
  179. {
  180.     if (sbp->signature != ARC_MAGIC) {
  181.         sbp = NULL;
  182.         return -1;
  183.     }
  184.     arc_entry = sbp->firmwarevector;
  185.  
  186.     arc_putchar('A');
  187.     arc_putchar('R');
  188.     arc_putchar('C');
  189.     arc_putchar('\n');
  190. }
  191.  
  192. static bool kbd_polling_enabled;
  193. static chardev_t console;
  194.  
  195. /** Try to get character, return character or -1 if not available */
  196. static void arc_keyboard_poll(void)
  197. {
  198.     char ch;
  199.     __u32 count;
  200.     long result;
  201.    
  202.     if (! kbd_polling_enabled)
  203.         return;
  204.  
  205.     if (arc_entry->getreadstatus(0))
  206.         return;
  207.     result = arc_entry->read(0, &ch, 1, &count);
  208.     if (result || count!=1) {
  209.         return;
  210.     }
  211.     if (ch == '\r')
  212.         ch = '\n';
  213.     if (ch == 0x7f)
  214.         ch = '\b';
  215.    
  216.     chardev_push_character(&console, ch);
  217. }
  218.  
  219. static void arc_write(chardev_t *dev, const char ch)
  220. {
  221.     arc_putchar(ch);
  222. }
  223.  
  224. static void arc_enable(chardev_t *dev)
  225. {
  226.     kbd_polling_enabled = true;
  227. }
  228.  
  229. static void arc_disable(chardev_t *dev)
  230. {
  231.     kbd_polling_enabled = false;
  232. }
  233.  
  234. static chardev_operations_t arc_ops = {
  235.     .resume = arc_enable,
  236.     .suspend = arc_disable,
  237.     .write = arc_write
  238. };
  239.  
  240. iroutine old_timer;
  241. /** Do polling on timer interrupt */
  242. static void timer_replace(int n, void *stack)
  243. {
  244.     arc_keyboard_poll();
  245.     old_timer(n, stack);
  246.     arc_keyboard_poll();
  247. }
  248.  
  249.  
  250. chardev_t * arc_console(void)
  251. {
  252.     kbd_polling_enabled = true;
  253.    
  254.     chardev_initialize("arc_console", &console, &arc_ops);
  255.     old_timer = int_register(TIMER_IRQ, "arc_kb_poll", timer_replace);
  256.     return &console;
  257. }
  258.  
  259. /* Initialize frame zones from ARC firmware.
  260.  * In the future we may use even the FirmwareTemporary regions,
  261.  * currently we use the FreeMemory (what about the LoadedProgram?)
  262.  */
  263. void arc_frame_init(void)
  264. {
  265.     arc_memdescriptor_t *desc;
  266.     int total = 0;
  267.     __address base;
  268.     size_t basesize;
  269.     unsigned int i,j;
  270.  
  271.     desc = arc_entry->getmemorydescriptor(NULL);
  272.     while (desc) {
  273.         if (desc->type == FreeMemory ||
  274.             desc->type == FreeContiguous) {
  275.             base = desc->basepage*ARC_FRAME;
  276.             basesize = desc->basecount*ARC_FRAME;
  277.  
  278.             if (base % FRAME_SIZE ) {
  279.                 basesize -= FRAME_SIZE - (base % FRAME_SIZE);
  280.                 base = ALIGN_UP(base, FRAME_SIZE);
  281.             }
  282.             basesize = ALIGN_DOWN(basesize, FRAME_SIZE);
  283.  
  284.             total += basesize;
  285.             zone_create_in_region(base, basesize);
  286.         }
  287.         desc = arc_entry->getmemorydescriptor(desc);
  288.     }
  289.  
  290.     config.memory_size = total;
  291. }
  292.  
  293.