[PATCH V1 02/20] accel/amdxdna: Remove mmap for doorbell

From: David Zhang

Date: Tue Sep 29 2026 - 23:33:48 EST


Make kernel submission the default, so mapping the doorbell back to user
space is not needed:
- Remove .mmap handler and use standard drm_gem_mmap.
- Set hwctx->doorbell_offset to AMDXDNA_INVALID_DOORBELL_OFFSET on
context creation so userspace does not receive a valid-looking BAR
offset.

Signed-off-by: David Zhang <yidong.zhang@xxxxxxx>
---
drivers/accel/amdxdna/aie4_ctx.c | 20 +--------------
drivers/accel/amdxdna/aie4_pci.c | 33 -------------------------
drivers/accel/amdxdna/aie4_pci.h | 1 -
drivers/accel/amdxdna/amdxdna_pci_drv.c | 17 +------------
drivers/accel/amdxdna/amdxdna_pci_drv.h | 1 -
5 files changed, 2 insertions(+), 70 deletions(-)

diff --git a/drivers/accel/amdxdna/aie4_ctx.c b/drivers/accel/amdxdna/aie4_ctx.c
index 8408b0d2696f..8157f2a6fd10 100644
--- a/drivers/accel/amdxdna/aie4_ctx.c
+++ b/drivers/accel/amdxdna/aie4_ctx.c
@@ -158,7 +158,7 @@ static int aie4_hwctx_create(struct amdxdna_hwctx *hwctx)
}

priv->hw_ctx_id = resp.hw_context_id;
- hwctx->doorbell_offset = resp.doorbell_offset;
+ hwctx->doorbell_offset = AMDXDNA_INVALID_DOORBELL_OFFSET;

return 0;
}
@@ -313,21 +313,3 @@ int aie4_cmd_wait(struct amdxdna_hwctx *hwctx, u64 seq, u32 timeout)

return ret <= 0 ? ret : 0;
}
-
-int aie4_hwctx_valid_doorbell(struct amdxdna_client *client, u32 vm_pgoff)
-{
- struct amdxdna_hwctx *hwctx;
- unsigned long hwctx_id;
- int idx;
-
- idx = srcu_read_lock(&client->hwctx_srcu);
- amdxdna_for_each_hwctx(client, hwctx_id, hwctx) {
- if (vm_pgoff == (hwctx->doorbell_offset >> PAGE_SHIFT)) {
- srcu_read_unlock(&client->hwctx_srcu, idx);
- return 1;
- }
- }
- srcu_read_unlock(&client->hwctx_srcu, idx);
-
- return 0;
-}
diff --git a/drivers/accel/amdxdna/aie4_pci.c b/drivers/accel/amdxdna/aie4_pci.c
index a58a83af42a4..db02d25e3f4a 100644
--- a/drivers/accel/amdxdna/aie4_pci.c
+++ b/drivers/accel/amdxdna/aie4_pci.c
@@ -518,38 +518,6 @@ static int aie4m_pcidev_init(struct amdxdna_dev *xdna)
return 0;
}

