/[gxemul]/upstream/0.4.4/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 /upstream/0.4.4/src/devices/dev_rd94.c

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

revision 20 by dpavlin, Mon Oct 8 16:19:23 2007 UTC revision 30 by dpavlin, Mon Oct 8 16:20:40 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.36 2006/07/23 14:37:34 debug Exp $
29   *     *  
30   *  Used by NEC-RD94, -R94, and -R96.   *  Used by NEC-RD94, -R94, and -R96.
31   */   */
# Line 61  struct rd94_data { Line 61  struct rd94_data {
61  };  };
62    
63    
64  /*  DEVICE_TICK(rd94)
  *  dev_rd94_tick():  
  */  
 void dev_rd94_tick(struct cpu *cpu, void *extra)  
65  {  {
66          struct rd94_data *d = extra;          struct rd94_data *d = extra;
67    
# Line 79  void dev_rd94_tick(struct cpu *cpu, void Line 76  void dev_rd94_tick(struct cpu *cpu, void
76  }  }
77    
78    
79  /*  DEVICE_ACCESS(rd94)
  *  dev_rd94_access():  
  */  
 int dev_rd94_access(struct cpu *cpu, struct memory *mem,  
         uint64_t relative_addr, unsigned char *data, size_t len,  
         int writeflag, void *extra)  
80  {  {
81          struct rd94_data *d = (struct rd94_data *) extra;          struct rd94_data *d = (struct rd94_data *) extra;
82          uint64_t idata = 0, odata = 0;          uint64_t idata = 0, odata = 0;
83          int regnr;          int regnr, bus, dev, func, pcireg;
84    
85          if (writeflag == MEM_WRITE)          if (writeflag == MEM_WRITE)
86                  idata = memory_readmax64(cpu, data, len);                  idata = memory_readmax64(cpu, data, len);
# Line 96  int dev_rd94_access(struct cpu *cpu, str Line 88  int dev_rd94_access(struct cpu *cpu, str
88          regnr = relative_addr / sizeof(uint32_t);          regnr = relative_addr / sizeof(uint32_t);
89    
90          switch (relative_addr) {          switch (relative_addr) {
91    
92          case RD94_SYS_CONFIG:          case RD94_SYS_CONFIG:
93                  if (writeflag == MEM_WRITE) {                  if (writeflag == MEM_WRITE) {
94                          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 99  int dev_rd94_access(struct cpu *cpu, str
99                              (long long)odata);                              (long long)odata);
100                  }                  }
101                  break;                  break;
102    
103          case RD94_SYS_INTSTAT1:         /*  LB (Local Bus ???)  */          case RD94_SYS_INTSTAT1:         /*  LB (Local Bus ???)  */
104                  if (writeflag == MEM_WRITE) {                  if (writeflag == MEM_WRITE) {
105                  } else {                  } else {
# Line 120  int dev_rd94_access(struct cpu *cpu, str Line 114  int dev_rd94_access(struct cpu *cpu, str
114                  debug("[ rd94: intstat1 ]\n");                  debug("[ rd94: intstat1 ]\n");
115  /*              cpu_interrupt_ack(cpu, 3); */  /*              cpu_interrupt_ack(cpu, 3); */
116                  break;                  break;
117    
118          case RD94_SYS_INTSTAT2:         /*  PCI/EISA  */          case RD94_SYS_INTSTAT2:         /*  PCI/EISA  */
119                  if (writeflag == MEM_WRITE) {                  if (writeflag == MEM_WRITE) {
120                  } else {                  } else {
# Line 128  int dev_rd94_access(struct cpu *cpu, str Line 123  int dev_rd94_access(struct cpu *cpu, str
123                  debug("[ rd94: intstat2 ]\n");                  debug("[ rd94: intstat2 ]\n");
124  /*              cpu_interrupt_ack(cpu, 4); */  /*              cpu_interrupt_ack(cpu, 4); */
125                  break;                  break;
126    
127          case RD94_SYS_INTSTAT3:         /*  IT (Interval Timer)  */          case RD94_SYS_INTSTAT3:         /*  IT (Interval Timer)  */
128                  if (writeflag == MEM_WRITE) {                  if (writeflag == MEM_WRITE) {
129                  } else {                  } else {
# Line 137  int dev_rd94_access(struct cpu *cpu, str Line 133  int dev_rd94_access(struct cpu *cpu, str
133                  cpu_interrupt_ack(cpu, 5);                  cpu_interrupt_ack(cpu, 5);
134                  d->interval = d->interval_start;                  d->interval = d->interval_start;
135                  break;                  break;
136    
137          case RD94_SYS_INTSTAT4:         /*  IPI  */          case RD94_SYS_INTSTAT4:         /*  IPI  */
138                  if (writeflag == MEM_WRITE) {                  if (writeflag == MEM_WRITE) {
139                  } else {                  } else {
# Line 145  int dev_rd94_access(struct cpu *cpu, str Line 142  int dev_rd94_access(struct cpu *cpu, str
142                  fatal("[ rd94: intstat4 ]\n");                  fatal("[ rd94: intstat4 ]\n");
143                  cpu_interrupt_ack(cpu, 6);                  cpu_interrupt_ack(cpu, 6);
144                  break;                  break;
145    
146          case RD94_SYS_CPUID:          case RD94_SYS_CPUID:
147                  if (writeflag == MEM_WRITE) {                  if (writeflag == MEM_WRITE) {
148                          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 153  int dev_rd94_access(struct cpu *cpu, str
153                              (long long)odata);                              (long long)odata);
154                  }                  }
155                  break;                  break;
156    
157          case RD94_SYS_EXT_IMASK:          case RD94_SYS_EXT_IMASK:
158                  if (writeflag == MEM_WRITE) {                  if (writeflag == MEM_WRITE) {
159                          d->intmask = idata;                          d->intmask = idata;
# Line 162  int dev_rd94_access(struct cpu *cpu, str Line 161  int dev_rd94_access(struct cpu *cpu, str
161                          odata = d->intmask;                          odata = d->intmask;
162                  }                  }
163                  break;                  break;
164    
165          case RD94_SYS_IT_VALUE:          case RD94_SYS_IT_VALUE:
166                  if (writeflag == MEM_WRITE) {                  if (writeflag == MEM_WRITE) {
167                          d->interval = d->interval_start = idata;                          d->interval = d->interval_start = idata;
# Line 172  int dev_rd94_access(struct cpu *cpu, str Line 172  int dev_rd94_access(struct cpu *cpu, str
172                          /*  TODO: or d->interval ?  */;                          /*  TODO: or d->interval ?  */;
173                  }                  }
174                  break;                  break;
175    
176          case RD94_SYS_PCI_CONFADDR:          case RD94_SYS_PCI_CONFADDR:
177                    bus_pci_decompose_1(idata, &bus, &dev, &func, &pcireg);
178                    bus_pci_setaddr(cpu, d->pci_data, bus, dev, func, pcireg);
179                    break;
180    
181          case RD94_SYS_PCI_CONFDATA:          case RD94_SYS_PCI_CONFDATA:
182                  if (writeflag == MEM_WRITE) {                  bus_pci_data_access(cpu, d->pci_data, writeflag == MEM_READ?
183                          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);  
                 }  
184                  break;                  break;
185          default:  
186                  if (writeflag == MEM_WRITE) {          default:if (writeflag == MEM_WRITE) {
187                          fatal("[ rd94: unimplemented write to address 0x%x, "                          fatal("[ rd94: unimplemented write to address 0x%x, "
188                              "data=0x%02x ]\n", (int)relative_addr, (int)idata);                              "data=0x%02x ]\n", (int)relative_addr, (int)idata);
189                  } else {                  } else {
# Line 201  int dev_rd94_access(struct cpu *cpu, str Line 199  int dev_rd94_access(struct cpu *cpu, str
199  }  }
200    
201    
202  /*  DEVINIT(rd94)
  *  devinit_rd94():  
  */  
 int devinit_rd94(struct devinit *devinit)  
203  {  {
204          struct rd94_data *d = malloc(sizeof(struct rd94_data));          struct rd94_data *d = malloc(sizeof(struct rd94_data));
205          if (d == NULL) {          if (d == NULL) {
# Line 213  int devinit_rd94(struct devinit *devinit Line 208  int devinit_rd94(struct devinit *devinit
208          }          }
209          memset(d, 0, sizeof(struct rd94_data));          memset(d, 0, sizeof(struct rd94_data));
210          d->pciirq   = devinit->irq_nr;          d->pciirq   = devinit->irq_nr;
211          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,
212                0,0, 0,0,0, 0,0,0);
213    
214          memory_device_register(devinit->machine->memory, devinit->name,          memory_device_register(devinit->machine->memory, devinit->name,
215              devinit->addr, DEV_RD94_LENGTH,              devinit->addr, DEV_RD94_LENGTH,
216              dev_rd94_access, (void *)d, DM_DEFAULT, NULL);              dev_rd94_access, (void *)d, DM_DEFAULT, NULL);
217    
218          machine_add_tickfunction(devinit->machine, dev_rd94_tick,          machine_add_tickfunction(devinit->machine, dev_rd94_tick,
219              d, RD94_TICK_SHIFT);              d, RD94_TICK_SHIFT, 0.0);
220    
221          devinit->return_ptr = d->pci_data;          devinit->return_ptr = d->pci_data;
222    

Legend:
Removed from v.20  
changed lines
  Added in v.30

  ViewVC Help
Powered by ViewVC 1.1.26