Blame opae-libs/plugins/xfpga/opae_drv.c

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
Packit 534379
#include <string.h>
Packit 534379
#include <stddef.h>
Packit 534379
#include <stdarg.h>
Packit 534379
#include <sys/ioctl.h>
Packit 534379
#include <sys/stat.h>
Packit 534379
#include <errno.h>
Packit 534379
Packit 534379
#include <opae/fpga.h>
Packit 534379
Packit 534379
#include "common_int.h"
Packit 534379
#include "opae_drv.h"
Packit 534379
#include "intel-fpga.h"
Packit 534379
#include "fpga-dfl.h"
Packit 534379
Packit 534379
typedef struct _ioctl_ops {
Packit 534379
	fpga_result (*get_fme_info)(int fd, opae_fme_info *info);
Packit 534379
	fpga_result (*get_port_info)(int fd, opae_port_info *info);
Packit 534379
	fpga_result (*get_port_region_info)(int fd, uint32_t index,
Packit 534379
					    opae_port_region_info *info);
Packit 534379
Packit 534379
	fpga_result (*port_map)(int fd, void *addr, uint64_t len,
Packit 534379
				uint32_t flags, uint64_t *io_addr);
Packit 534379
	fpga_result (*port_unmap)(int fd, uint64_t io_addr);
Packit 534379
Packit 534379
	fpga_result (*port_umsg_cfg)(int fd, uint32_t flags,
Packit 534379
				     uint32_t hint_bitmap);
Packit 534379
	fpga_result (*port_umsg_set_base_addr)(int fd, uint32_t flags,
Packit 534379
					       uint64_t io_addr);
Packit 534379
	fpga_result (*port_umsg_enable)(int fd);
Packit 534379
	fpga_result (*port_umsg_disable)(int fd);
Packit 534379
Packit 534379
	fpga_result (*fme_set_err_irq)(int fd, uint32_t flags, int32_t eventfd);
Packit 534379
	fpga_result (*port_set_err_irq)(int fd, uint32_t flags,
Packit 534379
					int32_t eventfd);
Packit 534379
	fpga_result (*port_set_user_irq)(int fd, uint32_t flags, uint32_t start,
Packit 534379
					 uint32_t count, int32_t *eventfd);
Packit 534379
Packit 534379
	fpga_result (*fme_port_assign)(int fd, uint32_t flags,
Packit 534379
				       uint32_t port_id);
Packit 534379
	fpga_result (*fme_port_release)(int fd, uint32_t flags,
Packit 534379
					uint32_t port_id);
Packit 534379
	fpga_result (*fme_port_pr)(int fd, uint32_t flags, uint32_t port_id,
Packit 534379
				   uint32_t sz, uint64_t addr,
Packit 534379
				   uint64_t *status);
Packit 534379
	fpga_result (*fme_port_reset)(int fd);
Packit 534379
} ioctl_ops;
Packit 534379
Packit 534379
fpga_result opae_ioctl(int fd, int request, ...)
Packit 534379
{
Packit 534379
	fpga_result res = FPGA_OK;
Packit 534379
	va_list argp;
Packit 534379
	va_start(argp, request);
Packit 534379
	void *msg = va_arg(argp, void *);
Packit 534379
	errno = 0;
Packit 534379
	if (ioctl(fd, request, msg) != 0) {
Packit 534379
		OPAE_MSG("error executing ioctl: %s", strerror(errno));
Packit 534379
		switch (errno) {
Packit 534379
		case EINVAL:
Packit 534379
			res = FPGA_INVALID_PARAM;
Packit 534379
			break;
Packit 534379
		case ENOTSUP:
Packit 534379
			res = FPGA_NOT_SUPPORTED;
Packit 534379
			break;
Packit 534379
		default:
Packit 534379
			// other errors could be
Packit 534379
			// EBADF - fd is bad file descriptor
Packit 534379
			// EFAULT - argp references an inaccessible
Packit 534379
			// memory area
Packit 534379
			// ENOTTY - fd is not associated with a char.
Packit 534379
			// special device
Packit 534379
			res = FPGA_EXCEPTION;
Packit 534379
			break;
Packit 534379
		}
Packit 534379
	}
Packit 534379
	va_end(argp);
Packit 534379
Packit 534379
	return res;
Packit 534379
}
Packit 534379
Packit 534379
Packit 534379
fpga_result intel_fpga_version(int fd)
Packit 534379
{
Packit 534379
	return opae_ioctl(fd, FPGA_GET_API_VERSION, NULL);
Packit 534379
}
Packit 534379
Packit 534379
fpga_result intel_get_fme_info(int fd, opae_fme_info *info)
Packit 534379
{
Packit 534379
	ASSERT_NOT_NULL(info);
Packit 534379
	struct fpga_fme_info fme_info = {.argsz = sizeof(fme_info), .flags = 0};
Packit 534379
	int res = opae_ioctl(fd, FPGA_FME_GET_INFO, &fme_info);
Packit 534379
	if (!res) {
Packit 534379
		info->flags = fme_info.flags;
Packit 534379
		info->capability = fme_info.capability;
Packit 534379
	}
Packit 534379
	return res;
Packit 534379
}
Packit 534379
Packit 534379
fpga_result intel_get_port_info(int fd, opae_port_info *info)
Packit 534379
{
Packit 534379
	ASSERT_NOT_NULL(info);
Packit 534379
	struct fpga_port_info pinfo = {.argsz = sizeof(pinfo), .flags = 0};
Packit 534379
	int res = opae_ioctl(fd, FPGA_PORT_GET_INFO, &pinfo);
Packit 534379
	if (!res) {
Packit 534379
		info->flags = pinfo.flags;
Packit 534379
		info->capability = pinfo.capability;
Packit 534379
		info->num_regions = pinfo.num_regions;
Packit 534379
		info->num_umsgs = pinfo.num_umsgs;
Packit 534379
		info->num_uafu_irqs = pinfo.num_uafu_irqs;
Packit 534379
	}
Packit 534379
	return res;
Packit 534379
}
Packit 534379
Packit 534379
Packit 534379
fpga_result intel_get_port_region_info(int fd, uint32_t index,
Packit 534379
				       opae_port_region_info *info)
