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 <[email protected]> --- 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
