[PATCH qemu 21/38] aspeed/smc: adjust the size of the register region

Cédric Le Goater clg at kaod.org
Mon Nov 28 18:24:00 AEDT 2016


On 11/28/2016 02:44 AM, Andrew Jeffery wrote:
> On Fri, 2016-11-18 at 15:22 +0100, Cédric Le Goater wrote:
>> The SPI controller of the AST2400 SoC does not support DMAs and
>> segment registers, hence it has less registers. So we can adjust the
>> size of the memory region holding the registers depending on the
>> controller type. We can also remove the guest_error logging which is
>> useless as the range of the region is strict enough.
>>
>>> Signed-off-by: Cédric Le Goater <clg at kaod.org>
>> ---
>>  hw/ssi/aspeed_smc.c         | 23 ++++++++---------------
>>  include/hw/ssi/aspeed_smc.h |  1 +
>>  2 files changed, 9 insertions(+), 15 deletions(-)
>>
>> diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c
>> index c0ae07ef8c96..7d7800d96271 100644
>> --- a/hw/ssi/aspeed_smc.c
>> +++ b/hw/ssi/aspeed_smc.c
>> @@ -135,6 +135,8 @@
>>  #define R_SPI_MISC_CTRL   (0x10 / 4)
>>  #define R_SPI_TIMINGS     (0x14 / 4)
>>  
>> +#define R_SPI_MAX         (0x20 / 4)
>> +
>>  #define ASPEED_SOC_SMC_FLASH_BASE   0x10000000
>>  #define ASPEED_SOC_FMC_FLASH_BASE   0x20000000
>>  #define ASPEED_SOC_SPI_FLASH_BASE   0x30000000
>> @@ -221,6 +223,7 @@ static const AspeedSMCController controllers[] = {
>>          .flash_window_base = ASPEED_SOC_FMC_FLASH_BASE,
>>          .flash_window_size = 0x10000000,
>>          .has_dma           = true,
>> +        .nregs             = ASPEED_SMC_R_MAX,
>>      }, {
>>          .name              = "aspeed.smc.spi",
>>          .r_conf            = R_SPI_CONF,
>> @@ -233,6 +236,7 @@ static const AspeedSMCController controllers[] = {
>>          .flash_window_base = ASPEED_SOC_SPI_FLASH_BASE,
>>          .flash_window_size = 0x10000000,
>>          .has_dma           = false,
>> +        .nregs             = R_SPI_MAX,
>>      }, {
>>          .name              = "aspeed.smc.ast2500-fmc",
>>          .r_conf            = R_CONF,
>> @@ -245,6 +249,7 @@ static const AspeedSMCController controllers[] = {
>>          .flash_window_base = ASPEED_SOC_FMC_FLASH_BASE,
>>          .flash_window_size = 0x10000000,
>>          .has_dma           = true,
>> +        .nregs             = ASPEED_SMC_R_MAX,
>>      }, {
>>          .name              = "aspeed.smc.ast2500-spi1",
>>          .r_conf            = R_CONF,
>> @@ -257,6 +262,7 @@ static const AspeedSMCController controllers[] = {
>>          .flash_window_base = ASPEED_SOC_SPI_FLASH_BASE,
>>          .flash_window_size = 0x8000000,
>>          .has_dma           = false,
>> +        .nregs             = ASPEED_SMC_R_MAX,
>>      }, {
>>          .name              = "aspeed.smc.ast2500-spi2",
>>          .r_conf            = R_CONF,
>> @@ -269,6 +275,7 @@ static const AspeedSMCController controllers[] = {
>>          .flash_window_base = ASPEED_SOC_SPI2_FLASH_BASE,
>>          .flash_window_size = 0x8000000,
>>          .has_dma           = false,
>> +        .nregs             = ASPEED_SMC_R_MAX,
>>      },
>>  };
>>  
>> @@ -712,13 +719,6 @@ static uint64_t aspeed_smc_read(void *opaque, hwaddr addr, unsigned int size)
>>  
>>      addr >>= 2;
>>  
>> -    if (addr >= ARRAY_SIZE(s->regs)) {
>> -        qemu_log_mask(LOG_GUEST_ERROR,
>> -                      "%s: Out-of-bounds read at 0x%" HWADDR_PRIx "\n",
>> -                      __func__, addr);
>> -        return 0;
>> -    }
>> -
>>      if (addr == s->r_conf ||
>>          addr == s->r_timings ||
>>          addr == s->r_ce_ctrl ||
>> @@ -942,13 +942,6 @@ static void aspeed_smc_write(void *opaque, hwaddr addr, uint64_t data,
>>  
>>      addr >>= 2;
>>  
>> -    if (addr >= ARRAY_SIZE(s->regs)) {
>> -        qemu_log_mask(LOG_GUEST_ERROR,
>> -                      "%s: Out-of-bounds write at 0x%" HWADDR_PRIx "\n",
>> -                      __func__, addr);
>> -        return;
>> -    }
>> -
>>      if (addr == s->r_conf ||
>>          addr == s->r_timings ||
>>          addr == s->r_ce_ctrl) {
>> @@ -1030,7 +1023,7 @@ static void aspeed_smc_realize(DeviceState *dev, Error **errp)
>>  
>>      /* The memory region for the controller registers */
>>      memory_region_init_io(&s->mmio, OBJECT(s), &aspeed_smc_ops, s,
>> -                          s->ctrl->name, ASPEED_SMC_R_MAX * 4);
>> +                          s->ctrl->name, s->ctrl->nregs * 4);
> 
> It looks like you missed defining nregs for the "aspeed.smc.smc"
> controller. This would suggest we need to.

Ah yes. we don't instantiate the legacy controller so I didn't see it.

Thanks,

C. 


> Andrew
> 
>>      sysbus_init_mmio(sbd, &s->mmio);
>>  
>>      /*
>> diff --git a/include/hw/ssi/aspeed_smc.h b/include/hw/ssi/aspeed_smc.h
>> index 3ae0a369073d..91bad82e9c65 100644
>> --- a/include/hw/ssi/aspeed_smc.h
>> +++ b/include/hw/ssi/aspeed_smc.h
>> @@ -45,6 +45,7 @@ typedef struct AspeedSMCController {
>>      hwaddr flash_window_base;
>>      uint32_t flash_window_size;
>>      bool has_dma;
>> +    uint32_t nregs;
>>  } AspeedSMCController;
>>  
>>  typedef struct AspeedSMCFlash {



More information about the openbmc mailing list