Packit 534379
{
Packit 534379
	ASSERT_NOT_NULL(info);
Packit 534379
	struct fpga_port_region_info rinfo = {
Packit 534379
		.argsz = sizeof(rinfo), .padding = 0, .index = index};
Packit 534379
	int res = opae_ioctl(fd, FPGA_PORT_GET_REGION_INFO, &rinfo);
Packit 534379
	if (!res) {
Packit 534379
		info->flags = rinfo.flags;
Packit 534379
		info->size = rinfo.size;
Packit 534379
		info->offset = rinfo.offset;
Packit 534379
	}
Packit 534379
	return res;
Packit 534379
}
Packit 534379
Packit 534379
Packit 534379
fpga_result intel_port_map(int fd, void *addr, uint64_t len, uint32_t flags,
Packit 534379
			   uint64_t *io_addr)
Packit 534379
{
Packit 534379
	int res = 0;
Packit 534379
	int req = 0;
Packit 534379
	void *msg = NULL;
Packit 534379
	/* Set ioctl fpga_port_dma_map struct parameters */
Packit 534379
	struct fpga_port_dma_map dma_map = {.argsz = sizeof(dma_map),
Packit 534379
					    .flags = flags,
Packit 534379
					    .user_addr = (__u64)addr,
Packit 534379
					    .length = (__u64)len,
Packit 534379
					    .iova = 0};
Packit 534379
	ASSERT_NOT_NULL(io_addr);
Packit 534379
	/* Dispatch ioctl command */
Packit 534379
	req = FPGA_PORT_DMA_MAP;
Packit 534379
	msg = &dma_map;
Packit 534379
Packit 534379
	res = opae_ioctl(fd, req, msg);
Packit 534379
	if (!res) {
Packit 534379
		*io_addr = dma_map.iova;
Packit 534379
	}
Packit 534379
	return res;
Packit 534379
}
Packit 534379
Packit 534379
fpga_result intel_port_unmap(int fd, uint64_t io_addr)
Packit 534379
{
Packit 534379
	/* Set ioctl fpga_port_dma_unmap struct parameters */
Packit 534379
	struct fpga_port_dma_unmap dma_unmap = {
Packit 534379
		.argsz = sizeof(dma_unmap), .flags = 0, .iova = io_addr};
Packit 534379
Packit 534379
	/* Dispatch ioctl command */
Packit 534379
	return opae_ioctl(fd, FPGA_PORT_DMA_UNMAP, &dma_unmap);
Packit 534379
}
Packit 534379
Packit 534379
fpga_result intel_port_umsg_cfg(int fd, uint32_t flags, uint32_t hint_bitmap)
Packit 534379
{
Packit 534379
	if (flags) {
Packit 534379
		OPAE_MSG(
Packit 534379
			"flags currently not supported in FPGA_PORT_UMSG_SET_MODE");
Packit 534379
	}
Packit 534379
Packit 534379
	struct fpga_port_umsg_cfg umsg_cfg = {.argsz = sizeof(umsg_cfg),
Packit 534379
					      .flags = 0,
Packit 534379
					      .hint_bitmap = hint_bitmap};
Packit 534379
	return opae_ioctl(fd, FPGA_PORT_UMSG_SET_MODE, &umsg_cfg);
Packit 534379
}
Packit 534379
Packit 534379
fpga_result intel_port_umsg_set_base_addr(int fd, uint32_t flags,
Packit 534379
					  uint64_t io_addr)
