driver: rknpu: Update rknpu driver, version: 0.9.0

* Fix power reference counting error
* Fix issue with IOMMU mode limited to 32-bit
* Reduce the time consumed by dma mapping

Signed-off-by: Felix Zeng <felix.zeng@rock-chips.com>
Change-Id: I93ea77fee4904455a80dfe6303ff049f3338742b
This commit is contained in:
Felix Zeng
2023-06-29 09:41:42 +08:00
committed by Tao Huang
parent 8e777ce52e
commit 9db57dd757
4 changed files with 18 additions and 9 deletions

View File

@@ -30,10 +30,10 @@
#define DRIVER_NAME "rknpu"
#define DRIVER_DESC "RKNPU driver"
#define DRIVER_DATE "20230625"
#define DRIVER_DATE "20230629"
#define DRIVER_MAJOR 0
#define DRIVER_MINOR 8
#define DRIVER_PATCHLEVEL 9
#define DRIVER_MINOR 9
#define DRIVER_PATCHLEVEL 0
#define LOG_TAG "RKNPU"

View File

@@ -73,8 +73,8 @@ enum e_rknpu_mem_type {
RKNPU_MEM_ZEROING = 1 << 5,
/* allocate secure buffer */
RKNPU_MEM_SECURE = 1 << 6,
/* allocate from non-dma32 zone */
RKNPU_MEM_NON_DMA32 = 1 << 7,
/* allocate from dma32 zone */
RKNPU_MEM_DMA32 = 1 << 7,
/* request SRAM */
RKNPU_MEM_TRY_ALLOC_SRAM = 1 << 8,
/* request NBUF */
@@ -82,7 +82,7 @@ enum e_rknpu_mem_type {
RKNPU_MEM_MASK = RKNPU_MEM_NON_CONTIGUOUS | RKNPU_MEM_CACHEABLE |
RKNPU_MEM_WRITE_COMBINE | RKNPU_MEM_KERNEL_MAPPING |
RKNPU_MEM_IOMMU | RKNPU_MEM_ZEROING |
RKNPU_MEM_SECURE | RKNPU_MEM_NON_DMA32 |
RKNPU_MEM_SECURE | RKNPU_MEM_DMA32 |
RKNPU_MEM_TRY_ALLOC_SRAM | RKNPU_MEM_TRY_ALLOC_NBUF
};

View File

@@ -224,7 +224,6 @@ int rknpu_power_get(struct rknpu_device *rknpu_dev)
{
int ret = 0;
cancel_delayed_work(&rknpu_dev->power_off_work);
mutex_lock(&rknpu_dev->power_lock);
if (atomic_inc_return(&rknpu_dev->power_refcount) == 1)
ret = rknpu_power_on(rknpu_dev);
@@ -247,6 +246,9 @@ int rknpu_power_put(struct rknpu_device *rknpu_dev)
static int rknpu_power_put_delay(struct rknpu_device *rknpu_dev)
{
if (rknpu_dev->power_put_delay == 0)
return rknpu_power_put(rknpu_dev);
mutex_lock(&rknpu_dev->power_lock);
if (atomic_read(&rknpu_dev->power_refcount) == 1)
queue_delayed_work(
@@ -255,6 +257,7 @@ static int rknpu_power_put_delay(struct rknpu_device *rknpu_dev)
else
atomic_dec_if_positive(&rknpu_dev->power_refcount);
mutex_unlock(&rknpu_dev->power_lock);
return 0;
}

View File

@@ -67,6 +67,7 @@ static int rknpu_gem_get_pages(struct rknpu_gem_object *rknpu_obj)
rknpu_obj->size);
goto free_sgt;
}
iommu_flush_iotlb_all(iommu_get_domain_for_dev(drm->dev));
if (rknpu_obj->flags & RKNPU_MEM_KERNEL_MAPPING) {
rknpu_obj->cookie = vmap(rknpu_obj->pages, rknpu_obj->num_pages,
@@ -181,7 +182,9 @@ static int rknpu_gem_alloc_buf(struct rknpu_gem_object *rknpu_obj)
if (rknpu_obj->flags & RKNPU_MEM_ZEROING)
gfp_mask |= __GFP_ZERO;
if (!(rknpu_obj->flags & RKNPU_MEM_NON_DMA32)) {
if (!rknpu_dev->iommu_en ||
rknpu_dev->config->dma_mask <= DMA_BIT_MASK(32) ||
(rknpu_obj->flags & RKNPU_MEM_DMA32)) {
gfp_mask &= ~__GFP_HIGHMEM;
gfp_mask |= __GFP_DMA32;
}
@@ -360,6 +363,7 @@ static const struct drm_gem_object_funcs rknpu_gem_object_funcs = {
static struct rknpu_gem_object *rknpu_gem_init(struct drm_device *drm,
unsigned long size)
{
struct rknpu_device *rknpu_dev = drm->dev_private;
struct rknpu_gem_object *rknpu_obj = NULL;
struct drm_gem_object *obj = NULL;
gfp_t gfp_mask;
@@ -388,7 +392,9 @@ static struct rknpu_gem_object *rknpu_gem_init(struct drm_device *drm,
if (rknpu_obj->flags & RKNPU_MEM_ZEROING)
gfp_mask |= __GFP_ZERO;
if (!(rknpu_obj->flags & RKNPU_MEM_NON_DMA32)) {
if (!rknpu_dev->iommu_en ||
rknpu_dev->config->dma_mask <= DMA_BIT_MASK(32) ||
(rknpu_obj->flags & RKNPU_MEM_DMA32)) {
gfp_mask &= ~__GFP_HIGHMEM;
gfp_mask |= __GFP_DMA32;
}