/[gxemul]/trunk/src/devices/dev_sgi_ip32.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/devices/dev_sgi_ip32.c

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

revision 21 by dpavlin, Mon Oct 8 16:19:23 2007 UTC revision 22 by dpavlin, Mon Oct 8 16:19:37 2007 UTC
# Line 1  Line 1 
1  /*  /*
2   *  Copyright (C) 2003-2005  Anders Gavare.  All rights reserved.   *  Copyright (C) 2003-2006  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: dev_sgi_ip32.c,v 1.38 2005/11/21 09:17:27 debug Exp $   *  $Id: dev_sgi_ip32.c,v 1.44 2006/01/01 13:17:17 debug Exp $
29   *     *  
30   *  SGI IP32 devices.   *  SGI IP32 devices.
31   *   *
# Line 106  void dev_crime_tick(struct cpu *cpu, voi Line 106  void dev_crime_tick(struct cpu *cpu, voi
106  /*  /*
107   *  dev_crime_access():   *  dev_crime_access():
108   */   */
109  int dev_crime_access(struct cpu *cpu, struct memory *mem,  DEVICE_ACCESS(crime)
         uint64_t relative_addr, unsigned char *data, size_t len,  
         int writeflag, void *extra)  
110  {  {
111          struct crime_data *d = extra;          struct crime_data *d = extra;
112          uint64_t idata = 0;          uint64_t idata = 0;
113          int i;          size_t i;
114    
115          if (writeflag == MEM_WRITE)          if (writeflag == MEM_WRITE)
116                  idata = memory_readmax64(cpu, data, len);                  idata = memory_readmax64(cpu, data, len);
# Line 182  TODO. Line 180  TODO.
180                                  idata &= ~0x200;                                  idata &= ~0x200;
181                          }                          }
182                          if (idata & 0x800) {                          if (idata & 0x800) {
183                                    int j;
184    
185                                  /*  This is used by the IP32 PROM's                                  /*  This is used by the IP32 PROM's
186                                      "reboot" command:  */                                      "reboot" command:  */
187                                  for (i=0; i<cpu->machine->ncpus; i++)                                  for (j=0; j<cpu->machine->ncpus; j++)
188                                          cpu->machine->cpus[i]->running = 0;                                          cpu->machine->cpus[j]->running = 0;
189                                  cpu->machine->                                  cpu->machine->
190                                      exit_without_entering_debugger = 1;                                      exit_without_entering_debugger = 1;
191                                  idata &= ~0x800;                                  idata &= ~0x800;
# Line 254  struct crime_data *dev_crime_init(struct Line 254  struct crime_data *dev_crime_init(struct
254  /*  /*
255   *  dev_mace_access():   *  dev_mace_access():
256   */   */
257  int dev_mace_access(struct cpu *cpu, struct memory *mem,  DEVICE_ACCESS(mace)
         uint64_t relative_addr, unsigned char *data, size_t len,  
         int writeflag, void *extra)  
258  {  {
259          int i;          size_t i;
260          struct mace_data *d = extra;          struct mace_data *d = extra;
261    
262          if (writeflag == MEM_WRITE)          if (writeflag == MEM_WRITE)
# Line 335  struct mace_data *dev_mace_init(struct m Line 333  struct mace_data *dev_mace_init(struct m
333  /*  /*
334   *  dev_macepci_access():   *  dev_macepci_access():
335   */   */
336  int dev_macepci_access(struct cpu *cpu, struct memory *mem,  DEVICE_ACCESS(macepci)
         uint64_t relative_addr, unsigned char *data, size_t len,  
         int writeflag, void *extra)  
337  {  {
338          struct macepci_data *d = (struct macepci_data *) extra;          struct macepci_data *d = (struct macepci_data *) extra;
339          uint64_t idata = 0, odata=0;          uint64_t idata = 0, odata=0;
340          int regnr, res = 1;          int regnr, res = 1, bus, dev, func, pcireg;
341    
342          if (writeflag == MEM_WRITE)          if (writeflag == MEM_WRITE)
343                  idata = memory_readmax64(cpu, data, len);                  idata = memory_readmax64(cpu, data, len);
# Line 350  int dev_macepci_access(struct cpu *cpu, Line 346  int dev_macepci_access(struct cpu *cpu,
346    
347          /*  Read from/write to the macepci:  */          /*  Read from/write to the macepci:  */
348          switch (relative_addr) {          switch (relative_addr) {
349    
350          case 0x00:      /*  Error address  */          case 0x00:      /*  Error address  */
351                  if (writeflag == MEM_WRITE) {                  if (writeflag == MEM_WRITE) {
352                  } else {                  } else {
353                          odata = 0;                          odata = 0;
354                  }                  }
355                  break;                  break;
356    
357          case 0x04:      /*  Error flags  */          case 0x04:      /*  Error flags  */
358                  if (writeflag == MEM_WRITE) {                  if (writeflag == MEM_WRITE) {
359                  } else {                  } else {
360                          odata = 0x06;                          odata = 0x06;
361                  }                  }
362                  break;                  break;
363    
364          case 0x0c:      /*  Revision number  */          case 0x0c:      /*  Revision number  */
365                  if (writeflag == MEM_WRITE) {                  if (writeflag == MEM_WRITE) {
366                  } else {                  } else {
367                          odata = 0x01;                          odata = 0x01;
368                  }                  }
369                  break;                  break;
370    
371          case 0xcf8:     /*  PCI ADDR  */          case 0xcf8:     /*  PCI ADDR  */
372                    bus_pci_decompose_1(idata, &bus, &dev, &func, &pcireg);
373                    bus_pci_setaddr(cpu, d->pci_data, bus, dev, func, pcireg);
374                    break;
375    
376          case 0xcfc:     /*  PCI DATA  */          case 0xcfc:     /*  PCI DATA  */
377                  if (writeflag == MEM_WRITE) {                  bus_pci_data_access(cpu, d->pci_data, writeflag == MEM_READ?
378                          res = bus_pci_access(cpu, mem, relative_addr,                      &odata : &idata, len, writeflag);
                             &idata, len, writeflag, d->pci_data);  
                 } else {  
                         res = bus_pci_access(cpu, mem, relative_addr,  
                             &odata, len, writeflag, d->pci_data);  
                 }  
379                  break;                  break;
380    
381          default:          default:
382                  if (writeflag == MEM_WRITE) {                  if (writeflag == MEM_WRITE) {
383                          debug("[ macepci: unimplemented write to address "                          debug("[ macepci: unimplemented write to address "
# Line 399  int dev_macepci_access(struct cpu *cpu, Line 399  int dev_macepci_access(struct cpu *cpu,
399  /*  /*
400   *  dev_macepci_init():   *  dev_macepci_init():
401   */   */
402  struct pci_data *dev_macepci_init(struct memory *mem, uint64_t baseaddr,  struct pci_data *dev_macepci_init(struct machine *machine,
403          int pciirq)          struct memory *mem, uint64_t baseaddr, int pciirq)
404  {  {
405          struct macepci_data *d = malloc(sizeof(struct macepci_data));          struct macepci_data *d = malloc(sizeof(struct macepci_data));
406          if (d == NULL) {          if (d == NULL) {
# Line 409  struct pci_data *dev_macepci_init(struct Line 409  struct pci_data *dev_macepci_init(struct
409          }          }
410          memset(d, 0, sizeof(struct macepci_data));          memset(d, 0, sizeof(struct macepci_data));
411    
412          d->pci_data = bus_pci_init(pciirq, 0,0, 0,0,0, 0,0,0);          d->pci_data = bus_pci_init(machine, pciirq, 0,0, 0,0,0, 0,0,0);
413    
414          memory_device_register(mem, "macepci", baseaddr, DEV_MACEPCI_LENGTH,          memory_device_register(mem, "macepci", baseaddr, DEV_MACEPCI_LENGTH,
415              dev_macepci_access, (void *)d, DM_DEFAULT, NULL);              dev_macepci_access, (void *)d, DM_DEFAULT, NULL);
# Line 767  void dev_sgi_mec_tick(struct cpu *cpu, v Line 767  void dev_sgi_mec_tick(struct cpu *cpu, v
767  /*  /*
768   *  dev_sgi_mec_access():   *  dev_sgi_mec_access():
769   */   */
770  int dev_sgi_mec_access(struct cpu *cpu, struct memory *mem,  DEVICE_ACCESS(sgi_mec)
         uint64_t relative_addr, unsigned char *data, size_t len,  
         int writeflag, void *extra)  
771  {  {
772          struct sgi_mec_data *d = (struct sgi_mec_data *) extra;          struct sgi_mec_data *d = (struct sgi_mec_data *) extra;
773          uint64_t idata = 0, odata = 0;          uint64_t idata = 0, odata = 0;
# Line 975  struct sgi_ust_data { Line 973  struct sgi_ust_data {
973  /*  /*
974   *  dev_sgi_ust_access():   *  dev_sgi_ust_access():
975   */   */
976  int dev_sgi_ust_access(struct cpu *cpu, struct memory *mem,  DEVICE_ACCESS(sgi_ust)
         uint64_t relative_addr, unsigned char *data, size_t len,  
         int writeflag, void *extra)  
977  {  {
978          struct sgi_ust_data *d = (struct sgi_ust_data *) extra;          struct sgi_ust_data *d = (struct sgi_ust_data *) extra;
979          uint64_t idata = 0, odata = 0;          uint64_t idata = 0, odata = 0;
# Line 1052  struct sgi_mte_data { Line 1048  struct sgi_mte_data {
1048  /*  /*
1049   *  dev_sgi_mte_access():   *  dev_sgi_mte_access():
1050   */   */
1051  int dev_sgi_mte_access(struct cpu *cpu, struct memory *mem,  DEVICE_ACCESS(sgi_mte)
         uint64_t relative_addr, unsigned char *data, size_t len,  
         int writeflag, void *extra)  
1052  {  {
1053          struct sgi_mte_data *d = (struct sgi_mte_data *) extra;          struct sgi_mte_data *d = (struct sgi_mte_data *) extra;
1054          uint64_t first_addr, last_addr, zerobuflen, fill_addr, fill_len;          uint64_t first_addr, last_addr, zerobuflen, fill_addr, fill_len;
# Line 1161  int dev_sgi_mte_access(struct cpu *cpu, Line 1155  int dev_sgi_mte_access(struct cpu *cpu,
1155                          uint32_t x2 = (d->reg[0x2074 / sizeof(uint32_t)]                          uint32_t x2 = (d->reg[0x2074 / sizeof(uint32_t)]
1156                              >> 16) & 0xfff;                              >> 16) & 0xfff;
1157                          uint32_t y2 = d->reg[0x2074 / sizeof(uint32_t)]& 0xfff;                          uint32_t y2 = d->reg[0x2074 / sizeof(uint32_t)]& 0xfff;
1158                          int y;                          uint32_t y;
1159    
1160                          op >>= 24;                          op >>= 24;
1161    
# Line 1207  int dev_sgi_mte_access(struct cpu *cpu, Line 1201  int dev_sgi_mte_access(struct cpu *cpu,
1201                          uint32_t x2 = (d->reg[0x2074 / sizeof(uint32_t)]                          uint32_t x2 = (d->reg[0x2074 / sizeof(uint32_t)]
1202                              >> 16) & 0xfff;                              >> 16) & 0xfff;
1203                          uint32_t y2 = d->reg[0x2074 / sizeof(uint32_t)]& 0xfff;                          uint32_t y2 = d->reg[0x2074 / sizeof(uint32_t)]& 0xfff;
1204                          int x,y;                          size_t x, y;
1205    
1206                          if (x2 < x1) {                          if (x2 < x1) {
1207                                  int tmp = x1; x1 = x2; x2 = tmp;                                  int tmp = x1; x1 = x2; x2 = tmp;
1208                          }                          }
# Line 1216  int dev_sgi_mte_access(struct cpu *cpu, Line 1211  int dev_sgi_mte_access(struct cpu *cpu,
1211                          }                          }
1212                          if (x2-x1 <= 15)                          if (x2-x1 <= 15)
1213                                  data <<= 16;                                  data <<= 16;
1214    
1215                          x=x1; y=y1;                          x=x1; y=y1;
1216                          while (x <= x2 && y <= y2) {                          while (x <= x2 && y <= y2) {
1217                                  unsigned char buf = color;                                  unsigned char buf = color;

Legend:
Removed from v.21  
changed lines
  Added in v.22

  ViewVC Help
Powered by ViewVC 1.1.26