driver: rknpu: Compatible with kernel 6.1 compilation, version: 0.8.9

Signed-off-by: Felix Zeng <felix.zeng@rock-chips.com>
Change-Id: I88ca7a85e3ea5e2a410f48a5789f17b57ffb267e
This commit is contained in:
Felix Zeng
2023-06-25 19:32:46 +08:00
committed by Tao Huang
parent 484d7b1bd6
commit 89a2d47db7
8 changed files with 139 additions and 29 deletions

View File

@@ -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"

View File

@@ -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);

View File

@@ -10,8 +10,12 @@
#include <linux/mutex.h>
#include <linux/seq_file.h>
#include <linux/iommu.h>
#include <linux/dma-iommu.h>
#include <linux/iova.h>
#include <linux/version.h>
#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE
#include <linux/dma-iommu.h>
#endif
#include "rknpu_drv.h"

View File

@@ -10,7 +10,6 @@
#include <linux/mutex.h>
#include <linux/seq_file.h>
#include <linux/iommu.h>
#include <linux/dma-iommu.h>
#include <linux/iova.h>
#include "rknpu_drv.h"

View File

@@ -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);
}

View File

@@ -33,7 +33,6 @@
#include <linux/pm_runtime.h>
#include <linux/devfreq_cooling.h>
#include <linux/regmap.h>
#include <linux/dma-iommu.h>
#include <linux/of_address.h>
#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

View File

@@ -13,7 +13,6 @@
#include <linux/shmem_fs.h>
#include <linux/dma-buf.h>
#include <linux/iommu.h>
#include <linux/dma-iommu.h>
#include <linux/pfn_t.h>
#include <linux/version.h>
#include <asm/cacheflush.h>
@@ -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;
}

View File

@@ -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);