/[gxemul]/trunk/src/machines/machine_evbmips.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /trunk/src/machines/machine_evbmips.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 24 by dpavlin, Mon Oct 8 16:19:56 2007 UTC revision 44 by dpavlin, Mon Oct 8 16:22:56 2007 UTC
# Line 1  Line 1 
1  /*  /*
2   *  Copyright (C) 2005-2006  Anders Gavare.  All rights reserved.   *  Copyright (C) 2005-2007  Anders Gavare.  All rights reserved.
3   *   *
4   *  Redistribution and use in source and binary forms, with or without   *  Redistribution and use in source and binary forms, with or without
5   *  modification, are permitted provided that the following conditions are met:   *  modification, are permitted provided that the following conditions are met:
# Line 25  Line 25 
25   *  SUCH DAMAGE.   *  SUCH DAMAGE.
26   *     *  
27   *   *
28   *  $Id: machine_evbmips.c,v 1.6 2006/05/21 11:35:58 debug Exp $   *  $Id: machine_evbmips.c,v 1.30 2007/06/17 02:17:45 debug Exp $
29     *
30     *  COMMENT: MIPS evaluation boards (e.g. Malta)
31   */   */
32    
33  #include <stdio.h>  #include <stdio.h>
# Line 38  Line 40 
40  #include "device.h"  #include "device.h"
41  #include "devices.h"  #include "devices.h"
42  #include "machine.h"  #include "machine.h"
 #include "machine_interrupts.h"  
