Re: [PATCH v5 09/17] aspeed/smc: support different memory region ops for SMC flash region

2024-06-04 Thread Cédric Le Goater

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 
Signed-off-by: Jamin Lin 


Reviewed-by: Cédric Le Goater 

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(>mmio, OBJECT(s), _smc_flash_ops,
+memory_region_init_io(>mmio, OBJECT(s), s->asc->reg_ops,
s, name, s->asc->segments[s->cs].size);
  sysbus_init_mmio(SYS_BUS_DEVICE(dev), >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   = _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   = _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   = _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   = _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   = _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   = _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   = _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   = _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   = _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   = _smc_flash_ops;
  }
  
  static 

[PATCH v5 09/17] aspeed/smc: support different memory region ops for SMC flash region

2024-06-03 Thread Jamin Lin via
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 
Signed-off-by: Jamin Lin 
---
 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(>mmio, OBJECT(s), _smc_flash_ops,
+memory_region_init_io(>mmio, OBJECT(s), s->asc->reg_ops,
   s, name, s->asc->segments[s->cs].size);
 sysbus_init_mmio(SYS_BUS_DEVICE(dev), >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   = _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   = _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   = _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   = _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   = _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   = _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   = _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   = _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   = _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   = _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=