[PATCH qemu 05/12] ast2400: handle SPI flash Command mode (read only)
Andrew Jeffery
andrew at aj.id.au
Tue Jun 7 16:04:37 AEST 2016
On Sun, 2016-05-29 at 23:19 +0200, Cédric Le Goater wrote:
> We can now use directly the m25p80 flash storage to handle memory
> accesses when the SPI flash slave is configured in Command mode. Only
> read only accesses are handled. Command mode is only required by
> U-Boot, Linux does not use it yet.
>
> Handling write accesses would demand more changes to the m25p80 flash
> model.
>
> Signed-off-by: Cédric Le Goater <clg at kaod.org>
Assuming the m25p80_get_storage() is acceptable upstream,
Reviewed-by: Andrew Jeffery <andrew at aj.id.au>
> ---
> hw/ssi/aspeed_smc.c | 18 +++++++++++++++---
> include/hw/ssi/aspeed_smc.h | 2 ++
> 2 files changed, 17 insertions(+), 3 deletions(-)
>
> diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c
> index 4175356141e7..159ab691051d 100644
> --- a/hw/ssi/aspeed_smc.c
> +++ b/hw/ssi/aspeed_smc.c
> @@ -28,6 +28,7 @@
> #include "qemu/log.h"
> #include "include/qemu/error-report.h"
> #include "exec/address-spaces.h"
> +#include "hw/block/flash.h"
>
> #include "hw/ssi/aspeed_smc.h"
>
> @@ -284,8 +285,9 @@ static uint64_t aspeed_smc_flash_read(void *opaque, hwaddr addr, unsigned size)
> ret = (ret << 8) | ssi_transfer(s->spi, 0x0);
> }
> } else {
> - error_report("%s: flash not in usermode", __func__);
> - ret = -1;
> + for (i = 0; i < size; i++) {
> + ret = (ret << 8) | fl->storage[addr + i];
> + }
> }
>
> return ret;
> @@ -330,6 +332,11 @@ static void aspeed_smc_flash_reset(DeviceState *d)
>
> static int aspeed_smc_flash_init(SysBusDevice *sbd)
> {
> + DeviceState *dev = DEVICE(sbd);
> + AspeedSMCFlashState *s = ASPEED_SMC_FLASH(dev);
> +
> + s->size = 0;
> + s->storage = NULL;
> return 0;
> }
>
> @@ -422,8 +429,13 @@ void aspeed_smc_init_flashes(AspeedSMCState *s, const char *flashtype)
> cs_line = qdev_get_gpio_in_named(fl->flash, SSI_GPIO_CS, 0);
> sysbus_connect_irq(SYS_BUS_DEVICE(s), i + 1, cs_line);
>
> + fl->storage = m25p80_get_storage(DEVICE(fl->flash), &fl->size);
> + if (fl->size > aspeed_segments[s->smc_type][i].size) {
> + fl->size = aspeed_segments[s->smc_type][i].size;
> + }
> +
> memory_region_init_io(&fl->mmio, new, &aspeed_smc_flash_ops, fl, name,
> - aspeed_segments[s->smc_type][i].size);
> + fl->size);
> sysbus_init_mmio(SYS_BUS_DEVICE(new), &fl->mmio);
>
> sysbus_mmio_map(SYS_BUS_DEVICE(new), 0,
> diff --git a/include/hw/ssi/aspeed_smc.h b/include/hw/ssi/aspeed_smc.h
> index 1625dfb76a63..2615ce9fa8aa 100644
> --- a/include/hw/ssi/aspeed_smc.h
> +++ b/include/hw/ssi/aspeed_smc.h
> @@ -38,6 +38,8 @@ typedef struct AspeedSMCFlashState {
>
> MemoryRegion mmio;
> int id;
> + uint32_t size;
> + uint8_t *storage;
> struct AspeedSMCState *controller;
> DeviceState *flash;
> } AspeedSMCFlashState;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part
URL: <http://lists.ozlabs.org/pipermail/openbmc/attachments/20160607/31382fdd/attachment.sig>
More information about the openbmc
mailing list