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

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

revision 11 by dpavlin, Mon Oct 8 16:18:27 2007 UTC revision 12 by dpavlin, Mon Oct 8 16:18:38 2007 UTC
# Line 25  Line 25 
25   *  SUCH DAMAGE.   *  SUCH DAMAGE.
26   *     *  
27   *   *
28   *  $Id: dev_gt.c,v 1.22 2005/06/20 08:19:58 debug Exp $   *  $Id: dev_gt.c,v 1.26 2005/08/05 07:50:37 debug Exp $
29   *     *  
30   *  Galileo Technology GT-64xxx PCI controller.   *  Galileo Technology GT-64xxx PCI controller.
31   *   *
32   *      GT-64011        Used in Cobalt machines.   *      GT-64011        Used in Cobalt machines.
33   *      GT-64120        Used in evbmips machines (Malta).   *      GT-64120        Used in evbmips machines (Malta).
34   *   *
35   *  TODO:  This more or less just a dummy device, so far.   *  TODO: This more or less just a dummy device, so far. It happens to work
36     *        with NetBSD/cobalt and /evbmips, and in some cases it might happen
37     *        to work with Linux as well, but don't rely on it for anything else.
38   */   */
39    
40  #include <stdio.h>  #include <stdio.h>
# Line 47  Line 49 
49  #include "misc.h"  #include "misc.h"
50    
51    
52  #define TICK_STEPS_SHIFT        16  #define TICK_SHIFT              14
53    
54    /*  #define debug fatal  */
55    
56  #define PCI_VENDOR_GALILEO           0x11ab    /* Galileo Technology */  #define PCI_VENDOR_GALILEO           0x11ab    /* Galileo Technology */
57  #define PCI_PRODUCT_GALILEO_GT64011  0x4146    /* GT-64011 System Controller */  #define PCI_PRODUCT_GALILEO_GT64011  0x4146    /* GT-64011 System Controller */
58  #define PCI_PRODUCT_GALILEO_GT64120  0x4620    /* GT-64120 */  #define PCI_PRODUCT_GALILEO_GT64120  0x4620    /* GT-64120 */
59    
60  struct gt_data {  struct gt_data {
         int     reg[8];  
61          int     irqnr;          int     irqnr;
62          int     pciirq;          int     pciirq;
63          int     type;          int     type;
# Line 81  int dev_gt_access(struct cpu *cpu, struc Line 84  int dev_gt_access(struct cpu *cpu, struc
84          unsigned char *data, size_t len, int writeflag, void *extra)          unsigned char *data, size_t len, int writeflag, void *extra)
85  {  {
86          uint64_t idata = 0, odata = 0;          uint64_t idata = 0, odata = 0;
87          int i;          int i, asserted;
88          struct gt_data *d = extra;          struct gt_data *d = extra;
89    
90          idata = memory_readmax64(cpu, data, len);          idata = memory_readmax64(cpu, data, len);
91    
92          switch (relative_addr) {          switch (relative_addr) {
93    
94            case 0x48:
95                    switch (d->type) {
96                    case PCI_PRODUCT_GALILEO_GT64120:
97                            /*
98                             *  This is needed for Linux on Malta, according
99                             *  to Alec Voropay.  (TODO: Remove this hack when
100                             *  things have stabilized.)
101                             */
102                            if (writeflag == MEM_READ) {
103                                    odata = 0x18000000 >> 21;
104                                    debug("[ gt: read from 0x48: 0x%08x ]\n",
105                                        (int)odata);
106                            }
107                            break;
108                    default:
109                            fatal("[ gt: access to 0x48? (type %i) ]\n", d->type);
110                    }
111                    break;
112    
113          case 0xc18:          case 0xc18:
114                  if (writeflag == MEM_WRITE) {                  if (writeflag == MEM_WRITE) {
115                          debug("[ gt write to  0xc18: data = 0x%08lx ]\n",                          debug("[ gt: write to  0xc18: 0x%08x ]\n", (int)idata);
                             (long)idata);  
116                          return 1;                          return 1;
117                  } else {                  } else {
118                          odata = 0xffffffffULL;                          odata = 0xffffffffULL;
119                          /*  ???  interrupt something...  */                          /*  ???  interrupt something...  */
120    
121    /*
122     *  TODO: Remove this hack when things have stabilized.
123     */
124  odata = 0x00000100;     /*  netbsd/cobalt cobalt/machdep.c:cpu_intr()  */  odata = 0x00000100;     /*  netbsd/cobalt cobalt/machdep.c:cpu_intr()  */
125    
126  cpu_interrupt_ack(cpu, d->irqnr);  cpu_interrupt_ack(cpu, d->irqnr);
127    
128                          debug("[ gt read from 0xc18 (data = 0x%08lx) ]\n",                          debug("[ gt: read from 0xc18 (0x%08x) ]\n", (int)odata);
                             (long)odata);  
129                  }                  }
130                  break;                  break;
131    
132            case 0xc34:     /*  GT_PCI0_INTR_ACK  */
133                    /*
134                     *  Ugly hack, which works for at least evbmips/Malta:
135                     */
136                    asserted =
137                        (cpu->machine->md_int.isa_pic_data.pic1->irr &
138                        ~cpu->machine->md_int.isa_pic_data.pic1->ier) |
139                        ((cpu->machine->md_int.isa_pic_data.pic2->irr &
140                         ~cpu->machine->md_int.isa_pic_data.pic2->ier) << 8);
141                    odata = 7;      /*  "Spurious interrupt" defaults to 7.  */
142                    for (i=0; i<16; i++)
143                            if ((asserted >> i) & 1) {
144                                    odata = i;
145                                    break;
146                            }
147                    break;
148    
149          case 0xcf8:     /*  PCI ADDR  */          case 0xcf8:     /*  PCI ADDR  */
150          case 0xcfc:     /*  PCI DATA  */          case 0xcfc:     /*  PCI DATA  */
151                  if (writeflag == MEM_WRITE) {                  if (writeflag == MEM_WRITE) {
# Line 116  cpu_interrupt_ack(cpu, d->irqnr); Line 158  cpu_interrupt_ack(cpu, d->irqnr);
158                  break;                  break;
159          default:          default:
160                  if (writeflag==MEM_READ) {                  if (writeflag==MEM_READ) {
161                          debug("[ gt read from addr 0x%x ]\n",                          debug("[ gt: read from addr 0x%x ]\n",
162                              (int)relative_addr);                              (int)relative_addr);
                         odata = d->reg[relative_addr];  
163                  } else {                  } else {
164                          debug("[ gt write to addr 0x%x:", (int)relative_addr);                          debug("[ gt: write to addr 0x%x:", (int)relative_addr);
165                          for (i=0; i<len; i++)                          for (i=0; i<len; i++)
166                                  debug(" %02x", data[i]);                                  debug(" %02x", data[i]);
167                          debug(" ]\n");                          debug(" ]\n");
                         d->reg[relative_addr] = idata;  
168                  }                  }
169          }          }
170    
# Line 219  struct pci_data *dev_gt_init(struct mach Line 259  struct pci_data *dev_gt_init(struct mach
259    
260          memory_device_register(mem, "gt", baseaddr, DEV_GT_LENGTH,          memory_device_register(mem, "gt", baseaddr, DEV_GT_LENGTH,
261              dev_gt_access, d, MEM_DEFAULT, NULL);              dev_gt_access, d, MEM_DEFAULT, NULL);
262          machine_add_tickfunction(machine, dev_gt_tick, d, TICK_STEPS_SHIFT);          machine_add_tickfunction(machine, dev_gt_tick, d, TICK_SHIFT);
263    
264          return d->pci_data;          return d->pci_data;
265  }  }

Legend:
Removed from v.11  
changed lines
  Added in v.12

  ViewVC Help
Powered by ViewVC 1.1.26