From 76d0205dc79b83c450a600816adc9d03bbc35733 Mon Sep 17 00:00:00 2001 From: Sandy Huang Date: Sun, 25 Jun 2023 16:52:55 +0800 Subject: [PATCH 1/7] drm/rockchip: drv: logo: fix modpost memblock_phys_free error for GKI ERROR: modpost: "memblock_phys_free" [drivers/gpu/drm/rockchip/rockchipdrm.ko] undefined! Signed-off-by: Sandy Huang Change-Id: Ie77299e0a370b21b2307519ba0755dd2e7db2e04 --- drivers/gpu/drm/rockchip/rockchip_drm_logo.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_logo.c b/drivers/gpu/drm/rockchip/rockchip_drm_logo.c index 2563d62caaa3..4278a7bd9f23 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_logo.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_logo.c @@ -204,7 +204,7 @@ void rockchip_free_loader_memory(struct drm_device *drm) rockchip_drm_release_reserve_vm(drm, &logo->logo_reserved_node); } - memblock_phys_free(logo->start, logo->size); + memblock_free(logo->kvaddr, logo->size); rockchip_drm_free_reserved_area(logo->start, logo->start + logo->size, -1, "drm_logo"); kfree(logo); From 04824b83eee994a4187bf1d178f506cb3876b69f Mon Sep 17 00:00:00 2001 From: Yu Qiaowei Date: Sun, 25 Jun 2023 02:29:04 +0000 Subject: [PATCH 2/7] video: rockchip: rga2: adapt to kernel-6.1 Signed-off-by: Yu Qiaowei Change-Id: I08d3b7a852b450f91327d65110f818b6cdf9545d --- drivers/video/rockchip/rga2/rga2_debugger.c | 13 ++++++------- drivers/video/rockchip/rga2/rga2_mmu_info.c | 12 ++++++++++++ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/drivers/video/rockchip/rga2/rga2_debugger.c b/drivers/video/rockchip/rga2/rga2_debugger.c index 828a6befad12..66ba484df9a9 100644 --- a/drivers/video/rockchip/rga2/rga2_debugger.c +++ b/drivers/video/rockchip/rga2/rga2_debugger.c @@ -278,13 +278,12 @@ static int rga_procfs_open(struct inode *inode, struct file *file) return single_open(file, node->info_ent->show, node); } -static const struct file_operations rga_procfs_fops = { - .owner = THIS_MODULE, - .open = rga_procfs_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, - .write = rga_debugger_write, +static const struct proc_ops rga_procfs_fops = { + .proc_open = rga_procfs_open, + .proc_read = seq_read, + .proc_lseek = seq_lseek, + .proc_release = single_release, + .proc_write = rga_debugger_write, }; static int rga_procfs_remove_files(struct rga_debugger *debugger) diff --git a/drivers/video/rockchip/rga2/rga2_mmu_info.c b/drivers/video/rockchip/rga2/rga2_mmu_info.c index 2b05c9356c3a..a01ba08e6ff8 100644 --- a/drivers/video/rockchip/rga2/rga2_mmu_info.c +++ b/drivers/video/rockchip/rga2/rga2_mmu_info.c @@ -265,12 +265,20 @@ static int rga2_dma_memory_check(struct rga_dma_buffer_t *buffer, { int ret = 0; void *vaddr; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) + struct iosys_map map; +#endif struct dma_buf *dma_buffer; dma_buffer = buffer->dma_buf; if (!IS_ERR_OR_NULL(dma_buffer)) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) + ret = dma_buf_vmap(dma_buffer, &map); + vaddr = ret ? NULL : map.vaddr; +#else vaddr = dma_buf_vmap(dma_buffer); +#endif if (vaddr) { ret = rga2_virtual_memory_check(vaddr, img->vir_w, img->vir_h, img->format, img->yrgb_addr); @@ -279,7 +287,11 @@ static int rga2_dma_memory_check(struct rga_dma_buffer_t *buffer, return -EINVAL; } +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) + dma_buf_vunmap(dma_buffer, &map); +#else dma_buf_vunmap(dma_buffer, vaddr); +#endif } return ret; From 38fe2a5683d0c7f5a45f044d8461b6ccb9f72fda Mon Sep 17 00:00:00 2001 From: Yu Qiaowei Date: Sun, 25 Jun 2023 03:19:08 +0000 Subject: [PATCH 3/7] video: rockchip: rga: adapt to kernel-6.1 Signed-off-by: Yu Qiaowei Change-Id: I798ec5540f64c2423885a6442a76c097e72e6fb8 --- drivers/video/rockchip/rga/rga_drv.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/drivers/video/rockchip/rga/rga_drv.c b/drivers/video/rockchip/rga/rga_drv.c index 353857f721f7..57f4c6327322 100644 --- a/drivers/video/rockchip/rga/rga_drv.c +++ b/drivers/video/rockchip/rga/rga_drv.c @@ -1109,6 +1109,9 @@ static int rga_get_img_info(rga_img_info_t *img, struct dma_buf_attachment *attach = NULL; struct device *rga_dev = NULL; struct sg_table *sgt = NULL; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) + struct iosys_map map; +#endif struct dma_buf *dma_buf = NULL; u32 vir_w, vir_h; int yrgb_addr = -1; @@ -1137,11 +1140,20 @@ static int rga_get_img_info(rga_img_info_t *img, } #if RGA_DEBUGFS if (RGA_CHECK_MODE) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) + ret = dma_buf_vmap(dma_buf, &map); + vaddr = ret ? NULL : map.vaddr; +#else vaddr = dma_buf_vmap(dma_buf); +#endif if (vaddr) rga_memory_check(vaddr, img->vir_w, img->vir_h, img->format, img->yrgb_addr); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) + dma_buf_vunmap(dma_buf, &map); +#else dma_buf_vunmap(dma_buf, vaddr); +#endif } #endif *pattach = attach; From d6af8d8e9153cd971a6e1bb9b63def88b4923e0b Mon Sep 17 00:00:00 2001 From: Yu Qiaowei Date: Mon, 26 Jun 2023 01:42:17 +0000 Subject: [PATCH 4/7] video: rockchip: rga3: adapt to kernel-6.1/5.10/4.19 Signed-off-by: Yu Qiaowei Change-Id: Ic58947f624bc532730b39744a3385d02fbaf6743 --- drivers/video/rockchip/rga3/rga_debugger.c | 14 ++++++++++++++ drivers/video/rockchip/rga3/rga_dma_buf.c | 11 ++++++++++- drivers/video/rockchip/rga3/rga_job.c | 4 ++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/drivers/video/rockchip/rga3/rga_debugger.c b/drivers/video/rockchip/rga3/rga_debugger.c index 28e16b958afd..fe2103147845 100644 --- a/drivers/video/rockchip/rga3/rga_debugger.c +++ b/drivers/video/rockchip/rga3/rga_debugger.c @@ -621,7 +621,11 @@ CREATE_FAIL: #ifdef CONFIG_ROCKCHIP_RGA_PROC_FS static int rga_procfs_open(struct inode *inode, struct file *file) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) struct rga_debugger_node *node = pde_data(inode); +#else + struct rga_debugger_node *node = PDE_DATA(inode); +#endif return single_open(file, node->info_ent->show, node); } @@ -836,8 +840,10 @@ static int rga_dump_image_to_file(struct rga_internal_buffer *dump_buffer, struct file *file; size_t size = 0; loff_t pos = 0; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) int ret; struct iosys_map map; +#endif void *kvaddr = NULL; void *kvaddr_origin = NULL; @@ -850,8 +856,12 @@ static int rga_dump_image_to_file(struct rga_internal_buffer *dump_buffer, return -EINVAL; } +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) ret = dma_buf_vmap(dump_buffer->dma_buffer->dma_buf, &map); kvaddr = ret ? NULL : map.vaddr; +#else + kvaddr = dma_buf_vmap(dump_buffer->dma_buffer->dma_buf); +#endif if (!kvaddr) { pr_err("can't vmap the dma buffer!\n"); return -EINVAL; @@ -921,7 +931,11 @@ static int rga_dump_image_to_file(struct rga_internal_buffer *dump_buffer, switch (dump_buffer->type) { case RGA_DMA_BUFFER: case RGA_DMA_BUFFER_PTR: +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) + dma_buf_vunmap(dump_buffer->dma_buffer->dma_buf, &map); +#else dma_buf_vunmap(dump_buffer->dma_buffer->dma_buf, kvaddr_origin); +#endif break; case RGA_VIRTUAL_ADDRESS: vunmap(kvaddr_origin); diff --git a/drivers/video/rockchip/rga3/rga_dma_buf.c b/drivers/video/rockchip/rga3/rga_dma_buf.c index 214de47bab6d..db34db5af86c 100644 --- a/drivers/video/rockchip/rga3/rga_dma_buf.c +++ b/drivers/video/rockchip/rga3/rga_dma_buf.c @@ -394,14 +394,20 @@ int rga_dma_memory_check(struct rga_dma_buffer *rga_dma_buffer, struct rga_img_i { int ret = 0; void *vaddr; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) struct iosys_map map; +#endif struct dma_buf *dma_buf; dma_buf = rga_dma_buffer->dma_buf; if (!IS_ERR_OR_NULL(dma_buf)) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) ret = dma_buf_vmap(dma_buf, &map); vaddr = ret ? NULL : map.vaddr; +#else + vaddr = dma_buf_vmap(dma_buf); +#endif if (vaddr) { ret = rga_virtual_memory_check(vaddr, img->vir_w, img->vir_h, img->format, img->yrgb_addr); @@ -409,8 +415,11 @@ int rga_dma_memory_check(struct rga_dma_buffer *rga_dma_buffer, struct rga_img_i pr_err("can't vmap the dma buffer!\n"); return -EINVAL; } - +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) + dma_buf_vunmap(dma_buf, &map); +#else dma_buf_vunmap(dma_buf, vaddr); +#endif } return ret; diff --git a/drivers/video/rockchip/rga3/rga_job.c b/drivers/video/rockchip/rga3/rga_job.c index dddd3191816a..bbe6fa87e82f 100644 --- a/drivers/video/rockchip/rga3/rga_job.c +++ b/drivers/video/rockchip/rga3/rga_job.c @@ -537,7 +537,11 @@ static int rga_request_add_acquire_fence_callback(int acquire_fence_fd, return -EINVAL; } /* close acquire fence fd */ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) close_fd(acquire_fence_fd); +#else + ksys_close(acquire_fence_fd); +#endif ret = rga_dma_fence_get_status(acquire_fence); if (ret < 0) { From db9c609686fa750894fdec47610b28434bca85f4 Mon Sep 17 00:00:00 2001 From: Felix Zeng Date: Sun, 25 Jun 2023 17:42:06 +0800 Subject: [PATCH 5/7] driver: rknpu: Fix build errors in kernel 6.1, version: 0.8.9 Signed-off-by: Felix Zeng Change-Id: I88ca7a85e3ea5e2a410f48a5789f17b57ffb267e --- drivers/rknpu/include/rknpu_drv.h | 4 +- drivers/rknpu/include/rknpu_gem.h | 7 +++ drivers/rknpu/include/rknpu_iommu.h | 6 ++- drivers/rknpu/rknpu_debugger.c | 4 ++ drivers/rknpu/rknpu_drv.c | 66 ++++++++++++++++++++------ drivers/rknpu/rknpu_gem.c | 72 +++++++++++++++++++++++++---- drivers/rknpu/rknpu_iommu.c | 3 ++ 7 files changed, 136 insertions(+), 26 deletions(-) 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/rknpu_debugger.c b/drivers/rknpu/rknpu_debugger.c index 0e4b5239bbf5..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 78e69d9315f4..2cba60edae10 100644 --- a/drivers/rknpu/rknpu_drv.c +++ b/drivers/rknpu/rknpu_drv.c @@ -488,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) @@ -554,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), @@ -741,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 @@ -802,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 @@ -818,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 @@ -842,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 @@ -861,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 @@ -880,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, @@ -1142,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) @@ -1169,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) { @@ -1542,6 +1554,7 @@ err_remove_table: return ret; } #endif +#endif static int rknpu_devfreq_remove(struct rknpu_device *rknpu_dev) { @@ -1564,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) { @@ -1605,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; } @@ -1743,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 @@ -1885,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 @@ -1994,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); @@ -2053,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 diff --git a/drivers/rknpu/rknpu_gem.c b/drivers/rknpu/rknpu_gem.c index 046b19a06230..3bb84372c5c2 100644 --- a/drivers/rknpu/rknpu_gem.c +++ b/drivers/rknpu/rknpu_gem.c @@ -252,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; } @@ -334,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) { @@ -347,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) { @@ -421,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( @@ -533,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; } @@ -565,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); } @@ -1147,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; @@ -1245,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; @@ -1274,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); @@ -1289,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) { @@ -1305,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; @@ -1347,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); From c5eaa56982785d2493f90293f1d5e4eba57610ed Mon Sep 17 00:00:00 2001 From: Tao Huang Date: Tue, 27 Jun 2023 15:12:20 +0800 Subject: [PATCH 6/7] rknpu: Add MODULE_IMPORT_NS(DMA_BUF) for kernel 5.16 ERROR: modpost: module rknpu uses symbol dma_buf_attach from namespace DMA_BUF, but does not import it. ERROR: modpost: module rknpu uses symbol dma_buf_map_attachment from namespace DMA_BUF, but does not import it. ERROR: modpost: module rknpu uses symbol dma_buf_unmap_attachment from namespace DMA_BUF, but does not import it. ERROR: modpost: module rknpu uses symbol dma_buf_get from namespace DMA_BUF, but does not import it. ERROR: modpost: module rknpu uses symbol dma_buf_put from namespace DMA_BUF, but does not import it. ERROR: modpost: module rknpu uses symbol dma_buf_fd from namespace DMA_BUF, but does not import it. ERROR: modpost: module rknpu uses symbol dma_buf_detach from namespace DMA_BUF, but does not import it. Signed-off-by: Tao Huang Change-Id: I959a6f67e8c623e81df32d0d7c7f51a5f7d6907e --- drivers/rknpu/rknpu_drv.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/rknpu/rknpu_drv.c b/drivers/rknpu/rknpu_drv.c index 2cba60edae10..584bdc8dbec8 100644 --- a/drivers/rknpu/rknpu_drv.c +++ b/drivers/rknpu/rknpu_drv.c @@ -2120,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 From 7abaac5a040a93d175d649897e1c8f7b196a1a3b Mon Sep 17 00:00:00 2001 From: Jon Lin Date: Sun, 25 Jun 2023 15:42:08 +0800 Subject: [PATCH 7/7] PCIe: dw: rockchip: Disabled BAR0 and BAR1 fix the following case: [ 2.143145] pci 0000:00:00.0: BAR 0: no space for [mem size 0x40000000] [ 2.143155] pci 0000:00:00.0: BAR 0: failed to assign [mem size 0x40000000] [ 2.143161] pci 0000:00:00.0: BAR 1: no space for [mem size 0x40000000] [ 2.143168] pci 0000:00:00.0: BAR 1: failed to assign [mem size 0x40000000] Change-Id: I5eca2adb49d83c775036df7e961dab5c9fbfffbb Signed-off-by: Jon Lin --- drivers/pci/controller/dwc/pcie-dw-rockchip.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/pci/controller/dwc/pcie-dw-rockchip.c b/drivers/pci/controller/dwc/pcie-dw-rockchip.c index 153de6772691..c18be20a512e 100644 --- a/drivers/pci/controller/dwc/pcie-dw-rockchip.c +++ b/drivers/pci/controller/dwc/pcie-dw-rockchip.c @@ -1145,6 +1145,10 @@ static int rk_add_pcie_port(struct rk_pcie *rk_pcie, struct platform_device *pde return ret; } + /* Disable BAR0 BAR1 */ + dw_pcie_writel_dbi(pci, PCIE_TYPE0_HDR_DBI2_OFFSET + 0x10 + BAR_0 * 4, 0); + dw_pcie_writel_dbi(pci, PCIE_TYPE0_HDR_DBI2_OFFSET + 0x10 + BAR_1 * 4, 0); + return 0; }