From: Vinod Koul <vkoul@kernel.org>
To: Sai Sree Kartheek Adivi <s-adivi@ti.com>
Cc: peter.ujfalusi@gmail.com, robh@kernel.org, krzk+dt@kernel.org,
conor+dt@kernel.org, nm@ti.com, ssantosh@kernel.org,
dmaengine@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org,
linux-arm-kernel@lists.infradead.org, vigneshr@ti.com,
Frank.li@nxp.com, r-sharma3@ti.com, gehariprasath@ti.com
Subject: Re: [PATCH v11 12/19] drivers: soc: ti: k3-ringacc: handle absence of tisci
Date: Mon, 5 Oct 2026 18:05:11 +0200 [thread overview]
Message-ID: <asPKt_QuEAjey62J@parshuram> (raw)
In-Reply-To: <20261001084105.1692228-13-s-adivi@ti.com>
On 01-10-26, 14:10, Sai Sree Kartheek Adivi wrote:
> Handle absence of tisci with direct register writes. This will support
> platforms that do not have tisci firmware like AM62L.
Need ack from TI maintainers on this... I think we have dependency on
this here
>
> Signed-off-by: Sai Sree Kartheek Adivi <s-adivi@ti.com>
> ---
> drivers/soc/ti/k3-ringacc.c | 199 +++++++++++++++++++++++++++---
> include/linux/soc/ti/k3-ringacc.h | 18 +++
> 2 files changed, 198 insertions(+), 19 deletions(-)
>
> diff --git a/drivers/soc/ti/k3-ringacc.c b/drivers/soc/ti/k3-ringacc.c
> index 5966db4327b13..d52e0ab33678c 100644
> --- a/drivers/soc/ti/k3-ringacc.c
> +++ b/drivers/soc/ti/k3-ringacc.c
> @@ -7,6 +7,7 @@
>
> #include <linux/dma-mapping.h>
> #include <linux/io.h>
> +#include <linux/iopoll.h>
> #include <linux/module.h>
> #include <linux/of.h>
> #include <linux/platform_device.h>
> @@ -46,6 +47,53 @@ struct k3_ring_rt_regs {
> u32 hwindx;
> };
>
> +#define K3_RINGACC_RT_CFG_REGS_OFS 0x40
> +#define K3_DMARING_CFG_ADDR_HI_MASK GENMASK(3, 0)
> +#define K3_DMARING_CFG_ASEL_SHIFT 16
> +#define K3_DMARING_CFG_SIZE_MASK GENMASK(15, 0)
> +
> +/**
> + * struct k3_ring_cfg_regs - The RA Configuration Registers region
> + *
> + * @ba_lo: Ring Base Address Low Register
> + * @ba_hi: Ring Base Address High Register
> + * @size: Ring Size Register
> + */
> +struct k3_ring_cfg_regs {
> + u32 ba_lo;
> + u32 ba_hi;
> + u32 size;
> +};
> +
> +#define K3_RINGACC_RT_INT_REGS_OFS 0x140
> +#define K3_RINGACC_RT_INT_ENABLE_SET_COMPLETE BIT(0)
> +#define K3_RINGACC_RT_INT_ENABLE_SET_TR BIT(2)
> +
> +/**
> + * struct k3_ring_intr_regs {
> + *
> + * @enable_set: Ring Interrupt Enable Register
> + * @resv_1: Reserved
> + * @clr: Ring Interrupt Clear Register
> + * @resv_2: Reserved
> + * @status_set: Ring Interrupt Status Set Register
> + * @resv_3: Reserved
> + * @status: Ring Interrupt Status Register
> + * @resv_4: Reserved
> + * @status_masked: Ring Interrupt Status Masked Register
> + */
> +struct k3_ring_intr_regs {
> + u32 enable_set;
> + u32 resv_1;
> + u32 clr;
> + u32 resv_2;
> + u32 status_set;
> + u32 resv_3;
> + u32 status;
> + u32 resv_4;
> + u32 status_masked;
> +};
> +
> #define K3_RINGACC_RT_REGS_STEP 0x1000
> #define K3_DMARING_RT_REGS_STEP 0x2000
> #define K3_DMARING_RT_REGS_REVERSE_OFS 0x1000
> @@ -139,6 +187,8 @@ struct k3_ring_state {
> * struct k3_ring - RA Ring descriptor
> *
> * @rt: Ring control/status registers
> + * @cfg: Ring config registers
> + * @intr: Ring interrupt registers
> * @fifos: Ring queues registers
> * @proxy: Ring Proxy Datapath registers
> * @ring_mem_dma: Ring buffer dma address
> @@ -158,6 +208,8 @@ struct k3_ring_state {
> */
> struct k3_ring {
> struct k3_ring_rt_regs __iomem *rt;
> + struct k3_ring_cfg_regs __iomem *cfg;
> + struct k3_ring_intr_regs __iomem *intr;
> struct k3_ring_fifo_regs __iomem *fifos;
> struct k3_ringacc_proxy_target_regs __iomem *proxy;
> dma_addr_t ring_mem_dma;
> @@ -467,15 +519,39 @@ static void k3_ringacc_ring_reset_sci(struct k3_ring *ring)
> struct k3_ringacc *ringacc = ring->parent;
> int ret;
>
> - ring_cfg.nav_id = ringacc->tisci_dev_id;
> - ring_cfg.index = ring->ring_id;
> - ring_cfg.valid_params = TI_SCI_MSG_VALUE_RM_RING_COUNT_VALID;
> - ring_cfg.count = ring->size;
> + if (!ringacc->tisci) {
> + u32 reg;
>
> - ret = ringacc->tisci_ring_ops->set_cfg(ringacc->tisci, &ring_cfg);
> - if (ret)
> - dev_err(ringacc->dev, "TISCI reset ring fail (%d) ring_idx %d\n",
> - ret, ring->ring_id);
> + if (!ring->cfg)
> + return;
> +
> + reg = readl(&ring->cfg->size);
> + reg &= ~K3_DMARING_CFG_SIZE_MASK;
> + writel(reg, &ring->cfg->size);
> +
> + ret = readl_poll_timeout(&ring->cfg->size, reg,
> + !(reg & K3_DMARING_CFG_SIZE_MASK),
> + 1, 100);
> + if (ret) {
> + dev_err(ringacc->dev, "ring %d size clear timeout\n",
> + ring->ring_id);
> + return;
> + }
> +
> + reg = readl(&ring->cfg->size);
> + reg |= ring->size;
> + writel(reg, &ring->cfg->size);
> + } else {
> + ring_cfg.nav_id = ringacc->tisci_dev_id;
> + ring_cfg.index = ring->ring_id;
> + ring_cfg.valid_params = TI_SCI_MSG_VALUE_RM_RING_COUNT_VALID;
> + ring_cfg.count = ring->size;
> +
> + ret = ringacc->tisci_ring_ops->set_cfg(ringacc->tisci, &ring_cfg);
> + if (ret)
> + dev_err(ringacc->dev, "TISCI reset ring fail (%d) ring_idx %d\n",
> + ret, ring->ring_id);
> + }
> }
>
> void k3_ringacc_ring_reset(struct k3_ring *ring)
> @@ -501,6 +577,9 @@ static void k3_ringacc_ring_reconfig_qmode_sci(struct k3_ring *ring,
> ring_cfg.valid_params = TI_SCI_MSG_VALUE_RM_RING_MODE_VALID;
> ring_cfg.mode = mode;
>
> + if (!ringacc->tisci)
> + return;
> +
> ret = ringacc->tisci_ring_ops->set_cfg(ringacc->tisci, &ring_cfg);
> if (ret)
> dev_err(ringacc->dev, "TISCI reconf qmode fail (%d) ring_idx %d\n",
> @@ -576,10 +655,40 @@ static void k3_ringacc_ring_free_sci(struct k3_ring *ring)
> ring_cfg.index = ring->ring_id;
> ring_cfg.valid_params = TI_SCI_MSG_VALUE_RM_ALL_NO_ORDER;
>
> - ret = ringacc->tisci_ring_ops->set_cfg(ringacc->tisci, &ring_cfg);
> - if (ret)
> - dev_err(ringacc->dev, "TISCI ring free fail (%d) ring_idx %d\n",
> - ret, ring->ring_id);
> + if (!ringacc->tisci) {
> + u32 reg;
> +
> + writel(K3_RINGACC_RT_INT_ENABLE_SET_COMPLETE | K3_RINGACC_RT_INT_ENABLE_SET_TR,
> + &ring->intr->clr);
> +
> + reg = readl(&ring->cfg->size);
> + reg &= ~K3_DMARING_CFG_SIZE_MASK;
> + writel(reg, &ring->cfg->size);
> +
> + ret = readl_poll_timeout(&ring->cfg->size, reg,
> + !(reg & K3_DMARING_CFG_SIZE_MASK),
> + 1, 100);
> + if (ret) {
> + dev_err(ringacc->dev, "ring %d size clear timeout\n",
> + ring->ring_id);
> + return;
> + }
> +
> + reg = readl(&ring->cfg->size);
> + reg |= ring_cfg.count & K3_DMARING_CFG_SIZE_MASK;
> +
> + writel(reg, &ring->cfg->size);
> +
> + writel(ring_cfg.addr_lo, &ring->cfg->ba_lo);
> + writel((ring_cfg.addr_hi & K3_DMARING_CFG_ADDR_HI_MASK) +
> + (ring_cfg.asel << K3_DMARING_CFG_ASEL_SHIFT),
> + &ring->cfg->ba_hi);
> + } else {
> + ret = ringacc->tisci_ring_ops->set_cfg(ringacc->tisci, &ring_cfg);
> + if (ret)
> + dev_err(ringacc->dev, "TISCI ring free fail (%d) ring_idx %d\n",
> + ret, ring->ring_id);
> + }
> }
>
> int k3_ringacc_ring_free(struct k3_ring *ring)
> @@ -670,15 +779,36 @@ int k3_ringacc_get_ring_irq_num(struct k3_ring *ring)
> }
> EXPORT_SYMBOL_GPL(k3_ringacc_get_ring_irq_num);
>
> +u32 k3_ringacc_ring_get_irq_status(struct k3_ring *ring)
> +{
> + struct k3_ringacc *ringacc = ring->parent;
> + struct k3_ring *fwd_ring = &ringacc->rings[ring->ring_id];
> +
> + if (!fwd_ring->intr)
> + return 0;
> +
> + return readl(&fwd_ring->intr->status);
> +}
> +EXPORT_SYMBOL_GPL(k3_ringacc_ring_get_irq_status);
> +
> +void k3_ringacc_ring_clear_irq(struct k3_ring *ring, u32 status)
> +{
> + struct k3_ringacc *ringacc = ring->parent;
> + struct k3_ring *fwd_ring = &ringacc->rings[ring->ring_id];
> +
> + if (!fwd_ring->intr)
> + return;
> +
> + writel(status, &fwd_ring->intr->status);
> +}
> +EXPORT_SYMBOL_GPL(k3_ringacc_ring_clear_irq);
> +
> static int k3_ringacc_ring_cfg_sci(struct k3_ring *ring)
> {
> struct ti_sci_msg_rm_ring_cfg ring_cfg = { 0 };
> struct k3_ringacc *ringacc = ring->parent;
> int ret;
>
> - if (!ringacc->tisci)
> - return -EINVAL;
> -
> ring_cfg.nav_id = ringacc->tisci_dev_id;
> ring_cfg.index = ring->ring_id;
> ring_cfg.valid_params = TI_SCI_MSG_VALUE_RM_ALL_NO_ORDER;
> @@ -689,6 +819,24 @@ static int k3_ringacc_ring_cfg_sci(struct k3_ring *ring)
> ring_cfg.size = ring->elm_size;
> ring_cfg.asel = ring->asel;
>
> + if (!ringacc->tisci) {
> + u32 reg;
> +
> + writel(ring_cfg.addr_lo, &ring->cfg->ba_lo);
> + writel((ring_cfg.addr_hi & K3_DMARING_CFG_ADDR_HI_MASK) +
> + (ring_cfg.asel << K3_DMARING_CFG_ASEL_SHIFT),
> + &ring->cfg->ba_hi);
> +
> + reg = readl(&ring->cfg->size);
> + reg &= ~K3_DMARING_CFG_SIZE_MASK;
> + reg |= ring_cfg.count & K3_DMARING_CFG_SIZE_MASK;
> +
> + writel(reg, &ring->cfg->size);
> + writel(K3_RINGACC_RT_INT_ENABLE_SET_COMPLETE | K3_RINGACC_RT_INT_ENABLE_SET_TR,
> + &ring->intr->enable_set);
> + return 0;
> + }
> +
> ret = ringacc->tisci_ring_ops->set_cfg(ringacc->tisci, &ring_cfg);
> if (ret)
> dev_err(ringacc->dev, "TISCI config ring fail (%d) ring_idx %d\n",
> @@ -1347,6 +1495,11 @@ static int k3_ringacc_probe_dt(struct k3_ringacc *ringacc)
> return PTR_ERR(ringacc->rm_gp_range);
> }
>
> + if (!IS_ENABLED(CONFIG_TI_SCI_INTA_MSI_DOMAIN)) {
> + dev_err(dev, "TI_SCI_INTA_MSI_DOMAIN is required for a DT-probed ringacc with ti,sci\n");
> + return -ENODEV;
> + }
> +
> return ti_sci_inta_msi_domain_alloc_irqs(ringacc->dev,
> ringacc->rm_gp_range);
> }
> @@ -1481,9 +1634,12 @@ struct k3_ringacc *k3_ringacc_dmarings_init(struct platform_device *pdev,
>
> mutex_init(&ringacc->req_lock);
>
> - base_rt = devm_platform_ioremap_resource_byname(pdev, "ringrt");
> - if (IS_ERR(base_rt))
> - return ERR_CAST(base_rt);
> + base_rt = data->base_rt;
> + if (!base_rt) {
> + base_rt = devm_platform_ioremap_resource_byname(pdev, "ringrt");
> + if (IS_ERR(base_rt))
> + return ERR_CAST(base_rt);
> + }
>
> ringacc->rings = devm_kzalloc(dev,
> sizeof(*ringacc->rings) *
> @@ -1499,6 +1655,10 @@ struct k3_ringacc *k3_ringacc_dmarings_init(struct platform_device *pdev,
> struct k3_ring *ring = &ringacc->rings[i];
>
> ring->rt = base_rt + K3_DMARING_RT_REGS_STEP * i;
> + ring->cfg = base_rt + K3_RINGACC_RT_CFG_REGS_OFS +
> + K3_DMARING_RT_REGS_STEP * i;
> + ring->intr = base_rt + K3_RINGACC_RT_INT_REGS_OFS +
> + K3_DMARING_RT_REGS_STEP * i;
> ring->parent = ringacc;
> ring->ring_id = i;
> ring->proxy_id = K3_RINGACC_PROXY_NOT_USED;
> @@ -1512,7 +1672,8 @@ struct k3_ringacc *k3_ringacc_dmarings_init(struct platform_device *pdev,
> ring->flags = K3_RING_FLAG_REVERSE;
> }
>
> - ringacc->tisci_ring_ops = &ringacc->tisci->ops.rm_ring_ops;
> + if (ringacc->tisci)
> + ringacc->tisci_ring_ops = &ringacc->tisci->ops.rm_ring_ops;
>
> dev_info(dev, "Number of rings: %u\n", ringacc->num_rings);
>
> diff --git a/include/linux/soc/ti/k3-ringacc.h b/include/linux/soc/ti/k3-ringacc.h
> index 39b022b925986..4b6ec925e2f2d 100644
> --- a/include/linux/soc/ti/k3-ringacc.h
> +++ b/include/linux/soc/ti/k3-ringacc.h
> @@ -158,6 +158,23 @@ u32 k3_ringacc_get_ring_id(struct k3_ring *ring);
> */
> int k3_ringacc_get_ring_irq_num(struct k3_ring *ring);
>
> +/**
> + * k3_ringacc_ring_get_irq_status - Get the irq status for the ring
> + * @ring: pointer on ring
> + *
> + * Returns the interrupt status
> + */
> +u32 k3_ringacc_ring_get_irq_status(struct k3_ring *ring);
> +
> +/**
> + * k3_ringacc_ring_clear_irq - Clear the given interrupts
> + * @ring: pointer on ring
> + * @status: mask of interrupt status bits to clear
> + *
> + * Clears only the interrupt status bits set in @status on the ring
> + */
> +void k3_ringacc_ring_clear_irq(struct k3_ring *ring, u32 status);
> +
> /**
> * k3_ringacc_ring_cfg - ring configure
> * @ring: pointer on ring
> @@ -262,6 +279,7 @@ struct k3_ringacc_init_data {
> const struct ti_sci_handle *tisci;
> u32 tisci_dev_id;
> u32 num_rings;
> + void __iomem *base_rt;
> };
>
> struct k3_ringacc *k3_ringacc_dmarings_init(struct platform_device *pdev,
> --
> 2.55.0
--
~Vinod
next prev parent reply other threads:[~2026-10-05 16:05 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-01 8:40 [PATCH v11 00/19] dmaengine: ti: Add support for BCDMA v2 and PKTDMA v2 Sai Sree Kartheek Adivi
2026-10-01 8:40 ` [PATCH v11 01/19] dmaengine: ti: k3-udma: Fix sporadic crash on AM62x Sai Sree Kartheek Adivi
2026-10-01 8:57 ` sashiko-bot
2026-10-01 8:40 ` [PATCH v11 02/19] dmaengine: ti: k3-udma: move macros to header file Sai Sree Kartheek Adivi
2026-10-01 8:40 ` [PATCH v11 03/19] dmaengine: ti: k3-udma: move structs and enums " Sai Sree Kartheek Adivi
2026-10-01 8:40 ` [PATCH v11 04/19] dmaengine: ti: k3-udma: move static inline helper functions " Sai Sree Kartheek Adivi
2026-10-01 8:40 ` [PATCH v11 05/19] dmaengine: ti: k3-udma: move descriptor management to k3-udma-common.c Sai Sree Kartheek Adivi
2026-10-01 9:03 ` sashiko-bot
2026-10-01 8:40 ` [PATCH v11 06/19] dmaengine: ti: k3-udma: move ring management functions " Sai Sree Kartheek Adivi
2026-10-01 8:40 ` [PATCH v11 07/19] dmaengine: ti: k3-udma: Add variant-specific function pointers to udma_dev Sai Sree Kartheek Adivi
2026-10-01 8:40 ` [PATCH v11 08/19] dmaengine: ti: k3-udma: move udma utility functions to k3-udma-common.c Sai Sree Kartheek Adivi
2026-10-01 8:40 ` [PATCH v11 09/19] dmaengine: ti: k3-udma: move resource management " Sai Sree Kartheek Adivi
2026-10-01 8:40 ` [PATCH v11 10/19] dmaengine: ti: k3-udma: refactor resource setup functions Sai Sree Kartheek Adivi
2026-10-01 8:40 ` [PATCH v11 11/19] dmaengine: ti: k3-udma: move inclusion of k3-udma-private.c to k3-udma-common.c Sai Sree Kartheek Adivi
2026-10-01 9:06 ` sashiko-bot
2026-10-01 8:40 ` [PATCH v11 12/19] drivers: soc: ti: k3-ringacc: handle absence of tisci Sai Sree Kartheek Adivi
2026-10-05 16:05 ` Vinod Koul [this message]
2026-10-01 8:40 ` [PATCH v11 13/19] dt-bindings: dma: ti: Add K3 BCDMA V2 Sai Sree Kartheek Adivi
2026-10-01 9:08 ` sashiko-bot
2026-10-01 8:40 ` [PATCH v11 14/19] dt-bindings: dma: ti: Add K3 PKTDMA V2 Sai Sree Kartheek Adivi
2026-10-01 8:40 ` [PATCH v11 15/19] dmaengine: ti: k3-psil-am62l: Add AM62Lx PSIL and PDMA data Sai Sree Kartheek Adivi
2026-10-01 8:40 ` [PATCH v11 16/19] dmaengine: ti: k3-udma-v2: New driver for K3 BCDMA_V2 Sai Sree Kartheek Adivi
2026-10-01 9:18 ` sashiko-bot
2026-10-01 8:40 ` [PATCH v11 17/19] dmaengine: ti: k3-udma-v2: Add support for PKTDMA V2 Sai Sree Kartheek Adivi
2026-10-01 8:40 ` [PATCH v11 18/19] dmaengine: ti: k3-udma-v2: Update glue layer to support " Sai Sree Kartheek Adivi
2026-10-01 8:40 ` [PATCH v11 19/19] dmaengine: ti: k3-udma: Validate resource ID and fix logging in reservation Sai Sree Kartheek Adivi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=asPKt_QuEAjey62J@parshuram \
--to=vkoul@kernel.org \
--cc=Frank.li@nxp.com \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=dmaengine@vger.kernel.org \
--cc=gehariprasath@ti.com \
--cc=krzk+dt@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=nm@ti.com \
--cc=peter.ujfalusi@gmail.com \
--cc=r-sharma3@ti.com \
--cc=robh@kernel.org \
--cc=s-adivi@ti.com \
--cc=ssantosh@kernel.org \
--cc=vigneshr@ti.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.