qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] Aspeed: i2c: Fixed Tx and Rx error in BUFF Mode
@ 2023-08-04  7:50 于航 via
  0 siblings, 0 replies; 4+ messages in thread
From: 于航 via @ 2023-08-04  7:50 UTC (permalink / raw)
  To: qemu-devel
  Cc: 于航, Cédric Le Goater, Peter Maydell,
	Andrew Jeffery, Joel Stanley, open list:ASPEED BMCs

1. Fixed inconsistency between the bit field definition in register
I2CD_POOL_CTRL and the ast2600 datasheet
2. Fixed issue of confusing RXSIZE and RXCOUNT, as well as forgetting
to add one to TXCOUNT and RXSIZE in buff mode
3. Fixed issue with TXBUF transmission start position error in buff mode
4. Added support for the BUFFER ORGANIZATION option in reg I2CC_POOL_CTRL
After adding these changes, QEMU can support driver code:
https://github.com/AspeedTech-BMC/linux/blob/aspeed-master-v5.15
/drivers/i2c/busses/i2c-ast2600.c

Signed-off-by:于航<1339236493@qq.com>
---
 hw/i2c/aspeed_i2c.c         | 21 ++++++---------------
 include/hw/i2c/aspeed_i2c.h |  5 +++--
 2 files changed, 9 insertions(+), 17 deletions(-)

