1*67cc7f90Sfanhuang /* 2*67cc7f90Sfanhuang * Copyright 2023 Advanced Micro Devices, Inc. 3*67cc7f90Sfanhuang * 4*67cc7f90Sfanhuang * Permission is hereby granted, free of charge, to any person obtaining a 5*67cc7f90Sfanhuang * copy of this software and associated documentation files (the "Software"), 6*67cc7f90Sfanhuang * to deal in the Software without restriction, including without limitation 7*67cc7f90Sfanhuang * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8*67cc7f90Sfanhuang * and/or sell copies of the Software, and to permit persons to whom the 9*67cc7f90Sfanhuang * Software is furnished to do so, subject to the following conditions: 10*67cc7f90Sfanhuang * 11*67cc7f90Sfanhuang * The above copyright notice and this permission notice shall be included in 12*67cc7f90Sfanhuang * all copies or substantial portions of the Software. 13*67cc7f90Sfanhuang * 14*67cc7f90Sfanhuang * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15*67cc7f90Sfanhuang * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16*67cc7f90Sfanhuang * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17*67cc7f90Sfanhuang * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18*67cc7f90Sfanhuang * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19*67cc7f90Sfanhuang * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20*67cc7f90Sfanhuang * OTHER DEALINGS IN THE SOFTWARE. 21*67cc7f90Sfanhuang * 22*67cc7f90Sfanhuang */ 23*67cc7f90Sfanhuang 24*67cc7f90Sfanhuang #ifndef __MMSCH_V5_0_H__ 25*67cc7f90Sfanhuang #define __MMSCH_V5_0_H__ 26*67cc7f90Sfanhuang 27*67cc7f90Sfanhuang #include "amdgpu_vcn.h" 28*67cc7f90Sfanhuang 29*67cc7f90Sfanhuang #define MMSCH_VERSION_MAJOR 5 30*67cc7f90Sfanhuang #define MMSCH_VERSION_MINOR 0 31*67cc7f90Sfanhuang #define MMSCH_VERSION (MMSCH_VERSION_MAJOR << 16 | MMSCH_VERSION_MINOR) 32*67cc7f90Sfanhuang 33*67cc7f90Sfanhuang #define RB_ENABLED (1 << 0) 34*67cc7f90Sfanhuang #define RB4_ENABLED (1 << 1) 35*67cc7f90Sfanhuang 36*67cc7f90Sfanhuang #define MMSCH_VF_ENGINE_STATUS__PASS 0x1 37*67cc7f90Sfanhuang 38*67cc7f90Sfanhuang #define MMSCH_VF_MAILBOX_RESP__OK 0x1 39*67cc7f90Sfanhuang #define MMSCH_VF_MAILBOX_RESP__INCOMPLETE 0x2 40*67cc7f90Sfanhuang #define MMSCH_VF_MAILBOX_RESP__FAILED 0x3 41*67cc7f90Sfanhuang #define MMSCH_VF_MAILBOX_RESP__FAILED_SMALL_CTX_SIZE 0x4 42*67cc7f90Sfanhuang #define MMSCH_VF_MAILBOX_RESP__UNKNOWN_CMD 0x5 43*67cc7f90Sfanhuang 44*67cc7f90Sfanhuang enum mmsch_v5_0_command_type { 45*67cc7f90Sfanhuang MMSCH_COMMAND__DIRECT_REG_WRITE = 0, 46*67cc7f90Sfanhuang MMSCH_COMMAND__DIRECT_REG_POLLING = 2, 47*67cc7f90Sfanhuang MMSCH_COMMAND__DIRECT_REG_READ_MODIFY_WRITE = 3, 48*67cc7f90Sfanhuang MMSCH_COMMAND__INDIRECT_REG_WRITE = 8, 49*67cc7f90Sfanhuang MMSCH_COMMAND__END = 0xf 50*67cc7f90Sfanhuang }; 51*67cc7f90Sfanhuang 52*67cc7f90Sfanhuang struct mmsch_v5_0_table_info { 53*67cc7f90Sfanhuang uint32_t init_status; 54*67cc7f90Sfanhuang uint32_t table_offset; 55*67cc7f90Sfanhuang uint32_t table_size; 56*67cc7f90Sfanhuang }; 57*67cc7f90Sfanhuang 58*67cc7f90Sfanhuang struct mmsch_v5_0_init_header { 59*67cc7f90Sfanhuang uint32_t version; 60*67cc7f90Sfanhuang uint32_t total_size; 61*67cc7f90Sfanhuang struct mmsch_v5_0_table_info vcn0; 62*67cc7f90Sfanhuang struct mmsch_v5_0_table_info mjpegdec0[5]; 63*67cc7f90Sfanhuang struct mmsch_v5_0_table_info mjpegdec1[5]; 64*67cc7f90Sfanhuang }; 65*67cc7f90Sfanhuang 66*67cc7f90Sfanhuang struct mmsch_v5_0_cmd_direct_reg_header { 67*67cc7f90Sfanhuang uint32_t reg_offset : 28; 68*67cc7f90Sfanhuang uint32_t command_type : 4; 69*67cc7f90Sfanhuang }; 70*67cc7f90Sfanhuang 71*67cc7f90Sfanhuang struct mmsch_v5_0_cmd_indirect_reg_header { 72*67cc7f90Sfanhuang uint32_t reg_offset : 20; 73*67cc7f90Sfanhuang uint32_t reg_idx_space : 8; 74*67cc7f90Sfanhuang uint32_t command_type : 4; 75*67cc7f90Sfanhuang }; 76*67cc7f90Sfanhuang 77*67cc7f90Sfanhuang struct mmsch_v5_0_cmd_direct_write { 78*67cc7f90Sfanhuang struct mmsch_v5_0_cmd_direct_reg_header cmd_header; 79*67cc7f90Sfanhuang uint32_t reg_value; 80*67cc7f90Sfanhuang }; 81*67cc7f90Sfanhuang 82*67cc7f90Sfanhuang struct mmsch_v5_0_cmd_direct_read_modify_write { 83*67cc7f90Sfanhuang struct mmsch_v5_0_cmd_direct_reg_header cmd_header; 84*67cc7f90Sfanhuang uint32_t write_data; 85*67cc7f90Sfanhuang uint32_t mask_value; 86*67cc7f90Sfanhuang }; 87*67cc7f90Sfanhuang 88*67cc7f90Sfanhuang struct mmsch_v5_0_cmd_direct_polling { 89*67cc7f90Sfanhuang struct mmsch_v5_0_cmd_direct_reg_header cmd_header; 90*67cc7f90Sfanhuang uint32_t mask_value; 91*67cc7f90Sfanhuang uint32_t wait_value; 92*67cc7f90Sfanhuang }; 93*67cc7f90Sfanhuang 94*67cc7f90Sfanhuang struct mmsch_v5_0_cmd_end { 95*67cc7f90Sfanhuang struct mmsch_v5_0_cmd_direct_reg_header cmd_header; 96*67cc7f90Sfanhuang }; 97*67cc7f90Sfanhuang 98*67cc7f90Sfanhuang struct mmsch_v5_0_cmd_indirect_write { 99*67cc7f90Sfanhuang struct mmsch_v5_0_cmd_indirect_reg_header cmd_header; 100*67cc7f90Sfanhuang uint32_t reg_value; 101*67cc7f90Sfanhuang }; 102*67cc7f90Sfanhuang 103*67cc7f90Sfanhuang #define MMSCH_V5_0_INSERT_DIRECT_RD_MOD_WT(reg, mask, data) { \ 104*67cc7f90Sfanhuang size = sizeof(struct mmsch_v5_0_cmd_direct_read_modify_write); \ 105*67cc7f90Sfanhuang size_dw = size / 4; \ 106*67cc7f90Sfanhuang direct_rd_mod_wt.cmd_header.reg_offset = reg; \ 107*67cc7f90Sfanhuang direct_rd_mod_wt.mask_value = mask; \ 108*67cc7f90Sfanhuang direct_rd_mod_wt.write_data = data; \ 109*67cc7f90Sfanhuang memcpy((void *)table_loc, &direct_rd_mod_wt, size); \ 110*67cc7f90Sfanhuang table_loc += size_dw; \ 111*67cc7f90Sfanhuang table_size += size_dw; \ 112*67cc7f90Sfanhuang } 113*67cc7f90Sfanhuang 114*67cc7f90Sfanhuang #define MMSCH_V5_0_INSERT_DIRECT_WT(reg, value) { \ 115*67cc7f90Sfanhuang size = sizeof(struct mmsch_v5_0_cmd_direct_write); \ 116*67cc7f90Sfanhuang size_dw = size / 4; \ 117*67cc7f90Sfanhuang direct_wt.cmd_header.reg_offset = reg; \ 118*67cc7f90Sfanhuang direct_wt.reg_value = value; \ 119*67cc7f90Sfanhuang memcpy((void *)table_loc, &direct_wt, size); \ 120*67cc7f90Sfanhuang table_loc += size_dw; \ 121*67cc7f90Sfanhuang table_size += size_dw; \ 122*67cc7f90Sfanhuang } 123*67cc7f90Sfanhuang 124*67cc7f90Sfanhuang #define MMSCH_V5_0_INSERT_DIRECT_POLL(reg, mask, wait) { \ 125*67cc7f90Sfanhuang size = sizeof(struct mmsch_v5_0_cmd_direct_polling); \ 126*67cc7f90Sfanhuang size_dw = size / 4; \ 127*67cc7f90Sfanhuang direct_poll.cmd_header.reg_offset = reg; \ 128*67cc7f90Sfanhuang direct_poll.mask_value = mask; \ 129*67cc7f90Sfanhuang direct_poll.wait_value = wait; \ 130*67cc7f90Sfanhuang memcpy((void *)table_loc, &direct_poll, size); \ 131*67cc7f90Sfanhuang table_loc += size_dw; \ 132*67cc7f90Sfanhuang table_size += size_dw; \ 133*67cc7f90Sfanhuang } 134*67cc7f90Sfanhuang 135*67cc7f90Sfanhuang #define MMSCH_V5_0_INSERT_END() { \ 136*67cc7f90Sfanhuang size = sizeof(struct mmsch_v5_0_cmd_end); \ 137*67cc7f90Sfanhuang size_dw = size / 4; \ 138*67cc7f90Sfanhuang memcpy((void *)table_loc, &end, size); \ 139*67cc7f90Sfanhuang table_loc += size_dw; \ 140*67cc7f90Sfanhuang table_size += size_dw; \ 141*67cc7f90Sfanhuang } 142*67cc7f90Sfanhuang 143*67cc7f90Sfanhuang #endif 144*67cc7f90Sfanhuang 145