Commit 827df9f3c5fdea53531acf02b2db0afb9858f053

Authored by balrog
1 parent f93eb9ff

Add basic OMAP2 chip support.

Add the OMAP242x (arm1136 core) initialisation with basic on-chip
peripherals and update OMAP1 peripherals which are re-used in OMAP2.
Make palmte.c and sd.c errors go to stderr.
Allow disabling SD chipselect.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4213 c046a42c-6fe2-441c-8c8c-71466251a162

Too many changes to show.

To preserve performance only 3 of 14 files are displayed.

Makefile.target
@@ -610,6 +610,7 @@ OBJS+= pxa2xx_lcd.o pxa2xx_mmci.o pxa2xx_pcmcia.o pxa2xx_keypad.o @@ -610,6 +610,7 @@ OBJS+= pxa2xx_lcd.o pxa2xx_mmci.o pxa2xx_pcmcia.o pxa2xx_keypad.o
610 OBJS+= pflash_cfi01.o gumstix.o 610 OBJS+= pflash_cfi01.o gumstix.o
611 OBJS+= spitz.o ide.o serial.o nand.o ecc.o 611 OBJS+= spitz.o ide.o serial.o nand.o ecc.o
612 OBJS+= omap1.o omap_lcdc.o omap_dma.o omap_clk.o omap_mmc.o omap_i2c.o 612 OBJS+= omap1.o omap_lcdc.o omap_dma.o omap_clk.o omap_mmc.o omap_i2c.o
  613 +OBJS+= omap2.o omap_dss.o
613 OBJS+= palm.o tsc210x.o 614 OBJS+= palm.o tsc210x.o
614 OBJS+= mst_fpga.o mainstone.o 615 OBJS+= mst_fpga.o mainstone.o
615 CPPFLAGS += -DHAS_AUDIO 616 CPPFLAGS += -DHAS_AUDIO
hw/omap.h
@@ -5,8 +5,8 @@ @@ -5,8 +5,8 @@
5 * 5 *
6 * This program is free software; you can redistribute it and/or 6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as 7 * modify it under the terms of the GNU General Public License as
8 - * published by the Free Software Foundation; either version 2 of  
9 - * the License, or (at your option) any later version. 8 + * published by the Free Software Foundation; either version 2 or
  9 + * (at your option) version 3 of the License.
10 * 10 *
11 * This program is distributed in the hope that it will be useful, 11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -22,6 +22,7 @@ @@ -22,6 +22,7 @@
22 # define hw_omap_h "omap.h" 22 # define hw_omap_h "omap.h"
23 23
24 # define OMAP_EMIFS_BASE 0x00000000 24 # define OMAP_EMIFS_BASE 0x00000000
  25 +# define OMAP2_Q0_BASE 0x00000000
25 # define OMAP_CS0_BASE 0x00000000 26 # define OMAP_CS0_BASE 0x00000000
26 # define OMAP_CS1_BASE 0x04000000 27 # define OMAP_CS1_BASE 0x04000000
27 # define OMAP_CS2_BASE 0x08000000 28 # define OMAP_CS2_BASE 0x08000000
@@ -29,18 +30,26 @@ @@ -29,18 +30,26 @@
29 # define OMAP_EMIFF_BASE 0x10000000 30 # define OMAP_EMIFF_BASE 0x10000000
30 # define OMAP_IMIF_BASE 0x20000000 31 # define OMAP_IMIF_BASE 0x20000000
31 # define OMAP_LOCALBUS_BASE 0x30000000 32 # define OMAP_LOCALBUS_BASE 0x30000000
  33 +# define OMAP2_Q1_BASE 0x40000000
  34 +# define OMAP2_L4_BASE 0x48000000
  35 +# define OMAP2_SRAM_BASE 0x40200000
  36 +# define OMAP2_L3_BASE 0x68000000
  37 +# define OMAP2_Q2_BASE 0x80000000
  38 +# define OMAP2_Q3_BASE 0xc0000000
32 # define OMAP_MPUI_BASE 0xe1000000 39 # define OMAP_MPUI_BASE 0xe1000000
33 40
34 # define OMAP730_SRAM_SIZE 0x00032000 41 # define OMAP730_SRAM_SIZE 0x00032000
35 # define OMAP15XX_SRAM_SIZE 0x00030000 42 # define OMAP15XX_SRAM_SIZE 0x00030000
36 # define OMAP16XX_SRAM_SIZE 0x00004000 43 # define OMAP16XX_SRAM_SIZE 0x00004000
37 # define OMAP1611_SRAM_SIZE 0x0003e800 44 # define OMAP1611_SRAM_SIZE 0x0003e800
  45 +# define OMAP242X_SRAM_SIZE 0x000a0000
  46 +# define OMAP243X_SRAM_SIZE 0x00010000
38 # define OMAP_CS0_SIZE 0x04000000 47 # define OMAP_CS0_SIZE 0x04000000
39 # define OMAP_CS1_SIZE 0x04000000 48 # define OMAP_CS1_SIZE 0x04000000
40 # define OMAP_CS2_SIZE 0x04000000 49 # define OMAP_CS2_SIZE 0x04000000
41 # define OMAP_CS3_SIZE 0x04000000 50 # define OMAP_CS3_SIZE 0x04000000
42 51
43 -/* omap1_clk.c */ 52 +/* omap_clk.c */
44 struct omap_mpu_state_s; 53 struct omap_mpu_state_s;
45 typedef struct clk *omap_clk; 54 typedef struct clk *omap_clk;
46 omap_clk omap_findclk(struct omap_mpu_state_s *mpu, const char *name); 55 omap_clk omap_findclk(struct omap_mpu_state_s *mpu, const char *name);
@@ -55,14 +64,41 @@ int64_t omap_clk_getrate(omap_clk clk); @@ -55,14 +64,41 @@ int64_t omap_clk_getrate(omap_clk clk);
55 void omap_clk_reparent(omap_clk clk, omap_clk parent); 64 void omap_clk_reparent(omap_clk clk, omap_clk parent);
56 65
57 /* omap[123].c */ 66 /* omap[123].c */
  67 +struct omap_l4_s;
  68 +struct omap_l4_s *omap_l4_init(target_phys_addr_t base, int ta_num);
  69 +
  70 +struct omap_target_agent_s;
  71 +struct omap_target_agent_s *omap_l4ta_get(struct omap_l4_s *bus, int cs);
  72 +target_phys_addr_t omap_l4_attach(struct omap_target_agent_s *ta, int region,
  73 + int iotype);
  74 +
58 struct omap_intr_handler_s; 75 struct omap_intr_handler_s;
59 struct omap_intr_handler_s *omap_inth_init(target_phys_addr_t base, 76 struct omap_intr_handler_s *omap_inth_init(target_phys_addr_t base,
60 - unsigned long size, unsigned char nbanks, 77 + unsigned long size, unsigned char nbanks, qemu_irq **pins,
61 qemu_irq parent_irq, qemu_irq parent_fiq, omap_clk clk); 78 qemu_irq parent_irq, qemu_irq parent_fiq, omap_clk clk);
62 -  
63 -struct omap_target_agent_s;  
64 -static inline target_phys_addr_t omap_l4_attach(struct omap_target_agent_s *ta,  
65 - int region, int iotype) { return 0; } 79 +struct omap_intr_handler_s *omap2_inth_init(target_phys_addr_t base,
  80 + int size, int nbanks, qemu_irq **pins,
  81 + qemu_irq parent_irq, qemu_irq parent_fiq,
  82 + omap_clk fclk, omap_clk iclk);
  83 +void omap_inth_reset(struct omap_intr_handler_s *s);
  84 +
  85 +struct omap_prcm_s;
  86 +struct omap_prcm_s *omap_prcm_init(struct omap_target_agent_s *ta,
  87 + qemu_irq mpu_int, qemu_irq dsp_int, qemu_irq iva_int,
  88 + struct omap_mpu_state_s *mpu);
  89 +
  90 +struct omap_sysctl_s;
  91 +struct omap_sysctl_s *omap_sysctl_init(struct omap_target_agent_s *ta,
  92 + omap_clk iclk, struct omap_mpu_state_s *mpu);
  93 +
  94 +struct omap_sdrc_s;
  95 +struct omap_sdrc_s *omap_sdrc_init(target_phys_addr_t base);
  96 +
  97 +struct omap_gpmc_s;
  98 +struct omap_gpmc_s *omap_gpmc_init(target_phys_addr_t base, qemu_irq irq);
  99 +void omap_gpmc_attach(struct omap_gpmc_s *s, int cs, int iomemtype,
  100 + void (*base_upd)(void *opaque, target_phys_addr_t new),
  101 + void (*unmap)(void *opaque), void *opaque);
66 102
67 /* 103 /*
68 * Common IRQ numbers for level 1 interrupt handler 104 * Common IRQ numbers for level 1 interrupt handler
@@ -295,10 +331,20 @@ static inline target_phys_addr_t omap_l4_attach(struct omap_target_agent_s *ta, @@ -295,10 +331,20 @@ static inline target_phys_addr_t omap_l4_attach(struct omap_target_agent_s *ta,
295 * OMAP-24xx common IRQ numbers 331 * OMAP-24xx common IRQ numbers
296 */ 332 */
297 # define OMAP_INT_24XX_SYS_NIRQ 7 333 # define OMAP_INT_24XX_SYS_NIRQ 7
  334 +# define OMAP_INT_24XX_L3_IRQ 10
  335 +# define OMAP_INT_24XX_PRCM_MPU_IRQ 11
298 # define OMAP_INT_24XX_SDMA_IRQ0 12 336 # define OMAP_INT_24XX_SDMA_IRQ0 12
299 # define OMAP_INT_24XX_SDMA_IRQ1 13 337 # define OMAP_INT_24XX_SDMA_IRQ1 13
300 # define OMAP_INT_24XX_SDMA_IRQ2 14 338 # define OMAP_INT_24XX_SDMA_IRQ2 14
301 # define OMAP_INT_24XX_SDMA_IRQ3 15 339 # define OMAP_INT_24XX_SDMA_IRQ3 15
  340 +# define OMAP_INT_243X_MCBSP2_IRQ 16
  341 +# define OMAP_INT_243X_MCBSP3_IRQ 17
  342 +# define OMAP_INT_243X_MCBSP4_IRQ 18
  343 +# define OMAP_INT_243X_MCBSP5_IRQ 19
  344 +# define OMAP_INT_24XX_GPMC_IRQ 20
  345 +# define OMAP_INT_24XX_GUFFAW_IRQ 21
  346 +# define OMAP_INT_24XX_IVA_IRQ 22
  347 +# define OMAP_INT_24XX_EAC_IRQ 23