diff --git a/hw/i2c/aspeed_i2c.c b/hw/i2c/aspeed_i2c.c
index 1f071a3811..0e380d0bba 100644
--- a/hw/i2c/aspeed_i2c.c
+++ b/hw/i2c/aspeed_i2c.c
@@ -236,7 +236,7 @@ static int aspeed_i2c_bus_send(AspeedI2CBus *bus, uint8_t pool_start)
     uint32_t reg_byte_buf = aspeed_i2c_bus_byte_buf_offset(bus);
     uint32_t reg_dma_len = aspeed_i2c_bus_dma_len_offset(bus);
     int pool_tx_count = SHARED_ARRAY_FIELD_EX32(bus->regs, reg_pool_ctrl,
-                                                TX_COUNT);
+                                                TX_COUNT)+1;
 
     if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, TX_BUFF_EN)) {
         for (i = pool_start; i < pool_tx_count; i++) {
@@ -293,10 +293,12 @@ static void aspeed_i2c_bus_recv(AspeedI2CBus *bus)
     uint32_t reg_dma_len = aspeed_i2c_bus_dma_len_offset(bus);
     uint32_t reg_dma_addr = aspeed_i2c_bus_dma_addr_offset(bus);
     int pool_rx_count = SHARED_ARRAY_FIELD_EX32(bus->regs, reg_pool_ctrl,
-                                                RX_COUNT);
+                                                RX_SIZE)+1;
 
     if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, RX_BUFF_EN)) {
-        uint8_t *pool_base = aic->bus_pool_base(bus);
+        uint8_t *pool_base ;
+        if(ARRAY_FIELD_EX32(bus->regs,I2CC_POOL_CTRL,BUF_ORGANIZATION))pool_base=aic->bus_pool_base(bus)+16;
+        else pool_base= aic->bus_pool_base(bus);
 
         for (i = 0; i < pool_rx_count; i++) {
             pool_base[i] = i2c_recv(bus->bus);
@@ -418,7 +420,7 @@ static void aspeed_i2c_bus_cmd_dump(AspeedI2CBus *bus)
     uint32_t reg_intr_sts = aspeed_i2c_bus_intr_sts_offset(bus);
     uint32_t reg_dma_len = aspeed_i2c_bus_dma_len_offset(bus);
     if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, RX_BUFF_EN)) {
-        count = SHARED_ARRAY_FIELD_EX32(bus->regs, reg_pool_ctrl, TX_COUNT);
+        count = SHARED_ARRAY_FIELD_EX32(bus->regs, reg_pool_ctrl, TX_COUNT)+1;
     } else if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, RX_DMA_EN)) {
         count = bus->regs[reg_dma_len];
     } else { /* BYTE mode */
@@ -449,7 +451,6 @@ static void aspeed_i2c_bus_handle_cmd(AspeedI2CBus *bus, uint64_t value)
     uint8_t pool_start = 0;
     uint32_t reg_intr_sts = aspeed_i2c_bus_intr_sts_offset(bus);
     uint32_t reg_cmd = aspeed_i2c_bus_cmd_offset(bus);
-    uint32_t reg_pool_ctrl = aspeed_i2c_bus_pool_ctrl_offset(bus);
     uint32_t reg_dma_len = aspeed_i2c_bus_dma_len_offset(bus);
 
     if (!aspeed_i2c_check_sram(bus)) {
@@ -489,16 +490,6 @@ static void aspeed_i2c_bus_handle_cmd(AspeedI2CBus *bus, uint64_t value)
          * else needs to be sent in this sequence.
          */
         if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, TX_BUFF_EN)) {
-            if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_pool_ctrl, TX_COUNT)
-                == 1) {
-                SHARED_ARRAY_FIELD_DP32(bus->regs, reg_cmd, M_TX_CMD, 0);
-            } else {
-                /*
-                 * Increase the start index in the TX pool buffer to
-                 * skip the address byte.
-                 */
-                pool_start++;
-            }
         } else if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, TX_DMA_EN)) {
             if (bus->regs[reg_dma_len] == 0) {
                 SHARED_ARRAY_FIELD_DP32(bus->regs, reg_cmd, M_TX_CMD, 0);
diff --git a/include/hw/i2c/aspeed_i2c.h b/include/hw/i2c/aspeed_i2c.h
index 51c944efea..88b144a599 100644
--- a/include/hw/i2c/aspeed_i2c.h
+++ b/include/hw/i2c/aspeed_i2c.h
@@ -139,9 +139,9 @@ REG32(I2CD_CMD, 0x14) /* I2CD Command/Status */
 REG32(I2CD_DEV_ADDR, 0x18) /* Slave Device Address */
     SHARED_FIELD(SLAVE_DEV_ADDR1, 0, 7)
 REG32(I2CD_POOL_CTRL, 0x1C) /* Pool Buffer Control */
-    SHARED_FIELD(RX_COUNT, 24, 5)
+    SHARED_FIELD(RX_COUNT, 24, 6)
     SHARED_FIELD(RX_SIZE, 16, 5)
-    SHARED_FIELD(TX_COUNT, 9, 5)
+    SHARED_FIELD(TX_COUNT, 8, 5)
     FIELD(I2CD_POOL_CTRL, OFFSET, 2, 6) /* AST2400 */
 REG32(I2CD_BYTE_BUF, 0x20) /* Transmit/Receive Byte Buffer */
     SHARED_FIELD(RX_BUF, 8, 8)
@@ -162,6 +162,7 @@ REG32(I2CC_MS_TXRX_BYTE_BUF, 0x08)
     /* 15:0  shared with I2CD_BYTE_BUF[15:0] */
 REG32(I2CC_POOL_CTRL, 0x0c)
     /* 31:0 shared with I2CD_POOL_CTRL[31:0] */
+    FIELD(I2CC_POOL_CTRL, BUF_ORGANIZATION, 0, 1) /* AST2600 */
 REG32(I2CM_INTR_CTRL, 0x10)
 REG32(I2CM_INTR_STS, 0x14)
     FIELD(I2CM_INTR_STS, PKT_STATE, 28, 4)
-- 
2.39.2 (Apple Git-143)



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH] Aspeed: i2c: Fixed Tx and Rx error in BUFF Mode
@ 2023-08-04  8:11 Hang Yu via
  2023-08-10  9:13 ` Cédric Le Goater
  0 siblings, 1 reply; 4+ messages in thread
From: Hang Yu via @ 2023-08-04  8:11 UTC (permalink / raw)
  To: qemu-devel
  Cc: Hang Yu, Cédric Le Goater, Peter Maydell, Andrew Jeffery,
	Joel Stanley, open list:ASPEED BMCs

1. Fixed inconsistency between the bit field definition in register
I2CD_POOL_CTRL and the ast2600 datasheet
2. Fixed issue of confusing RXSIZE and RXCOUNT, as well as forgetting
to add one to TXCOUNT and RXSIZE in buff mode
3. Fixed issue with TXBUF transmission start position error in buff mode
4. Added support for the BUFFER ORGANIZATION option in reg I2CC_POOL_CTRL
After adding these changes, QEMU can support driver code:
https://github.com/AspeedTech-BMC/linux/blob/aspeed-master-v5.15
/drivers/i2c/busses/i2c-ast2600.c

Signed-off-by: Hang Yu <1339236493@qq.com>
---
 hw/i2c/aspeed_i2c.c         | 21 ++++++---------------
 include/hw/i2c/aspeed_i2c.h |  5 +++--
 2 files changed, 9 insertions(+), 17 deletions(-)

diff --git a/hw/i2c/aspeed_i2c.c b/hw/i2c/aspeed_i2c.c
index 1f071a3811..0e380d0bba 100644
--- a/hw/i2c/aspeed_i2c.c
+++ b/hw/i2c/aspeed_i2c.c
@@ -236,7 +236,7 @@ static int aspeed_i2c_bus_send(AspeedI2CBus *bus, uint8_t pool_start)
     uint32_t reg_byte_buf = aspeed_i2c_bus_byte_buf_offset(bus);
     uint32_t reg_dma_len = aspeed_i2c_bus_dma_len_offset(bus);
     int pool_tx_count = SHARED_ARRAY_FIELD_EX32(bus->regs, reg_pool_ctrl,
-                                                TX_COUNT);
+                                                TX_COUNT)+1;
 
     if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, TX_BUFF_EN)) {
         for (i = pool_start; i < pool_tx_count; i++) {
@@ -293,10 +293,12 @@ static void aspeed_i2c_bus_recv(AspeedI2CBus *bus)
     uint32_t reg_dma_len = aspeed_i2c_bus_dma_len_offset(bus);
     uint32_t reg_dma_addr = aspeed_i2c_bus_dma_addr_offset(bus);
     int pool_rx_count = SHARED_ARRAY_FIELD_EX32(bus->regs, reg_pool_ctrl,
-                                                RX_COUNT);
+                                                RX_SIZE)+1;
 
     if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, RX_BUFF_EN)) {
-        uint8_t *pool_base = aic->bus_pool_base(bus);
+        uint8_t *pool_base ;
+        if(ARRAY_FIELD_EX32(bus->regs,I2CC_POOL_CTRL,BUF_ORGANIZATION))pool_base=aic->bus_pool_base(bus)+16;
+        else pool_base= aic->bus_pool_base(bus);
 
         for (i = 0; i < pool_rx_count; i++) {
             pool_base[i] = i2c_recv(bus->bus);
@@ -418,7 +420,7 @@ static void aspeed_i2c_bus_cmd_dump(AspeedI2CBus *bus)
     uint32_t reg_intr_sts = aspeed_i2c_bus_intr_sts_offset(bus);
     uint32_t reg_dma_len = aspeed_i2c_bus_dma_len_offset(bus);
     if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, RX_BUFF_EN)) {
-        count = SHARED_ARRAY_FIELD_EX32(bus->regs, reg_pool_ctrl, TX_COUNT);
+        count = SHARED_ARRAY_FIELD_EX32(bus->regs, reg_pool_ctrl, TX_COUNT)+1;
     } else if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, RX_DMA_EN)) {
         count = bus->regs[reg_dma_len];
     } else { /* BYTE mode */
@@ -449,7 +451,6 @@ static void aspeed_i2c_bus_handle_cmd(AspeedI2CBus *bus, uint64_t value)
     uint8_t pool_start = 0;
     uint32_t reg_intr_sts = aspeed_i2c_bus_intr_sts_offset(bus);
     uint32_t reg_cmd = aspeed_i2c_bus_cmd_offset(bus);
-    uint32_t reg_pool_ctrl = aspeed_i2c_bus_pool_ctrl_offset(bus);
     uint32_t reg_dma_len = aspeed_i2c_bus_dma_len_offset(bus);
 
     if (!aspeed_i2c_check_sram(bus)) {
@@ -489,16 +490,6 @@ static void aspeed_i2c_bus_handle_cmd(AspeedI2CBus *bus, uint64_t value)
          * else needs to be sent in this sequence.
          */
         if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, TX_BUFF_EN)) {
-            if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_pool_ctrl, TX_COUNT)
-                == 1) {
-                SHARED_ARRAY_FIELD_DP32(bus->regs, reg_cmd, M_TX_CMD, 0);
-            } else {
-                /*
-                 * Increase the start index in the TX pool buffer to
-                 * skip the address byte.
-                 */
-                pool_start++;
-            }
         } else if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, TX_DMA_EN)) {
             if (bus->regs[reg_dma_len] == 0) {
                 SHARED_ARRAY_FIELD_DP32(bus->regs, reg_cmd, M_TX_CMD, 0);
diff --git a/include/hw/i2c/aspeed_i2c.h b/include/hw/i2c/aspeed_i2c.h
index 51c944efea..88b144a599 100644
--- a/include/hw/i2c/aspeed_i2c.h
+++ b/include/hw/i2c/aspeed_i2c.h
@@ -139,9 +139,9 @@ REG32(I2CD_CMD, 0x14) /* I2CD Command/Status */
 REG32(I2CD_DEV_ADDR, 0x18) /* Slave Device Address */
     SHARED_FIELD(SLAVE_DEV_ADDR1, 0, 7)
 REG32(I2CD_POOL_CTRL, 0x1C) /* Pool Buffer Control */
-    SHARED_FIELD(RX_COUNT, 24, 5)
+    SHARED_FIELD(RX_COUNT, 24, 6)
     SHARED_FIELD(RX_SIZE, 16, 5)
-    SHARED_FIELD(TX_COUNT, 9, 5)
+    SHARED_FIELD(TX_COUNT, 8, 5)
     FIELD(I2CD_POOL_CTRL, OFFSET, 2, 6) /* AST2400 */
 REG32(I2CD_BYTE_BUF, 0x20) /* Transmit/Receive Byte Buffer */
     SHARED_FIELD(RX_BUF, 8, 8)
@@ -162,6 +162,7 @@ REG32(I2CC_MS_TXRX_BYTE_BUF, 0x08)
     /* 15:0  shared with I2CD_BYTE_BUF[15:0] */
 REG32(I2CC_POOL_CTRL, 0x0c)
     /* 31:0 shared with I2CD_POOL_CTRL[31:0] */
+    FIELD(I2CC_POOL_CTRL, BUF_ORGANIZATION, 0, 1) /* AST2600 */
 REG32(I2CM_INTR_CTRL, 0x10)
 REG32(I2CM_INTR_STS, 0x14)
     FIELD(I2CM_INTR_STS, PKT_STATE, 28, 4)
-- 
2.39.2 (Apple Git-143)



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] Aspeed: i2c: Fixed Tx and Rx error in BUFF Mode
  2023-08-04  8:11 Hang Yu via
@ 2023-08-10  9:13 ` Cédric Le Goater
  0 siblings, 0 replies; 4+ messages in thread
From: Cédric Le Goater @ 2023-08-10  9:13 UTC (permalink / raw)
  To: Hang Yu, qemu-devel
  Cc: Peter Maydell, Andrew Jeffery, Joel Stanley,
	open list:ASPEED BMCs

Hello,

On 8/4/23 10:11, Hang Yu via wrote:
> 1. Fixed inconsistency between the bit field definition in register
> I2CD_POOL_CTRL and the ast2600 datasheet
> 2. Fixed issue of confusing RXSIZE and RXCOUNT, as well as forgetting
> to add one to TXCOUNT and RXSIZE in buff mode
> 3. Fixed issue with TXBUF transmission start position error in buff mode
> 4. Added support for the BUFFER ORGANIZATION option in reg I2CC_POOL_CTRL


This looks like 4 patches. Could split and resend a series please ?

Also, Cc: these persons

   Joe Komlodi <komlodi@google.com>
   Peter Delevoryas <peter@pjd.dev>

since they have been involved with the AST2600 I2C implementation.

> After adding these changes, QEMU can support driver code:
> https://github.com/AspeedTech-BMC/linux/blob/aspeed-master-v5.15
> /drivers/i2c/busses/i2c-ast2600.c
> 
> Signed-off-by: Hang Yu <1339236493@qq.com>

  This is very cryptic. Don't you have a corporate email ?

Thanks,

C.



> ---
>   hw/i2c/aspeed_i2c.c         | 21 ++++++---------------
>   include/hw/i2c/aspeed_i2c.h |  5 +++--
>   2 files changed, 9 insertions(+), 17 deletions(-)
> 
> diff --git a/hw/i2c/aspeed_i2c.c b/hw/i2c/aspeed_i2c.c
> index 1f071a3811..0e380d0bba 100644
> --- a/hw/i2c/aspeed_i2c.c
> +++ b/hw/i2c/aspeed_i2c.c
> @@ -236,7 +236,7 @@ static int aspeed_i2c_bus_send(AspeedI2CBus *bus, uint8_t pool_start)
>       uint32_t reg_byte_buf = aspeed_i2c_bus_byte_buf_offset(bus);
>       uint32_t reg_dma_len = aspeed_i2c_bus_dma_len_offset(bus);
>       int pool_tx_count = SHARED_ARRAY_FIELD_EX32(bus->regs, reg_pool_ctrl,
> -                                                TX_COUNT);
> +                                                TX_COUNT)+1;
>   
>       if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, TX_BUFF_EN)) {
>           for (i = pool_start; i < pool_tx_count; i++) {
> @@ -293,10 +293,12 @@ static void aspeed_i2c_bus_recv(AspeedI2CBus *bus)
>       uint32_t reg_dma_len = aspeed_i2c_bus_dma_len_offset(bus);
>       uint32_t reg_dma_addr = aspeed_i2c_bus_dma_addr_offset(bus);
>       int pool_rx_count = SHARED_ARRAY_FIELD_EX32(bus->regs, reg_pool_ctrl,
> -                                                RX_COUNT);
> +                                                RX_SIZE)+1;
>   
>       if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, RX_BUFF_EN)) {
> -        uint8_t *pool_base = aic->bus_pool_base(bus);
> +        uint8_t *pool_base ;
> +        if(ARRAY_FIELD_EX32(bus->regs,I2CC_POOL_CTRL,BUF_ORGANIZATION))pool_base=aic->bus_pool_base(bus)+16;
> +        else pool_base= aic->bus_pool_base(bus);
>   
>           for (i = 0; i < pool_rx_count; i++) {
>               pool_base[i] = i2c_recv(bus->bus);
> @@ -418,7 +420,7 @@ static void aspeed_i2c_bus_cmd_dump(AspeedI2CBus *bus)
>       uint32_t reg_intr_sts = aspeed_i2c_bus_intr_sts_offset(bus);
>       uint32_t reg_dma_len = aspeed_i2c_bus_dma_len_offset(bus);
>       if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, RX_BUFF_EN)) {
> -        count = SHARED_ARRAY_FIELD_EX32(bus->regs, reg_pool_ctrl, TX_COUNT);
> +        count = SHARED_ARRAY_FIELD_EX32(bus->regs, reg_pool_ctrl, TX_COUNT)+1;
>       } else if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, RX_DMA_EN)) {
>           count = bus->regs[reg_dma_len];
>       } else { /* BYTE mode */
> @@ -449,7 +451,6 @@ static void aspeed_i2c_bus_handle_cmd(AspeedI2CBus *bus, uint64_t value)
>       uint8_t pool_start = 0;
>       uint32_t reg_intr_sts = aspeed_i2c_bus_intr_sts_offset(bus);
>       uint32_t reg_cmd = aspeed_i2c_bus_cmd_offset(bus);
> -    uint32_t reg_pool_ctrl = aspeed_i2c_bus_pool_ctrl_offset(bus);
>       uint32_t reg_dma_len = aspeed_i2c_bus_dma_len_offset(bus);
>   
>       if (!aspeed_i2c_check_sram(bus)) {
> @@ -489,16 +490,6 @@ static void aspeed_i2c_bus_handle_cmd(AspeedI2CBus *bus, uint64_t value)
>            * else needs to be sent in this sequence.
>            */
>           if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, TX_BUFF_EN)) {
> -            if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_pool_ctrl, TX_COUNT)
> -                == 1) {
> -                SHARED_ARRAY_FIELD_DP32(bus->regs, reg_cmd, M_TX_CMD, 0);
> -            } else {
> -                /*
> -                 * Increase the start index in the TX pool buffer to
> -                 * skip the address byte.
> -                 */
> -                pool_start++;
> -            }
>           } else if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, TX_DMA_EN)) {
>               if (bus->regs[reg_dma_len] == 0) {
>                   SHARED_ARRAY_FIELD_DP32(bus->regs, reg_cmd, M_TX_CMD, 0);
> diff --git a/include/hw/i2c/aspeed_i2c.h b/include/hw/i2c/aspeed_i2c.h
> index 51c944efea..88b144a599 100644
> --- a/include/hw/i2c/aspeed_i2c.h
> +++ b/include/hw/i2c/aspeed_i2c.h
> @@ -139,9 +139,9 @@ REG32(I2CD_CMD, 0x14) /* I2CD Command/Status */
>   REG32(I2CD_DEV_ADDR, 0x18) /* Slave Device Address */
>       SHARED_FIELD(SLAVE_DEV_ADDR1, 0, 7)
>   REG32(I2CD_POOL_CTRL, 0x1C) /* Pool Buffer Control */
> -    SHARED_FIELD(RX_COUNT, 24, 5)
> +    SHARED_FIELD(RX_COUNT, 24, 6)
>       SHARED_FIELD(RX_SIZE, 16, 5)
> -    SHARED_FIELD(TX_COUNT, 9, 5)
> +    SHARED_FIELD(TX_COUNT, 8, 5)
>       FIELD(I2CD_POOL_CTRL, OFFSET, 2, 6) /* AST2400 */
>   REG32(I2CD_BYTE_BUF, 0x20) /* Transmit/Receive Byte Buffer */
>       SHARED_FIELD(RX_BUF, 8, 8)
> @@ -162,6 +162,7 @@ REG32(I2CC_MS_TXRX_BYTE_BUF, 0x08)
>       /* 15:0  shared with I2CD_BYTE_BUF[15:0] */
>   REG32(I2CC_POOL_CTRL, 0x0c)
>       /* 31:0 shared with I2CD_POOL_CTRL[31:0] */
> +    FIELD(I2CC_POOL_CTRL, BUF_ORGANIZATION, 0, 1) /* AST2600 */
>   REG32(I2CM_INTR_CTRL, 0x10)
>   REG32(I2CM_INTR_STS, 0x14)
>       FIELD(I2CM_INTR_STS, PKT_STATE, 28, 4)



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] Aspeed: i2c: Fixed Tx and Rx error in BUFF Mode
@ 2023-08-10 13:55 Hang Yu
  0 siblings, 0 replies; 4+ messages in thread
From: Hang Yu @ 2023-08-10 13:55 UTC (permalink / raw)
  To: Cédric Le Goater, qemu-devel
  Cc: Peter Maydell, Andrew Jeffery, Joel Stanley,
	open list:ASPEED BMCs, komlodi, peter

[-- Attachment #1: Type: text/plain, Size: 7094 bytes --]

Hello
&gt;&nbsp;Hello,

&gt;&nbsp;
&gt;&nbsp;On 8/4/23 10:11, Hang Yu via wrote:
&gt;&nbsp;&gt; 1. Fixed inconsistency between the bit field definition in register
&gt;&nbsp;&gt; I2CD_POOL_CTRL and the ast2600 datasheet
&gt;&nbsp;&gt; 2. Fixed issue of confusing RXSIZE and RXCOUNT, as well as forgetting
&gt;&nbsp;&gt; to add one to TXCOUNT and RXSIZE in buff mode

&gt;&nbsp;&gt; 3. Fixed issue with TXBUF transmission start position error in buff mode

&gt;&nbsp;&gt; 4. Added support for the BUFFER ORGANIZATION option in reg I2CC_POOL_CTRL
&gt;&nbsp;
&gt;&nbsp;

&gt;&nbsp;This looks like 4 patches. Could split and resend a series please ?



Ok,I will split it. However, it should be noted that pool mode will only work if the first three patches have been applied.


&gt;&nbsp;
&gt;&nbsp;Also, Cc: these persons
&gt;&nbsp;
&gt;&nbsp;Joe Komlodi
&gt;&nbsp;Peter Delevoryas
&gt;&nbsp;
&gt;&nbsp;since they have been involved with the AST2600 I2C implementation.
&gt;&nbsp;
&gt;&nbsp;&gt; After adding these changes, QEMU can support driver code:
&gt;&nbsp;&gt; https://github.com/AspeedTech-BMC/linux/blob/aspeed-master-v5.15
&gt;&nbsp;&gt; /drivers/i2c/busses/i2c-ast2600.c
&gt;&nbsp;&gt;
&gt;&nbsp;&gt; Signed-off-by: Hang Yu <1339236493@qq.com&gt;
&gt;&nbsp;

&gt;&nbsp;This is very cryptic. Don't you have a corporate email ?

Sorry, because I am still a student and do not have a&nbsp;corporate&nbsp;email, I have used a private email. When submitting the patch next time, I will switch to my student email.
&gt;&nbsp;
&gt;&nbsp;Thanks,
&gt;&nbsp;
&gt;&nbsp;C.
&gt;&nbsp;
&gt;&nbsp;
&gt;&nbsp;


Thanks,
Hang Yu
&gt;&nbsp;&gt; ---
&gt;&nbsp;&gt; hw/i2c/aspeed_i2c.c | 21 ++++++---------------
&gt;&nbsp;&gt; include/hw/i2c/aspeed_i2c.h | 5 +++--
&gt;&nbsp;&gt; 2 files changed, 9 insertions(+), 17 deletions(-)
&gt;&nbsp;&gt;
&gt;&nbsp;&gt; diff --git a/hw/i2c/aspeed_i2c.c b/hw/i2c/aspeed_i2c.c
&gt;&nbsp;&gt; index 1f071a3811..0e380d0bba 100644
&gt;&nbsp;&gt; --- a/hw/i2c/aspeed_i2c.c

&gt;&nbsp;&gt; +++ b/hw/i2c/aspeed_i2c.c

&gt;&nbsp;&gt; @@ -236,7 +236,7 @@ static int aspeed_i2c_bus_send(AspeedI2CBus *bus, uint8_t pool_start)
&gt;&nbsp;&gt; uint32_t reg_byte_buf = aspeed_i2c_bus_byte_buf_offset(bus);
&gt;&nbsp;&gt; uint32_t reg_dma_len = aspeed_i2c_bus_dma_len_offset(bus);
&gt;&nbsp;&gt; int pool_tx_count = SHARED_ARRAY_FIELD_EX32(bus-&gt;regs, reg_pool_ctrl,
&gt;&nbsp;&gt; - TX_COUNT);
&gt;&nbsp;&gt; + TX_COUNT)+1;
&gt;&nbsp;&gt;
&gt;&nbsp;&gt; if (SHARED_ARRAY_FIELD_EX32(bus-&gt;regs, reg_cmd, TX_BUFF_EN)) {
&gt;&nbsp;&gt; for (i = pool_start; i < pool_tx_count; i++) {
&gt;&nbsp;&gt; @@ -293,10 +293,12 @@ static void aspeed_i2c_bus_recv(AspeedI2CBus *bus)
&gt;&nbsp;&gt; uint32_t reg_dma_len = aspeed_i2c_bus_dma_len_offset(bus);
&gt;&nbsp;&gt; uint32_t reg_dma_addr = aspeed_i2c_bus_dma_addr_offset(bus);
&gt;&nbsp;&gt; int pool_rx_count = SHARED_ARRAY_FIELD_EX32(bus-&gt;regs, reg_pool_ctrl,
&gt;&nbsp;&gt; - RX_COUNT);
&gt;&nbsp;&gt; + RX_SIZE)+1;
&gt;&nbsp;&gt;
&gt;&nbsp;&gt; if (SHARED_ARRAY_FIELD_EX32(bus-&gt;regs, reg_cmd, RX_BUFF_EN)) {
&gt;&nbsp;&gt; - uint8_t *pool_base = aic-&gt;bus_pool_base(bus);
&gt;&nbsp;&gt; + uint8_t *pool_base ;
&gt;&nbsp;&gt; + if(ARRAY_FIELD_EX32(bus-&gt;regs,I2CC_POOL_CTRL,BUF_ORGANIZATION))pool_base=aic-&gt;bus_pool_base(bus)+16;
&gt;&nbsp;&gt; + else pool_base= aic-&gt;bus_pool_base(bus);
&gt;&nbsp;&gt;
&gt;&nbsp;&gt; for (i = 0; i < pool_rx_count; i++) {
&gt;&nbsp;&gt; pool_base[i] = i2c_recv(bus-&gt;bus);
&gt;&nbsp;&gt; @@ -418,7 +420,7 @@ static void aspeed_i2c_bus_cmd_dump(AspeedI2CBus *bus)
&gt;&nbsp;&gt; uint32_t reg_intr_sts = aspeed_i2c_bus_intr_sts_offset(bus);
&gt;&nbsp;&gt; uint32_t reg_dma_len = aspeed_i2c_bus_dma_len_offset(bus);
&gt;&nbsp;&gt; if (SHARED_ARRAY_FIELD_EX32(bus-&gt;regs, reg_cmd, RX_BUFF_EN)) {
&gt;&nbsp;&gt; - count = SHARED_ARRAY_FIELD_EX32(bus-&gt;regs, reg_pool_ctrl, TX_COUNT);
&gt;&nbsp;&gt; + count = SHARED_ARRAY_FIELD_EX32(bus-&gt;regs, reg_pool_ctrl, TX_COUNT)+1;
&gt;&nbsp;&gt; } else if (SHARED_ARRAY_FIELD_EX32(bus-&gt;regs, reg_cmd, RX_DMA_EN)) {
&gt;&nbsp;&gt; count = bus-&gt;regs[reg_dma_len];
&gt;&nbsp;&gt; } else { /* BYTE mode */
&gt;&nbsp;&gt; @@ -449,7 +451,6 @@ static void aspeed_i2c_bus_handle_cmd(AspeedI2CBus *bus, uint64_t value)
&gt;&nbsp;&gt; uint8_t pool_start = 0;
&gt;&nbsp;&gt; uint32_t reg_intr_sts = aspeed_i2c_bus_intr_sts_offset(bus);
&gt;&nbsp;&gt; uint32_t reg_cmd = aspeed_i2c_bus_cmd_offset(bus);
&gt;&nbsp;&gt; - uint32_t reg_pool_ctrl = aspeed_i2c_bus_pool_ctrl_offset(bus);
&gt;&nbsp;&gt; uint32_t reg_dma_len = aspeed_i2c_bus_dma_len_offset(bus);
&gt;&nbsp;&gt;
&gt;&nbsp;&gt; if (!aspeed_i2c_check_sram(bus)) {
&gt;&nbsp;&gt; @@ -489,16 +490,6 @@ static void aspeed_i2c_bus_handle_cmd(AspeedI2CBus *bus, uint64_t value)
&gt;&nbsp;&gt; * else needs to be sent in this sequence.
&gt;&nbsp;&gt; */
&gt;&nbsp;&gt; if (SHARED_ARRAY_FIELD_EX32(bus-&gt;regs, reg_cmd, TX_BUFF_EN)) {
&gt;&nbsp;&gt; - if (SHARED_ARRAY_FIELD_EX32(bus-&gt;regs, reg_pool_ctrl, TX_COUNT)
&gt;&nbsp;&gt; - == 1) {
&gt;&nbsp;&gt; - SHARED_ARRAY_FIELD_DP32(bus-&gt;regs, reg_cmd, M_TX_CMD, 0);
&gt;&nbsp;&gt; - } else {
&gt;&nbsp;&gt; - /*
&gt;&nbsp;&gt; - * Increase the start index in the TX pool buffer to

&gt;&nbsp;&gt; - * skip the address byte.

&gt;&nbsp;&gt;&nbsp;- */

&gt;&nbsp;&gt; - pool_start++;
&gt;&nbsp;&gt; - }
&gt;&nbsp;&gt; } else if (SHARED_ARRAY_FIELD_EX32(bus-&gt;regs, reg_cmd, TX_DMA_EN)) {
&gt;&nbsp;&gt; if (bus-&gt;regs[reg_dma_len] == 0) {
&gt;&nbsp;&gt; SHARED_ARRAY_FIELD_DP32(bus-&gt;regs, reg_cmd, M_TX_CMD, 0);
&gt;&nbsp;&gt; diff --git a/include/hw/i2c/aspeed_i2c.h b/include/hw/i2c/aspeed_i2c.h
&gt;&nbsp;&gt; index 51c944efea..88b144a599 100644
&gt;&nbsp;&gt; --- a/include/hw/i2c/aspeed_i2c.h
&gt;&nbsp;&gt; +++ b/include/hw/i2c/aspeed_i2c.h
&gt;&nbsp;&gt; @@ -139,9 +139,9 @@ REG32(I2CD_CMD, 0x14) /* I2CD Command/Status */
&gt;&nbsp;&gt; REG32(I2CD_DEV_ADDR, 0x18) /* Slave Device Address */
&gt;&nbsp;&gt; SHARED_FIELD(SLAVE_DEV_ADDR1, 0, 7)
&gt;&nbsp;&gt; REG32(I2CD_POOL_CTRL, 0x1C) /* Pool Buffer Control */
&gt;&nbsp;&gt; - SHARED_FIELD(RX_COUNT, 24, 5)
&gt;&nbsp;&gt; + SHARED_FIELD(RX_COUNT, 24, 6)
&gt;&nbsp;&gt; SHARED_FIELD(RX_SIZE, 16, 5)
&gt;&nbsp;&gt; - SHARED_FIELD(TX_COUNT, 9, 5)
&gt;&nbsp;&gt; + SHARED_FIELD(TX_COUNT, 8, 5)
&gt;&nbsp;&gt; FIELD(I2CD_POOL_CTRL, OFFSET, 2, 6) /* AST2400 */
&gt;&nbsp;&gt; REG32(I2CD_BYTE_BUF, 0x20) /* Transmit/Receive Byte Buffer */
&gt;&nbsp;&gt; SHARED_FIELD(RX_BUF, 8, 8)
&gt;&nbsp;&gt; @@ -162,6 +162,7 @@ REG32(I2CC_MS_TXRX_BYTE_BUF, 0x08)
&gt;&nbsp;&gt; /* 15:0 shared with I2CD_BYTE_BUF[15:0] */
&gt;&nbsp;&gt; REG32(I2CC_POOL_CTRL, 0x0c)
&gt;&nbsp;&gt; /* 31:0 shared with I2CD_POOL_CTRL[31:0] */
&gt;&nbsp;&gt; + FIELD(I2CC_POOL_CTRL, BUF_ORGANIZATION, 0, 1) /* AST2600 */
&gt;&nbsp;&gt; REG32(I2CM_INTR_CTRL, 0x10)
&gt;&nbsp;&gt; REG32(I2CM_INTR_STS, 0x14)
&gt;&nbsp;&gt; FIELD(I2CM_INTR_STS, PKT_STATE, 28, 4)

[-- Attachment #2: Type: text/html, Size: 31705 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2023-08-10 14:27 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-08-04  7:50 [PATCH] Aspeed: i2c: Fixed Tx and Rx error in BUFF Mode 于航 via
  -- strict thread matches above, loose matches on Subject: below --
2023-08-04  8:11 Hang Yu via
2023-08-10  9:13 ` Cédric Le Goater
2023-08-10 13:55 Hang Yu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).