omap_gpmc: Clean up omap_gpmc_attach MemoryRegion conversion

Now that all callers of omap_gpmc_attach pass in a MemoryRegion*,
we can remove the base_update and unmap function pointer arguments,
and the opaque pointer that was passed into these callbacks.

We can also remove the base and size fields from omap_gpmc_cs_file_s
as these are no longer necessary (you don't need the base/size
to unmap a MemoryRegion the way you did to undo a mapping made
with cpu_register_physical_memory()).

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2011-08-28 16:22:18 +00:00
parent 7c00b9de8b
commit 07bc2f8077
3 changed files with 26 additions and 47 deletions

View file

@ -182,9 +182,7 @@ static void n8x0_nand_setup(struct n800_s *s)
sysbus_connect_irq(sysbus_from_qdev(s->nand), 0, sysbus_connect_irq(sysbus_from_qdev(s->nand), 0,
qdev_get_gpio_in(s->cpu->gpio, N8X0_ONENAND_GPIO)); qdev_get_gpio_in(s->cpu->gpio, N8X0_ONENAND_GPIO));
omap_gpmc_attach(s->cpu->gpmc, N8X0_ONENAND_CS, omap_gpmc_attach(s->cpu->gpmc, N8X0_ONENAND_CS,
sysbus_mmio_get_region(sysbus_from_qdev(s->nand), 0), sysbus_mmio_get_region(sysbus_from_qdev(s->nand), 0));
NULL, NULL,
s->nand);
otp_region = onenand_raw_otp(s->nand); otp_region = onenand_raw_otp(s->nand);
memcpy(otp_region + 0x000, n8x0_cal_wlan_mac, sizeof(n8x0_cal_wlan_mac)); memcpy(otp_region + 0x000, n8x0_cal_wlan_mac, sizeof(n8x0_cal_wlan_mac));
@ -781,10 +779,8 @@ static void n8x0_usb_setup(struct n800_s *s)
TUSBState *tusb = tusb6010_init(tusb_irq); TUSBState *tusb = tusb6010_init(tusb_irq);
/* Using the NOR interface */ /* Using the NOR interface */
omap_gpmc_attach(s->cpu->gpmc, N8X0_USB_ASYNC_CS, omap_gpmc_attach(s->cpu->gpmc, N8X0_USB_ASYNC_CS, tusb6010_async_io(tusb));
tusb6010_async_io(tusb), NULL, NULL, tusb); omap_gpmc_attach(s->cpu->gpmc, N8X0_USB_SYNC_CS, tusb6010_sync_io(tusb));
omap_gpmc_attach(s->cpu->gpmc, N8X0_USB_SYNC_CS,
tusb6010_sync_io(tusb), NULL, NULL, tusb);
s->usb = tusb; s->usb = tusb;
qdev_connect_gpio_out(s->cpu->gpio, N8X0_TUSB_ENABLE_GPIO, tusb_pwr); qdev_connect_gpio_out(s->cpu->gpio, N8X0_TUSB_ENABLE_GPIO, tusb_pwr);

View file

