aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikael Olsson <mikael.olsson@arm.com>2024-04-04 17:28:52 +0200
committerMikael Olsson <mikael.olsson@arm.com>2024-04-08 11:33:31 +0200
commitd80345fa00fea2816787ff3864318382edfd4949 (patch)
treedb4fc59187b1da9ee3c0db0410572c0e9302273f
parentb2f4a2cd2de6647c9e6d6d4db9108a81d4757e33 (diff)
downloadethos-u-linux-driver-stack-d80345fa00fea2816787ff3864318382edfd4949.tar.gz
Add additional error logging in NPU driver
To make it easier to distinguish where an error occurred in the NPU driver, additional logging has been added to the error cases. Change-Id: I9d744e7adf3ba3098d456d1f3c2859aa0ce66de4 Signed-off-by: Mikael Olsson <mikael.olsson@arm.com>
-rw-r--r--kernel/common/ethosu_buffer.c19
-rw-r--r--kernel/common/ethosu_dma_mem.c13
-rw-r--r--kernel/rpmsg/ethosu_rpmsg_cancel_inference.c5
-rw-r--r--kernel/rpmsg/ethosu_rpmsg_inference.c25
-rw-r--r--kernel/rpmsg/ethosu_rpmsg_network.c34
-rw-r--r--kernel/rpmsg/ethosu_rpmsg_network_info.c6
6 files changed, 83 insertions, 19 deletions
diff --git a/kernel/common/ethosu_buffer.c b/kernel/common/ethosu_buffer.c
index cf41b8d..519e270 100644
--- a/kernel/common/ethosu_buffer.c
+++ b/kernel/common/ethosu_buffer.c
@@ -139,12 +139,18 @@ int ethosu_buffer_create(struct device *dev,
struct ethosu_buffer *buf;
int ret = -ENOMEM;
- if (!size)
+ if (!size) {
+ dev_err(dev, "Buffer create. Invalid zero size");
+
return -EINVAL;
+ }
buf = devm_kzalloc(dev, sizeof(*buf), GFP_KERNEL);
- if (!buf)
+ if (!buf) {
+ dev_err(dev, "Buffer create. Failed to allocate struct");
+
return -ENOMEM;
+ }
buf->dev = dev;
kref_init(&buf->kref);
@@ -152,13 +158,20 @@ int ethosu_buffer_create(struct device *dev,
buf->dma_mem = ethosu_dma_mem_alloc(dev, size);
if (IS_ERR(buf->dma_mem)) {
ret = PTR_ERR(buf->dma_mem);
+ dev_err(dev,
+ "Buffer create. Failed to allocate DMA memory. ret=%d",
+ ret);
goto free_buf;
}
ret = anon_inode_getfd("ethosu-buffer", &ethosu_buffer_fops, buf,
O_RDWR | O_CLOEXEC);
- if (ret < 0)
+ if (ret < 0) {
+ dev_err(dev,
+ "Buffer create. Failed to get file descriptor. ret=%d",
+ ret);
goto free_dma;
+ }
buf->file = fget(ret);
buf->file->f_mode |= FMODE_LSEEK;
diff --git a/kernel/common/ethosu_dma_mem.c b/kernel/common/ethosu_dma_mem.c
index 0e05978..fd444d2 100644
--- a/kernel/common/ethosu_dma_mem.c
+++ b/kernel/common/ethosu_dma_mem.c
@@ -35,18 +35,27 @@ struct ethosu_dma_mem *ethosu_dma_mem_alloc(struct device *dev,
{
struct ethosu_dma_mem *dma_mem;
- if (!size)
+ if (!size) {
+ dev_err(dev, "DMA mem alloc. Invalid zero size");
+
return ERR_PTR(-EINVAL);
+ }
dma_mem = devm_kzalloc(dev, sizeof(*dma_mem), GFP_KERNEL);
- if (!dma_mem)
+ if (!dma_mem) {
+ dev_err(dev,
+ "DMA mem alloc. Failed to allocate struct");
+
return ERR_PTR(-ENOMEM);
+ }
dma_mem->dev = dev;
dma_mem->size = size;
dma_mem->cpu_addr = dma_alloc_coherent(dev, size, &dma_mem->dma_addr,
GFP_KERNEL);
if (!dma_mem->cpu_addr) {
+ dev_err(dev, "DMA mem alloc. Failed to allocate 0x%02zx bytes",
+ size);
memset(dma_mem, 0, sizeof(*dma_mem));
devm_kfree(dev, dma_mem);
diff --git a/kernel/rpmsg/ethosu_rpmsg_cancel_inference.c b/kernel/rpmsg/ethosu_rpmsg_cancel_inference.c
index 5fa7515..b07c0ec 100644
--- a/kernel/rpmsg/ethosu_rpmsg_cancel_inference.c
+++ b/kernel/rpmsg/ethosu_rpmsg_cancel_inference.c
@@ -83,8 +83,11 @@ int ethosu_rpmsg_cancel_inference_request(struct device *dev,
devm_kzalloc(dev,
sizeof(struct ethosu_rpmsg_cancel_inference),
GFP_KERNEL);
- if (!cancellation)
+ if (!cancellation) {
+ dev_err(dev, "Cancel inference. Failed to allocate struct");
+
return -ENOMEM;
+ }
/* increase ref count on the inference we are refering to */
ethosu_rpmsg_inference_get(inf);
diff --git a/kernel/rpmsg/ethosu_rpmsg_inference.c b/kernel/rpmsg/ethosu_rpmsg_inference.c
index b6288ef..dd88a8a 100644
--- a/kernel/rpmsg/ethosu_rpmsg_inference.c
+++ b/kernel/rpmsg/ethosu_rpmsg_inference.c
@@ -278,16 +278,20 @@ int ethosu_rpmsg_inference_create(struct device *dev,
if (uapi->ifm_count > ETHOSU_FD_MAX ||
uapi->ofm_count > ETHOSU_FD_MAX) {
- dev_warn(dev,
- "Too many IFM and/or OFM buffers for inference. ifm_count=%u, ofm_count=%u",
- uapi->ifm_count, uapi->ofm_count);
+ dev_err(dev,
+ "Inference create. Too many IFM and/or OFM buffers for inference. ifm_count=%u, ofm_count=%u",
+ uapi->ifm_count, uapi->ofm_count);
return -EFAULT;
}
inf = devm_kzalloc(dev, sizeof(*inf), GFP_KERNEL);
- if (!inf)
+ if (!inf) {
+ dev_err(dev,
+ "Inference create. Failed to allocate struct");
+
return -ENOMEM;
+ }
inf->dev = dev;
inf->mailbox = mailbox;
@@ -308,6 +312,9 @@ int ethosu_rpmsg_inference_create(struct device *dev,
inf->ifm[i] = ethosu_buffer_get_from_fd(uapi->ifm_fd[i]);
if (IS_ERR(inf->ifm[i])) {
ret = PTR_ERR(inf->ifm[i]);
+ dev_err(dev,
+ "Inference create. Failed to get IFM buffer%u ret=%d",
+ i, ret);
goto put_ifm;
}
@@ -319,6 +326,9 @@ int ethosu_rpmsg_inference_create(struct device *dev,
inf->ofm[i] = ethosu_buffer_get_from_fd(uapi->ofm_fd[i]);
if (IS_ERR(inf->ofm[i])) {
ret = PTR_ERR(inf->ofm[i]);
+ dev_err(dev,
+ "Inference create. Failed to get OFM buffer%u ret=%d",
+ i, ret);
goto put_ofm;
}
@@ -353,8 +363,13 @@ int ethosu_rpmsg_inference_create(struct device *dev,
ret = fd = anon_inode_getfd("ethosu-inference",
&ethosu_rpmsg_inference_fops,
inf, O_RDWR | O_CLOEXEC);
- if (ret < 0)
+ if (ret < 0) {
+ dev_err(dev,
+ "Inference create. Failed to get file descriptor. ret=%d",
+ ret);
+
goto put_net;
+ }
/* Store pointer to file structure */
inf->file = fget(ret);
diff --git a/kernel/rpmsg/ethosu_rpmsg_network.c b/kernel/rpmsg/ethosu_rpmsg_network.c
index 38d7db2..cf36f2d 100644
--- a/kernel/rpmsg/ethosu_rpmsg_network.c
+++ b/kernel/rpmsg/ethosu_rpmsg_network.c
@@ -108,7 +108,7 @@ static long ethosu_rpmsg_network_ioctl(struct file *file,
case ETHOSU_IOCTL_NETWORK_INFO: {
struct ethosu_uapi_network_info uapi = { 0 };
- dev_dbg(dev, "Network ioctl: Network info. net=0x%pK\n", net);
+ dev_dbg(dev, "Network ioctl: Network info. net=0x%pK", net);
ret = ethosu_rpmsg_network_info_request(dev, net->mailbox, net,
&uapi);
@@ -122,12 +122,14 @@ static long ethosu_rpmsg_network_ioctl(struct file *file,
struct ethosu_uapi_inference_create uapi;
if (copy_from_user(&uapi, udata, sizeof(uapi))) {
+ dev_err(dev,
+ "Network ioctl: Failed to copy inference request");
ret = -EFAULT;
break;
}
dev_dbg(dev,
- "Network ioctl: Inference. ifm_fd=%u, ofm_fd=%u\n",
+ "Network ioctl: Inference. ifm_fd=%u, ofm_fd=%u",
uapi.ifm_fd[0], uapi.ofm_fd[0]);
ret = ethosu_rpmsg_inference_create(dev, net->mailbox, net,
@@ -156,8 +158,11 @@ int ethosu_rpmsg_network_create(struct device *dev,
int ret;
net = devm_kzalloc(dev, sizeof(*net), GFP_KERNEL);
- if (!net)
+ if (!net) {
+ dev_err(dev, "Network create. Failed to allocate struct");
+
return -ENOMEM;
+ }
net->dev = dev;
net->mailbox = mailbox;
@@ -166,13 +171,15 @@ int ethosu_rpmsg_network_create(struct device *dev,
switch (uapi->type) {
case ETHOSU_UAPI_NETWORK_USER_BUFFER:
if (!uapi->network.data_ptr) {
- dev_err(dev, "Invalid network data ptr\n");
+ dev_err(dev,
+ "Network create. Invalid network data ptr");
ret = -EINVAL;
goto free_net;
}
if (!uapi->network.size) {
- dev_err(dev, "Invalid network data size\n");
+ dev_err(dev,
+ "Network create. Invalid network data size");
ret = -EINVAL;
goto free_net;
}
@@ -180,20 +187,29 @@ int ethosu_rpmsg_network_create(struct device *dev,
net->dma_mem = ethosu_dma_mem_alloc(dev, uapi->network.size);
if (IS_ERR(net->dma_mem)) {
ret = PTR_ERR(net->dma_mem);
+ dev_err(dev,
+ "Network create. Failed to allocate DMA memory. ret=%d",
+ ret);
goto free_net;
}
data = u64_to_user_ptr(uapi->network.data_ptr);
ret = copy_from_user(net->dma_mem->cpu_addr, data,
uapi->network.size);
- if (ret)
+ if (ret) {
+ dev_err(dev,
+ "Network create. Failed to copy network data from user buffer. ret=%d",
+ ret);
goto free_dma_mem;
+ }
break;
case ETHOSU_UAPI_NETWORK_INDEX:
net->index = uapi->index;
break;
default:
+ dev_err(dev, "Network create. Invalid buffer type. type=%u",
+ uapi->type);
ret = -EINVAL;
goto free_net;
}
@@ -201,8 +217,12 @@ int ethosu_rpmsg_network_create(struct device *dev,
ret = anon_inode_getfd("ethosu-network", &ethosu_rpmsg_network_fops,
net,
O_RDWR | O_CLOEXEC);
- if (ret < 0)
+ if (ret < 0) {
+ dev_err(dev,
+ "Network create. Failed to get file descriptor. ret=%d",
+ ret);
goto free_dma_mem;
+ }
net->file = fget(ret);
fput(net->file);
diff --git a/kernel/rpmsg/ethosu_rpmsg_network_info.c b/kernel/rpmsg/ethosu_rpmsg_network_info.c
index 36b6290..2445a09 100644
--- a/kernel/rpmsg/ethosu_rpmsg_network_info.c
+++ b/kernel/rpmsg/ethosu_rpmsg_network_info.c
@@ -73,8 +73,12 @@ int ethosu_rpmsg_network_info_request(struct device *dev,
info->msg.fail = ethosu_rpmsg_network_info_fail;
ret = ethosu_rpmsg_mailbox_register(mailbox, &info->msg);
- if (ret < 0)
+ if (ret < 0) {
+ dev_err(dev,
+ "Network info create. Failed to register message in mailbox. ret=%d",
+ ret);
goto kfree;
+ }
/* Get reference to network */
ethosu_rpmsg_network_get(info->net);