aspeed/smc: support different memory region ops for SMC flash region
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>
This commit is contained in:
parent
6330be8da4
commit
0559e60669
@ -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 = {
|
||||
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user