2 * TI OMAP L4 interconnect emulation.
4 * Copyright (C) 2007-2009 Nokia Corporation
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License as
9 * published by the Free Software Foundation; either version 2 or
10 * (at your option) any later version of the License.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License along
18 * with this program; if not, see <http://www.gnu.org/licenses/>.
24 MemoryRegion *address_space;
25 target_phys_addr_t base;
27 struct omap_target_agent_s ta[0];
30 struct omap_l4_s *omap_l4_init(MemoryRegion *address_space,
31 target_phys_addr_t base, int ta_num)
33 struct omap_l4_s *bus = g_malloc0(
34 sizeof(*bus) + ta_num * sizeof(*bus->ta));
36 bus->address_space = address_space;
43 target_phys_addr_t omap_l4_region_base(struct omap_target_agent_s *ta,
46 return ta->bus->base + ta->start[region].offset;
49 target_phys_addr_t omap_l4_region_size(struct omap_target_agent_s *ta,
52 return ta->start[region].size;
55 static uint32_t omap_l4ta_read(void *opaque, target_phys_addr_t addr)
57 struct omap_target_agent_s *s = (struct omap_target_agent_s *) opaque;
60 case 0x00: /* COMPONENT */
63 case 0x20: /* AGENT_CONTROL */
66 case 0x28: /* AGENT_STATUS */
74 static void omap_l4ta_write(void *opaque, target_phys_addr_t addr,
77 struct omap_target_agent_s *s = (struct omap_target_agent_s *) opaque;
80 case 0x00: /* COMPONENT */
81 case 0x28: /* AGENT_STATUS */
85 case 0x20: /* AGENT_CONTROL */
86 s->control = value & 0x01000700;
87 if (value & 1) /* OCP_RESET */
88 s->status &= ~1; /* REQ_TIMEOUT */
96 static CPUReadMemoryFunc * const omap_l4ta_readfn[] = {
102 static CPUWriteMemoryFunc * const omap_l4ta_writefn[] = {
103 omap_badwidth_write32,
104 omap_badwidth_write32,
108 struct omap_target_agent_s *omap_l4ta_get(struct omap_l4_s *bus,
109 const struct omap_l4_region_s *regions,
110 const struct omap_l4_agent_info_s *agents,
114 struct omap_target_agent_s *ta = NULL;
115 const struct omap_l4_agent_info_s *info = NULL;
117 for (i = 0; i < bus->ta_num; i ++)
118 if (agents[i].ta == cs) {
124 fprintf(stderr, "%s: bad target agent (%i)\n", __FUNCTION__, cs);
129 ta->start = ®ions[info->region];
130 ta->regions = info->regions;
132 ta->component = ('Q' << 24) | ('E' << 16) | ('M' << 8) | ('U' << 0);
133 ta->status = 0x00000000;
134 ta->control = 0x00000200; /* XXX 01000200 for L4TAO */
136 iomemtype = cpu_register_io_memory(omap_l4ta_readfn,
137 omap_l4ta_writefn, ta, DEVICE_NATIVE_ENDIAN);
138 ta->base = omap_l4_attach(ta, info->ta_region, iomemtype);
143 target_phys_addr_t omap_l4_attach(struct omap_target_agent_s *ta, int region,
146 target_phys_addr_t base;
149 if (region < 0 || region >= ta->regions) {
150 fprintf(stderr, "%s: bad io region (%i)\n", __FUNCTION__, region);
154 base = ta->bus->base + ta->start[region].offset;
155 size = ta->start[region].size;
157 cpu_register_physical_memory(base, size, iotype);
163 target_phys_addr_t omap_l4_attach_region(struct omap_target_agent_s *ta,
164 int region, MemoryRegion *mr)
166 target_phys_addr_t base;
168 if (region < 0 || region >= ta->regions) {
169 fprintf(stderr, "%s: bad io region (%i)\n", __FUNCTION__, region);
173 base = ta->bus->base + ta->start[region].offset;
175 memory_region_add_subregion(ta->bus->address_space, base, mr);