Packit 534379
{
Packit 534379
	if (flags) {
Packit 534379
		OPAE_MSG(
Packit 534379
			"flags currently not supported in FPGA_PORT_UMSG_SET_BASE_ADDR");
Packit 534379
	}
Packit 534379
Packit 534379
	struct fpga_port_umsg_base_addr baseaddr = {
Packit 534379
		.argsz = sizeof(baseaddr), .flags = 0, .iova = io_addr};
Packit 534379
	return opae_ioctl(fd, FPGA_PORT_UMSG_SET_BASE_ADDR, &baseaddr);
Packit 534379
}
Packit 534379
Packit 534379
fpga_result intel_port_umsg_enable(int fd)
Packit 534379
{
Packit 534379
	return opae_ioctl(fd, FPGA_PORT_UMSG_ENABLE, NULL);
Packit 534379
}
Packit 534379
Packit 534379
fpga_result intel_port_umsg_disable(int fd)
Packit 534379
{
Packit 534379
	return opae_ioctl(fd, FPGA_PORT_UMSG_DISABLE, NULL);
Packit 534379
}
Packit 534379
Packit 534379
fpga_result intel_fme_set_err_irq(int fd, uint32_t flags, int32_t evtfd)
Packit 534379
{
Packit 534379
	if (flags) {
Packit 534379
		OPAE_MSG(
Packit 534379
			"flags currently not supported in FPGA_FME_ERR_SET_IRQ");
Packit 534379
	}
Packit 534379
Packit 534379
	struct fpga_fme_err_irq_set irq = {
Packit 534379
		.argsz = sizeof(irq), .flags = flags, .evtfd = evtfd};
Packit 534379
	return opae_ioctl(fd, FPGA_FME_ERR_SET_IRQ, &irq);
Packit 534379
}
Packit 534379
Packit 534379
fpga_result intel_port_set_err_irq(int fd, uint32_t flags, int32_t evtfd)
Packit 534379
{
Packit 534379
	if (flags) {
Packit 534379
		OPAE_MSG(
Packit 534379
			"flags currently not supported in FPGA_FME_ERR_SET_IRQ");
Packit 534379
	}
Packit 534379
Packit 534379
	struct fpga_port_err_irq_set irq = {
Packit 534379
		.argsz = sizeof(irq), .flags = flags, .evtfd = evtfd};
Packit 534379
	return opae_ioctl(fd, FPGA_PORT_ERR_SET_IRQ, &irq);
Packit 534379
}
Packit 534379
Packit 534379
fpga_result intel_port_set_user_irq(int fd, uint32_t flags, uint32_t start,
Packit 534379
				    uint32_t count, int32_t *eventfd)