@ -120,9 +120,7 @@ void omap_sdrc_reset(struct omap_sdrc_s *s);
struct omap_gpmc_s; struct omap_gpmc_s;
struct omap_gpmc_s *omap_gpmc_init(target_phys_addr_t base, qemu_irq irq); struct omap_gpmc_s *omap_gpmc_init(target_phys_addr_t base, qemu_irq irq);
void omap_gpmc_reset(struct omap_gpmc_s *s); void omap_gpmc_reset(struct omap_gpmc_s *s);
void omap_gpmc_attach(struct omap_gpmc_s *s, int cs, MemoryRegion *iomem, void omap_gpmc_attach(struct omap_gpmc_s *s, int cs, MemoryRegion *iomem);
void (*base_upd)(void *opaque, target_phys_addr_t new),
void (*unmap)(void *opaque), void *opaque);
/* /*
* Common IRQ numbers for level 1 interrupt handler * Common IRQ numbers for level 1 interrupt handler

View file

@ -40,13 +40,8 @@ struct omap_gpmc_s {
int prefcount; int prefcount;
struct omap_gpmc_cs_file_s { struct omap_gpmc_cs_file_s {
uint32_t config[7]; uint32_t config[7];
target_phys_addr_t base;
size_t size;
MemoryRegion *iomem; MemoryRegion *iomem;
MemoryRegion container; MemoryRegion container;
void (*base_update)(void *opaque, target_phys_addr_t new);
void (*unmap)(void *opaque);
void *opaque;
} cs_file[8]; } cs_file[8];
int ecc_cs; int ecc_cs;
int ecc_ptr; int ecc_ptr;
@ -61,6 +56,12 @@ static void omap_gpmc_int_update(struct omap_gpmc_s *s)
static void omap_gpmc_cs_map(struct omap_gpmc_cs_file_s *f, int base, int mask) static void omap_gpmc_cs_map(struct omap_gpmc_cs_file_s *f, int base, int mask)
{ {
uint32_t size;
if (!f->iomem) {
return;
}
/* TODO: check for overlapping regions and report access errors */ /* TODO: check for overlapping regions and report access errors */
if ((mask != 0x8 && mask != 0xc && mask != 0xe && mask != 0xf) || if ((mask != 0x8 && mask != 0xc && mask != 0xe && mask != 0xf) ||
(base < 0 || base >= 0x40) || (base < 0 || base >= 0x40) ||
@ -70,39 +71,27 @@ static void omap_gpmc_cs_map(struct omap_gpmc_cs_file_s *f, int base, int mask)
return; return;
} }
if (!f->opaque) base <<= 24;
return; size = (0x0fffffff & ~(mask << 24)) + 1;
f->base = base << 24;
f->size = (0x0fffffff & ~(mask << 24)) + 1;
/* TODO: rather than setting the size of the mapping (which should be /* TODO: rather than setting the size of the mapping (which should be
* constant), the mask should cause wrapping of the address space, so * constant), the mask should cause wrapping of the address space, so
* that the same memory becomes accessible at every <i>size</i> bytes * that the same memory becomes accessible at every <i>size</i> bytes
* starting from <i>base</i>. */ * starting from <i>base</i>. */
if (f->iomem) { memory_region_init(&f->container, "omap-gpmc-file", size);
memory_region_init(&f->container, "omap-gpmc-file", f->size); memory_region_add_subregion(&f->container, 0, f->iomem);
memory_region_add_subregion(&f->container, 0, f->iomem); memory_region_add_subregion(get_system_memory(), base,
memory_region_add_subregion(get_system_memory(), f->base, &f->container);
&f->container);
}
if (f->base_update)
f->base_update(f->opaque, f->base);
} }
static void omap_gpmc_cs_unmap(struct omap_gpmc_cs_file_s *f) static void omap_gpmc_cs_unmap(struct omap_gpmc_cs_file_s *f)
{ {
if (f->size) { if (!f->iomem) {
if (f->unmap) return;
f->unmap(f->opaque);
if (f->iomem) {
memory_region_del_subregion(get_system_memory(), &f->container);
memory_region_del_subregion(&f->container, f->iomem);
memory_region_destroy(&f->container);
}
f->base = 0;
f->size = 0;
} }
memory_region_del_subregion(get_system_memory(), &f->container);
memory_region_del_subregion(&f->container, f->iomem);
memory_region_destroy(&f->container);
} }
void omap_gpmc_reset(struct omap_gpmc_s *s) void omap_gpmc_reset(struct omap_gpmc_s *s)
@ -399,19 +388,18 @@ struct omap_gpmc_s *omap_gpmc_init(target_phys_addr_t base, qemu_irq irq)
struct omap_gpmc_s *s = (struct omap_gpmc_s *) struct omap_gpmc_s *s = (struct omap_gpmc_s *)
g_malloc0(sizeof(struct omap_gpmc_s)); g_malloc0(sizeof(struct omap_gpmc_s));
omap_gpmc_reset(s);
memory_region_init_io(&s->iomem, &omap_gpmc_ops, s, "omap-gpmc", 0x1000); memory_region_init_io(&s->iomem, &omap_gpmc_ops, s, "omap-gpmc", 0x1000);
memory_region_add_subregion(get_system_memory(), base, &s->iomem); memory_region_add_subregion(get_system_memory(), base, &s->iomem);
omap_gpmc_reset(s);
return s; return s;
} }
void omap_gpmc_attach(struct omap_gpmc_s *s, int cs, MemoryRegion *iomem, void omap_gpmc_attach(struct omap_gpmc_s *s, int cs, MemoryRegion *iomem)
void (*base_upd)(void *opaque, target_phys_addr_t new),
void (*unmap)(void *opaque), void *opaque)
{ {
struct omap_gpmc_cs_file_s *f; struct omap_gpmc_cs_file_s *f;
assert(iomem);
if (cs < 0 || cs >= 8) { if (cs < 0 || cs >= 8) {
fprintf(stderr, "%s: bad chip-select %i\n", __FUNCTION__, cs); fprintf(stderr, "%s: bad chip-select %i\n", __FUNCTION__, cs);
@ -420,9 +408,6 @@ void omap_gpmc_attach(struct omap_gpmc_s *s, int cs, MemoryRegion *iomem,
f = &s->cs_file[cs]; f = &s->cs_file[cs];
f->iomem = iomem; f->iomem = iomem;
f->base_update = base_upd;
f->unmap = unmap;
f->opaque = opaque;
if (f->config[6] & (1 << 6)) /* CSVALID */ if (f->config[6] & (1 << 6)) /* CSVALID */
omap_gpmc_cs_map(f, f->config[6] & 0x1f, /* MASKADDR */ omap_gpmc_cs_map(f, f->config[6] & 0x1f, /* MASKADDR */