diff --git a/drivers/rknpu/include/rknpu_drv.h b/drivers/rknpu/include/rknpu_drv.h index 13280c18a2fd..d13a990d23b2 100644 --- a/drivers/rknpu/include/rknpu_drv.h +++ b/drivers/rknpu/include/rknpu_drv.h @@ -30,10 +30,10 @@ #define DRIVER_NAME "rknpu" #define DRIVER_DESC "RKNPU driver" -#define DRIVER_DATE "20230428" +#define DRIVER_DATE "20230625" #define DRIVER_MAJOR 0 #define DRIVER_MINOR 8 -#define DRIVER_PATCHLEVEL 8 +#define DRIVER_PATCHLEVEL 9 #define LOG_TAG "RKNPU" diff --git a/drivers/rknpu/include/rknpu_gem.h b/drivers/rknpu/include/rknpu_gem.h index 0afc87bba322..aedcab89d241 100644 --- a/drivers/rknpu/include/rknpu_gem.h +++ b/drivers/rknpu/include/rknpu_gem.h @@ -163,6 +163,8 @@ int rknpu_gem_fault(struct vm_fault *vmf); int rknpu_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf); #endif +int rknpu_gem_mmap_obj(struct drm_gem_object *obj, struct vm_area_struct *vma); + /* set vm_flags and we can change the vm attribute to other one at here. */ int rknpu_gem_mmap(struct file *filp, struct vm_area_struct *vma); @@ -176,8 +178,13 @@ struct drm_gem_object * rknpu_gem_prime_import_sg_table(struct drm_device *dev, struct dma_buf_attachment *attach, struct sg_table *sgt); +#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE void *rknpu_gem_prime_vmap(struct drm_gem_object *obj); void rknpu_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr); +#else +int rknpu_gem_prime_vmap(struct drm_gem_object *obj, struct iosys_map *map); +void rknpu_gem_prime_vunmap(struct drm_gem_object *obj, struct iosys_map *map); +#endif int rknpu_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma); diff --git a/drivers/rknpu/include/rknpu_iommu.h b/drivers/rknpu/include/rknpu_iommu.h index 3951764072a7..aa680c997614 100644 --- a/drivers/rknpu/include/rknpu_iommu.h +++ b/drivers/rknpu/include/rknpu_iommu.h @@ -10,8 +10,12 @@ #include #include #include -#include #include +#include + +#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE +#include +#endif #include "rknpu_drv.h" diff --git a/drivers/rknpu/include/rknpu_mm.h b/drivers/rknpu/include/rknpu_mm.h index 52fa044e18e2..73ae6d7cef98 100644 --- a/drivers/rknpu/include/rknpu_mm.h +++ b/drivers/rknpu/include/rknpu_mm.h @@ -10,7 +10,6 @@ #include #include #include -#include #include #include "rknpu_drv.h" diff --git a/drivers/rknpu/rknpu_debugger.c b/drivers/rknpu/rknpu_debugger.c index 146aa7dfc860..8bd7b62cef5b 100644 --- a/drivers/rknpu/rknpu_debugger.c +++ b/drivers/rknpu/rknpu_debugger.c @@ -457,7 +457,11 @@ CREATE_FAIL: #ifdef CONFIG_ROCKCHIP_RKNPU_PROC_FS static int rknpu_procfs_open(struct inode *inode, struct file *file) { +#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE struct rknpu_debugger_node *node = PDE_DATA(inode); +#else + struct rknpu_debugger_node *node = pde_data(inode); +#endif return single_open(file, node->info_ent->show, node); } diff --git a/drivers/rknpu/rknpu_drv.c b/drivers/rknpu/rknpu_drv.c index eb31273bdd5d..584bdc8dbec8 100644 --- a/drivers/rknpu/rknpu_drv.c +++ b/drivers/rknpu/rknpu_drv.c @@ -33,7 +33,6 @@ #include #include #include -#include #include #ifndef FPGA_PLATFORM @@ -489,11 +488,13 @@ const struct file_operations rknpu_fops = { #endif #ifdef CONFIG_ROCKCHIP_RKNPU_DRM_GEM +#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE static const struct vm_operations_struct rknpu_gem_vm_ops = { .fault = rknpu_gem_fault, .open = drm_gem_vm_open, .close = drm_gem_vm_close, }; +#endif static int rknpu_action_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv) @@ -555,27 +556,29 @@ static struct drm_driver rknpu_drm_driver = { #else .driver_features = DRIVER_GEM | DRIVER_PRIME | DRIVER_RENDER, #endif +#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE .gem_free_object_unlocked = rknpu_gem_free_object, .gem_vm_ops = &rknpu_gem_vm_ops, + .dumb_destroy = drm_gem_dumb_destroy, + .gem_prime_export = drm_gem_prime_export, + .gem_prime_get_sg_table = rknpu_gem_prime_get_sg_table, + .gem_prime_vmap = rknpu_gem_prime_vmap, + .gem_prime_vunmap = rknpu_gem_prime_vunmap, +#endif .dumb_create = rknpu_gem_dumb_create, #if KERNEL_VERSION(4, 19, 0) > LINUX_VERSION_CODE .dumb_map_offset = rknpu_gem_dumb_map_offset, #else .dumb_map_offset = drm_gem_dumb_map_offset, #endif - .dumb_destroy = drm_gem_dumb_destroy, .prime_handle_to_fd = drm_gem_prime_handle_to_fd, .prime_fd_to_handle = drm_gem_prime_fd_to_handle, - .gem_prime_export = drm_gem_prime_export, #if KERNEL_VERSION(4, 13, 0) <= LINUX_VERSION_CODE .gem_prime_import = rknpu_gem_prime_import, #else .gem_prime_import = drm_gem_prime_import, #endif - .gem_prime_get_sg_table = rknpu_gem_prime_get_sg_table, .gem_prime_import_sg_table = rknpu_gem_prime_import_sg_table, - .gem_prime_vmap = rknpu_gem_prime_vmap, - .gem_prime_vunmap = rknpu_gem_prime_vunmap, .gem_prime_mmap = rknpu_gem_prime_mmap, .ioctls = rknpu_ioctls, .num_ioctls = ARRAY_SIZE(rknpu_ioctls), @@ -742,7 +745,8 @@ static int rknpu_power_on(struct rknpu_device *rknpu_dev) } #ifndef FPGA_PLATFORM -#if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE +#if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE && \ + KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE rockchip_monitor_volt_adjust_lock(rknpu_dev->mdev_info); #endif #endif @@ -803,7 +807,8 @@ static int rknpu_power_on(struct rknpu_device *rknpu_dev) out: #ifndef FPGA_PLATFORM -#if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE +#if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE && \ + KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE rockchip_monitor_volt_adjust_unlock(rknpu_dev->mdev_info); #endif #endif @@ -819,7 +824,8 @@ static int rknpu_power_off(struct rknpu_device *rknpu_dev) int ret; bool val; -#if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE +#if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE && \ + KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE rockchip_monitor_volt_adjust_lock(rknpu_dev->mdev_info); #endif #endif @@ -843,7 +849,8 @@ static int rknpu_power_off(struct rknpu_device *rknpu_dev) if (ret) { LOG_DEV_ERROR(dev, "iommu still enabled\n"); pm_runtime_get_sync(dev); -#if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE +#if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE && \ + KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE rockchip_monitor_volt_adjust_unlock( rknpu_dev->mdev_info); #endif @@ -862,7 +869,8 @@ static int rknpu_power_off(struct rknpu_device *rknpu_dev) } #ifndef FPGA_PLATFORM -#if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE +#if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE && \ + KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE rockchip_monitor_volt_adjust_unlock(rknpu_dev->mdev_info); #endif #endif @@ -881,6 +889,7 @@ static int rknpu_power_off(struct rknpu_device *rknpu_dev) } #ifndef FPGA_PLATFORM +#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE static struct monitor_dev_profile npu_mdevp = { .type = MONITOR_TYPE_DEV, .low_temp_adjust = rockchip_monitor_dev_low_temp_adjust, @@ -1143,6 +1152,7 @@ static struct devfreq_dev_profile npu_devfreq_profile = { .get_dev_status = npu_devfreq_get_dev_status, .get_cur_freq = npu_devfreq_get_cur_freq, }; +#endif #ifdef CONFIG_PM_DEVFREQ static int devfreq_rknpu_ondemand_func(struct devfreq *df, unsigned long *freq) @@ -1170,6 +1180,7 @@ static struct devfreq_governor devfreq_rknpu_ondemand = { }; #endif +#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE static unsigned long npu_get_static_power(struct devfreq *devfreq, unsigned long voltage) { @@ -1543,6 +1554,7 @@ err_remove_table: return ret; } #endif +#endif static int rknpu_devfreq_remove(struct rknpu_device *rknpu_dev) { @@ -1565,9 +1577,12 @@ static int rknpu_register_irq(struct platform_device *pdev, { const struct rknpu_config *config = rknpu_dev->config; struct device *dev = &pdev->dev; +#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE struct resource *res; +#endif int i, ret, irq; +#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, config->irqs[0].name); if (res) { @@ -1606,6 +1621,25 @@ static int rknpu_register_irq(struct platform_device *pdev, return ret; } } +#else + /* there are irq names in dts */ + for (i = 0; i < config->num_irqs; i++) { + irq = platform_get_irq_byname(pdev, config->irqs[i].name); + if (irq < 0) { + LOG_DEV_ERROR(dev, "no npu %s in dts\n", + config->irqs[i].name); + return irq; + } + + ret = devm_request_irq(dev, irq, config->irqs[i].irq_hdl, + IRQF_SHARED, dev_name(dev), rknpu_dev); + if (ret < 0) { + LOG_DEV_ERROR(dev, "request %s failed: %d\n", + config->irqs[i].name, ret); + return ret; + } + } +#endif return 0; } @@ -1744,7 +1778,8 @@ static int rknpu_probe(struct platform_device *pdev) } #ifndef FPGA_PLATFORM -#if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE +#if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE && \ + KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE if (strstr(__clk_get_name(rknpu_dev->clks[0].clk), "scmi")) rknpu_dev->opp_info.scmi_clk = rknpu_dev->clks[0].clk; #endif @@ -1886,7 +1921,9 @@ static int rknpu_probe(struct platform_device *pdev) goto err_remove_drv; #ifndef FPGA_PLATFORM +#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE rknpu_devfreq_init(rknpu_dev); +#endif #endif // set default power put delay to 3s @@ -1995,7 +2032,8 @@ static int rknpu_remove(struct platform_device *pdev) } #ifndef FPGA_PLATFORM -#if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE +#if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE && \ + KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE static int rknpu_runtime_suspend(struct device *dev) { struct rknpu_device *rknpu_dev = dev_get_drvdata(dev); @@ -2054,7 +2092,8 @@ static struct platform_driver rknpu_driver = { .owner = THIS_MODULE, .name = "RKNPU", #ifndef FPGA_PLATFORM -#if KERNEL_VERSION(5, 5, 0) < LINUX_VERSION_CODE +#if KERNEL_VERSION(5, 5, 0) < LINUX_VERSION_CODE && \ + KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE .pm = &rknpu_pm_ops, #endif #endif @@ -2081,3 +2120,6 @@ MODULE_ALIAS("rockchip-rknpu"); MODULE_LICENSE("GPL v2"); MODULE_VERSION(RKNPU_GET_DRV_VERSION_STRING(DRIVER_MAJOR, DRIVER_MINOR, DRIVER_PATCHLEVEL)); +#if defined(CONFIG_ROCKCHIP_RKNPU_DMA_HEAP) && KERNEL_VERSION(5, 16, 0) < LINUX_VERSION_CODE +MODULE_IMPORT_NS(DMA_BUF); +#endif diff --git a/drivers/rknpu/rknpu_gem.c b/drivers/rknpu/rknpu_gem.c index f97be2b58e9b..3bb84372c5c2 100644 --- a/drivers/rknpu/rknpu_gem.c +++ b/drivers/rknpu/rknpu_gem.c @@ -13,7 +13,6 @@ #include #include #include -#include #include #include #include @@ -253,10 +252,15 @@ static int rknpu_gem_alloc_buf(struct rknpu_gem_object *rknpu_obj) i, &s->dma_address, s->length); } - if (drm_prime_sg_to_page_addr_arrays(sgt, rknpu_obj->pages, NULL, - nr_pages)) { - LOG_DEV_ERROR(drm->dev, "invalid sgtable.\n"); - ret = -EINVAL; +#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE + ret = drm_prime_sg_to_page_addr_arrays(sgt, rknpu_obj->pages, NULL, + nr_pages); +#else + ret = drm_prime_sg_to_page_array(sgt, rknpu_obj->pages, nr_pages); +#endif + + if (ret < 0) { + LOG_DEV_ERROR(drm->dev, "invalid sgtable, ret: %d\n", ret); goto err_free_sg_table; } @@ -335,6 +339,24 @@ static int rknpu_gem_handle_destroy(struct drm_file *file_priv, return drm_gem_handle_delete(file_priv, handle); } +#if KERNEL_VERSION(6, 1, 0) <= LINUX_VERSION_CODE +static const struct vm_operations_struct vm_ops = { + .fault = rknpu_gem_fault, + .open = drm_gem_vm_open, + .close = drm_gem_vm_close, +}; + +static const struct drm_gem_object_funcs rknpu_gem_object_funcs = { + .free = rknpu_gem_free_object, + .export = drm_gem_prime_export, + .get_sg_table = rknpu_gem_prime_get_sg_table, + .vmap = rknpu_gem_prime_vmap, + .vunmap = rknpu_gem_prime_vunmap, + .mmap = rknpu_gem_mmap_obj, + .vm_ops = &vm_ops, +}; +#endif + static struct rknpu_gem_object *rknpu_gem_init(struct drm_device *drm, unsigned long size) { @@ -348,6 +370,9 @@ static struct rknpu_gem_object *rknpu_gem_init(struct drm_device *drm, return ERR_PTR(-ENOMEM); obj = &rknpu_obj->base; +#if KERNEL_VERSION(6, 1, 0) <= LINUX_VERSION_CODE + obj->funcs = &rknpu_gem_object_funcs; +#endif ret = drm_gem_object_init(drm, obj, size); if (ret < 0) { @@ -422,7 +447,7 @@ static int rknpu_gem_alloc_buf_with_cache(struct rknpu_gem_object *rknpu_obj, return -EINVAL; } - cookie = domain->iova_cookie; + cookie = (void *)domain->iova_cookie; iovad = &cookie->iovad; rknpu_obj->iova_size = iova_align(iovad, cache_size + rknpu_obj->size); rknpu_obj->iova_start = rknpu_iommu_dma_alloc_iova( @@ -534,8 +559,8 @@ cache_unmap: iommu_unmap(domain, rknpu_obj->iova_start, cache_size); free_iova: - rknpu_iommu_dma_free_iova(domain->iova_cookie, rknpu_obj->iova_start, - rknpu_obj->iova_size); + rknpu_iommu_dma_free_iova((void *)domain->iova_cookie, + rknpu_obj->iova_start, rknpu_obj->iova_size); return ret; } @@ -566,7 +591,7 @@ static void rknpu_gem_free_buf_with_cache(struct rknpu_gem_object *rknpu_obj, if (rknpu_obj->size > 0) iommu_unmap(domain, rknpu_obj->iova_start + cache_size, rknpu_obj->size); - rknpu_iommu_dma_free_iova(domain->iova_cookie, + rknpu_iommu_dma_free_iova((void *)domain->iova_cookie, rknpu_obj->iova_start, rknpu_obj->iova_size); } @@ -1148,8 +1173,7 @@ out: } #endif -static int rknpu_gem_mmap_obj(struct drm_gem_object *obj, - struct vm_area_struct *vma) +int rknpu_gem_mmap_obj(struct drm_gem_object *obj, struct vm_area_struct *vma) { struct rknpu_gem_object *rknpu_obj = to_rknpu_obj(obj); int ret = -EINVAL; @@ -1246,8 +1270,12 @@ rknpu_gem_prime_import_sg_table(struct drm_device *dev, goto err; } +#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE ret = drm_prime_sg_to_page_addr_arrays(sgt, rknpu_obj->pages, NULL, npages); +#else + ret = drm_prime_sg_to_page_array(sgt, rknpu_obj->pages, npages); +#endif if (ret < 0) goto err_free_large; @@ -1275,6 +1303,7 @@ err: return ERR_PTR(ret); } +#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE void *rknpu_gem_prime_vmap(struct drm_gem_object *obj) { struct rknpu_gem_object *rknpu_obj = to_rknpu_obj(obj); @@ -1290,6 +1319,25 @@ void rknpu_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr) { vunmap(vaddr); } +#else +int rknpu_gem_prime_vmap(struct drm_gem_object *obj, struct iosys_map *map) +{ + struct rknpu_gem_object *rknpu_obj = to_rknpu_obj(obj); + + if (!rknpu_obj->pages) + return -EINVAL; + + map->vaddr = vmap(rknpu_obj->pages, rknpu_obj->num_pages, VM_MAP, + PAGE_KERNEL); + + return 0; +} + +void rknpu_gem_prime_vunmap(struct drm_gem_object *obj, struct iosys_map *map) +{ + vunmap(map->vaddr); +} +#endif int rknpu_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma) { @@ -1306,6 +1354,7 @@ static int rknpu_cache_sync(struct rknpu_gem_object *rknpu_obj, unsigned long *length, unsigned long *offset, enum rknpu_cache_type cache_type) { +#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE struct drm_gem_object *obj = &rknpu_obj->base; struct rknpu_device *rknpu_dev = obj->dev->dev_private; void __iomem *cache_base_io = NULL; @@ -1348,6 +1397,8 @@ static int rknpu_cache_sync(struct rknpu_gem_object *rknpu_obj, *length -= cache_length; *offset = 0; } +#endif + return 0; } diff --git a/drivers/rknpu/rknpu_iommu.c b/drivers/rknpu/rknpu_iommu.c index 39cc8f8be7c2..01620d9c3056 100644 --- a/drivers/rknpu/rknpu_iommu.c +++ b/drivers/rknpu/rknpu_iommu.c @@ -18,6 +18,8 @@ dma_addr_t rknpu_iommu_dma_alloc_iova(struct iommu_domain *domain, size_t size, shift = iova_shift(iovad); iova_len = size >> shift; + +#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE /* * Freeing non-power-of-two-sized allocations back into the IOVA caches * will come back to bite us badly, so we have to waste a bit of space @@ -26,6 +28,7 @@ dma_addr_t rknpu_iommu_dma_alloc_iova(struct iommu_domain *domain, size_t size, */ if (iova_len < (1 << (IOVA_RANGE_CACHE_MAX_SIZE - 1))) iova_len = roundup_pow_of_two(iova_len); +#endif #if (KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE) dma_limit = min_not_zero(dma_limit, dev->bus_dma_limit);