Re: [PATCH v10 2/2] i3c: master: Add driver for AMD AXI I3C master controller

Adrian Hunter <[email protected]>
Newsgroups org.kernel.vger.linux-arch,org.infradead.lists.linux-i3c,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-hardening,org.kernel.vger.linux-kernel
Organization Intel Finland Oy, Registered Address: c/o Alberga Business Park, 6 krs, Bertel Jungin Aukio 5, 02600 Espoo, Business Identity Code: 0357606 - 4, Domiciled in Helsinki
Message-ID <[email protected]>
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.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.