|
Packit |
534379 |
// Copyright(c) 2017-2020, Intel Corporation
|
|
Packit |
534379 |
//
|
|
Packit |
534379 |
// Redistribution and use in source and binary forms, with or without
|
|
Packit |
534379 |
// modification, are permitted provided that the following conditions are met:
|
|
Packit |
534379 |
//
|
|
Packit |
534379 |
// * Redistributions of source code must retain the above copyright notice,
|
|
Packit |
534379 |
// this list of conditions and the following disclaimer.
|
|
Packit |
534379 |
// * Redistributions in binary form must reproduce the above copyright notice,
|
|
Packit |
534379 |
// this list of conditions and the following disclaimer in the documentation
|
|
Packit |
534379 |
// and/or other materials provided with the distribution.
|
|
Packit |
534379 |
// * Neither the name of Intel Corporation nor the names of its contributors
|
|
Packit |
534379 |
// may be used to endorse or promote products derived from this software
|
|
Packit |
534379 |
// without specific prior written permission.
|
|
Packit |
534379 |
//
|
|
Packit |
534379 |
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
Packit |
534379 |
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
Packit |
534379 |
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
Packit |
534379 |
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
Packit |
534379 |
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
Packit |
534379 |
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
Packit |
534379 |
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
Packit |
534379 |
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
Packit |
534379 |
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
Packit |
534379 |
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
Packit |
534379 |
// POSSIBILITY OF SUCH DAMAGE.
|
|
Packit |
534379 |
#include <opae/fpga.h>
|
|
Packit |
534379 |
|
|
Packit |
534379 |
extern "C" {
|
|
Packit |
534379 |
fpga_result send_fme_event_request(fpga_handle, fpga_event_handle, int);
|
|
Packit |
534379 |
fpga_result send_port_event_request(fpga_handle, fpga_event_handle, int);
|
|
Packit |
534379 |
fpga_result send_uafu_event_request(fpga_handle, fpga_event_handle, uint32_t, int);
|
|
Packit |
534379 |
fpga_result check_interrupts_supported(fpga_handle, fpga_objtype*);
|
|
Packit |
534379 |
fpga_result driver_register_event(fpga_handle, fpga_event_type, fpga_event_handle, uint32_t);
|
|
Packit |
534379 |
fpga_result driver_unregister_event(fpga_handle, fpga_event_type, fpga_event_handle);
|
|
Packit |
534379 |
int xfpga_plugin_initialize(void);
|
|
Packit |
534379 |
int xfpga_plugin_finalize(void);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
#include "intel-fpga.h"
|
|
Packit |
534379 |
#include <stdlib.h>
|
|
Packit |
534379 |
#include <unistd.h>
|
|
Packit |
534379 |
#include <chrono>
|
|
Packit |
534379 |
#include <thread>
|
|
Packit |
534379 |
#include <string>
|
|
Packit |
534379 |
#include <cstring>
|
|
Packit |
534379 |
#include "types_int.h"
|
|
Packit |
534379 |
#include "gtest/gtest.h"
|
|
Packit |
534379 |
#include "mock/test_system.h"
|
|
Packit |
534379 |
#include "mock/fpgad_control.h"
|
|
Packit |
534379 |
|
|
Packit |
534379 |
#include "error_int.h"
|
|
Packit |
534379 |
#include "xfpga.h"
|
|
Packit |
534379 |
#include <opae/enum.h>
|
|
Packit |
534379 |
#include <opae/properties.h>
|
|
Packit |
534379 |
#include <opae/access.h>
|
|
Packit |
534379 |
#include <linux/ioctl.h>
|
|
Packit |
534379 |
#include <poll.h>
|
|
Packit |
534379 |
#include <dlfcn.h>
|
|
Packit |
534379 |
|
|
Packit |
534379 |
#undef FPGA_MSG
|
|
Packit |
534379 |
#define FPGA_MSG(fmt, ...) \
|
|
Packit |
534379 |
printf("MOCK " fmt "\n", ## __VA_ARGS__)
|
|
Packit |
534379 |
|
|
Packit |
534379 |
#undef FPGA_ERR
|
|
Packit |
534379 |
#define FPGA_ERR(fmt, ...) \
|
|
Packit |
534379 |
printf("MOCK ERROR " fmt "\n", ## __VA_ARGS__)
|
|
Packit |
534379 |
|
|
Packit |
534379 |
using namespace opae::testing;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
static std::string sysfs_fme = "/sys/class/fpga/intel-fpga-dev.0/intel-fpga-fme.0";
|
|
Packit |
534379 |
static std::string dev_fme = "/dev/intel-fpga-fme.0";
|
|
Packit |
534379 |
static std::string sysfs_port = "/sys/class/fpga/intel-fpga-dev.0/intel-fpga-port.0";
|
|
Packit |
534379 |
static std::string dev_port = "/dev/intel-fpga-port.0";
|
|
Packit |
534379 |
static bool gEnableIRQ = false;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
static void get_path(const std::string object_type, fpga_handle handle){
|
|
Packit |
534379 |
auto h = (struct _fpga_handle*)handle;
|
|
Packit |
534379 |
auto tok = (struct _fpga_token*)h->token;
|
|
Packit |
534379 |
if (object_type.compare("fme") == 0)
|
|
Packit |
534379 |
{
|
|
Packit |
534379 |
sysfs_fme = tok->sysfspath;
|
|
Packit |
534379 |
dev_fme = tok->devpath;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
else if (object_type.compare("port") == 0)
|
|
Packit |
534379 |
{
|
|
Packit |
534379 |
sysfs_port = tok->sysfspath;
|
|
Packit |
534379 |
dev_port = tok->devpath;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
int port_info(mock_object * m, int request, va_list argp){
|
|
Packit |
534379 |
int retval = -1;
|
|
Packit |
534379 |
errno = EINVAL;
|
|
Packit |
534379 |
UNUSED_PARAM(m);
|
|
Packit |
534379 |
UNUSED_PARAM(request);
|
|
Packit |
534379 |
struct fpga_port_info *pinfo = va_arg(argp, struct fpga_port_info *);
|
|
Packit |
534379 |
if (!pinfo) {
|
|
Packit |
534379 |
FPGA_MSG("pinfo is NULL");
|
|
Packit |
534379 |
goto out_EINVAL;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
if (pinfo->argsz != sizeof(*pinfo)) {
|
|
Packit |
534379 |
FPGA_MSG("wrong structure size");
|
|
Packit |
534379 |
goto out_EINVAL;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
pinfo->flags = 0;
|
|
Packit |
534379 |
pinfo->num_regions = 1;
|
|
Packit |
534379 |
pinfo->num_umsgs = 8;
|
|
Packit |
534379 |
if (gEnableIRQ) {
|
|
Packit |
534379 |
pinfo->capability = FPGA_PORT_CAP_ERR_IRQ | FPGA_PORT_CAP_UAFU_IRQ;
|
|
Packit |
534379 |
pinfo->num_uafu_irqs = 1;
|
|
Packit |
534379 |
} else {
|
|
Packit |
534379 |
pinfo->capability = 0;
|
|
Packit |
534379 |
pinfo->num_uafu_irqs = 0;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
retval = 0;
|
|
Packit |
534379 |
errno = 0;
|
|
Packit |
534379 |
out:
|
|
Packit |
534379 |
va_end(argp);
|
|
Packit |
534379 |
return retval;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
out_EINVAL:
|
|
Packit |
534379 |
retval = -1;
|
|
Packit |
534379 |
errno = EINVAL;
|
|
Packit |
534379 |
goto out;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
int fme_info(mock_object * m, int request, va_list argp){
|
|
Packit |
534379 |
int retval = -1;
|
|
Packit |
534379 |
errno = EINVAL;
|
|
Packit |
534379 |
UNUSED_PARAM(m);
|
|
Packit |
534379 |
UNUSED_PARAM(request);
|
|
Packit |
534379 |
struct fpga_fme_info *fme_info = va_arg(argp, struct fpga_fme_info *);
|
|
Packit |
534379 |
if (!fme_info) {
|
|
Packit |
534379 |
FPGA_MSG("fme_info is NULL");
|
|
Packit |
534379 |
goto out_EINVAL;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
if (fme_info->argsz != sizeof(*fme_info)) {
|
|
Packit |
534379 |
FPGA_MSG("wrong structure size");
|
|
Packit |
534379 |
goto out_EINVAL;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
if (fme_info->flags != 0) {
|
|
Packit |
534379 |
FPGA_MSG("unexpected flags %u", fme_info->flags);
|
|
Packit |
534379 |
goto out_EINVAL;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
if (fme_info->capability != 0) {
|
|
Packit |
534379 |
FPGA_MSG("unexpected capability %u", fme_info->capability);
|
|
Packit |
534379 |
goto out_EINVAL;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
fme_info->capability = gEnableIRQ ? FPGA_FME_CAP_ERR_IRQ : 0;
|
|
Packit |
534379 |
retval = 0;
|
|
Packit |
534379 |
errno = 0;
|
|
Packit |
534379 |
out:
|
|
Packit |
534379 |
va_end(argp);
|
|
Packit |
534379 |
return retval;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
out_EINVAL:
|
|
Packit |
534379 |
retval = -1;
|
|
Packit |
534379 |
errno = EINVAL;
|
|
Packit |
534379 |
goto out;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
int set_port_irq(mock_object * m, int request, va_list argp){
|
|
Packit |
534379 |
int retval = -1;
|
|
Packit |
534379 |
errno = EINVAL;
|
|
Packit |
534379 |
UNUSED_PARAM(m);
|
|
Packit |
534379 |
UNUSED_PARAM(request);
|
|
Packit |
534379 |
struct fpga_port_err_irq_set *port_irq = va_arg(argp, struct fpga_port_err_irq_set *);
|
|
Packit |
534379 |
if (!port_irq) {
|
|
Packit |
534379 |
FPGA_MSG("port_irq is NULL");
|
|
Packit |
534379 |
goto out_EINVAL;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
if (port_irq->argsz != sizeof(*port_irq)) {
|
|
Packit |
534379 |
FPGA_MSG("wrong structure size");
|
|
Packit |
534379 |
goto out_EINVAL;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
if (port_irq->flags != 0) {
|
|
Packit |
534379 |
FPGA_MSG("unexpected flags %u", port_irq->flags);
|
|
Packit |
534379 |
goto out_EINVAL;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
if (gEnableIRQ && port_irq->evtfd >= 0) {
|
|
Packit |
534379 |
uint64_t data = 1;
|
|
Packit |
534379 |
// Write to the eventfd to signal one IRQ event.
|
|
Packit |
534379 |
if (write(port_irq->evtfd, &data, sizeof(data)) != sizeof(data)) {
|
|
Packit |
534379 |
FPGA_ERR("IRQ write < 8 bytes");
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
retval = 0;
|
|
Packit |
534379 |
errno = 0;
|
|
Packit |
534379 |
out:
|
|
Packit |
534379 |
va_end(argp);
|
|
Packit |
534379 |
return retval;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
out_EINVAL:
|
|
Packit |
534379 |
retval = -1;
|
|
Packit |
534379 |
errno = EINVAL;
|
|
Packit |
534379 |
goto out;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
int set_fme_irq(mock_object * m, int request, va_list argp){
|
|
Packit |
534379 |
int retval = -1;
|
|
Packit |
534379 |
errno = EINVAL;
|
|
Packit |
534379 |
UNUSED_PARAM(m);
|
|
Packit |
534379 |
UNUSED_PARAM(request);
|
|
Packit |
534379 |
struct fpga_fme_err_irq_set *fme_irq = va_arg(argp, struct fpga_fme_err_irq_set *);
|
|
Packit |
534379 |
if (!fme_irq) {
|
|
Packit |
534379 |
FPGA_MSG("fme_irq is NULL");
|
|
Packit |
534379 |
goto out_EINVAL;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
if (fme_irq->argsz != sizeof(*fme_irq)) {
|
|
Packit |
534379 |
FPGA_MSG("wrong structure size");
|
|
Packit |
534379 |
goto out_EINVAL;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
if (fme_irq->flags != 0) {
|
|
Packit |
534379 |
FPGA_MSG("unexpected flags %u", fme_irq->flags);
|
|
Packit |
534379 |
goto out_EINVAL;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
if (gEnableIRQ && fme_irq->evtfd >= 0) {
|
|
Packit |
534379 |
uint64_t data = 1;
|
|
Packit |
534379 |
// Write to the eventfd to signal one IRQ event.
|
|
Packit |
534379 |
if (write(fme_irq->evtfd, &data, sizeof(data)) != sizeof(data)) {
|
|
Packit |
534379 |
FPGA_ERR("IRQ write < 8 bytes");
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
retval = 0;
|
|
Packit |
534379 |
errno = 0;
|
|
Packit |
534379 |
out:
|
|
Packit |
534379 |
va_end(argp);
|
|
Packit |
534379 |
return retval;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
out_EINVAL:
|
|
Packit |
534379 |
retval = -1;
|
|
Packit |
534379 |
errno = EINVAL;
|
|
Packit |
534379 |
goto out;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
int set_uport_irq(mock_object * m, int request, va_list argp){
|
|
Packit |
534379 |
int retval = -1;
|
|
Packit |
534379 |
errno = EINVAL;
|
|
Packit |
534379 |
UNUSED_PARAM(m);
|
|
Packit |
534379 |
UNUSED_PARAM(request);
|
|
Packit |
534379 |
struct fpga_port_uafu_irq_set *uafu_irq =
|
|
Packit |
534379 |
va_arg(argp, struct fpga_port_uafu_irq_set *);
|
|
Packit |
534379 |
if (!uafu_irq) {
|
|
Packit |
534379 |
FPGA_MSG("uafu_irq is NULL");
|
|
Packit |
534379 |
goto out_EINVAL;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
if (uafu_irq->argsz < sizeof(*uafu_irq)) {
|
|
Packit |
534379 |
FPGA_MSG("wrong structure size");
|
|
Packit |
534379 |
goto out_EINVAL;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
if (uafu_irq->flags != 0) {
|
|
Packit |
534379 |
FPGA_MSG("unexpected flags %u", uafu_irq->flags);
|
|
Packit |
534379 |
goto out_EINVAL;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
if (gEnableIRQ) {
|
|
Packit |
534379 |
uint32_t i;
|
|
Packit |
534379 |
uint64_t data = 1;
|
|
Packit |
534379 |
// Write to each eventfd to signal one IRQ event.
|
|
Packit |
534379 |
for (i = 0 ; i < uafu_irq->count ; ++i) {
|
|
Packit |
534379 |
if (uafu_irq->evtfd[i] >= 0)
|
|
Packit |
534379 |
if (write(uafu_irq->evtfd[i], &data, sizeof(data)) !=
|
|
Packit |
534379 |
sizeof(data)) {
|
|
Packit |
534379 |
FPGA_ERR("IRQ write < 8 bytes");
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
retval = 0;
|
|
Packit |
534379 |
errno = 0;
|
|
Packit |
534379 |
out:
|
|
Packit |
534379 |
va_end(argp);
|
|
Packit |
534379 |
return retval;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
out_EINVAL:
|
|
Packit |
534379 |
retval = -1;
|
|
Packit |
534379 |
errno = EINVAL;
|
|
Packit |
534379 |
goto out;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
class events_p : public ::testing::TestWithParam<std::string>,
|
|
Packit |
534379 |
public fpgad_control {
|
|
Packit |
534379 |
protected:
|
|
Packit |
534379 |
events_p()
|
|
Packit |
534379 |
: tokens_dev_{{nullptr, nullptr}},
|
|
Packit |
534379 |
tokens_accel_{{nullptr, nullptr}},
|
|
Packit |
534379 |
handle_dev_(nullptr),
|
|
Packit |
534379 |
handle_accel_(nullptr) {}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
virtual void SetUp() override {
|
|
Packit |
534379 |
std::string platform_key = GetParam();
|
|
Packit |
534379 |
ASSERT_TRUE(test_platform::exists(platform_key));
|
|
Packit |
534379 |
platform_ = test_platform::get(platform_key);
|
|
Packit |
534379 |
system_ = test_system::instance();
|
|
Packit |
534379 |
system_->initialize();
|
|
Packit |
534379 |
system_->prepare_syfs(platform_);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
ASSERT_EQ(FPGA_OK, xfpga_plugin_initialize());
|
|
Packit |
534379 |
|
|
Packit |
534379 |
ASSERT_EQ(xfpga_fpgaGetProperties(nullptr, &filter_dev_), FPGA_OK);
|
|
Packit |
534379 |
ASSERT_EQ(fpgaPropertiesSetDeviceID(filter_dev_,
|
|
Packit |
534379 |
platform_.devices[0].device_id), FPGA_OK);
|
|
Packit |
534379 |
ASSERT_EQ(fpgaPropertiesSetObjectType(filter_dev_, FPGA_DEVICE), FPGA_OK);
|
|
Packit |
534379 |
ASSERT_EQ(xfpga_fpgaEnumerate(&filter_dev_, 1, tokens_dev_.data(), tokens_dev_.size(),
|
|
Packit |
534379 |
&num_matches_dev_), FPGA_OK);
|
|
Packit |
534379 |
ASSERT_GT(num_matches_dev_, 0);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
ASSERT_EQ(xfpga_fpgaGetProperties(nullptr, &filter_accel_), FPGA_OK);
|
|
Packit |
534379 |
ASSERT_EQ(fpgaPropertiesSetDeviceID(filter_accel_,
|
|
Packit |
534379 |
platform_.devices[0].device_id), FPGA_OK);
|
|
Packit |
534379 |
ASSERT_EQ(fpgaPropertiesSetObjectType(filter_accel_, FPGA_ACCELERATOR), FPGA_OK);
|
|
Packit |
534379 |
ASSERT_EQ(xfpga_fpgaEnumerate(&filter_accel_, 1, tokens_accel_.data(),
|
|
Packit |
534379 |
tokens_accel_.size(), &num_matches_), FPGA_OK);
|
|
Packit |
534379 |
ASSERT_GT(num_matches_, 0);
|
|
Packit |
534379 |
ASSERT_EQ(xfpga_fpgaOpen(tokens_dev_[0], &handle_dev_, 0), FPGA_OK);
|
|
Packit |
534379 |
ASSERT_EQ(xfpga_fpgaOpen(tokens_accel_[0], &handle_accel_, 0), FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
get_path("fme", handle_dev_);
|
|
Packit |
534379 |
get_path("port", handle_accel_);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
ASSERT_EQ(xfpga_fpgaCreateEventHandle(&eh_), FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
fpgad_start();
|
|
Packit |
534379 |
|
|
Packit |
534379 |
uint32_t i;
|
|
Packit |
534379 |
for (i = 0 ; i < num_matches_dev_ ; ++i) {
|
|
Packit |
534379 |
fpgad_watch(tokens_dev_[i]);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
for (i = 0 ; i < num_matches_ ; ++i) {
|
|
Packit |
534379 |
fpgad_watch(tokens_accel_[i]);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
virtual void TearDown() override {
|
|
Packit |
534379 |
fpgad_stop();
|
|
Packit |
534379 |
|
|
Packit |
534379 |
EXPECT_EQ(xfpga_fpgaDestroyEventHandle(&eh_), FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
EXPECT_EQ(fpgaDestroyProperties(&filter_dev_), FPGA_OK);
|
|
Packit |
534379 |
EXPECT_EQ(fpgaDestroyProperties(&filter_accel_), FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
if (handle_dev_) {
|
|
Packit |
534379 |
EXPECT_EQ(xfpga_fpgaClose(handle_dev_), FPGA_OK);
|
|
Packit |
534379 |
handle_dev_ = nullptr;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
if (handle_accel_) {
|
|
Packit |
534379 |
EXPECT_EQ(xfpga_fpgaClose(handle_accel_), FPGA_OK);
|
|
Packit |
534379 |
handle_accel_ = nullptr;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
for (auto &t : tokens_dev_) {
|
|
Packit |
534379 |
if (t) {
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK, xfpga_fpgaDestroyToken(&t);;
|
|
Packit |
534379 |
t = nullptr;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
for (auto &t : tokens_accel_) {
|
|
Packit |
534379 |
if (t) {
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK, xfpga_fpgaDestroyToken(&t);;
|
|
Packit |
534379 |
t = nullptr;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
xfpga_plugin_finalize();
|
|
Packit |
534379 |
system_->finalize();
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
fpga_properties filter_dev_;
|
|
Packit |
534379 |
fpga_properties filter_accel_;
|
|
Packit |
534379 |
std::array<fpga_token, 2> tokens_dev_;
|
|
Packit |
534379 |
std::array<fpga_token, 2> tokens_accel_;
|
|
Packit |
534379 |
fpga_handle handle_dev_;
|
|
Packit |
534379 |
fpga_handle handle_accel_;
|
|
Packit |
534379 |
uint32_t num_matches_dev_;
|
|
Packit |
534379 |
uint32_t num_matches_;
|
|
Packit |
534379 |
test_platform platform_;
|
|
Packit |
534379 |
test_system *system_;
|
|
Packit |
534379 |
fpga_event_handle eh_;
|
|
Packit |
534379 |
};
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/*
|
|
Packit |
534379 |
* @test event_01
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
* @brief When the fpga_event_handle pointer to
|
|
Packit |
534379 |
* fpgaCreateEventHandle() is NULL, the function returns
|
|
Packit |
534379 |
* FPGA_INVALID_PARAM.
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST(events, event_01) {
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaCreateEventHandle(NULL));
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test event_02
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
* @brief When the fpga_event_handle pointer to
|
|
Packit |
534379 |
* fpgaDestroyEventHandle() is NULL, the function returns
|
|
Packit |
534379 |
* FPGA_INVALID_PARAM.
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST(events, event_02) {
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaDestroyEventHandle(NULL));
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test event_03
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
* @brief Tests fpgaRegisterEvent()'s ability to detect invalid
|
|
Packit |
534379 |
* arguments. When the handle is NULL or otherwise invalid,
|
|
Packit |
534379 |
* FPGA_INVALID_PARAM. When the handle has an invalid token,
|
|
Packit |
534379 |
* FPGA_INVALID_PARAM. When the handle's token describes a
|
|
Packit |
534379 |
* device for which the given event does't apply,
|
|
Packit |
534379 |
* FPGA_INVALID_PARAM.
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST(events, event_03) {
|
|
Packit |
534379 |
fpga_event_type e = FPGA_EVENT_ERROR;
|
|
Packit |
534379 |
fpga_event_handle eh;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK, xfpga_fpgaCreateEventHandle(&eh));
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// NULL handle.
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaRegisterEvent(NULL, e, eh, 0));
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// handle with bad magic.
|
|
Packit |
534379 |
struct _fpga_handle _h;
|
|
Packit |
534379 |
struct _fpga_token _t;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// token setup
|
|
Packit |
534379 |
strncpy(_t.sysfspath, sysfs_port.c_str(), sysfs_port.size() + 1);
|
|
Packit |
534379 |
strncpy(_t.devpath, dev_port.c_str(), dev_port.size() + 1);
|
|
Packit |
534379 |
_t.magic = FPGA_TOKEN_MAGIC;
|
|
Packit |
534379 |
_t.errors = nullptr;
|
|
Packit |
534379 |
std::string errpath = sysfs_port + "/errors";
|
|
Packit |
534379 |
build_error_list(errpath.c_str(), &_t.errors);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
memset(&_h, 0, sizeof(_h));
|
|
Packit |
534379 |
_h.token = &_;;
|
|
Packit |
534379 |
_h.magic = FPGA_INVALID_MAGIC;
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaRegisterEvent(&_h, e, eh, 0));
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// handle with bad token.
|
|
Packit |
534379 |
_t.magic = FPGA_INVALID_MAGIC;
|
|
Packit |
534379 |
_h.magic = FPGA_HANDLE_MAGIC;
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaRegisterEvent(&_h, e, eh, 0));
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// token/event mismatch.
|
|
Packit |
534379 |
strncpy(_t.sysfspath, sysfs_fme.c_str(), sysfs_fme.size() + 1);
|
|
Packit |
534379 |
strncpy(_t.devpath, dev_fme.c_str(), dev_fme.size() + 1);
|
|
Packit |
534379 |
_t.magic = FPGA_TOKEN_MAGIC;
|
|
Packit |
534379 |
_t.errors = nullptr;
|
|
Packit |
534379 |
errpath = sysfs_fme + "/errors";
|
|
Packit |
534379 |
build_error_list(errpath.c_str(), &_t.errors);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM,
|
|
Packit |
534379 |
xfpga_fpgaRegisterEvent(&_h, FPGA_EVENT_INTERRUPT, eh, 0));
|
|
Packit |
534379 |
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK, xfpga_fpgaDestroyEventHandle(&eh));
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test event_04
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
* @brief Tests fpgaUnregisterEvent()'s ability to detect invalid
|
|
Packit |
534379 |
* arguments. When the handle is NULL or otherwise invalid,
|
|
Packit |
534379 |
* FPGA_INVALID_PARAM. When the handle has an invalid token,
|
|
Packit |
534379 |
* FPGA_INVALID_PARAM. When the handle's token describes a
|
|
Packit |
534379 |
* device for which the given event does't apply,
|
|
Packit |
534379 |
* FPGA_INVALID_PARAM.
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST(events, event_04) {
|
|
Packit |
534379 |
fpga_event_type e = FPGA_EVENT_ERROR;
|
|
Packit |
534379 |
fpga_event_handle eh;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK, xfpga_fpgaCreateEventHandle(&eh));
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// NULL handle.
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaUnregisterEvent(NULL, e, eh));
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// handle with bad magic.
|
|
Packit |
534379 |
struct _fpga_handle _h;
|
|
Packit |
534379 |
struct _fpga_token _t;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// token setup
|
|
Packit |
534379 |
strncpy(_t.sysfspath, sysfs_port.c_str(), sysfs_port.size() + 1);
|
|
Packit |
534379 |
strncpy(_t.devpath, dev_port.c_str(), dev_port.size() + 1);
|
|
Packit |
534379 |
_t.magic = FPGA_TOKEN_MAGIC;
|
|
Packit |
534379 |
_t.errors = nullptr;
|
|
Packit |
534379 |
std::string errpath = sysfs_port + "/errors";
|
|
Packit |
534379 |
build_error_list(errpath.c_str(), &_t.errors);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
memset(&_h, 0, sizeof(_h));
|
|
Packit |
534379 |
_h.token = &_;;
|
|
Packit |
534379 |
_h.magic = FPGA_INVALID_MAGIC;
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaUnregisterEvent(&_h, e, eh));
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// handle with bad token.
|
|
Packit |
534379 |
_t.magic = FPGA_INVALID_MAGIC;
|
|
Packit |
534379 |
_h.magic = FPGA_HANDLE_MAGIC;
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaUnregisterEvent(&_h, e, eh));
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// token/event mismatch.
|
|
Packit |
534379 |
strncpy(_t.sysfspath, sysfs_fme.c_str(), sysfs_fme.size() + 1);
|
|
Packit |
534379 |
strncpy(_t.devpath, dev_fme.c_str(), dev_fme.size() + 1);
|
|
Packit |
534379 |
_t.magic = FPGA_TOKEN_MAGIC;
|
|
Packit |
534379 |
_t.errors = nullptr;
|
|
Packit |
534379 |
errpath = sysfs_fme + "/errors";
|
|
Packit |
534379 |
build_error_list(errpath.c_str(), &_t.errors);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM,
|
|
Packit |
534379 |
xfpga_fpgaUnregisterEvent(&_h, FPGA_EVENT_INTERRUPT, eh));
|
|
Packit |
534379 |
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK, xfpga_fpgaDestroyEventHandle(&eh));
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test event_drv_08
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
* @brief When passed an event handle with an invalid magic
|
|
Packit |
534379 |
* fpgaDestroyEventHandle() returns FPGA_INVALID_PARAM.
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST(events, event_drv_08) {
|
|
Packit |
534379 |
fpga_event_handle bad_handle;
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK, xfpga_fpgaCreateEventHandle(&bad_handle));
|
|
Packit |
534379 |
struct _fpga_event_handle *h = (struct _fpga_event_handle *) bad_handle;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// Invalid Event Handle magic
|
|
Packit |
534379 |
h->magic=0x0;
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaDestroyEventHandle(&bad_handle));
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// reset event handle magic and destroy
|
|
Packit |
534379 |
h->magic=FPGA_EVENT_HANDLE_MAGIC;
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK, xfpga_fpgaDestroyEventHandle(&bad_handle));
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test event_drv_09
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
* @brief When passed an event handle with an invalid fd
|
|
Packit |
534379 |
* fpgaDestroyEventHandle() returns FPGA_INVALID_PARAM.
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST(events, event_drv_09) {
|
|
Packit |
534379 |
fpga_event_handle bad_handle;
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK, xfpga_fpgaCreateEventHandle(&bad_handle));
|
|
Packit |
534379 |
struct _fpga_event_handle *h = (struct _fpga_event_handle *) bad_handle;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// Invalid fd
|
|
Packit |
534379 |
auto fddev = h->fd;
|
|
Packit |
534379 |
h->fd = -1;
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaDestroyEventHandle(&bad_handle));
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// Reset fd to destroy event handle
|
|
Packit |
534379 |
h->fd = fddev;
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK, xfpga_fpgaDestroyEventHandle(&bad_handle));
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test event_drv_10
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
* @brief When passed an event handle with an invalid magic
|
|
Packit |
534379 |
* fpgaGetOSObjectFromEventHandle() returns FPGA_INVALID_PARAM.
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST(events, event_drv_10) {
|
|
Packit |
534379 |
fpga_event_handle bad_handle;
|
|
Packit |
534379 |
int fd;
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK, xfpga_fpgaCreateEventHandle(&bad_handle));
|
|
Packit |
534379 |
struct _fpga_event_handle *h = (struct _fpga_event_handle *) bad_handle;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// Invalid event handle magic
|
|
Packit |
534379 |
h->magic=0x0;
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaGetOSObjectFromEventHandle(bad_handle, &fd));
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// Reset event handle magic
|
|
Packit |
534379 |
h->magic=FPGA_EVENT_HANDLE_MAGIC;
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK, xfpga_fpgaGetOSObjectFromEventHandle(bad_handle, &fd));
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK, xfpga_fpgaDestroyEventHandle(&bad_handle));
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test register_event
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
* @brief When a valid fpga_event_handle and event types
|
|
Packit |
534379 |
* are passed to fpgaRegisterEvent and fpgaUnregisterEvent.
|
|
Packit |
534379 |
* both API calls return FPGA_OK.
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(events_p, register_event) {
|
|
Packit |
534379 |
fpga_result res;
|
|
Packit |
534379 |
gEnableIRQ = true;
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_FME_GET_INFO, fme_info);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
ASSERT_EQ(res = xfpga_fpgaRegisterEvent(handle_dev_, FPGA_EVENT_ERROR, eh_, 0), FPGA_OK)
|
|
Packit |
534379 |
<< "\tEVENT TYPE: ERROR, RESULT: " << fpgaErrStr(res);
|
|
Packit |
534379 |
EXPECT_EQ(res = xfpga_fpgaUnregisterEvent(handle_dev_, FPGA_EVENT_ERROR, eh_), FPGA_OK)
|
|
Packit |
534379 |
<< "\tRESULT: " << fpgaErrStr(res);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test event_drv_11
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
* @brief When passed an event handle with an invalid magic
|
|
Packit |
534379 |
* xfpga_fpgaUnregisterEvent() returns FPGA_INVALID_PARAM.
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(events_p, event_drv_11) {
|
|
Packit |
534379 |
fpga_event_handle bad_handle = nullptr;
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK, xfpga_fpgaCreateEventHandle(&bad_handle));
|
|
Packit |
534379 |
struct _fpga_event_handle *h = (struct _fpga_event_handle *) bad_handle;
|
|
Packit |
534379 |
// Invalid event handle magic
|
|
Packit |
534379 |
auto valid_magic = h->magic;
|
|
Packit |
534379 |
h->magic = 0x0;
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaUnregisterEvent(handle_accel_, FPGA_EVENT_INTERRUPT, bad_handle));
|
|
Packit |
534379 |
|
|
Packit |
534379 |
h->magic = valid_magic;
|
|
Packit |
534379 |
EXPECT_EQ(xfpga_fpgaDestroyEventHandle(&bad_handle), FPGA_OK);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test event_drv_12
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
* @brief When passed an event handle with an invalid magic
|
|
Packit |
534379 |
* xfpga_fpgaRegisterEvent() returns FPGA_INVALID_PARAM.
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(events_p, event_drv_12) {
|
|
Packit |
534379 |
fpga_event_handle bad_handle = nullptr;
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK, xfpga_fpgaCreateEventHandle(&bad_handle));
|
|
Packit |
534379 |
struct _fpga_event_handle *h = (struct _fpga_event_handle *) bad_handle;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
auto valid_magic = h->magic;
|
|
Packit |
534379 |
// Invalid event handle magic
|
|
Packit |
534379 |
h->magic = 0x0;
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaRegisterEvent(handle_accel_, FPGA_EVENT_INTERRUPT, bad_handle, 0));
|
|
Packit |
534379 |
h->magic = valid_magic;
|
|
Packit |
534379 |
EXPECT_EQ(xfpga_fpgaDestroyEventHandle(&bad_handle), FPGA_OK);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test create_destory_invalid
|
|
Packit |
534379 |
* @brief Given a malloc failure, fpgaCreateEventHandle returns
|
|
Packit |
534379 |
* FPGA_NO_MEMORY.
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(events_p, create_destroy_invalid) {
|
|
Packit |
534379 |
// fail malloc to check edge case
|
|
Packit |
534379 |
EXPECT_EQ(xfpga_fpgaDestroyEventHandle(&eh_), FPGA_OK);
|
|
Packit |
534379 |
test_system::instance()->invalidate_malloc();
|
|
Packit |
534379 |
|
|
Packit |
534379 |
auto res = xfpga_fpgaCreateEventHandle(&eh_);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_NO_MEMORY,res);
|
|
Packit |
534379 |
ASSERT_EQ(xfpga_fpgaCreateEventHandle(&eh_), FPGA_OK);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test irq_event_04
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
* @brief Given a driver with IRQ support
|
|
Packit |
534379 |
* when fpgaRegisterEvent is called with
|
|
Packit |
534379 |
* an invalid handle
|
|
Packit |
534379 |
* then the call fails with FPGA_INVALID_PARAM.
|
|
Packit |
534379 |
* Repeat for fpgaUnregisterEvent.
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(events_p, irq_event_04) {
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaRegisterEvent(NULL, FPGA_EVENT_INTERRUPT,
|
|
Packit |
534379 |
eh_, 0));
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaUnregisterEvent(NULL, FPGA_EVENT_INTERRUPT,
|
|
Packit |
534379 |
eh_));
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test irq_event_05
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
* @brief Given a driver with IRQ support
|
|
Packit |
534379 |
* when fpgaRegisterEvent is called with
|
|
Packit |
534379 |
* an invalid event handle
|
|
Packit |
534379 |
* then the call fails with FPGA_INVALID_PARAM.
|
|
Packit |
534379 |
* Repeat for fpgaUnregisterEvent.
|
|
Packit |
534379 |
* Repeat for fpgaDestroyEventHandle.
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(events_p, irq_event_05) {
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaRegisterEvent(handle_accel_, FPGA_EVENT_INTERRUPT,
|
|
Packit |
534379 |
NULL, 0));
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaUnregisterEvent(handle_accel_, FPGA_EVENT_INTERRUPT,
|
|
Packit |
534379 |
NULL));
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaDestroyEventHandle(NULL));
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test irq_event_06
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
* @brief Given a driver with IRQ support
|
|
Packit |
534379 |
* when fpgaRegisterEvent is called for
|
|
Packit |
534379 |
* an FPGA_DEVICE and FPGA_EVENT_INTERRUPT
|
|
Packit |
534379 |
* then the call fails with FPGA_INVALID_PARAM.
|
|
Packit |
534379 |
* Repeat for fpgaUnregisterEvent.
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(events_p, irq_event_06) {
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaRegisterEvent(handle_dev_, FPGA_EVENT_INTERRUPT,
|
|
Packit |
534379 |
eh_, 0));
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaUnregisterEvent(handle_dev_, FPGA_EVENT_INTERRUPT,
|
|
Packit |
534379 |
eh_));
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
INSTANTIATE_TEST_CASE_P(events, events_p,
|
|
Packit |
534379 |
::testing::ValuesIn(test_platform::platforms({ "skx-p","dcp-rc" })));
|
|
Packit |
534379 |
|
|
Packit |
534379 |
|
|
Packit |
534379 |
class events_dcp_p : public events_p {};
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test send_port_event_request
|
|
Packit |
534379 |
* @brief When passed a valid event handle, handle and flag.
|
|
Packit |
534379 |
* It returns FPGA_OK for dcp only.
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(events_dcp_p, invalid_port_event_request){
|
|
Packit |
534379 |
int port_op = FPGA_IRQ_ASSIGN;
|
|
Packit |
534379 |
auto res = send_port_event_request(handle_accel_,eh_,port_op);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK, res) << "\t result is " << res;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
gEnableIRQ = false;
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
|
|
Packit |
534379 |
res = send_port_event_request(handle_accel_,eh_,port_op);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK, res);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test send_fme_event_request
|
|
Packit |
534379 |
* @brief When passed a valid event handle, handle and flag.
|
|
Packit |
534379 |
* It returns FPGA_OK for dcp only.
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(events_dcp_p, invalid_fme_event_request){
|
|
Packit |
534379 |
int fme_op = FPGA_IRQ_ASSIGN;
|
|
Packit |
534379 |
auto res = send_fme_event_request(handle_dev_,eh_,fme_op);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK, res) << "\t result is " << res;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
gEnableIRQ = false;
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_FME_GET_INFO, fme_info);
|
|
Packit |
534379 |
res = send_fme_event_request(handle_dev_,eh_,fme_op);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK, res);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
INSTANTIATE_TEST_CASE_P(events, events_dcp_p,
|
|
Packit |
534379 |
::testing::ValuesIn(test_platform::hw_platforms({"dcp-rc" })));
|
|
Packit |
534379 |
|
|
Packit |
534379 |
|
|
Packit |
534379 |
class events_mcp_p : public events_p {};
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test send_port_event_request
|
|
Packit |
534379 |
* @brief When passed a valid event handle, handle and flag.
|
|
Packit |
534379 |
* It returns FPGA_NOT_SUPPORTED if interrupt is not
|
|
Packit |
534379 |
* supported or ioctl fails.
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(events_mcp_p, invalid_port_event_request){
|
|
Packit |
534379 |
int port_op = FPGA_IRQ_ASSIGN;
|
|
Packit |
534379 |
auto res = send_port_event_request(handle_accel_,eh_,port_op);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_NOT_SUPPORTED, res) << "\t result is " << res;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
gEnableIRQ = false;
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
|
|
Packit |
534379 |
res = send_port_event_request(handle_accel_,eh_,port_op);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_NOT_SUPPORTED, res);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test send_fme_event_request
|
|
Packit |
534379 |
* @brief When passed a valid event handle, handle and flag.
|
|
Packit |
534379 |
* It returns FPGA_NOT_SUPPORTED if interrupt is not
|
|
Packit |
534379 |
* supported or ioctl fails.
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(events_mcp_p, invalid_fme_event_request){
|
|
Packit |
534379 |
int fme_op = FPGA_IRQ_ASSIGN;
|
|
Packit |
534379 |
auto res = send_fme_event_request(handle_dev_,eh_,fme_op);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_NOT_SUPPORTED,res) << "\t result is " << res;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
gEnableIRQ = false;
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_FME_GET_INFO, fme_info);
|
|
Packit |
534379 |
res = send_fme_event_request(handle_dev_,eh_,fme_op);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_NOT_SUPPORTED,res);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
INSTANTIATE_TEST_CASE_P(events, events_mcp_p,
|
|
Packit |
534379 |
::testing::ValuesIn(test_platform::platforms({"skx-p" })));
|
|
Packit |
534379 |
|
|
Packit |
534379 |
|
|
Packit |
534379 |
class events_mock_p : public events_p {
|
|
Packit |
534379 |
};
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test register_event_02
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
* @brief When a valid fpga_event_handle and event types
|
|
Packit |
534379 |
* are passed to fpgaRegisterEvent and fpgaUnregisterEvent.
|
|
Packit |
534379 |
* both API calls return FPGA_OK.
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(events_mock_p, register_event_02) {
|
|
Packit |
534379 |
fpga_result res;
|
|
Packit |
534379 |
ASSERT_EQ(res = xfpga_fpgaRegisterEvent(handle_dev_, FPGA_EVENT_POWER_THERMAL, eh_, 0),
|
|
Packit |
534379 |
FPGA_OK)
|
|
Packit |
534379 |
<< "\tEVENT TYPE: ERROR, RESULT: " << fpgaErrStr(res);
|
|
Packit |
534379 |
EXPECT_EQ(res = xfpga_fpgaUnregisterEvent(handle_dev_, FPGA_EVENT_POWER_THERMAL, eh_),
|
|
Packit |
534379 |
FPGA_OK)
|
|
Packit |
534379 |
<< "\tRESULT: " << fpgaErrStr(res);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test send_fme_event_request
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
* @brief When passed a valid event handle, handle
|
|
Packit |
534379 |
* with FPGA_IRQ_ASSIGN flag.
|
|
Packit |
534379 |
* The function return FPGA_OK.
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(events_mock_p, valid_fme_event_request){
|
|
Packit |
534379 |
int fme_op = FPGA_IRQ_ASSIGN;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
gEnableIRQ = true;
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_FME_GET_INFO, fme_info);
|
|
Packit |
534379 |
auto res = send_fme_event_request(handle_dev_,eh_,fme_op);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK,res);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test send_port_event_request
|
|
Packit |
534379 |
* @brief When passed a valid event handle and handle
|
|
Packit |
534379 |
* with FPGA_IRQ_ASSIGN flag. The function
|
|
Packit |
534379 |
* returns FPGA_OK.
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(events_mock_p, valid_port_event_request){
|
|
Packit |
534379 |
int port_op = FPGA_IRQ_ASSIGN;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
gEnableIRQ = true;
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
|
|
Packit |
534379 |
auto res = send_port_event_request(handle_accel_,eh_,port_op);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK,res);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test send_port_event_request
|
|
Packit |
534379 |
* @brief When passed a valid event handle and handle
|
|
Packit |
534379 |
* with FPGA_IRQ_DEASSIGN flag. The function
|
|
Packit |
534379 |
* returns FPGA_OK.
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(events_mock_p, valid_port_event_request_01){
|
|
Packit |
534379 |
int port_op = FPGA_IRQ_DEASSIGN;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
gEnableIRQ = true;
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
|
|
Packit |
534379 |
auto res = send_port_event_request(handle_accel_,eh_,port_op);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK,res);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test send_fme_event_request
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
* @brief When passed a valid event handle and handle
|
|
Packit |
534379 |
* with FPGA_IRQ_DEASSIGN flag. The function
|
|
Packit |
534379 |
* returns FPGA_OK.
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(events_mock_p, valid_fme_event_request_01){
|
|
Packit |
534379 |
int fme_op = FPGA_IRQ_DEASSIGN;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
gEnableIRQ = true;
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_FME_GET_INFO, fme_info);
|
|
Packit |
534379 |
auto res = send_fme_event_request(handle_dev_,eh_,fme_op);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK,res);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test send_uafu_event_request
|
|
Packit |
534379 |
* @brief When passed a valid event handle and handle
|
|
Packit |
534379 |
* with FPGA_IRQ_ASSIGN flag. The function
|
|
Packit |
534379 |
* returns FPGA_OK.
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(events_mock_p, valid_uafu_event_request){
|
|
Packit |
534379 |
int port_op = FPGA_IRQ_ASSIGN;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
gEnableIRQ = true;
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
|
|
Packit |
534379 |
auto res = send_uafu_event_request(handle_dev_,eh_,0,port_op);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK,res);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test send_uafu_event_request
|
|
Packit |
534379 |
* @brief When passed a valid event handle and handle
|
|
Packit |
534379 |
* with FPGA_IRQ_DEASSIGN flag. The function
|
|
Packit |
534379 |
* returns FPGA_OK.
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(events_mock_p, valid_uafu_event_request_01){
|
|
Packit |
534379 |
int port_op = FPGA_IRQ_DEASSIGN;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
gEnableIRQ = true;
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
|
|
Packit |
534379 |
auto res = send_uafu_event_request(handle_dev_,eh_,0,port_op);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK,res);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test send_uafu_event_request
|
|
Packit |
534379 |
* @brief When passed a valid event handle, handle and port params
|
|
Packit |
534379 |
* but an invalid interrupt num. It returns FPGA_INVALID_PARAM.
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(events_mock_p, invalid_uafu_event_request_03){
|
|
Packit |
534379 |
int port_op = FPGA_IRQ_ASSIGN;
|
|
Packit |
534379 |
gEnableIRQ = true;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
|
|
Packit |
534379 |
auto res = send_uafu_event_request(handle_dev_,eh_,2,port_op);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM,res);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test afu_driver_register_event
|
|
Packit |
534379 |
* @brief Given invalid flags to driver_register_event, it
|
|
Packit |
534379 |
* returns FPGA_INVALID_PARAM. FPGA_EVENT_POWER_THERMAL
|
|
Packit |
534379 |
* is not supported.
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(events_mock_p, afu_driver_register_event){
|
|
Packit |
534379 |
int port_op = FPGA_IRQ_ASSIGN;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// Valid params
|
|
Packit |
534379 |
gEnableIRQ = true;
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
|
|
Packit |
534379 |
auto res = driver_register_event(handle_accel_, FPGA_EVENT_ERROR, eh_, 0);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK,res);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// Invalid num_uafu_irqs
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
|
|
Packit |
534379 |
res = driver_register_event(handle_accel_, FPGA_EVENT_INTERRUPT, eh_, port_op);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM,res);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// Not supported event type
|
|
Packit |
534379 |
res = driver_register_event(handle_accel_, FPGA_EVENT_POWER_THERMAL, eh_, 0);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_NOT_SUPPORTED,res);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test fme_driver_register_event
|
|
Packit |
534379 |
* @brief Given invalid flags to driver_register_event, it
|
|
Packit |
534379 |
* returns FPGA_INVALID_PARAM.
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(events_mock_p, fme_driver_register_event){
|
|
Packit |
534379 |
// Invalid ioctl
|
|
Packit |
534379 |
gEnableIRQ = true;
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_FME_GET_INFO, fme_info);
|
|
Packit |
534379 |
auto res = driver_register_event(handle_dev_, FPGA_EVENT_ERROR, eh_, 0);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK,res);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
res = driver_register_event(handle_dev_, FPGA_EVENT_INTERRUPT, eh_, 0);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM,res);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test fme_driver_unregister_event
|
|
Packit |
534379 |
* @brief Given invalid event type to fme, driver_unregister_event
|
|
Packit |
534379 |
* returns FPGA_INVALID_PARAM.
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(events_mock_p, fme_driver_unregister_event){
|
|
Packit |
534379 |
gEnableIRQ = true;
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_FME_GET_INFO, fme_info);
|
|
Packit |
534379 |
auto res = driver_unregister_event(handle_dev_, FPGA_EVENT_ERROR, eh_);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK,res);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// Not supported event_type
|
|
Packit |
534379 |
res = driver_unregister_event(handle_dev_, FPGA_EVENT_INTERRUPT, eh_);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM,res);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test event_drv_13
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
* @brief When register a valid event handle, FPGA_EVENT_INTERRUPT
|
|
Packit |
534379 |
* xfpga_fpgaRegisterEvent() returns FPGA_OK.
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(events_mock_p, event_drv_13) {
|
|
Packit |
534379 |
fpga_event_handle bad_handle;
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK, xfpga_fpgaCreateEventHandle(&bad_handle));
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// Reset event handle magic
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK, xfpga_fpgaRegisterEvent(handle_accel_, FPGA_EVENT_INTERRUPT, bad_handle, 0));
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// Destroy event handle
|
|
Packit |
534379 |
auto res = xfpga_fpgaDestroyEventHandle(&bad_handle);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK, res);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test event_drv_14
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
* @brief When passed an event handle with an invalid magic
|
|
Packit |
534379 |
* xfpga_fpgaUnregisterEvent() returns FPGA_INVALID_PARAM.
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(events_mock_p, event_drv_14) {
|
|
Packit |
534379 |
fpga_event_handle bad_handle;
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK, xfpga_fpgaCreateEventHandle(&bad_handle));
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// Valid magic and ioctl
|
|
Packit |
534379 |
gEnableIRQ = true;
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK, xfpga_fpgaUnregisterEvent(handle_accel_, FPGA_EVENT_INTERRUPT, bad_handle));
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// Destory event handle
|
|
Packit |
534379 |
auto res = xfpga_fpgaDestroyEventHandle(&bad_handle);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK, res);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test send_fme_event_request
|
|
Packit |
534379 |
* @brief When passed a valid event handle but invalid fme params.
|
|
Packit |
534379 |
* It returns FPGA_INVALID_PARAM
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(events_mock_p, invalid_fme_event_request_01){
|
|
Packit |
534379 |
int fme_op = 0;
|
|
Packit |
534379 |
auto res = send_fme_event_request(handle_dev_,eh_,fme_op);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM,res);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
fme_op = FPGA_IRQ_ASSIGN;
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_FME_GET_INFO, dummy_ioctl<-1,EINVAL>);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
res = send_fme_event_request(handle_dev_,eh_,fme_op);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM,res);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
gEnableIRQ = true;
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_FME_GET_INFO, fme_info);
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_FME_ERR_SET_IRQ, dummy_ioctl<-1,EINVAL>);
|
|
Packit |
534379 |
res = send_fme_event_request(handle_dev_,eh_,fme_op);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM,res);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test send_port_event_request
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
* @brief When passed a valid event handle but invalid port params.
|
|
Packit |
534379 |
* It returns FPGA_INVALID_PARAM
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(events_mock_p, invalid_port_event_request_01){
|
|
Packit |
534379 |
int port_op = 0;
|
|
Packit |
534379 |
auto res = send_port_event_request(handle_dev_,eh_,port_op);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM,res);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
port_op = FPGA_IRQ_ASSIGN;
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_PORT_GET_INFO, dummy_ioctl<-1,EINVAL>);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
res = send_port_event_request(handle_dev_,eh_,port_op);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM,res);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
gEnableIRQ = true;
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_PORT_ERR_SET_IRQ, dummy_ioctl<-1,EINVAL>);
|
|
Packit |
534379 |
res = send_port_event_request(handle_dev_,eh_,port_op);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM,res);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test send_uafu_event_request
|
|
Packit |
534379 |
* @brief When passed a valid event handle but invalid port params.
|
|
Packit |
534379 |
* It returns FPGA_INVALID_PARAM. When ioctl fails,
|
|
Packit |
534379 |
* it returns FPGA_EXCEPTION.
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(events_mock_p, invalid_uafu_event_request_01){
|
|
Packit |
534379 |
// invalid port operation
|
|
Packit |
534379 |
int port_op = 0;
|
|
Packit |
534379 |
auto res = send_uafu_event_request(handle_dev_,eh_,0,port_op);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM,res);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// Invalid ioctl
|
|
Packit |
534379 |
port_op = FPGA_IRQ_ASSIGN;
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_PORT_GET_INFO, dummy_ioctl<-1,EINVAL>);
|
|
Packit |
534379 |
res = send_uafu_event_request(handle_dev_,eh_,0,port_op);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM,res);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test send_uafu_event_request
|
|
Packit |
534379 |
* @brief When passed a valid event handle, handle and port params.
|
|
Packit |
534379 |
* It returns FPGA_EXCEPTION when ioctl fails.
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(events_mock_p, invalid_uafu_event_request_02){
|
|
Packit |
534379 |
int port_op = FPGA_IRQ_ASSIGN;
|
|
Packit |
534379 |
auto res = send_uafu_event_request(handle_dev_,eh_,0,port_op);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_NOT_SUPPORTED,res) << "\t result is " << res;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
gEnableIRQ = false;
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
|
|
Packit |
534379 |
res = send_uafu_event_request(handle_dev_,eh_,0,port_op);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_NOT_SUPPORTED,res);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
gEnableIRQ = true;
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_PORT_UAFU_SET_IRQ, dummy_ioctl<-1,EINVAL>);
|
|
Packit |
534379 |
res = send_uafu_event_request(handle_dev_,eh_,0,port_op);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_EXCEPTION,res);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test fme_interrupts_check
|
|
Packit |
534379 |
* @brief When irq is not supported and register invalid ioctl,
|
|
Packit |
534379 |
* check_interrupts_supported returns FPGA_NOT_SUPPORTED
|
|
Packit |
534379 |
* or FPGA_EXCEPTION.
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(events_mock_p, fme_interrupts_check){
|
|
Packit |
534379 |
fpga_objtype obj;
|
|
Packit |
534379 |
auto h = (struct _fpga_handle*)handle_dev_;
|
|
Packit |
534379 |
auto t = (struct _fpga_token*)h->token;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// no fme_info capability
|
|
Packit |
534379 |
gEnableIRQ = false;
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_FME_GET_INFO, fme_info);
|
|
Packit |
534379 |
auto res = check_interrupts_supported(handle_dev_,&obj);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_NOT_SUPPORTED,res);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// Value input
|
|
Packit |
534379 |
gEnableIRQ = true;
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_FME_GET_INFO, fme_info);
|
|
Packit |
534379 |
res = check_interrupts_supported(handle_dev_,&obj);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK,res);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// interrupt ioctl
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_FME_GET_INFO, dummy_ioctl<-1,EINVAL>);
|
|
Packit |
534379 |
res = check_interrupts_supported(handle_dev_,&obj);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_EXCEPTION,res);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// change sysfspath
|
|
Packit |
534379 |
strncpy(t->sysfspath, "null" , 5);
|
|
Packit |
534379 |
res = check_interrupts_supported(handle_dev_,&obj);
|
|
Packit |
534379 |
EXPECT_NE(FPGA_OK,res);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test afu_interrupts_check
|
|
Packit |
534379 |
* @brief When irq is not supported and register invalid ioctl,
|
|
Packit |
534379 |
* check_interrupts_supported returns FPGA_NOT_SUPPORTED
|
|
Packit |
534379 |
* or FPGA_EXCEPTION.
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(events_mock_p, afu_interrupts_check){
|
|
Packit |
534379 |
fpga_objtype obj;
|
|
Packit |
534379 |
auto h = (struct _fpga_handle*)handle_accel_;
|
|
Packit |
534379 |
auto t = (struct _fpga_token*)h->token;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// no fme_info capability
|
|
Packit |
534379 |
gEnableIRQ = false;
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
|
|
Packit |
534379 |
auto res = check_interrupts_supported(handle_accel_,&obj);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_NOT_SUPPORTED,res);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// Value input
|
|
Packit |
534379 |
gEnableIRQ = true;
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
|
|
Packit |
534379 |
res = check_interrupts_supported(handle_accel_,&obj);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK,res);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// interrupt ioctl
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_PORT_GET_INFO, dummy_ioctl<-1,EINVAL>);
|
|
Packit |
534379 |
res = check_interrupts_supported(handle_accel_,&obj);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM,res);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// change sysfspath
|
|
Packit |
534379 |
strncpy(t->sysfspath, "null", 5);
|
|
Packit |
534379 |
res = check_interrupts_supported(handle_accel_,&obj);
|
|
Packit |
534379 |
EXPECT_NE(FPGA_OK,res);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test afu_driver_unregister_event
|
|
Packit |
534379 |
* @brief Given invalid ioctls, driver_unregister_event returns
|
|
Packit |
534379 |
* FPGA_INVALID_PARAM.
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(events_mock_p, afu_driver_unregister_event){
|
|
Packit |
534379 |
// Invalid ioctl
|
|
Packit |
534379 |
gEnableIRQ = true;
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_PORT_ERR_SET_IRQ, dummy_ioctl<-1,EINVAL>);
|
|
Packit |
534379 |
auto res = driver_unregister_event(handle_accel_, FPGA_EVENT_ERROR, eh_);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM,res);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_PORT_UAFU_SET_IRQ, dummy_ioctl<-1,EINVAL>);
|
|
Packit |
534379 |
res = driver_unregister_event(handle_accel_, FPGA_EVENT_INTERRUPT, eh_);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_EXCEPTION,res);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// Not supported event_type
|
|
Packit |
534379 |
res = driver_unregister_event(handle_accel_, FPGA_EVENT_POWER_THERMAL, eh_);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_NOT_SUPPORTED,res);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test irq_event_01
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
* @brief Given a driver with IRQ support
|
|
Packit |
534379 |
* when fpgaRegisterEvent is called for
|
|
Packit |
534379 |
* an FPGA_DEVICE and FPGA_EVENT_ERROR
|
|
Packit |
534379 |
* then the call is successful and
|
|
Packit |
534379 |
* we can receive interrupt events on
|
|
Packit |
534379 |
* the OS-specific object from the event handle.
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(events_mock_p, irq_event_01) {
|
|
Packit |
534379 |
gEnableIRQ = true;
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_FME_GET_INFO, fme_info);
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_FME_ERR_SET_IRQ, set_fme_irq);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
ASSERT_EQ(FPGA_OK, xfpga_fpgaRegisterEvent(handle_dev_, FPGA_EVENT_ERROR,
|
|
Packit |
534379 |
eh_, 0));
|
|
Packit |
534379 |
int res;
|
|
Packit |
534379 |
int fd = -1;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK, xfpga_fpgaGetOSObjectFromEventHandle(eh_, &fd));
|
|
Packit |
534379 |
EXPECT_GE(fd, 0);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
struct pollfd poll_fd;
|
|
Packit |
534379 |
int maxpolls = 20;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
poll_fd.fd = fd;
|
|
Packit |
534379 |
poll_fd.events = POLLIN | POLLPRI;
|
|
Packit |
534379 |
poll_fd.revents = 0;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
do
|
|
Packit |
534379 |
{
|
|
Packit |
534379 |
res = poll(&poll_fd, 1, 1000);
|
|
Packit |
534379 |
ASSERT_GE(res, 0);
|
|
Packit |
534379 |
--maxpolls;
|
|
Packit |
534379 |
ASSERT_GT(maxpolls, 0);
|
|
Packit |
534379 |
} while(res == 0);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
EXPECT_EQ(res, 1);
|
|
Packit |
534379 |
EXPECT_NE(poll_fd.revents, 0);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK, xfpga_fpgaUnregisterEvent(handle_dev_, FPGA_EVENT_ERROR,
|
|
Packit |
534379 |
eh_));
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test irq_event_02
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
* @brief Given a driver with IRQ support
|
|
Packit |
534379 |
* when fpgaRegisterEvent is called for
|
|
Packit |
534379 |
* an FPGA_ACCELERATOR and FPGA_EVENT_ERROR
|
|
Packit |
534379 |
* then the call is successful and
|
|
Packit |
534379 |
* we can receive interrupt events on
|
|
Packit |
534379 |
* the OS-specific object from the event handle.
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(events_mock_p, irq_event_02) {
|
|
Packit |
534379 |
gEnableIRQ = true;
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_PORT_ERR_SET_IRQ, set_port_irq);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
ASSERT_EQ(FPGA_OK, xfpga_fpgaRegisterEvent(handle_accel_, FPGA_EVENT_ERROR, eh_, 0));
|
|
Packit |
534379 |
|
|
Packit |
534379 |
int res;
|
|
Packit |
534379 |
int fd = -1;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK, xfpga_fpgaGetOSObjectFromEventHandle(eh_, &fd));
|
|
Packit |
534379 |
EXPECT_GE(fd, 0);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
struct pollfd poll_fd;
|
|
Packit |
534379 |
int maxpolls = 20;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
poll_fd.fd = fd;
|
|
Packit |
534379 |
poll_fd.events = POLLIN | POLLPRI;
|
|
Packit |
534379 |
poll_fd.revents = 0;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
do
|
|
Packit |
534379 |
{
|
|
Packit |
534379 |
res = poll(&poll_fd, 1, 1000);
|
|
Packit |
534379 |
ASSERT_GE(res, 0);
|
|
Packit |
534379 |
--maxpolls;
|
|
Packit |
534379 |
ASSERT_GT(maxpolls, 0);
|
|
Packit |
534379 |
} while(res == 0);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
EXPECT_EQ(res, 1);
|
|
Packit |
534379 |
EXPECT_NE(poll_fd.revents, 0);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK, xfpga_fpgaUnregisterEvent(handle_accel_, FPGA_EVENT_ERROR, eh_));
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test irq_event_03
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
* @brief Given a driver with IRQ support
|
|
Packit |
534379 |
* when fpgaRegisterEvent is called for
|
|
Packit |
534379 |
* an FPGA_ACCELERATOR and FPGA_EVENT_INTERRUPT
|
|
Packit |
534379 |
* then the call is successful and
|
|
Packit |
534379 |
* we can receive interrupt events on
|
|
Packit |
534379 |
* the OS-specific object from the event handle.
|
|
Packit |
534379 |
*
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(events_mock_p, irq_event_03) {
|
|
Packit |
534379 |
gEnableIRQ = true;
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
|
|
Packit |
534379 |
system_->register_ioctl_handler(FPGA_PORT_UAFU_SET_IRQ, set_uport_irq);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
ASSERT_EQ(FPGA_OK, xfpga_fpgaRegisterEvent(handle_accel_, FPGA_EVENT_INTERRUPT,
|
|
Packit |
534379 |
eh_, 0));
|
|
Packit |
534379 |
|
|
Packit |
534379 |
int res;
|
|
Packit |
534379 |
int fd = -1;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK, xfpga_fpgaGetOSObjectFromEventHandle(eh_, &fd));
|
|
Packit |
534379 |
EXPECT_GE(fd, 0);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
struct pollfd poll_fd;
|
|
Packit |
534379 |
int maxpolls = 20;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
poll_fd.fd = fd;
|
|
Packit |
534379 |
poll_fd.events = POLLIN | POLLPRI;
|
|
Packit |
534379 |
poll_fd.revents = 0;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
do
|
|
Packit |
534379 |
{
|
|
Packit |
534379 |
res = poll(&poll_fd, 1, 1000);
|
|
Packit |
534379 |
ASSERT_GE(res, 0);
|
|
Packit |
534379 |
--maxpolls;
|
|
Packit |
534379 |
ASSERT_GT(maxpolls, 0);
|
|
Packit |
534379 |
} while(res == 0);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
EXPECT_EQ(res, 1);
|
|
Packit |
534379 |
EXPECT_NE(poll_fd.revents, 0);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK, xfpga_fpgaUnregisterEvent(handle_accel_, FPGA_EVENT_INTERRUPT,
|
|
Packit |
534379 |
eh_));
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
INSTANTIATE_TEST_CASE_P(events, events_mock_p,
|
|
Packit |
534379 |
::testing::ValuesIn(test_platform::mock_platforms({ "skx-p","dcp-rc" })));
|