Commit c66fb5bc0a1a1f04083fd52467d4e72942f7d38b
1 parent
4eeed608
Collapse omap peripherals on L4 bus into one io entry (temporarily).
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4489 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
5 changed files
with
148 additions
and
20 deletions
hw/omap.h
| ... | ... | @@ -71,6 +71,7 @@ struct omap_target_agent_s; |
| 71 | 71 | struct omap_target_agent_s *omap_l4ta_get(struct omap_l4_s *bus, int cs); |
| 72 | 72 | target_phys_addr_t omap_l4_attach(struct omap_target_agent_s *ta, int region, |
| 73 | 73 | int iotype); |
| 74 | +# define l4_register_io_memory cpu_register_io_memory | |
| 74 | 75 | |
| 75 | 76 | struct omap_intr_handler_s; |
| 76 | 77 | struct omap_intr_handler_s *omap_inth_init(target_phys_addr_t base, |
| ... | ... | @@ -1135,4 +1136,13 @@ inline static int debug_register_io_memory(int io_index, |
| 1135 | 1136 | # define cpu_register_io_memory debug_register_io_memory |
| 1136 | 1137 | # endif |
| 1137 | 1138 | |
| 1139 | +/* Define when we want to reduce the number of IO regions registered. */ | |
| 1140 | +# define L4_MUX_HACK | |
| 1141 | + | |
| 1142 | +# ifdef L4_MUX_HACK | |
| 1143 | +# undef l4_register_io_memory | |
| 1144 | +int l4_register_io_memory(int io_index, CPUReadMemoryFunc **mem_read, | |
| 1145 | + CPUWriteMemoryFunc **mem_write, void *opaque); | |
| 1146 | +# endif | |
| 1147 | + | |
| 1138 | 1148 | #endif /* hw_omap_h */ | ... | ... |
hw/omap2.c
| ... | ... | @@ -485,7 +485,7 @@ struct omap_gp_timer_s *omap_gp_timer_init(struct omap_target_agent_s *ta, |
| 485 | 485 | omap_gp_timer_reset(s); |
| 486 | 486 | omap_gp_timer_clk_setup(s); |
| 487 | 487 | |
| 488 | - iomemtype = cpu_register_io_memory(0, omap_gp_timer_readfn, | |
| 488 | + iomemtype = l4_register_io_memory(0, omap_gp_timer_readfn, | |
| 489 | 489 | omap_gp_timer_writefn, s); |
| 490 | 490 | s->base = omap_l4_attach(ta, 0, iomemtype); |
| 491 | 491 | |
| ... | ... | @@ -557,7 +557,7 @@ void omap_synctimer_init(struct omap_target_agent_s *ta, |
| 557 | 557 | struct omap_synctimer_s *s = &mpu->synctimer; |
| 558 | 558 | |
| 559 | 559 | omap_synctimer_reset(s); |
| 560 | - s->base = omap_l4_attach(ta, 0, cpu_register_io_memory(0, | |
| 560 | + s->base = omap_l4_attach(ta, 0, l4_register_io_memory(0, | |
| 561 | 561 | omap_synctimer_readfn, omap_synctimer_writefn, s)); |
| 562 | 562 | } |
| 563 | 563 | |
| ... | ... | @@ -960,7 +960,7 @@ static void omap_gpio_module_init(struct omap2_gpio_s *s, |
| 960 | 960 | s->wkup = wkup; |
| 961 | 961 | s->in = qemu_allocate_irqs(omap_gpio_module_set, s, 32); |
| 962 | 962 | |
| 963 | - iomemtype = cpu_register_io_memory(0, omap_gpio_module_readfn, | |
| 963 | + iomemtype = l4_register_io_memory(0, omap_gpio_module_readfn, | |
| 964 | 964 | omap_gpio_module_writefn, s); |
| 965 | 965 | s->base = omap_l4_attach(ta, region, iomemtype); |
| 966 | 966 | } |
| ... | ... | @@ -1071,7 +1071,7 @@ struct omap_gpif_s *omap2_gpio_init(struct omap_target_agent_s *ta, |
| 1071 | 1071 | |
| 1072 | 1072 | omap_gpif_reset(s); |
| 1073 | 1073 | |
| 1074 | - iomemtype = cpu_register_io_memory(0, omap_gpif_top_readfn, | |
| 1074 | + iomemtype = l4_register_io_memory(0, omap_gpif_top_readfn, | |
| 1075 | 1075 | omap_gpif_top_writefn, s); |
| 1076 | 1076 | s->topbase = omap_l4_attach(ta, 1, iomemtype); |
| 1077 | 1077 | |
| ... | ... | @@ -1401,7 +1401,7 @@ struct omap_mcspi_s *omap_mcspi_init(struct omap_target_agent_s *ta, int chnum, |
| 1401 | 1401 | } |
| 1402 | 1402 | omap_mcspi_reset(s); |
| 1403 | 1403 | |
| 1404 | - iomemtype = cpu_register_io_memory(0, omap_mcspi_readfn, | |
| 1404 | + iomemtype = l4_register_io_memory(0, omap_mcspi_readfn, | |
| 1405 | 1405 | omap_mcspi_writefn, s); |
| 1406 | 1406 | s->base = omap_l4_attach(ta, 0, iomemtype); |
| 1407 | 1407 | |
| ... | ... | @@ -1602,7 +1602,7 @@ struct omap_sti_s *omap_sti_init(struct omap_target_agent_s *ta, |
| 1602 | 1602 | |
| 1603 | 1603 | s->chr = chr ?: qemu_chr_open("null"); |
| 1604 | 1604 | |
| 1605 | - iomemtype = cpu_register_io_memory(0, omap_sti_readfn, | |
| 1605 | + iomemtype = l4_register_io_memory(0, omap_sti_readfn, | |
| 1606 | 1606 | omap_sti_writefn, s); |
| 1607 | 1607 | s->base = omap_l4_attach(ta, 0, iomemtype); |
| 1608 | 1608 | |
| ... | ... | @@ -1631,6 +1631,90 @@ struct omap_l4_s { |
| 1631 | 1631 | struct omap_target_agent_s ta[0]; |
| 1632 | 1632 | }; |
| 1633 | 1633 | |
| 1634 | +#ifdef L4_MUX_HACK | |
| 1635 | +static int omap_l4_io_entries; | |
| 1636 | +static int omap_cpu_io_entry; | |
| 1637 | +static struct omap_l4_entry { | |
| 1638 | + CPUReadMemoryFunc **mem_read; | |
| 1639 | + CPUWriteMemoryFunc **mem_write; | |
| 1640 | + void *opaque; | |
| 1641 | +} *omap_l4_io_entry; | |
| 1642 | +static CPUReadMemoryFunc **omap_l4_io_readb_fn; | |
| 1643 | +static CPUReadMemoryFunc **omap_l4_io_readh_fn; | |
| 1644 | +static CPUReadMemoryFunc **omap_l4_io_readw_fn; | |
| 1645 | +static CPUWriteMemoryFunc **omap_l4_io_writeb_fn; | |
| 1646 | +static CPUWriteMemoryFunc **omap_l4_io_writeh_fn; | |
| 1647 | +static CPUWriteMemoryFunc **omap_l4_io_writew_fn; | |
| 1648 | +static void **omap_l4_io_opaque; | |
| 1649 | + | |
| 1650 | +int l4_register_io_memory(int io_index, CPUReadMemoryFunc **mem_read, | |
| 1651 | + CPUWriteMemoryFunc **mem_write, void *opaque) | |
| 1652 | +{ | |
| 1653 | + omap_l4_io_entry[omap_l4_io_entries].mem_read = mem_read; | |
| 1654 | + omap_l4_io_entry[omap_l4_io_entries].mem_write = mem_write; | |
| 1655 | + omap_l4_io_entry[omap_l4_io_entries].opaque = opaque; | |
| 1656 | + | |
| 1657 | + return omap_l4_io_entries ++; | |
| 1658 | +} | |
| 1659 | + | |
| 1660 | +static uint32_t omap_l4_io_readb(void *opaque, target_phys_addr_t addr) | |
| 1661 | +{ | |
| 1662 | + unsigned int i = (addr - OMAP2_L4_BASE) >> TARGET_PAGE_BITS; | |
| 1663 | + | |
| 1664 | + return omap_l4_io_readb_fn[i](omap_l4_io_opaque[i], addr); | |
| 1665 | +} | |
| 1666 | + | |
| 1667 | +static uint32_t omap_l4_io_readh(void *opaque, target_phys_addr_t addr) | |
| 1668 | +{ | |
| 1669 | + unsigned int i = (addr - OMAP2_L4_BASE) >> TARGET_PAGE_BITS; | |
| 1670 | + | |
| 1671 | + return omap_l4_io_readh_fn[i](omap_l4_io_opaque[i], addr); | |
| 1672 | +} | |
| 1673 | + | |
| 1674 | +static uint32_t omap_l4_io_readw(void *opaque, target_phys_addr_t addr) | |
| 1675 | +{ | |
| 1676 | + unsigned int i = (addr - OMAP2_L4_BASE) >> TARGET_PAGE_BITS; | |
| 1677 | + | |
| 1678 | + return omap_l4_io_readw_fn[i](omap_l4_io_opaque[i], addr); | |
| 1679 | +} | |
| 1680 | + | |
| 1681 | +static void omap_l4_io_writeb(void *opaque, target_phys_addr_t addr, | |
| 1682 | + uint32_t value) | |
| 1683 | +{ | |
| 1684 | + unsigned int i = (addr - OMAP2_L4_BASE) >> TARGET_PAGE_BITS; | |
| 1685 | + | |
| 1686 | + return omap_l4_io_writeb_fn[i](omap_l4_io_opaque[i], addr, value); | |
| 1687 | +} | |
| 1688 | + | |
| 1689 | +static void omap_l4_io_writeh(void *opaque, target_phys_addr_t addr, | |
| 1690 | + uint32_t value) | |
| 1691 | +{ | |
| 1692 | + unsigned int i = (addr - OMAP2_L4_BASE) >> TARGET_PAGE_BITS; | |
| 1693 | + | |
| 1694 | + return omap_l4_io_writeh_fn[i](omap_l4_io_opaque[i], addr, value); | |
| 1695 | +} | |
| 1696 | + | |
| 1697 | +static void omap_l4_io_writew(void *opaque, target_phys_addr_t addr, | |
| 1698 | + uint32_t value) | |
| 1699 | +{ | |
| 1700 | + unsigned int i = (addr - OMAP2_L4_BASE) >> TARGET_PAGE_BITS; | |
| 1701 | + | |
| 1702 | + return omap_l4_io_writew_fn[i](omap_l4_io_opaque[i], addr, value); | |
| 1703 | +} | |
| 1704 | + | |
| 1705 | +static CPUReadMemoryFunc *omap_l4_io_readfn[] = { | |
| 1706 | + omap_l4_io_readb, | |
| 1707 | + omap_l4_io_readh, | |
| 1708 | + omap_l4_io_readw, | |
| 1709 | +}; | |
| 1710 | + | |
| 1711 | +static CPUWriteMemoryFunc *omap_l4_io_writefn[] = { | |
| 1712 | + omap_l4_io_writeb, | |
| 1713 | + omap_l4_io_writeh, | |
| 1714 | + omap_l4_io_writew, | |
| 1715 | +}; | |
| 1716 | +#endif | |
| 1717 | + | |
| 1634 | 1718 | struct omap_l4_s *omap_l4_init(target_phys_addr_t base, int ta_num) |
| 1635 | 1719 | { |
| 1636 | 1720 | struct omap_l4_s *bus = qemu_mallocz( |
| ... | ... | @@ -1639,6 +1723,23 @@ struct omap_l4_s *omap_l4_init(target_phys_addr_t base, int ta_num) |
| 1639 | 1723 | bus->ta_num = ta_num; |
| 1640 | 1724 | bus->base = base; |
| 1641 | 1725 | |
| 1726 | +#ifdef L4_MUX_HACK | |
| 1727 | + omap_l4_io_entries = 1; | |
| 1728 | + omap_l4_io_entry = qemu_mallocz(125 * sizeof(*omap_l4_io_entry)); | |
| 1729 | + | |
| 1730 | + omap_cpu_io_entry = | |
| 1731 | + cpu_register_io_memory(0, omap_l4_io_readfn, | |
| 1732 | + omap_l4_io_writefn, bus); | |
| 1733 | +# define L4_PAGES (0xb4000 / TARGET_PAGE_SIZE) | |
| 1734 | + omap_l4_io_readb_fn = qemu_mallocz(sizeof(void *) * L4_PAGES); | |
| 1735 | + omap_l4_io_readh_fn = qemu_mallocz(sizeof(void *) * L4_PAGES); | |
| 1736 | + omap_l4_io_readw_fn = qemu_mallocz(sizeof(void *) * L4_PAGES); | |
| 1737 | + omap_l4_io_writeb_fn = qemu_mallocz(sizeof(void *) * L4_PAGES); | |
| 1738 | + omap_l4_io_writeh_fn = qemu_mallocz(sizeof(void *) * L4_PAGES); | |
| 1739 | + omap_l4_io_writew_fn = qemu_mallocz(sizeof(void *) * L4_PAGES); | |
| 1740 | + omap_l4_io_opaque = qemu_mallocz(sizeof(void *) * L4_PAGES); | |
| 1741 | +#endif | |
| 1742 | + | |
| 1642 | 1743 | return bus; |
| 1643 | 1744 | } |
| 1644 | 1745 | |
| ... | ... | @@ -1917,15 +2018,14 @@ struct omap_target_agent_s *omap_l4ta_get(struct omap_l4_s *bus, int cs) |
| 1917 | 2018 | ta->bus = bus; |
| 1918 | 2019 | ta->start = &omap_l4_region[info->region]; |
| 1919 | 2020 | ta->regions = info->regions; |
| 1920 | - ta->base = bus->base + ta->start[info->ta_region].offset; | |
| 1921 | 2021 | |
| 1922 | 2022 | ta->component = ('Q' << 24) | ('E' << 16) | ('M' << 8) | ('U' << 0); |
| 1923 | 2023 | ta->status = 0x00000000; |
| 1924 | 2024 | ta->control = 0x00000200; /* XXX 01000200 for L4TAO */ |
| 1925 | 2025 | |
| 1926 | - iomemtype = cpu_register_io_memory(0, omap_l4ta_readfn, | |
| 2026 | + iomemtype = l4_register_io_memory(0, omap_l4ta_readfn, | |
| 1927 | 2027 | omap_l4ta_writefn, ta); |
| 1928 | - cpu_register_physical_memory(ta->base, 0x200, iomemtype); | |
| 2028 | + ta->base = omap_l4_attach(ta, info->ta_region, iomemtype); | |
| 1929 | 2029 | |
| 1930 | 2030 | return ta; |
| 1931 | 2031 | } |
| ... | ... | @@ -1934,7 +2034,10 @@ target_phys_addr_t omap_l4_attach(struct omap_target_agent_s *ta, int region, |
| 1934 | 2034 | int iotype) |
| 1935 | 2035 | { |
| 1936 | 2036 | target_phys_addr_t base; |
| 1937 | - size_t size; | |
| 2037 | + ssize_t size; | |
| 2038 | +#ifdef L4_MUX_HACK | |
| 2039 | + int i; | |
| 2040 | +#endif | |
| 1938 | 2041 | |
| 1939 | 2042 | if (region < 0 || region >= ta->regions) { |
| 1940 | 2043 | fprintf(stderr, "%s: bad io region (%i)\n", __FUNCTION__, region); |
| ... | ... | @@ -1943,8 +2046,23 @@ target_phys_addr_t omap_l4_attach(struct omap_target_agent_s *ta, int region, |
| 1943 | 2046 | |
| 1944 | 2047 | base = ta->bus->base + ta->start[region].offset; |
| 1945 | 2048 | size = ta->start[region].size; |
| 1946 | - if (iotype) | |
| 2049 | + if (iotype) { | |
| 2050 | +#ifndef L4_MUX_HACK | |
| 1947 | 2051 | cpu_register_physical_memory(base, size, iotype); |
| 2052 | +#else | |
| 2053 | + cpu_register_physical_memory(base, size, omap_cpu_io_entry); | |
| 2054 | + i = (base - ta->bus->base) / TARGET_PAGE_SIZE; | |
| 2055 | + for (; size > 0; size -= TARGET_PAGE_SIZE, i ++) { | |
| 2056 | + omap_l4_io_readb_fn[i] = omap_l4_io_entry[iotype].mem_read[0]; | |
| 2057 | + omap_l4_io_readh_fn[i] = omap_l4_io_entry[iotype].mem_read[1]; | |
| 2058 | + omap_l4_io_readw_fn[i] = omap_l4_io_entry[iotype].mem_read[2]; | |
| 2059 | + omap_l4_io_writeb_fn[i] = omap_l4_io_entry[iotype].mem_write[0]; | |
| 2060 | + omap_l4_io_writeh_fn[i] = omap_l4_io_entry[iotype].mem_write[1]; | |
| 2061 | + omap_l4_io_writew_fn[i] = omap_l4_io_entry[iotype].mem_write[2]; | |
| 2062 | + omap_l4_io_opaque[i] = omap_l4_io_entry[iotype].opaque; | |
| 2063 | + } | |
| 2064 | +#endif | |
| 2065 | + } | |
| 1948 | 2066 | |
| 1949 | 2067 | return base; |
| 1950 | 2068 | } |
| ... | ... | @@ -2036,7 +2154,7 @@ static CPUWriteMemoryFunc *omap_tap_writefn[] = { |
| 2036 | 2154 | void omap_tap_init(struct omap_target_agent_s *ta, |
| 2037 | 2155 | struct omap_mpu_state_s *mpu) |
| 2038 | 2156 | { |
| 2039 | - mpu->tap_base = omap_l4_attach(ta, 0, cpu_register_io_memory(0, | |
| 2157 | + mpu->tap_base = omap_l4_attach(ta, 0, l4_register_io_memory(0, | |
| 2040 | 2158 | omap_tap_readfn, omap_tap_writefn, mpu)); |
| 2041 | 2159 | } |
| 2042 | 2160 | |
| ... | ... | @@ -2755,7 +2873,7 @@ struct omap_prcm_s *omap_prcm_init(struct omap_target_agent_s *ta, |
| 2755 | 2873 | s->mpu = mpu; |
| 2756 | 2874 | omap_prcm_coldreset(s); |
| 2757 | 2875 | |
| 2758 | - iomemtype = cpu_register_io_memory(0, omap_prcm_readfn, | |
| 2876 | + iomemtype = l4_register_io_memory(0, omap_prcm_readfn, | |
| 2759 | 2877 | omap_prcm_writefn, s); |
| 2760 | 2878 | s->base = omap_l4_attach(ta, 0, iomemtype); |
| 2761 | 2879 | omap_l4_attach(ta, 1, iomemtype); |
| ... | ... | @@ -3079,7 +3197,7 @@ struct omap_sysctl_s *omap_sysctl_init(struct omap_target_agent_s *ta, |
| 3079 | 3197 | s->mpu = mpu; |
| 3080 | 3198 | omap_sysctl_reset(s); |
| 3081 | 3199 | |
| 3082 | - iomemtype = cpu_register_io_memory(0, omap_sysctl_readfn, | |
| 3200 | + iomemtype = l4_register_io_memory(0, omap_sysctl_readfn, | |
| 3083 | 3201 | omap_sysctl_writefn, s); |
| 3084 | 3202 | s->base = omap_l4_attach(ta, 0, iomemtype); |
| 3085 | 3203 | omap_l4_attach(ta, 0, iomemtype); | ... | ... |
hw/omap_dss.c
| ... | ... | @@ -1059,13 +1059,13 @@ struct omap_dss_s *omap_dss_init(struct omap_target_agent_s *ta, |
| 1059 | 1059 | s->state = ds; |
| 1060 | 1060 | omap_dss_reset(s); |
| 1061 | 1061 | |
| 1062 | - iomemtype[0] = cpu_register_io_memory(0, omap_diss1_readfn, | |
| 1062 | + iomemtype[0] = l4_register_io_memory(0, omap_diss1_readfn, | |
| 1063 | 1063 | omap_diss1_writefn, s); |
| 1064 | - iomemtype[1] = cpu_register_io_memory(0, omap_disc1_readfn, | |
| 1064 | + iomemtype[1] = l4_register_io_memory(0, omap_disc1_readfn, | |
| 1065 | 1065 | omap_disc1_writefn, s); |
| 1066 | - iomemtype[2] = cpu_register_io_memory(0, omap_rfbi1_readfn, | |
| 1066 | + iomemtype[2] = l4_register_io_memory(0, omap_rfbi1_readfn, | |
| 1067 | 1067 | omap_rfbi1_writefn, s); |
| 1068 | - iomemtype[3] = cpu_register_io_memory(0, omap_venc1_readfn, | |
| 1068 | + iomemtype[3] = l4_register_io_memory(0, omap_venc1_readfn, | |
| 1069 | 1069 | omap_venc1_writefn, s); |
| 1070 | 1070 | iomemtype[4] = cpu_register_io_memory(0, omap_im3_readfn, |
| 1071 | 1071 | omap_im3_writefn, s); | ... | ... |
hw/omap_i2c.c
| ... | ... | @@ -526,7 +526,7 @@ struct omap_i2c_s *omap2_i2c_init(struct omap_target_agent_s *ta, |
| 526 | 526 | s->bus = i2c_init_bus(); |
| 527 | 527 | omap_i2c_reset(s); |
| 528 | 528 | |
| 529 | - iomemtype = cpu_register_io_memory(0, omap_i2c_readfn, | |
| 529 | + iomemtype = l4_register_io_memory(0, omap_i2c_readfn, | |
| 530 | 530 | omap_i2c_writefn, s); |
| 531 | 531 | s->base = omap_l4_attach(ta, 0, iomemtype); |
| 532 | 532 | ... | ... |
hw/omap_mmc.c
| ... | ... | @@ -615,7 +615,7 @@ struct omap_mmc_s *omap2_mmc_init(struct omap_target_agent_s *ta, |
| 615 | 615 | |
| 616 | 616 | omap_mmc_reset(s); |
| 617 | 617 | |
| 618 | - iomemtype = cpu_register_io_memory(0, omap_mmc_readfn, | |
| 618 | + iomemtype = l4_register_io_memory(0, omap_mmc_readfn, | |
| 619 | 619 | omap_mmc_writefn, s); |
| 620 | 620 | s->base = omap_l4_attach(ta, 0, iomemtype); |
| 621 | 621 | ... | ... |