The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/ppc/msaturn.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 #include "u.h"
    2 #include "../port/lib.h"
    3 #include "mem.h"
    4 #include "dat.h"
    5 #include "fns.h"
    6 #include "io.h"
    7 #include "../port/error.h"
    8 #include "msaturn.h"
    9 
   10 enum {
   11         Isr = Saturn + 0x0400,
   12         Ipol = Saturn + 0x0404,
   13         Issr = Saturn + 0x0500,
   14         Ier = Saturn + 0x0504,
   15         Ipri = Saturn + 0x0600,
   16         Ithresh = Saturn + 0x0706,
   17 #define Iar     Ithresh
   18 };
   19 
   20 enum{
   21         Syscfg = Saturn + 0x0100,
   22 };
   23 
   24 static uchar intprio[] = {
   25                 Vecuart0,                       // uart 0
   26                 Vecunused,              // uart 1
   27                 Vecunused,              // sint
   28                 Vectimer0,              // timer 0
   29                 Vecunused,              // timer 1
   30                 Vecether,                       // ethernet
   31                 Vecunused,              // tea
   32                 Vecunused,              // irq0 
   33                 Vecunused,              // irq1 
   34                 Vecunused,              // irq2 
   35                 Vecunused,              // irq3 
   36                 Vecunused,              // irq4 
   37                 Vecunused,              // irq5 
   38                 Vecunused,              // irq6 
   39                 Vecunused,              // irq7 
   40                 Vecunused,              // irq8 
   41 };
   42 
   43 void
   44 intend(int)
   45 {
   46 }
   47 
   48 void
   49 hwintrinit(void)
   50 {
   51         int i;
   52 
   53         *(ulong*)Ier=0;
   54 
   55         for(i=0; i<nelem(intprio)/2; i++)
   56                 ((uchar*)Ipri)[i] = (intprio[2*i]<<4)|intprio[2*i+1];
   57 }
   58 
   59 int
   60 vectorenable(Vctl*v)
   61 {
   62         int i;
   63 
   64         for(i=0; i<nelem(intprio); i++)
   65                 if(v->irq==intprio[i]){
   66                         *(ulong*)Ier |= 1<<(31-i);
   67                         return v->irq;
   68                 }
   69         print("intrenable: cannot enable intr %d\n", v->irq);
   70         return -1;
   71 }
   72 
   73 void
   74 vectordisable(Vctl*v)
   75 {
   76         int i;
   77 
   78         for(i=0; i<nelem(intprio); i++)
   79                 if(v->irq==intprio[i]){
   80                         *(ulong*)Ier &= ~(1<<(31-i));
   81                         return;
   82                 }
   83 }
   84 
   85 int
   86 intvec(void)
   87 {
   88         ushort iar;
   89         int i;
   90 
   91         iar = *(ushort*)Iar;            // push(prio) onto stack
   92         for(i=0; i<nelem(intprio); i++)
   93                 if(iar==intprio[i])
   94                         return iar;
   95                 
   96         iprint("saturnint: no vector %d\n", iar);
   97         intack();
   98         return -1;
   99 }
  100 
  101 void
  102 intack(void)
  103 {
  104         *(ushort*)Ithresh = 0;  // pop(prio) stack
  105 }
  106 
  107 void
  108 machinit(void)
  109 {
  110         int rrate;
  111         ulong hid;
  112         extern char* plan9inistr;
  113         ulong l2cr;
  114 
  115         memset(m, 0, sizeof(*m));
  116         m->cputype = getpvr()>>16;
  117         m->imap = (Imap*)INTMEM;
  118 
  119         m->loopconst = 1096;
  120 
  121         rrate = (*(ushort*)Syscfg >> 6) & 3;
  122         switch(rrate){
  123         case 0:
  124                 m->bushz = 66666666;
  125                 break;
  126         case 1:
  127                 m->bushz = 83333333;
  128                 break;
  129         case 2:
  130                 m->bushz = 100000000;
  131                 break;
  132         case 3:
  133                 m->bushz = 133333333;
  134                 break;
  135         }
  136 
  137         if(getpll() == 0x80000000)
  138                 m->cpuhz = 300000000;
  139         else
  140                 m->cpuhz = 200000000;           /* 750FX? */
  141         m->cyclefreq = m->bushz / 4;
  142 
  143         active.machs = 1;
  144         active.exiting = 0;
  145 
  146         putmsr(getmsr() | MSR_ME);
  147 
  148         dcflush((void*)KZERO, 0x2000000);
  149         l2cr = getl2cr();
  150         putl2cr(l2cr|BIT(10));
  151 
  152         kfpinit();
  153 
  154         hid=gethid0();
  155         hid |= BIT(28)|BIT(26)|BIT(24);
  156         puthid0(hid);
  157 
  158         plan9inistr =
  159                 "console=0\n"
  160                 "ether0=type=saturn\n"
  161                 "fs=135.104.9.42\n"
  162                 "auth=135.104.9.7\n"
  163                 "authdom=cs.bell-labs.com\n"
  164                 "sys=ucu\n"
  165                 "ntp=135.104.9.52\n";
  166 }
  167 
  168 void
  169 sharedseginit(void)
  170 {
  171 }
  172 
  173 void
  174 trapinit(void)
  175 {
  176         int i;
  177 
  178         for(i = 0x0; i < 0x2000; i += 0x100)
  179                 sethvec(i, trapvec);
  180 
  181         dcflush(KADDR(0), 0x2000);
  182         icflush(KADDR(0), 0x2000);
  183 
  184         putmsr(getmsr() & ~MSR_IP);
  185 }
  186 
  187 void
  188 reboot(void*, void*, ulong)
  189 {
  190 }

Cache object: 9c27ced6513353413a36b2dd5ef90eec


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.