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