/* * 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 . */ #ifndef _PVA_INTERFACE_H_ #define _PVA_INTERFACE_H_ #include "pva-bit.h" #include "pva-errors.h" /* * Register definition for PVA_SHRD_SMP_STA0 * * This is used to communicate various bits of information between the * OS and the PVA. */ /* * Bits set by the OS and examined by the R5 */ #define PVA_BOOT_INT PVA_BIT(31) /* OS wants an interrupt */ #define PVA_OS_PRINT PVA_BIT(30) /* OS will process print */ #define PVA_TEST_WAIT PVA_BIT(29) /* R5 wait to start tests */ #define PVA_TEST_RUN PVA_BIT(28) /* Start tests */ #define PVA_WAIT_DEBUG PVA_BIT(24) /* Spin-wait early in boot */ #define PVA_CG_DISABLE PVA_BIT(20) /* Disable PVA clock gating */ #define PVA_VMEM_RD_WAR_DISABLE PVA_BIT(19) /* Disable VMEM RD fail WAR */ #define PVA_VMEM_MBX_WAR_ENABLE PVA_BIT(18) /* WAR for Bug 2090939 enabled*/ /* * Bits set by the R5 and examined by the OS */ #define PVA_TESTS_STARTED PVA_BIT(10) /* PVA Tests started */ #define PVA_TESTS_PASSED PVA_BIT(9) /* PVA Tests passed */ #define PVA_TESTS_FAILED PVA_BIT(8) /* PVA Tests failed */ #define PVA_HALTED PVA_BIT(2) /* PVA uCode halted */ #define PVA_BOOT_DONE PVA_BIT(1) /* PVA is "ready" */ #define PVA_TEST_MODE PVA_BIT(0) /* PVA is in "test mode" */ /* * Symbolic definitions of the mailbox registers (rather than using 0-7) */ #define PVA_MBOX_COMMAND 0U #define PVA_MBOX_ADDR 1U #define PVA_MBOX_LENGTH 2U #define PVA_MBOX_ARG 3U #define PVA_MBOX_SIDE_CHANNEL_HOST_WR 4U #define PVA_MBOX_AISR 5U #define PVA_MBOX_SIDE_CHANNEL_HOST_RD 6U #define PVA_MBOX_ISR 7U /* * Mailbox side channel bit definitions */ #define PVA_SIDE_CHANNEL_MBOX_BIT 0U #define PVA_SIDE_CHANNEL_MBOX_BIT_MASK (~(1U << PVA_SIDE_CHANNEL_MBOX_BIT)) /* * Code checking the version of the R5 uCode should check * the values returned from the R5_VERSION subcommand of * CMD_GET_STATUS to determine if the version currently * running on the PVA's R5 is compatible with what the * driver was compiled against. */ #define PVA_R5_VERSION \ PVA_MAKE_VERSION(0, \ PVA_VERSION_MAJOR, \ PVA_VERSION_MINOR, \ PVA_VERSION_SUBMINOR) /* * PVA interrupt status register contained in PVA_MBOX_ISR. */ #define PVA_INT_PENDING PVA_BIT(31) #define PVA_READY PVA_BIT(30) #define PVA_BUSY PVA_BIT(29) #define PVA_CMD_COMPLETE PVA_BIT(28) #define PVA_CMD_ERROR PVA_BIT(27) #define PVA_VALID_STATUS7 PVA_BIT(26) #define PVA_VALID_STATUS6 PVA_BIT(25) #define PVA_VALID_STATUS5 PVA_BIT(24) #define PVA_VALID_STATUS4 PVA_BIT(23) #define PVA_VALID_STATUS3 PVA_BIT(22) /* * PVA interrupt status register contained in PVA_MBOX_AISR */ #define PVA_AISR_INT_PENDING PVA_BIT(31) #define PVA_AISR_TASK_COMPLETE PVA_BIT(28) #define PVA_AISR_TASK_ERROR PVA_BIT(27) #define PVA_AISR_THRESHOLD_EXCEEDED PVA_BIT(26) #define PVA_AISR_LOGGING_OVERFLOW PVA_BIT(25) #define PVA_AISR_PRINTF_OVERFLOW PVA_BIT(24) #define PVA_AISR_CRASH_LOG PVA_BIT(23) #define PVA_AISR_ABORT PVA_BIT(0) #define PVA_GET_ERROR_CODE(_s_) PVA_EXTRACT(_s_, 15, 0, enum pva_errors) /* * Commands that can be sent to the PVA through the PVA_SHRD_MBOX * interface. */ enum pva_cmds { CMD_NOOP = 0, CMD_GET_STATUS = 1, CMD_MANAGE_STATISTICS = 2, CMD_SET_REGION = 3, CMD_SET_LOGGING = 4, CMD_PVA_CONTROL = 5, CMD_VPU_CONTROL = 6, CMD_SET_QUEUE_ATTRIBUTES = 7, CMD_SUBMIT = 8, CMD_SUSPEND = 9, CMD_RESUME = 10, CMD_FLUSH = 11, CMD_SET_THRESHOLD = 12, CMD_CLEAR_THRESHOLD = 13, CMD_RESET = 14, CMD_GET_VPU_FUNC_TABLE = 15, CMD_SET_SYNC_POLLING = 16, CMD_SET_SCHEDULER = 17, CMD_SET_SCHED_ATTR = 18, CMD_NEXT = 19, /* Must be last */ }; /* * CMD_GET_STATUS subcommands */ enum pva_status_cmds { R5_VERSION = 0, VPU_VERSION = 1, PVA_HW_CONFIG = 2, PVA_SW_CONFIG = 3, VPU_UTILIZATION = 4, QUEUE_DEPTH = 5, QUEUE_WAIT_TIME = 6, WAIT_TIMES = 7, RUN_TIMES = 8, IDLE_TIME = 9, RUNNING_TASKS = 10, PVA_UPTIME = 11, PVA_ERRORS = 12, LOGGING_INFO = 13, PRINTF_INFO = 14, CRASH_INFO = 15, THRESHOLD = 16, THRESHOLDS_EXCEEDED = 17, QUEUE_ATTRIBUTES = 18, COMPLETED_TASK = 19, VMEM_USAGE = 20, SYNC_POLL_RATE = 21, SCHEDULER_ATTRIBUTES = 22, GET_STATUS_NEXT = 23, }; /* * Statistics IDs */ enum pva_stats_ids { PVA_VPU = 0, PVA_QUEUE = 1, PVA_R5 = 2, PVA_ALL = 255, }; /* * Region ID's */ enum pva_region_ids { PVA_REGION_LOGGING = 1, PVA_REGION_PRINTF = 2, PVA_REGION_CRASH_DUMP = 3, PVA_REGION_STATUS = 4, }; /* * Queue Attribute ID's */ enum pva_queue_attr_id { QUEUE_ATTR_PRIORITY = 1, QUEUE_ATTR_VPU = 2, QUEUE_ATTR_MISR_TO = 3, QUEUE_ATTR_MAX = 4, }; #define PVA_QUEUE_DEFAULT_PRIORITY 2U #define PVA_QUEUE_DEFAULT_VPU_MASK 3U /* * Threshold ID's */ enum pva_threshold_id { THRESHOLD_IDLE_TIME = 0, THRESHOLD_UTILIZATION = 1, THRESHOLD_LOW_UTILIZATION = 2, THRESHOLD_ANY_QUEUE_DEPTH = 3, THRESHOLD_QUEUE_DEPTH = 4, THRESHOLD_ANY_WAIT_TIME = 5, THRESHOLD_WAIT_TIME = 6, THRESHOLD_RUN_TIME = 7, THRESHOLD_HW_ERRORS = 8, THRESHOLD_R5_CRIT_ERRORS = 9, THRESHOLD_R5_ERRORS = 10, THRESHOLD_VPU_CRIT_ERRORS = 11, THRESHOLD_VPU_ERRORS = 12, THRESHOLD_PVA_ERRORS = 13, THRESHOLD_LAST = 13, /* must be updated as new ones added */ }; /* * Reset ID's */ enum pva_reset_id { RESET_VPU0 = 0, RESET_VPU1 = 1, RESET_DMA0 = 0x10, RESET_DMA1 = 0x11, }; /* * Scheduler ID's */ enum pva_sched_id { PVA_SCHED_PRIORITY_RR = 0U, PVA_SCHED_FIXED = 1U, PVA_SCHED_DEADLINE = 2U, PVA_SCHED_LAST = 2U, /* must be updated as new ones added */ PVA_SCHED_CURRENT = 0xFFU, }; /* * Scheduler Attribute ID's */ enum pva_sched_attr_id { PVA_SCHED_ATTR_CURRENT = 0x00U, PVA_SCHED_ACTIVE = 0x01U, PVA_SCHED_FIXED_BUFF0 = 0x10U, PVA_SCHED_FIXED_BUFF1 = 0x11U, }; /* * Scheduler Attributes */ struct pva_sched_attr { uint32_t attr_a; uint32_t attr_b; }; /* * Attributes for PVA_SCHED_ACTIVE */ #define PVA_SCHED_ATTR_ACTIVE_ENABLED PVA_BIT(31) #define PVA_SCHED_ATTR_ACTIVE_SCHED_ID(_x_) \ PVA_EXTRACT(_x_, 7, 0, enum pva_sched_id) static inline uint32_t pva_get_sched_attr_active_enabled(struct pva_sched_attr * const attrs) { return attrs->attr_a & PVA_SCHED_ATTR_ACTIVE_ENABLED; } static inline enum pva_sched_id pva_get_sched_attr_active_sched_id(struct pva_sched_attr * const attrs) { return PVA_SCHED_ATTR_ACTIVE_SCHED_ID(attrs->attr_a); } /* * Attributes for PVA_SCHED_FIXED0 & PVA_SCHED_FIXED1 */ #define PVA_SCHED_ATTR_FIXED_VALID PVA_BIT(31) #define PVA_SCHED_ATTR_FIXED_REPEAT PVA_BIT(30) #define PVA_SCHED_ATTR_FIXED_LOADED PVA_BIT(29) #define PVA_SCHED_ATTR_FIXED_NEXT PVA_BIT(28) static inline uint32_t pva_get_sched_attr_fixed_valid(struct pva_sched_attr * const attrs) { return attrs->attr_a & PVA_SCHED_ATTR_FIXED_VALID; } static inline uint32_t pva_get_sched_attr_fixed_repeat(struct pva_sched_attr * const attrs) { return attrs->attr_a & PVA_SCHED_ATTR_FIXED_REPEAT; } static inline uint32_t pva_get_sched_attr_fixed_loaded(struct pva_sched_attr * const attrs) { return attrs->attr_a & PVA_SCHED_ATTR_FIXED_LOADED; } static inline uint32_t pva_get_sched_attr_fixed_next(struct pva_sched_attr * const attrs) { return attrs->attr_a & PVA_SCHED_ATTR_FIXED_NEXT; } static inline uint32_t pva_get_sched_attr_fixed_offset(struct pva_sched_attr *const attrs) { return PVA_EXTRACT(attrs->attr_a, 23, 16, uint32_t); } static inline uint32_t pva_get_sched_attr_fixed_size(struct pva_sched_attr * const attrs) { return PVA_EXTRACT(attrs->attr_a, 15, 8, uint32_t); } static inline uint64_t pva_get_sched_attr_fixed_addr(struct pva_sched_attr *const attrs) { return PVA_PACK64(attrs->attr_b, PVA_EXTRACT(attrs->attr_a, 7, 0, uint32_t)); } static inline void pva_set_sched_attr_fixed(struct pva_sched_attr * const attrs, const uint32_t flags, const uint32_t size, const uint64_t addr) { attrs->attr_a = (flags & ~(PVA_SCHED_ATTR_FIXED_LOADED | PVA_SCHED_ATTR_FIXED_NEXT)) | PVA_INSERT(size, 15, 8) | PVA_INSERT(PVA_HI32(addr), 7, 0); attrs->attr_b = PVA_LOW32(addr); } /* * Generic fields in a command sent to the PVA through the PVA_SHRD_MBOX * interface. */ #define PVA_CMD_GO PVA_BIT(31) #define PVA_CMD_INT_ON_ERR PVA_BIT(30) #define PVA_CMD_INT_ON_COMPLETE PVA_BIT(29) #define PVA_GET_SUBCOMMAND(_c_, _t_) PVA_EXTRACT(_c_, 15, 8, _t_) #define PVA_SET_SUBCOMMAND(_c_) PVA_INSERT(_c_, 15, 8) #define PVA_GET_COMMAND(_c_) PVA_EXTRACT(_c_, 7, 0, enum pva_cmds) #define PVA_SET_COMMAND(_c_) PVA_INSERT(_c_, 7, 0) /* * Generic fields in a command sent through the command FIFO interface. */ #define PVA_FIFO_GET_COMMAND(_c_) PVA_EXTRACT64(_c_, 63, 56, enum pva_cmds) #define PVA_FIFO_INT_ON_ERR PVA_BIT64(1) #define PVA_FIFO_INT_ON_COMPLETE PVA_BIT64(0) /* * Structure for managing commands through PVA_SHRD_MBOX* */ struct pva_cmd { uint32_t mbox[4]; }; /* * CMD_NOOP command */ #define PVA_CMD_FL_NOOP_ECHO PVA_BIT(28) #define PVA_CMD_FL_NOOP_ERROR PVA_BIT(27) static inline uint32_t pva_cmd_noop(struct pva_cmd * const cmd, const uint32_t echo_data, const uint32_t status_reg, const uint32_t flags) { cmd->mbox[0] = PVA_CMD_GO | flags | PVA_SET_SUBCOMMAND(status_reg) | PVA_SET_COMMAND(CMD_NOOP); cmd->mbox[1] = echo_data; return 2U; } /* * CMD_GET_STATUS * Not used directly. */ static inline uint32_t pva_cmd_get_status(const enum pva_status_cmds subcommand, const uint32_t flags) { return PVA_CMD_GO | flags | PVA_SET_SUBCOMMAND(subcommand) | PVA_SET_COMMAND(CMD_GET_STATUS); } /* * R5_VERSION get status command */ struct pva_status_R5_version { uint32_t cur_version; uint32_t oldest_version; uint32_t change_id; uint32_t build_date; }; static inline uint32_t pva_cmd_R5_version(struct pva_cmd * const cmd, const uint32_t flags) { cmd->mbox[0] = pva_cmd_get_status(R5_VERSION, flags); return 1U; } /* * VPU_VERSION get status command */ struct pva_status_VPU_version { uint32_t cur_version; uint32_t oldest_version; uint32_t change_id; uint32_t build_date; }; static inline uint32_t pva_cmd_VPU_version(struct pva_cmd * const cmd, const uint32_t flags) { cmd->mbox[0] = pva_cmd_get_status(VPU_VERSION, flags); return 1U; } /* * PVA_HW_CONFIG get status command */ struct pva_status_pva_hw_config { uint32_t version; uint32_t r5_sizes; uint32_t vpu_sizes; uint32_t dma_info; }; static inline uint32_t pva_cmd_pva_hw_config(struct pva_cmd * const cmd, const uint32_t flags) { cmd->mbox[0] = pva_cmd_get_status(PVA_HW_CONFIG, flags); return 1U; } static inline uint32_t pva_get_hw_version(struct pva_status_pva_hw_config * const status) { return PVA_EXTRACT(status->version, 31, 24, uint32_t); } static inline uint32_t pva_get_vpu_isa_version(struct pva_status_pva_hw_config * const status) { return PVA_EXTRACT(status->version, 23, 16, uint32_t); } static inline uint32_t pva_get_num_vpus(struct pva_status_pva_hw_config * const status) { return PVA_EXTRACT(status->version, 7, 4, uint32_t); } static inline uint32_t pva_get_num_dma_engines(struct pva_status_pva_hw_config * const status) { return PVA_EXTRACT(status->version, 3, 0, uint32_t); } static inline uint32_t pva_get_r5_icache_size(struct pva_status_pva_hw_config * const status) { return PVA_EXTRACT(status->r5_sizes, 31, 24, uint32_t); } static inline uint32_t pva_get_r5_dcache_size(struct pva_status_pva_hw_config * const status) { return PVA_EXTRACT(status->r5_sizes, 23, 16, uint32_t); } static inline uint32_t pva_get_tcma_size(struct pva_status_pva_hw_config * const status) { return PVA_EXTRACT(status->r5_sizes, 15, 8, uint32_t); } static inline uint32_t pva_get_tcmb_size(struct pva_status_pva_hw_config * const status) { return PVA_EXTRACT(status->r5_sizes, 7, 0, uint32_t); } static inline uint32_t pva_get_vpu_icache_size(struct pva_status_pva_hw_config * const status) { return PVA_EXTRACT(status->vpu_sizes, 31, 24, uint32_t); } static inline uint32_t pva_get_vpu_dcache_size(struct pva_status_pva_hw_config * const status) { return PVA_EXTRACT(status->vpu_sizes, 23, 16, uint32_t); } static inline uint32_t pva_get_num_vrams(struct pva_status_pva_hw_config * const status) { return PVA_EXTRACT(status->vpu_sizes, 15, 8, uint32_t); } static inline uint32_t pva_get_vram_size(struct pva_status_pva_hw_config * const status) { return PVA_EXTRACT(status->vpu_sizes, 7, 0, uint32_t); } /* * PVA_SW_CONFIG get status command */ struct pva_status_pva_sw_config { uint32_t sw_status; uint32_t reserved1; uint32_t reserved2; uint32_t reserved3; }; static inline uint32_t pva_cmd_pva_sw_config(struct pva_cmd * const cmd, const uint32_t flags) { cmd->mbox[0] = pva_cmd_get_status(PVA_SW_CONFIG, flags); return 1U; } #define PVA_SW_IN_TCM PVA_BIT(31) #define PVA_SW_FPU_ENABLED PVA_BIT(30) #define PVA_SW_PROCESSING_ENABLED PVA_BIT(28) #define PVA_SW_LOGGING_SUPPORTED PVA_BIT(27) #define PVA_SW_PRINTF_SUPPORTED PVA_BIT(26) #define PVA_SW_CRASHDUMP_SUPPORTED PVA_BIT(25) #define PVA_SW_STATISTICS_SUPPORTED PVA_BIT(24) #define pva_get_sw_num_queues(_x_) PVA_EXTRACT(_x_, 23, 16, uint32_t) #define pva_get_sw_num_vpus(_x_) PVA_EXTRACT(_x_, 7, 4, uint32_t) #define pva_get_sw_num_dma_engines(_x_) PVA_EXTRACT(_x_, 3, 0, uint32_t) /* * VPU_UTILIZATION get status command */ struct pva_status_vpu_utilization { uint32_t vpu0_utilization; uint32_t vpu1_utilization; uint32_t reserved1; uint32_t reserved2; }; static inline uint32_t pva_cmd_vpu_utilization(struct pva_cmd * const cmd, const uint32_t flags) { cmd->mbox[0] = pva_cmd_get_status(VPU_UTILIZATION, flags); return 1U; } /* * QUEUE_DEPTH get status command */ struct pva_status_queue_depth { uint32_t cur_depth; uint32_t avg_depth; uint32_t min_depth; uint32_t max_depth; }; static inline uint32_t pva_cmd_queue_depth(struct pva_cmd * const cmd, const uint8_t queue, const uint32_t flags) { cmd->mbox[0] = pva_cmd_get_status(QUEUE_DEPTH, flags) | PVA_INSERT(queue, 23, 16); return 1U; } /* * QUEUE_WAIT_TIMES get status command */ struct pva_status_queue_wait_times { uint32_t reserved; uint32_t avg_wait; uint32_t min_wait; uint32_t max_wait; }; static inline uint32_t pva_cmd_queue_wait_times(struct pva_cmd * const cmd, const uint8_t queue, const uint32_t flags) { cmd->mbox[0] = pva_cmd_get_status(QUEUE_WAIT_TIME, flags) | PVA_INSERT(queue, 23, 16); return 1U; } /* * WAIT_TIMES get status command */ struct pva_status_wait_times { uint32_t reserved; uint32_t avg_wait; uint32_t min_wait; uint32_t max_wait; }; static inline uint32_t pva_cmd_wait_times(struct pva_cmd * const cmd, const uint32_t flags) { cmd->mbox[0] = pva_cmd_get_status(WAIT_TIMES, flags); return 1U; } /* * RUN_TIMES get status command */ #define PVA_CMD_FL_RUN_TIME_TOTALS PVA_BIT(28) union pva_status_run_times { struct { uint32_t num_tasks; uint32_t avg_run; uint32_t min_run; uint32_t max_run; } stats; struct { uint32_t num_tasks; uint32_t reserved; uint32_t total_lo; uint32_t total_hi; } totals; }; static inline uint32_t pva_cmd_run_times(struct pva_cmd * const cmd, const uint8_t vpu, const uint32_t flags) { cmd->mbox[0] = pva_cmd_get_status(RUN_TIMES, flags) | PVA_INSERT(vpu, 23, 16); return 1U; } /* * IDLE_TIME get status command */ #define PVA_IDLE_TIME_TOTALS PVA_BIT(28) union pva_status_idle_time { struct { uint32_t num_idles; uint32_t avg_idle; uint32_t min_idle; uint32_t max_idle; } stats; struct { uint32_t num_idles; uint32_t reserved; uint32_t total_lo; uint32_t total_hi; } totals; }; static inline uint32_t pva_cmd_idle_times(struct pva_cmd * const cmd, const uint8_t vpu, const uint32_t flags) { cmd->mbox[0] = pva_cmd_get_status(IDLE_TIME, flags) | PVA_INSERT(vpu, 23, 16); return 1U; } /* * RUNNING_TASKS get status command */ struct pva_status_running_tasks { uint32_t task_addr_lo; uint32_t task_addr_hi; }; static inline uint32_t pva_cmd_running_tasks(struct pva_cmd * const cmd, const uint8_t vpu, const uint32_t flags) { cmd->mbox[0] = pva_cmd_get_status(RUNNING_TASKS, flags) | PVA_INSERT(vpu, 23, 16); return 1U; } #define PVA_RUNNING_TASK_VALID PVA_BIT64(63) #define pva_get_task_addr(_a_) PVA_EXTRACT64(_a_, 39, 0, uint64_t) /* * PVA_UPTIME get status command */ struct pva_status_pva_uptime { uint32_t uptime_lo; uint32_t uptime_hi; }; static inline uint32_t pva_cmd_pva_uptime(struct pva_cmd * const cmd, const uint8_t vpu, const uint32_t flags) { cmd->mbox[0] = pva_cmd_get_status(PVA_UPTIME, flags) | PVA_INSERT(vpu, 23, 16); return 1U; } /* * PVA_ERRORS get status command */ struct pva_status_pva_errors { uint32_t num_fatal_errors; uint32_t num_input_errors; uint32_t num_sw_errors; uint32_t num_hw_errors; }; static inline uint32_t pva_cmd_pva_errors(struct pva_cmd * const cmd, const uint8_t vpu, const uint32_t flags) { cmd->mbox[0] = pva_cmd_get_status(PVA_ERRORS, flags) | PVA_INSERT(vpu, 23, 16); return 1U; } /* * LOGGING_INFO get status command */ struct pva_status_logging_info { uint32_t status; uint32_t length; uint32_t addr_lo; uint32_t addr_hi; }; static inline uint32_t pva_cmd_logging_info(struct pva_cmd * const cmd, const uint32_t flags) { cmd->mbox[0] = pva_cmd_get_status(LOGGING_INFO, flags); return 1U; } #define PVA_LOG_PVA_ENABLED PVA_BIT(31) #define PVA_LOG_R5_ENABLED PVA_BIT(30) #define PVA_LOG_VPU_ENABLED PVA_BIT(29) #define PVA_LOG_PVA_ACTIVE PVA_BIT(28) #define pva_get_pva_log_level(_x_) PVA_EXTRACT(_x_, 23, 16, uint32_t) #define pva_get_r5_log_level(_x_) PVA_EXTRACT(_x_, 15, 8, uint32_t) #define pva_get_vpu_log_level(_x_) PVA_EXTRACT(_x_, 7, 0, uint32_t) #define pva_get_crit_level(_l_) PVA_EXTRACT(_l_, 7, 6, uint32_t) #define pva_get_error_level(_l_) PVA_EXTRACT(_l_, 5, 4, uint32_t) #define pva_get_info_level(_l_) PVA_EXTRACT(_l_, 3, 2, uint32_t) #define pva_get_debug_level(_l_) PVA_EXTRACT(_l_, 1, 0, uint32_t) /* * PRINTF_INFO get status command */ struct pva_status_printf_info { uint32_t status; uint32_t length; uint32_t addr_lo; uint32_t addr_hi; }; static inline uint32_t pva_cmd_printf_info(struct pva_cmd * const cmd, const uint32_t flags) { cmd->mbox[0] = pva_cmd_get_status(PRINTF_INFO, flags); return 1U; } #define PVA_PRINT_PVA_ENABLED PVA_BIT(31) #define PVA_PRINT_R5_ENABLED PVA_BIT(30) #define PVA_PRINT_VPU_ENABLED PVA_BIT(29) #define PVA_PRINT_PVA_ACTIVE PVA_BIT(28) #define pva_get_pva_print_level(_x_) PVA_EXTRACT(_x_, 23, 16, uint32_t) #define pva_get_r5_print_level(_x_) PVA_EXTRACT(_x_, 15, 8, uint32_t) #define pva_get_vpu_print_level(_x_) PVA_EXTRACT(_x_, 7, 0, uint32_t) /* * CRASH_INFO get status command */ struct pva_status_crash_info { uint32_t status; uint32_t length; uint32_t addr_lo; uint32_t addr_hi; }; static inline uint32_t pva_cmd_crash_info(struct pva_cmd * const cmd, const uint32_t flags) { cmd->mbox[0] = pva_cmd_get_status(CRASH_INFO, flags); return 1U; } #define PVA_CRASH_PVA_ENABLED PVA_BIT(31) #define PVA_CRASH_R5_ENABLED PVA_BIT(30) #define PVA_CRASH_VPU_ENABLED PVA_BIT(29) #define PVA_CRASH_R5_CRASHED_INT PVA_BIT(27) #define PVA_CRASH_VPU0_CRASHED_INT PVA_BIT(26) #define PVA_CRASH_VPU1_CRASHED_INT PVA_BIT(25) #define PVA_CRASH_R5_CRASHED PVA_BIT(15) #define PVA_CRASH_VPU0_CRASHED PVA_BIT(14) #define PVA_CRASH_VPU1_CRASHED PVA_BIT(13) /* * THRESHOLD get status command */ struct pva_status_threshold { uint32_t value; uint32_t count; uint32_t cur_count; uint32_t reserved; }; static inline uint32_t pva_cmd_threshold(struct pva_cmd * const cmd, const enum pva_threshold_id threshold_id, const uint32_t flags) { cmd->mbox[0] = pva_cmd_get_status(THRESHOLD, flags) | PVA_INSERT(threshold_id, 23, 16); return 1U; } /* * THRESHOLDS_EXCEEDED get status command */ struct pva_status_thresholds_exceeded { uint32_t status; uint32_t reserved1; uint32_t reserved2; uint32_t reserved3; }; static inline uint32_t pva_cmd_thresholds_exceeded(struct pva_cmd * const cmd, const uint32_t flags) { cmd->mbox[0] = pva_cmd_get_status(THRESHOLDS_EXCEEDED, flags); return 1U; } #define PVA_IDLE_TIME_EXCEEDED PVA_BIT(31) #define PVA_UTILIZATION_EXCEEDED PVA_BIT(30) #define PVA_LOW_UTILIZATION PVA_BIT(29) #define PVA_QUEUE_DEPTH_EXCEEDED PVA_BIT(8) #define PVA_WAIT_TIME_EXCEEDED PVA_BIT(7) #define PVA_RUN_TIME_EXCEEDED PVA_BIT(6) #define PVA_HW_ERRORS_EXCEEDED PVA_BIT(5) #define PVA_R5_CRIT_ERRORS PVA_BIT(4) #define PVA_R5_ERRORS PVA_BIT(3) #define PVA_VPU_CRIT_ERRORS PVA_BIT(2) #define PVA_VPU_ERRORS PVA_BIT(1) #define PVA_TOTAL_ERRORS PVA_BIT(0) /* * QUEUE_ATTRIBUTES get status command */ struct pva_status_queue_attributes { uint32_t attribute; uint32_t reserved1; uint32_t reserved2; uint32_t reserved3; }; static inline uint32_t pva_cmd_queue_attributes(struct pva_cmd * const cmd, const uint8_t queue_id, const enum pva_queue_attr_id attribute_id, const uint32_t flags) { cmd->mbox[0] = pva_cmd_get_status(QUEUE_ATTRIBUTES, flags) | PVA_INSERT(queue_id, 23, 16); cmd->mbox[1] = (uint32_t)attribute_id; return 2U; } /* * COMPLETED_TASK get status command */ struct pva_status_completed_task { uint32_t task_addr_lo; uint32_t task_addr_hi; uint32_t task_error; uint32_t task_queue_vpu; }; static inline uint32_t pva_cmd_completed_task(struct pva_cmd * const cmd, const uint32_t flags) { cmd->mbox[0] = pva_cmd_get_status(COMPLETED_TASK, flags); return 1U; } /* * VMEM_USAGE get status command */ struct pva_status_vmem_usage { uint32_t offset; uint32_t reserved1; uint32_t reserved2; uint32_t reserved3; }; static inline uint32_t pva_cmd_vmem_usage(struct pva_cmd * const cmd, const uint8_t vpu, const uint8_t vmem_id, const uint32_t flags) { cmd->mbox[0] = pva_cmd_get_status(VMEM_USAGE, flags) | PVA_INSERT(vpu, 23, 16); cmd->mbox[1] = vmem_id; return 2U; } /* * SYNC_POLL_RATE get status command */ struct pva_status_sync_poll_rate { uint32_t cur_rate; uint32_t min_rate; uint32_t reserved1; uint32_t reserved2; }; static inline uint32_t pva_cmd_sync_poll_rate(struct pva_cmd * const cmd, const uint32_t flags) { cmd->mbox[0] = pva_cmd_get_status(SYNC_POLL_RATE, flags); return 1U; } /* * SCHEDULER_ATTRIBUTES get status command */ struct pva_status_scheduler_attributes { uint32_t attr_lo; uint32_t attr_hi; uint32_t reserved1; uint32_t reserved2; }; static inline uint32_t pva_cmd_scheduler_attributes(struct pva_cmd * const cmd, const enum pva_sched_id sched_id, const enum pva_sched_attr_id attr_id, const uint32_t flags) { cmd->mbox[0] = pva_cmd_get_status(SCHEDULER_ATTRIBUTES, flags) | PVA_INSERT(sched_id, 23, 16); cmd->mbox[1] = (uint32_t)attr_id; return 2U; } /* * CMD_MANAGE_STATISTICS */ static inline uint32_t pva_cmd_manage_statistics(struct pva_cmd * const cmd, const enum pva_stats_ids stat_id, const uint32_t instance, const uint32_t flags) { cmd->mbox[0] = PVA_CMD_GO | flags | PVA_SET_COMMAND(CMD_MANAGE_STATISTICS) | PVA_INSERT(stat_id, 15, 8) | PVA_INSERT(instance, 23, 16); return 1U; } /* * CMD_SET_REGION */ struct pva_status_set_region { uint32_t header; uint32_t region_length; uint32_t reserved1; uint32_t reserved2; }; static inline uint32_t pva_cmd_set_region(struct pva_cmd * const cmd, const enum pva_region_ids region, const uint32_t length, const uint64_t addr, const uint32_t flags) { cmd->mbox[0] = PVA_CMD_GO | flags | PVA_SET_COMMAND(CMD_SET_REGION) | PVA_INSERT(PVA_EXTRACT64(addr, 39, 40, uint32_t), 23, 16) | PVA_INSERT(region, 15, 8); cmd->mbox[1] = PVA_LOW32(addr); cmd->mbox[2] = length; return 3U; } #define pva_get_region_header_len(_x_) PVA_EXTRACT(31, 16, uint32_t) #define pva_get_region_element_len(_x_) PVA_EXTRACT(15, 0, uint32_t) /* * CMD_SET_LOGGING */ #define PVA_CMD_FL_LOG_PVA_ENABLE PVA_BIT(28) #define PVA_CMD_FL_LOG_R5_ENABLE PVA_BIT(27) #define PVA_CMD_FL_LOG_VPU_ENABLE PVA_BIT(26) #define PVA_CMD_FL_LOG_NO_OVERFLOW PVA_BIT(25) #define PVA_CMD_FL_LOG_OVERFLOW_INT PVA_BIT(24) #define PVA_CMD_FL_PRT_PVA_ENABLE PVA_BIT(23) #define PVA_CMD_FL_PRT_R5_ENABLE PVA_BIT(22) #define PVA_CMD_FL_PRT_VPU_ENABLE PVA_BIT(21) #define PVA_CMD_FL_PRT_NO_OVERFLOW PVA_BIT(20) #define PVA_CMD_FL_PRT_OVERFLOW_INT PVA_BIT(19) static inline uint32_t pva_cmd_set_logging_level(struct pva_cmd * const cmd, const uint32_t log_level, const uint32_t flags) { cmd->mbox[0] = PVA_CMD_GO | flags | PVA_SET_COMMAND(CMD_SET_LOGGING); cmd->mbox[1] = log_level; return 2U; } /* * CMD_VPU_CONTROL */ #define PVA_CMD_FL_VPU_ONLINE PVA_BIT(28) #define PVA_CMD_FL_VPU_INT_ON_CRASH PVA_BIT(27) #define PVA_CMD_FL_VPU_DUMP_ON_CRASH PVA_BIT(26) #define PVA_CMD_FL_VPU_FAIL_ON_CRASH PVA_BIT(25) #define PVA_CMD_FL_VPU_RESUME_ON_CRASH PVA_BIT(24) #define PVA_CMD_FL_VPU_STOP_ON_CRASH PVA_BIT(23) static inline uint32_t pva_cmd_vpu_control(struct pva_cmd * const cmd, const uint8_t vpu, const uint32_t flags) { cmd->mbox[0] = PVA_CMD_GO | flags | PVA_SET_COMMAND(CMD_VPU_CONTROL) | PVA_INSERT(vpu, 15, 8); return 1U; } /* * CMD_PVA_CONTROL */ #define PVA_CMD_FL_R5_TASK_CMPL_INT PVA_BIT(28) #define PVA_CMD_FL_R5_TASK_ERR_INT PVA_BIT(27) #define PVA_CMD_FL_R5_INT_ON_CRASH PVA_BIT(26) #define PVA_CMD_FL_R5_DUMP_ON_CRASH PVA_BIT(25) static inline uint32_t pva_cmd_pva_control(struct pva_cmd * const cmd, const uint32_t flags) { cmd->mbox[0] = PVA_CMD_GO | flags | PVA_SET_COMMAND(CMD_PVA_CONTROL); return 1U; } /* * CMD_SET_QUEUE_ATTRIBUTES */ static inline uint32_t pva_cmd_set_queue_attributes(struct pva_cmd * const cmd, const uint8_t queue_id, const enum pva_queue_attr_id attr_id, const uint32_t attribute, const uint32_t flags) { cmd->mbox[0] = PVA_CMD_GO | flags | PVA_SET_COMMAND(CMD_SET_QUEUE_ATTRIBUTES) | PVA_INSERT(queue_id, 15, 8) | PVA_INSERT(attr_id, 23, 16); cmd->mbox[1] = attribute; return 2U; } /* * CMD_SET_THRESHOLD */ static inline uint32_t pva_cmd_set_threshold(struct pva_cmd * const cmd, const uint32_t threshold_id, const uint32_t threshold_count, const uint32_t threshold_value, const uint32_t flags) { cmd->mbox[0] = PVA_CMD_GO | flags | PVA_SET_COMMAND(CMD_SET_THRESHOLD) | PVA_INSERT(threshold_id, 15, 8); cmd->mbox[1] = threshold_count; cmd->mbox[2] = threshold_value; return 3U; } /* * CMD_CLEAR_THRESHOLD */ #define PVA_CMD_FL_THRESHOLD_CLEAR PVA_BIT(28) #define PVA_CMD_FL_THRESHOLD_DISABLE PVA_BIT(27) static inline uint32_t pva_cmd_clear_threshold(struct pva_cmd * const cmd, const enum pva_threshold_id threshold_id, const uint32_t flags) { cmd->mbox[0] = PVA_CMD_GO | flags | PVA_SET_COMMAND(CMD_CLEAR_THRESHOLD) | PVA_INSERT(threshold_id, 15, 0); return 1U; } /* * CMD_GET_VPU_FUNC_TABLE */ struct pva_status_get_vpu_funcs { uint32_t length; uint32_t num_entries; }; struct vpu_func { uint32_t next; uint32_t cur_version; uint32_t compat_version; uint32_t id; uint16_t name_len; uint8_t name; /* place holder */ }; static inline uint32_t pva_cmd_get_vpu_func_table(struct pva_cmd * const cmd, const uint32_t length, const uint64_t addr, const uint32_t flags) { cmd->mbox[0] = PVA_CMD_GO | flags | PVA_SET_COMMAND(CMD_GET_VPU_FUNC_TABLE) | PVA_INSERT(PVA_EXTRACT64(addr, 39, 40, uint32_t), 23, 16); cmd->mbox[1] = PVA_LOW32(addr); cmd->mbox[2] = length; return 3U; } /* * CMD_RESET */ static inline uint32_t pva_cmd_reset(struct pva_cmd *const cmd, const enum pva_reset_id object, const uint32_t flags) { cmd->mbox[0] = PVA_CMD_GO | flags | PVA_SET_COMMAND(CMD_RESET) | PVA_INSERT(object, 15, 8); return 1U; } /* * CMD_SET_SYNC_POLLING */ static inline uint32_t pva_cmd_set_sync_polling(struct pva_cmd * const cmd, const uint32_t polling_rate, const uint32_t flags) { cmd->mbox[0] = PVA_CMD_GO | flags | PVA_SET_COMMAND(CMD_SET_SYNC_POLLING); cmd->mbox[1] = polling_rate; return 2U; } /* * CMD_FIFO_SUBMIT */ static inline uint64_t pva_fifo_submit(const uint8_t queue_id, const uint64_t addr, const uint64_t flags) { return PVA_INSERT64(CMD_SUBMIT, 63, 56) | PVA_INSERT64(addr, 39, 0) | PVA_INSERT64(queue_id, 47, 40) | flags; } /* * CMD_SUBMIT */ static inline uint32_t pva_cmd_submit(struct pva_cmd *const cmd, const uint8_t queue_id, const uint64_t addr, const uint32_t flags) { cmd->mbox[0] = PVA_CMD_GO | flags | PVA_SET_COMMAND(CMD_SUBMIT) | PVA_INSERT(queue_id, 15, 8) | PVA_INSERT(PVA_EXTRACT64(addr, 39, 32, uint32_t), 23, 16); cmd->mbox[1] = PVA_LOW32(addr); return 2U; } /* * CMD_SUSPEND */ #define PVA_CMD_FL_SUSPEND_ABORT PVA_BIT(28) #define PVA_CMD_FL_SUSPEND_FLUSH PVA_BIT(27) #define PVA_CMD_FL_SUSPEND_NOTIFY PVA_BIT(26) #define PVA_CMD_FL_SUSPEND_WAIT PVA_BIT(25) static inline uint32_t pva_cmd_suspend(struct pva_cmd * const cmd, const uint8_t queue_id, const uint32_t flags) { cmd->mbox[0] = PVA_CMD_GO | flags | PVA_SET_COMMAND(CMD_SUSPEND) | PVA_INSERT(queue_id, 15, 8); return 1U; } /* * CMD_RESUME */ #define PVA_CMD_FL_RESUME_PREEMPT PVA_BIT(28) #define PVA_CMD_FL_RESUME_PREEMPT_ERROR PVA_BIT(27) static inline uint32_t pva_cmd_resume(struct pva_cmd * const cmd, const uint8_t queue_id, const uint32_t flags) { cmd->mbox[0] = PVA_CMD_GO | flags | PVA_SET_COMMAND(CMD_RESUME) | PVA_INSERT(queue_id, 15, 8); return 1U; } /* * CMD_SET_SCHEDULER */ #define PVA_CMD_FL_SCHED_ENABLE PVA_BIT(28) #define PVA_CMD_FL_SCHED_RESET PVA_BIT(27) static inline uint32_t pva_cmd_set_scheduler(struct pva_cmd * const cmd, const enum pva_sched_id sched_id, const uint32_t flags) { cmd->mbox[0] = PVA_CMD_GO | flags | PVA_SET_COMMAND(CMD_SET_SCHEDULER) | PVA_INSERT(sched_id, 15, 8); return 1U; } /* * CMD_SET_SCHED_ATTR */ static inline uint32_t pva_cmd_set_sched_attr(struct pva_cmd * const cmd, const enum pva_sched_id sched_id, const enum pva_sched_attr_id attr_id, const struct pva_sched_attr *attrs, const uint32_t flags) { cmd->mbox[0] = PVA_CMD_GO | flags | PVA_SET_COMMAND(CMD_SET_SCHED_ATTR) | PVA_INSERT(sched_id, 15, 8) | PVA_INSERT(attr_id, 23, 16); cmd->mbox[1] = attrs->attr_a; cmd->mbox[2] = attrs->attr_b; return 3U; } #endif