#if HAVE_CONFIG_H
#include <config.h>
#endif
#include "ofi_hmem.h"
#include "ofi.h"
#if HAVE_SYNAPSEAI
#include <dlfcn.h>
#include "habanalabs/synapse_api.h"
struct synapseai_ops {
synStatus (*synInitialize)(void);
synStatus (*synDestroy)(void);
synStatus (*synDeviceGetCount)(uint32_t* pCount);
int (*hcclLookupDMABuff)(uint64_t addr, uint64_t size, int* fd);
};
static void *synapseai_handle;
static struct synapseai_ops synapseai_ops;
int synapseai_dl_init(void)
{
synapseai_handle = dlopen("libSynapse.so", RTLD_NOW);
if (!synapseai_handle) {
FI_INFO(&core_prov, FI_LOG_CORE,
"Failed to dlopen libSynapse.so\n");
return -FI_ENOSYS;
}
synapseai_ops.synInitialize = dlsym(synapseai_handle, "synInitialize");
if (!synapseai_ops.synInitialize) {
FI_WARN(&core_prov, FI_LOG_CORE,
"Failed to find synInitialize\n");
goto err;
}
synapseai_ops.synDestroy = dlsym(synapseai_handle, "synDestroy");
if (!synapseai_ops.synDestroy) {
FI_WARN(&core_prov, FI_LOG_CORE,
"Failed to find synDestroy\n");
goto err;
}
synapseai_ops.synDeviceGetCount = dlsym(synapseai_handle, "synDeviceGetCount");
if (!synapseai_ops.synDeviceGetCount) {
FI_WARN(&core_prov, FI_LOG_CORE,
"Failed to find synDeviceGetCount\n");
goto err;
}
synapseai_ops.hcclLookupDMABuff = dlsym(synapseai_handle, "hcclLookupDMABuff");
if (!synapseai_ops.hcclLookupDMABuff) {
FI_WARN(&core_prov, FI_LOG_CORE,
"Failed to find hcclLookupDMABuff\n");
goto err;
}
return FI_SUCCESS;
err:
dlclose(synapseai_handle);
return -FI_ENODATA;
}
int synapseai_init(void)
{
int err;
synStatus status;
uint32_t device_count = 0;
err = synapseai_dl_init();
if (err)
return err;
status = synapseai_ops.synInitialize();
if (status != synSuccess) {
FI_WARN(&core_prov, FI_LOG_CORE,
"synInitialize failed: %d\n", status);
return -FI_EIO;
}
status = synapseai_ops.synDeviceGetCount(&device_count);
if (status != synSuccess) {
FI_WARN(&core_prov, FI_LOG_CORE,
"synDeviceGetCount failed: %d\n", status);
return -FI_EIO;
}
if (device_count == 0)
return -FI_ENOSYS;
return FI_SUCCESS;
}
int synapseai_cleanup(void)
{
dlclose(synapseai_handle);
return FI_SUCCESS;
}
int synapseai_copy_to_hmem(uint64_t device, void *dest, const void *src,
size_t size)
{
return -FI_ENOSYS;
}
int synapseai_copy_from_hmem(uint64_t device, void *dest, const void *src,
size_t size)
{
return -FI_ENOSYS;
}
bool synapseai_is_addr_valid(const void *addr, uint64_t *device,
uint64_t *flags)
{
return false;
}
int synapseai_host_register(void *ptr, size_t size)
{
return FI_SUCCESS;
}
int synapseai_host_unregister(void *ptr)
{
return FI_SUCCESS;
}
int synapseai_get_dmabuf_fd(const void *addr, uint64_t size, int *fd,
uint64_t *offset)
{
int ret;
ret = synapseai_ops.hcclLookupDMABuff((uintptr_t)addr, size, fd);
if (*fd < 0) {
FI_WARN(&core_prov, FI_LOG_CORE,
"hcclLookupDMABuff failed, ret: %d\n", ret);
return -FI_EIO;
}
*offset = 0;
return FI_SUCCESS;
}
#else
int synapseai_init(void)
{
return -FI_ENOSYS;
}
int synapseai_cleanup(void)
{
return -FI_ENOSYS;
}
int synapseai_copy_to_hmem(uint64_t device, void *dest, const void *src,
size_t size)
{
return -FI_ENOSYS;
}
int synapseai_copy_from_hmem(uint64_t device, void *dest, const void *src,
size_t size)
{
return -FI_ENOSYS;
}
bool synapseai_is_addr_valid(const void *addr, uint64_t *device,
uint64_t *flags)
{
return false;
}
int synapseai_host_register(void *ptr, size_t size)
{
return -FI_ENOSYS;
}
int synapseai_host_unregister(void *ptr)
{
return -FI_ENOSYS;
}
int synapseai_get_dmabuf_fd(const void *addr, uint64_t size, int *fd,
uint64_t *offset)
{
return -FI_ENOSYS;
}
#endif