Packit 534379
{
Packit 534379
	uint32_t sz =
Packit 534379
		sizeof(struct fpga_port_uafu_irq_set) + count * sizeof(int32_t);
Packit 534379
	struct fpga_port_uafu_irq_set *irq = NULL;
Packit 534379
	int res = 0;
Packit 534379
Packit 534379
	ASSERT_NOT_NULL(eventfd);
Packit 534379
	if (!count) {
Packit 534379
		OPAE_ERR("set_user irq with emtpy count");
Packit 534379
		return FPGA_INVALID_PARAM;
Packit 534379
	}
Packit 534379
Packit 534379
	if (flags) {
Packit 534379
		OPAE_MSG(
Packit 534379
			"flags currently not supported in FPGA_FME_ERR_SET_IRQ");
Packit 534379
	}
Packit 534379
Packit 534379
	irq = malloc(sz);
Packit 534379
	if (!irq) {
Packit 534379
		OPAE_ERR("Could not allocate memory for irq request");
Packit 534379
		return FPGA_NO_MEMORY;
Packit 534379
	}
Packit 534379
Packit 534379
	irq->argsz = sz;
Packit 534379
	irq->flags = 0;
Packit 534379
	irq->start = start;
Packit 534379
	irq->count = count;
Packit 534379
Packit 534379
	memcpy(irq->evtfd, eventfd, count * sizeof(int32_t));
Packit 534379
Packit 534379
	res = opae_ioctl(fd, FPGA_PORT_UAFU_SET_IRQ, irq);
Packit 534379
Packit 534379
	free(irq);
Packit 534379
	return res;
Packit 534379
}
Packit 534379
Packit 534379
fpga_result intel_fme_port_assign(int fd, uint32_t flags, uint32_t port_id)
Packit 534379
{
Packit 534379
	struct fpga_fme_port_assign assign = {
Packit 534379
		.argsz = sizeof(assign), .flags = 0, .port_id = port_id};
Packit 534379
	if (flags) {
Packit 534379
		OPAE_MSG(
Packit 534379
			"flags currently not supported in FPGA_FME_PORT_ASSIGN");
Packit 534379
	}
Packit 534379
	return opae_ioctl(fd, FPGA_FME_PORT_ASSIGN, &assign);
Packit 534379
}
Packit 534379
Packit 534379
fpga_result intel_fme_port_release(int fd, uint32_t flags, uint32_t port_id)
Packit 534379
{
Packit 534379
	struct fpga_fme_port_assign assign = {
Packit 534379
		.argsz = sizeof(assign), .flags = 0, .port_id = port_id};
Packit 534379
	if (flags) {
Packit 534379
		OPAE_MSG(
Packit 534379
			"flags currently not supported in FPGA_FME_PORT_RELEASE");
Packit 534379
	}
Packit 534379
	return opae_ioctl(fd, FPGA_FME_PORT_RELEASE, &assign);
Packit 534379
}
Packit 534379
Packit 534379
fpga_result intel_fme_port_pr(int fd, uint32_t flags, uint32_t port_id,
Packit 534379
			      uint32_t sz, uint64_t addr, uint64_t *status)
Packit 534379
{
Packit 534379
	struct fpga_fme_port_pr port_pr = {.argsz = sizeof(port_pr),
Packit 534379
					   .flags = 0,
Packit 534379
					   .port_id = port_id,
Packit 534379
					   .buffer_size = sz,
Packit 534379
					   .buffer_address = addr};
Packit 534379
	int res = FPGA_OK;
Packit 534379
	if (flags) {
Packit 534379
		OPAE_MSG("flags currently not supported in FPGA_FME_PORT_PR");
Packit 534379
	}
Packit 534379
	ASSERT_NOT_NULL(status);
Packit 534379
	res = opae_ioctl(fd, FPGA_FME_PORT_PR, &port_pr);
Packit 534379
	*status = port_pr.status;
Packit 534379
	return res;
Packit 534379
}
Packit 534379
Packit 534379
fpga_result intel_fme_port_reset(int fd)
Packit 534379
{
Packit 534379
	return opae_ioctl(fd, FPGA_PORT_RESET, NULL);
Packit 534379
}
Packit 534379
Packit 534379
fpga_result dfl_fpga_version(int fd)
Packit 534379
{
Packit 534379
	return opae_ioctl(fd, DFL_FPGA_GET_API_VERSION, NULL);
Packit 534379
}
Packit 534379
Packit 534379
fpga_result dfl_get_port_info(int fd, opae_port_info *info)
Packit 534379
{
Packit 534379
	ASSERT_NOT_NULL(info);
Packit 534379
	struct dfl_fpga_port_info pinfo = {.argsz = sizeof(pinfo), .flags = 0};
Packit 534379
	int res = opae_ioctl(fd, DFL_FPGA_PORT_GET_INFO, &pinfo);
Packit 534379
	if (!res) {
Packit 534379
		info->flags = pinfo.flags;
Packit 534379
		info->num_regions = pinfo.num_regions;
Packit 534379
		info->num_umsgs = pinfo.num_umsgs;
Packit 534379
	}
Packit 534379
	return res;
Packit 534379
}
Packit 534379
Packit 534379
fpga_result dfl_get_port_region_info(int fd, uint32_t index,
Packit 534379
				     opae_port_region_info *info)