43  #include "memory.h"  #include "memory.h"
44  #include "misc.h"  #include "misc.h"
45    
# Line 47  Line 48 
48    
49  MACHINE_SETUP(evbmips)  MACHINE_SETUP(evbmips)
50  {  {
51          char tmpstr[1000];          char tmpstr[1000], tmpstr2[1000];
         char tmps[50];  
         uint64_t env, tmpptr;  
52          struct pci_data *pci_data;          struct pci_data *pci_data;
53          int i;          int i;
54    
55          /*  See http://www.netbsd.org/Ports/evbmips/ for more info.  */          /*  See http://www.netbsd.org/ports/evbmips/ for more info.  */
56    
57          switch (machine->machine_subtype) {          switch (machine->machine_subtype) {
58    
59          case MACHINE_EVBMIPS_MALTA:          case MACHINE_EVBMIPS_MALTA:
60          case MACHINE_EVBMIPS_MALTA_BE:          case MACHINE_EVBMIPS_MALTA_BE:
61                    if (machine->emulated_hz == 0)
62                            machine->emulated_hz = 33000000;
63                  cpu->byte_order = EMUL_LITTLE_ENDIAN;                  cpu->byte_order = EMUL_LITTLE_ENDIAN;
64                  machine->machine_name = "MALTA (evbmips, little endian)";                  machine->machine_name = "MALTA (evbmips, little endian)";
                 machine->stable = 1;  
65    
66                  if (machine->machine_subtype == MACHINE_EVBMIPS_MALTA_BE) {                  if (machine->machine_subtype == MACHINE_EVBMIPS_MALTA_BE) {
67                          machine->machine_name = "MALTA (evbmips, big endian)";                          machine->machine_name = "MALTA (evbmips, big endian)";
68                          cpu->byte_order = EMUL_BIG_ENDIAN;                          cpu->byte_order = EMUL_BIG_ENDIAN;
69                  }                  }
70    
71                  machine->md_interrupt = isa8_interrupt;                  /*  ISA bus at MIPS irq 2:  */
72                  machine->isa_pic_data.native_irq = 2;                  snprintf(tmpstr, sizeof(tmpstr), "%s.cpu[%i].2",
73                        machine->path, machine->bootstrap_cpu);
74                  bus_isa_init(machine, 0, 0x18000000, 0x10000000, 8, 24);                  bus_isa_init(machine, tmpstr, 0, 0x18000000, 0x10000000);
75    
76                  snprintf(tmpstr, sizeof(tmpstr), "ns16550 irq=4 addr=0x%x"                  snprintf(tmpstr, sizeof(tmpstr), "ns16550 irq=%s.cpu[%i].4 "
77                      " name2=tty2 in_use=0", MALTA_CBUSUART);                      "addr=0x%x name2=tty2 in_use=0", machine->path,
78                        machine->bootstrap_cpu, MALTA_CBUSUART);
79                  device_add(machine, tmpstr);                  device_add(machine, tmpstr);
80    
81                    /*  Add a GT controller; timer interrupts at ISA irq 9:  */
82                    snprintf(tmpstr, sizeof(tmpstr), "%s.cpu[%i].2.isa.9",
83                        machine->path, machine->bootstrap_cpu);
84                    snprintf(tmpstr2, sizeof(tmpstr2), "%s.cpu[%i].2",
85                        machine->path, machine->bootstrap_cpu);
86                  pci_data = dev_gt_init(machine, machine->memory, 0x1be00000,                  pci_data = dev_gt_init(machine, machine->memory, 0x1be00000,
87                      8+9, 8+9, 120);                      tmpstr, tmpstr2, 120);
88    
89                  if (machine->use_x11) {                  if (machine->x11_md.in_use) {
90                          if (strlen(machine->boot_string_argument) < 3) {                          if (strlen(machine->boot_string_argument) < 3) {
91                                  fatal("WARNING: remember to use  -o 'console="                                  fatal("WARNING: remember to use  -o 'console="
92                                      "tty0'  if you are emulating Linux. (Not"                                      "tty0'  if you are emulating Linux. (Not"
# Line 94  MACHINE_SETUP(evbmips) Line 101  MACHINE_SETUP(evbmips)
101                  bus_pci_add(machine, pci_data, machine->memory,                  bus_pci_add(machine, pci_data, machine->memory,
102                      0, 9, 1, "piix4_ide");                      0, 9, 1, "piix4_ide");
103    
104                  device_add(machine, "malta_lcd addr=0x1f000400");                  /*  pcn: Not yet, since it is just a bogus device, so far.  */
105                  break;                  /*  bus_pci_add(machine, pci_data, machine->memory,
106                        0, 11, 0, "pcn");  */
         case MACHINE_EVBMIPS_MESHCUBE:  
                 machine->machine_name = "Meshcube";  
   
                 /*  See: http://mail-index.netbsd.org/port-evbmips/2006/  
                     02/23/0000.html  */  
   
                 if (machine->physical_ram_in_mb != 64)  
                         fprintf(stderr, "WARNING! MeshCubes are supposed to "  
                             "have exactly 64 MB RAM. Continuing anyway.\n");  
                 if (machine->use_x11)  
                         fprintf(stderr, "WARNING! MeshCube with -X is "  
                             "meaningless. Continuing anyway.\n");  
   
                 /*  First of all, the MeshCube has an Au1500 in it:  */  
                 machine->md_interrupt = au1x00_interrupt;  
                 machine->md_int.au1x00_ic_data = dev_au1x00_init(machine,  
                     machine->memory);  
   
                 /*  
                  *  TODO:  Which non-Au1500 devices, and at what addresses?  
                  *  
                  *  "4G Systems MTX-1 Board" at ?  
                  *      1017fffc, 14005004, 11700000, 11700008, 11900014,  
                  *      1190002c, 11900100, 11900108, 1190010c,  
                  *      10400040 - 10400074,  
                  *      14001000 (possibly LCD?)  
                  *      11100028 (possibly ttySx?)  
                  *  
                  *  "usb_ohci=base:0x10100000,len:0x100000,irq:26"  
                  */  
   
                 /*  Linux reads this during startup...  */  
                 device_add(machine, "random addr=0x1017fffc len=4");  
   
                 break;  
107    
108          case MACHINE_EVBMIPS_PB1000:                  device_add(machine, "malta_lcd addr=0x1f000400");
                 machine->machine_name = "PB1000 (evbmips)";  
                 cpu->byte_order = EMUL_BIG_ENDIAN;  
   
                 machine->md_interrupt = au1x00_interrupt;  
                 machine->md_int.au1x00_ic_data = dev_au1x00_init(machine,  
                     machine->memory);  
                 /*  TODO  */  
109                  break;                  break;
110    
111          default:fatal("Unimplemented EVBMIPS model.\n");          default:fatal("Unimplemented EVBMIPS model.\n");
# Line 170  MACHINE_SETUP(evbmips) Line 135  MACHINE_SETUP(evbmips)
135          /*  a2 = (yamon_env_var *)envp  */          /*  a2 = (yamon_env_var *)envp  */
136          cpu->cd.mips.gpr[MIPS_GPR_A2] = (int32_t)0x9fc01800;          cpu->cd.mips.gpr[MIPS_GPR_A2] = (int32_t)0x9fc01800;
137    
138          env = cpu->cd.mips.gpr[MIPS_GPR_A2];          yamon_machine_setup(machine, cpu->cd.mips.gpr[MIPS_GPR_A2]);
         tmpptr = 0xffffffff9fc01c00ULL;  
   
         snprintf(tmps, sizeof(tmps), "0x%08x", machine->physical_ram_in_mb<<20);  
         add_environment_string_dual(cpu, &env, &tmpptr, "memsize", tmps);  
   
         add_environment_string_dual(cpu, &env, &tmpptr, "yamonrev", "02.06");  
   
         /*  End of env:  */  
         tmpptr = 0;  
         add_environment_string_dual(cpu,  
                     &env, &tmpptr, NULL, NULL);  
139    
140          /*  a3 = memsize  */          /*  a3 = memsize  */
141          cpu->cd.mips.gpr[MIPS_GPR_A3] = machine->physical_ram_in_mb * 1048576;          cpu->cd.mips.gpr[MIPS_GPR_A3] = machine->physical_ram_in_mb * 1048576;
142          /*  Hm. Linux ignores a3.  */          /*  Hm. Linux ignores a3.  */
143    
144          /*          /*  Set the Core ID. See maltareg.h for more info.  */
          *  TODO:  
          *      Core ID numbers.  
          *      How much of this is not valid for PBxxxx?  
          *  
          *  See maltareg.h for more info.  
          */  
145          store_32bit_word(cpu, (int32_t)(0x80000000 + MALTA_REVISION),          store_32bit_word(cpu, (int32_t)(0x80000000 + MALTA_REVISION),
146              (1 << 10) + 0x26);              (1 << 10) + 0x26);
147    
# Line 212  MACHINE_SETUP(evbmips) Line 160  MACHINE_SETUP(evbmips)
160  MACHINE_DEFAULT_CPU(evbmips)  MACHINE_DEFAULT_CPU(evbmips)
161  {  {
162          switch (machine->machine_subtype) {          switch (machine->machine_subtype) {
163    
164          case MACHINE_EVBMIPS_MALTA:          case MACHINE_EVBMIPS_MALTA:
165          case MACHINE_EVBMIPS_MALTA_BE:          case MACHINE_EVBMIPS_MALTA_BE:
166                    /*  5Kc = MIPS64 rev 1, 5KE = MIPS64 rev 2  */
167                  machine->cpu_name = strdup("5Kc");                  machine->cpu_name = strdup("5Kc");
168                  break;                  break;
169          case MACHINE_EVBMIPS_MESHCUBE:  
                 machine->cpu_name = strdup("AU1500");  
                 break;  
         case MACHINE_EVBMIPS_PB1000:  
                 machine->cpu_name = strdup("AU1000");  
                 break;  
170          default:fatal("Unimplemented evbmips subtype.\n");          default:fatal("Unimplemented evbmips subtype.\n");
171                  exit(1);                  exit(1);
172          }          }
# Line 230  MACHINE_DEFAULT_CPU(evbmips) Line 175  MACHINE_DEFAULT_CPU(evbmips)
175    
176  MACHINE_DEFAULT_RAM(evbmips)  MACHINE_DEFAULT_RAM(evbmips)
177  {  {
178          /*  MeshCube is always (?) 64 MB, and the others work fine          machine->physical_ram_in_mb = 128;
             with 64 MB too.  */  
         machine->physical_ram_in_mb = 64;  
179  }  }
180    
181    
182  MACHINE_REGISTER(evbmips)  MACHINE_REGISTER(evbmips)
183  {  {
184          MR_DEFAULT(evbmips, "MIPS evaluation boards (evbmips)", ARCH_MIPS,          MR_DEFAULT(evbmips, "MIPS evaluation boards (evbmips)",
185              MACHINE_EVBMIPS, 1, 4);              ARCH_MIPS, MACHINE_EVBMIPS);
186          me->aliases[0] = "evbmips";  
187            machine_entry_add_alias(me, "evbmips");
188          me->subtype[0] = machine_entry_subtype_new("Malta",  
189              MACHINE_EVBMIPS_MALTA, 1);          machine_entry_add_subtype(me, "Malta", MACHINE_EVBMIPS_MALTA,
190          me->subtype[0]->aliases[0] = "malta";              "malta", NULL);
   
         me->subtype[1] = machine_entry_subtype_new("Malta (Big-Endian)",  
             MACHINE_EVBMIPS_MALTA_BE, 1);  
         me->subtype[1]->aliases[0] = "maltabe";  
   
         me->subtype[2] = machine_entry_subtype_new("MeshCube",  
             MACHINE_EVBMIPS_MESHCUBE, 1);  
         me->subtype[2]->aliases[0] = "meshcube";  
   
         me->subtype[3] = machine_entry_subtype_new("PB1000",  
             MACHINE_EVBMIPS_PB1000, 1);  
         me->subtype[3]->aliases[0] = "pb1000";  
191    
192          machine_entry_add(me, ARCH_MIPS);          machine_entry_add_subtype(me, "Malta (Big-Endian)",
193                MACHINE_EVBMIPS_MALTA_BE, "maltabe", NULL);
194    
195          me->set_default_ram = machine_default_ram_evbmips;          me->set_default_ram = machine_default_ram_evbmips;
196  }  }

Legend:
Removed from v.24  
changed lines
  Added in v.44

  ViewVC Help
Powered by ViewVC 1.1.26