2 * PXA270-based Intel Mainstone platforms.
4 * Copyright (c) 2007 by Armin Kuster <akuster@kama-aina.net> or
7 * Code based on spitz platform by Andrzej Zaborowski <balrog@zabor.org>
9 * This code is licensed under the GNU GPL v2.
18 #define MST_ETH_PHYS 0x10000300
19 #define MST_FPGA_PHYS 0x08000000
21 /* Mainstone FPGA for extern irqs */
22 #define FPGA_GPIO_PIN 0
23 #define MST_NUM_IRQS 16
24 #define MST_BASE MST_FPGA_PHYS
25 #define MST_LEDDAT1 0x10
26 #define MST_LEDDAT2 0x14
27 #define MST_LEDCTRL 0x40
28 #define MST_GPSWR 0x60
29 #define MST_MSCWR1 0x80
30 #define MST_MSCWR2 0x84
31 #define MST_MSCWR3 0x88
32 #define MST_MSCRD 0x90
33 #define MST_INTMSKENA 0xc0
34 #define MST_INTSETCLR 0xd0
35 #define MST_PCMCIA0 0xe0
36 #define MST_PCMCIA1 0xe4
39 #define ETHERNET_IRQ 3
41 typedef struct mst_irq_state
{
42 target_phys_addr_t target_base
;
62 mst_fpga_update_gpio(mst_irq_state
*s
)
66 level
= s
->prev_level
^ s
->intsetclr
;
68 for (diff
= s
->prev_level
^ level
; diff
; diff
^= 1 << bit
) {
70 qemu_set_irq(s
->pins
[bit
], (level
>> bit
) & 1 );
72 s
->prev_level
= level
;
76 mst_fpga_set_irq(void *opaque
, int irq
, int level
)
78 mst_irq_state
*s
= (mst_irq_state
*)opaque
;
81 s
->prev_level
|= 1u << irq
;
83 s
->prev_level
&= ~(1u << irq
);
85 if(s
->intmskena
& (1u << irq
)) {
86 s
->intsetclr
= 1u << irq
;
87 qemu_set_irq(s
->parent
[0], level
);
92 mst_fpga_readb(void *opaque
, target_phys_addr_t addr
)
94 mst_irq_state
*s
= (mst_irq_state
*) opaque
;
95 addr
-= s
->target_base
;
123 printf("Mainstone - mst_fpga_readb: Bad register offset "
124 REG_FMT
" \n", addr
);
130 mst_fpga_writeb(void *opaque
, target_phys_addr_t addr
, uint32_t value
)
132 mst_irq_state
*s
= (mst_irq_state
*) opaque
;
133 addr
-= s
->target_base
;
161 case MST_INTMSKENA
: /* Mask interupt */
162 s
->intmskena
= (value
& 0xFEEFF);
163 mst_fpga_update_gpio(s
);
165 case MST_INTSETCLR
: /* clear or set interrupt */
166 s
->intsetclr
= (value
& 0xFEEFF);
175 printf("Mainstone - mst_fpga_writeb: Bad register offset "
176 REG_FMT
" \n", addr
);
180 CPUReadMemoryFunc
*mst_fpga_readfn
[] = {
185 CPUWriteMemoryFunc
*mst_fpga_writefn
[] = {
192 mst_fpga_save(QEMUFile
*f
, void *opaque
)
194 struct mst_irq_state
*s
= (mst_irq_state
*) opaque
;
196 qemu_put_be32s(f
, &s
->prev_level
);
197 qemu_put_be32s(f
, &s
->leddat1
);
198 qemu_put_be32s(f
, &s
->leddat2
);
199 qemu_put_be32s(f
, &s
->ledctrl
);
200 qemu_put_be32s(f
, &s
->gpswr
);
201 qemu_put_be32s(f
, &s
->mscwr1
);
202 qemu_put_be32s(f
, &s
->mscwr2
);
203 qemu_put_be32s(f
, &s
->mscwr3
);
204 qemu_put_be32s(f
, &s
->mscrd
);
205 qemu_put_be32s(f
, &s
->intmskena
);
206 qemu_put_be32s(f
, &s
->intsetclr
);
207 qemu_put_be32s(f
, &s
->pcmcia0
);
208 qemu_put_be32s(f
, &s
->pcmcia1
);
212 mst_fpga_load(QEMUFile
*f
, void *opaque
, int version_id
)
214 mst_irq_state
*s
= (mst_irq_state
*) opaque
;
216 qemu_get_be32s(f
, &s
->prev_level
);
217 qemu_get_be32s(f
, &s
->leddat1
);
218 qemu_get_be32s(f
, &s
->leddat2
);
219 qemu_get_be32s(f
, &s
->ledctrl
);
220 qemu_get_be32s(f
, &s
->gpswr
);
221 qemu_get_be32s(f
, &s
->mscwr1
);
222 qemu_get_be32s(f
, &s
->mscwr2
);
223 qemu_get_be32s(f
, &s
->mscwr3
);
224 qemu_get_be32s(f
, &s
->mscrd
);
225 qemu_get_be32s(f
, &s
->intmskena
);
226 qemu_get_be32s(f
, &s
->intsetclr
);
227 qemu_get_be32s(f
, &s
->pcmcia0
);
228 qemu_get_be32s(f
, &s
->pcmcia1
);
233 *mst_irq_init(struct pxa2xx_state_s
*cpu
, uint32_t base
, int irq
)
239 s
= (mst_irq_state
*) qemu_mallocz(sizeof(mst_irq_state
));
243 s
->target_base
= base
;
244 s
->parent
= &cpu
->pic
[irq
];
246 /* alloc the external 16 irqs */
247 qi
= qemu_allocate_irqs(mst_fpga_set_irq
, s
, MST_NUM_IRQS
);
250 iomemtype
= cpu_register_io_memory(0, mst_fpga_readfn
,
251 mst_fpga_writefn
, s
);
252 cpu_register_physical_memory(MST_BASE
, 0x00100000, iomemtype
);
253 register_savevm("mainstone_fpga", 0, 0, mst_fpga_save
, mst_fpga_load
, s
);
257 enum mainstone_model_e
{ mainstone
};
259 static void mainstone_common_init(int ram_size
, int vga_ram_size
,
260 DisplayState
*ds
, const char *kernel_filename
,
261 const char *kernel_cmdline
, const char *initrd_filename
,
262 const char *cpu_model
, enum mainstone_model_e model
, int arm_id
)
264 uint32_t mainstone_ram
= 0x04000000;
265 uint32_t mainstone_rom
= 0x00800000;
266 struct pxa2xx_state_s
*cpu
;
270 cpu_model
= "pxa270-c5";
272 /* Setup CPU & memory */
273 if (ram_size
< mainstone_ram
+ mainstone_rom
+ PXA2XX_INTERNAL_SIZE
) {
274 fprintf(stderr
, "This platform requires %i bytes of memory\n",
275 mainstone_ram
+ mainstone_rom
+ PXA2XX_INTERNAL_SIZE
);
279 cpu
= pxa270_init(mainstone_ram
, ds
, cpu_model
);
280 cpu_register_physical_memory(0, mainstone_rom
,
281 qemu_ram_alloc(mainstone_rom
) | IO_MEM_ROM
);
283 /* Setup initial (reset) machine state */
284 cpu
->env
->regs
[15] = PXA2XX_SDRAM_BASE
;
286 mst_irq
= mst_irq_init(cpu
, MST_BASE
, PXA2XX_PIC_GPIO_0
);
287 smc91c111_init(&nd_table
[0], MST_ETH_PHYS
, mst_irq
[ETHERNET_IRQ
]);
289 arm_load_kernel(cpu
->env
, mainstone_ram
, kernel_filename
, kernel_cmdline
,
290 initrd_filename
, arm_id
, PXA2XX_SDRAM_BASE
);
293 static void mainstone_init(int ram_size
, int vga_ram_size
,
294 const char *boot_device
, DisplayState
*ds
,
295 const char *kernel_filename
, const char *kernel_cmdline
,
296 const char *initrd_filename
, const char *cpu_model
)
298 mainstone_common_init(ram_size
, vga_ram_size
, ds
, kernel_filename
,
299 kernel_cmdline
, initrd_filename
, cpu_model
, mainstone
, 0x196);
302 QEMUMachine mainstone2_machine
= {
304 "Mainstone II (PXA27x)",