* [PATCH v5 0/4] Add ADSP and CDSP support on Kaanapali SoC
@ 2025-12-02 6:06 Kumari Pallavi
2025-12-02 6:06 ` [PATCH v5 1/4] dt-bindings: misc: qcom,fastrpc: Add compatible for Kaanapali Kumari Pallavi
` (3 more replies)
0 siblings, 4 replies; 16+ messages in thread
From: Kumari Pallavi @ 2025-12-02 6:06 UTC (permalink / raw)
To: kpallavi, srini, amahesh, arnd, gregkh, robh, krzk+dt, conor+dt
Cc: Kumari Pallavi, quic_bkumar, ekansh.gupta, linux-kernel,
quic_chennak, dri-devel, linux-arm-msm, devicetree, jingyi.wang,
aiqun.yu, ktadakam
Introduces support for new DSP IOVA formatting and hardware-specific
configuration required to enable ADSP and CDSP functionality on the
Kaanapali SoC.
Add support for a new IOVA formatting scheme by adding a sid_pos to the DSP
driver. Sid_pos standardizes the placement of the stream ID (SID) within the
physical address, which is required for DSPs to operate correctly on
Kaanapali. DSP currently supports 32-bit IOVA (32-bit PA + 4-bit SID) for
both Q6 and user DMA (uDMA) access.
This is being upgraded to 34-bit PA + 4-bit SID due to a hardware revision
in CDSP for Kaanapali SoC, which expands the DMA addressable range.
To support CDSP operation, this series updates the DMA mask configuration
to reflect the expanded DMA addressable range.
Patch [v4]:https://lore.kernel.org/all/733afe4f-51d8-4c5e-8c18-9843a316523e@oss.qualcomm.com/
Changes in v5:
- Update the commit message to clearly explain the background of the change
- Use the proper format specifier (%pad) for printing dma_addr_t instead of %llx
- Remove unnecessary NULL assignments where not required
- Rearrange code for proper alignment and style compliance
Changes in v4:
- Resolve warnings reported by make dt_bindings_check
- Convert the data type of the dma_addr to dma_addr_t
- Replace the macro with an inline function for more readability
- Rename the cdsp_dma_bits to dma_addr_bits_extended and default_dma_bits
to the dma_addr_bits_default for more clarity
Changes in v3:
- dt-bindings documentation update to support Kaanapali Soc
- update comments to ensure clarity
- Read SoC-specific data by matching the SoC’s .compatible field
in the driver’s of_device_id match table instead of root node
- Rename the dma_mask to the dma_bits for more clarity and set it's
value based on the dsp_default_dma_bits instead of hardcode to 32
Changes in v2:
- Rename phys to dma_addr for clarity
- Remove iova_format, add soc_data with sid_pos in channel ctx
- Remove sid_pos and pa_bits from the session ctx
Kumari Pallavi (4):
dt-bindings: misc: qcom,fastrpc: Add compatible for Kaanapali
misc: fastrpc: Rename phys to dma_addr for clarity
misc: fastrpc: Add support for new DSP IOVA formatting
misc: fastrpc: Update dma_bits for CDSP support on Kaanapali SoC
.../bindings/misc/qcom,fastrpc.yaml | 8 +-
drivers/misc/fastrpc.c | 130 ++++++++++++------
2 files changed, 97 insertions(+), 41 deletions(-)
--
2.34.1
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v5 1/4] dt-bindings: misc: qcom,fastrpc: Add compatible for Kaanapali
2025-12-02 6:06 [PATCH v5 0/4] Add ADSP and CDSP support on Kaanapali SoC Kumari Pallavi
@ 2025-12-02 6:06 ` Kumari Pallavi
2025-12-02 8:17 ` Krzysztof Kozlowski
2025-12-02 6:06 ` [PATCH v5 2/4] misc: fastrpc: Rename phys to dma_addr for clarity Kumari Pallavi
` (2 subsequent siblings)
3 siblings, 1 reply; 16+ messages in thread
From: Kumari Pallavi @ 2025-12-02 6:06 UTC (permalink / raw)
To: kpallavi, srini, amahesh, arnd, gregkh, robh, krzk+dt, conor+dt
Cc: Kumari Pallavi, quic_bkumar, ekansh.gupta, linux-kernel,
quic_chennak, dri-devel, linux-arm-msm, devicetree, jingyi.wang,
aiqun.yu, ktadakam
Kaanapali introduces changes in DSP IOVA layout and CDSP DMA addressing
that differ from previous SoCs. The SID field moves within the physical
address, and CDSP now supports a wider DMA range, requiring updated
sid_pos and DMA mask handling in the driver.
To apply these changes only on Kaanapali, add a SoC-specific compatible
string "qcom,kaanapali-fastrpc". Older DTs using "qcom,fastrpc" remain
valid.
Signed-off-by: Kumari Pallavi <kumari.pallavi@oss.qualcomm.com>
---
Documentation/devicetree/bindings/misc/qcom,fastrpc.yaml | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/Documentation/devicetree/bindings/misc/qcom,fastrpc.yaml b/Documentation/devicetree/bindings/misc/qcom,fastrpc.yaml
index 3f6199fc9ae6..8bf7d4d83c8b 100644
--- a/Documentation/devicetree/bindings/misc/qcom,fastrpc.yaml
+++ b/Documentation/devicetree/bindings/misc/qcom,fastrpc.yaml
@@ -18,7 +18,13 @@ description: |
properties:
compatible:
- const: qcom,fastrpc
+ oneOf:
+ - items:
+ - enum:
+ - qcom,kaanapali-fastrpc
+ - const: qcom,fastrpc
+ - items:
+ - const: qcom,fastrpc
label:
enum:
--
2.34.1
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v5 2/4] misc: fastrpc: Rename phys to dma_addr for clarity
2025-12-02 6:06 [PATCH v5 0/4] Add ADSP and CDSP support on Kaanapali SoC Kumari Pallavi
2025-12-02 6:06 ` [PATCH v5 1/4] dt-bindings: misc: qcom,fastrpc: Add compatible for Kaanapali Kumari Pallavi
@ 2025-12-02 6:06 ` Kumari Pallavi
2025-12-06 2:26 ` Dmitry Baryshkov
2025-12-02 6:06 ` [PATCH v5 3/4] misc: fastrpc: Add support for new DSP IOVA formatting Kumari Pallavi
2025-12-02 6:06 ` [PATCH v5 4/4] misc: fastrpc: Update dma_bits for CDSP support on Kaanapali SoC Kumari Pallavi
3 siblings, 1 reply; 16+ messages in thread
From: Kumari Pallavi @ 2025-12-02 6:06 UTC (permalink / raw)
To: kpallavi, srini, amahesh, arnd, gregkh, robh, krzk+dt, conor+dt
Cc: Kumari Pallavi, quic_bkumar, ekansh.gupta, linux-kernel,
quic_chennak, dri-devel, linux-arm-msm, devicetree, jingyi.wang,
aiqun.yu, ktadakam
Update all references of buf->phys and map->phys to buf->dma_addr and
map->dma_addr to accurately represent that these fields store DMA
addresses, not physical addresses. This change improves code clarity
and aligns with kernel conventions for dma_addr_t usage.
Signed-off-by: Kumari Pallavi <kumari.pallavi@oss.qualcomm.com>
---
drivers/misc/fastrpc.c | 77 ++++++++++++++++++++++--------------------
1 file changed, 41 insertions(+), 36 deletions(-)
diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c
index ee652ef01534..eb9501fe79bc 100644
--- a/drivers/misc/fastrpc.c
+++ b/drivers/misc/fastrpc.c
@@ -106,7 +106,7 @@
#define miscdev_to_fdevice(d) container_of(d, struct fastrpc_device, miscdev)
struct fastrpc_phy_page {
- u64 addr; /* physical address */
+ dma_addr_t addr; /* dma address */
u64 size; /* size of contiguous region */
};
@@ -171,7 +171,7 @@ struct fastrpc_msg {
u64 ctx; /* invoke caller context */
u32 handle; /* handle to invoke */
u32 sc; /* scalars structure describing the data */
- u64 addr; /* physical address */
+ dma_addr_t addr; /* dma address */
u64 size; /* size of contiguous region */
};
@@ -194,7 +194,7 @@ struct fastrpc_buf {
struct dma_buf *dmabuf;
struct device *dev;
void *virt;
- u64 phys;
+ dma_addr_t dma_addr;
u64 size;
/* Lock for dma buf attachments */
struct mutex lock;
@@ -217,7 +217,7 @@ struct fastrpc_map {
struct dma_buf *buf;
struct sg_table *table;
struct dma_buf_attachment *attach;
- u64 phys;
+ dma_addr_t dma_addr;
u64 size;
void *va;
u64 len;
@@ -320,11 +320,12 @@ static void fastrpc_free_map(struct kref *ref)
perm.vmid = QCOM_SCM_VMID_HLOS;
perm.perm = QCOM_SCM_PERM_RWX;
- err = qcom_scm_assign_mem(map->phys, map->len,
+ err = qcom_scm_assign_mem(map->dma_addr, map->len,
&src_perms, &perm, 1);
if (err) {
- dev_err(map->fl->sctx->dev, "Failed to assign memory phys 0x%llx size 0x%llx err %d\n",
- map->phys, map->len, err);
+ dev_err(map->fl->sctx->dev,
+ "Failed to assign memory dma_addr %pad size 0x%llx err %d\n",
+ &map->dma_addr, map->len, err);
return;
}
}
@@ -389,7 +390,7 @@ static int fastrpc_map_lookup(struct fastrpc_user *fl, int fd,
static void fastrpc_buf_free(struct fastrpc_buf *buf)
{
dma_free_coherent(buf->dev, buf->size, buf->virt,
- FASTRPC_PHYS(buf->phys));
+ FASTRPC_PHYS(buf->dma_addr));
kfree(buf);
}
@@ -408,12 +409,12 @@ static int __fastrpc_buf_alloc(struct fastrpc_user *fl, struct device *dev,
buf->fl = fl;
buf->virt = NULL;
- buf->phys = 0;
+ buf->dma_addr = 0;
buf->size = size;
buf->dev = dev;
buf->raddr = 0;
- buf->virt = dma_alloc_coherent(dev, buf->size, (dma_addr_t *)&buf->phys,
+ buf->virt = dma_alloc_coherent(dev, buf->size, &buf->dma_addr,
GFP_KERNEL);
if (!buf->virt) {
mutex_destroy(&buf->lock);
@@ -439,7 +440,7 @@ static int fastrpc_buf_alloc(struct fastrpc_user *fl, struct device *dev,
buf = *obuf;
if (fl->sctx && fl->sctx->sid)
- buf->phys += ((u64)fl->sctx->sid << 32);
+ buf->dma_addr += ((u64)fl->sctx->sid << 32);
return 0;
}
@@ -684,7 +685,7 @@ static int fastrpc_dma_buf_attach(struct dma_buf *dmabuf,
return -ENOMEM;
ret = dma_get_sgtable(buffer->dev, &a->sgt, buffer->virt,
- FASTRPC_PHYS(buffer->phys), buffer->size);
+ FASTRPC_PHYS(buffer->dma_addr), buffer->size);
if (ret < 0) {
dev_err(buffer->dev, "failed to get scatterlist from DMA API\n");
kfree(a);
@@ -733,7 +734,7 @@ static int fastrpc_mmap(struct dma_buf *dmabuf,
dma_resv_assert_held(dmabuf->resv);
return dma_mmap_coherent(buf->dev, vma, buf->virt,
- FASTRPC_PHYS(buf->phys), size);
+ FASTRPC_PHYS(buf->dma_addr), size);
}
static const struct dma_buf_ops fastrpc_dma_buf_ops = {
@@ -785,10 +786,10 @@ static int fastrpc_map_attach(struct fastrpc_user *fl, int fd,
map->table = table;
if (attr & FASTRPC_ATTR_SECUREMAP) {
- map->phys = sg_phys(map->table->sgl);
+ map->dma_addr = sg_phys(map->table->sgl);
} else {
- map->phys = sg_dma_address(map->table->sgl);
- map->phys += ((u64)fl->sctx->sid << 32);
+ map->dma_addr = sg_dma_address(map->table->sgl);
+ map->dma_addr += ((u64)fl->sctx->sid << 32);
}
for_each_sg(map->table->sgl, sgl, map->table->nents,
sgl_index)
@@ -815,10 +816,11 @@ static int fastrpc_map_attach(struct fastrpc_user *fl, int fd,
dst_perms[1].vmid = fl->cctx->vmperms[0].vmid;
dst_perms[1].perm = QCOM_SCM_PERM_RWX;
map->attr = attr;
- err = qcom_scm_assign_mem(map->phys, (u64)map->len, &src_perms, dst_perms, 2);
+ err = qcom_scm_assign_mem(map->dma_addr, (u64)map->len, &src_perms, dst_perms, 2);
if (err) {
- dev_err(sess->dev, "Failed to assign memory with phys 0x%llx size 0x%llx err %d\n",
- map->phys, map->len, err);
+ dev_err(sess->dev,
+ "Failed to assign memory with dma_addr %pad size 0x%llx err %d\n",
+ &map->dma_addr, map->len, err);
goto map_err;
}
}
@@ -1009,7 +1011,7 @@ static int fastrpc_get_args(u32 kernel, struct fastrpc_invoke_ctx *ctx)
struct vm_area_struct *vma = NULL;
rpra[i].buf.pv = (u64) ctx->args[i].ptr;
- pages[i].addr = ctx->maps[i]->phys;
+ pages[i].addr = ctx->maps[i]->dma_addr;
mmap_read_lock(current->mm);
vma = find_vma(current->mm, ctx->args[i].ptr);
@@ -1036,7 +1038,7 @@ static int fastrpc_get_args(u32 kernel, struct fastrpc_invoke_ctx *ctx)
goto bail;
rpra[i].buf.pv = args - ctx->olaps[oix].offset;
- pages[i].addr = ctx->buf->phys -
+ pages[i].addr = ctx->buf->dma_addr -
ctx->olaps[oix].offset +
(pkt_size - rlen);
pages[i].addr = pages[i].addr & PAGE_MASK;
@@ -1068,7 +1070,7 @@ static int fastrpc_get_args(u32 kernel, struct fastrpc_invoke_ctx *ctx)
list[i].num = ctx->args[i].length ? 1 : 0;
list[i].pgidx = i;
if (ctx->maps[i]) {
- pages[i].addr = ctx->maps[i]->phys;
+ pages[i].addr = ctx->maps[i]->dma_addr;
pages[i].size = ctx->maps[i]->size;
}
rpra[i].dma.fd = ctx->args[i].fd;
@@ -1150,7 +1152,7 @@ static int fastrpc_invoke_send(struct fastrpc_session_ctx *sctx,
msg->ctx = ctx->ctxid | fl->pd;
msg->handle = handle;
msg->sc = ctx->sc;
- msg->addr = ctx->buf ? ctx->buf->phys : 0;
+ msg->addr = ctx->buf ? ctx->buf->dma_addr : 0;
msg->size = roundup(ctx->msg_sz, PAGE_SIZE);
fastrpc_context_get(ctx);
@@ -1306,13 +1308,15 @@ static int fastrpc_init_create_static_process(struct fastrpc_user *fl,
if (fl->cctx->vmcount) {
u64 src_perms = BIT(QCOM_SCM_VMID_HLOS);
- err = qcom_scm_assign_mem(fl->cctx->remote_heap->phys,
+ err = qcom_scm_assign_mem(fl->cctx->remote_heap->dma_addr,
(u64)fl->cctx->remote_heap->size,
&src_perms,
fl->cctx->vmperms, fl->cctx->vmcount);
if (err) {
- dev_err(fl->sctx->dev, "Failed to assign memory with phys 0x%llx size 0x%llx err %d\n",
- fl->cctx->remote_heap->phys, fl->cctx->remote_heap->size, err);
+ dev_err(fl->sctx->dev,
+ "Failed to assign memory with dma_addr %pad size 0x%llx err %d\n",
+ &fl->cctx->remote_heap->dma_addr,
+ fl->cctx->remote_heap->size, err);
goto err_map;
}
scm_done = true;
@@ -1332,7 +1336,7 @@ static int fastrpc_init_create_static_process(struct fastrpc_user *fl,
args[1].length = inbuf.namelen;
args[1].fd = -1;
- pages[0].addr = fl->cctx->remote_heap->phys;
+ pages[0].addr = fl->cctx->remote_heap->dma_addr;
pages[0].size = fl->cctx->remote_heap->size;
args[2].ptr = (u64)(uintptr_t) pages;
@@ -1361,12 +1365,12 @@ static int fastrpc_init_create_static_process(struct fastrpc_user *fl,
dst_perms.vmid = QCOM_SCM_VMID_HLOS;
dst_perms.perm = QCOM_SCM_PERM_RWX;
- err = qcom_scm_assign_mem(fl->cctx->remote_heap->phys,
+ err = qcom_scm_assign_mem(fl->cctx->remote_heap->dma_addr,
(u64)fl->cctx->remote_heap->size,
&src_perms, &dst_perms, 1);
if (err)
- dev_err(fl->sctx->dev, "Failed to assign memory phys 0x%llx size 0x%llx err %d\n",
- fl->cctx->remote_heap->phys, fl->cctx->remote_heap->size, err);
+ dev_err(fl->sctx->dev, "Failed to assign memory dma_addr %pad size 0x%llx err %d\n",
+ &fl->cctx->remote_heap->dma_addr, fl->cctx->remote_heap->size, err);
}
err_map:
fastrpc_buf_free(fl->cctx->remote_heap);
@@ -1455,7 +1459,7 @@ static int fastrpc_init_create_process(struct fastrpc_user *fl,
args[2].length = inbuf.filelen;
args[2].fd = init.filefd;
- pages[0].addr = imem->phys;
+ pages[0].addr = imem->dma_addr;
pages[0].size = imem->size;
args[3].ptr = (u64)(uintptr_t) pages;
@@ -1913,7 +1917,7 @@ static int fastrpc_req_mmap(struct fastrpc_user *fl, char __user *argp)
args[0].ptr = (u64) (uintptr_t) &req_msg;
args[0].length = sizeof(req_msg);
- pages.addr = buf->phys;
+ pages.addr = buf->dma_addr;
pages.size = buf->size;
args[1].ptr = (u64) (uintptr_t) &pages;
@@ -1941,11 +1945,12 @@ static int fastrpc_req_mmap(struct fastrpc_user *fl, char __user *argp)
if (req.flags == ADSP_MMAP_REMOTE_HEAP_ADDR && fl->cctx->vmcount) {
u64 src_perms = BIT(QCOM_SCM_VMID_HLOS);
- err = qcom_scm_assign_mem(buf->phys, (u64)buf->size,
+ err = qcom_scm_assign_mem(buf->dma_addr, (u64)buf->size,
&src_perms, fl->cctx->vmperms, fl->cctx->vmcount);
if (err) {
- dev_err(fl->sctx->dev, "Failed to assign memory phys 0x%llx size 0x%llx err %d",
- buf->phys, buf->size, err);
+ dev_err(fl->sctx->dev,
+ "Failed to assign memory dma_addr %pad size 0x%llx err %d",
+ &buf->dma_addr, buf->size, err);
goto err_assign;
}
}
@@ -2059,7 +2064,7 @@ static int fastrpc_req_mem_map(struct fastrpc_user *fl, char __user *argp)
args[0].ptr = (u64) (uintptr_t) &req_msg;
args[0].length = sizeof(req_msg);
- pages.addr = map->phys;
+ pages.addr = map->dma_addr;
pages.size = map->len;
args[1].ptr = (u64) (uintptr_t) &pages;
--
2.34.1
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v5 3/4] misc: fastrpc: Add support for new DSP IOVA formatting
2025-12-02 6:06 [PATCH v5 0/4] Add ADSP and CDSP support on Kaanapali SoC Kumari Pallavi
2025-12-02 6:06 ` [PATCH v5 1/4] dt-bindings: misc: qcom,fastrpc: Add compatible for Kaanapali Kumari Pallavi
2025-12-02 6:06 ` [PATCH v5 2/4] misc: fastrpc: Rename phys to dma_addr for clarity Kumari Pallavi
@ 2025-12-02 6:06 ` Kumari Pallavi
2025-12-06 2:30 ` Dmitry Baryshkov
2025-12-02 6:06 ` [PATCH v5 4/4] misc: fastrpc: Update dma_bits for CDSP support on Kaanapali SoC Kumari Pallavi
3 siblings, 1 reply; 16+ messages in thread
From: Kumari Pallavi @ 2025-12-02 6:06 UTC (permalink / raw)
To: kpallavi, srini, amahesh, arnd, gregkh, robh, krzk+dt, conor+dt
Cc: Kumari Pallavi, quic_bkumar, ekansh.gupta, linux-kernel,
quic_chennak, dri-devel, linux-arm-msm, devicetree, jingyi.wang,
aiqun.yu, ktadakam
Implement the new IOVA formatting required by the DSP architecture change
on Kaanapali SoC. Place the SID for DSP DMA transactions at bit 56 in the
physical address. This placement is necessary for the DSPs to correctly
identify streams and operate as intended.
To address this, set SID position to bit 56 via OF matching on the fastrpc
node; otherwise, default to legacy 32-bit placement.
This change ensures consistent SID placement across DSPs.
Signed-off-by: Kumari Pallavi <kumari.pallavi@oss.qualcomm.com>
---
drivers/misc/fastrpc.c | 48 ++++++++++++++++++++++++++++++++++++------
1 file changed, 41 insertions(+), 7 deletions(-)
diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c
index eb9501fe79bc..6a67daafeaa1 100644
--- a/drivers/misc/fastrpc.c
+++ b/drivers/misc/fastrpc.c
@@ -33,7 +33,6 @@
#define FASTRPC_ALIGN 128
#define FASTRPC_MAX_FDLIST 16
#define FASTRPC_MAX_CRCLIST 64
-#define FASTRPC_PHYS(p) ((p) & 0xffffffff)
#define FASTRPC_CTX_MAX (256)
#define FASTRPC_INIT_HANDLE 1
#define FASTRPC_DSP_UTILITIES_HANDLE 2
@@ -105,6 +104,17 @@
#define miscdev_to_fdevice(d) container_of(d, struct fastrpc_device, miscdev)
+/* Extract smmu pa from consolidated iova */
+#define IPA_TO_DMA_ADDR(iova, sid_pos) (iova & ((1ULL << sid_pos) - 1ULL))
+/*
+ * Prepare the consolidated iova to send to dsp by prepending the sid
+ * to smmu pa at the appropriate position
+ */
+static inline u64 fastrpc_compute_sid_offset(u64 sid, u32 sid_pos)
+{
+ return sid << sid_pos;
+}
+
struct fastrpc_phy_page {
dma_addr_t addr; /* dma address */
u64 size; /* size of contiguous region */
@@ -257,6 +267,10 @@ struct fastrpc_session_ctx {
bool valid;
};
+struct fastrpc_soc_data {
+ u32 sid_pos;
+};
+
struct fastrpc_channel_ctx {
int domain_id;
int sesscount;
@@ -278,6 +292,7 @@ struct fastrpc_channel_ctx {
bool secure;
bool unsigned_support;
u64 dma_mask;
+ const struct fastrpc_soc_data *soc_data;
};
struct fastrpc_device {
@@ -390,7 +405,7 @@ static int fastrpc_map_lookup(struct fastrpc_user *fl, int fd,
static void fastrpc_buf_free(struct fastrpc_buf *buf)
{
dma_free_coherent(buf->dev, buf->size, buf->virt,
- FASTRPC_PHYS(buf->dma_addr));
+ IPA_TO_DMA_ADDR(buf->dma_addr, buf->fl->cctx->soc_data->sid_pos));
kfree(buf);
}
@@ -440,7 +455,8 @@ static int fastrpc_buf_alloc(struct fastrpc_user *fl, struct device *dev,
buf = *obuf;
if (fl->sctx && fl->sctx->sid)
- buf->dma_addr += ((u64)fl->sctx->sid << 32);
+ buf->dma_addr += fastrpc_compute_sid_offset((u64)fl->sctx->sid,
+ fl->cctx->soc_data->sid_pos);
return 0;
}
@@ -685,7 +701,8 @@ static int fastrpc_dma_buf_attach(struct dma_buf *dmabuf,
return -ENOMEM;
ret = dma_get_sgtable(buffer->dev, &a->sgt, buffer->virt,
- FASTRPC_PHYS(buffer->dma_addr), buffer->size);
+ IPA_TO_DMA_ADDR(buffer->dma_addr,
+ buffer->fl->cctx->soc_data->sid_pos), buffer->size);
if (ret < 0) {
dev_err(buffer->dev, "failed to get scatterlist from DMA API\n");
kfree(a);
@@ -734,7 +751,8 @@ static int fastrpc_mmap(struct dma_buf *dmabuf,
dma_resv_assert_held(dmabuf->resv);
return dma_mmap_coherent(buf->dev, vma, buf->virt,
- FASTRPC_PHYS(buf->dma_addr), size);
+ IPA_TO_DMA_ADDR(buf->dma_addr,
+ buf->fl->cctx->soc_data->sid_pos), size);
}
static const struct dma_buf_ops fastrpc_dma_buf_ops = {
@@ -789,7 +807,8 @@ static int fastrpc_map_attach(struct fastrpc_user *fl, int fd,
map->dma_addr = sg_phys(map->table->sgl);
} else {
map->dma_addr = sg_dma_address(map->table->sgl);
- map->dma_addr += ((u64)fl->sctx->sid << 32);
+ map->dma_addr += fastrpc_compute_sid_offset((u64)fl->sctx->sid,
+ fl->cctx->soc_data->sid_pos);
}
for_each_sg(map->table->sgl, sgl, map->table->nents,
sgl_index)
@@ -2290,6 +2309,14 @@ static int fastrpc_get_domain_id(const char *domain)
return -EINVAL;
}
+static const struct fastrpc_soc_data kaanapali_soc_data = {
+ .sid_pos = 56,
+};
+
+static const struct fastrpc_soc_data default_soc_data = {
+ .sid_pos = 32,
+};
+
static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev)
{
struct device *rdev = &rpdev->dev;
@@ -2298,6 +2325,11 @@ static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev)
const char *domain;
bool secure_dsp;
unsigned int vmids[FASTRPC_MAX_VMIDS];
+ const struct fastrpc_soc_data *soc_data;
+
+ soc_data = device_get_match_data(rdev);
+ if (!soc_data)
+ soc_data = &default_soc_data;
err = of_property_read_string(rdev->of_node, "label", &domain);
if (err) {
@@ -2350,6 +2382,7 @@ static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev)
secure_dsp = !(of_property_read_bool(rdev->of_node, "qcom,non-secure-domain"));
data->secure = secure_dsp;
+ data->soc_data = soc_data;
switch (domain_id) {
case ADSP_DOMAIN_ID:
@@ -2487,7 +2520,8 @@ static int fastrpc_rpmsg_callback(struct rpmsg_device *rpdev, void *data,
}
static const struct of_device_id fastrpc_rpmsg_of_match[] = {
- { .compatible = "qcom,fastrpc" },
+ { .compatible = "qcom,kaanapali-fastrpc", .data = &kaanapali_soc_data },
+ { .compatible = "qcom,fastrpc", .data = &default_soc_data },
{ },
};
MODULE_DEVICE_TABLE(of, fastrpc_rpmsg_of_match);
--
2.34.1
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v5 4/4] misc: fastrpc: Update dma_bits for CDSP support on Kaanapali SoC
2025-12-02 6:06 [PATCH v5 0/4] Add ADSP and CDSP support on Kaanapali SoC Kumari Pallavi
` (2 preceding siblings ...)
2025-12-02 6:06 ` [PATCH v5 3/4] misc: fastrpc: Add support for new DSP IOVA formatting Kumari Pallavi
@ 2025-12-02 6:06 ` Kumari Pallavi
2025-12-06 2:31 ` Dmitry Baryshkov
3 siblings, 1 reply; 16+ messages in thread
From: Kumari Pallavi @ 2025-12-02 6:06 UTC (permalink / raw)
To: kpallavi, srini, amahesh, arnd, gregkh, robh, krzk+dt, conor+dt
Cc: Kumari Pallavi, quic_bkumar, ekansh.gupta, linux-kernel,
quic_chennak, dri-devel, linux-arm-msm, devicetree, jingyi.wang,
aiqun.yu, ktadakam
DSP currently supports 32-bit IOVA (32-bit PA + 4-bit SID) for
both Q6 and user DMA (uDMA) access. This is being upgraded to
34-bit PA + 4-bit SID due to a hardware revision in CDSP for
Kaanapali SoC, which expands the DMA addressable range.
Update DMA bits configuration in the driver to support CDSP on
Kaanapali SoC. Set the default `dma_bits` to 32-bit and update
it to 34-bit based on CDSP and OF matching on the fastrpc node.
Signed-off-by: Kumari Pallavi <kumari.pallavi@oss.qualcomm.com>
---
drivers/misc/fastrpc.c | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)
diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c
index 6a67daafeaa1..c5d2c426fcbc 100644
--- a/drivers/misc/fastrpc.c
+++ b/drivers/misc/fastrpc.c
@@ -269,6 +269,8 @@ struct fastrpc_session_ctx {
struct fastrpc_soc_data {
u32 sid_pos;
+ u32 dma_addr_bits_extended;
+ u32 dma_addr_bits_default;
};
struct fastrpc_channel_ctx {
@@ -2189,6 +2191,7 @@ static int fastrpc_cb_probe(struct platform_device *pdev)
int i, sessions = 0;
unsigned long flags;
int rc;
+ u32 dma_bits;
cctx = dev_get_drvdata(dev->parent);
if (!cctx)
@@ -2202,12 +2205,16 @@ static int fastrpc_cb_probe(struct platform_device *pdev)
spin_unlock_irqrestore(&cctx->lock, flags);
return -ENOSPC;
}
+ dma_bits = cctx->soc_data->dma_addr_bits_default;
sess = &cctx->session[cctx->sesscount++];
sess->used = false;
sess->valid = true;
sess->dev = dev;
dev_set_drvdata(dev, sess);
+ if (cctx->domain_id == CDSP_DOMAIN_ID)
+ dma_bits = cctx->soc_data->dma_addr_bits_extended;
+
if (of_property_read_u32(dev->of_node, "reg", &sess->sid))
dev_info(dev, "FastRPC Session ID not specified in DT\n");
@@ -2222,9 +2229,9 @@ static int fastrpc_cb_probe(struct platform_device *pdev)
}
}
spin_unlock_irqrestore(&cctx->lock, flags);
- rc = dma_set_mask(dev, DMA_BIT_MASK(32));
+ rc = dma_set_mask(dev, DMA_BIT_MASK(dma_bits));
if (rc) {
- dev_err(dev, "32-bit DMA enable failed\n");
+ dev_err(dev, "%u-bit DMA enable failed\n", dma_bits);
return rc;
}
@@ -2311,10 +2318,14 @@ static int fastrpc_get_domain_id(const char *domain)
static const struct fastrpc_soc_data kaanapali_soc_data = {
.sid_pos = 56,
+ .dma_addr_bits_extended = 34,
+ .dma_addr_bits_default = 32,
};
static const struct fastrpc_soc_data default_soc_data = {
.sid_pos = 32,
+ .dma_addr_bits_extended = 32,
+ .dma_addr_bits_default = 32,
};
static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev)
--
2.34.1
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH v5 1/4] dt-bindings: misc: qcom,fastrpc: Add compatible for Kaanapali
2025-12-02 6:06 ` [PATCH v5 1/4] dt-bindings: misc: qcom,fastrpc: Add compatible for Kaanapali Kumari Pallavi
@ 2025-12-02 8:17 ` Krzysztof Kozlowski
2025-12-02 10:01 ` Kumari Pallavi
0 siblings, 1 reply; 16+ messages in thread
From: Krzysztof Kozlowski @ 2025-12-02 8:17 UTC (permalink / raw)
To: Kumari Pallavi, kpallavi, srini, amahesh, arnd, gregkh, robh,
krzk+dt, conor+dt
Cc: quic_bkumar, ekansh.gupta, linux-kernel, quic_chennak, dri-devel,
linux-arm-msm, devicetree, jingyi.wang, aiqun.yu, ktadakam
On 02/12/2025 07:06, Kumari Pallavi wrote:
> Kaanapali introduces changes in DSP IOVA layout and CDSP DMA addressing
> that differ from previous SoCs. The SID field moves within the physical
> address, and CDSP now supports a wider DMA range, requiring updated
> sid_pos and DMA mask handling in the driver.
> To apply these changes only on Kaanapali, add a SoC-specific compatible
> string "qcom,kaanapali-fastrpc". Older DTs using "qcom,fastrpc" remain
> valid.
Drop last two sentences, redundant. Patch contents tell that.
>
> Signed-off-by: Kumari Pallavi <kumari.pallavi@oss.qualcomm.com>
> ---
> Documentation/devicetree/bindings/misc/qcom,fastrpc.yaml | 8 +++++++-
> 1 file changed, 7 insertions(+), 1 deletion(-)
>
You did not test the v4, so is this one tested?
> diff --git a/Documentation/devicetree/bindings/misc/qcom,fastrpc.yaml b/Documentation/devicetree/bindings/misc/qcom,fastrpc.yaml
> index 3f6199fc9ae6..8bf7d4d83c8b 100644
> --- a/Documentation/devicetree/bindings/misc/qcom,fastrpc.yaml
> +++ b/Documentation/devicetree/bindings/misc/qcom,fastrpc.yaml
> @@ -18,7 +18,13 @@ description: |
>
> properties:
> compatible:
> - const: qcom,fastrpc
> + oneOf:
> + - items:
> + - enum:
> + - qcom,kaanapali-fastrpc
> + - const: qcom,fastrpc
> + - items:
I asked last time to drop the unnecessary items. Wasn't here before.
> + - const: qcom,fastrpc
>
> label:
> enum:
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v5 1/4] dt-bindings: misc: qcom,fastrpc: Add compatible for Kaanapali
2025-12-02 8:17 ` Krzysztof Kozlowski
@ 2025-12-02 10:01 ` Kumari Pallavi
2025-12-05 8:33 ` Krzysztof Kozlowski
0 siblings, 1 reply; 16+ messages in thread
From: Kumari Pallavi @ 2025-12-02 10:01 UTC (permalink / raw)
To: Krzysztof Kozlowski, kpallavi, srini, amahesh, arnd, gregkh, robh,
krzk+dt, conor+dt
Cc: quic_bkumar, ekansh.gupta, linux-kernel, quic_chennak, dri-devel,
linux-arm-msm, devicetree, jingyi.wang, aiqun.yu, ktadakam
On 12/2/2025 1:47 PM, Krzysztof Kozlowski wrote:
> On 02/12/2025 07:06, Kumari Pallavi wrote:
>> Kaanapali introduces changes in DSP IOVA layout and CDSP DMA addressing
>> that differ from previous SoCs. The SID field moves within the physical
>> address, and CDSP now supports a wider DMA range, requiring updated
>> sid_pos and DMA mask handling in the driver.
>> To apply these changes only on Kaanapali, add a SoC-specific compatible
>> string "qcom,kaanapali-fastrpc". Older DTs using "qcom,fastrpc" remain
>> valid.
>
> Drop last two sentences, redundant. Patch contents tell that.
>
ACK
>>
>> Signed-off-by: Kumari Pallavi <kumari.pallavi@oss.qualcomm.com>
>> ---
>> Documentation/devicetree/bindings/misc/qcom,fastrpc.yaml | 8 +++++++-
>> 1 file changed, 7 insertions(+), 1 deletion(-)
>>
>
> You did not test the v4, so is this one tested?
>
Yes, I tested all possible entry combinations for this version. For v4,
I only validated the best-case scenario and did not cover all possibilities.
>> diff --git a/Documentation/devicetree/bindings/misc/qcom,fastrpc.yaml b/Documentation/devicetree/bindings/misc/qcom,fastrpc.yaml
>> index 3f6199fc9ae6..8bf7d4d83c8b 100644
>> --- a/Documentation/devicetree/bindings/misc/qcom,fastrpc.yaml
>> +++ b/Documentation/devicetree/bindings/misc/qcom,fastrpc.yaml
>> @@ -18,7 +18,13 @@ description: |
>>
>> properties:
>> compatible:
>> - const: qcom,fastrpc
>> + oneOf:
>> + - items:
>> + - enum:
>> + - qcom,kaanapali-fastrpc
>> + - const: qcom,fastrpc
>> + - items:
>
> I asked last time to drop the unnecessary items. Wasn't here before.
>
I’ll update the schema in the next patch series to remove the
unnecessary items. The revised version will look like this:
properties:
compatible:
oneOf:
- items:
- enum:
- qcom,kaanapali-fastrpc
- const: qcom,fastrpc
- const: qcom,fastrpc
>> + - const: qcom,fastrpc
>>
>> label:
>> enum:
>
>
> Best regards,
> Krzysztof
Thanks,
Pallavi
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v5 1/4] dt-bindings: misc: qcom,fastrpc: Add compatible for Kaanapali
2025-12-02 10:01 ` Kumari Pallavi
@ 2025-12-05 8:33 ` Krzysztof Kozlowski
0 siblings, 0 replies; 16+ messages in thread
From: Krzysztof Kozlowski @ 2025-12-05 8:33 UTC (permalink / raw)
To: Kumari Pallavi
Cc: kpallavi, srini, amahesh, arnd, gregkh, robh, krzk+dt, conor+dt,
quic_bkumar, ekansh.gupta, linux-kernel, quic_chennak, dri-devel,
linux-arm-msm, devicetree, jingyi.wang, aiqun.yu, ktadakam
On Tue, Dec 02, 2025 at 03:31:17PM +0530, Kumari Pallavi wrote:
> > I asked last time to drop the unnecessary items. Wasn't here before.
> >
>
> I’ll update the schema in the next patch series to remove the unnecessary
> items. The revised version will look like this:
>
> properties:
> compatible:
> oneOf:
> - items:
> - enum:
> - qcom,kaanapali-fastrpc
> - const: qcom,fastrpc
> - const: qcom,fastrpc
>
>
Yes.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v5 2/4] misc: fastrpc: Rename phys to dma_addr for clarity
2025-12-02 6:06 ` [PATCH v5 2/4] misc: fastrpc: Rename phys to dma_addr for clarity Kumari Pallavi
@ 2025-12-06 2:26 ` Dmitry Baryshkov
2025-12-08 7:08 ` Kumari Pallavi
0 siblings, 1 reply; 16+ messages in thread
From: Dmitry Baryshkov @ 2025-12-06 2:26 UTC (permalink / raw)
To: Kumari Pallavi
Cc: kpallavi, srini, amahesh, arnd, gregkh, robh, krzk+dt, conor+dt,
quic_bkumar, ekansh.gupta, linux-kernel, quic_chennak, dri-devel,
linux-arm-msm, devicetree, jingyi.wang, aiqun.yu, ktadakam
On Tue, Dec 02, 2025 at 11:36:26AM +0530, Kumari Pallavi wrote:
> Update all references of buf->phys and map->phys to buf->dma_addr and
> map->dma_addr to accurately represent that these fields store DMA
> addresses, not physical addresses. This change improves code clarity
> and aligns with kernel conventions for dma_addr_t usage.
Please _start_ by describing the problem or the issue the patch is
trying to solve.
>
> Signed-off-by: Kumari Pallavi <kumari.pallavi@oss.qualcomm.com>
> ---
> drivers/misc/fastrpc.c | 77 ++++++++++++++++++++++--------------------
> 1 file changed, 41 insertions(+), 36 deletions(-)
>
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v5 3/4] misc: fastrpc: Add support for new DSP IOVA formatting
2025-12-02 6:06 ` [PATCH v5 3/4] misc: fastrpc: Add support for new DSP IOVA formatting Kumari Pallavi
@ 2025-12-06 2:30 ` Dmitry Baryshkov
2025-12-08 7:26 ` Kumari Pallavi
0 siblings, 1 reply; 16+ messages in thread
From: Dmitry Baryshkov @ 2025-12-06 2:30 UTC (permalink / raw)
To: Kumari Pallavi
Cc: kpallavi, srini, amahesh, arnd, gregkh, robh, krzk+dt, conor+dt,
quic_bkumar, ekansh.gupta, linux-kernel, quic_chennak, dri-devel,
linux-arm-msm, devicetree, jingyi.wang, aiqun.yu, ktadakam
On Tue, Dec 02, 2025 at 11:36:27AM +0530, Kumari Pallavi wrote:
> Implement the new IOVA formatting required by the DSP architecture change
> on Kaanapali SoC. Place the SID for DSP DMA transactions at bit 56 in the
> physical address. This placement is necessary for the DSPs to correctly
> identify streams and operate as intended.
> To address this, set SID position to bit 56 via OF matching on the fastrpc
> node; otherwise, default to legacy 32-bit placement.
> This change ensures consistent SID placement across DSPs.
>
> Signed-off-by: Kumari Pallavi <kumari.pallavi@oss.qualcomm.com>
> ---
> drivers/misc/fastrpc.c | 48 ++++++++++++++++++++++++++++++++++++------
> 1 file changed, 41 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c
> index eb9501fe79bc..6a67daafeaa1 100644
> --- a/drivers/misc/fastrpc.c
> +++ b/drivers/misc/fastrpc.c
> @@ -33,7 +33,6 @@
> #define FASTRPC_ALIGN 128
> #define FASTRPC_MAX_FDLIST 16
> #define FASTRPC_MAX_CRCLIST 64
> -#define FASTRPC_PHYS(p) ((p) & 0xffffffff)
> #define FASTRPC_CTX_MAX (256)
> #define FASTRPC_INIT_HANDLE 1
> #define FASTRPC_DSP_UTILITIES_HANDLE 2
> @@ -105,6 +104,17 @@
>
> #define miscdev_to_fdevice(d) container_of(d, struct fastrpc_device, miscdev)
>
> +/* Extract smmu pa from consolidated iova */
Nit: SMMU, PA, IOVA
> +#define IPA_TO_DMA_ADDR(iova, sid_pos) (iova & ((1ULL << sid_pos) - 1ULL))
GENMASK?
> +/*
> + * Prepare the consolidated iova to send to dsp by prepending the sid
Nit: DSP, SID, PA
> + * to smmu pa at the appropriate position
> + */
> +static inline u64 fastrpc_compute_sid_offset(u64 sid, u32 sid_pos)
> +{
> + return sid << sid_pos;
> +}
> +
> struct fastrpc_phy_page {
> dma_addr_t addr; /* dma address */
> u64 size; /* size of contiguous region */
> @@ -257,6 +267,10 @@ struct fastrpc_session_ctx {
> bool valid;
> };
>
> +struct fastrpc_soc_data {
> + u32 sid_pos;
> +};
> +
> struct fastrpc_channel_ctx {
> int domain_id;
> int sesscount;
> @@ -278,6 +292,7 @@ struct fastrpc_channel_ctx {
> bool secure;
> bool unsigned_support;
> u64 dma_mask;
> + const struct fastrpc_soc_data *soc_data;
> };
>
> struct fastrpc_device {
> @@ -390,7 +405,7 @@ static int fastrpc_map_lookup(struct fastrpc_user *fl, int fd,
> static void fastrpc_buf_free(struct fastrpc_buf *buf)
> {
> dma_free_coherent(buf->dev, buf->size, buf->virt,
> - FASTRPC_PHYS(buf->dma_addr));
> + IPA_TO_DMA_ADDR(buf->dma_addr, buf->fl->cctx->soc_data->sid_pos));
> kfree(buf);
> }
>
> @@ -440,7 +455,8 @@ static int fastrpc_buf_alloc(struct fastrpc_user *fl, struct device *dev,
> buf = *obuf;
>
> if (fl->sctx && fl->sctx->sid)
> - buf->dma_addr += ((u64)fl->sctx->sid << 32);
> + buf->dma_addr += fastrpc_compute_sid_offset((u64)fl->sctx->sid,
Drop type conversion
> + fl->cctx->soc_data->sid_pos);
>
> return 0;
> }
> @@ -685,7 +701,8 @@ static int fastrpc_dma_buf_attach(struct dma_buf *dmabuf,
> return -ENOMEM;
>
> ret = dma_get_sgtable(buffer->dev, &a->sgt, buffer->virt,
> - FASTRPC_PHYS(buffer->dma_addr), buffer->size);
> + IPA_TO_DMA_ADDR(buffer->dma_addr,
> + buffer->fl->cctx->soc_data->sid_pos), buffer->size);
> if (ret < 0) {
> dev_err(buffer->dev, "failed to get scatterlist from DMA API\n");
> kfree(a);
> @@ -734,7 +751,8 @@ static int fastrpc_mmap(struct dma_buf *dmabuf,
> dma_resv_assert_held(dmabuf->resv);
>
> return dma_mmap_coherent(buf->dev, vma, buf->virt,
> - FASTRPC_PHYS(buf->dma_addr), size);
> + IPA_TO_DMA_ADDR(buf->dma_addr,
> + buf->fl->cctx->soc_data->sid_pos), size);
> }
>
> static const struct dma_buf_ops fastrpc_dma_buf_ops = {
> @@ -789,7 +807,8 @@ static int fastrpc_map_attach(struct fastrpc_user *fl, int fd,
> map->dma_addr = sg_phys(map->table->sgl);
> } else {
> map->dma_addr = sg_dma_address(map->table->sgl);
> - map->dma_addr += ((u64)fl->sctx->sid << 32);
> + map->dma_addr += fastrpc_compute_sid_offset((u64)fl->sctx->sid,
Drop type conversion. Hmm. Looking at it, would it be better:
map->dma_addr = fastrpc_compute_dma_addr(fl->sctx, sg_dma_address(map->table->sgl))
> + fl->cctx->soc_data->sid_pos);
> }
> for_each_sg(map->table->sgl, sgl, map->table->nents,
> sgl_index)
> @@ -2290,6 +2309,14 @@ static int fastrpc_get_domain_id(const char *domain)
> return -EINVAL;
> }
>
> +static const struct fastrpc_soc_data kaanapali_soc_data = {
> + .sid_pos = 56,
> +};
> +
> +static const struct fastrpc_soc_data default_soc_data = {
> + .sid_pos = 32,
> +};
> +
> static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev)
> {
> struct device *rdev = &rpdev->dev;
> @@ -2298,6 +2325,11 @@ static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev)
> const char *domain;
> bool secure_dsp;
> unsigned int vmids[FASTRPC_MAX_VMIDS];
> + const struct fastrpc_soc_data *soc_data;
> +
> + soc_data = device_get_match_data(rdev);
> + if (!soc_data)
> + soc_data = &default_soc_data;
Define it for all the entries, drop if-check.
>
> err = of_property_read_string(rdev->of_node, "label", &domain);
> if (err) {
> @@ -2350,6 +2382,7 @@ static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev)
>
> secure_dsp = !(of_property_read_bool(rdev->of_node, "qcom,non-secure-domain"));
> data->secure = secure_dsp;
> + data->soc_data = soc_data;
>
> switch (domain_id) {
> case ADSP_DOMAIN_ID:
> @@ -2487,7 +2520,8 @@ static int fastrpc_rpmsg_callback(struct rpmsg_device *rpdev, void *data,
> }
>
> static const struct of_device_id fastrpc_rpmsg_of_match[] = {
> - { .compatible = "qcom,fastrpc" },
> + { .compatible = "qcom,kaanapali-fastrpc", .data = &kaanapali_soc_data },
> + { .compatible = "qcom,fastrpc", .data = &default_soc_data },
> { },
> };
> MODULE_DEVICE_TABLE(of, fastrpc_rpmsg_of_match);
> --
> 2.34.1
>
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v5 4/4] misc: fastrpc: Update dma_bits for CDSP support on Kaanapali SoC
2025-12-02 6:06 ` [PATCH v5 4/4] misc: fastrpc: Update dma_bits for CDSP support on Kaanapali SoC Kumari Pallavi
@ 2025-12-06 2:31 ` Dmitry Baryshkov
2025-12-08 7:04 ` Kumari Pallavi
0 siblings, 1 reply; 16+ messages in thread
From: Dmitry Baryshkov @ 2025-12-06 2:31 UTC (permalink / raw)
To: Kumari Pallavi
Cc: kpallavi, srini, amahesh, arnd, gregkh, robh, krzk+dt, conor+dt,
quic_bkumar, ekansh.gupta, linux-kernel, quic_chennak, dri-devel,
linux-arm-msm, devicetree, jingyi.wang, aiqun.yu, ktadakam
On Tue, Dec 02, 2025 at 11:36:28AM +0530, Kumari Pallavi wrote:
> DSP currently supports 32-bit IOVA (32-bit PA + 4-bit SID) for
> both Q6 and user DMA (uDMA) access. This is being upgraded to
> 34-bit PA + 4-bit SID due to a hardware revision in CDSP for
> Kaanapali SoC, which expands the DMA addressable range.
> Update DMA bits configuration in the driver to support CDSP on
> Kaanapali SoC. Set the default `dma_bits` to 32-bit and update
> it to 34-bit based on CDSP and OF matching on the fastrpc node.
>
> Signed-off-by: Kumari Pallavi <kumari.pallavi@oss.qualcomm.com>
> ---
> drivers/misc/fastrpc.c | 15 +++++++++++++--
> 1 file changed, 13 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c
> index 6a67daafeaa1..c5d2c426fcbc 100644
> --- a/drivers/misc/fastrpc.c
> +++ b/drivers/misc/fastrpc.c
> @@ -269,6 +269,8 @@ struct fastrpc_session_ctx {
>
> struct fastrpc_soc_data {
> u32 sid_pos;
> + u32 dma_addr_bits_extended;
s/extended/cdsp/
> + u32 dma_addr_bits_default;
> };
>
> struct fastrpc_channel_ctx {
> @@ -2189,6 +2191,7 @@ static int fastrpc_cb_probe(struct platform_device *pdev)
> int i, sessions = 0;
> unsigned long flags;
> int rc;
> + u32 dma_bits;
>
> cctx = dev_get_drvdata(dev->parent);
> if (!cctx)
> @@ -2202,12 +2205,16 @@ static int fastrpc_cb_probe(struct platform_device *pdev)
> spin_unlock_irqrestore(&cctx->lock, flags);
> return -ENOSPC;
> }
> + dma_bits = cctx->soc_data->dma_addr_bits_default;
> sess = &cctx->session[cctx->sesscount++];
> sess->used = false;
> sess->valid = true;
> sess->dev = dev;
> dev_set_drvdata(dev, sess);
>
> + if (cctx->domain_id == CDSP_DOMAIN_ID)
> + dma_bits = cctx->soc_data->dma_addr_bits_extended;
> +
> if (of_property_read_u32(dev->of_node, "reg", &sess->sid))
> dev_info(dev, "FastRPC Session ID not specified in DT\n");
>
> @@ -2222,9 +2229,9 @@ static int fastrpc_cb_probe(struct platform_device *pdev)
> }
> }
> spin_unlock_irqrestore(&cctx->lock, flags);
> - rc = dma_set_mask(dev, DMA_BIT_MASK(32));
> + rc = dma_set_mask(dev, DMA_BIT_MASK(dma_bits));
> if (rc) {
> - dev_err(dev, "32-bit DMA enable failed\n");
> + dev_err(dev, "%u-bit DMA enable failed\n", dma_bits);
> return rc;
> }
>
> @@ -2311,10 +2318,14 @@ static int fastrpc_get_domain_id(const char *domain)
>
> static const struct fastrpc_soc_data kaanapali_soc_data = {
> .sid_pos = 56,
> + .dma_addr_bits_extended = 34,
> + .dma_addr_bits_default = 32,
> };
>
> static const struct fastrpc_soc_data default_soc_data = {
> .sid_pos = 32,
> + .dma_addr_bits_extended = 32,
> + .dma_addr_bits_default = 32,
> };
>
> static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev)
> --
> 2.34.1
>
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v5 4/4] misc: fastrpc: Update dma_bits for CDSP support on Kaanapali SoC
2025-12-06 2:31 ` Dmitry Baryshkov
@ 2025-12-08 7:04 ` Kumari Pallavi
2025-12-09 22:55 ` Dmitry Baryshkov
0 siblings, 1 reply; 16+ messages in thread
From: Kumari Pallavi @ 2025-12-08 7:04 UTC (permalink / raw)
To: Dmitry Baryshkov
Cc: kpallavi, srini, amahesh, arnd, gregkh, robh, krzk+dt, conor+dt,
quic_bkumar, ekansh.gupta, linux-kernel, quic_chennak, dri-devel,
linux-arm-msm, devicetree, jingyi.wang, aiqun.yu, ktadakam
On 12/6/2025 8:01 AM, Dmitry Baryshkov wrote:
> On Tue, Dec 02, 2025 at 11:36:28AM +0530, Kumari Pallavi wrote:
>> DSP currently supports 32-bit IOVA (32-bit PA + 4-bit SID) for
>> both Q6 and user DMA (uDMA) access. This is being upgraded to
>> 34-bit PA + 4-bit SID due to a hardware revision in CDSP for
>> Kaanapali SoC, which expands the DMA addressable range.
>> Update DMA bits configuration in the driver to support CDSP on
>> Kaanapali SoC. Set the default `dma_bits` to 32-bit and update
>> it to 34-bit based on CDSP and OF matching on the fastrpc node.
>>
>> Signed-off-by: Kumari Pallavi <kumari.pallavi@oss.qualcomm.com>
>> ---
>> drivers/misc/fastrpc.c | 15 +++++++++++++--
>> 1 file changed, 13 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c
>> index 6a67daafeaa1..c5d2c426fcbc 100644
>> --- a/drivers/misc/fastrpc.c
>> +++ b/drivers/misc/fastrpc.c
>> @@ -269,6 +269,8 @@ struct fastrpc_session_ctx {
>>
>> struct fastrpc_soc_data {
>> u32 sid_pos;
>> + u32 dma_addr_bits_extended;
>
> s/extended/cdsp/
>
Thanks for your feedback.
Here, i have used extended instead of the cdsp as to replace the
domain-based naming with functional naming. Currently, CDSP supports an
extended DMA address width of 34 bits due to specific use cases, but
this could change in the future for other DSPs as well.
Using names like "dma_addr_bits_extended" and "dma_addr_bits_default"
would keep the design flexible and independent of domain.
Reference of the earlier conversation regarding the change of the name
s/cdsp/extended
https://lore.kernel.org/all/e0d039e8-8f65-4e2e-9b73-74036dc0bb8d@oss.qualcomm.com/
Thanks,
Pallavi
>> + u32 dma_addr_bits_default;
>> };
>>
>> struct fastrpc_channel_ctx {
>> @@ -2189,6 +2191,7 @@ static int fastrpc_cb_probe(struct platform_device *pdev)
>> int i, sessions = 0;
>> unsigned long flags;
>> int rc;
>> + u32 dma_bits;
>>
>> cctx = dev_get_drvdata(dev->parent);
>> if (!cctx)
>> @@ -2202,12 +2205,16 @@ static int fastrpc_cb_probe(struct platform_device *pdev)
>> spin_unlock_irqrestore(&cctx->lock, flags);
>> return -ENOSPC;
>> }
>> + dma_bits = cctx->soc_data->dma_addr_bits_default;
>> sess = &cctx->session[cctx->sesscount++];
>> sess->used = false;
>> sess->valid = true;
>> sess->dev = dev;
>> dev_set_drvdata(dev, sess);
>>
>> + if (cctx->domain_id == CDSP_DOMAIN_ID)
>> + dma_bits = cctx->soc_data->dma_addr_bits_extended;
>> +
>> if (of_property_read_u32(dev->of_node, "reg", &sess->sid))
>> dev_info(dev, "FastRPC Session ID not specified in DT\n");
>>
>> @@ -2222,9 +2229,9 @@ static int fastrpc_cb_probe(struct platform_device *pdev)
>> }
>> }
>> spin_unlock_irqrestore(&cctx->lock, flags);
>> - rc = dma_set_mask(dev, DMA_BIT_MASK(32));
>> + rc = dma_set_mask(dev, DMA_BIT_MASK(dma_bits));
>> if (rc) {
>> - dev_err(dev, "32-bit DMA enable failed\n");
>> + dev_err(dev, "%u-bit DMA enable failed\n", dma_bits);
>> return rc;
>> }
>>
>> @@ -2311,10 +2318,14 @@ static int fastrpc_get_domain_id(const char *domain)
>>
>> static const struct fastrpc_soc_data kaanapali_soc_data = {
>> .sid_pos = 56,
>> + .dma_addr_bits_extended = 34,
>> + .dma_addr_bits_default = 32,
>> };
>>
>> static const struct fastrpc_soc_data default_soc_data = {
>> .sid_pos = 32,
>> + .dma_addr_bits_extended = 32,
>> + .dma_addr_bits_default = 32,
>> };
>>
>> static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev)
>> --
>> 2.34.1
>>
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v5 2/4] misc: fastrpc: Rename phys to dma_addr for clarity
2025-12-06 2:26 ` Dmitry Baryshkov
@ 2025-12-08 7:08 ` Kumari Pallavi
0 siblings, 0 replies; 16+ messages in thread
From: Kumari Pallavi @ 2025-12-08 7:08 UTC (permalink / raw)
To: Dmitry Baryshkov
Cc: kpallavi, srini, amahesh, arnd, gregkh, robh, krzk+dt, conor+dt,
quic_bkumar, ekansh.gupta, linux-kernel, quic_chennak, dri-devel,
linux-arm-msm, devicetree, jingyi.wang, aiqun.yu, ktadakam
On 12/6/2025 7:56 AM, Dmitry Baryshkov wrote:
> On Tue, Dec 02, 2025 at 11:36:26AM +0530, Kumari Pallavi wrote:
>> Update all references of buf->phys and map->phys to buf->dma_addr and
>> map->dma_addr to accurately represent that these fields store DMA
>> addresses, not physical addresses. This change improves code clarity
>> and aligns with kernel conventions for dma_addr_t usage.
>
> Please _start_ by describing the problem or the issue the patch is
> trying to solve.
>
ACK
Thanks,
Pallavi
>>
>> Signed-off-by: Kumari Pallavi <kumari.pallavi@oss.qualcomm.com>
>> ---
>> drivers/misc/fastrpc.c | 77 ++++++++++++++++++++++--------------------
>> 1 file changed, 41 insertions(+), 36 deletions(-)
>>
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v5 3/4] misc: fastrpc: Add support for new DSP IOVA formatting
2025-12-06 2:30 ` Dmitry Baryshkov
@ 2025-12-08 7:26 ` Kumari Pallavi
2025-12-09 22:52 ` Dmitry Baryshkov
0 siblings, 1 reply; 16+ messages in thread
From: Kumari Pallavi @ 2025-12-08 7:26 UTC (permalink / raw)
To: Dmitry Baryshkov
Cc: kpallavi, srini, amahesh, arnd, gregkh, robh, krzk+dt, conor+dt,
quic_bkumar, ekansh.gupta, linux-kernel, quic_chennak, dri-devel,
linux-arm-msm, devicetree, jingyi.wang, aiqun.yu, ktadakam
On 12/6/2025 8:00 AM, Dmitry Baryshkov wrote:
> On Tue, Dec 02, 2025 at 11:36:27AM +0530, Kumari Pallavi wrote:
>> Implement the new IOVA formatting required by the DSP architecture change
>> on Kaanapali SoC. Place the SID for DSP DMA transactions at bit 56 in the
>> physical address. This placement is necessary for the DSPs to correctly
>> identify streams and operate as intended.
>> To address this, set SID position to bit 56 via OF matching on the fastrpc
>> node; otherwise, default to legacy 32-bit placement.
>> This change ensures consistent SID placement across DSPs.
>>
>> Signed-off-by: Kumari Pallavi <kumari.pallavi@oss.qualcomm.com>
>> ---
>> drivers/misc/fastrpc.c | 48 ++++++++++++++++++++++++++++++++++++------
>> 1 file changed, 41 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c
>> index eb9501fe79bc..6a67daafeaa1 100644
>> --- a/drivers/misc/fastrpc.c
>> +++ b/drivers/misc/fastrpc.c
>> @@ -33,7 +33,6 @@
>> #define FASTRPC_ALIGN 128
>> #define FASTRPC_MAX_FDLIST 16
>> #define FASTRPC_MAX_CRCLIST 64
>> -#define FASTRPC_PHYS(p) ((p) & 0xffffffff)
>> #define FASTRPC_CTX_MAX (256)
>> #define FASTRPC_INIT_HANDLE 1
>> #define FASTRPC_DSP_UTILITIES_HANDLE 2
>> @@ -105,6 +104,17 @@
>>
>> #define miscdev_to_fdevice(d) container_of(d, struct fastrpc_device, miscdev)
>>
>> +/* Extract smmu pa from consolidated iova */
>
> Nit: SMMU, PA, IOVA
>
ACK
>> +#define IPA_TO_DMA_ADDR(iova, sid_pos) (iova & ((1ULL << sid_pos) - 1ULL))
>
> GENMASK?
>
Thanks for the suggestion. I’ve updated the macro to use GENMASK_ULL
instead of the hand‑rolled (1ULL << sid_pos) - 1ULL.
The new version looks like this:
#define IPA_TO_DMA_ADDR(iova, sid_pos) \
((sid_pos) ? ((iova) & GENMASK_ULL((sid_pos) - 1, 0)) : 0)
>> +/*
>> + * Prepare the consolidated iova to send to dsp by prepending the sid
>
> Nit: DSP, SID, PA
>
ACK
>> + * to smmu pa at the appropriate position
>> + */
>> +static inline u64 fastrpc_compute_sid_offset(u64 sid, u32 sid_pos)
>> +{
>> + return sid << sid_pos;
>> +}
>> +
>> struct fastrpc_phy_page {
>> dma_addr_t addr; /* dma address */
>> u64 size; /* size of contiguous region */
>> @@ -257,6 +267,10 @@ struct fastrpc_session_ctx {
>> bool valid;
>> };
>>
>> +struct fastrpc_soc_data {
>> + u32 sid_pos;
>> +};
>> +
>> struct fastrpc_channel_ctx {
>> int domain_id;
>> int sesscount;
>> @@ -278,6 +292,7 @@ struct fastrpc_channel_ctx {
>> bool secure;
>> bool unsigned_support;
>> u64 dma_mask;
>> + const struct fastrpc_soc_data *soc_data;
>> };
>>
>> struct fastrpc_device {
>> @@ -390,7 +405,7 @@ static int fastrpc_map_lookup(struct fastrpc_user *fl, int fd,
>> static void fastrpc_buf_free(struct fastrpc_buf *buf)
>> {
>> dma_free_coherent(buf->dev, buf->size, buf->virt,
>> - FASTRPC_PHYS(buf->dma_addr));
>> + IPA_TO_DMA_ADDR(buf->dma_addr, buf->fl->cctx->soc_data->sid_pos));
>> kfree(buf);
>> }
>>
>> @@ -440,7 +455,8 @@ static int fastrpc_buf_alloc(struct fastrpc_user *fl, struct device *dev,
>> buf = *obuf;
>>
>> if (fl->sctx && fl->sctx->sid)
>> - buf->dma_addr += ((u64)fl->sctx->sid << 32);
>> + buf->dma_addr += fastrpc_compute_sid_offset((u64)fl->sctx->sid,
>
> Drop type conversion
>
ACK
>> + fl->cctx->soc_data->sid_pos);
>>
>> return 0;
>> }
>> @@ -685,7 +701,8 @@ static int fastrpc_dma_buf_attach(struct dma_buf *dmabuf,
>> return -ENOMEM;
>>
>> ret = dma_get_sgtable(buffer->dev, &a->sgt, buffer->virt,
>> - FASTRPC_PHYS(buffer->dma_addr), buffer->size);
>> + IPA_TO_DMA_ADDR(buffer->dma_addr,
>> + buffer->fl->cctx->soc_data->sid_pos), buffer->size);
>> if (ret < 0) {
>> dev_err(buffer->dev, "failed to get scatterlist from DMA API\n");
>> kfree(a);
>> @@ -734,7 +751,8 @@ static int fastrpc_mmap(struct dma_buf *dmabuf,
>> dma_resv_assert_held(dmabuf->resv);
>>
>> return dma_mmap_coherent(buf->dev, vma, buf->virt,
>> - FASTRPC_PHYS(buf->dma_addr), size);
>> + IPA_TO_DMA_ADDR(buf->dma_addr,
>> + buf->fl->cctx->soc_data->sid_pos), size);
>> }
>>
>> static const struct dma_buf_ops fastrpc_dma_buf_ops = {
>> @@ -789,7 +807,8 @@ static int fastrpc_map_attach(struct fastrpc_user *fl, int fd,
>> map->dma_addr = sg_phys(map->table->sgl);
>> } else {
>> map->dma_addr = sg_dma_address(map->table->sgl);
>> - map->dma_addr += ((u64)fl->sctx->sid << 32);
>> + map->dma_addr += fastrpc_compute_sid_offset((u64)fl->sctx->sid,
>
> Drop type conversion. Hmm. Looking at it, would it be better:
>
> map->dma_addr = fastrpc_compute_dma_addr(fl->sctx, sg_dma_address(map->table->sgl))
>
Thanks for the suggestion. To confirm: you’re proposing that the call
site use a single helper returning the final DMA address, i.e.
map->dma_addr = fastrpc_compute_dma_addr(fl,
sg_dma_address(map->table->sgl));
I can implement fastrpc_compute_dma_addr() as a thin wrapper that
internally calls our existing fastrpc_compute_sid_offset() and composes
the consolidated IOVA (SID in upper bits, base DMA/PA in lower bits)
?
>> + fl->cctx->soc_data->sid_pos);
>> }
>> for_each_sg(map->table->sgl, sgl, map->table->nents,
>> sgl_index)
>> @@ -2290,6 +2309,14 @@ static int fastrpc_get_domain_id(const char *domain)
>> return -EINVAL;
>> }
>>
>> +static const struct fastrpc_soc_data kaanapali_soc_data = {
>> + .sid_pos = 56,
>> +};
>> +
>> +static const struct fastrpc_soc_data default_soc_data = {
>> + .sid_pos = 32,
>> +};
>> +
>> static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev)
>> {
>> struct device *rdev = &rpdev->dev;
>> @@ -2298,6 +2325,11 @@ static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev)
>> const char *domain;
>> bool secure_dsp;
>> unsigned int vmids[FASTRPC_MAX_VMIDS];
>> + const struct fastrpc_soc_data *soc_data;
>> +
>> + soc_data = device_get_match_data(rdev);
>> + if (!soc_data)
>> + soc_data = &default_soc_data;
>
> Define it for all the entries, drop if-check.
>
ACK
>>
>> err = of_property_read_string(rdev->of_node, "label", &domain);
>> if (err) {
>> @@ -2350,6 +2382,7 @@ static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev)
>>
>> secure_dsp = !(of_property_read_bool(rdev->of_node, "qcom,non-secure-domain"));
>> data->secure = secure_dsp;
>> + data->soc_data = soc_data;
>>
>> switch (domain_id) {
>> case ADSP_DOMAIN_ID:
>> @@ -2487,7 +2520,8 @@ static int fastrpc_rpmsg_callback(struct rpmsg_device *rpdev, void *data,
>> }
>>
>> static const struct of_device_id fastrpc_rpmsg_of_match[] = {
>> - { .compatible = "qcom,fastrpc" },
>> + { .compatible = "qcom,kaanapali-fastrpc", .data = &kaanapali_soc_data },
>> + { .compatible = "qcom,fastrpc", .data = &default_soc_data },
>> { },
>> };
>> MODULE_DEVICE_TABLE(of, fastrpc_rpmsg_of_match);
>> --
>> 2.34.1
>>
>
Thanks,
Pallavi
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v5 3/4] misc: fastrpc: Add support for new DSP IOVA formatting
2025-12-08 7:26 ` Kumari Pallavi
@ 2025-12-09 22:52 ` Dmitry Baryshkov
0 siblings, 0 replies; 16+ messages in thread
From: Dmitry Baryshkov @ 2025-12-09 22:52 UTC (permalink / raw)
To: Kumari Pallavi
Cc: kpallavi, srini, amahesh, arnd, gregkh, robh, krzk+dt, conor+dt,
quic_bkumar, ekansh.gupta, linux-kernel, quic_chennak, dri-devel,
linux-arm-msm, devicetree, jingyi.wang, aiqun.yu, ktadakam
On Mon, Dec 08, 2025 at 12:56:18PM +0530, Kumari Pallavi wrote:
>
>
> On 12/6/2025 8:00 AM, Dmitry Baryshkov wrote:
> > On Tue, Dec 02, 2025 at 11:36:27AM +0530, Kumari Pallavi wrote:
> > > Implement the new IOVA formatting required by the DSP architecture change
> > > on Kaanapali SoC. Place the SID for DSP DMA transactions at bit 56 in the
> > > physical address. This placement is necessary for the DSPs to correctly
> > > identify streams and operate as intended.
> > > To address this, set SID position to bit 56 via OF matching on the fastrpc
> > > node; otherwise, default to legacy 32-bit placement.
> > > This change ensures consistent SID placement across DSPs.
> > >
> > > Signed-off-by: Kumari Pallavi <kumari.pallavi@oss.qualcomm.com>
> > > ---
> > > drivers/misc/fastrpc.c | 48 ++++++++++++++++++++++++++++++++++++------
> > > 1 file changed, 41 insertions(+), 7 deletions(-)
> > >
> > > @@ -789,7 +807,8 @@ static int fastrpc_map_attach(struct fastrpc_user *fl, int fd,
> > > map->dma_addr = sg_phys(map->table->sgl);
> > > } else {
> > > map->dma_addr = sg_dma_address(map->table->sgl);
> > > - map->dma_addr += ((u64)fl->sctx->sid << 32);
> > > + map->dma_addr += fastrpc_compute_sid_offset((u64)fl->sctx->sid,
> >
> > Drop type conversion. Hmm. Looking at it, would it be better:
> >
> > map->dma_addr = fastrpc_compute_dma_addr(fl->sctx, sg_dma_address(map->table->sgl))
> >
>
> Thanks for the suggestion. To confirm: you’re proposing that the call site
> use a single helper returning the final DMA address, i.e.
>
> map->dma_addr = fastrpc_compute_dma_addr(fl,
> sg_dma_address(map->table->sgl));
> I can implement fastrpc_compute_dma_addr() as a thin wrapper that internally
> calls our existing fastrpc_compute_sid_offset() and composes the
> consolidated IOVA (SID in upper bits, base DMA/PA in lower bits)
> ?
Yes
>
>
> > > + fl->cctx->soc_data->sid_pos);
> > > }
> > > for_each_sg(map->table->sgl, sgl, map->table->nents,
> > > sgl_index)
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v5 4/4] misc: fastrpc: Update dma_bits for CDSP support on Kaanapali SoC
2025-12-08 7:04 ` Kumari Pallavi
@ 2025-12-09 22:55 ` Dmitry Baryshkov
0 siblings, 0 replies; 16+ messages in thread
From: Dmitry Baryshkov @ 2025-12-09 22:55 UTC (permalink / raw)
To: Kumari Pallavi
Cc: kpallavi, srini, amahesh, arnd, gregkh, robh, krzk+dt, conor+dt,
quic_bkumar, ekansh.gupta, linux-kernel, quic_chennak, dri-devel,
linux-arm-msm, devicetree, jingyi.wang, aiqun.yu, ktadakam
On Mon, Dec 08, 2025 at 12:34:47PM +0530, Kumari Pallavi wrote:
>
>
> On 12/6/2025 8:01 AM, Dmitry Baryshkov wrote:
> > On Tue, Dec 02, 2025 at 11:36:28AM +0530, Kumari Pallavi wrote:
> > > DSP currently supports 32-bit IOVA (32-bit PA + 4-bit SID) for
> > > both Q6 and user DMA (uDMA) access. This is being upgraded to
> > > 34-bit PA + 4-bit SID due to a hardware revision in CDSP for
> > > Kaanapali SoC, which expands the DMA addressable range.
> > > Update DMA bits configuration in the driver to support CDSP on
> > > Kaanapali SoC. Set the default `dma_bits` to 32-bit and update
> > > it to 34-bit based on CDSP and OF matching on the fastrpc node.
> > >
> > > Signed-off-by: Kumari Pallavi <kumari.pallavi@oss.qualcomm.com>
> > > ---
> > > drivers/misc/fastrpc.c | 15 +++++++++++++--
> > > 1 file changed, 13 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c
> > > index 6a67daafeaa1..c5d2c426fcbc 100644
> > > --- a/drivers/misc/fastrpc.c
> > > +++ b/drivers/misc/fastrpc.c
> > > @@ -269,6 +269,8 @@ struct fastrpc_session_ctx {
> > > struct fastrpc_soc_data {
> > > u32 sid_pos;
> > > + u32 dma_addr_bits_extended;
> >
> > s/extended/cdsp/
> >
>
> Thanks for your feedback.
> Here, i have used extended instead of the cdsp as to replace the
> domain-based naming with functional naming. Currently, CDSP supports an
> extended DMA address width of 34 bits due to specific use cases, but this
> could change in the future for other DSPs as well.
> Using names like "dma_addr_bits_extended" and "dma_addr_bits_default"
> would keep the design flexible and independent of domain.
And then at some point GPDSP will get yet another address width. How
would you name it?
>
> Reference of the earlier conversation regarding the change of the name
> s/cdsp/extended
>
> https://lore.kernel.org/all/e0d039e8-8f65-4e2e-9b73-74036dc0bb8d@oss.qualcomm.com/
>
> Thanks,
> Pallavi
>
> > > + u32 dma_addr_bits_default;
> > > };
> > > struct fastrpc_channel_ctx {
> > > @@ -2189,6 +2191,7 @@ static int fastrpc_cb_probe(struct platform_device *pdev)
> > > int i, sessions = 0;
> > > unsigned long flags;
> > > int rc;
> > > + u32 dma_bits;
> > > cctx = dev_get_drvdata(dev->parent);
> > > if (!cctx)
> > > @@ -2202,12 +2205,16 @@ static int fastrpc_cb_probe(struct platform_device *pdev)
> > > spin_unlock_irqrestore(&cctx->lock, flags);
> > > return -ENOSPC;
> > > }
> > > + dma_bits = cctx->soc_data->dma_addr_bits_default;
> > > sess = &cctx->session[cctx->sesscount++];
> > > sess->used = false;
> > > sess->valid = true;
> > > sess->dev = dev;
> > > dev_set_drvdata(dev, sess);
> > > + if (cctx->domain_id == CDSP_DOMAIN_ID)
> > > + dma_bits = cctx->soc_data->dma_addr_bits_extended;
> > > +
> > > if (of_property_read_u32(dev->of_node, "reg", &sess->sid))
> > > dev_info(dev, "FastRPC Session ID not specified in DT\n");
> > > @@ -2222,9 +2229,9 @@ static int fastrpc_cb_probe(struct platform_device *pdev)
> > > }
> > > }
> > > spin_unlock_irqrestore(&cctx->lock, flags);
> > > - rc = dma_set_mask(dev, DMA_BIT_MASK(32));
> > > + rc = dma_set_mask(dev, DMA_BIT_MASK(dma_bits));
> > > if (rc) {
> > > - dev_err(dev, "32-bit DMA enable failed\n");
> > > + dev_err(dev, "%u-bit DMA enable failed\n", dma_bits);
> > > return rc;
> > > }
> > > @@ -2311,10 +2318,14 @@ static int fastrpc_get_domain_id(const char *domain)
> > > static const struct fastrpc_soc_data kaanapali_soc_data = {
> > > .sid_pos = 56,
> > > + .dma_addr_bits_extended = 34,
> > > + .dma_addr_bits_default = 32,
> > > };
> > > static const struct fastrpc_soc_data default_soc_data = {
> > > .sid_pos = 32,
> > > + .dma_addr_bits_extended = 32,
> > > + .dma_addr_bits_default = 32,
> > > };
> > > static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev)
> > > --
> > > 2.34.1
> > >
> >
>
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2025-12-09 22:55 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-02 6:06 [PATCH v5 0/4] Add ADSP and CDSP support on Kaanapali SoC Kumari Pallavi
2025-12-02 6:06 ` [PATCH v5 1/4] dt-bindings: misc: qcom,fastrpc: Add compatible for Kaanapali Kumari Pallavi
2025-12-02 8:17 ` Krzysztof Kozlowski
2025-12-02 10:01 ` Kumari Pallavi
2025-12-05 8:33 ` Krzysztof Kozlowski
2025-12-02 6:06 ` [PATCH v5 2/4] misc: fastrpc: Rename phys to dma_addr for clarity Kumari Pallavi
2025-12-06 2:26 ` Dmitry Baryshkov
2025-12-08 7:08 ` Kumari Pallavi
2025-12-02 6:06 ` [PATCH v5 3/4] misc: fastrpc: Add support for new DSP IOVA formatting Kumari Pallavi
2025-12-06 2:30 ` Dmitry Baryshkov
2025-12-08 7:26 ` Kumari Pallavi
2025-12-09 22:52 ` Dmitry Baryshkov
2025-12-02 6:06 ` [PATCH v5 4/4] misc: fastrpc: Update dma_bits for CDSP support on Kaanapali SoC Kumari Pallavi
2025-12-06 2:31 ` Dmitry Baryshkov
2025-12-08 7:04 ` Kumari Pallavi
2025-12-09 22:55 ` Dmitry Baryshkov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).