Packit 534379
{
Packit 534379
	ASSERT_NOT_NULL(info);
Packit 534379
	struct dfl_fpga_port_region_info rinfo = {
Packit 534379
		.argsz = sizeof(rinfo), .padding = 0, .index = index};
Packit 534379
	int res = opae_ioctl(fd, DFL_FPGA_PORT_GET_REGION_INFO, &rinfo);
Packit 534379
	if (!res) {
Packit 534379
		info->flags = rinfo.flags;
Packit 534379
		info->size = rinfo.size;
Packit 534379
		info->offset = rinfo.offset;
Packit 534379
	}
Packit 534379
	return res;
Packit 534379
}
Packit 534379
Packit 534379
fpga_result dfl_port_map(int fd, void *addr, uint64_t len, uint32_t flags,
Packit 534379
			 uint64_t *io_addr)
Packit 534379
{
Packit 534379
	int res = 0;
Packit 534379
	/* Set ioctl fpga_port_dma_map struct parameters */
Packit 534379
	struct dfl_fpga_port_dma_map dma_map = {.argsz = sizeof(dma_map),
Packit 534379
						.flags = flags,
Packit 534379
						.user_addr = (__u64)addr,
Packit 534379
						.length = (__u64)len,
Packit 534379
						.iova = 0};
Packit 534379
	ASSERT_NOT_NULL(io_addr);
Packit 534379
	/* Dispatch ioctl command */
Packit 534379
	res = opae_ioctl(fd, DFL_FPGA_PORT_DMA_MAP, &dma_map);
Packit 534379
	if (!res) {
Packit 534379
		*io_addr = dma_map.iova;
Packit 534379
	}
Packit 534379
	return res;
Packit 534379
}
Packit 534379
Packit 534379
fpga_result dfl_port_unmap(int fd, uint64_t io_addr)
Packit 534379
{
Packit 534379
	/* Set ioctl fpga_port_dma_unmap struct parameters */
Packit 534379
	struct dfl_fpga_port_dma_unmap dma_unmap = {
Packit 534379
		.argsz = sizeof(dma_unmap), .flags = 0, .iova = io_addr};
Packit 534379
Packit 534379
	/* Dispatch ioctl command */
Packit 534379
	return opae_ioctl(fd, DFL_FPGA_PORT_DMA_UNMAP, &dma_unmap);
Packit 534379
}
Packit 534379
Packit 534379
Packit 534379
fpga_result dfl_fme_port_assign(int fd, uint32_t flags, uint32_t port_id)
Packit 534379
{
Packit 534379
	UNUSED_PARAM(flags);
Packit 534379
	return opae_ioctl(fd, DFL_FPGA_FME_PORT_ASSIGN, port_id);
Packit 534379
}
Packit 534379
Packit 534379
fpga_result dfl_fme_port_release(int fd, uint32_t flags, uint32_t port_id)
Packit 534379
{
Packit 534379
	UNUSED_PARAM(flags);
Packit 534379
	return opae_ioctl(fd, DFL_FPGA_FME_PORT_RELEASE, port_id);
Packit 534379
}
Packit 534379
Packit 534379
fpga_result dfl_fme_port_pr(int fd, uint32_t flags, uint32_t port_id,
Packit 534379
			    uint32_t sz, uint64_t addr, uint64_t *status)
