Commit cf965d24064671ce2d5a874e532b8189fdb6e863
1 parent
51a65271
Add register mappings in DSP space (must be accessible for MPU too).
Don't set microwire CSR-busy bit too early. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3530 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
4 changed files
with
66 additions
and
22 deletions
hw/omap.c
... | ... | @@ -1401,7 +1401,7 @@ struct omap_32khz_timer_s { |
1401 | 1401 | static uint32_t omap_os_timer_read(void *opaque, target_phys_addr_t addr) |
1402 | 1402 | { |
1403 | 1403 | struct omap_32khz_timer_s *s = (struct omap_32khz_timer_s *) opaque; |
1404 | - int offset = addr - s->timer.base; | |
1404 | + int offset = addr & OMAP_MPUI_REG_MASK; | |
1405 | 1405 | |
1406 | 1406 | switch (offset) { |
1407 | 1407 | case 0x00: /* TVR */ |
... | ... | @@ -1424,7 +1424,7 @@ static void omap_os_timer_write(void *opaque, target_phys_addr_t addr, |
1424 | 1424 | uint32_t value) |
1425 | 1425 | { |
1426 | 1426 | struct omap_32khz_timer_s *s = (struct omap_32khz_timer_s *) opaque; |
1427 | - int offset = addr - s->timer.base; | |
1427 | + int offset = addr & OMAP_MPUI_REG_MASK; | |
1428 | 1428 | |
1429 | 1429 | switch (offset) { |
1430 | 1430 | case 0x00: /* TVR */ |
... | ... | @@ -2894,7 +2894,7 @@ static void omap_mpuio_kbd_update(struct omap_mpuio_s *s) |
2894 | 2894 | static uint32_t omap_mpuio_read(void *opaque, target_phys_addr_t addr) |
2895 | 2895 | { |
2896 | 2896 | struct omap_mpuio_s *s = (struct omap_mpuio_s *) opaque; |
2897 | - int offset = addr - s->base; | |
2897 | + int offset = addr & OMAP_MPUI_REG_MASK; | |
2898 | 2898 | uint16_t ret; |
2899 | 2899 | |
2900 | 2900 | switch (offset) { |
... | ... | @@ -2950,7 +2950,7 @@ static void omap_mpuio_write(void *opaque, target_phys_addr_t addr, |
2950 | 2950 | uint32_t value) |
2951 | 2951 | { |
2952 | 2952 | struct omap_mpuio_s *s = (struct omap_mpuio_s *) opaque; |
2953 | - int offset = addr - s->base; | |
2953 | + int offset = addr & OMAP_MPUI_REG_MASK; | |
2954 | 2954 | uint16_t diff; |
2955 | 2955 | int ln; |
2956 | 2956 | |
... | ... | @@ -3142,7 +3142,7 @@ static void omap_gpio_set(void *opaque, int line, int level) |
3142 | 3142 | static uint32_t omap_gpio_read(void *opaque, target_phys_addr_t addr) |
3143 | 3143 | { |
3144 | 3144 | struct omap_gpio_s *s = (struct omap_gpio_s *) opaque; |
3145 | - int offset = addr - s->base; | |
3145 | + int offset = addr & OMAP_MPUI_REG_MASK; | |
3146 | 3146 | |
3147 | 3147 | switch (offset) { |
3148 | 3148 | case 0x00: /* DATA_INPUT */ |
... | ... | @@ -3172,7 +3172,7 @@ static void omap_gpio_write(void *opaque, target_phys_addr_t addr, |
3172 | 3172 | uint32_t value) |
3173 | 3173 | { |
3174 | 3174 | struct omap_gpio_s *s = (struct omap_gpio_s *) opaque; |
3175 | - int offset = addr - s->base; | |
3175 | + int offset = addr & OMAP_MPUI_REG_MASK; | |
3176 | 3176 | uint16_t diff; |
3177 | 3177 | int ln; |
3178 | 3178 | |
... | ... | @@ -3322,7 +3322,7 @@ static void omap_uwire_transfer_start(struct omap_uwire_s *s) |
3322 | 3322 | static uint32_t omap_uwire_read(void *opaque, target_phys_addr_t addr) |
3323 | 3323 | { |
3324 | 3324 | struct omap_uwire_s *s = (struct omap_uwire_s *) opaque; |
3325 | - int offset = addr - s->base; | |
3325 | + int offset = addr & OMAP_MPUI_REG_MASK; | |
3326 | 3326 | |
3327 | 3327 | switch (offset) { |
3328 | 3328 | case 0x00: /* RDR */ |
... | ... | @@ -3352,16 +3352,17 @@ static void omap_uwire_write(void *opaque, target_phys_addr_t addr, |
3352 | 3352 | uint32_t value) |
3353 | 3353 | { |
3354 | 3354 | struct omap_uwire_s *s = (struct omap_uwire_s *) opaque; |
3355 | - int offset = addr - s->base; | |
3355 | + int offset = addr & OMAP_MPUI_REG_MASK; | |
3356 | 3356 | |
3357 | 3357 | switch (offset) { |
3358 | 3358 | case 0x00: /* TDR */ |
3359 | 3359 | s->txbuf = value; /* TD */ |
3360 | - s->control |= 1 << 14; /* CSRB */ | |
3361 | 3360 | if ((s->setup[4] & (1 << 2)) && /* AUTO_TX_EN */ |
3362 | 3361 | ((s->setup[4] & (1 << 3)) || /* CS_TOGGLE_TX_EN */ |
3363 | - (s->control & (1 << 12)))) /* CS_CMD */ | |
3362 | + (s->control & (1 << 12)))) { /* CS_CMD */ | |
3363 | + s->control |= 1 << 14; /* CSRB */ | |
3364 | 3364 | omap_uwire_transfer_start(s); |
3365 | + } | |
3365 | 3366 | break; |
3366 | 3367 | |
3367 | 3368 | case 0x04: /* CSR */ |
... | ... | @@ -3462,7 +3463,7 @@ void omap_pwl_update(struct omap_mpu_state_s *s) |
3462 | 3463 | static uint32_t omap_pwl_read(void *opaque, target_phys_addr_t addr) |
3463 | 3464 | { |
3464 | 3465 | struct omap_mpu_state_s *s = (struct omap_mpu_state_s *) opaque; |
3465 | - int offset = addr - s->pwl.base; | |
3466 | + int offset = addr & OMAP_MPUI_REG_MASK; | |
3466 | 3467 | |
3467 | 3468 | switch (offset) { |
3468 | 3469 | case 0x00: /* PWL_LEVEL */ |
... | ... | @@ -3478,7 +3479,7 @@ static void omap_pwl_write(void *opaque, target_phys_addr_t addr, |
3478 | 3479 | uint32_t value) |
3479 | 3480 | { |
3480 | 3481 | struct omap_mpu_state_s *s = (struct omap_mpu_state_s *) opaque; |
3481 | - int offset = addr - s->pwl.base; | |
3482 | + int offset = addr & OMAP_MPUI_REG_MASK; | |
3482 | 3483 | |
3483 | 3484 | switch (offset) { |
3484 | 3485 | case 0x00: /* PWL_LEVEL */ |
... | ... | @@ -3542,7 +3543,7 @@ static void omap_pwl_init(target_phys_addr_t base, struct omap_mpu_state_s *s, |
3542 | 3543 | static uint32_t omap_pwt_read(void *opaque, target_phys_addr_t addr) |
3543 | 3544 | { |
3544 | 3545 | struct omap_mpu_state_s *s = (struct omap_mpu_state_s *) opaque; |
3545 | - int offset = addr - s->pwt.base; | |
3546 | + int offset = addr & OMAP_MPUI_REG_MASK; | |
3546 | 3547 | |
3547 | 3548 | switch (offset) { |
3548 | 3549 | case 0x00: /* FRC */ |
... | ... | @@ -3560,7 +3561,7 @@ static void omap_pwt_write(void *opaque, target_phys_addr_t addr, |
3560 | 3561 | uint32_t value) |
3561 | 3562 | { |
3562 | 3563 | struct omap_mpu_state_s *s = (struct omap_mpu_state_s *) opaque; |
3563 | - int offset = addr - s->pwt.base; | |
3564 | + int offset = addr & OMAP_MPUI_REG_MASK; | |
3564 | 3565 | |
3565 | 3566 | switch (offset) { |
3566 | 3567 | case 0x00: /* FRC */ |
... | ... | @@ -3679,7 +3680,7 @@ static inline int omap_rtc_bin(uint8_t num) |
3679 | 3680 | static uint32_t omap_rtc_read(void *opaque, target_phys_addr_t addr) |
3680 | 3681 | { |
3681 | 3682 | struct omap_rtc_s *s = (struct omap_rtc_s *) opaque; |
3682 | - int offset = addr - s->base; | |
3683 | + int offset = addr & OMAP_MPUI_REG_MASK; | |
3683 | 3684 | uint8_t i; |
3684 | 3685 | |
3685 | 3686 | switch (offset) { |
... | ... | @@ -3757,7 +3758,7 @@ static void omap_rtc_write(void *opaque, target_phys_addr_t addr, |
3757 | 3758 | uint32_t value) |
3758 | 3759 | { |
3759 | 3760 | struct omap_rtc_s *s = (struct omap_rtc_s *) opaque; |
3760 | - int offset = addr - s->base; | |
3761 | + int offset = addr & OMAP_MPUI_REG_MASK; | |
3761 | 3762 | struct tm new_tm; |
3762 | 3763 | time_t ti[2]; |
3763 | 3764 | |
... | ... | @@ -4094,6 +4095,47 @@ static void omap_mpu_reset(void *opaque) |
4094 | 4095 | cpu_reset(mpu->env); |
4095 | 4096 | } |
4096 | 4097 | |
4098 | +static const struct omap_map_s { | |
4099 | + target_phys_addr_t phys_dsp; | |
4100 | + target_phys_addr_t phys_mpu; | |
4101 | + uint32_t size; | |
4102 | + const char *name; | |
4103 | +} omap15xx_dsp_mm[] = { | |
4104 | + /* Strobe 0 */ | |
4105 | + { 0xe1010000, 0xfffb0000, 0x800, "UART1 BT" }, /* CS0 */ | |
4106 | + { 0xe1010800, 0xfffb0800, 0x800, "UART2 COM" }, /* CS1 */ | |
4107 | + { 0xe1011800, 0xfffb1800, 0x800, "McBSP1 audio" }, /* CS3 */ | |
4108 | + { 0xe1012000, 0xfffb2000, 0x800, "MCSI2 communication" }, /* CS4 */ | |
4109 | + { 0xe1012800, 0xfffb2800, 0x800, "MCSI1 BT u-Law" }, /* CS5 */ | |
4110 | + { 0xe1013000, 0xfffb3000, 0x800, "uWire" }, /* CS6 */ | |
4111 | + { 0xe1013800, 0xfffb3800, 0x800, "I^2C" }, /* CS7 */ | |
4112 | + { 0xe1014000, 0xfffb4000, 0x800, "USB W2FC" }, /* CS8 */ | |
4113 | + { 0xe1014800, 0xfffb4800, 0x800, "RTC" }, /* CS9 */ | |
4114 | + { 0xe1015000, 0xfffb5000, 0x800, "MPUIO" }, /* CS10 */ | |
4115 | + { 0xe1015800, 0xfffb5800, 0x800, "PWL" }, /* CS11 */ | |
4116 | + { 0xe1016000, 0xfffb6000, 0x800, "PWT" }, /* CS12 */ | |
4117 | + { 0xe1017000, 0xfffb7000, 0x800, "McBSP3" }, /* CS14 */ | |
4118 | + { 0xe1017800, 0xfffb7800, 0x800, "MMC" }, /* CS15 */ | |
4119 | + { 0xe1019000, 0xfffb9000, 0x800, "32-kHz timer" }, /* CS18 */ | |
4120 | + { 0xe1019800, 0xfffb9800, 0x800, "UART3" }, /* CS19 */ | |
4121 | + { 0xe101c800, 0xfffbc800, 0x800, "TIPB switches" }, /* CS25 */ | |
4122 | + /* Strobe 1 */ | |
4123 | + { 0xe101e000, 0xfffce000, 0x800, "GPIOs" }, /* CS28 */ | |
4124 | + | |
4125 | + { 0 } | |
4126 | +}; | |
4127 | + | |
4128 | +static void omap_setup_dsp_mapping(const struct omap_map_s *map) | |
4129 | +{ | |
4130 | + int io; | |
4131 | + | |
4132 | + for (; map->phys_dsp; map ++) { | |
4133 | + io = cpu_get_physical_page_desc(map->phys_mpu); | |
4134 | + | |
4135 | + cpu_register_physical_memory(map->phys_dsp, map->size, io); | |
4136 | + } | |
4137 | +} | |
4138 | + | |
4097 | 4139 | static void omap_mpu_wakeup(void *opaque, int irq, int req) |
4098 | 4140 | { |
4099 | 4141 | struct omap_mpu_state_s *mpu = (struct omap_mpu_state_s *) opaque; |
... | ... | @@ -4241,6 +4283,8 @@ struct omap_mpu_state_s *omap310_mpu_init(unsigned long sdram_size, |
4241 | 4283 | * DSP MMU fffed200 - fffed2ff |
4242 | 4284 | */ |
4243 | 4285 | |
4286 | + omap_setup_dsp_mapping(omap15xx_dsp_mm); | |
4287 | + | |
4244 | 4288 | qemu_register_reset(omap_mpu_reset, s); |
4245 | 4289 | |
4246 | 4290 | return s; | ... | ... |
hw/omap.h
... | ... | @@ -546,7 +546,6 @@ struct omap_mpu_state_s { |
546 | 546 | struct omap_uwire_s *microwire; |
547 | 547 | |
548 | 548 | struct { |
549 | - target_phys_addr_t base; | |
550 | 549 | uint8_t output; |
551 | 550 | uint8_t level; |
552 | 551 | uint8_t enable; |
... | ... | @@ -554,7 +553,6 @@ struct omap_mpu_state_s { |
554 | 553 | } pwl; |
555 | 554 | |
556 | 555 | struct { |
557 | - target_phys_addr_t base; | |
558 | 556 | uint8_t frc; |
559 | 557 | uint8_t vrc; |
560 | 558 | uint8_t gcr; |
... | ... | @@ -665,4 +663,6 @@ void omap_badwidth_write32(void *opaque, target_phys_addr_t addr, |
665 | 663 | # define OMAP_32B_REG(paddr) |
666 | 664 | # endif |
667 | 665 | |
666 | +# define OMAP_MPUI_REG_MASK 0x000007ff | |
667 | + | |
668 | 668 | #endif /* hw_omap_h */ | ... | ... |
hw/omap_i2c.c
... | ... | @@ -194,7 +194,7 @@ void omap_i2c_reset(struct omap_i2c_s *s) |
194 | 194 | static uint32_t omap_i2c_read(void *opaque, target_phys_addr_t addr) |
195 | 195 | { |
196 | 196 | struct omap_i2c_s *s = (struct omap_i2c_s *) opaque; |
197 | - int offset = addr - s->base; | |
197 | + int offset = addr & OMAP_MPUI_REG_MASK; | |
198 | 198 | uint16_t ret; |
199 | 199 | |
200 | 200 | switch (offset) { |
... | ... | @@ -286,7 +286,7 @@ static void omap_i2c_write(void *opaque, target_phys_addr_t addr, |
286 | 286 | uint32_t value) |
287 | 287 | { |
288 | 288 | struct omap_i2c_s *s = (struct omap_i2c_s *) opaque; |
289 | - int offset = addr - s->base; | |
289 | + int offset = addr & OMAP_MPUI_REG_MASK; | |
290 | 290 | int nack; |
291 | 291 | |
292 | 292 | switch (offset) { | ... | ... |
hw/omap_mmc.c
... | ... | @@ -269,7 +269,7 @@ static uint32_t omap_mmc_read(void *opaque, target_phys_addr_t offset) |
269 | 269 | { |
270 | 270 | uint16_t i; |
271 | 271 | struct omap_mmc_s *s = (struct omap_mmc_s *) opaque; |
272 | - offset -= s->base; | |
272 | + offset &= OMAP_MPUI_REG_MASK; | |
273 | 273 | |
274 | 274 | switch (offset) { |
275 | 275 | case 0x00: /* MMC_CMD */ |
... | ... | @@ -351,7 +351,7 @@ static void omap_mmc_write(void *opaque, target_phys_addr_t offset, |
351 | 351 | { |
352 | 352 | int i; |
353 | 353 | struct omap_mmc_s *s = (struct omap_mmc_s *) opaque; |
354 | - offset -= s->base; | |
354 | + offset &= OMAP_MPUI_REG_MASK; | |
355 | 355 | |
356 | 356 | switch (offset) { |
357 | 357 | case 0x00: /* MMC_CMD */ | ... | ... |