59{
60 if (_buffer && _buffer->addr != nullptr)
61 {
62
63 return;
64 }
65
66 if (!_buffer)
67 {
68 _buffer = new generic_buffer{};
69 }
70
71
72 char devname[16];
73 snprintf(devname, sizeof(devname), "/dev/triv2-%d", _device_id);
74 _dev_fd = open(devname, O_RDWR);
75 if (_dev_fd < 0)
76 {
77 throw std::runtime_error("Failed to open NPU device: " + std::string(devname));
78 }
79
80
81 struct trix_ioctl_hwmem hwmem;
83 hwmem.size = getAlignedSize(_size);
84
86 if (_buffer->dmabuf < 0)
87 {
88 close(_dev_fd);
89 _dev_fd = -1;
90 throw std::runtime_error("Failed to allocate DMA buffer, size: " + std::to_string(hwmem.size));
91 }
92
93
94 _buffer->addr = mmap(nullptr, hwmem.size, PROT_READ | PROT_WRITE, MAP_SHARED, _buffer->dmabuf, 0);
95 if (_buffer->addr == MAP_FAILED)
96 {
97 close(_buffer->dmabuf);
98 close(_dev_fd);
99 _buffer->dmabuf = -1;
100 _dev_fd = -1;
101 _buffer->addr = nullptr;
102 throw std::runtime_error("Failed to mmap DMA buffer");
103 }
104
105 _buffer->size = _size;
106 _buffer->type = BUFFER_DMABUF;
107}
#define TRIX_IOCTL_HWMEM_ALLOC