-static int aie4_doorbell_mmap(struct amdxdna_client *client, struct vm_area_struct *vma)
-{
- struct amdxdna_dev *xdna = client->xdna;
- struct pci_dev *pdev = to_pci_dev(xdna->ddev.dev);
- const struct amdxdna_dev_priv *npriv = xdna->dev_info->dev_priv;
- phys_addr_t res_start;
- unsigned long pfn;
- int ret;
-
- if (!aie4_hwctx_valid_doorbell(client, vma->vm_pgoff)) {
- XDNA_ERR(xdna, "Invalid doorbell page offset 0x%lx", vma->vm_pgoff);
- return -EINVAL;
- }
-
- if (vma_pages(vma) != 1) {
- XDNA_ERR(xdna, "can only map one page, got %ld", vma_pages(vma));
- return -EINVAL;
- }
-
- res_start = pci_resource_start(pdev, xdna->dev_info->doorbell_bar) + npriv->doorbell_off;
- pfn = PHYS_PFN(res_start) + vma->vm_pgoff;
- vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
- vm_flags_set(vma, VM_IO | VM_DONTEXPAND | VM_DONTDUMP);
- ret = io_remap_pfn_range(vma, vma->vm_start,
- pfn,
- PAGE_SIZE,
- vma->vm_page_prot);
-
- XDNA_DBG(xdna, "doorbell ret %d", ret);
- return ret;
-}
-
static int aie4_get_info(struct amdxdna_client *client, struct amdxdna_drm_get_info *args)
{
struct amdxdna_dev *xdna = client->xdna;
@@ -661,7 +629,6 @@ const struct amdxdna_dev_ops aie4_vf_ops = {
.fini = aie4_vf_fini,
.hwctx_init = aie4_hwctx_init,
.hwctx_fini = aie4_hwctx_fini,
- .mmap = aie4_doorbell_mmap,
.cmd_wait = aie4_cmd_wait,
.get_aie_info = aie4_get_info,
};
diff --git a/drivers/accel/amdxdna/aie4_pci.h b/drivers/accel/amdxdna/aie4_pci.h
index 3fd5eace3ed7..c6219544dc0f 100644
--- a/drivers/accel/amdxdna/aie4_pci.h
+++ b/drivers/accel/amdxdna/aie4_pci.h
@@ -69,7 +69,6 @@ int aie4_attach_work_buffer(struct amdxdna_dev_hdl *ndev);
int aie4_hwctx_init(struct amdxdna_hwctx *hwctx);
void aie4_hwctx_fini(struct amdxdna_hwctx *hwctx);
int aie4_cmd_wait(struct amdxdna_hwctx *hwctx, u64 seq, u32 timeout);
-int aie4_hwctx_valid_doorbell(struct amdxdna_client *client, u32 vm_pgoff);

/* aie4_sriov.c */
#if IS_ENABLED(CONFIG_PCI_IOV)
diff --git a/drivers/accel/amdxdna/amdxdna_pci_drv.c b/drivers/accel/amdxdna/amdxdna_pci_drv.c
index d9e2e71d3e05..3140af69e29c 100644
--- a/drivers/accel/amdxdna/amdxdna_pci_drv.c
+++ b/drivers/accel/amdxdna/amdxdna_pci_drv.c
@@ -250,21 +250,6 @@ static int amdxdna_drm_set_state_ioctl(struct drm_device *dev, void *data, struc
return ret;
}

-static int amdxdna_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma)
-{
- struct drm_file *drm_filp = filp->private_data;
- struct amdxdna_client *client = drm_filp->driver_priv;
- struct amdxdna_dev *xdna = client->xdna;
-
- if (likely(vma->vm_pgoff >= DRM_FILE_PAGE_OFFSET_START))
- return drm_gem_mmap(filp, vma);
-
- if (!xdna->dev_info->ops->mmap)
- return -EOPNOTSUPP;
-
- return xdna->dev_info->ops->mmap(client, vma);
-}
-
static const struct drm_ioctl_desc amdxdna_drm_ioctls[] = {
/* Context */
DRM_IOCTL_DEF_DRV(AMDXDNA_CREATE_HWCTX, amdxdna_drm_create_hwctx_ioctl, 0),
@@ -323,7 +308,7 @@ static const struct file_operations amdxdna_fops = {
.poll = drm_poll,
.read = drm_read,
.llseek = noop_llseek,
- .mmap = amdxdna_drm_gem_mmap,
+ .mmap = drm_gem_mmap,
.show_fdinfo = drm_show_fdinfo,
.fop_flags = FOP_UNSIGNED_OFFSET,
};
diff --git a/drivers/accel/amdxdna/amdxdna_pci_drv.h b/drivers/accel/amdxdna/amdxdna_pci_drv.h
index a997d27a504d..84c8973e9197 100644
--- a/drivers/accel/amdxdna/amdxdna_pci_drv.h
+++ b/drivers/accel/amdxdna/amdxdna_pci_drv.h
@@ -57,7 +57,6 @@ struct amdxdna_dev_ops {
int (*resume)(struct amdxdna_dev *xdna);
int (*suspend)(struct amdxdna_dev *xdna);
int (*sriov_configure)(struct amdxdna_dev *xdna, int num_vfs);
- int (*mmap)(struct amdxdna_client *client, struct vm_area_struct *vma);
int (*hwctx_init)(struct amdxdna_hwctx *hwctx);
void (*hwctx_fini)(struct amdxdna_hwctx *hwctx);
int (*hwctx_config)(struct amdxdna_hwctx *hwctx, u32 type, u64 value, void *buf, u32 size);
--
2.34.1