Message ID | 20240604054438.3424349-10-jamin_lin@aspeedtech.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add AST2700 support | expand |
On 6/4/24 07:44, Jamin Lin wrote: > It set "aspeed_smc_flash_ops" struct which containing > read and write callbacks to be used when I/O is performed > on the SMC flash region. And it set the valid max_access_size 4 > by default for all ASPEED SMC models. > > However, the valid max_access_size 4 only support 32 bits CPUs. > To support all ASPEED SMC model, introduce a new > "const MemoryRegionOps *" attribute in AspeedSMCClass and > use it in aspeed_smc_flash_realize function. > > Signed-off-by: Troy Lee <troy_lee@aspeedtech.com> > Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com> Reviewed-by: Cédric Le Goater <clg@redhat.com> Thanks, C. > --- > hw/ssi/aspeed_smc.c | 14 +++++++++++++- > include/hw/ssi/aspeed_smc.h | 1 + > 2 files changed, 14 insertions(+), 1 deletion(-) > > diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c > index df0c63469c..129d06690d 100644 > --- a/hw/ssi/aspeed_smc.c > +++ b/hw/ssi/aspeed_smc.c > @@ -1316,7 +1316,7 @@ static void aspeed_smc_flash_realize(DeviceState *dev, Error **errp) > * Use the default segment value to size the memory region. This > * can be changed by FW at runtime. > */ > - memory_region_init_io(&s->mmio, OBJECT(s), &aspeed_smc_flash_ops, > + memory_region_init_io(&s->mmio, OBJECT(s), s->asc->reg_ops, > s, name, s->asc->segments[s->cs].size); > sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->mmio); > } > @@ -1391,6 +1391,7 @@ static void aspeed_2400_smc_class_init(ObjectClass *klass, void *data) > asc->segment_to_reg = aspeed_smc_segment_to_reg; > asc->reg_to_segment = aspeed_smc_reg_to_segment; > asc->dma_ctrl = aspeed_smc_dma_ctrl; > + asc->reg_ops = &aspeed_smc_flash_ops; > } > > static const TypeInfo aspeed_2400_smc_info = { > @@ -1441,6 +1442,7 @@ static void aspeed_2400_fmc_class_init(ObjectClass *klass, void *data) > asc->segment_to_reg = aspeed_smc_segment_to_reg; > asc->reg_to_segment = aspeed_smc_reg_to_segment; > asc->dma_ctrl = aspeed_smc_dma_ctrl; > + asc->reg_ops = &aspeed_smc_flash_ops; > } > > static const TypeInfo aspeed_2400_fmc_info = { > @@ -1480,6 +1482,7 @@ static void aspeed_2400_spi1_class_init(ObjectClass *klass, void *data) > asc->reg_to_segment = aspeed_smc_reg_to_segment; > asc->dma_ctrl = aspeed_smc_dma_ctrl; > asc->addr_width = aspeed_2400_spi1_addr_width; > + asc->reg_ops = &aspeed_smc_flash_ops; > } > > static const TypeInfo aspeed_2400_spi1_info = { > @@ -1525,6 +1528,7 @@ static void aspeed_2500_fmc_class_init(ObjectClass *klass, void *data) > asc->segment_to_reg = aspeed_smc_segment_to_reg; > asc->reg_to_segment = aspeed_smc_reg_to_segment; > asc->dma_ctrl = aspeed_smc_dma_ctrl; > + asc->reg_ops = &aspeed_smc_flash_ops; > } > > static const TypeInfo aspeed_2500_fmc_info = { > @@ -1560,6 +1564,7 @@ static void aspeed_2500_spi1_class_init(ObjectClass *klass, void *data) > asc->segment_to_reg = aspeed_smc_segment_to_reg; > asc->reg_to_segment = aspeed_smc_reg_to_segment; > asc->dma_ctrl = aspeed_smc_dma_ctrl; > + asc->reg_ops = &aspeed_smc_flash_ops; > } > > static const TypeInfo aspeed_2500_spi1_info = { > @@ -1595,6 +1600,7 @@ static void aspeed_2500_spi2_class_init(ObjectClass *klass, void *data) > asc->segment_to_reg = aspeed_smc_segment_to_reg; > asc->reg_to_segment = aspeed_smc_reg_to_segment; > asc->dma_ctrl = aspeed_smc_dma_ctrl; > + asc->reg_ops = &aspeed_smc_flash_ops; > } > > static const TypeInfo aspeed_2500_spi2_info = { > @@ -1682,6 +1688,7 @@ static void aspeed_2600_fmc_class_init(ObjectClass *klass, void *data) > asc->segment_to_reg = aspeed_2600_smc_segment_to_reg; > asc->reg_to_segment = aspeed_2600_smc_reg_to_segment; > asc->dma_ctrl = aspeed_2600_smc_dma_ctrl; > + asc->reg_ops = &aspeed_smc_flash_ops; > } > > static const TypeInfo aspeed_2600_fmc_info = { > @@ -1721,6 +1728,7 @@ static void aspeed_2600_spi1_class_init(ObjectClass *klass, void *data) > asc->segment_to_reg = aspeed_2600_smc_segment_to_reg; > asc->reg_to_segment = aspeed_2600_smc_reg_to_segment; > asc->dma_ctrl = aspeed_2600_smc_dma_ctrl; > + asc->reg_ops = &aspeed_smc_flash_ops; > } > > static const TypeInfo aspeed_2600_spi1_info = { > @@ -1761,6 +1769,7 @@ static void aspeed_2600_spi2_class_init(ObjectClass *klass, void *data) > asc->segment_to_reg = aspeed_2600_smc_segment_to_reg; > asc->reg_to_segment = aspeed_2600_smc_reg_to_segment; > asc->dma_ctrl = aspeed_2600_smc_dma_ctrl; > + asc->reg_ops = &aspeed_smc_flash_ops; > } > > static const TypeInfo aspeed_2600_spi2_info = { > @@ -1843,6 +1852,7 @@ static void aspeed_1030_fmc_class_init(ObjectClass *klass, void *data) > asc->segment_to_reg = aspeed_1030_smc_segment_to_reg; > asc->reg_to_segment = aspeed_1030_smc_reg_to_segment; > asc->dma_ctrl = aspeed_2600_smc_dma_ctrl; > + asc->reg_ops = &aspeed_smc_flash_ops; > } > > static const TypeInfo aspeed_1030_fmc_info = { > @@ -1881,6 +1891,7 @@ static void aspeed_1030_spi1_class_init(ObjectClass *klass, void *data) > asc->segment_to_reg = aspeed_2600_smc_segment_to_reg; > asc->reg_to_segment = aspeed_2600_smc_reg_to_segment; > asc->dma_ctrl = aspeed_2600_smc_dma_ctrl; > + asc->reg_ops = &aspeed_smc_flash_ops; > } > > static const TypeInfo aspeed_1030_spi1_info = { > @@ -1918,6 +1929,7 @@ static void aspeed_1030_spi2_class_init(ObjectClass *klass, void *data) > asc->segment_to_reg = aspeed_2600_smc_segment_to_reg; > asc->reg_to_segment = aspeed_2600_smc_reg_to_segment; > asc->dma_ctrl = aspeed_2600_smc_dma_ctrl; > + asc->reg_ops = &aspeed_smc_flash_ops; > } > > static const TypeInfo aspeed_1030_spi2_info = { > diff --git a/include/hw/ssi/aspeed_smc.h b/include/hw/ssi/aspeed_smc.h > index d305ce2e2f..234dca32b0 100644 > --- a/include/hw/ssi/aspeed_smc.h > +++ b/include/hw/ssi/aspeed_smc.h > @@ -115,6 +115,7 @@ struct AspeedSMCClass { > AspeedSegments *seg); > void (*dma_ctrl)(AspeedSMCState *s, uint32_t value); > int (*addr_width)(const AspeedSMCState *s); > + const MemoryRegionOps *reg_ops; > }; > > #endif /* ASPEED_SMC_H */
diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c index df0c63469c..129d06690d 100644 --- a/hw/ssi/aspeed_smc.c +++ b/hw/ssi/aspeed_smc.c @@ -1316,7 +1316,7 @@ static void aspeed_smc_flash_realize(DeviceState *dev, Error **errp) * Use the default segment value to size the memory region. This * can be changed by FW at runtime. */ - memory_region_init_io(&s->mmio, OBJECT(s), &aspeed_smc_flash_ops, + memory_region_init_io(&s->mmio, OBJECT(s), s->asc->reg_ops, s, name, s->asc->segments[s->cs].size); sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->mmio); } @@ -1391,6 +1391,7 @@ static void aspeed_2400_smc_class_init(ObjectClass *klass, void *data) asc->segment_to_reg = aspeed_smc_segment_to_reg; asc->reg_to_segment = aspeed_smc_reg_to_segment; asc->dma_ctrl = aspeed_smc_dma_ctrl; + asc->reg_ops = &aspeed_smc_flash_ops; } static const TypeInfo aspeed_2400_smc_info = { @@ -1441,6 +1442,7 @@ static void aspeed_2400_fmc_class_init(ObjectClass *klass, void *data) asc->segment_to_reg = aspeed_smc_segment_to_reg; asc->reg_to_segment = aspeed_smc_reg_to_segment; asc->dma_ctrl = aspeed_smc_dma_ctrl; + asc->reg_ops = &aspeed_smc_flash_ops; } static const TypeInfo aspeed_2400_fmc_info = { @@ -1480,6 +1482,7 @@ static void aspeed_2400_spi1_class_init(ObjectClass *klass, void *data) asc->reg_to_segment = aspeed_smc_reg_to_segment; asc->dma_ctrl = aspeed_smc_dma_ctrl; asc->addr_width = aspeed_2400_spi1_addr_width; + asc->reg_ops = &aspeed_smc_flash_ops; } static const TypeInfo aspeed_2400_spi1_info = { @@ -1525,6 +1528,7 @@ static void aspeed_2500_fmc_class_init(ObjectClass *klass, void *data) asc->segment_to_reg = aspeed_smc_segment_to_reg; asc->reg_to_segment = aspeed_smc_reg_to_segment; asc->dma_ctrl = aspeed_smc_dma_ctrl; + asc->reg_ops = &aspeed_smc_flash_ops; } static const TypeInfo aspeed_2500_fmc_info = { @@ -1560,6 +1564,7 @@ static void aspeed_2500_spi1_class_init(ObjectClass *klass, void *data) asc->segment_to_reg = aspeed_smc_segment_to_reg; asc->reg_to_segment = aspeed_smc_reg_to_segment; asc->dma_ctrl = aspeed_smc_dma_ctrl; + asc->reg_ops = &aspeed_smc_flash_ops; } static const TypeInfo aspeed_2500_spi1_info = { @@ -1595,6 +1600,7 @@ static void aspeed_2500_spi2_class_init(ObjectClass *klass, void *data) asc->segment_to_reg = aspeed_smc_segment_to_reg; asc->reg_to_segment = aspeed_smc_reg_to_segment; asc->dma_ctrl = aspeed_smc_dma_ctrl; + asc->reg_ops = &aspeed_smc_flash_ops; } static const TypeInfo aspeed_2500_spi2_info = { @@ -1682,6 +1688,7 @@ static void aspeed_2600_fmc_class_init(ObjectClass *klass, void *data) asc->segment_to_reg = aspeed_2600_smc_segment_to_reg; asc->reg_to_segment = aspeed_2600_smc_reg_to_segment; asc->dma_ctrl = aspeed_2600_smc_dma_ctrl; + asc->reg_ops = &aspeed_smc_flash_ops; } static const TypeInfo aspeed_2600_fmc_info = { @@ -1721,6 +1728,7 @@ static void aspeed_2600_spi1_class_init(ObjectClass *klass, void *data) asc->segment_to_reg = aspeed_2600_smc_segment_to_reg; asc->reg_to_segment = aspeed_2600_smc_reg_to_segment; asc->dma_ctrl = aspeed_2600_smc_dma_ctrl; + asc->reg_ops = &aspeed_smc_flash_ops; } static const TypeInfo aspeed_2600_spi1_info = { @@ -1761,6 +1769,7 @@ static void aspeed_2600_spi2_class_init(ObjectClass *klass, void *data) asc->segment_to_reg = aspeed_2600_smc_segment_to_reg; asc->reg_to_segment = aspeed_2600_smc_reg_to_segment; asc->dma_ctrl = aspeed_2600_smc_dma_ctrl; + asc->reg_ops = &aspeed_smc_flash_ops; } static const TypeInfo aspeed_2600_spi2_info = { @@ -1843,6 +1852,7 @@ static void aspeed_1030_fmc_class_init(ObjectClass *klass, void *data) asc->segment_to_reg = aspeed_1030_smc_segment_to_reg; asc->reg_to_segment = aspeed_1030_smc_reg_to_segment; asc->dma_ctrl = aspeed_2600_smc_dma_ctrl; + asc->reg_ops = &aspeed_smc_flash_ops; } static const TypeInfo aspeed_1030_fmc_info = { @@ -1881,6 +1891,7 @@ static void aspeed_1030_spi1_class_init(ObjectClass *klass, void *data) asc->segment_to_reg = aspeed_2600_smc_segment_to_reg; asc->reg_to_segment = aspeed_2600_smc_reg_to_segment; asc->dma_ctrl = aspeed_2600_smc_dma_ctrl; + asc->reg_ops = &aspeed_smc_flash_ops; } static const TypeInfo aspeed_1030_spi1_info = { @@ -1918,6 +1929,7 @@ static void aspeed_1030_spi2_class_init(ObjectClass *klass, void *data) asc->segment_to_reg = aspeed_2600_smc_segment_to_reg; asc->reg_to_segment = aspeed_2600_smc_reg_to_segment; asc->dma_ctrl = aspeed_2600_smc_dma_ctrl; + asc->reg_ops = &aspeed_smc_flash_ops; } static const TypeInfo aspeed_1030_spi2_info = { diff --git a/include/hw/ssi/aspeed_smc.h b/include/hw/ssi/aspeed_smc.h index d305ce2e2f..234dca32b0 100644 --- a/include/hw/ssi/aspeed_smc.h +++ b/include/hw/ssi/aspeed_smc.h @@ -115,6 +115,7 @@ struct AspeedSMCClass { AspeedSegments *seg); void (*dma_ctrl)(AspeedSMCState *s, uint32_t value); int (*addr_width)(const AspeedSMCState *s); + const MemoryRegionOps *reg_ops; }; #endif /* ASPEED_SMC_H */