361 lines
8.9 KiB
C
361 lines
8.9 KiB
C
|
/*
|
||
|
* drivers/video/tegra/host/pva/pva.h
|
||
|
*
|
||
|
* Tegra PVA header
|
||
|
*
|
||
|
* Copyright (c) 2016-2018, NVIDIA Corporation. All rights reserved.
|
||
|
*
|
||
|
* This program is free software; you can redistribute it and/or modify it
|
||
|
* under the terms and conditions of the GNU General Public License,
|
||
|
* version 2, as published by the Free Software Foundation.
|
||
|
*
|
||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||
|
* more details.
|
||
|
*
|
||
|
* You should have received a copy of the GNU General Public License
|
||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
*/
|
||
|
|
||
|
#ifndef __NVHOST_PVA_H__
|
||
|
#define __NVHOST_PVA_H__
|
||
|
|
||
|
#include <linux/dma-attrs.h>
|
||
|
#include <linux/mutex.h>
|
||
|
#include <linux/version.h>
|
||
|
|
||
|
#include "nvhost_queue.h"
|
||
|
#include "pva_regs.h"
|
||
|
|
||
|
extern const struct file_operations tegra_pva_ctrl_ops;
|
||
|
|
||
|
enum pva_submit_mode {
|
||
|
PVA_SUBMIT_MODE_MAILBOX = 0,
|
||
|
PVA_SUBMIT_MODE_MMIO_CCQ = 1,
|
||
|
PVA_SUBMIT_MODE_CHANNEL_CCQ = 2
|
||
|
};
|
||
|
|
||
|
struct pva_version_info {
|
||
|
u32 pva_r5_version;
|
||
|
u32 pva_compat_version;
|
||
|
u32 pva_revision;
|
||
|
u32 pva_built_on;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Queue count of 8 is maintained per PVA.
|
||
|
*/
|
||
|
#define MAX_PVA_QUEUE_COUNT 8
|
||
|
|
||
|
/**
|
||
|
* Maximum task count that a queue can support
|
||
|
*/
|
||
|
#define MAX_PVA_TASK_COUNT 16
|
||
|
|
||
|
/**
|
||
|
* Minium PVA frequency (10MHz)
|
||
|
*/
|
||
|
#define MIN_PVA_FREQUENCY 10000000
|
||
|
|
||
|
/**
|
||
|
* @brief struct to hold the segment details
|
||
|
*
|
||
|
* addr: virtual addr of the segment from PRIV2 address base
|
||
|
* size: segment size
|
||
|
* offset: offset of the addr from priv2 base
|
||
|
*
|
||
|
*/
|
||
|
struct pva_seg_info {
|
||
|
void *addr;
|
||
|
u32 size;
|
||
|
u32 offset;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* @breif struct to hold the segment details for debug purpose
|
||
|
*
|
||
|
* pva Pointer to pva struct
|
||
|
* seg_info pva_seg_info struct
|
||
|
*
|
||
|
*/
|
||
|
struct pva_crashdump_debugfs_entry {
|
||
|
struct pva *pva;
|
||
|
struct pva_seg_info seg_info;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* @brief struct to handle dma alloc memory info
|
||
|
*
|
||
|
* size size allocated
|
||
|
* phys_addr physical address
|
||
|
* va virtual address
|
||
|
*
|
||
|
*/
|
||
|
struct pva_dma_alloc_info {
|
||
|
size_t size;
|
||
|
dma_addr_t pa;
|
||
|
void *va;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* @brief struct to handle the PVA firmware information
|
||
|
*
|
||
|
* hdr pointer to the pva_code_hdr struct
|
||
|
* priv1_buffer pva_dma_alloc_info for priv1_buffer
|
||
|
* priv2_buffer pva_dma_alloc_info for priv2_buffer
|
||
|
* priv2_reg_offset priv2 register offset from uCode
|
||
|
* attrs dma_attrs struct information
|
||
|
* trace_buffer_size buffer size for trace log
|
||
|
*
|
||
|
*/
|
||
|
struct pva_fw {
|
||
|
struct pva_ucode_hdr *hdr;
|
||
|
|
||
|
struct pva_dma_alloc_info priv1_buffer;
|
||
|
struct pva_dma_alloc_info priv2_buffer;
|
||
|
u32 priv2_reg_offset;
|
||
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 0)
|
||
|
struct dma_attrs attrs;
|
||
|
#else
|
||
|
unsigned long attrs;
|
||
|
#endif
|
||
|
|
||
|
u32 trace_buffer_size;
|
||
|
};
|
||
|
|
||
|
/*
|
||
|
* @brief store trace log segment's address and size
|
||
|
*
|
||
|
* addr Pointer to the pva trace log segment
|
||
|
* size Size of pva trace log segment
|
||
|
* offset Offset in bytes for trace log segment
|
||
|
*
|
||
|
*/
|
||
|
struct pva_trace_log {
|
||
|
void *addr;
|
||
|
u32 size;
|
||
|
u32 offset;
|
||
|
};
|
||
|
|
||
|
|
||
|
/*
|
||
|
* @brief stores address and other attributes of the vpu function table
|
||
|
*
|
||
|
* addr The pointer to start of the VPU function table
|
||
|
* size Table size of the function table
|
||
|
* handle The IOVA address of the function table
|
||
|
* entries The total number of entries in the function table
|
||
|
*
|
||
|
*/
|
||
|
struct pva_func_table {
|
||
|
struct vpu_func *addr;
|
||
|
uint32_t size;
|
||
|
dma_addr_t handle;
|
||
|
uint32_t entries;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* @brief Driver private data, shared with all applications
|
||
|
*
|
||
|
* pdev Pointer to the PVA device
|
||
|
* pool Pointer to Queue table available for the PVA
|
||
|
* fw_info firmware information struct
|
||
|
* irq IRQ number obtained on registering the module
|
||
|
* mailbox_mutex Mutex to avoid concurrent mailbox accesses
|
||
|
* mailbox_waitq Mailbox waitqueue for response waiters
|
||
|
* mailbox_status_regs Response is stored into this structure temporarily
|
||
|
* mailbox_status Status of the mailbox interface
|
||
|
* debugfs_entry_r5 debugfs segment information for r5
|
||
|
* debugfs_entry_vpu0 debugfs segment information for vpu0
|
||
|
* debugfs_entry_vpu1 debugfs segment information for vpu1
|
||
|
* priv1_dma struct pva_dma_alloc_info for priv1_dma
|
||
|
* priv2_dma struct pva_dma_alloc_info for priv2_dma
|
||
|
* pva_trace struct for pva_trace_log
|
||
|
* submit_mode Select the task submit mode
|
||
|
* dbg_vpu_app_id Set the vpu_app id to debug
|
||
|
* r5_dbg_wait Set the r5 debugger to wait
|
||
|
* timeout_enabled Set pva timeout enabled based on debug
|
||
|
* slcg_disable Second level Clock Gating control variable
|
||
|
*
|
||
|
*/
|
||
|
struct pva {
|
||
|
struct platform_device *pdev;
|
||
|
struct nvhost_queue_pool *pool;
|
||
|
struct pva_fw fw_info;
|
||
|
|
||
|
int irq;
|
||
|
|
||
|
wait_queue_head_t mailbox_waitqueue;
|
||
|
struct pva_mailbox_status_regs mailbox_status_regs;
|
||
|
enum pva_mailbox_status mailbox_status;
|
||
|
struct mutex mailbox_mutex;
|
||
|
|
||
|
struct mutex ccq_mutex;
|
||
|
|
||
|
struct pva_crashdump_debugfs_entry debugfs_entry_r5;
|
||
|
struct pva_crashdump_debugfs_entry debugfs_entry_vpu0;
|
||
|
struct pva_crashdump_debugfs_entry debugfs_entry_vpu1;
|
||
|
|
||
|
struct pva_dma_alloc_info priv1_dma;
|
||
|
struct pva_dma_alloc_info priv2_dma;
|
||
|
|
||
|
struct pva_trace_log pva_trace;
|
||
|
u32 submit_mode;
|
||
|
|
||
|
u32 dbg_vpu_app_id;
|
||
|
u32 r5_dbg_wait;
|
||
|
bool timeout_enabled;
|
||
|
u32 slcg_disable;
|
||
|
u32 vmem_war_disable;
|
||
|
bool vpu_perf_counters_enable;
|
||
|
|
||
|
struct work_struct pva_abort_handler_work;
|
||
|
bool booted;
|
||
|
|
||
|
u32 log_level;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* @brief Copy traces to kernel trace buffer.
|
||
|
*
|
||
|
* When mailbox interrupt for copying ucode trace buffer to
|
||
|
* kernel-ucode shared trace buffer is arrived it copies the kernel-ucode
|
||
|
* shared trace buffer to kernel ftrace buffer
|
||
|
*
|
||
|
* @pva Pointer to pva structure
|
||
|
*
|
||
|
*/
|
||
|
void pva_trace_copy_to_ftrace(struct pva *pva);
|
||
|
|
||
|
/**
|
||
|
* @brief Finalize the PVA Power-on-Sequence.
|
||
|
*
|
||
|
* This function called from host subsystem driver after the PVA
|
||
|
* partition has been brought up, clocks enabled and reset deasserted.
|
||
|
* In production mode, the function needs to wait until the ready bit
|
||
|
* within the PVA aperture has been set. After that enable the PVA IRQ.
|
||
|
* Register the queue priorities on the PVA.
|
||
|
*
|
||
|
* @param pdev Pointer to PVA device
|
||
|
* @return: 0 on Success or negative error code
|
||
|
*
|
||
|
*/
|
||
|
int pva_finalize_poweron(struct platform_device *pdev);
|
||
|
|
||
|
/**
|
||
|
* @brief Prepare PVA poweroff.
|
||
|
*
|
||
|
* This function called from host subsystem driver before turning off
|
||
|
* the PVA. The function should turn off the PVA IRQ.
|
||
|
*
|
||
|
* @param pdev Pointer to PVA device
|
||
|
* @return 0 on Success or negative error code
|
||
|
*
|
||
|
*/
|
||
|
int pva_prepare_poweroff(struct platform_device *pdev);
|
||
|
|
||
|
/**
|
||
|
* @brief Register PVA ISR.
|
||
|
*
|
||
|
* This function called from driver to register the
|
||
|
* PVA ISR with IRQ.
|
||
|
*
|
||
|
* @param pdev Pointer to PVA device
|
||
|
* @return 0 on Success or negative error code
|
||
|
*
|
||
|
*/
|
||
|
int pva_register_isr(struct platform_device *dev);
|
||
|
|
||
|
/**
|
||
|
* @brief Initiallze pva debug utils
|
||
|
*
|
||
|
* @param pdev Pointer to PVA device
|
||
|
* @return none
|
||
|
*
|
||
|
*/
|
||
|
void pva_debugfs_init(struct platform_device *pdev);
|
||
|
|
||
|
/**
|
||
|
* @brief Initiallze PVA abort handler
|
||
|
*
|
||
|
* @param pva Pointer to PVA structure
|
||
|
* @return none
|
||
|
*
|
||
|
*/
|
||
|
void pva_abort_init(struct pva *pva);
|
||
|
|
||
|
/**
|
||
|
* @brief Recover PVA back into working state
|
||
|
*
|
||
|
* @param pva Pointer to PVA structure
|
||
|
* @return none
|
||
|
*
|
||
|
*/
|
||
|
void pva_abort(struct pva *pva);
|
||
|
|
||
|
/**
|
||
|
* @brief Run the ucode selftests
|
||
|
*
|
||
|
* This function is invoked if the ucode is in selftest mode.
|
||
|
* The function will do the static memory allocation for the
|
||
|
* ucode self test to run.
|
||
|
*
|
||
|
* @param pdev Pointer to PVA device
|
||
|
* @return 0 on Success or negative error code
|
||
|
*
|
||
|
*/
|
||
|
int pva_run_ucode_selftest(struct platform_device *pdev);
|
||
|
|
||
|
/**
|
||
|
* @brief Allocate and populate the function table to the memory
|
||
|
*
|
||
|
* This function is called when the vpu table needs to be populated.
|
||
|
* The function also allocates the memory required for the vpu table.
|
||
|
*
|
||
|
* @param pva Pointer to PVA device
|
||
|
* @param pva_func_table Pointer to the function table which contains
|
||
|
* the address, table size and number of entries
|
||
|
* @return 0 on Success or negative error code
|
||
|
*
|
||
|
*/
|
||
|
int pva_alloc_and_populate_function_table(struct pva *pva,
|
||
|
struct pva_func_table *fn_table);
|
||
|
|
||
|
/**
|
||
|
* @brief Deallocate the memory of the function table
|
||
|
*
|
||
|
* This function is called once the allocated memory for vpu table needs to
|
||
|
* be freed.
|
||
|
*
|
||
|
* @param pva Pointer to PVA device
|
||
|
* @param pva_func_table Pointer to the function table which contains
|
||
|
* the address, table size and number of entries
|
||
|
*
|
||
|
*/
|
||
|
void pva_dealloc_vpu_function_table(struct pva *pva,
|
||
|
struct pva_func_table *fn_table);
|
||
|
|
||
|
/**
|
||
|
* @brief Get PVA version information
|
||
|
*
|
||
|
* @param pva Pointer to a PVA device node
|
||
|
* @param info Pointer to an information structure to be filled
|
||
|
*
|
||
|
* @return 0 on success, otherwise a negative error code
|
||
|
*/
|
||
|
int pva_get_firmware_version(struct pva *pva,
|
||
|
struct pva_version_info *info);
|
||
|
|
||
|
/**
|
||
|
* @brief Set trace log level of PVA
|
||
|
*
|
||
|
* @param pva Pointer to a PVA device node
|
||
|
* @param log_level 32-bit mask for logs that we want to receive
|
||
|
*
|
||
|
* @return 0 on success, otherwise a negative error code
|
||
|
*/
|
||
|
int pva_set_log_level(struct pva *pva,
|
||
|
u32 log_level);
|
||
|
#endif
|