Re: [PATCH v10 2/2] i3c: master: Add driver for AMD AXI I3C master controller
Adrian Hunter <[email protected]>
| Newsgroups | org.kernel.vger.linux-hardening,org.infradead.lists.linux-i3c,org.kernel.vger.linux-arch,org.kernel.vger.linux-devicetree,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.