// Copyright(c) 2018-2019, Intel Corporation
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// * Neither the name of Intel Corporation nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
#ifndef __FPGAD_MONITORED_DEVICE_H__
#define __FPGAD_MONITORED_DEVICE_H__
#include "fpgad.h"
typedef struct _fpgad_supported_device {
uint16_t vendor_id;
uint16_t device_id;
const char *library_path;
uint32_t flags;
#define FPGAD_DEV_DETECTED 0x00000001
#define FPGAD_DEV_LOADED 0x00000002
void *dl_handle;
const char *config;
} fpgad_supported_device;
typedef enum _fpgad_plugin_type {
FPGAD_PLUGIN_TYPE_CALLBACK = 1,
FPGAD_PLUGIN_TYPE_THREAD
} fpgad_plugin_type;
struct _fpgad_monitored_device;
typedef enum _fpgad_detection_status {
FPGAD_STATUS_NOT_DETECTED = 0, // no detection
FPGAD_STATUS_DETECTED, // detected (normal priority)
FPGAD_STATUS_DETECTED_HIGH // detected (high priority)
} fpgad_detection_status;
typedef fpgad_detection_status
(*fpgad_detect_event_t)(struct _fpgad_monitored_device *dev,
void *context);
typedef void (*fpgad_respond_event_t)(struct _fpgad_monitored_device *dev,
void *context);
typedef void * (*fpgad_plugin_thread_t)(void *context);
typedef void (*fpgad_plugin_thread_stop_t)(void);
typedef struct _fpgad_monitored_device {
struct fpgad_config *config;
fpgad_supported_device *supported;
fpga_token token;
uint64_t object_id;
fpga_objtype object_type;
opae_bitstream_info *bitstr;
fpgad_plugin_type type;
// for type FPGAD_PLUGIN_TYPE_CALLBACK {
// must be NULL-terminated
fpgad_detect_event_t *detections;
void **detection_contexts;
fpgad_respond_event_t *responses;
void **response_contexts;
// }
// for type FPGAD_PLUGIN_TYPE_THREAD {
fpgad_plugin_thread_t thread_fn;
// The parameter to thread_fn will be the address
// of this fpgad_monitored_device. Use the
// following member to pass a thread-specific
// context:
void *thread_context;
// This routine is called to make the plugin
// thread stop execution in preparation for
// being joined.
fpgad_plugin_thread_stop_t thread_stop_fn;
pthread_t thread;
// }
#define MAX_DEV_ERROR_OCCURRENCES 64
void *error_occurrences[MAX_DEV_ERROR_OCCURRENCES];
unsigned num_error_occurrences;
#define MAX_DEV_SCRATCHPAD 2
uint64_t scratchpad[MAX_DEV_SCRATCHPAD];
struct _fpgad_monitored_device *next;
} fpgad_monitored_device;
#define FPGAD_PLUGIN_CONFIGURE "fpgad_plugin_configure"
typedef int (*fpgad_plugin_configure_t)(fpgad_monitored_device *d,
const char *cfg);
#define FPGAD_PLUGIN_DESTROY "fpgad_plugin_destroy"
typedef void (*fpgad_plugin_destroy_t)(fpgad_monitored_device *d);
#endif /* __FPGAD_MONITORED_DEVICE_H__ */