Re: [PATCH 19/23] dmaengine: sdxi: Provide context start and stop APIs
From: Frank Li
Date: Mon Apr 20 2026 - 04:50:50 EST
On Fri, Apr 10, 2026 at 08:07:29AM -0500, Nathan Lynch wrote:
> Starting and stopping SDXI client contexts is implemented by submitting
> special-purpose descriptors to a function's admin context.
>
> Introduce high-level context start and stop APIs that operate on
> struct sdxi_cxt objects, encapsulating the administrative descriptor
> submission and completion signaling. These are intended for use by
> clients such as the DMA engine provider to come.
>
> Co-developed-by: Wei Huang <wei.huang2@xxxxxxx>
> Signed-off-by: Wei Huang <wei.huang2@xxxxxxx>
> Signed-off-by: Nathan Lynch <nathan.lynch@xxxxxxx>
> ---
> drivers/dma/sdxi/context.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++
> drivers/dma/sdxi/context.h | 3 ++
> 2 files changed, 80 insertions(+)
>
> diff --git a/drivers/dma/sdxi/context.c b/drivers/dma/sdxi/context.c
> index 04e0d3e6a337..fc6291f12ffe 100644
> --- a/drivers/dma/sdxi/context.c
> +++ b/drivers/dma/sdxi/context.c
> @@ -23,7 +23,9 @@
> #include <asm/barrier.h>
> #include <asm/rwonce.h>
>
> +#include "completion.h"
> #include "context.h"
> +#include "descriptor.h"
> #include "hw.h"
> #include "ring.h"
> #include "sdxi.h"
> @@ -394,6 +396,81 @@ int sdxi_admin_cxt_init(struct sdxi_dev *sdxi)
> return devm_add_action_or_reset(sdxi_to_dev(sdxi), free_admin_cxt, sdxi);
> }
>
> +int sdxi_start_cxt(struct sdxi_cxt *cxt)
> +{
> + struct sdxi_cxt *adm = to_admin_cxt(cxt);
> + struct sdxi_desc *desc;
> + struct sdxi_ring_resv resv;
> + int err;
> +
> + might_sleep();
> +
> + struct sdxi_completion *sc __free(sdxi_completion) =
> + sdxi_completion_alloc(cxt->sdxi);
> +
> + if (!sc)
> + return -ENOMEM;
> +
> + /* This is not how to start the admin context. */
> + if (WARN_ON(adm == cxt))
> + return -EINVAL;
> +
> + err = sdxi_ring_reserve(adm->ring_state, 1, &resv);
> + if (err)
> + return err;
> +
> + desc = sdxi_ring_resv_next(&resv);
> + sdxi_encode_cxt_start(desc, &(const struct sdxi_cxt_start) {
> + .range = sdxi_cxt_range_single(cxt->id),
> + });
> + sdxi_completion_attach(desc, sc);
> + sdxi_desc_make_valid(desc);
> + sdxi_cxt_push_doorbell(adm, sdxi_ring_resv_dbval(&resv));
> + sdxi_completion_poll(sc);
Do check polll timeout?
Frank