/* * Copyright (C) 2024 Intel Corporation. All rights reserved. * Authors: * Gustavo A Espinoza * * * For conditions of distribution and use, see copyright notice in zlib.h */ #include #include #include #include "memory.hpp" #include "qat_instance.hpp" #include "session.hpp" #define MAX_SAMPLE_BUFFER_SIZE (4*1024*1024) namespace qat { static std::mutex g_instance_mutex; static std::vector> instances; static CpaPhysicalAddr virt2Phys(void *virt_addr) { return (CpaPhysicalAddr)qaeVirtToPhysNUMA(virt_addr); } Instance::Instance(CpaInstanceHandle instance): instance_(instance), num_intermediate_buffer_lists_(0), intermediate_buffer_array_(nullptr), started_(false) { CpaDcInstanceCapabilities caps{}; cpaDcQueryCapabilities(instance_, &caps); if (!caps.statelessDeflateCompression || !caps.statelessDeflateDecompression || !caps.checksumAdler32 || !caps.dynamicHuffman) { return; } if (caps.dynamicHuffmanBufferReq) { uint32_t buffer_metadata_size; cpaDcBufferListGetMetaSize(instance_, 1, &buffer_metadata_size); cpaDcGetNumIntermediateBuffers(instance_, &num_intermediate_buffer_lists_); if(num_intermediate_buffer_lists_) { intermediate_buffer_array_ = AllocBlockArray(num_intermediate_buffer_lists_, 0); } for (int i = 0; i < num_intermediate_buffer_lists_; ++i) { intermediate_buffer_array_[i] = AllocBlock(0); intermediate_buffer_array_[i]->pPrivateMetaData = AllocBlockArray(buffer_metadata_size, 0); intermediate_buffer_array_[i]->pBuffers = AllocBlock(0); intermediate_buffer_array_[i]->pBuffers->pData = AllocBlockArray(MAX_SAMPLE_BUFFER_SIZE, 0); intermediate_buffer_array_[i]->pBuffers->dataLenInBytes = MAX_SAMPLE_BUFFER_SIZE; } } cpaDcSetAddressTranslation(instance_, virt2Phys); } Instance::~Instance() { } CpaDcInstanceCapabilities Instance::GetCapabilities() { CpaDcInstanceCapabilities caps{}; cpaDcQueryCapabilities(instance_, &caps); return caps; } CpaInstanceInfo2 Instance::GetInfo() { CpaInstanceInfo2 info{}; cpaDcInstanceGetInfo2(instance_, &info); return info; } int Instance::Start() { std::lock_guard lock(mutex_); if (started_) { return 0; } int ret = cpaDcStartInstance ( instance_, num_intermediate_buffer_lists_, intermediate_buffer_array_ ); if (ret) { return -1; } started_ = true; return 0; } std::vector> Instance::Create() { std::lock_guard lock(g_instance_mutex); uint16_t num_instances = 0; if (!instances.empty()) { return instances; } cpaDcGetNumInstances(&num_instances); if (!num_instances) { std::cerr << "No instances found\n"; return {}; } std::vector handles(num_instances); cpaDcGetInstances(num_instances, handles.data()); for(auto& handle: handles) { instances.emplace_back(std::make_shared(handle)); } return instances; } }