Allow selection of emulated network card.
[qemu] / hw / integratorcp.c
1 /* 
2  * ARM Integrator CP System emulation.
3  *
4  * Copyright (c) 2005 CodeSourcery, LLC.
5  * Written by Paul Brook
6  *
7  * This code is licenced under the GPL
8  */
9
10 #include <vl.h>
11
12 #define KERNEL_ARGS_ADDR 0x100
13 #define KERNEL_LOAD_ADDR 0x00010000
14 #define INITRD_LOAD_ADDR 0x00800000
15
16 /* Stub functions for hardware that doesn't exist.  */
17 void pic_set_irq(int irq, int level)
18 {
19     cpu_abort (cpu_single_env, "pic_set_irq");
20 }
21
22 void pic_info(void)
23 {
24 }
25
26 void irq_info(void)
27 {
28 }
29
30 void vga_update_display(void)
31 {
32 }
33
34 void vga_screen_dump(const char *filename)
35 {
36 }
37
38 void vga_invalidate_display(void)
39 {
40 }
41
42 void DMA_run (void)
43 {
44 }
45
46 typedef struct {
47     uint32_t flash_offset;
48     uint32_t cm_osc;
49     uint32_t cm_ctrl;
50     uint32_t cm_lock;
51     uint32_t cm_auxosc;
52     uint32_t cm_sdram;
53     uint32_t cm_init;
54     uint32_t cm_flags;
55     uint32_t cm_nvflags;
56     uint32_t int_level;
57     uint32_t irq_enabled;
58     uint32_t fiq_enabled;
59 } integratorcm_state;
60
61 static uint8_t integrator_spd[128] = {
62    128, 8, 4, 11, 9, 1, 64, 0,  2, 0xa0, 0xa0, 0, 0, 8, 0, 1,
63    0xe, 4, 0x1c, 1, 2, 0x20, 0xc0, 0, 0, 0, 0, 0x30, 0x28, 0x30, 0x28, 0x40
64 };
65
66 static uint32_t integratorcm_read(void *opaque, target_phys_addr_t offset)
67 {
68     integratorcm_state *s = (integratorcm_state *)opaque;
69     offset -= 0x10000000;
70     if (offset >= 0x100 && offset < 0x200) {
71         /* CM_SPD */
72         if (offset >= 0x180)
73             return 0;
74         return integrator_spd[offset >> 2];
75     }
76     switch (offset >> 2) {
77     case 0: /* CM_ID */
78         return 0x411a3001;
79     case 1: /* CM_PROC */
80         return 0;
81     case 2: /* CM_OSC */
82         return s->cm_osc;
83     case 3: /* CM_CTRL */
84         return s->cm_ctrl;
85     case 4: /* CM_STAT */
86         return 0x00100000;
87     case 5: /* CM_LOCK */
88         if (s->cm_lock == 0xa05f) {
89             return 0x1a05f;
90         } else {
91             return s->cm_lock;
92         }
93     case 6: /* CM_LMBUSCNT */
94         /* ??? High frequency timer.  */
95         cpu_abort(cpu_single_env, "integratorcm_read: CM_LMBUSCNT");
96     case 7: /* CM_AUXOSC */
97         return s->cm_auxosc;
98     case 8: /* CM_SDRAM */
99         return s->cm_sdram;
100     case 9: /* CM_INIT */
101         return s->cm_init;
102     case 10: /* CM_REFCT */
103         /* ??? High frequency timer.  */
104         cpu_abort(cpu_single_env, "integratorcm_read: CM_REFCT");
105     case 12: /* CM_FLAGS */
106         return s->cm_flags;
107     case 14: /* CM_NVFLAGS */
108         return s->cm_nvflags;
109     case 16: /* CM_IRQ_STAT */
110         return s->int_level & s->irq_enabled;
111     case 17: /* CM_IRQ_RSTAT */
112         return s->int_level;
113     case 18: /* CM_IRQ_ENSET */
114         return s->irq_enabled;
115     case 20: /* CM_SOFT_INTSET */
116         return s->int_level & 1;
117     case 24: /* CM_FIQ_STAT */
118         return s->int_level & s->fiq_enabled;
119     case 25: /* CM_FIQ_RSTAT */
120         return s->int_level;
121     case 26: /* CM_FIQ_ENSET */
122         return s->fiq_enabled;
123     case 32: /* CM_VOLTAGE_CTL0 */
124     case 33: /* CM_VOLTAGE_CTL1 */
125     case 34: /* CM_VOLTAGE_CTL2 */
126     case 35: /* CM_VOLTAGE_CTL3 */
127         /* ??? Voltage control unimplemented.  */
128         return 0;
129     default:
130         cpu_abort (cpu_single_env,
131             "integratorcm_read: Unimplemented offset 0x%x\n", offset);
132         return 0;
133     }
134 }
135
136 static void integratorcm_do_remap(integratorcm_state *s, int flash)
137 {
138     if (flash) {
139         cpu_register_physical_memory(0, 0x100000, IO_MEM_RAM);
140     } else {
141         cpu_register_physical_memory(0, 0x100000, s->flash_offset | IO_MEM_RAM);
142     }
143     //??? tlb_flush (cpu_single_env, 1);
144 }
145
146 static void integratorcm_set_ctrl(integratorcm_state *s, uint32_t value)
147 {
148     if (value & 8) {
149         cpu_abort(cpu_single_env, "Board reset\n");
150     }
151     if ((s->cm_init ^ value) & 4) {
152         integratorcm_do_remap(s, (value & 4) == 0);
153     }
154     if ((s->cm_init ^ value) & 1) {
155         printf("Green LED %s\n", (value & 1) ? "on" : "off");
156     }
157     s->cm_init = (s->cm_init & ~ 5) | (value ^ 5);
158 }
159
160 static void integratorcm_update(integratorcm_state *s)
161 {
162     /* ??? The CPU irq/fiq is raised when either the core module or base PIC
163        are active.  */
164     if (s->int_level & (s->irq_enabled | s->fiq_enabled))
165         cpu_abort(cpu_single_env, "Core module interrupt\n");
166 }
167
168 static void integratorcm_write(void *opaque, target_phys_addr_t offset,
169                                uint32_t value)
170 {
171     integratorcm_state *s = (integratorcm_state *)opaque;
172     offset -= 0x10000000;
173     switch (offset >> 2) {
174     case 2: /* CM_OSC */
175         if (s->cm_lock == 0xa05f)
176             s->cm_osc = value;
177         break;
178     case 3: /* CM_CTRL */
179         integratorcm_set_ctrl(s, value);
180         break;
181     case 5: /* CM_LOCK */
182         s->cm_lock = value & 0xffff;
183         break;
184     case 7: /* CM_AUXOSC */
185         if (s->cm_lock == 0xa05f)
186             s->cm_auxosc = value;
187         break;
188     case 8: /* CM_SDRAM */
189         s->cm_sdram = value;
190         break;
191     case 9: /* CM_INIT */
192         /* ??? This can change the memory bus frequency.  */
193         s->cm_init = value;
194         break;
195     case 12: /* CM_FLAGSS */
196         s->cm_flags |= value;
197         break;
198     case 13: /* CM_FLAGSC */
199         s->cm_flags &= ~value;
200         break;
201     case 14: /* CM_NVFLAGSS */
202         s->cm_nvflags |= value;
203         break;
204     case 15: /* CM_NVFLAGSS */
205         s->cm_nvflags &= ~value;
206         break;
207     case 18: /* CM_IRQ_ENSET */
208         s->irq_enabled |= value;
209         integratorcm_update(s);
210         break;
211     case 19: /* CM_IRQ_ENCLR */
212         s->irq_enabled &= ~value;
213         integratorcm_update(s);
214         break;
215     case 20: /* CM_SOFT_INTSET */
216         s->int_level |= (value & 1);
217         integratorcm_update(s);
218         break;
219     case 21: /* CM_SOFT_INTCLR */
220         s->int_level &= ~(value & 1);
221         integratorcm_update(s);
222         break;
223     case 26: /* CM_FIQ_ENSET */
224         s->fiq_enabled |= value;
225         integratorcm_update(s);
226         break;
227     case 27: /* CM_FIQ_ENCLR */
228         s->fiq_enabled &= ~value;
229         integratorcm_update(s);
230         break;
231     case 32: /* CM_VOLTAGE_CTL0 */
232     case 33: /* CM_VOLTAGE_CTL1 */
233     case 34: /* CM_VOLTAGE_CTL2 */
234     case 35: /* CM_VOLTAGE_CTL3 */
235         /* ??? Voltage control unimplemented.  */
236         break;
237     default:
238         cpu_abort (cpu_single_env,
239             "integratorcm_write: Unimplemented offset 0x%x\n", offset);
240         break;
241     }
242 }
243
244 /* Integrator/CM control registers.  */
245
246 static CPUReadMemoryFunc *integratorcm_readfn[] = {
247    integratorcm_read,
248    integratorcm_read,
249    integratorcm_read
250 };
251
252 static CPUWriteMemoryFunc *integratorcm_writefn[] = {
253    integratorcm_write,
254    integratorcm_write,
255    integratorcm_write
256 };
257
258 static void integratorcm_init(int memsz, uint32_t flash_offset)
259 {
260     int iomemtype;
261     integratorcm_state *s;
262
263     s = (integratorcm_state *)qemu_mallocz(sizeof(integratorcm_state));
264     s->cm_osc = 0x01000048;
265     /* ??? What should the high bits of this value be?  */
266     s->cm_auxosc = 0x0007feff;
267     s->cm_sdram = 0x00011122;
268     if (memsz >= 256) {
269         integrator_spd[31] = 64;
270         s->cm_sdram |= 0x10;
271     } else if (memsz >= 128) {
272         integrator_spd[31] = 32;
273         s->cm_sdram |= 0x0c;
274     } else if (memsz >= 64) {
275         integrator_spd[31] = 16;
276         s->cm_sdram |= 0x08;
277     } else if (memsz >= 32) {
278         integrator_spd[31] = 4;
279         s->cm_sdram |= 0x04;
280     } else {
281         integrator_spd[31] = 2;
282     }
283     memcpy(integrator_spd + 73, "QEMU-MEMORY", 11);
284     s->cm_init = 0x00000112;
285     s->flash_offset = flash_offset;
286
287     iomemtype = cpu_register_io_memory(0, integratorcm_readfn,
288                                        integratorcm_writefn, s);
289     cpu_register_physical_memory(0x10000000, 0x007fffff, iomemtype);
290     integratorcm_do_remap(s, 1);
291     /* ??? Save/restore.  */
292 }
293
294 /* Integrator/CP hardware emulation.  */
295 /* Primary interrupt controller.  */
296
297 typedef struct icp_pic_state
298 {
299   uint32_t base;
300   uint32_t level;
301   uint32_t irq_enabled;
302   uint32_t fiq_enabled;
303   void *parent;
304   /* -1 if parent is a cpu, otherwise IRQ number on parent PIC.  */
305   int parent_irq;
306 } icp_pic_state;
307
308 static void icp_pic_update(icp_pic_state *s)
309 {
310     CPUState *env;
311     if (s->parent_irq != -1) {
312         uint32_t flags;
313
314         flags = (s->level & s->irq_enabled);
315         pic_set_irq_new(s->parent, s->parent_irq,
316                         flags != 0);
317         return;
318     }
319     /* Raise CPU interrupt.  */
320     env = (CPUState *)s->parent;
321     if (s->level & s->fiq_enabled) {
322         cpu_interrupt (env, CPU_INTERRUPT_FIQ);
323     } else {
324         cpu_reset_interrupt (env, CPU_INTERRUPT_FIQ);
325     }
326     if (s->level & s->irq_enabled) {
327       cpu_interrupt (env, CPU_INTERRUPT_HARD);
328     } else {
329       cpu_reset_interrupt (env, CPU_INTERRUPT_HARD);
330     }
331 }
332
333 void pic_set_irq_new(void *opaque, int irq, int level)
334 {
335     icp_pic_state *s = (icp_pic_state *)opaque;
336     if (level)
337         s->level |= 1 << irq;
338     else
339         s->level &= ~(1 << irq);
340     icp_pic_update(s);
341 }
342
343 static uint32_t icp_pic_read(void *opaque, target_phys_addr_t offset)
344 {
345     icp_pic_state *s = (icp_pic_state *)opaque;
346
347     offset -= s->base;
348     switch (offset >> 2) {
349     case 0: /* IRQ_STATUS */
350         return s->level & s->irq_enabled;
351     case 1: /* IRQ_RAWSTAT */
352         return s->level;
353     case 2: /* IRQ_ENABLESET */
354         return s->irq_enabled;
355     case 4: /* INT_SOFTSET */
356         return s->level & 1;
357     case 8: /* FRQ_STATUS */
358         return s->level & s->fiq_enabled;
359     case 9: /* FRQ_RAWSTAT */
360         return s->level;
361     case 10: /* FRQ_ENABLESET */
362         return s->fiq_enabled;
363     case 3: /* IRQ_ENABLECLR */
364     case 5: /* INT_SOFTCLR */
365     case 11: /* FRQ_ENABLECLR */
366     default:
367         printf ("icp_pic_read: Bad register offset 0x%x\n", offset);
368         return 0;
369     }
370 }
371
372 static void icp_pic_write(void *opaque, target_phys_addr_t offset,
373                           uint32_t value)
374 {
375     icp_pic_state *s = (icp_pic_state *)opaque;
376     offset -= s->base;
377
378     switch (offset >> 2) {
379     case 2: /* IRQ_ENABLESET */
380         s->irq_enabled |= value;
381         break;
382     case 3: /* IRQ_ENABLECLR */
383         s->irq_enabled &= ~value;
384         break;
385     case 4: /* INT_SOFTSET */
386         if (value & 1)
387             pic_set_irq_new(s, 0, 1);
388         break;
389     case 5: /* INT_SOFTCLR */
390         if (value & 1)
391             pic_set_irq_new(s, 0, 0);
392         break;
393     case 10: /* FRQ_ENABLESET */
394         s->fiq_enabled |= value;
395         break;
396     case 11: /* FRQ_ENABLECLR */
397         s->fiq_enabled &= ~value;
398         break;
399     case 0: /* IRQ_STATUS */
400     case 1: /* IRQ_RAWSTAT */
401     case 8: /* FRQ_STATUS */
402     case 9: /* FRQ_RAWSTAT */
403     default:
404         printf ("icp_pic_write: Bad register offset 0x%x\n", offset);
405         return;
406     }
407     icp_pic_update(s);
408 }
409
410 static CPUReadMemoryFunc *icp_pic_readfn[] = {
411    icp_pic_read,
412    icp_pic_read,
413    icp_pic_read
414 };
415
416 static CPUWriteMemoryFunc *icp_pic_writefn[] = {
417    icp_pic_write,
418    icp_pic_write,
419    icp_pic_write
420 };
421
422 static icp_pic_state *icp_pic_init(uint32_t base, void *parent,
423                                    int parent_irq)
424 {
425     icp_pic_state *s;
426     int iomemtype;
427
428     s = (icp_pic_state *)qemu_mallocz(sizeof(icp_pic_state));
429     if (!s)
430         return NULL;
431
432     s->base = base;
433     s->parent = parent;
434     s->parent_irq = parent_irq;
435     iomemtype = cpu_register_io_memory(0, icp_pic_readfn,
436                                        icp_pic_writefn, s);
437     cpu_register_physical_memory(base, 0x007fffff, iomemtype);
438     /* ??? Save/restore.  */
439     return s;
440 }
441
442 /* Timers.  */
443
444 /* System bus clock speed (40MHz) for timer 0.  Not sure about this value.  */
445 #define ICP_BUS_FREQ 40000000
446
447 typedef struct {
448     int64_t next_time;
449     int64_t expires[3];
450     int64_t loaded[3];
451     QEMUTimer *timer;
452     icp_pic_state *pic;
453     uint32_t base;
454     uint32_t control[3];
455     uint32_t count[3];
456     uint32_t limit[3];
457     int freq[3];
458     int int_level[3];
459 } icp_pit_state;
460
461 /* Calculate the new expiry time of the given timer.  */
462
463 static void icp_pit_reload(icp_pit_state *s, int n)
464 {
465     int64_t delay;
466
467     s->loaded[n] = s->expires[n];
468     delay = muldiv64(s->count[n], ticks_per_sec, s->freq[n]);
469     if (delay == 0)
470         delay = 1;
471     s->expires[n] += delay;
472 }
473
474 /* Check all active timers, and schedule the next timer interrupt.  */
475
476 static void icp_pit_update(icp_pit_state *s, int64_t now)
477 {
478     int n;
479     int64_t next;
480
481     next = now;
482     for (n = 0; n < 3; n++) {
483         /* Ignore disabled timers.  */
484         if ((s->control[n] & 0x80) == 0)
485             continue;
486         /* Ignore expired one-shot timers.  */
487         if (s->count[n] == 0 && s->control[n] & 1)
488             continue;
489         if (s->expires[n] - now <= 0) {
490             /* Timer has expired.  */
491             s->int_level[n] = 1;
492             if (s->control[n] & 1) {
493                 /* One-shot.  */
494                 s->count[n] = 0;
495             } else {
496                 if ((s->control[n] & 0x40) == 0) {
497                     /* Free running.  */
498                     if (s->control[n] & 2)
499                         s->count[n] = 0xffffffff;
500                     else
501                         s->count[n] = 0xffff;
502                 } else {
503                       /* Periodic.  */
504                       s->count[n] = s->limit[n];
505                 }
506             }
507         }
508         while (s->expires[n] - now <= 0) {
509             icp_pit_reload(s, n);
510         }
511     }
512     /* Update interrupts.  */
513     for (n = 0; n < 3; n++) {
514         if (s->int_level[n] && (s->control[n] & 0x20)) {
515             pic_set_irq_new(s->pic, 5 + n, 1);
516         } else {
517             pic_set_irq_new(s->pic, 5 + n, 0);
518         }
519         if (next - s->expires[n] < 0)
520             next = s->expires[n];
521     }
522     /* Schedule the next timer interrupt.  */
523     if (next == now) {
524         qemu_del_timer(s->timer);
525         s->next_time = 0;
526     } else if (next != s->next_time) {
527         qemu_mod_timer(s->timer, next);
528         s->next_time = next;
529     }
530 }
531
532 /* Return the current value of the timer.  */
533 static uint32_t icp_pit_getcount(icp_pit_state *s, int n, int64_t now)
534 {
535     int64_t elapsed;
536     int64_t period;
537
538     if (s->count[n] == 0)
539         return 0;
540     if ((s->control[n] & 0x80) == 0)
541         return s->count[n];
542     elapsed = now - s->loaded[n];
543     period = s->expires[n] - s->loaded[n];
544     /* If the timer should have expired then return 0.  This can happen
545        when the host timer signal doesnt occur immediately.  It's better to
546        have a timer appear to sit at zero for a while than have it wrap
547        around before the guest interrupt is raised.  */
548     /* ??? Could we trigger the interrupt here?  */
549     if (elapsed > period)
550         return 0;
551     /* We need to calculate count * elapsed / period without overfowing.
552        Scale both elapsed and period so they fit in a 32-bit int.  */
553     while (period != (int32_t)period) {
554         period >>= 1;
555         elapsed >>= 1;
556     }
557     return ((uint64_t)s->count[n] * (uint64_t)(int32_t)elapsed)
558             / (int32_t)period;
559 }
560
561 static uint32_t icp_pit_read(void *opaque, target_phys_addr_t offset)
562 {
563     int n;
564     icp_pit_state *s = (icp_pit_state *)opaque;
565
566     offset -= s->base;
567     n = offset >> 8;
568     if (n > 2)
569         cpu_abort (cpu_single_env, "icp_pit_read: Bad timer %x\n", offset);
570     switch ((offset & 0xff) >> 2) {
571     case 0: /* TimerLoad */
572     case 6: /* TimerBGLoad */
573         return s->limit[n];
574     case 1: /* TimerValue */
575         return icp_pit_getcount(s, n, qemu_get_clock(vm_clock));
576     case 2: /* TimerControl */
577         return s->control[n];
578     case 4: /* TimerRIS */
579         return s->int_level[n];
580     case 5: /* TimerMIS */
581         if ((s->control[n] & 0x20) == 0)
582             return 0;
583         return s->int_level[n];
584     default:
585         cpu_abort (cpu_single_env, "icp_pit_read: Bad offset %x\n", offset);
586         return 0;
587     }
588 }
589
590 static void icp_pit_write(void *opaque, target_phys_addr_t offset,
591                           uint32_t value)
592 {
593     icp_pit_state *s = (icp_pit_state *)opaque;
594     int n;
595     int64_t now;
596
597     now = qemu_get_clock(vm_clock);
598     offset -= s->base;
599     n = offset >> 8;
600     if (n > 2)
601         cpu_abort (cpu_single_env, "icp_pit_write: Bad offset %x\n", offset);
602
603     switch ((offset & 0xff) >> 2) {
604     case 0: /* TimerLoad */
605         s->limit[n] = value;
606         s->count[n] = value;
607         s->expires[n] = now;
608         icp_pit_reload(s, n);
609         break;
610     case 1: /* TimerValue */
611         /* ??? Linux seems to want to write to this readonly register.
612            Ignore it.  */
613         break;
614     case 2: /* TimerControl */
615         if (s->control[n] & 0x80) {
616             /* Pause the timer if it is running.  This may cause some
617                inaccuracy dure to rounding, but avoids a whole lot of other
618                messyness.  */
619             s->count[n] = icp_pit_getcount(s, n, now);
620         }
621         s->control[n] = value;
622         if (n == 0)
623             s->freq[n] = ICP_BUS_FREQ;
624         else
625             s->freq[n] = 1000000;
626         /* ??? Need to recalculate expiry time after changing divisor.  */
627         switch ((value >> 2) & 3) {
628         case 1: s->freq[n] >>= 4; break;
629         case 2: s->freq[n] >>= 8; break;
630         }
631         if (s->control[n] & 0x80) {
632             /* Restart the timer if still enabled.  */
633             s->expires[n] = now;
634             icp_pit_reload(s, n);
635         }
636         break;
637     case 3: /* TimerIntClr */
638         s->int_level[n] = 0;
639         break;
640     case 6: /* TimerBGLoad */
641         s->limit[n] = value;
642         break;
643     default:
644         cpu_abort (cpu_single_env, "icp_pit_write: Bad offset %x\n", offset);
645     }
646     icp_pit_update(s, now);
647 }
648
649 static void icp_pit_tick(void *opaque)
650 {
651     int64_t now;
652
653     now = qemu_get_clock(vm_clock);
654     icp_pit_update((icp_pit_state *)opaque, now);
655 }
656
657 static CPUReadMemoryFunc *icp_pit_readfn[] = {
658    icp_pit_read,
659    icp_pit_read,
660    icp_pit_read
661 };
662
663 static CPUWriteMemoryFunc *icp_pit_writefn[] = {
664    icp_pit_write,
665    icp_pit_write,
666    icp_pit_write
667 };
668
669 static void icp_pit_init(uint32_t base, icp_pic_state *pic)
670 {
671     int iomemtype;
672     icp_pit_state *s;
673     int n;
674
675     s = (icp_pit_state *)qemu_mallocz(sizeof(icp_pit_state));
676     s->base = base;
677     s->pic = pic;
678     s->freq[0] = ICP_BUS_FREQ;
679     s->freq[1] = 1000000;
680     s->freq[2] = 1000000;
681     for (n = 0; n < 3; n++) {
682         s->control[n] = 0x20;
683         s->count[n] = 0xffffffff;
684     }
685
686     iomemtype = cpu_register_io_memory(0, icp_pit_readfn,
687                                        icp_pit_writefn, s);
688     cpu_register_physical_memory(base, 0x007fffff, iomemtype);
689     s->timer = qemu_new_timer(vm_clock, icp_pit_tick, s);
690     /* ??? Save/restore.  */
691 }
692
693 /* ARM PrimeCell PL011 UART */
694
695 typedef struct {
696     uint32_t base;
697     uint32_t readbuff;
698     uint32_t flags;
699     uint32_t lcr;
700     uint32_t cr;
701     uint32_t dmacr;
702     uint32_t int_enabled;
703     uint32_t int_level;
704     uint32_t read_fifo[16];
705     uint32_t ilpr;
706     uint32_t ibrd;
707     uint32_t fbrd;
708     uint32_t ifl;
709     int read_pos;
710     int read_count;
711     int read_trigger;
712     CharDriverState *chr;
713     icp_pic_state *pic;
714     int irq;
715 } pl011_state;
716
717 #define PL011_INT_TX 0x20
718 #define PL011_INT_RX 0x10
719
720 #define PL011_FLAG_TXFE 0x80
721 #define PL011_FLAG_RXFF 0x40
722 #define PL011_FLAG_TXFF 0x20
723 #define PL011_FLAG_RXFE 0x10
724
725 static const unsigned char pl011_id[] =
726 { 0x11, 0x10, 0x14, 0x00, 0x0d, 0xf0, 0x05, 0xb1 };
727
728 static void pl011_update(pl011_state *s)
729 {
730     uint32_t flags;
731     
732     flags = s->int_level & s->int_enabled;
733     pic_set_irq_new(s->pic, s->irq, flags != 0);
734 }
735
736 static uint32_t pl011_read(void *opaque, target_phys_addr_t offset)
737 {
738     pl011_state *s = (pl011_state *)opaque;
739     uint32_t c;
740
741     offset -= s->base;
742     if (offset >= 0xfe0 && offset < 0x1000) {
743         return pl011_id[(offset - 0xfe0) >> 2];
744     }
745     switch (offset >> 2) {
746     case 0: /* UARTDR */
747         s->flags &= ~PL011_FLAG_RXFF;
748         c = s->read_fifo[s->read_pos];
749         if (s->read_count > 0) {
750             s->read_count--;
751             if (++s->read_pos == 16)
752                 s->read_pos = 0;
753         }
754         if (s->read_count == 0) {
755             s->flags |= PL011_FLAG_RXFE;
756         }
757         if (s->read_count == s->read_trigger - 1)
758             s->int_level &= ~ PL011_INT_RX;
759         pl011_update(s);
760         return c;
761     case 1: /* UARTCR */
762         return 0;
763     case 6: /* UARTFR */
764         return s->flags;
765     case 8: /* UARTILPR */
766         return s->ilpr;
767     case 9: /* UARTIBRD */
768         return s->ibrd;
769     case 10: /* UARTFBRD */
770         return s->fbrd;
771     case 11: /* UARTLCR_H */
772         return s->lcr;
773     case 12: /* UARTCR */
774         return s->cr;
775     case 13: /* UARTIFLS */
776         return s->ifl;
777     case 14: /* UARTIMSC */
778         return s->int_enabled;
779     case 15: /* UARTRIS */
780         return s->int_level;
781     case 16: /* UARTMIS */
782         return s->int_level & s->int_enabled;
783     case 18: /* UARTDMACR */
784         return s->dmacr;
785     default:
786         cpu_abort (cpu_single_env, "pl011_read: Bad offset %x\n", offset);
787         return 0;
788     }
789 }
790
791 static void pl011_set_read_trigger(pl011_state *s)
792 {
793 #if 0
794     /* The docs say the RX interrupt is triggered when the FIFO exceeds
795        the threshold.  However linux only reads the FIFO in response to an
796        interrupt.  Triggering the interrupt when the FIFO is non-empty seems
797        to make things work.  */
798     if (s->lcr & 0x10)
799         s->read_trigger = (s->ifl >> 1) & 0x1c;
800     else
801 #endif
802         s->read_trigger = 1;
803 }
804
805 static void pl011_write(void *opaque, target_phys_addr_t offset,
806                           uint32_t value)
807 {
808     pl011_state *s = (pl011_state *)opaque;
809     unsigned char ch;
810
811     offset -= s->base;
812     switch (offset >> 2) {
813     case 0: /* UARTDR */
814         /* ??? Check if transmitter is enabled.  */
815         ch = value;
816         if (s->chr)
817             qemu_chr_write(s->chr, &ch, 1);
818         s->int_level |= PL011_INT_TX;
819         pl011_update(s);
820         break;
821     case 1: /* UARTCR */
822         s->cr = value;
823         break;
824     case 8: /* UARTUARTILPR */
825         s->ilpr = value;
826         break;
827     case 9: /* UARTIBRD */
828         s->ibrd = value;
829         break;
830     case 10: /* UARTFBRD */
831         s->fbrd = value;
832         break;
833     case 11: /* UARTLCR_H */
834         s->lcr = value;
835         pl011_set_read_trigger(s);
836         break;
837     case 12: /* UARTCR */
838         /* ??? Need to implement the enable and loopback bits.  */
839         s->cr = value;
840         break;
841     case 13: /* UARTIFS */
842         s->ifl = value;
843         pl011_set_read_trigger(s);
844         break;
845     case 14: /* UARTIMSC */
846         s->int_enabled = value;
847         pl011_update(s);
848         break;
849     case 17: /* UARTICR */
850         s->int_level &= ~value;
851         pl011_update(s);
852         break;
853     case 18: /* UARTDMACR */
854         s->dmacr = value;
855         if (value & 3)
856             cpu_abort(cpu_single_env, "PL011: DMA not implemented\n");
857         break;
858     default:
859         cpu_abort (cpu_single_env, "pl011_write: Bad offset %x\n", offset);
860     }
861 }
862
863 static int pl011_can_recieve(void *opaque)
864 {
865     pl011_state *s = (pl011_state *)opaque;
866
867     if (s->lcr & 0x10)
868         return s->read_count < 16;
869     else
870         return s->read_count < 1;
871 }
872
873 static void pl011_recieve(void *opaque, const uint8_t *buf, int size)
874 {
875     pl011_state *s = (pl011_state *)opaque;
876     int slot;
877
878     slot = s->read_pos + s->read_count;
879     if (slot >= 16)
880         slot -= 16;
881     s->read_fifo[slot] = *buf;
882     s->read_count++;
883     s->flags &= ~PL011_FLAG_RXFE;
884     if (s->cr & 0x10 || s->read_count == 16) {
885         s->flags |= PL011_FLAG_RXFF;
886     }
887     if (s->read_count == s->read_trigger) {
888         s->int_level |= PL011_INT_RX;
889         pl011_update(s);
890     }
891 }
892
893 static void pl011_event(void *opaque, int event)
894 {
895     /* ??? Should probably implement break.  */
896 }
897
898 static CPUReadMemoryFunc *pl011_readfn[] = {
899    pl011_read,
900    pl011_read,
901    pl011_read
902 };
903
904 static CPUWriteMemoryFunc *pl011_writefn[] = {
905    pl011_write,
906    pl011_write,
907    pl011_write
908 };
909
910 static void pl011_init(uint32_t base, icp_pic_state *pic, int irq,
911                        CharDriverState *chr)
912 {
913     int iomemtype;
914     pl011_state *s;
915
916     s = (pl011_state *)qemu_mallocz(sizeof(pl011_state));
917     iomemtype = cpu_register_io_memory(0, pl011_readfn,
918                                        pl011_writefn, s);
919     cpu_register_physical_memory(base, 0x007fffff, iomemtype);
920     s->base = base;
921     s->pic = pic;
922     s->irq = irq;
923     s->chr = chr;
924     s->read_trigger = 1;
925     s->ifl = 0x12;
926     s->cr = 0x300;
927     s->flags = 0x90;
928     if (chr){ 
929         qemu_chr_add_read_handler(chr, pl011_can_recieve, pl011_recieve, s);
930         qemu_chr_add_event_handler(chr, pl011_event);
931     }
932     /* ??? Save/restore.  */
933 }
934
935 /* CP control registers.  */
936 typedef struct {
937     uint32_t base;
938 } icp_control_state;
939
940 static uint32_t icp_control_read(void *opaque, target_phys_addr_t offset)
941 {
942     icp_control_state *s = (icp_control_state *)opaque;
943     offset -= s->base;
944     switch (offset >> 2) {
945     case 0: /* CP_IDFIELD */
946         return 0x41034003;
947     case 1: /* CP_FLASHPROG */
948         return 0;
949     case 2: /* CP_INTREG */
950         return 0;
951     case 3: /* CP_DECODE */
952         return 0x11;
953     default:
954         cpu_abort (cpu_single_env, "icp_control_read: Bad offset %x\n", offset);
955         return 0;
956     }
957 }
958
959 static void icp_control_write(void *opaque, target_phys_addr_t offset,
960                           uint32_t value)
961 {
962     icp_control_state *s = (icp_control_state *)opaque;
963     offset -= s->base;
964     switch (offset >> 2) {
965     case 1: /* CP_FLASHPROG */
966     case 2: /* CP_INTREG */
967     case 3: /* CP_DECODE */
968         /* Nothing interesting implemented yet.  */
969         break;
970     default:
971         cpu_abort (cpu_single_env, "icp_control_write: Bad offset %x\n", offset);
972     }
973 }
974 static CPUReadMemoryFunc *icp_control_readfn[] = {
975    icp_control_read,
976    icp_control_read,
977    icp_control_read
978 };
979
980 static CPUWriteMemoryFunc *icp_control_writefn[] = {
981    icp_control_write,
982    icp_control_write,
983    icp_control_write
984 };
985
986 static void icp_control_init(uint32_t base)
987 {
988     int iomemtype;
989     icp_control_state *s;
990
991     s = (icp_control_state *)qemu_mallocz(sizeof(icp_control_state));
992     iomemtype = cpu_register_io_memory(0, icp_control_readfn,
993                                        icp_control_writefn, s);
994     cpu_register_physical_memory(base, 0x007fffff, iomemtype);
995     s->base = base;
996     /* ??? Save/restore.  */
997 }
998
999
1000 /* Keyboard/Mouse Interface.  */
1001
1002 typedef struct {
1003     void *dev;
1004     uint32_t base;
1005     uint32_t cr;
1006     uint32_t clk;
1007     uint32_t last;
1008     icp_pic_state *pic;
1009     int pending;
1010     int irq;
1011     int is_mouse;
1012 } icp_kmi_state;
1013
1014 static void icp_kmi_update(void *opaque, int level)
1015 {
1016     icp_kmi_state *s = (icp_kmi_state *)opaque;
1017     int raise;
1018
1019     s->pending = level;
1020     raise = (s->pending && (s->cr & 0x10) != 0)
1021             || (s->cr & 0x08) != 0;
1022     pic_set_irq_new(s->pic, s->irq, raise);
1023 }
1024
1025 static uint32_t icp_kmi_read(void *opaque, target_phys_addr_t offset)
1026 {
1027     icp_kmi_state *s = (icp_kmi_state *)opaque;
1028     offset -= s->base;
1029     if (offset >= 0xfe0 && offset < 0x1000)
1030         return 0;
1031
1032     switch (offset >> 2) {
1033     case 0: /* KMICR */
1034         return s->cr;
1035     case 1: /* KMISTAT */
1036         /* KMIC and KMID bits not implemented.  */
1037         if (s->pending) {
1038             return 0x10;
1039         } else {
1040             return 0;
1041         }
1042     case 2: /* KMIDATA */
1043         if (s->pending)
1044             s->last = ps2_read_data(s->dev);
1045         return s->last;
1046     case 3: /* KMICLKDIV */
1047         return s->clk;
1048     case 4: /* KMIIR */
1049         return s->pending | 2;
1050     default:
1051         cpu_abort (cpu_single_env, "icp_kmi_read: Bad offset %x\n", offset);
1052         return 0;
1053     }
1054 }
1055
1056 static void icp_kmi_write(void *opaque, target_phys_addr_t offset,
1057                           uint32_t value)
1058 {
1059     icp_kmi_state *s = (icp_kmi_state *)opaque;
1060     offset -= s->base;
1061     switch (offset >> 2) {
1062     case 0: /* KMICR */
1063         s->cr = value;
1064         icp_kmi_update(s, s->pending);
1065         /* ??? Need to implement the enable/disable bit.  */
1066         break;
1067     case 2: /* KMIDATA */
1068         /* ??? This should toggle the TX interrupt line.  */
1069         /* ??? This means kbd/mouse can block each other.  */
1070         if (s->is_mouse) {
1071             ps2_write_mouse(s->dev, value);
1072         } else {
1073             ps2_write_keyboard(s->dev, value);
1074         }
1075         break;
1076     case 3: /* KMICLKDIV */
1077         s->clk = value;
1078         return;
1079     default:
1080         cpu_abort (cpu_single_env, "icp_kmi_write: Bad offset %x\n", offset);
1081     }
1082 }
1083 static CPUReadMemoryFunc *icp_kmi_readfn[] = {
1084    icp_kmi_read,
1085    icp_kmi_read,
1086    icp_kmi_read
1087 };
1088
1089 static CPUWriteMemoryFunc *icp_kmi_writefn[] = {
1090    icp_kmi_write,
1091    icp_kmi_write,
1092    icp_kmi_write
1093 };
1094
1095 static void icp_kmi_init(uint32_t base, icp_pic_state * pic, int irq,
1096                          int is_mouse)
1097 {
1098     int iomemtype;
1099     icp_kmi_state *s;
1100
1101     s = (icp_kmi_state *)qemu_mallocz(sizeof(icp_kmi_state));
1102     iomemtype = cpu_register_io_memory(0, icp_kmi_readfn,
1103                                        icp_kmi_writefn, s);
1104     cpu_register_physical_memory(base, 0x007fffff, iomemtype);
1105     s->base = base;
1106     s->pic = pic;
1107     s->irq = irq;
1108     s->is_mouse = is_mouse;
1109     if (is_mouse)
1110         s->dev = ps2_mouse_init(icp_kmi_update, s);
1111     else
1112         s->dev = ps2_kbd_init(icp_kmi_update, s);
1113     /* ??? Save/restore.  */
1114 }
1115
1116 /* The worlds second smallest bootloader.  Set r0-r2, then jump to kernel.  */
1117 static uint32_t bootloader[] = {
1118   0xe3a00000, /* mov     r0, #0 */
1119   0xe3a01013, /* mov     r1, #0x13 */
1120   0xe3811c01, /* orr     r1, r1, #0x100 */
1121   0xe59f2000, /* ldr     r2, [pc, #0] */
1122   0xe59ff000, /* ldr     pc, [pc, #0] */
1123   0, /* Address of kernel args.  Set by integratorcp_init.  */
1124   0  /* Kernel entry point.  Set by integratorcp_init.  */
1125 };
1126
1127 static void set_kernel_args(uint32_t ram_size, int initrd_size,
1128                             const char *kernel_cmdline)
1129 {
1130     uint32_t *p;
1131
1132     p = (uint32_t *)(phys_ram_base + KERNEL_ARGS_ADDR);
1133     /* ATAG_CORE */
1134     *(p++) = 5;
1135     *(p++) = 0x54410001;
1136     *(p++) = 1;
1137     *(p++) = 0x1000;
1138     *(p++) = 0;
1139     /* ATAG_MEM */
1140     *(p++) = 4;
1141     *(p++) = 0x54410002;
1142     *(p++) = ram_size;
1143     *(p++) = 0;
1144     if (initrd_size) {
1145         /* ATAG_INITRD2 */
1146         *(p++) = 4;
1147         *(p++) = 0x54420005;
1148         *(p++) = INITRD_LOAD_ADDR;
1149         *(p++) = initrd_size;
1150     }
1151     if (kernel_cmdline && *kernel_cmdline) {
1152         /* ATAG_CMDLINE */
1153         int cmdline_size;
1154
1155         cmdline_size = strlen(kernel_cmdline);
1156         memcpy (p + 2, kernel_cmdline, cmdline_size + 1);
1157         cmdline_size = (cmdline_size >> 2) + 1;
1158         *(p++) = cmdline_size + 2;
1159         *(p++) = 0x54410009;
1160         p += cmdline_size;
1161     }
1162     /* ATAG_END */
1163     *(p++) = 0;
1164     *(p++) = 0;
1165 }
1166
1167 /* Board init.  */
1168
1169 static void integratorcp_init(int ram_size, int vga_ram_size, int boot_device,
1170                      DisplayState *ds, const char **fd_filename, int snapshot,
1171                      const char *kernel_filename, const char *kernel_cmdline,
1172                      const char *initrd_filename)
1173 {
1174     CPUState *env;
1175     uint32_t bios_offset;
1176     icp_pic_state *pic;
1177     int kernel_size;
1178     int initrd_size;
1179
1180     env = cpu_init();
1181     bios_offset = ram_size + vga_ram_size;
1182     /* ??? On a real system the first 1Mb is mapped as SSRAM or boot flash.  */
1183     /* ??? RAM shoud repeat to fill physical memory space.  */
1184     /* SDRAM at address zero*/
1185     cpu_register_physical_memory(0, ram_size, IO_MEM_RAM);
1186     /* And again at address 0x80000000 */
1187     cpu_register_physical_memory(0x80000000, ram_size, IO_MEM_RAM);
1188
1189     integratorcm_init(ram_size >> 20, bios_offset);
1190     pic = icp_pic_init(0x14000000, env, -1);
1191     icp_pic_init(0xca000000, pic, 26);
1192     icp_pit_init(0x13000000, pic);
1193     pl011_init(0x16000000, pic, 1, serial_hds[0]);
1194     pl011_init(0x17000000, pic, 2, serial_hds[1]);
1195     icp_control_init(0xcb000000);
1196     icp_kmi_init(0x18000000, pic, 3, 0);
1197     icp_kmi_init(0x19000000, pic, 4, 1);
1198     if (nd_table[0].vlan) {
1199         if (nd_table[0].model == NULL
1200             || strcmp(nd_table[0].model, "smc91c111") == 0) {
1201             smc91c111_init(&nd_table[0], 0xc8000000, pic, 27);
1202         } else {
1203             fprintf(stderr, "qemu: Unsupported NIC: %s\n", nd_table[0].model);
1204             exit (1);
1205         }
1206     }
1207
1208     /* Load the kernel.  */
1209     if (!kernel_filename) {
1210         fprintf(stderr, "Kernel image must be specified\n");
1211         exit(1);
1212     }
1213     kernel_size = load_image(kernel_filename,
1214                              phys_ram_base + KERNEL_LOAD_ADDR);
1215     if (kernel_size < 0) {
1216         fprintf(stderr, "qemu: could not load kernel '%s'\n", kernel_filename);
1217         exit(1);
1218     }
1219     if (initrd_filename) {
1220         initrd_size = load_image(initrd_filename,
1221                                  phys_ram_base + INITRD_LOAD_ADDR);
1222         if (initrd_size < 0) {
1223             fprintf(stderr, "qemu: could not load initrd '%s'\n",
1224                     initrd_filename);
1225             exit(1);
1226         }
1227     } else {
1228         initrd_size = 0;
1229     }
1230     bootloader[5] = KERNEL_ARGS_ADDR;
1231     bootloader[6] = KERNEL_LOAD_ADDR;
1232     memcpy(phys_ram_base, bootloader, sizeof(bootloader));
1233     set_kernel_args(ram_size, initrd_size, kernel_cmdline);
1234 }
1235
1236 QEMUMachine integratorcp_machine = {
1237     "integratorcp",
1238     "ARM Integrator/CP",
1239     integratorcp_init,
1240 };