mirror of https://github.com/xemu-project/xemu.git
Set proper device-width for vexpress flash
Create vexpress specific pflash registration function which properly configures the device-width of 16 bits (2 bytes) for the NOR flash on the vexpress platform. This change is required for buffered flash writes to work properly. Signed-off-by: Roy Franz <roy.franz@linaro.org> Message-id: 1386279359-32286-5-git-send-email-roy.franz@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
2003889f67
commit
b8433303fb
|
@ -480,6 +480,36 @@ static void vexpress_modify_dtb(const struct arm_boot_info *info, void *fdt)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Open code a private version of pflash registration since we
|
||||||
|
* need to set non-default device width for VExpress platform.
|
||||||
|
*/
|
||||||
|
static pflash_t *ve_pflash_cfi01_register(hwaddr base, const char *name,
|
||||||
|
DriveInfo *di)
|
||||||
|
{
|
||||||
|
DeviceState *dev = qdev_create(NULL, "cfi.pflash01");
|
||||||
|
|
||||||
|
if (di && qdev_prop_set_drive(dev, "drive", di->bdrv)) {
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
qdev_prop_set_uint32(dev, "num-blocks",
|
||||||
|
VEXPRESS_FLASH_SIZE / VEXPRESS_FLASH_SECT_SIZE);
|
||||||
|
qdev_prop_set_uint64(dev, "sector-length", VEXPRESS_FLASH_SECT_SIZE);
|
||||||
|
qdev_prop_set_uint8(dev, "width", 4);
|
||||||
|
qdev_prop_set_uint8(dev, "device-width", 2);
|
||||||
|
qdev_prop_set_uint8(dev, "big-endian", 0);
|
||||||
|
qdev_prop_set_uint16(dev, "id0", 0x00);
|
||||||
|
qdev_prop_set_uint16(dev, "id1", 0x89);
|
||||||
|
qdev_prop_set_uint16(dev, "id2", 0x00);
|
||||||
|
qdev_prop_set_uint16(dev, "id3", 0x18);
|
||||||
|
qdev_prop_set_string(dev, "name", name);
|
||||||
|
qdev_init_nofail(dev);
|
||||||
|
|
||||||
|
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, base);
|
||||||
|
return OBJECT_CHECK(pflash_t, (dev), "cfi.pflash01");
|
||||||
|
}
|
||||||
|
|
||||||
static void vexpress_common_init(VEDBoardInfo *daughterboard,
|
static void vexpress_common_init(VEDBoardInfo *daughterboard,
|
||||||
QEMUMachineInitArgs *args)
|
QEMUMachineInitArgs *args)
|
||||||
{
|
{
|
||||||
|
@ -561,11 +591,8 @@ static void vexpress_common_init(VEDBoardInfo *daughterboard,
|
||||||
sysbus_create_simple("pl111", map[VE_CLCD], pic[14]);
|
sysbus_create_simple("pl111", map[VE_CLCD], pic[14]);
|
||||||
|
|
||||||
dinfo = drive_get_next(IF_PFLASH);
|
dinfo = drive_get_next(IF_PFLASH);
|
||||||
pflash0 = pflash_cfi01_register(map[VE_NORFLASH0], NULL, "vexpress.flash0",
|
pflash0 = ve_pflash_cfi01_register(map[VE_NORFLASH0], "vexpress.flash0",
|
||||||
VEXPRESS_FLASH_SIZE, dinfo ? dinfo->bdrv : NULL,
|
dinfo);
|
||||||
VEXPRESS_FLASH_SECT_SIZE,
|
|
||||||
VEXPRESS_FLASH_SIZE / VEXPRESS_FLASH_SECT_SIZE, 4,
|
|
||||||
0x00, 0x89, 0x00, 0x18, 0);
|
|
||||||
if (!pflash0) {
|
if (!pflash0) {
|
||||||
fprintf(stderr, "vexpress: error registering flash 0.\n");
|
fprintf(stderr, "vexpress: error registering flash 0.\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
|
@ -580,11 +607,8 @@ static void vexpress_common_init(VEDBoardInfo *daughterboard,
|
||||||
}
|
}
|
||||||
|
|
||||||
dinfo = drive_get_next(IF_PFLASH);
|
dinfo = drive_get_next(IF_PFLASH);
|
||||||
if (!pflash_cfi01_register(map[VE_NORFLASH1], NULL, "vexpress.flash1",
|
if (!ve_pflash_cfi01_register(map[VE_NORFLASH1], "vexpress.flash1",
|
||||||
VEXPRESS_FLASH_SIZE, dinfo ? dinfo->bdrv : NULL,
|
dinfo)) {
|
||||||
VEXPRESS_FLASH_SECT_SIZE,
|
|
||||||
VEXPRESS_FLASH_SIZE / VEXPRESS_FLASH_SECT_SIZE, 4,
|
|
||||||
0x00, 0x89, 0x00, 0x18, 0)) {
|
|
||||||
fprintf(stderr, "vexpress: error registering flash 1.\n");
|
fprintf(stderr, "vexpress: error registering flash 1.\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue