/[gxemul]/trunk/src/devices/dev_rd94.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_rd94.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_rd94.c,v 1.29 2005/11/21 09:17:27 debug Exp $   *  $Id: dev_rd94.c,v 1.34 2006/02/09 20:02:59 debug Exp $
29   *     *  
30   *  Used by NEC-RD94, -R94, and -R96.   *  Used by NEC-RD94, -R94, and -R96.
31   */   */
# Line 82  void dev_rd94_tick(struct cpu *cpu, void Line 82  void dev_rd94_tick(struct cpu *cpu, void
82  /*  /*
83   *  dev_rd94_access():   *  dev_rd94_access():
84   */   */
85  int dev_rd94_access(struct cpu *cpu, struct memory *mem,  DEVICE_ACCESS(rd94)
         uint64_t relative_addr, unsigned char *data, size_t len,  
         int writeflag, void *extra)  
86  {  {
87          struct rd94_data *d = (struct rd94_data *) extra;          struct rd94_data *d = (struct rd94_data *) extra;
88          uint64_t idata = 0, odata = 0;          uint64_t idata = 0, odata = 0;
89          int regnr;          int regnr, bus, dev, func, pcireg;
90    
91          if (writeflag == MEM_WRITE)          if (writeflag == MEM_WRITE)
92                  idata = memory_readmax64(cpu, data, len);                  idata = memory_readmax64(cpu, data, len);
# Line 96  int dev_rd94_access(struct cpu *cpu, str Line 94  int dev_rd94_access(struct cpu *cpu, str
94          regnr = relative_addr / sizeof(uint32_t);          regnr = relative_addr / sizeof(uint32_t);
95    
96          switch (relative_addr) {          switch (relative_addr) {
97    
98          case RD94_SYS_CONFIG:          case RD94_SYS_CONFIG:
99                  if (writeflag == MEM_WRITE) {                  if (writeflag == MEM_WRITE) {
100                          fatal("[ rd94: write to CONFIG: 0x%llx ]\n",                          fatal("[ rd94: write to CONFIG: 0x%llx ]\n",
# Line 106  int dev_rd94_access(struct cpu *cpu, str Line 105  int dev_rd94_access(struct cpu *cpu, str
105                              (long long)odata);                              (long long)odata);
106                  }                  }
107                  break;                  break;
108    
109          case RD94_SYS_INTSTAT1:         /*  LB (Local Bus ???)  */          case RD94_SYS_INTSTAT1:         /*  LB (Local Bus ???)  */
110                  if (writeflag == MEM_WRITE) {                  if (writeflag == MEM_WRITE) {
111                  } else {                  } else {
# Line 120  int dev_rd94_access(struct cpu *cpu, str Line 120  int dev_rd94_access(struct cpu *cpu, str
120                  debug("[ rd94: intstat1 ]\n");                  debug("[ rd94: intstat1 ]\n");
121  /*              cpu_interrupt_ack(cpu, 3); */  /*              cpu_interrupt_ack(cpu, 3); */
122                  break;                  break;
123    
124          case RD94_SYS_INTSTAT2:         /*  PCI/EISA  */          case RD94_SYS_INTSTAT2:         /*  PCI/EISA  */
125                  if (writeflag == MEM_WRITE) {                  if (writeflag == MEM_WRITE) {
126                  } else {                  } else {
# Line 128  int dev_rd94_access(struct cpu *cpu, str Line 129  int dev_rd94_access(struct cpu *cpu, str
129                  debug("[ rd94: intstat2 ]\n");                  debug("[ rd94: intstat2 ]\n");
130  /*              cpu_interrupt_ack(cpu, 4); */  /*              cpu_interrupt_ack(cpu, 4); */
131                  break;                  break;
132    
133          case RD94_SYS_INTSTAT3:         /*  IT (Interval Timer)  */          case RD94_SYS_INTSTAT3:         /*  IT (Interval Timer)  */
134                  if (writeflag == MEM_WRITE) {                  if (writeflag == MEM_WRITE) {
135                  } else {                  } else {
# Line 137  int dev_rd94_access(struct cpu *cpu, str Line 139  int dev_rd94_access(struct cpu *cpu, str
139                  cpu_interrupt_ack(cpu, 5);                  cpu_interrupt_ack(cpu, 5);
140                  d->interval = d->interval_start;                  d->interval = d->interval_start;
141                  break;                  break;
142    
143          case RD94_SYS_INTSTAT4:         /*  IPI  */          case RD94_SYS_INTSTAT4:         /*  IPI  */
144                  if (writeflag == MEM_WRITE) {                  if (writeflag == MEM_WRITE) {
145                  } else {                  } else {
# Line 145  int dev_rd94_access(struct cpu *cpu, str Line 148  int dev_rd94_access(struct cpu *cpu, str
148                  fatal("[ rd94: intstat4 ]\n");                  fatal("[ rd94: intstat4 ]\n");
149                  cpu_interrupt_ack(cpu, 6);                  cpu_interrupt_ack(cpu, 6);
150                  break;                  break;
151    
152          case RD94_SYS_CPUID:          case RD94_SYS_CPUID:
153                  if (writeflag == MEM_WRITE) {                  if (writeflag == MEM_WRITE) {
154                          fatal("[ rd94: write to CPUID: 0x%llx ]\n",                          fatal("[ rd94: write to CPUID: 0x%llx ]\n",
# Line 155  int dev_rd94_access(struct cpu *cpu, str Line 159  int dev_rd94_access(struct cpu *cpu, str
159                              (long long)odata);                              (long long)odata);
160                  }                  }
161                  break;                  break;
162    
163          case RD94_SYS_EXT_IMASK:          case RD94_SYS_EXT_IMASK:
164                  if (writeflag == MEM_WRITE) {                  if (writeflag == MEM_WRITE) {
165                          d->intmask = idata;                          d->intmask = idata;
# Line 162  int dev_rd94_access(struct cpu *cpu, str Line 167  int dev_rd94_access(struct cpu *cpu, str
167                          odata = d->intmask;                          odata = d->intmask;
168                  }                  }
169                  break;                  break;
170    
171          case RD94_SYS_IT_VALUE:          case RD94_SYS_IT_VALUE:
172                  if (writeflag == MEM_WRITE) {                  if (writeflag == MEM_WRITE) {
173                          d->interval = d->interval_start = idata;                          d->interval = d->interval_start = idata;
# Line 172  int dev_rd94_access(struct cpu *cpu, str Line 178  int dev_rd94_access(struct cpu *cpu, str
178                          /*  TODO: or d->interval ?  */;                          /*  TODO: or d->interval ?  */;
179                  }                  }
180                  break;                  break;
181    
182          case RD94_SYS_PCI_CONFADDR:          case RD94_SYS_PCI_CONFADDR:
183                    bus_pci_decompose_1(idata, &bus, &dev, &func, &pcireg);
184                    bus_pci_setaddr(cpu, d->pci_data, bus, dev, func, pcireg);
185                    break;
186    
187          case RD94_SYS_PCI_CONFDATA:          case RD94_SYS_PCI_CONFDATA:
188                  if (writeflag == MEM_WRITE) {                  bus_pci_data_access(cpu, d->pci_data, writeflag == MEM_READ?
189                          bus_pci_access(cpu, mem, relative_addr ==                      &odata : &idata, len, writeflag);
                             RD94_SYS_PCI_CONFADDR? BUS_PCI_ADDR : BUS_PCI_DATA,  
                             &idata, len, writeflag, d->pci_data);  
                 } else {  
                         bus_pci_access(cpu, mem, relative_addr ==  
                             RD94_SYS_PCI_CONFADDR? BUS_PCI_ADDR : BUS_PCI_DATA,  
                             &odata, len, writeflag, d->pci_data);  
                 }  
190                  break;                  break;
191          default:  
192                  if (writeflag == MEM_WRITE) {          default:if (writeflag == MEM_WRITE) {
193                          fatal("[ rd94: unimplemented write to address 0x%x, "                          fatal("[ rd94: unimplemented write to address 0x%x, "
194                              "data=0x%02x ]\n", (int)relative_addr, (int)idata);                              "data=0x%02x ]\n", (int)relative_addr, (int)idata);
195                  } else {                  } else {
# Line 201  int dev_rd94_access(struct cpu *cpu, str Line 205  int dev_rd94_access(struct cpu *cpu, str
205  }  }
206    
207    
208  /*  DEVINIT(rd94)
  *  devinit_rd94():  
  */  
 int devinit_rd94(struct devinit *devinit)  
209  {  {
210          struct rd94_data *d = malloc(sizeof(struct rd94_data));          struct rd94_data *d = malloc(sizeof(struct rd94_data));
211          if (d == NULL) {          if (d == NULL) {
# Line 213  int devinit_rd94(struct devinit *devinit Line 214  int devinit_rd94(struct devinit *devinit
214          }          }
215          memset(d, 0, sizeof(struct rd94_data));          memset(d, 0, sizeof(struct rd94_data));
216          d->pciirq   = devinit->irq_nr;          d->pciirq   = devinit->irq_nr;
217          d->pci_data = bus_pci_init(d->pciirq, 0,0, 0,0,0, 0,0,0);          d->pci_data = bus_pci_init(devinit->machine, d->pciirq,
218                0,0, 0,0,0, 0,0,0);
219    
220          memory_device_register(devinit->machine->memory, devinit->name,          memory_device_register(devinit->machine->memory, devinit->name,
221              devinit->addr, DEV_RD94_LENGTH,              devinit->addr, DEV_RD94_LENGTH,

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

  ViewVC Help
Powered by ViewVC 1.1.26