From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D86F73BE155; Fri, 10 Apr 2026 13:07:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775826470; cv=none; b=pCPU9XJ787xvb0wWXaL53WVZXEF27wpDf+7IBVCOMp++6rcGPEPN3TLYBCrADL82rx9/5KMiiw6Ia/04lAywyC1af8qV5WEOphxKXaL2D80QS7ITmXOVpUbUyBOo/lVE4yqFOZcxWGg8Tn2s9oFuBN/L/qrFR95APCqwDw/8YXY= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775826470; c=relaxed/simple; bh=xG8Iwv1Nl33t4t+lIDgFbvyfyQc9By7ouunA94mD9NE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=SnAlf9qNWjRqvXdJ3RoUJq51uBAS+IMPYpPnTJZFrApHj/y0jsAt87cFFYzPjDLDOBUk2j6K1OLibgZ/36SWQ3sMH2KZjA1O+29KYaUEIYbyLqJYNU2B9+3tbyw3/g7kWVWDWxAaQe0BH8NdUnkbd92yv4jVCQO8bRqXqtpPv4o= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=N761tDkd; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="N761tDkd" Received: by smtp.kernel.org (Postfix) with ESMTPS id BDCAEC2BC9E; Fri, 10 Apr 2026 13:07:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1775826470; bh=xG8Iwv1Nl33t4t+lIDgFbvyfyQc9By7ouunA94mD9NE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=N761tDkdyVErhk92yIkp+sA5sUvuLoW7+xcsiVFhxUnaHFX7sZLZRWducLoJrw/P6 wO8q+/+iX32TyLym0lIN6Gtz+DZj2YODD6+mz+f9xSq9bYDfAUoCWIgPULTjjoJu1e vIPsUiYfEan/FUU2CAAwjKIsWDpEu3dmxiET9u/IMNPFvbyqJFHIIwGGW9ltVCc3su skx0sN7FGmu5qcgv56QLq2x155EvQ3COqOQoLdQOOihVUgeEpPCKKUKUUGXgOPUqAQ jC5M//umVDqNdxpUXTAcxi5l0Ad4t2bb8cVepvF/7vOZExvYwRa3Rr1mI7KEXZdbPI mv0EgSv8EFKMA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id B88DCF44861; Fri, 10 Apr 2026 13:07:50 +0000 (UTC) From: Nathan Lynch via B4 Relay Date: Fri, 10 Apr 2026 08:07:29 -0500 Subject: [PATCH 19/23] dmaengine: sdxi: Provide context start and stop APIs Precedence: bulk X-Mailing-List: dmaengine@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20260410-sdxi-base-v1-19-1d184cb5c60a@amd.com> References: <20260410-sdxi-base-v1-0-1d184cb5c60a@amd.com> In-Reply-To: <20260410-sdxi-base-v1-0-1d184cb5c60a@amd.com> To: Vinod Koul Cc: Wei Huang , Mario Limonciello , Bjorn Helgaas , Jonathan Cameron , Stephen Bates , PradeepVineshReddy.Kodamati@amd.com, John.Kariuki@amd.com, linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, dmaengine@vger.kernel.org, Nathan Lynch X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1775826467; l=3798; i=nathan.lynch@amd.com; s=20260410; h=from:subject:message-id; bh=NeYLcmQw7HQppd+LlGj+2pU9LWwFhUvZx4tcjqsRFVc=; b=iJxM3l1UrL7p8blwG8tjlRGafKFKuhh34SWyhSQPNXnZNlzsrC8HfmeXIHSfiaX3hD3oR7wH+ fcrcbMH0lPfALdsnzRJaGfk0HXAy+BmN8S3ZimAp1aaVo3koAnETkVx X-Developer-Key: i=nathan.lynch@amd.com; a=ed25519; pk=PK4ozhq+/z9/2Jl5rgDmvHa9raVomv79qM8p1RAFpEw= X-Endpoint-Received: by B4 Relay for nathan.lynch@amd.com/20260410 with auth_id=728 X-Original-From: Nathan Lynch Reply-To: nathan.lynch@amd.com From: Nathan Lynch 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 Signed-off-by: Wei Huang Signed-off-by: Nathan Lynch --- 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 #include +#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); + + return 0; +} + +void sdxi_stop_cxt(struct sdxi_cxt *cxt) +{ + struct sdxi_cxt *adm = to_admin_cxt(cxt); + struct sdxi_desc *stop, *sync; + struct sdxi_ring_resv resv; + int err; + + might_sleep(); + + struct sdxi_completion *sc __free(sdxi_completion) = + sdxi_completion_alloc(cxt->sdxi); + + if (!sc) + return; + + /* This is not how to stop the admin context. */ + if (WARN_ON(adm == cxt)) + return; + + err = sdxi_ring_reserve(adm->ring_state, 2, &resv); + if (WARN_ON_ONCE(err)) + return; + + stop = sdxi_ring_resv_next(&resv); + sync = sdxi_ring_resv_next(&resv); + + sdxi_encode_cxt_stop(stop, &(const struct sdxi_cxt_stop) { + .range = sdxi_cxt_range_single(cxt->id), + }); + sdxi_encode_sync(sync, &(const struct sdxi_sync) { + .filter = SDXI_SYNC_FLT_STOP, + .range = sdxi_cxt_range_single(cxt->id), + }); + sdxi_completion_attach(sync, sc); + sdxi_desc_make_valid(stop); + sdxi_desc_make_valid(sync); + sdxi_cxt_push_doorbell(adm, sdxi_ring_resv_dbval(&resv)); + sdxi_completion_poll(sc); +} + /* * Allocate a context for in-kernel use. Starting the context is the * caller's responsibility. diff --git a/drivers/dma/sdxi/context.h b/drivers/dma/sdxi/context.h index 5310e51a668c..9061221e86cb 100644 --- a/drivers/dma/sdxi/context.h +++ b/drivers/dma/sdxi/context.h @@ -67,6 +67,9 @@ int sdxi_admin_cxt_init(struct sdxi_dev *sdxi); struct sdxi_cxt *sdxi_cxt_new(struct sdxi_dev *sdxi); void sdxi_cxt_exit(struct sdxi_cxt *cxt); +int sdxi_start_cxt(struct sdxi_cxt *cxt); +void sdxi_stop_cxt(struct sdxi_cxt *cxt); + static inline struct sdxi_cxt *to_admin_cxt(const struct sdxi_cxt *cxt) { return cxt->sdxi->admin_cxt; -- 2.53.0