On 09/07/2026 09:42, Shubham Patil wrote:
> From: Manikanta Guntupalli <[email protected]>
> 
> Add an I3C master driver and maintainers fragment for the AMD I3C bus
> controller.
> 
> The driver currently supports the I3C bus operating in SDR mode,
> with features including Dynamic Address Assignment, private data
> transfers, and CCC transfers in both broadcast and direct modes. It
> also supports operation in I2C mode.
> 
> The controller's data FIFOs are accessed big-endian; the driver performs
> this conversion locally using ioread32be()/iowrite32be() with the
> helpers, so it does not depend on any core FIFO-endianness helpers.
> 
> Signed-off-by: Manikanta Guntupalli <[email protected]>
> Co-developed-by: Shubhrajyoti Datta <[email protected]>
> Signed-off-by: Shubhrajyoti Datta <[email protected]>
> Co-developed-by: Shubham Patil <[email protected]>
> Signed-off-by: Shubham Patil <[email protected]>
> ---

...

> +static int xi3c_master_send_direct_ccc_cmd(struct xi3c_master *master,
> +                                        struct i3c_ccc_cmd *ccc)
> +{
> +     struct xi3c_xfer *xfer __free(kfree) = NULL;
> +     struct xi3c_cmd *cmd;
> +     int ret;
> +
> +     if (ccc->dests[0].payload.len > XI3C_MAXDATA_LENGTH)
> +             return -EINVAL;
> +
> +     xfer = xi3c_master_alloc_xfer(2);
> +     if (!xfer)
> +             return -ENOMEM;
> +
> +     /* Broadcasted message */
> +     cmd = &xfer->cmds[0];
> +     cmd->addr = I3C_BROADCAST_ADDR;
> +     cmd->rnw = false;
> +     cmd->tx_buf = &ccc->id;
> +     cmd->tx_len = 1;
> +     cmd->type = XI3C_SDR_MODE;
> +     cmd->tid = XI3C_SDR_TID;
> +     cmd->continued = true;
> +
> +     /* Directed message */
> +     cmd = &xfer->cmds[1];
> +     cmd->addr = ccc->dests[0].addr;
> +     cmd->rnw = ccc->rnw;
> +     if (cmd->rnw) {
> +             cmd->rx_buf = ccc->dests[0].payload.data;
> +             cmd->rx_len = ccc->dests[0].payload.len;
> +     } else {
> +             cmd->tx_buf = ccc->dests[0].payload.data;
> +             cmd->tx_len = ccc->dests[0].payload.len;
> +     }
> +     cmd->type = XI3C_SDR_MODE;
> +     cmd->tid = XI3C_SDR_TID;
> +     cmd->continued = false;
> +
> +     ret = xi3c_master_common_xfer(master, xfer);
> +
> +     /*
> +      * Report broadcast error if any, else the directed one, so either
> +      * NACK reaches the caller
> +      */
> +     ccc->err = xfer->cmds[0].err ? xfer->cmds[0].err : xfer->cmds[1].err;
> +
> +     /* Report actual byte count so the core sees the right length on short 
> reads */
> +     if (!ret && ccc->rnw)
> +             ccc->dests[0].payload.len = min(xfer->cmds[1].rx_actual,
> +                                             ccc->dests[0].payload.len);

Looks like this missed the conversion to using payload.actual_len.


Reply via email to