/[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 4 by dpavlin, Mon Oct 8 16:18:00 2007 UTC revision 18 by dpavlin, Mon Oct 8 16:19:11 2007 UTC
# Line 25  Line 25 
25   *  SUCH DAMAGE.   *  SUCH DAMAGE.
26   *     *  
27   *   *
28   *  $Id: dev_gt.c,v 1.21 2005/03/18 23:20:52 debug Exp $   *  $Id: dev_gt.c,v 1.28 2005/10/26 14:37:04 debug Exp $
29   *     *  
30   *  The "gt" device used in Cobalt machines.   *  Galileo Technology GT-64xxx PCI controller.
31   *   *
32   *  TODO:  This more or less just a dummy device, so far.   *      GT-64011        Used in Cobalt machines.
33     *      GT-64120        Used in evbmips machines (Malta).
34     *
35     *  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 44  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 */
59    
60  struct gt_data {  struct gt_data {
         int     reg[8];  
61          int     irqnr;          int     irqnr;
62          int     pciirq;          int     pciirq;
63            int     type;
64    
65          struct pci_data *pci_data;          struct pci_data *pci_data;
66  };  };
# Line 76  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);          if (writeflag == MEM_WRITE)
91                    idata = memory_readmax64(cpu, data, len);
92    
93          switch (relative_addr) {          switch (relative_addr) {
94    
95            case 0x48:
96                    switch (d->type) {
97                    case PCI_PRODUCT_GALILEO_GT64120:
98                            /*
99                             *  This is needed for Linux on Malta, according
100                             *  to Alec Voropay.  (TODO: Remove this hack when
101                             *  things have stabilized.)
102                             */
103                            if (writeflag == MEM_READ) {
104                                    odata = 0x18000000 >> 21;
105                                    debug("[ gt: read from 0x48: 0x%08x ]\n",
106                                        (int)odata);
107                            }
108                            break;
109                    default:
110                            fatal("[ gt: access to 0x48? (type %i) ]\n", d->type);
111                    }
112                    break;
113    
114          case 0xc18:          case 0xc18:
115                  if (writeflag == MEM_WRITE) {                  if (writeflag == MEM_WRITE) {
116                          debug("[ gt write to  0xc18: data = 0x%08lx ]\n",                          debug("[ gt: write to  0xc18: 0x%08x ]\n", (int)idata);
                             (long)idata);  
117                          return 1;                          return 1;
118                  } else {                  } else {
119                          odata = 0xffffffffULL;                          odata = 0xffffffffULL;
120                          /*  ???  interrupt something...  */                          /*  ???  interrupt something...  */
121    
122    /*
123     *  TODO: Remove this hack when things have stabilized.
124     */
125  odata = 0x00000100;     /*  netbsd/cobalt cobalt/machdep.c:cpu_intr()  */  odata = 0x00000100;     /*  netbsd/cobalt cobalt/machdep.c:cpu_intr()  */
126    
127  cpu_interrupt_ack(cpu, d->irqnr);  cpu_interrupt_ack(cpu, d->irqnr);
128    
129                          debug("[ gt read from 0xc18 (data = 0x%08lx) ]\n",                          debug("[ gt: read from 0xc18 (0x%08x) ]\n", (int)odata);
                             (long)odata);  
130                  }                  }
131                  break;                  break;
132    
133            case 0xc34:     /*  GT_PCI0_INTR_ACK  */
134                    /*
135                     *  Ugly hack, which works for at least evbmips/Malta:
136                     */
137                    asserted =
138                        (cpu->machine->isa_pic_data.pic1->irr &
139                        ~cpu->machine->isa_pic_data.pic1->ier) |
140                        ((cpu->machine->isa_pic_data.pic2->irr &
141                         ~cpu->machine->isa_pic_data.pic2->ier) << 8);
142                    odata = 7;      /*  "Spurious interrupt" defaults to 7.  */
143                    for (i=0; i<16; i++)
144                            if ((asserted >> i) & 1) {
145                                    odata = i;
146                                    break;
147                            }
148                    break;
149    
150          case 0xcf8:     /*  PCI ADDR  */          case 0xcf8:     /*  PCI ADDR  */
151          case 0xcfc:     /*  PCI DATA  */          case 0xcfc:     /*  PCI DATA  */
152                  if (writeflag == MEM_WRITE) {                  if (writeflag == MEM_WRITE) {
# Line 111  cpu_interrupt_ack(cpu, d->irqnr); Line 159  cpu_interrupt_ack(cpu, d->irqnr);
159                  break;                  break;
160          default:          default:
161                  if (writeflag==MEM_READ) {                  if (writeflag==MEM_READ) {
162                          debug("[ gt read from addr 0x%x ]\n",                          debug("[ gt: read from addr 0x%x ]\n",
163                              (int)relative_addr);                              (int)relative_addr);
                         odata = d->reg[relative_addr];  
164                  } else {                  } else {
165                          debug("[ gt write to addr 0x%x:", (int)relative_addr);                          debug("[ gt: write to addr 0x%x:", (int)relative_addr);
166                          for (i=0; i<len; i++)                          for (i=0; i<len; i++)
167                                  debug(" %02x", data[i]);                                  debug(" %02x", data[i]);
168                          debug(" ]\n");                          debug(" ]\n");
                         d->reg[relative_addr] = idata;  
169                  }                  }
170          }          }
171    
# Line 131  cpu_interrupt_ack(cpu, d->irqnr); Line 177  cpu_interrupt_ack(cpu, d->irqnr);
177    
178    
179  /*  /*
180   *  pci_gt_rr():   *  pci_gt_rr_011():
181   */   */
182  uint32_t pci_gt_rr(int reg)  static uint32_t pci_gt_rr_011(int reg)
183  {  {
184          switch (reg) {          switch (reg) {
185          case 0x00:          case 0x00:
186                  return PCI_VENDOR_GALILEO + (PCI_PRODUCT_GALILEO_GT64011 << 16);                  return PCI_VENDOR_GALILEO + (PCI_PRODUCT_GALILEO_GT64011 << 16);
187          case 0x08:          case 0x08:
188                  return 0x01;    /*  Revision 1  */                  return 0x06000001;      /*  Revision 1  */
189            default:
190                    return 0;
191            }
192    }
193    
194    
195    /*
196     *  pci_gt_rr_120():
197     */
198    static uint32_t pci_gt_rr_120(int reg)
199    {
200            switch (reg) {
201            case 0x00:
202                    return PCI_VENDOR_GALILEO + (PCI_PRODUCT_GALILEO_GT64120 << 16);
203            case 0x08:
204                    return 0x06000002;      /*  Revision 2?  */
205          default:          default:
206                  return 0;                  return 0;
207          }          }
# Line 162  void pci_gt_init(struct machine *machine Line 224  void pci_gt_init(struct machine *machine
224   *  itself.   *  itself.
225   */   */
226  struct pci_data *dev_gt_init(struct machine *machine, struct memory *mem,  struct pci_data *dev_gt_init(struct machine *machine, struct memory *mem,
227          uint64_t baseaddr, int irq_nr, int pciirq)          uint64_t baseaddr, int irq_nr, int pciirq, int type)
228  {  {
229          struct gt_data *d;          struct gt_data *d;
230    
# Line 176  struct pci_data *dev_gt_init(struct mach Line 238  struct pci_data *dev_gt_init(struct mach
238          d->pciirq   = pciirq;          d->pciirq   = pciirq;
239          d->pci_data = bus_pci_init(pciirq);          d->pci_data = bus_pci_init(pciirq);
240    
241            switch (type) {
242            case 11:
243                    d->type = PCI_PRODUCT_GALILEO_GT64011;
244                    break;
245            case 120:
246                    d->type = PCI_PRODUCT_GALILEO_GT64120;
247                    break;
248            default:fatal("dev_gt_init(): type must be 11 or 120.\n");
249                    exit(1);
250            }
251    
252          /*          /*
253           *  According to NetBSD/cobalt:           *  According to NetBSD/cobalt:
254           *  pchb0 at pci0 dev 0 function 0: Galileo GT-64011           *  pchb0 at pci0 dev 0 function 0: Galileo GT-64011
255           *  System Controller, rev 1           *  System Controller, rev 1
256           */           */
257          bus_pci_add(machine, d->pci_data, mem, 0, 0, 0, pci_gt_init, pci_gt_rr);          bus_pci_add(machine, d->pci_data, mem, 0, 0, 0, pci_gt_init,
258                d->type == PCI_PRODUCT_GALILEO_GT64011?
259                pci_gt_rr_011 : pci_gt_rr_120);
260    
261          memory_device_register(mem, "gt", baseaddr, DEV_GT_LENGTH,          memory_device_register(mem, "gt", baseaddr, DEV_GT_LENGTH,
262              dev_gt_access, d, MEM_DEFAULT, NULL);              dev_gt_access, d, MEM_DEFAULT, NULL);
263          machine_add_tickfunction(machine, dev_gt_tick, d, TICK_STEPS_SHIFT);          machine_add_tickfunction(machine, dev_gt_tick, d, TICK_SHIFT);
264    
265          return d->pci_data;          return d->pci_data;
266  }  }

Legend:
Removed from v.4  
changed lines
  Added in v.18

  ViewVC Help
Powered by ViewVC 1.1.26