blob: a6bd91f539a07e824547476942bcec03a4b603c0 [file] [log] [blame]
/*
* Samsung Exynos SoC series NPU driver
*
* Copyright (c) 2017 Samsung Electronics Co., Ltd.
* http://www.samsung.com/
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*/
#ifndef NPU_INTERFACE_H_
#define NPU_INTERFACE_H
#include <linux/types.h>
#include <linux/interrupt.h>
#include <linux/timer.h>
#include "ncp_header.h"
#include "npu-log.h"
#include "npu-util-llq.h"
#include "interface/loopback/npu-mailbox.h"
#include "npu-util-liststatemgr.h"
#define LOW_ADDR 0x100
#define NOR_ADDR 0x111
#define HIGH_ADDR 0x112
#define TRY_CNT 100
#define QSIZE 100
#define enter_request_barrier(frame) mutex_lock(frame->lock);
#define exit_request_barrier(frame) mutex_unlock(frame->lock);
#define init_process_barrier(itf) spin_lock_init(&itf->process_barrier);
#define enter_process_barrier(itf) spin_lock_irq(&itf->process_barrier);
#define exit_process_barrier(itf) spin_unlock_irq(&itf->process_barrier);
/**
* @brief NCP Interface structure.
*/
struct npu_interface {
struct ncp_header *ncp_header;
void __iomem *regs;
resource_size_t regs_size;
spinlock_t process_barrier;
/**
* Normally, struct npu_mailbox used to be contained in private_data when sending interrupt,
* and when receiving private_data, it contains npu_mailbox.
*/
void *private_data;
};
int npu_interface_probe(struct npu_interface *interface,
struct device *dev,
void __iomem *code,
resource_size_t code_size,
void __iomem *regs,
resource_size_t regs_size,
u32 irq0, u32 irq1);
int npu_interface_open(struct npu_interface *interface);
int npu_interface_close(struct npu_interface *interface);
int npu_set_cmd(struct npu_interface *interface);
/**
Handler for Upper Layer(N/W, Frame Manager) should be added.
*/
static void __send_interrupt(struct npu_interface *interface);
static irqreturn_t interface_isr(int irq, void *data);
static irqreturn_t interface_isr0(int irq, void *data);
static irqreturn_t interface_isr1(int irq, void *data);
#endif