aboutsummaryrefslogtreecommitdiff
path: root/driver_library
diff options
context:
space:
mode:
authorMikael Olsson <mikael.olsson@arm.com>2023-10-17 13:05:38 +0200
committerMikael Olsson <mikael.olsson@arm.com>2023-11-06 09:36:00 +0100
commit075451507cda3e8f543caecacfadf226a69e5a05 (patch)
treed12ec47fa73c61a7bec3543a29c5dd2ae6b66c93 /driver_library
parent45d47991f745094e328f32e769c22d811d397b1d (diff)
downloadethos-u-linux-driver-stack-075451507cda3e8f543caecacfadf226a69e5a05.tar.gz
Remove buffer capacity, offset and resize in UAPI
The UAPI no longer supports the buffer capacity, offset and resize functionality. Instead, the UAPI now only accepts a fixed size given at the creation of the buffer. This change was made because the features were not used and made the buffer handling more complicated. The user knows how big buffers they need for their networks so they don't need resize support or partial buffer usage support by having separate size and capacity with an offset. Without these features, the buffer instance no longer needs any IOCTL call support so it has been removed. However, to still be able to check the size of a buffer from its file descriptor, seek support has been implemented so lseek and similar functions can be used to get the size. The driver library's clear function that previously only reset the size and offset values of the buffer will now clear the buffer content instead. These are breaking changes so the Linux kernel NPU driver version and the driver library version have been given major version bumps. All the tests and other applications affected by these changes have been updated accordingly. Change-Id: Ifc34cf04724a95853ad23fd7398dd286f73bcdab Signed-off-by: Mikael Olsson <mikael.olsson@arm.com>
Diffstat (limited to 'driver_library')
-rw-r--r--driver_library/include/ethosu.hpp14
-rw-r--r--driver_library/python/src/ethosu_driver/_utilities/driver_utilities.py11
-rw-r--r--driver_library/python/src/ethosu_driver/swig/driver.i46
-rw-r--r--driver_library/python/test/test_driver.py18
-rw-r--r--driver_library/python/test/test_driver_utilities.py8
-rw-r--r--driver_library/src/ethosu.cpp36
6 files changed, 27 insertions, 106 deletions
diff --git a/driver_library/include/ethosu.hpp b/driver_library/include/ethosu.hpp
index 491dc28..47c1868 100644
--- a/driver_library/include/ethosu.hpp
+++ b/driver_library/include/ethosu.hpp
@@ -1,6 +1,5 @@
/*
* SPDX-FileCopyrightText: Copyright 2020-2023 Arm Limited and/or its affiliates <open-source-office@arm.com>
- *
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the License); you may
@@ -40,12 +39,12 @@
namespace EthosU {
-constexpr uint32_t DRIVER_LIBRARY_VERSION_MAJOR = 1;
+constexpr uint32_t DRIVER_LIBRARY_VERSION_MAJOR = 2;
constexpr uint32_t DRIVER_LIBRARY_VERSION_MINOR = 0;
constexpr uint32_t DRIVER_LIBRARY_VERSION_PATCH = 0;
-constexpr uint32_t MAX_SUPPORTED_KERNEL_DRIVER_MAJOR_VERSION = 1;
-constexpr uint32_t MIN_SUPPORTED_KERNEL_DRIVER_MAJOR_VERSION = 1;
+constexpr uint32_t MAX_SUPPORTED_KERNEL_DRIVER_MAJOR_VERSION = 2;
+constexpr uint32_t MIN_SUPPORTED_KERNEL_DRIVER_MAJOR_VERSION = 2;
class Exception : public std::exception {
public:
@@ -152,14 +151,11 @@ private:
class Buffer {
public:
- Buffer(const Device &device, const size_t capacity);
+ Buffer(const Device &device, const size_t size);
virtual ~Buffer() noexcept(false);
- size_t capacity() const;
void clear() const;
char *data() const;
- void resize(size_t size, size_t offset = 0) const;
- size_t offset() const;
size_t size() const;
int getFd() const;
@@ -167,7 +163,7 @@ public:
private:
int fd;
char *dataPtr;
- const size_t dataCapacity;
+ const size_t dataSize;
};
class Network {
diff --git a/driver_library/python/src/ethosu_driver/_utilities/driver_utilities.py b/driver_library/python/src/ethosu_driver/_utilities/driver_utilities.py
index 216895a..fcea91f 100644
--- a/driver_library/python/src/ethosu_driver/_utilities/driver_utilities.py
+++ b/driver_library/python/src/ethosu_driver/_utilities/driver_utilities.py
@@ -1,4 +1,4 @@
-# SPDX-FileCopyrightText: Copyright 2021-2022 Arm Limited and/or its affiliates <open-source-office@arm.com>
+# SPDX-FileCopyrightText: Copyright 2021-2023 Arm Limited and/or its affiliates <open-source-office@arm.com>
# SPDX-License-Identifier: Apache-2.0
import logging
import time
@@ -49,12 +49,11 @@ def populate_buffers(input_data: List[bytearray], buffers: List[Buffer]):
raise RuntimeError("Incorrect number of inputs, expected {}, got {}.".format(number_of_buffers, len(input_data)))
for index, (buffer, data_chunk) in enumerate(zip(buffers, input_data)):
- cap = buffer.capacity()
- logging.info("Copying data to a buffer {} of {} with size = {}".format(index + 1, number_of_buffers, cap))
+ size = buffer.size()
+ logging.info("Copying data to a buffer {} of {} with size = {}".format(index + 1, number_of_buffers, size))
- if len(data_chunk) > cap:
- raise RuntimeError("Buffer expects {} bytes, got {} bytes.".format(cap, len(data_chunk)))
- buffer.resize(len(data_chunk))
+ if len(data_chunk) > size:
+ raise RuntimeError("Buffer expects {} bytes, got {} bytes.".format(size, len(data_chunk)))
buffer.from_buffer(data_chunk)
diff --git a/driver_library/python/src/ethosu_driver/swig/driver.i b/driver_library/python/src/ethosu_driver/swig/driver.i
index 1ff8ded..3e4e384 100644
--- a/driver_library/python/src/ethosu_driver/swig/driver.i
+++ b/driver_library/python/src/ethosu_driver/swig/driver.i
@@ -210,31 +210,22 @@ public:
Buffer object represents a RW mapping in the virtual address space of the caller.
Created mapping is shareable, updates to the mapping are visible to other processes mapping the same region.
- Issues ETHOSU_IOCTL_BUFFER_CREATE I/O request to the device with given Maximum capacity.
+ Issues ETHOSU_IOCTL_BUFFER_CREATE I/O request to the device with given size.
- Buffer could be created for a device with given maximum capacity or instantiated directly from
+ Buffer could be created for a device with given size or instantiated directly from
a file containing binary data.
Examples:
>>> import ethosu_driver as driver
>>> # from file:
>>> buf = driver.Buffer(device, '/path/to/file')
- >>> # Empty, with maximum capacity:
+ >>> # Empty, with size:
>>> buf = driver.Buffer(device, 1024)
") Buffer;
%nodefaultctor Buffer;
class Buffer {
public:
- Buffer(const Device &device, const size_t capacity);
-
- %feature("docstring",
- "
- Returns maximum buffer capacity set during initialisation.
-
- Returns:
- int: maximum buffer capacity.
- ") capacity;
- size_t capacity() const;
+ Buffer(const Device &device, const size_t size);
%feature("docstring",
"
@@ -255,32 +246,6 @@ public:
%feature("docstring",
"
- Sets a size of the memory buffer for the device.
-
- 'offset + size' must not exceed the capacity of the buffer.
- Does not change the size of the mapped region.
-
- Issues ETHOSU_IOCTL_BUFFER_SET I/O request with a given size and offset.
-
- Args:
- size (int): Device buffer size.
- offset (int): Offset to where the data starts.
- ") resize;
- void resize(size_t size, size_t offset = 0) const;
-
- %feature("docstring",
- "
- Queries device and returns buffer data offset.
-
- Issues ETHOSU_IOCTL_BUFFER_GET I/O request.
-
- Returns:
- int: data offset
- ") offset;
- size_t offset() const;
-
- %feature("docstring",
- "
Queries device and returns buffer data size.
Issues ETHOSU_IOCTL_BUFFER_GET I/O request.
@@ -313,7 +278,6 @@ public:
stream.seekg(0, std::ios_base::beg);
auto buffer = new EthosU::Buffer(device, size);
- buffer->resize(size);
stream.read(buffer->data(), size);
return buffer;
@@ -324,7 +288,6 @@ public:
Fills the buffer from python buffer.
Copies python buffer data to the mapped memory region.
- Input buffer size must be within `Buffer` maximum capacity.
Args:
buffer: data to be copied to the mapped memory.
@@ -332,7 +295,6 @@ public:
") from_buffer;
%mutable_buffer(char* buffer, size_t size);
void from_buffer(char* buffer, size_t size) {
- self->resize(size);
char* data = $self->data();
std::memcpy(data, buffer, size);
}
diff --git a/driver_library/python/test/test_driver.py b/driver_library/python/test/test_driver.py
index 28d0a29..0dd207f 100644
--- a/driver_library/python/test/test_driver.py
+++ b/driver_library/python/test/test_driver.py
@@ -67,12 +67,6 @@ def test_check_buffer_swig_ownership(network_buffer):
@pytest.mark.parametrize('device_name', ['ethosu0'])
@pytest.mark.parametrize('model_name', ['model.tflite'])
-def test_check_buffer_capacity(network_buffer):
- assert network_buffer.capacity() > 0
-
-
-@pytest.mark.parametrize('device_name', ['ethosu0'])
-@pytest.mark.parametrize('model_name', ['model.tflite'])
def test_check_buffer_size(network_buffer):
assert network_buffer.size() > 0
@@ -81,16 +75,8 @@ def test_check_buffer_size(network_buffer):
@pytest.mark.parametrize('model_name', ['model.tflite'])
def test_check_buffer_clear(network_buffer):
network_buffer.clear()
- assert network_buffer.size() == 0
-
-
-@pytest.mark.parametrize('device_name', ['ethosu0'])
-@pytest.mark.parametrize('model_name', ['model.tflite'])
-def test_check_buffer_resize(network_buffer):
- offset = 1
- new_size = network_buffer.capacity() - offset
- network_buffer.resize(new_size, offset)
- assert network_buffer.size() == new_size
+ for i in range(network_buffer.size()):
+ assert network_buffer.data()[i] == 0
@pytest.mark.parametrize('device_name', ['ethosu0'])
diff --git a/driver_library/python/test/test_driver_utilities.py b/driver_library/python/test/test_driver_utilities.py
index fc8e921..fe44b0e 100644
--- a/driver_library/python/test/test_driver_utilities.py
+++ b/driver_library/python/test/test_driver_utilities.py
@@ -1,5 +1,5 @@
#
-# SPDX-FileCopyrightText: Copyright 2021-2022 Arm Limited and/or its affiliates <open-source-office@arm.com>
+# SPDX-FileCopyrightText: Copyright 2021-2023 Arm Limited and/or its affiliates <open-source-office@arm.com>
# SPDX-License-Identifier: Apache-2.0
#
import pytest
@@ -53,10 +53,8 @@ def test_check_network_ifm_size(network):
def test_allocate_buffers(device):
buffers = driver.allocate_buffers(device, [128, 256])
assert len(buffers) == 2
- assert buffers[0].size() == 0
- assert buffers[0].capacity() == 128
- assert buffers[1].size() == 0
- assert buffers[1].capacity() == 256
+ assert buffers[0].size() == 128
+ assert buffers[1].size() == 256
@pytest.mark.parametrize('device_name', ['ethosu0'])
diff --git a/driver_library/src/ethosu.cpp b/driver_library/src/ethosu.cpp
index dcdde8c..3c7dc31 100644
--- a/driver_library/src/ethosu.cpp
+++ b/driver_library/src/ethosu.cpp
@@ -1,6 +1,5 @@
/*
* SPDX-FileCopyrightText: Copyright 2020-2023 Arm Limited and/or its affiliates <open-source-office@arm.com>
- *
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the License); you may
@@ -279,13 +278,13 @@ Capabilities Device::capabilities() const {
* Buffer
****************************************************************************/
-Buffer::Buffer(const Device &device, const size_t capacity) : fd(-1), dataPtr(nullptr), dataCapacity(capacity) {
- ethosu_uapi_buffer_create uapi = {static_cast<uint32_t>(dataCapacity)};
+Buffer::Buffer(const Device &device, const size_t size) : fd(-1), dataPtr(nullptr), dataSize(size) {
+ ethosu_uapi_buffer_create uapi = {static_cast<uint32_t>(dataSize)};
fd = device.ioctl(ETHOSU_IOCTL_BUFFER_CREATE, static_cast<void *>(&uapi));
void *d;
try {
- d = emmap(nullptr, dataCapacity, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ d = emmap(nullptr, dataSize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
} catch (std::exception &e) {
try {
eclose(fd);
@@ -295,13 +294,13 @@ Buffer::Buffer(const Device &device, const size_t capacity) : fd(-1), dataPtr(nu
dataPtr = reinterpret_cast<char *>(d);
- Log(Severity::Info) << "Buffer(" << &device << ", " << dec << capacity << "), this=" << this << ", fd=" << fd
+ Log(Severity::Info) << "Buffer(" << &device << ", " << dec << size << "), this=" << this << ", fd=" << fd
<< ", dataPtr=" << static_cast<void *>(dataPtr) << endl;
}
Buffer::~Buffer() noexcept(false) {
try {
- emunmap(dataPtr, dataCapacity);
+ emunmap(dataPtr, dataSize);
} catch (std::exception &e) {
try {
eclose(fd);
@@ -314,35 +313,16 @@ Buffer::~Buffer() noexcept(false) {
Log(Severity::Info) << "~Buffer(). this=" << this << endl;
}
-size_t Buffer::capacity() const {
- return dataCapacity;
-}
-
void Buffer::clear() const {
- resize(0, 0);
+ memset(dataPtr, 0, dataSize);
}
char *Buffer::data() const {
- return dataPtr + offset();
-}
-
-void Buffer::resize(size_t size, size_t offset) const {
- ethosu_uapi_buffer uapi;
- uapi.offset = offset;
- uapi.size = size;
- eioctl(fd, ETHOSU_IOCTL_BUFFER_SET, static_cast<void *>(&uapi));
-}
-
-size_t Buffer::offset() const {
- ethosu_uapi_buffer uapi;
- eioctl(fd, ETHOSU_IOCTL_BUFFER_GET, static_cast<void *>(&uapi));
- return uapi.offset;
+ return dataPtr;
}
size_t Buffer::size() const {
- ethosu_uapi_buffer uapi;
- eioctl(fd, ETHOSU_IOCTL_BUFFER_GET, static_cast<void *>(&uapi));
- return uapi.size;
+ return dataSize;
}
int Buffer::getFd() const {