Packit 534379
{
Packit 534379
	struct dfl_fpga_fme_port_pr port_pr = {.argsz = sizeof(port_pr),
Packit 534379
					       .flags = 0,
Packit 534379
					       .port_id = port_id,
Packit 534379
					       .buffer_size = sz,
Packit 534379
					       .buffer_address = addr};
Packit 534379
	int res = FPGA_OK;
Packit 534379
	if (flags) {
Packit 534379
		OPAE_MSG("flags currently not supported in FPGA_FME_PORT_PR");
Packit 534379
	}
Packit 534379
	ASSERT_NOT_NULL(status);
Packit 534379
	res = opae_ioctl(fd, DFL_FPGA_FME_PORT_PR, &port_pr);
Packit 534379
	*status = 0;
Packit 534379
	return res;
Packit 534379
}
Packit 534379
Packit 534379
fpga_result dfl_fme_port_reset(int fd)
Packit 534379
{
Packit 534379
	return opae_ioctl(fd, DFL_FPGA_PORT_RESET, NULL);
Packit 534379
}
Packit 534379
Packit 534379
#define MAX_KERNEL_DRIVERS 2
Packit 534379
static ioctl_ops ioctl_table[MAX_KERNEL_DRIVERS] = {
Packit 534379
	{.get_fme_info = NULL,
Packit 534379
	 .get_port_info = dfl_get_port_info,
Packit 534379
	 .get_port_region_info = dfl_get_port_region_info,
Packit 534379
	 .port_map = dfl_port_map,
Packit 534379
	 .port_unmap = dfl_port_unmap,
Packit 534379
	 .port_umsg_cfg = NULL,
Packit 534379
	 .port_umsg_set_base_addr = NULL,
Packit 534379
	 .port_umsg_enable = NULL,
Packit 534379
	 .port_umsg_disable = NULL,
Packit 534379
	 .fme_set_err_irq = NULL,
Packit 534379
	 .port_set_err_irq = NULL,
Packit 534379
	 .port_set_user_irq = NULL,
Packit 534379
	 .fme_port_assign = dfl_fme_port_assign,
Packit 534379
	 .fme_port_release = dfl_fme_port_release,
Packit 534379
	 .fme_port_pr = dfl_fme_port_pr,
Packit 534379
	 .fme_port_reset = dfl_fme_port_reset},
Packit 534379
	{.get_fme_info = intel_get_fme_info,
Packit 534379
	 .get_port_info = intel_get_port_info,
Packit 534379
	 .get_port_region_info = intel_get_port_region_info,
Packit 534379
	 .port_map = intel_port_map,
Packit 534379
	 .port_unmap = intel_port_unmap,
Packit 534379
	 .port_umsg_cfg = intel_port_umsg_cfg,
Packit 534379
	 .port_umsg_set_base_addr = intel_port_umsg_set_base_addr,
Packit 534379
	 .port_umsg_enable = intel_port_umsg_enable,
Packit 534379
	 .port_umsg_disable = intel_port_umsg_disable,
Packit 534379
	 .fme_set_err_irq = intel_fme_set_err_irq,
Packit 534379
	 .port_set_err_irq = intel_port_set_err_irq,
Packit 534379
	 .port_set_user_irq = intel_port_set_user_irq,
Packit 534379
	 .fme_port_assign = intel_fme_port_assign,
Packit 534379
	 .fme_port_release = intel_fme_port_release,
Packit 534379
	 .fme_port_pr = intel_fme_port_pr,
Packit 534379
	 .fme_port_reset = intel_fme_port_reset} };
Packit 534379
Packit 534379
static ioctl_ops *io_ptr;
Packit 534379
Packit 534379
int opae_ioctl_initialize(void)
Packit 534379
{
Packit 534379
	struct stat st;
Packit 534379
	if (!stat("/sys/class/fpga_region", &st)) {
Packit 534379
		io_ptr = &ioctl_table[0];
Packit 534379
		return 0;
Packit 534379
	}
Packit 534379
	if (!stat("/sys/class/fpga", &st)) {
Packit 534379
		io_ptr = &ioctl_table[1];
Packit 534379
		return 0;
Packit 534379
	}
Packit 534379
	return 1;
Packit 534379
}
Packit 534379
Packit 534379
#define IOCTL(_FN, ...)                                                        \
Packit 534379
	do {                                                                   \
Packit 534379
		if (!io_ptr) {                                                 \
Packit 534379
			OPAE_ERR("ioctl interface has not been initialized");  \
Packit 534379
			return FPGA_EXCEPTION;                                 \
Packit 534379
		}                                                              \
Packit 534379
		if (!io_ptr->_FN) {                                            \
Packit 534379
			OPAE_MSG("ioctl function not yet supported");          \
Packit 534379
			return FPGA_NOT_SUPPORTED;                             \
Packit 534379
		}                                                              \
Packit 534379
		return io_ptr->_FN(__VA_ARGS__);                               \
Packit 534379
	} while (0);
