From 35de9e63d9c2fe0a557637ac104d7d73382d2d4a Mon Sep 17 00:00:00 2001 From: Kristofer Jonsson Date: Tue, 8 Mar 2022 13:25:45 +0100 Subject: Firmware resident model Support referencing a network model by index that has been built into the firmware binary. Change-Id: Idd5294376ea82503dfeafe1203dcc0694d296dfe --- kernel/ethosu_network.c | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) (limited to 'kernel/ethosu_network.c') diff --git a/kernel/ethosu_network.c b/kernel/ethosu_network.c index 4d68f05..57ccb62 100644 --- a/kernel/ethosu_network.c +++ b/kernel/ethosu_network.c @@ -1,5 +1,5 @@ /* - * (C) COPYRIGHT 2020 ARM Limited. All rights reserved. + * Copyright (c) 2020, 2022 Arm Limited. * * This program is free software and is provided to you under the terms of the * GNU General Public License version 2 as published by the Free Software @@ -69,7 +69,9 @@ static void ethosu_network_destroy(struct kref *kref) dev_info(net->edev->dev, "Network destroy. handle=0x%pK\n", net); - ethosu_buffer_put(net->buf); + if (net->buf != NULL) + ethosu_buffer_put(net->buf); + devm_kfree(net->edev->dev, net); } @@ -128,28 +130,31 @@ static long ethosu_network_ioctl(struct file *file, int ethosu_network_create(struct ethosu_device *edev, struct ethosu_uapi_network_create *uapi) { - struct ethosu_buffer *buf; struct ethosu_network *net; int ret = -ENOMEM; - buf = ethosu_buffer_get_from_fd(uapi->fd); - if (IS_ERR(buf)) - return PTR_ERR(buf); - net = devm_kzalloc(edev->dev, sizeof(*net), GFP_KERNEL); - if (!net) { - ret = -ENOMEM; - goto put_buf; - } + if (!net) + return -ENOMEM; net->edev = edev; - net->buf = buf; + net->buf = NULL; kref_init(&net->kref); + if (uapi->type == ETHOSU_UAPI_NETWORK_BUFFER) { + net->buf = ethosu_buffer_get_from_fd(uapi->fd); + if (IS_ERR(net->buf)) { + ret = PTR_ERR(net->buf); + goto free_net; + } + } else { + net->index = uapi->index; + } + ret = anon_inode_getfd("ethosu-network", ðosu_network_fops, net, O_RDWR | O_CLOEXEC); if (ret < 0) - goto free_net; + goto put_buf; net->file = fget(ret); fput(net->file); @@ -159,12 +164,13 @@ int ethosu_network_create(struct ethosu_device *edev, return ret; +put_buf: + if (net->buf != NULL) + ethosu_buffer_put(net->buf); + free_net: devm_kfree(edev->dev, net); -put_buf: - ethosu_buffer_put(buf); - return ret; } -- cgit v1.2.1