1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
11 namespace GNAPluginNS {
20 * @brief region of firmware data
32 const void *_ptr_in = nullptr;
33 std::function<void(void * data, size_t size)> _initializer;
34 // holds arbitrary value
35 std::vector<uint8_t> _data;
36 uint8_t _element_size;
40 // expansion in bytes due to large depended layers
42 MemRequest(rRegion region,
46 uint8_t element_size = 0,
47 size_t num_elements = 0,
49 size_t offset = 0) : _region(region),
53 _element_size(element_size),
54 _num_elements(num_elements),
55 _alignment(alignment),
59 * Store value only request
68 MemRequest(rRegion region,
72 size_t alignment = 1) : _region(region),
75 _element_size(sizeof(T)),
76 _num_elements(num_elements),
77 _alignment(alignment) {
78 _data.resize(sizeof(T));
79 std::copy(reinterpret_cast<uint8_t *>(&element), reinterpret_cast<uint8_t *>(&element) + sizeof(T), _data.begin());
82 * Store initializer request
89 MemRequest(rRegion region,
92 std::function<void(void * data, size_t size)> initializer,
93 size_t alignment = 1) : _region(region),
94 _type(REQUEST_INITIALIZER),
97 _num_elements(regionSize),
98 _alignment(alignment),
99 _initializer(initializer) {
104 * Adapter for requests submission and actual request queue
106 class GNAMemRequestsQueue {
108 virtual ~GNAMemRequestsQueue() {}
111 * @brief register initialiser to access memory once it is actually allocated
117 void push_initializer(void *ptr_out, size_t num_bytes, std::function<void(void * data, size_t size)> initializer, size_t alignment = 1) {
118 futureHeap().push_back({regionType(), ptr_out, num_bytes, initializer, alignment});
121 void push_ptr(void *ptr_out, const void *ptr_in, size_t num_bytes, size_t alignment = 1) {
122 futureHeap().push_back({regionType(), REQUEST_STORE, ptr_out, ptr_in, 1, num_bytes, alignment});
126 * copy input to intermediate buffer
131 void push_local_ptr(void *ptr_out, const void *ptr_in, size_t num_bytes, size_t alignment = 1) {
132 localStorage().emplace_back(reinterpret_cast<const uint8_t *>(ptr_in),
133 reinterpret_cast<const uint8_t *>(ptr_in) + num_bytes);
134 futureHeap().push_back({regionType(), REQUEST_STORE, ptr_out, &localStorage().back().front(), 1, num_bytes, alignment});
142 void reserve_ptr(void *ptr_out, size_t num_bytes) {
143 futureHeap().push_back({regionType(), REQUEST_ALLOCATE, ptr_out, nullptr, 1, num_bytes});
149 * @param dest - source is binded to dest pointer after allocation
150 * @param offset - offset in bytes in sourse that will be set in dest
151 * @param num_bytes - bind can request for bigger buffer that originally allocated via reserve(),
152 * if that happens - reserved request parameters will be updated bero commiting memory
154 void bind_ptr(void *source, const void *dest, size_t offset = 0, size_t num_bytes = 0) {
155 futureHeap().push_back({regionType(), REQUEST_BIND, source, dest, 1, num_bytes, 1, offset});
158 * @brief allocates buffer and set all its values to T value
161 void push_value(void *ptr_out, T value, size_t num_elements, size_t alignment = 1) {
162 futureHeap().push_back({regionType(), ptr_out, value, num_elements, alignment});
166 * @brief interface for actual queue storage
168 virtual rRegion regionType() const = 0;
169 virtual std::vector<MemRequest> & futureHeap() = 0;
170 virtual std::list<std::vector<char>> &localStorage() = 0;
175 } // namespace GNAPluginNS