Packit 534379
Packit 534379
fpga_result opae_get_fme_info(int fd, opae_fme_info *info)
Packit 534379
{
Packit 534379
	IOCTL(get_fme_info, fd, info);
Packit 534379
}
Packit 534379
Packit 534379
fpga_result opae_get_port_info(int fd, opae_port_info *info)
Packit 534379
{
Packit 534379
	IOCTL(get_port_info, fd, info);
Packit 534379
}
Packit 534379
Packit 534379
fpga_result opae_get_port_region_info(int fd, uint32_t index,
Packit 534379
				      opae_port_region_info *info)
Packit 534379
{
Packit 534379
	IOCTL(get_port_region_info, fd, index, info);
Packit 534379
}
Packit 534379
Packit 534379
fpga_result opae_port_map(int fd, void *addr, uint64_t len, uint32_t flags,
Packit 534379
			  uint64_t *io_addr)
Packit 534379
{
Packit 534379
	IOCTL(port_map, fd, addr, len, flags, io_addr);
Packit 534379
}
Packit 534379
Packit 534379
fpga_result opae_port_unmap(int fd, uint64_t io_addr)
Packit 534379
{
Packit 534379
	IOCTL(port_unmap, fd, io_addr);
Packit 534379
}
Packit 534379
Packit 534379
fpga_result opae_port_umsg_cfg(int fd, uint32_t flags, uint32_t hint_bitmap)
Packit 534379
{
Packit 534379
	IOCTL(port_umsg_cfg, fd, flags, hint_bitmap);
Packit 534379
}
Packit 534379
Packit 534379
fpga_result opae_port_umsg_set_base_addr(int fd, uint32_t flags,
Packit 534379
					 uint64_t io_addr)
Packit 534379
{
Packit 534379
	IOCTL(port_umsg_set_base_addr, fd, flags, io_addr);
Packit 534379
}
Packit 534379
Packit 534379
fpga_result opae_port_umsg_enable(int fd)
Packit 534379
{
Packit 534379
	IOCTL(port_umsg_enable, fd);
Packit 534379
}
Packit 534379
Packit 534379
fpga_result opae_port_umsg_disable(int fd)
Packit 534379
{
Packit 534379
	IOCTL(port_umsg_disable, fd);
Packit 534379
}
Packit 534379
Packit 534379
fpga_result opae_fme_set_err_irq(int fd, uint32_t flags, int32_t eventfd)
Packit 534379
{
Packit 534379
	IOCTL(fme_set_err_irq, fd, flags, eventfd);
Packit 534379
}
Packit 534379
Packit 534379
fpga_result opae_port_set_err_irq(int fd, uint32_t flags, int32_t eventfd)
Packit 534379
{
Packit 534379
	IOCTL(port_set_err_irq, fd, flags, eventfd);
Packit 534379
}
Packit 534379
Packit 534379
fpga_result opae_port_set_user_irq(int fd, uint32_t flags, uint32_t start,
Packit 534379
				   uint32_t count, int32_t *eventfd)
Packit 534379
{
Packit 534379
	IOCTL(port_set_user_irq, fd, flags, start, count, eventfd);
Packit 534379
}
Packit 534379
Packit 534379
fpga_result opae_fme_port_assign(int fd, uint32_t flags, uint32_t port_id)
Packit 534379
{
Packit 534379
	IOCTL(fme_port_assign, fd, flags, port_id);
Packit 534379
}
Packit 534379
Packit 534379
fpga_result opae_fme_port_release(int fd, uint32_t flags, uint32_t port_id)
Packit 534379
{
Packit 534379
	IOCTL(fme_port_release, fd, flags, port_id);
Packit 534379
}
Packit 534379
Packit 534379
fpga_result opae_fme_port_pr(int fd, uint32_t flags, uint32_t port_id,
Packit 534379
			     uint32_t sz, uint64_t addr, uint64_t *status)
Packit 534379
{
Packit 534379
	IOCTL(fme_port_pr, fd, flags, port_id, sz, addr, status);
Packit 534379
}
Packit 534379
Packit 534379
fpga_result opae_fme_port_reset(int fd)
Packit 534379
{
Packit 534379
	IOCTL(fme_port_reset, fd);
Packit 534379
}