PR-URL: https://github.com/nodejs/node/pull/53464 Reviewed-By: Chemi Atlow <chemi@atlow.co.il> Reviewed-By: Marco Ippolito <marcoippolito54@gmail.com> Reviewed-By: Rafael Gonzaga <rafael.nunu@hotmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
136 lines
3.4 KiB
C++
136 lines
3.4 KiB
C++
/*
|
|
* Copyright (C) 2024 Intel Corporation. All rights reserved.
|
|
* Authors:
|
|
* Gustavo A Espinoza <gustavo.adolfo.espinoza.quintero@intel.com>
|
|
* <gustavoaespinozaq@hotmail.com>
|
|
*
|
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
|
*/
|
|
#include <qat/qae_mem.h>
|
|
|
|
#include <iostream>
|
|
#include <vector>
|
|
|
|
#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<std::shared_ptr<Instance>> 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<CpaBufferList*>(num_intermediate_buffer_lists_, 0);
|
|
}
|
|
for (int i = 0; i < num_intermediate_buffer_lists_; ++i) {
|
|
intermediate_buffer_array_[i] = AllocBlock<CpaBufferList>(0);
|
|
intermediate_buffer_array_[i]->pPrivateMetaData =
|
|
AllocBlockArray<uint8_t>(buffer_metadata_size, 0);
|
|
intermediate_buffer_array_[i]->pBuffers = AllocBlock<CpaFlatBuffer>(0);
|
|
intermediate_buffer_array_[i]->pBuffers->pData =
|
|
AllocBlockArray<uint8_t>(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<std::mutex> 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<std::shared_ptr<Instance>> Instance::Create()
|
|
{
|
|
std::lock_guard<std::mutex> 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<CpaInstanceHandle> handles(num_instances);
|
|
cpaDcGetInstances(num_instances, handles.data());
|
|
|
|
for(auto& handle: handles) {
|
|
instances.emplace_back(std::make_shared<Instance>(handle));
|
|
}
|
|
|
|
return instances;
|
|
}
|
|
|
|
}
|