302 # define OMAP_INT_24XX_CAM_IRQ 24 348 # define OMAP_INT_24XX_CAM_IRQ 24
303 # define OMAP_INT_24XX_DSS_IRQ 25 349 # define OMAP_INT_24XX_DSS_IRQ 25
304 # define OMAP_INT_24XX_MAIL_U0_MPU 26 350 # define OMAP_INT_24XX_MAIL_U0_MPU 26
@@ -308,8 +354,10 @@ static inline target_phys_addr_t omap_l4_attach(struct omap_target_agent_s *ta, @@ -308,8 +354,10 @@ static inline target_phys_addr_t omap_l4_attach(struct omap_target_agent_s *ta,
308 # define OMAP_INT_24XX_GPIO_BANK2 30 354 # define OMAP_INT_24XX_GPIO_BANK2 30
309 # define OMAP_INT_24XX_GPIO_BANK3 31 355 # define OMAP_INT_24XX_GPIO_BANK3 31
310 # define OMAP_INT_24XX_GPIO_BANK4 32 356 # define OMAP_INT_24XX_GPIO_BANK4 32
311 -# define OMAP_INT_24XX_GPIO_BANK5 33 357 +# define OMAP_INT_243X_GPIO_BANK5 33
312 # define OMAP_INT_24XX_MAIL_U3_MPU 34 358 # define OMAP_INT_24XX_MAIL_U3_MPU 34
  359 +# define OMAP_INT_24XX_WDT3 35
  360 +# define OMAP_INT_24XX_WDT4 36
313 # define OMAP_INT_24XX_GPTIMER1 37 361 # define OMAP_INT_24XX_GPTIMER1 37
314 # define OMAP_INT_24XX_GPTIMER2 38 362 # define OMAP_INT_24XX_GPTIMER2 38
315 # define OMAP_INT_24XX_GPTIMER3 39 363 # define OMAP_INT_24XX_GPTIMER3 39
@@ -322,10 +370,24 @@ static inline target_phys_addr_t omap_l4_attach(struct omap_target_agent_s *ta, @@ -322,10 +370,24 @@ static inline target_phys_addr_t omap_l4_attach(struct omap_target_agent_s *ta,
322 # define OMAP_INT_24XX_GPTIMER10 46 370 # define OMAP_INT_24XX_GPTIMER10 46
323 # define OMAP_INT_24XX_GPTIMER11 47 371 # define OMAP_INT_24XX_GPTIMER11 47
324 # define OMAP_INT_24XX_GPTIMER12 48 372 # define OMAP_INT_24XX_GPTIMER12 48
  373 +# define OMAP_INT_24XX_PKA_IRQ 50
  374 +# define OMAP_INT_24XX_SHA1MD5_IRQ 51
  375 +# define OMAP_INT_24XX_RNG_IRQ 52
  376 +# define OMAP_INT_24XX_MG_IRQ 53
  377 +# define OMAP_INT_24XX_I2C1_IRQ 56
  378 +# define OMAP_INT_24XX_I2C2_IRQ 57
325 # define OMAP_INT_24XX_MCBSP1_IRQ_TX 59 379 # define OMAP_INT_24XX_MCBSP1_IRQ_TX 59
326 # define OMAP_INT_24XX_MCBSP1_IRQ_RX 60 380 # define OMAP_INT_24XX_MCBSP1_IRQ_RX 60
327 # define OMAP_INT_24XX_MCBSP2_IRQ_TX 62 381 # define OMAP_INT_24XX_MCBSP2_IRQ_TX 62
328 # define OMAP_INT_24XX_MCBSP2_IRQ_RX 63 382 # define OMAP_INT_24XX_MCBSP2_IRQ_RX 63
  383 +# define OMAP_INT_243X_MCBSP1_IRQ 64
  384 +# define OMAP_INT_24XX_MCSPI1_IRQ 65
  385 +# define OMAP_INT_24XX_MCSPI2_IRQ 66
  386 +# define OMAP_INT_24XX_SSI1_IRQ0 67
  387 +# define OMAP_INT_24XX_SSI1_IRQ1 68
  388 +# define OMAP_INT_24XX_SSI2_IRQ0 69
  389 +# define OMAP_INT_24XX_SSI2_IRQ1 70
  390 +# define OMAP_INT_24XX_SSI_GDD_IRQ 71
329 # define OMAP_INT_24XX_UART1_IRQ 72 391 # define OMAP_INT_24XX_UART1_IRQ 72
330 # define OMAP_INT_24XX_UART2_IRQ 73 392 # define OMAP_INT_24XX_UART2_IRQ 73
331 # define OMAP_INT_24XX_UART3_IRQ 74 393 # define OMAP_INT_24XX_UART3_IRQ 74
@@ -335,10 +397,15 @@ static inline target_phys_addr_t omap_l4_attach(struct omap_target_agent_s *ta, @@ -335,10 +397,15 @@ static inline target_phys_addr_t omap_l4_attach(struct omap_target_agent_s *ta,
335 # define OMAP_INT_24XX_USB_IRQ_HGEN 78 397 # define OMAP_INT_24XX_USB_IRQ_HGEN 78
336 # define OMAP_INT_24XX_USB_IRQ_HSOF 79 398 # define OMAP_INT_24XX_USB_IRQ_HSOF 79
337 # define OMAP_INT_24XX_USB_IRQ_OTG 80 399 # define OMAP_INT_24XX_USB_IRQ_OTG 80
  400 +# define OMAP_INT_24XX_VLYNQ_IRQ 81
338 # define OMAP_INT_24XX_MMC_IRQ 83 401 # define OMAP_INT_24XX_MMC_IRQ 83
  402 +# define OMAP_INT_24XX_MS_IRQ 84
  403 +# define OMAP_INT_24XX_FAC_IRQ 85
  404 +# define OMAP_INT_24XX_MCSPI3_IRQ 91
339 # define OMAP_INT_243X_HS_USB_MC 92 405 # define OMAP_INT_243X_HS_USB_MC 92
340 # define OMAP_INT_243X_HS_USB_DMA 93 406 # define OMAP_INT_243X_HS_USB_DMA 93
341 # define OMAP_INT_243X_CARKIT 94 407 # define OMAP_INT_243X_CARKIT 94
  408 +# define OMAP_INT_34XX_GPTIMER12 95
342 409
343 /* omap_dma.c */ 410 /* omap_dma.c */
344 enum omap_dma_model { 411 enum omap_dma_model {
@@ -352,6 +419,9 @@ struct omap_dma_s; @@ -352,6 +419,9 @@ struct omap_dma_s;
352 struct omap_dma_s *omap_dma_init(target_phys_addr_t base, qemu_irq *irqs, 419 struct omap_dma_s *omap_dma_init(target_phys_addr_t base, qemu_irq *irqs,
353 qemu_irq lcd_irq, struct omap_mpu_state_s *mpu, omap_clk clk, 420 qemu_irq lcd_irq, struct omap_mpu_state_s *mpu, omap_clk clk,
354 enum omap_dma_model model); 421 enum omap_dma_model model);
  422 +struct omap_dma_s *omap_dma4_init(target_phys_addr_t base, qemu_irq *irqs,
  423 + struct omap_mpu_state_s *mpu, int fifo,
  424 + int chans, omap_clk iclk, omap_clk fclk);
355 void omap_dma_reset(struct omap_dma_s *s); 425 void omap_dma_reset(struct omap_dma_s *s);
356 426
357 struct dma_irq_map { 427 struct dma_irq_map {
@@ -367,7 +437,7 @@ enum omap_dma_port { @@ -367,7 +437,7 @@ enum omap_dma_port {
367 tipb, 437 tipb,
368 local, /* omap16xx: ocp_t2 */ 438 local, /* omap16xx: ocp_t2 */
369 tipb_mpui, 439 tipb_mpui,
370 - omap_dma_port_last, 440 + __omap_dma_port_last,
371 }; 441 };
372 442
373 typedef enum { 443 typedef enum {
@@ -488,11 +558,83 @@ struct omap_dma_lcd_channel_s { @@ -488,11 +558,83 @@ struct omap_dma_lcd_channel_s {
488 # define OMAP_DMA_MMC2_RX 55 558 # define OMAP_DMA_MMC2_RX 55
489 # define OMAP_DMA_CRYPTO_DES_OUT 56 559 # define OMAP_DMA_CRYPTO_DES_OUT 56
490 560
  561 +/*
  562 + * DMA request numbers for the OMAP2
  563 + */
  564 +# define OMAP24XX_DMA_NO_DEVICE 0
  565 +# define OMAP24XX_DMA_XTI_DMA 1 /* Not in OMAP2420 */
  566 +# define OMAP24XX_DMA_EXT_DMAREQ0 2
  567 +# define OMAP24XX_DMA_EXT_DMAREQ1 3
  568 +# define OMAP24XX_DMA_GPMC 4
  569 +# define OMAP24XX_DMA_GFX 5 /* Not in OMAP2420 */
  570 +# define OMAP24XX_DMA_DSS 6
  571 +# define OMAP24XX_DMA_VLYNQ_TX 7 /* Not in OMAP2420 */
  572 +# define OMAP24XX_DMA_CWT 8 /* Not in OMAP2420 */
  573 +# define OMAP24XX_DMA_AES_TX 9 /* Not in OMAP2420 */
  574 +# define OMAP24XX_DMA_AES_RX 10 /* Not in OMAP2420 */
  575 +# define OMAP24XX_DMA_DES_TX 11 /* Not in OMAP2420 */
  576 +# define OMAP24XX_DMA_DES_RX 12 /* Not in OMAP2420 */
  577 +# define OMAP24XX_DMA_SHA1MD5_RX 13 /* Not in OMAP2420 */
  578 +# define OMAP24XX_DMA_EXT_DMAREQ2 14
  579 +# define OMAP24XX_DMA_EXT_DMAREQ3 15
  580 +# define OMAP24XX_DMA_EXT_DMAREQ4 16
  581 +# define OMAP24XX_DMA_EAC_AC_RD 17
  582 +# define OMAP24XX_DMA_EAC_AC_WR 18
  583 +# define OMAP24XX_DMA_EAC_MD_UL_RD 19
  584 +# define OMAP24XX_DMA_EAC_MD_UL_WR 20
  585 +# define OMAP24XX_DMA_EAC_MD_DL_RD 21
  586 +# define OMAP24XX_DMA_EAC_MD_DL_WR 22
  587 +# define OMAP24XX_DMA_EAC_BT_UL_RD 23
  588 +# define OMAP24XX_DMA_EAC_BT_UL_WR 24
  589 +# define OMAP24XX_DMA_EAC_BT_DL_RD 25
  590 +# define OMAP24XX_DMA_EAC_BT_DL_WR 26
  591 +# define OMAP24XX_DMA_I2C1_TX 27
  592 +# define OMAP24XX_DMA_I2C1_RX 28
  593 +# define OMAP24XX_DMA_I2C2_TX 29
  594 +# define OMAP24XX_DMA_I2C2_RX 30
  595 +# define OMAP24XX_DMA_MCBSP1_TX 31
  596 +# define OMAP24XX_DMA_MCBSP1_RX 32
  597 +# define OMAP24XX_DMA_MCBSP2_TX 33
  598 +# define OMAP24XX_DMA_MCBSP2_RX 34
  599 +# define OMAP24XX_DMA_SPI1_TX0 35
  600 +# define OMAP24XX_DMA_SPI1_RX0 36
  601 +# define OMAP24XX_DMA_SPI1_TX1 37
  602 +# define OMAP24XX_DMA_SPI1_RX1 38
  603 +# define OMAP24XX_DMA_SPI1_TX2 39
  604 +# define OMAP24XX_DMA_SPI1_RX2 40
  605 +# define OMAP24XX_DMA_SPI1_TX3 41
  606 +# define OMAP24XX_DMA_SPI1_RX3 42
  607 +# define OMAP24XX_DMA_SPI2_TX0 43
  608 +# define OMAP24XX_DMA_SPI2_RX0 44
  609 +# define OMAP24XX_DMA_SPI2_TX1 45
  610 +# define OMAP24XX_DMA_SPI2_RX1 46
  611 +
  612 +# define OMAP24XX_DMA_UART1_TX 49
  613 +# define OMAP24XX_DMA_UART1_RX 50
  614 +# define OMAP24XX_DMA_UART2_TX 51
  615 +# define OMAP24XX_DMA_UART2_RX 52
  616 +# define OMAP24XX_DMA_UART3_TX 53
  617 +# define OMAP24XX_DMA_UART3_RX 54
  618 +# define OMAP24XX_DMA_USB_W2FC_TX0 55
  619 +# define OMAP24XX_DMA_USB_W2FC_RX0 56
  620 +# define OMAP24XX_DMA_USB_W2FC_TX1 57
  621 +# define OMAP24XX_DMA_USB_W2FC_RX1 58
  622 +# define OMAP24XX_DMA_USB_W2FC_TX2 59
  623 +# define OMAP24XX_DMA_USB_W2FC_RX2 60
  624 +# define OMAP24XX_DMA_MMC1_TX 61
  625 +# define OMAP24XX_DMA_MMC1_RX 62
  626 +# define OMAP24XX_DMA_MS 63 /* Not in OMAP2420 */
  627 +# define OMAP24XX_DMA_EXT_DMAREQ5 64
  628 +
491 /* omap[123].c */ 629 /* omap[123].c */
492 struct omap_mpu_timer_s; 630 struct omap_mpu_timer_s;
493 struct omap_mpu_timer_s *omap_mpu_timer_init(target_phys_addr_t base, 631 struct omap_mpu_timer_s *omap_mpu_timer_init(target_phys_addr_t base,
494 qemu_irq irq, omap_clk clk); 632 qemu_irq irq, omap_clk clk);
495 633
  634 +struct omap_gp_timer_s;
  635 +struct omap_gp_timer_s *omap_gp_timer_init(struct omap_target_agent_s *ta,
  636 + qemu_irq irq, omap_clk fclk, omap_clk iclk);
  637 +
496 struct omap_watchdog_timer_s; 638 struct omap_watchdog_timer_s;
497 struct omap_watchdog_timer_s *omap_wd_timer_init(target_phys_addr_t base, 639 struct omap_watchdog_timer_s *omap_wd_timer_init(target_phys_addr_t base,
498 qemu_irq irq, omap_clk clk); 640 qemu_irq irq, omap_clk clk);
@@ -501,13 +643,21 @@ struct omap_32khz_timer_s; @@ -501,13 +643,21 @@ struct omap_32khz_timer_s;
501 struct omap_32khz_timer_s *omap_os_timer_init(target_phys_addr_t base, 643 struct omap_32khz_timer_s *omap_os_timer_init(target_phys_addr_t base,
502 qemu_irq irq, omap_clk clk); 644 qemu_irq irq, omap_clk clk);
503 645
  646 +void omap_synctimer_init(struct omap_target_agent_s *ta,
  647 + struct omap_mpu_state_s *mpu, omap_clk fclk, omap_clk iclk);
  648 +
504 struct omap_tipb_bridge_s; 649 struct omap_tipb_bridge_s;
505 struct omap_tipb_bridge_s *omap_tipb_bridge_init(target_phys_addr_t base, 650 struct omap_tipb_bridge_s *omap_tipb_bridge_init(target_phys_addr_t base,
506 qemu_irq abort_irq, omap_clk clk); 651 qemu_irq abort_irq, omap_clk clk);
507 652
508 struct omap_uart_s; 653 struct omap_uart_s;
509 struct omap_uart_s *omap_uart_init(target_phys_addr_t base, 654 struct omap_uart_s *omap_uart_init(target_phys_addr_t base,
510 - qemu_irq irq, omap_clk clk, CharDriverState *chr); 655 + qemu_irq irq, omap_clk fclk, omap_clk iclk,
  656 + qemu_irq txdma, qemu_irq rxdma, CharDriverState *chr);
  657 +struct omap_uart_s *omap2_uart_init(struct omap_target_agent_s *ta,
  658 + qemu_irq irq, omap_clk fclk, omap_clk iclk,
  659 + qemu_irq txdma, qemu_irq rxdma, CharDriverState *chr);
  660 +void omap_uart_reset(struct omap_uart_s *s);
511 661
512 struct omap_mpuio_s; 662 struct omap_mpuio_s;
513 struct omap_mpuio_s *omap_mpuio_init(target_phys_addr_t base, 663 struct omap_mpuio_s *omap_mpuio_init(target_phys_addr_t base,
@@ -523,6 +673,12 @@ struct omap_gpio_s *omap_gpio_init(target_phys_addr_t base, @@ -523,6 +673,12 @@ struct omap_gpio_s *omap_gpio_init(target_phys_addr_t base,
523 qemu_irq *omap_gpio_in_get(struct omap_gpio_s *s); 673 qemu_irq *omap_gpio_in_get(struct omap_gpio_s *s);
524 void omap_gpio_out_set(struct omap_gpio_s *s, int line, qemu_irq handler); 674 void omap_gpio_out_set(struct omap_gpio_s *s, int line, qemu_irq handler);
525 675
  676 +struct omap_gpif_s;
  677 +struct omap_gpif_s *omap2_gpio_init(struct omap_target_agent_s *ta,
  678 + qemu_irq *irq, omap_clk *fclk, omap_clk iclk, int modules);
  679 +qemu_irq *omap2_gpio_in_get(struct omap_gpif_s *s, int start);
  680 +void omap2_gpio_out_set(struct omap_gpif_s *s, int line, qemu_irq handler);
  681 +
526 struct uwire_slave_s { 682 struct uwire_slave_s {
527 uint16_t (*receive)(void *opaque); 683 uint16_t (*receive)(void *opaque);
528 void (*send)(void *opaque, uint16_t data); 684 void (*send)(void *opaque, uint16_t data);
@@ -534,6 +690,13 @@ struct omap_uwire_s *omap_uwire_init(target_phys_addr_t base, @@ -534,6 +690,13 @@ struct omap_uwire_s *omap_uwire_init(target_phys_addr_t base,
534 void omap_uwire_attach(struct omap_uwire_s *s, 690 void omap_uwire_attach(struct omap_uwire_s *s,
535 struct uwire_slave_s *slave, int chipselect); 691 struct uwire_slave_s *slave, int chipselect);
536 692
  693 +struct omap_mcspi_s;
  694 +struct omap_mcspi_s *omap_mcspi_init(struct omap_target_agent_s *ta, int chnum,
  695 + qemu_irq irq, qemu_irq *drq, omap_clk fclk, omap_clk iclk);
  696 +void omap_mcspi_attach(struct omap_mcspi_s *s,
  697 + uint32_t (*txrx)(void *opaque, uint32_t), void *opaque,
  698 + int chipselect);
  699 +
537 struct omap_rtc_s; 700 struct omap_rtc_s;
538 struct omap_rtc_s *omap_rtc_init(target_phys_addr_t base, 701 struct omap_rtc_s *omap_rtc_init(target_phys_addr_t base,
539 qemu_irq *irq, omap_clk clk); 702 qemu_irq *irq, omap_clk clk);
@@ -570,6 +733,9 @@ void omap_mcbsp_i2s_attach(struct omap_mcbsp_s *s, struct i2s_codec_s *slave); @@ -570,6 +733,9 @@ void omap_mcbsp_i2s_attach(struct omap_mcbsp_s *s, struct i2s_codec_s *slave);
570 struct omap_lpg_s; 733 struct omap_lpg_s;
571 struct omap_lpg_s *omap_lpg_init(target_phys_addr_t base, omap_clk clk); 734 struct omap_lpg_s *omap_lpg_init(target_phys_addr_t base, omap_clk clk);
572 735
  736 +void omap_tap_init(struct omap_target_agent_s *ta,
  737 + struct omap_mpu_state_s *mpu);
  738 +
573 /* omap_lcdc.c */ 739 /* omap_lcdc.c */
574 struct omap_lcd_panel_s; 740 struct omap_lcd_panel_s;
575 void omap_lcdc_reset(struct omap_lcd_panel_s *s); 741 void omap_lcdc_reset(struct omap_lcd_panel_s *s);
@@ -577,13 +743,33 @@ struct omap_lcd_panel_s *omap_lcdc_init(target_phys_addr_t base, qemu_irq irq, @@ -577,13 +743,33 @@ struct omap_lcd_panel_s *omap_lcdc_init(target_phys_addr_t base, qemu_irq irq,
577 struct omap_dma_lcd_channel_s *dma, DisplayState *ds, 743 struct omap_dma_lcd_channel_s *dma, DisplayState *ds,
578 ram_addr_t imif_base, ram_addr_t emiff_base, omap_clk clk); 744 ram_addr_t imif_base, ram_addr_t emiff_base, omap_clk clk);
579 745
  746 +/* omap_dss.c */
  747 +struct rfbi_chip_s {
  748 + void *opaque;
  749 + void (*write)(void *opaque, int dc, uint16_t value);
  750 + void (*block)(void *opaque, int dc, void *buf, size_t len, int pitch);
  751 + uint16_t (*read)(void *opaque, int dc);
  752 +};
  753 +struct omap_dss_s;
  754 +void omap_dss_reset(struct omap_dss_s *s);
  755 +struct omap_dss_s *omap_dss_init(struct omap_target_agent_s *ta,
  756 + target_phys_addr_t l3_base, DisplayState *ds,
  757 + qemu_irq irq, qemu_irq drq,
  758 + omap_clk fck1, omap_clk fck2, omap_clk ck54m,
  759 + omap_clk ick1, omap_clk ick2);
  760 +void omap_rfbi_attach(struct omap_dss_s *s, int cs, struct rfbi_chip_s *chip);
  761 +
580 /* omap_mmc.c */ 762 /* omap_mmc.c */
581 struct omap_mmc_s; 763 struct omap_mmc_s;
582 struct omap_mmc_s *omap_mmc_init(target_phys_addr_t base, 764 struct omap_mmc_s *omap_mmc_init(target_phys_addr_t base,
583 BlockDriverState *bd, 765 BlockDriverState *bd,
584 qemu_irq irq, qemu_irq dma[], omap_clk clk); 766 qemu_irq irq, qemu_irq dma[], omap_clk clk);
  767 +struct omap_mmc_s *omap2_mmc_init(struct omap_target_agent_s *ta,
  768 + BlockDriverState *bd, qemu_irq irq, qemu_irq dma[],
  769 + omap_clk fclk, omap_clk iclk);
585 void omap_mmc_reset(struct omap_mmc_s *s); 770 void omap_mmc_reset(struct omap_mmc_s *s);
586 void omap_mmc_handlers(struct omap_mmc_s *s, qemu_irq ro, qemu_irq cover); 771 void omap_mmc_handlers(struct omap_mmc_s *s, qemu_irq ro, qemu_irq cover);
  772 +void omap_mmc_enable(struct omap_mmc_s *s, int enable);
587 773
588 /* omap_i2c.c */ 774 /* omap_i2c.c */
589 struct omap_i2c_s; 775 struct omap_i2c_s;
@@ -596,14 +782,37 @@ i2c_bus *omap_i2c_bus(struct omap_i2c_s *s); @@ -596,14 +782,37 @@ i2c_bus *omap_i2c_bus(struct omap_i2c_s *s);
596 782
597 # define cpu_is_omap310(cpu) (cpu->mpu_model == omap310) 783 # define cpu_is_omap310(cpu) (cpu->mpu_model == omap310)
598 # define cpu_is_omap1510(cpu) (cpu->mpu_model == omap1510) 784 # define cpu_is_omap1510(cpu) (cpu->mpu_model == omap1510)
  785 +# define cpu_is_omap1610(cpu) (cpu->mpu_model == omap1610)
  786 +# define cpu_is_omap1710(cpu) (cpu->mpu_model == omap1710)
  787 +# define cpu_is_omap2410(cpu) (cpu->mpu_model == omap2410)
  788 +# define cpu_is_omap2420(cpu) (cpu->mpu_model == omap2420)
  789 +# define cpu_is_omap2430(cpu) (cpu->mpu_model == omap2430)
  790 +# define cpu_is_omap3430(cpu) (cpu->mpu_model == omap3430)
  791 +
599 # define cpu_is_omap15xx(cpu) \ 792 # define cpu_is_omap15xx(cpu) \
600 (cpu_is_omap310(cpu) || cpu_is_omap1510(cpu)) 793 (cpu_is_omap310(cpu) || cpu_is_omap1510(cpu))
601 -# define cpu_class_omap1(cpu) 1 794 +# define cpu_is_omap16xx(cpu) \
  795 + (cpu_is_omap1610(cpu) || cpu_is_omap1710(cpu))
  796 +# define cpu_is_omap24xx(cpu) \
  797 + (cpu_is_omap2410(cpu) || cpu_is_omap2420(cpu) || cpu_is_omap2430(cpu))
  798 +
  799 +# define cpu_class_omap1(cpu) \
  800 + (cpu_is_omap15xx(cpu) || cpu_is_omap16xx(cpu))
  801 +# define cpu_class_omap2(cpu) cpu_is_omap24xx(cpu)
  802 +# define cpu_class_omap3(cpu) cpu_is_omap3430(cpu)
602 803
603 struct omap_mpu_state_s { 804 struct omap_mpu_state_s {
604 - enum omap1_mpu_model { 805 + enum omap_mpu_model {
605 omap310, 806 omap310,
606 omap1510, 807 omap1510,
  808 + omap1610,
  809 + omap1710,
  810 + omap2410,
  811 + omap2420,
  812 + omap2422,
  813 + omap2423,
  814 + omap2430,
  815 + omap3430,
607 } mpu_model; 816 } mpu_model;
608 817
609 CPUState *env; 818 CPUState *env;
@@ -620,7 +829,7 @@ struct omap_mpu_state_s { @@ -620,7 +829,7 @@ struct omap_mpu_state_s {
620 target_phys_addr_t offset, uint32_t value); 829 target_phys_addr_t offset, uint32_t value);
621 int (*addr_valid)(struct omap_mpu_state_s *s, 830 int (*addr_valid)(struct omap_mpu_state_s *s,
622 target_phys_addr_t addr); 831 target_phys_addr_t addr);
623 - } port[omap_dma_port_last]; 832 + } port[__omap_dma_port_last];
624 833
625 unsigned long sdram_size; 834 unsigned long sdram_size;
626 unsigned long sram_size; 835 unsigned long sram_size;
@@ -656,7 +865,7 @@ struct omap_mpu_state_s { @@ -656,7 +865,7 @@ struct omap_mpu_state_s {
656 omap_clk clk; 865 omap_clk clk;
657 } pwt; 866 } pwt;
658 867
659 - struct omap_i2c_s *i2c; 868 + struct omap_i2c_s *i2c[2];
660 869
661 struct omap_rtc_s *rtc; 870 struct omap_rtc_s *rtc;
662 871
@@ -722,7 +931,38 @@ struct omap_mpu_state_s { @@ -722,7 +931,38 @@ struct omap_mpu_state_s {
722 uint16_t dsp_idlect2; 931 uint16_t dsp_idlect2;
723 uint16_t dsp_rstct2; 932 uint16_t dsp_rstct2;
724 } clkm; 933 } clkm;
725 -} *omap310_mpu_init(unsigned long sdram_size, 934 +
  935 + /* OMAP2-only peripherals */
  936 + struct omap_l4_s *l4;
  937 +
  938 + struct omap_gp_timer_s *gptimer[12];
  939 +
  940 + target_phys_addr_t tap_base;
  941 +
  942 + struct omap_synctimer_s {
  943 + target_phys_addr_t base;
  944 + uint32_t val;
  945 + uint16_t readh;
  946 + } synctimer;
  947 +
  948 + struct omap_prcm_s *prcm;
  949 + struct omap_sdrc_s *sdrc;
  950 + struct omap_gpmc_s *gpmc;
  951 + struct omap_sysctl_s *sysc;
  952 +
  953 + struct omap_gpif_s *gpif;
  954 +
  955 + struct omap_mcspi_s *mcspi[2];
  956 +
  957 + struct omap_dss_s *dss;
  958 +};
  959 +
  960 +/* omap1.c */
  961 +struct omap_mpu_state_s *omap310_mpu_init(unsigned long sdram_size,
  962 + DisplayState *ds, const char *core);
  963 +
  964 +/* omap2.c */
  965 +struct omap_mpu_state_s *omap2420_mpu_init(unsigned long sdram_size,
726 DisplayState *ds, const char *core); 966 DisplayState *ds, const char *core);
727 967
728 # if TARGET_PHYS_ADDR_BITS == 32 968 # if TARGET_PHYS_ADDR_BITS == 32
@@ -743,24 +983,46 @@ uint32_t omap_badwidth_read32(void *opaque, target_phys_addr_t addr); @@ -743,24 +983,46 @@ uint32_t omap_badwidth_read32(void *opaque, target_phys_addr_t addr);
743 void omap_badwidth_write32(void *opaque, target_phys_addr_t addr, 983 void omap_badwidth_write32(void *opaque, target_phys_addr_t addr,
744 uint32_t value); 984 uint32_t value);
745 985
  986 +void omap_mpu_wakeup(void *opaque, int irq, int req);
  987 +
746 # define OMAP_BAD_REG(paddr) \ 988 # define OMAP_BAD_REG(paddr) \
747 - printf("%s: Bad register " OMAP_FMT_plx "\n", __FUNCTION__, paddr) 989 + fprintf(stderr, "%s: Bad register " OMAP_FMT_plx "\n", \
  990 + __FUNCTION__, paddr)
748 # define OMAP_RO_REG(paddr) \ 991 # define OMAP_RO_REG(paddr) \
749 - printf("%s: Read-only register " OMAP_FMT_plx "\n", \ 992 + fprintf(stderr, "%s: Read-only register " OMAP_FMT_plx "\n", \
750 __FUNCTION__, paddr) 993 __FUNCTION__, paddr)
751 994
  995 +/* OMAP-specific Linux bootloader tags for the ATAG_BOARD area
  996 + (Board-specifc tags are not here) */
  997 +#define OMAP_TAG_CLOCK 0x4f01
  998 +#define OMAP_TAG_MMC 0x4f02
  999 +#define OMAP_TAG_SERIAL_CONSOLE 0x4f03
  1000 +#define OMAP_TAG_USB 0x4f04
  1001 +#define OMAP_TAG_LCD 0x4f05
  1002 +#define OMAP_TAG_GPIO_SWITCH 0x4f06
  1003 +#define OMAP_TAG_UART 0x4f07
  1004 +#define OMAP_TAG_FBMEM 0x4f08
  1005 +#define OMAP_TAG_STI_CONSOLE 0x4f09
  1006 +#define OMAP_TAG_CAMERA_SENSOR 0x4f0a
  1007 +#define OMAP_TAG_PARTITION 0x4f0b
  1008 +#define OMAP_TAG_TEA5761 0x4f10
  1009 +#define OMAP_TAG_TMP105 0x4f11
  1010 +#define OMAP_TAG_BOOT_REASON 0x4f80
  1011 +#define OMAP_TAG_FLASH_PART_STR 0x4f81
  1012 +#define OMAP_TAG_VERSION_STR 0x4f82
  1013 +
752 # define TCMI_VERBOSE 1 1014 # define TCMI_VERBOSE 1
753 //# define MEM_VERBOSE 1 1015 //# define MEM_VERBOSE 1
754 1016
755 # ifdef TCMI_VERBOSE 1017 # ifdef TCMI_VERBOSE
756 # define OMAP_8B_REG(paddr) \ 1018 # define OMAP_8B_REG(paddr) \
757 - printf("%s: 8-bit register " OMAP_FMT_plx "\n", \ 1019 + fprintf(stderr, "%s: 8-bit register " OMAP_FMT_plx "\n", \
758 __FUNCTION__, paddr) 1020 __FUNCTION__, paddr)
759 # define OMAP_16B_REG(paddr) \ 1021 # define OMAP_16B_REG(paddr) \
760 - printf("%s: 16-bit register " OMAP_FMT_plx "\n", \ 1022 + fprintf(stderr, "%s: 16-bit register " OMAP_FMT_plx "\n", \
761 __FUNCTION__, paddr) 1023 __FUNCTION__, paddr)
762 # define OMAP_32B_REG(paddr) \ 1024 # define OMAP_32B_REG(paddr) \
763 - printf("%s: 32-bit register " OMAP_FMT_plx "\n", \ 1025 + fprintf(stderr, "%s: 32-bit register " OMAP_FMT_plx "\n", \
764 __FUNCTION__, paddr) 1026 __FUNCTION__, paddr)
765 # else 1027 # else
766 # define OMAP_8B_REG(paddr) 1028 # define OMAP_8B_REG(paddr)
hw/omap1.c
@@ -5,8 +5,8 @@ @@ -5,8 +5,8 @@
5 * 5 *
6 * This program is free software; you can redistribute it and/or 6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as 7 * modify it under the terms of the GNU General Public License as
8 - * published by the Free Software Foundation; either version 2 of  
9 - * the License, or (at your option) any later version. 8 + * published by the Free Software Foundation; either version 2 or
  9 + * (at your option) version 3 of the License.
10 * 10 *
11 * This program is distributed in the hope that it will be useful, 11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -23,10 +23,11 @@ @@ -23,10 +23,11 @@
23 #include "omap.h" 23 #include "omap.h"
24 #include "sysemu.h" 24 #include "sysemu.h"
25 #include "qemu-timer.h" 25 #include "qemu-timer.h"
  26 +#include "qemu-char.h"
26 /* We use pc-style serial ports. */ 27 /* We use pc-style serial ports. */
27 #include "pc.h" 28 #include "pc.h"
28 29
29 -/* Should signal the TCMI */ 30 +/* Should signal the TCMI/GPMC */
30 uint32_t omap_badwidth_read8(void *opaque, target_phys_addr_t addr) 31 uint32_t omap_badwidth_read8(void *opaque, target_phys_addr_t addr)
31 { 32 {
32 uint8_t ret; 33 uint8_t ret;
@@ -86,6 +87,7 @@ struct omap_intr_handler_bank_s { @@ -86,6 +87,7 @@ struct omap_intr_handler_bank_s {
86 uint32_t mask; 87 uint32_t mask;
87 uint32_t fiq; 88 uint32_t fiq;
88 uint32_t sens_edge; 89 uint32_t sens_edge;
  90 + uint32_t swi;
89 unsigned char priority[32]; 91 unsigned char priority[32];
90 }; 92 };
91 93
@@ -94,11 +96,14 @@ struct omap_intr_handler_s { @@ -94,11 +96,14 @@ struct omap_intr_handler_s {
94 qemu_irq parent_intr[2]; 96 qemu_irq parent_intr[2];
95 target_phys_addr_t base; 97 target_phys_addr_t base;
96 unsigned char nbanks; 98 unsigned char nbanks;
  99 + int level_only;
97 100
98 /* state */ 101 /* state */
99 uint32_t new_agr[2]; 102 uint32_t new_agr[2];
100 int sir_intr[2]; 103 int sir_intr[2];
101 - struct omap_intr_handler_bank_s banks[]; 104 + int autoidle;
  105 + uint32_t mask;
  106 + struct omap_intr_handler_bank_s bank[];
102 }; 107 };
103 108
104 static void omap_inth_sir_update(struct omap_intr_handler_s *s, int is_fiq) 109 static void omap_inth_sir_update(struct omap_intr_handler_s *s, int is_fiq)
@@ -113,11 +118,11 @@ static void omap_inth_sir_update(struct omap_intr_handler_s *s, int is_fiq) @@ -113,11 +118,11 @@ static void omap_inth_sir_update(struct omap_intr_handler_s *s, int is_fiq)
113 * If all interrupts have the same priority, the default order is IRQ_N, 118 * If all interrupts have the same priority, the default order is IRQ_N,
114 * IRQ_N-1,...,IRQ_0. */ 119 * IRQ_N-1,...,IRQ_0. */
115 for (j = 0; j < s->nbanks; ++j) { 120 for (j = 0; j < s->nbanks; ++j) {
116 - level = s->banks[j].irqs & ~s->banks[j].mask &  
117 - (is_fiq ? s->banks[j].fiq : ~s->banks[j].fiq); 121 + level = s->bank[j].irqs & ~s->bank[j].mask &
  122 + (is_fiq ? s->bank[j].fiq : ~s->bank[j].fiq);
118 for (f = ffs(level), i = f - 1, level >>= f - 1; f; i += f, 123 for (f = ffs(level), i = f - 1, level >>= f - 1; f; i += f,
119 level >>= f) { 124 level >>= f) {
120 - p = s->banks[j].priority[i]; 125 + p = s->bank[j].priority[i];
121 if (p <= p_intr) { 126 if (p <= p_intr) {
122 p_intr = p; 127 p_intr = p;
123 sir_intr = 32 * j + i; 128 sir_intr = 32 * j + i;
@@ -134,10 +139,10 @@ static inline void omap_inth_update(struct omap_intr_handler_s *s, int is_fiq) @@ -134,10 +139,10 @@ static inline void omap_inth_update(struct omap_intr_handler_s *s, int is_fiq)
134 uint32_t has_intr = 0; 139 uint32_t has_intr = 0;
135 140
136 for (i = 0; i < s->nbanks; ++i) 141 for (i = 0; i < s->nbanks; ++i)
137 - has_intr |= s->banks[i].irqs & ~s->banks[i].mask &  
138 - (is_fiq ? s->banks[i].fiq : ~s->banks[i].fiq); 142 + has_intr |= s->bank[i].irqs & ~s->bank[i].mask &
  143 + (is_fiq ? s->bank[i].fiq : ~s->bank[i].fiq);
139 144
140 - if (s->new_agr[is_fiq] && has_intr) { 145 + if (s->new_agr[is_fiq] & has_intr & s->mask) {
141 s->new_agr[is_fiq] = 0; 146 s->new_agr[is_fiq] = 0;
142 omap_inth_sir_update(s, is_fiq); 147 omap_inth_sir_update(s, is_fiq);
143 qemu_set_irq(s->parent_intr[is_fiq], 1); 148 qemu_set_irq(s->parent_intr[is_fiq], 1);
@@ -152,13 +157,13 @@ static void omap_set_intr(void *opaque, int irq, int req) @@ -152,13 +157,13 @@ static void omap_set_intr(void *opaque, int irq, int req)
152 struct omap_intr_handler_s *ih = (struct omap_intr_handler_s *) opaque; 157 struct omap_intr_handler_s *ih = (struct omap_intr_handler_s *) opaque;
153 uint32_t rise; 158 uint32_t rise;
154 159
155 - struct omap_intr_handler_bank_s *bank = &ih->banks[irq >> 5]; 160 + struct omap_intr_handler_bank_s *bank = &ih->bank[irq >> 5];
156 int n = irq & 31; 161 int n = irq & 31;
157 162
158 if (req) { 163 if (req) {
159 rise = ~bank->irqs & (1 << n); 164 rise = ~bank->irqs & (1 << n);
160 if (~bank->sens_edge & (1 << n)) 165 if (~bank->sens_edge & (1 << n))
161 - rise &= ~bank->inputs & (1 << n); 166 + rise &= ~bank->inputs;
162 167
163 bank->inputs |= (1 << n); 168 bank->inputs |= (1 << n);
164 if (rise) { 169 if (rise) {
@@ -173,13 +178,33 @@ static void omap_set_intr(void *opaque, int irq, int req) @@ -173,13 +178,33 @@ static void omap_set_intr(void *opaque, int irq, int req)
173 } 178 }
174 } 179 }
175 180
  181 +/* Simplified version with no edge detection */
  182 +static void omap_set_intr_noedge(void *opaque, int irq, int req)
  183 +{
  184 + struct omap_intr_handler_s *ih = (struct omap_intr_handler_s *) opaque;
  185 + uint32_t rise;
  186 +
  187 + struct omap_intr_handler_bank_s *bank = &ih->bank[irq >> 5];
  188 + int n = irq & 31;
  189 +
  190 + if (req) {
  191 + rise = ~bank->inputs & (1 << n);
  192 + if (rise) {
  193 + bank->irqs |= bank->inputs |= rise;
  194 + omap_inth_update(ih, 0);
  195 + omap_inth_update(ih, 1);
  196 + }
  197 + } else
  198 + bank->irqs = (bank->inputs &= ~(1 << n)) | bank->swi;
  199 +}
  200 +
176 static uint32_t omap_inth_read(void *opaque, target_phys_addr_t addr) 201 static uint32_t omap_inth_read(void *opaque, target_phys_addr_t addr)
177 { 202 {
178 struct omap_intr_handler_s *s = (struct omap_intr_handler_s *) opaque; 203 struct omap_intr_handler_s *s = (struct omap_intr_handler_s *) opaque;
179 int i, offset = addr - s->base; 204 int i, offset = addr - s->base;
180 int bank_no = offset >> 8; 205 int bank_no = offset >> 8;
181 int line_no; 206 int line_no;
182 - struct omap_intr_handler_bank_s *bank = &s->banks[bank_no]; 207 + struct omap_intr_handler_bank_s *bank = &s->bank[bank_no];
183 offset &= 0xff; 208 offset &= 0xff;
184 209
185 switch (offset) { 210 switch (offset) {
@@ -194,7 +219,7 @@ static uint32_t omap_inth_read(void *opaque, target_phys_addr_t addr) @@ -194,7 +219,7 @@ static uint32_t omap_inth_read(void *opaque, target_phys_addr_t addr)
194 if (bank_no != 0) 219 if (bank_no != 0)
195 break; 220 break;
196 line_no = s->sir_intr[(offset - 0x10) >> 2]; 221 line_no = s->sir_intr[(offset - 0x10) >> 2];
197 - bank = &s->banks[line_no >> 5]; 222 + bank = &s->bank[line_no >> 5];
198 i = line_no & 31; 223 i = line_no & 31;
199 if (((bank->sens_edge >> i) & 1) == INT_FALLING_EDGE) 224 if (((bank->sens_edge >> i) & 1) == INT_FALLING_EDGE)
200 bank->irqs &= ~(1 << i); 225 bank->irqs &= ~(1 << i);
@@ -256,7 +281,7 @@ static void omap_inth_write(void *opaque, target_phys_addr_t addr, @@ -256,7 +281,7 @@ static void omap_inth_write(void *opaque, target_phys_addr_t addr,
256 struct omap_intr_handler_s *s = (struct omap_intr_handler_s *) opaque; 281 struct omap_intr_handler_s *s = (struct omap_intr_handler_s *) opaque;
257 int i, offset = addr - s->base; 282 int i, offset = addr - s->base;
258 int bank_no = offset >> 8; 283 int bank_no = offset >> 8;
259 - struct omap_intr_handler_bank_s *bank = &s->banks[bank_no]; 284 + struct omap_intr_handler_bank_s *bank = &s->bank[bank_no];
260 offset &= 0xff; 285 offset &= 0xff;
261 286
262 switch (offset) { 287 switch (offset) {
@@ -360,25 +385,31 @@ void omap_inth_reset(struct omap_intr_handler_s *s) @@ -360,25 +385,31 @@ void omap_inth_reset(struct omap_intr_handler_s *s)
360 int i; 385 int i;
361 386
362 for (i = 0; i < s->nbanks; ++i){ 387 for (i = 0; i < s->nbanks; ++i){
363 - s->banks[i].irqs = 0x00000000;  
364 - s->banks[i].mask = 0xffffffff;  
365 - s->banks[i].sens_edge = 0x00000000;  
366 - s->banks[i].fiq = 0x00000000;  
367 - s->banks[i].inputs = 0x00000000;  
368 - memset(s->banks[i].priority, 0, sizeof(s->banks[i].priority)); 388 + s->bank[i].irqs = 0x00000000;
  389 + s->bank[i].mask = 0xffffffff;
  390 + s->bank[i].sens_edge = 0x00000000;
  391 + s->bank[i].fiq = 0x00000000;
  392 + s->bank[i].inputs = 0x00000000;
  393 + s->bank[i].swi = 0x00000000;
  394 + memset(s->bank[i].priority, 0, sizeof(s->bank[i].priority));
  395 +
  396 + if (s->level_only)
  397 + s->bank[i].sens_edge = 0xffffffff;
369 } 398 }
370 399
371 s->new_agr[0] = ~0; 400 s->new_agr[0] = ~0;
372 s->new_agr[1] = ~0; 401 s->new_agr[1] = ~0;
373 s->sir_intr[0] = 0; 402 s->sir_intr[0] = 0;
374 s->sir_intr[1] = 0; 403 s->sir_intr[1] = 0;
  404 + s->autoidle = 0;
  405 + s->mask = ~0;
375 406
376 qemu_set_irq(s->parent_intr[0], 0); 407 qemu_set_irq(s->parent_intr[0], 0);
377 qemu_set_irq(s->parent_intr[1], 0); 408 qemu_set_irq(s->parent_intr[1], 0);
378 } 409 }
379 410
380 struct omap_intr_handler_s *omap_inth_init(target_phys_addr_t base, 411 struct omap_intr_handler_s *omap_inth_init(target_phys_addr_t base,
381 - unsigned long size, unsigned char nbanks, 412 + unsigned long size, unsigned char nbanks, qemu_irq **pins,
382 qemu_irq parent_irq, qemu_irq parent_fiq, omap_clk clk) 413 qemu_irq parent_irq, qemu_irq parent_fiq, omap_clk clk)
383 { 414 {
384 int iomemtype; 415 int iomemtype;
@@ -391,6 +422,8 @@ struct omap_intr_handler_s *omap_inth_init(target_phys_addr_t base, @@ -391,6 +422,8 @@ struct omap_intr_handler_s *omap_inth_init(target_phys_addr_t base,
391 s->base = base; 422 s->base = base;
392 s->nbanks = nbanks; 423 s->nbanks = nbanks;
393 s->pins = qemu_allocate_irqs(omap_set_intr, s, nbanks * 32); 424 s->pins = qemu_allocate_irqs(omap_set_intr, s, nbanks * 32);
  425 + if (pins)
  426 + *pins = s->pins;
394 427
395 omap_inth_reset(s); 428 omap_inth_reset(s);
396 429
@@ -401,6 +434,227 @@ struct omap_intr_handler_s *omap_inth_init(target_phys_addr_t base, @@ -401,6 +434,227 @@ struct omap_intr_handler_s *omap_inth_init(target_phys_addr_t base,
401 return s; 434 return s;
402 } 435 }
403 436
  437 +static uint32_t omap2_inth_read(void *opaque, target_phys_addr_t addr)
  438 +{
  439 + struct omap_intr_handler_s *s = (struct omap_intr_handler_s *) opaque;
  440 + int offset = addr - s->base;
  441 + int bank_no, line_no;
  442 + struct omap_intr_handler_bank_s *bank = 0;
  443 +
  444 + if ((offset & 0xf80) == 0x80) {
  445 + bank_no = (offset & 0x60) >> 5;
  446 + if (bank_no < s->nbanks) {
  447 + offset &= ~0x60;
  448 + bank = &s->bank[bank_no];
  449 + }
  450 + }
  451 +
  452 + switch (offset) {
  453 + case 0x00: /* INTC_REVISION */
  454 + return 0x21;
  455 +
  456 + case 0x10: /* INTC_SYSCONFIG */
  457 + return (s->autoidle >> 2) & 1;
  458 +
  459 + case 0x14: /* INTC_SYSSTATUS */
  460 + return 1; /* RESETDONE */
  461 +
  462 + case 0x40: /* INTC_SIR_IRQ */
  463 + return s->sir_intr[0];
  464 +
  465 + case 0x44: /* INTC_SIR_FIQ */
  466 + return s->sir_intr[1];
  467 +
  468 + case 0x48: /* INTC_CONTROL */
  469 + return (!s->mask) << 2; /* GLOBALMASK */
  470 +
  471 + case 0x4c: /* INTC_PROTECTION */
  472 + return 0;
  473 +
  474 + case 0x50: /* INTC_IDLE */
  475 + return s->autoidle & 3;
  476 +
  477 + /* Per-bank registers */
  478 + case 0x80: /* INTC_ITR */
  479 + return bank->inputs;
  480 +
  481 + case 0x84: /* INTC_MIR */
  482 + return bank->mask;
  483 +
  484 + case 0x88: /* INTC_MIR_CLEAR */
  485 + case 0x8c: /* INTC_MIR_SET */
  486 + return 0;
  487 +
  488 + case 0x90: /* INTC_ISR_SET */
  489 + return bank->swi;
  490 +
  491 + case 0x94: /* INTC_ISR_CLEAR */
  492 + return 0;
  493 +
  494 + case 0x98: /* INTC_PENDING_IRQ */
  495 + return bank->irqs & ~bank->mask & ~bank->fiq;
  496 +
  497 + case 0x9c: /* INTC_PENDING_FIQ */
  498 + return bank->irqs & ~bank->mask & bank->fiq;
  499 +
  500 + /* Per-line registers */
  501 + case 0x100 ... 0x300: /* INTC_ILR */
  502 + bank_no = (offset - 0x100) >> 7;
  503 + if (bank_no > s->nbanks)
  504 + break;
  505 + bank = &s->bank[bank_no];
  506 + line_no = (offset & 0x7f) >> 2;
  507 + return (bank->priority[line_no] << 2) |
  508 + ((bank->fiq >> line_no) & 1);
  509 + }
  510 + OMAP_BAD_REG(addr);
  511 + return 0;
  512 +}
  513 +
  514 +static void omap2_inth_write(void *opaque, target_phys_addr_t addr,
  515 + uint32_t value)
  516 +{
  517 + struct omap_intr_handler_s *s = (struct omap_intr_handler_s *) opaque;
  518 + int offset = addr - s->base;
  519 + int bank_no, line_no;
  520 + struct omap_intr_handler_bank_s *bank = 0;
  521 +
  522 + if ((offset & 0xf80) == 0x80) {
  523 + bank_no = (offset & 0x60) >> 5;
  524 + if (bank_no < s->nbanks) {
  525 + offset &= ~0x60;
  526 + bank = &s->bank[bank_no];
  527 + }
  528 + }
  529 +
  530 + switch (offset) {
  531 + case 0x10: /* INTC_SYSCONFIG */
  532 + s->autoidle &= 4;
  533 + s->autoidle |= (value & 1) << 2;
  534 + if (value & 2) /* SOFTRESET */
  535 + omap_inth_reset(s);
  536 + return;
  537 +
  538 + case 0x48: /* INTC_CONTROL */
  539 + s->mask = (value & 4) ? 0 : ~0; /* GLOBALMASK */
  540 + if (value & 2) { /* NEWFIQAGR */
  541 + qemu_set_irq(s->parent_intr[1], 0);
  542 + s->new_agr[1] = ~0;
  543 + omap_inth_update(s, 1);
  544 + }
  545 + if (value & 1) { /* NEWIRQAGR */
  546 + qemu_set_irq(s->parent_intr[0], 0);
  547 + s->new_agr[0] = ~0;
  548 + omap_inth_update(s, 0);
  549 + }
  550 + return;
  551 +
  552 + case 0x4c: /* INTC_PROTECTION */
  553 + /* TODO: Make a bitmap (or sizeof(char)map) of access privileges
  554 + * for every register, see Chapter 3 and 4 for privileged mode. */
  555 + if (value & 1)
  556 + fprintf(stderr, "%s: protection mode enable attempt\n",
  557 + __FUNCTION__);
  558 + return;
  559 +
  560 + case 0x50: /* INTC_IDLE */
  561 + s->autoidle &= ~3;
  562 + s->autoidle |= value & 3;
  563 + return;
  564 +
  565 + /* Per-bank registers */
  566 + case 0x84: /* INTC_MIR */
  567 + bank->mask = value;
  568 + omap_inth_update(s, 0);
  569 + omap_inth_update(s, 1);
  570 + return;
  571 +
  572 + case 0x88: /* INTC_MIR_CLEAR */
  573 + bank->mask &= ~value;
  574 + omap_inth_update(s, 0);
  575 + omap_inth_update(s, 1);
  576 + return;
  577 +
  578 + case 0x8c: /* INTC_MIR_SET */
  579 + bank->mask |= value;
  580 + return;
  581 +
  582 + case 0x90: /* INTC_ISR_SET */
  583 + bank->irqs |= bank->swi |= value;
  584 + omap_inth_update(s, 0);
  585 + omap_inth_update(s, 1);
  586 + return;
  587 +
  588 + case 0x94: /* INTC_ISR_CLEAR */
  589 + bank->swi &= ~value;
  590 + bank->irqs = bank->swi & bank->inputs;
  591 + return;
  592 +
  593 + /* Per-line registers */
  594 + case 0x100 ... 0x300: /* INTC_ILR */
  595 + bank_no = (offset - 0x100) >> 7;
  596 + if (bank_no > s->nbanks)
  597 + break;
  598 + bank = &s->bank[bank_no];
  599 + line_no = (offset & 0x7f) >> 2;
  600 + bank->priority[line_no] = (value >> 2) & 0x3f;
  601 + bank->fiq &= ~(1 << line_no);
  602 + bank->fiq |= (value & 1) << line_no;
  603 + return;
  604 +
  605 + case 0x00: /* INTC_REVISION */
  606 + case 0x14: /* INTC_SYSSTATUS */
  607 + case 0x40: /* INTC_SIR_IRQ */
  608 + case 0x44: /* INTC_SIR_FIQ */
  609 + case 0x80: /* INTC_ITR */
  610 + case 0x98: /* INTC_PENDING_IRQ */
  611 + case 0x9c: /* INTC_PENDING_FIQ */
  612 + OMAP_RO_REG(addr);
  613 + return;
  614 + }
  615 + OMAP_BAD_REG(addr);
  616 +}
  617 +
  618 +static CPUReadMemoryFunc *omap2_inth_readfn[] = {
  619 + omap_badwidth_read32,
  620 + omap_badwidth_read32,
  621 + omap2_inth_read,
  622 +};
  623 +
  624 +static CPUWriteMemoryFunc *omap2_inth_writefn[] = {
  625 + omap2_inth_write,
  626 + omap2_inth_write,
  627 + omap2_inth_write,
  628 +};
  629 +
  630 +struct omap_intr_handler_s *omap2_inth_init(target_phys_addr_t base,
  631 + int size, int nbanks, qemu_irq **pins,
  632 + qemu_irq parent_irq, qemu_irq parent_fiq,
  633 + omap_clk fclk, omap_clk iclk)
  634 +{
  635 + int iomemtype;
  636 + struct omap_intr_handler_s *s = (struct omap_intr_handler_s *)
  637 + qemu_mallocz(sizeof(struct omap_intr_handler_s) +
  638 + sizeof(struct omap_intr_handler_bank_s) * nbanks);
  639 +
  640 + s->parent_intr[0] = parent_irq;
  641 + s->parent_intr[1] = parent_fiq;
  642 + s->base = base;
  643 + s->nbanks = nbanks;
  644 + s->level_only = 1;
  645 + s->pins = qemu_allocate_irqs(omap_set_intr_noedge, s, nbanks * 32);
  646 + if (pins)
  647 + *pins = s->pins;
  648 +
  649 + omap_inth_reset(s);
  650 +
  651 + iomemtype = cpu_register_io_memory(0, omap2_inth_readfn,
  652 + omap2_inth_writefn, s);
  653 + cpu_register_physical_memory(s->base, size, iomemtype);
  654 +
  655 + return s;
  656 +}
  657 +
404 /* MPU OS timers */ 658 /* MPU OS timers */
405 struct omap_mpu_timer_s { 659 struct omap_mpu_timer_s {
406 qemu_irq irq; 660 qemu_irq irq;
@@ -1289,6 +1543,8 @@ static uint32_t omap_id_read(void *opaque, target_phys_addr_t addr) @@ -1289,6 +1543,8 @@ static uint32_t omap_id_read(void *opaque, target_phys_addr_t addr)
1289 return 0x03310315; 1543 return 0x03310315;
1290 case omap1510: 1544 case omap1510:
1291 return 0x03310115; 1545 return 0x03310115;
  1546 + default:
  1547 + cpu_abort(cpu_single_env, "%s: bad mpu model\n", __FUNCTION__);
1292 } 1548 }
1293 break; 1549 break;
1294 1550
@@ -1298,6 +1554,8 @@ static uint32_t omap_id_read(void *opaque, target_phys_addr_t addr) @@ -1298,6 +1554,8 @@ static uint32_t omap_id_read(void *opaque, target_phys_addr_t addr)
1298 return 0xfb57402f; 1554 return 0xfb57402f;
1299 case omap1510: 1555 case omap1510:
1300 return 0xfb47002f; 1556 return 0xfb47002f;
  1557 + default:
  1558 + cpu_abort(cpu_single_env, "%s: bad mpu model\n", __FUNCTION__);
1301 } 1559 }
1302 break; 1560 break;
1303 } 1561 }
@@ -1722,19 +1980,116 @@ static void omap_dpll_init(struct dpll_ctl_s *s, target_phys_addr_t base, @@ -1722,19 +1980,116 @@ static void omap_dpll_init(struct dpll_ctl_s *s, target_phys_addr_t base,
1722 /* UARTs */ 1980 /* UARTs */
1723 struct omap_uart_s { 1981 struct omap_uart_s {
1724 SerialState *serial; /* TODO */ 1982 SerialState *serial; /* TODO */
  1983 + struct omap_target_agent_s *ta;
  1984 + target_phys_addr_t base;
  1985 +
  1986 + uint8_t eblr;
  1987 + uint8_t syscontrol;
  1988 + uint8_t wkup;
  1989 + uint8_t cfps;
1725 }; 1990 };
1726 1991
1727 -static void omap_uart_reset(struct omap_uart_s *s) 1992 +void omap_uart_reset(struct omap_uart_s *s)
1728 { 1993 {
  1994 + s->eblr = 0x00;
  1995 + s->syscontrol = 0;
  1996 + s->wkup = 0x3f;
  1997 + s->cfps = 0x69;
1729 } 1998 }
1730 1999
1731 struct omap_uart_s *omap_uart_init(target_phys_addr_t base, 2000 struct omap_uart_s *omap_uart_init(target_phys_addr_t base,
1732 - qemu_irq irq, omap_clk clk, CharDriverState *chr) 2001 + qemu_irq irq, omap_clk fclk, omap_clk iclk,
  2002 + qemu_irq txdma, qemu_irq rxdma, CharDriverState *chr)
1733 { 2003 {
1734 struct omap_uart_s *s = (struct omap_uart_s *) 2004 struct omap_uart_s *s = (struct omap_uart_s *)
1735 qemu_mallocz(sizeof(struct omap_uart_s)); 2005 qemu_mallocz(sizeof(struct omap_uart_s));
1736 - if (chr)  
1737 - s->serial = serial_mm_init(base, 2, irq, chr, 1); 2006 +
  2007 + s->serial = serial_mm_init(base, 2, irq, chr ?: qemu_chr_open("null"), 1);
  2008 +
  2009 + return s;
  2010 +}
  2011 +
  2012 +static uint32_t omap_uart_read(void *opaque, target_phys_addr_t addr)
  2013 +{
  2014 + struct omap_uart_s *s = (struct omap_uart_s *) opaque;
  2015 + int offset = addr - s->base;
  2016 +
  2017 + switch (offset) {
  2018 + case 0x48: /* EBLR */
  2019 + return s->eblr;
  2020 + case 0x50: /* MVR */
  2021 + return 0x30;
  2022 + case 0x54: /* SYSC */
  2023 + return s->syscontrol;
  2024 + case 0x58: /* SYSS */
  2025 + return 1;
  2026 + case 0x5c: /* WER */
  2027 + return s->wkup;
  2028 + case 0x60: /* CFPS */
  2029 + return s->cfps;
  2030 + }
  2031 +
  2032 + OMAP_BAD_REG(addr);
  2033 + return 0;
  2034 +}
  2035 +
  2036 +static void omap_uart_write(void *opaque, target_phys_addr_t addr,
  2037 + uint32_t value)
  2038 +{
  2039 + struct omap_uart_s *s = (struct omap_uart_s *) opaque;
  2040 + int offset = addr - s->base;
  2041 +
  2042 + switch (offset) {
  2043 + case 0x48: /* EBLR */
  2044 + s->eblr = value & 0xff;
  2045 + break;
  2046 + case 0x50: /* MVR */
  2047 + case 0x58: /* SYSS */
  2048 + OMAP_RO_REG(addr);
  2049 + break;
  2050 + case 0x54: /* SYSC */
  2051 + s->syscontrol = value & 0x1d;
  2052 + if (value & 2)
  2053 + omap_uart_reset(s);
  2054 + break;
  2055 + case 0x5c: /* WER */
  2056 + s->wkup = value & 0x7f;
  2057 + break;
  2058 + case 0x60: /* CFPS */
  2059 + s->cfps = value & 0xff;
  2060 + break;
  2061 + default:
  2062 + OMAP_BAD_REG(addr);
  2063 + }
  2064 +}
  2065 +
  2066 +static CPUReadMemoryFunc *omap_uart_readfn[] = {
  2067 + omap_uart_read,
  2068 + omap_uart_read,
  2069 + omap_badwidth_read8,
  2070 +};
  2071 +
  2072 +static CPUWriteMemoryFunc *omap_uart_writefn[] = {
  2073 + omap_uart_write,
  2074 + omap_uart_write,
  2075 + omap_badwidth_write8,
  2076 +};
  2077 +
  2078 +struct omap_uart_s *omap2_uart_init(struct omap_target_agent_s *ta,
  2079 + qemu_irq irq, omap_clk fclk, omap_clk iclk,
  2080 + qemu_irq txdma, qemu_irq rxdma, CharDriverState *chr)
  2081 +{
  2082 + target_phys_addr_t base = omap_l4_attach(ta, 0, 0);
  2083 + struct omap_uart_s *s = omap_uart_init(base, irq,
  2084 + fclk, iclk, txdma, rxdma, chr);
  2085 + int iomemtype = cpu_register_io_memory(0, omap_uart_readfn,
  2086 + omap_uart_writefn, s);
  2087 +
  2088 + s->ta = ta;
  2089 + s->base = base;
  2090 +
  2091 + cpu_register_physical_memory(s->base + 0x20, 0x100, iomemtype);
  2092 +
1738 return s; 2093 return s;
1739 } 2094 }
1740 2095
@@ -2778,9 +3133,10 @@ struct omap_uwire_s *omap_uwire_init(target_phys_addr_t base, @@ -2778,9 +3133,10 @@ struct omap_uwire_s *omap_uwire_init(target_phys_addr_t base,
2778 void omap_uwire_attach(struct omap_uwire_s *s, 3133 void omap_uwire_attach(struct omap_uwire_s *s,
2779 struct uwire_slave_s *slave, int chipselect) 3134 struct uwire_slave_s *slave, int chipselect)
2780 { 3135 {
2781 - if (chipselect < 0 || chipselect > 3)  
2782 - cpu_abort(cpu_single_env, "%s: Bad chipselect %i\n", __FUNCTION__,  
2783 - chipselect); 3136 + if (chipselect < 0 || chipselect > 3) {
  3137 + fprintf(stderr, "%s: Bad chipselect %i\n", __FUNCTION__, chipselect);
  3138 + exit(-1);
  3139 + }
2784 3140
2785 s->chip[chipselect] = slave; 3141 s->chip[chipselect] = slave;
2786 } 3142 }
@@ -4123,7 +4479,7 @@ static void omap_setup_mpui_io(struct omap_mpu_state_s *mpu) @@ -4123,7 +4479,7 @@ static void omap_setup_mpui_io(struct omap_mpu_state_s *mpu)
4123 } 4479 }
4124 4480
4125 /* General chip reset */ 4481 /* General chip reset */
4126 -static void omap_mpu_reset(void *opaque) 4482 +static void omap1_mpu_reset(void *opaque)
4127 { 4483 {
4128 struct omap_mpu_state_s *mpu = (struct omap_mpu_state_s *) opaque; 4484 struct omap_mpu_state_s *mpu = (struct omap_mpu_state_s *) opaque;
4129 4485
@@ -4153,7 +4509,7 @@ static void omap_mpu_reset(void *opaque) @@ -4153,7 +4509,7 @@ static void omap_mpu_reset(void *opaque)
4153 omap_uwire_reset(mpu->microwire); 4509 omap_uwire_reset(mpu->microwire);
4154 omap_pwl_reset(mpu); 4510 omap_pwl_reset(mpu);
4155 omap_pwt_reset(mpu); 4511 omap_pwt_reset(mpu);
4156 - omap_i2c_reset(mpu->i2c); 4512 + omap_i2c_reset(mpu->i2c[0]);
4157 omap_rtc_reset(mpu->rtc); 4513 omap_rtc_reset(mpu->rtc);
4158 omap_mcbsp_reset(mpu->mcbsp1); 4514 omap_mcbsp_reset(mpu->mcbsp1);
4159 omap_mcbsp_reset(mpu->mcbsp2); 4515 omap_mcbsp_reset(mpu->mcbsp2);
@@ -4205,7 +4561,7 @@ static void omap_setup_dsp_mapping(const struct omap_map_s *map) @@ -4205,7 +4561,7 @@ static void omap_setup_dsp_mapping(const struct omap_map_s *map)
4205 } 4561 }
4206 } 4562 }
4207 4563
4208 -static void omap_mpu_wakeup(void *opaque, int irq, int req) 4564 +void omap_mpu_wakeup(void *opaque, int irq, int req)
4209 { 4565 {
4210 struct omap_mpu_state_s *mpu = (struct omap_mpu_state_s *) opaque; 4566 struct omap_mpu_state_s *mpu = (struct omap_mpu_state_s *) opaque;
4211 4567
@@ -4213,7 +4569,7 @@ static void omap_mpu_wakeup(void *opaque, int irq, int req) @@ -4213,7 +4569,7 @@ static void omap_mpu_wakeup(void *opaque, int irq, int req)
4213 cpu_interrupt(mpu->env, CPU_INTERRUPT_EXITTB); 4569 cpu_interrupt(mpu->env, CPU_INTERRUPT_EXITTB);
4214 } 4570 }
4215 4571
4216 -static const struct dma_irq_map omap_dma_irq_map[] = { 4572 +static const struct dma_irq_map omap1_dma_irq_map[] = {
4217 { 0, OMAP_INT_DMA_CH0_6 }, 4573 { 0, OMAP_INT_DMA_CH0_6 },
4218 { 0, OMAP_INT_DMA_CH1_7 }, 4574 { 0, OMAP_INT_DMA_CH1_7 },
4219 { 0, OMAP_INT_DMA_CH2_8 }, 4575 { 0, OMAP_INT_DMA_CH2_8 },
@@ -4307,17 +4663,16 @@ struct omap_mpu_state_s *omap310_mpu_init(unsigned long sdram_size, @@ -4307,17 +4663,16 @@ struct omap_mpu_state_s *omap310_mpu_init(unsigned long sdram_size,
4307 omap_clkm_init(0xfffece00, 0xe1008000, s); 4663 omap_clkm_init(0xfffece00, 0xe1008000, s);
4308 4664
4309 cpu_irq = arm_pic_init_cpu(s->env); 4665 cpu_irq = arm_pic_init_cpu(s->env);
4310 - s->ih[0] = omap_inth_init(0xfffecb00, 0x100, 1, 4666 + s->ih[0] = omap_inth_init(0xfffecb00, 0x100, 1, &s->irq[0],
4311 cpu_irq[ARM_PIC_CPU_IRQ], cpu_irq[ARM_PIC_CPU_FIQ], 4667 cpu_irq[ARM_PIC_CPU_IRQ], cpu_irq[ARM_PIC_CPU_FIQ],
4312 omap_findclk(s, "arminth_ck")); 4668 omap_findclk(s, "arminth_ck"));
4313 - s->ih[1] = omap_inth_init(0xfffe0000, 0x800, 1, 4669 + s->ih[1] = omap_inth_init(0xfffe0000, 0x800, 1, &s->irq[1],
4314 s->ih[0]->pins[OMAP_INT_15XX_IH2_IRQ], NULL, 4670 s->ih[0]->pins[OMAP_INT_15XX_IH2_IRQ], NULL,
4315 omap_findclk(s, "arminth_ck")); 4671 omap_findclk(s, "arminth_ck"));
4316 - s->irq[0] = s->ih[0]->pins;  
4317 - s->irq[1] = s->ih[1]->pins;  
4318 4672
4319 for (i = 0; i < 6; i ++) 4673 for (i = 0; i < 6; i ++)
4320 - dma_irqs[i] = s->irq[omap_dma_irq_map[i].ih][omap_dma_irq_map[i].intr]; 4674 + dma_irqs[i] =
  4675 + s->irq[omap1_dma_irq_map[i].ih][omap1_dma_irq_map[i].intr];
4321 s->dma = omap_dma_init(0xfffed800, dma_irqs, s->irq[0][OMAP_INT_DMA_LCD], 4676 s->dma = omap_dma_init(0xfffed800, dma_irqs, s->irq[0][OMAP_INT_DMA_LCD],
4322 s, omap_findclk(s, "dma_ck"), omap_dma_3_1); 4677 s, omap_findclk(s, "dma_ck"), omap_dma_3_1);
4323 4678
@@ -4367,12 +4722,18 @@ struct omap_mpu_state_s *omap310_mpu_init(unsigned long sdram_size, @@ -4367,12 +4722,18 @@ struct omap_mpu_state_s *omap310_mpu_init(unsigned long sdram_size,
4367 4722
4368 s->uart[0] = omap_uart_init(0xfffb0000, s->irq[1][OMAP_INT_UART1], 4723 s->uart[0] = omap_uart_init(0xfffb0000, s->irq[1][OMAP_INT_UART1],
4369 omap_findclk(s, "uart1_ck"), 4724 omap_findclk(s, "uart1_ck"),
  4725 + omap_findclk(s, "uart1_ck"),
  4726 + s->drq[OMAP_DMA_UART1_TX], s->drq[OMAP_DMA_UART1_RX],
4370 serial_hds[0]); 4727 serial_hds[0]);
4371 s->uart[1] = omap_uart_init(0xfffb0800, s->irq[1][OMAP_INT_UART2], 4728 s->uart[1] = omap_uart_init(0xfffb0800, s->irq[1][OMAP_INT_UART2],
4372 omap_findclk(s, "uart2_ck"), 4729 omap_findclk(s, "uart2_ck"),
  4730 + omap_findclk(s, "uart2_ck"),
  4731 + s->drq[OMAP_DMA_UART2_TX], s->drq[OMAP_DMA_UART2_RX],
4373 serial_hds[0] ? serial_hds[1] : 0); 4732 serial_hds[0] ? serial_hds[1] : 0);
4374 s->uart[2] = omap_uart_init(0xe1019800, s->irq[0][OMAP_INT_UART3], 4733 s->uart[2] = omap_uart_init(0xe1019800, s->irq[0][OMAP_INT_UART3],
4375 omap_findclk(s, "uart3_ck"), 4734 omap_findclk(s, "uart3_ck"),
  4735 + omap_findclk(s, "uart3_ck"),
  4736 + s->drq[OMAP_DMA_UART3_TX], s->drq[OMAP_DMA_UART3_RX],
4376 serial_hds[0] && serial_hds[1] ? serial_hds[2] : 0); 4737 serial_hds[0] && serial_hds[1] ? serial_hds[2] : 0);
4377 4738
4378 omap_dpll_init(&s->dpll[0], 0xfffecf00, omap_findclk(s, "dpll1")); 4739 omap_dpll_init(&s->dpll[0], 0xfffecf00, omap_findclk(s, "dpll1"));
@@ -4401,7 +4762,7 @@ struct omap_mpu_state_s *omap310_mpu_init(unsigned long sdram_size, @@ -4401,7 +4762,7 @@ struct omap_mpu_state_s *omap310_mpu_init(unsigned long sdram_size,
4401 omap_pwl_init(0xfffb5800, s, omap_findclk(s, "armxor_ck")); 4762 omap_pwl_init(0xfffb5800, s, omap_findclk(s, "armxor_ck"));
4402 omap_pwt_init(0xfffb6000, s, omap_findclk(s, "armxor_ck")); 4763 omap_pwt_init(0xfffb6000, s, omap_findclk(s, "armxor_ck"));
4403 4764
4404 - s->i2c = omap_i2c_init(0xfffb3800, s->irq[1][OMAP_INT_I2C], 4765 + s->i2c[0] = omap_i2c_init(0xfffb3800, s->irq[1][OMAP_INT_I2C],
4405 &s->drq[OMAP_DMA_I2C_RX], omap_findclk(s, "mpuper_ck")); 4766 &s->drq[OMAP_DMA_I2C_RX], omap_findclk(s, "mpuper_ck"));
4406 4767
4407 s->rtc = omap_rtc_init(0xfffb4800, &s->irq[1][OMAP_INT_RTC_TIMER], 4768 s->rtc = omap_rtc_init(0xfffb4800, &s->irq[1][OMAP_INT_RTC_TIMER],
@@ -4435,7 +4796,7 @@ struct omap_mpu_state_s *omap310_mpu_init(unsigned long sdram_size, @@ -4435,7 +4796,7 @@ struct omap_mpu_state_s *omap310_mpu_init(unsigned long sdram_size,
4435 omap_setup_dsp_mapping(omap15xx_dsp_mm); 4796 omap_setup_dsp_mapping(omap15xx_dsp_mm);
4436 omap_setup_mpui_io(s); 4797 omap_setup_mpui_io(s);
4437 4798
4438 - qemu_register_reset(omap_mpu_reset, s); 4799 + qemu_register_reset(omap1_mpu_reset, s);
4439 4800
4440 return s; 4801 return s;
4441 } 4802 }