17ddb4d6cSJack Zhang /* 27ddb4d6cSJack Zhang * Copyright 2020 Advanced Micro Devices, Inc. 37ddb4d6cSJack Zhang * 47ddb4d6cSJack Zhang * Permission is hereby granted, free of charge, to any person obtaining a 57ddb4d6cSJack Zhang * copy of this software and associated documentation files (the "Software"), 67ddb4d6cSJack Zhang * to deal in the Software without restriction, including without limitation 77ddb4d6cSJack Zhang * the rights to use, copy, modify, merge, publish, distribute, sublicense, 87ddb4d6cSJack Zhang * and/or sell copies of the Software, and to permit persons to whom the 97ddb4d6cSJack Zhang * Software is furnished to do so, subject to the following conditions: 107ddb4d6cSJack Zhang * 117ddb4d6cSJack Zhang * The above copyright notice and this permission notice shall be included in 127ddb4d6cSJack Zhang * all copies or substantial portions of the Software. 137ddb4d6cSJack Zhang * 147ddb4d6cSJack Zhang * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 157ddb4d6cSJack Zhang * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 167ddb4d6cSJack Zhang * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 177ddb4d6cSJack Zhang * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 187ddb4d6cSJack Zhang * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 197ddb4d6cSJack Zhang * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 207ddb4d6cSJack Zhang * OTHER DEALINGS IN THE SOFTWARE. 217ddb4d6cSJack Zhang * 227ddb4d6cSJack Zhang */ 237ddb4d6cSJack Zhang 247ddb4d6cSJack Zhang #ifndef __MMSCH_V3_0_H__ 257ddb4d6cSJack Zhang #define __MMSCH_V3_0_H__ 267ddb4d6cSJack Zhang 277ddb4d6cSJack Zhang #include "amdgpu_vcn.h" 287ddb4d6cSJack Zhang 297ddb4d6cSJack Zhang #define MMSCH_VERSION_MAJOR 3 307ddb4d6cSJack Zhang #define MMSCH_VERSION_MINOR 0 317ddb4d6cSJack Zhang #define MMSCH_VERSION (MMSCH_VERSION_MAJOR << 16 | MMSCH_VERSION_MINOR) 327ddb4d6cSJack Zhang 33*f2bcc0c7SEmily Deng #define MMSCH_V3_0_VCN_INSTANCES 0x2 34*f2bcc0c7SEmily Deng 357ddb4d6cSJack Zhang enum mmsch_v3_0_command_type { 367ddb4d6cSJack Zhang MMSCH_COMMAND__DIRECT_REG_WRITE = 0, 377ddb4d6cSJack Zhang MMSCH_COMMAND__DIRECT_REG_POLLING = 2, 387ddb4d6cSJack Zhang MMSCH_COMMAND__DIRECT_REG_READ_MODIFY_WRITE = 3, 397ddb4d6cSJack Zhang MMSCH_COMMAND__INDIRECT_REG_WRITE = 8, 407ddb4d6cSJack Zhang MMSCH_COMMAND__END = 0xf 417ddb4d6cSJack Zhang }; 427ddb4d6cSJack Zhang 437ddb4d6cSJack Zhang struct mmsch_v3_0_table_info { 447ddb4d6cSJack Zhang uint32_t init_status; 457ddb4d6cSJack Zhang uint32_t table_offset; 467ddb4d6cSJack Zhang uint32_t table_size; 477ddb4d6cSJack Zhang }; 487ddb4d6cSJack Zhang 497ddb4d6cSJack Zhang struct mmsch_v3_0_init_header { 507ddb4d6cSJack Zhang uint32_t version; 517ddb4d6cSJack Zhang uint32_t total_size; 52*f2bcc0c7SEmily Deng struct mmsch_v3_0_table_info inst[MMSCH_V3_0_VCN_INSTANCES]; 537ddb4d6cSJack Zhang }; 547ddb4d6cSJack Zhang 557ddb4d6cSJack Zhang struct mmsch_v3_0_cmd_direct_reg_header { 567ddb4d6cSJack Zhang uint32_t reg_offset : 28; 577ddb4d6cSJack Zhang uint32_t command_type : 4; 587ddb4d6cSJack Zhang }; 597ddb4d6cSJack Zhang 607ddb4d6cSJack Zhang struct mmsch_v3_0_cmd_indirect_reg_header { 617ddb4d6cSJack Zhang uint32_t reg_offset : 20; 627ddb4d6cSJack Zhang uint32_t reg_idx_space : 8; 637ddb4d6cSJack Zhang uint32_t command_type : 4; 647ddb4d6cSJack Zhang }; 657ddb4d6cSJack Zhang 667ddb4d6cSJack Zhang struct mmsch_v3_0_cmd_direct_write { 677ddb4d6cSJack Zhang struct mmsch_v3_0_cmd_direct_reg_header cmd_header; 687ddb4d6cSJack Zhang uint32_t reg_value; 697ddb4d6cSJack Zhang }; 707ddb4d6cSJack Zhang 717ddb4d6cSJack Zhang struct mmsch_v3_0_cmd_direct_read_modify_write { 727ddb4d6cSJack Zhang struct mmsch_v3_0_cmd_direct_reg_header cmd_header; 737ddb4d6cSJack Zhang uint32_t write_data; 747ddb4d6cSJack Zhang uint32_t mask_value; 757ddb4d6cSJack Zhang }; 767ddb4d6cSJack Zhang 777ddb4d6cSJack Zhang struct mmsch_v3_0_cmd_direct_polling { 787ddb4d6cSJack Zhang struct mmsch_v3_0_cmd_direct_reg_header cmd_header; 797ddb4d6cSJack Zhang uint32_t mask_value; 807ddb4d6cSJack Zhang uint32_t wait_value; 817ddb4d6cSJack Zhang }; 827ddb4d6cSJack Zhang 837ddb4d6cSJack Zhang struct mmsch_v3_0_cmd_end { 847ddb4d6cSJack Zhang struct mmsch_v3_0_cmd_direct_reg_header cmd_header; 857ddb4d6cSJack Zhang }; 867ddb4d6cSJack Zhang 877ddb4d6cSJack Zhang struct mmsch_v3_0_cmd_indirect_write { 887ddb4d6cSJack Zhang struct mmsch_v3_0_cmd_indirect_reg_header cmd_header; 897ddb4d6cSJack Zhang uint32_t reg_value; 907ddb4d6cSJack Zhang }; 917ddb4d6cSJack Zhang 927ddb4d6cSJack Zhang #define MMSCH_V3_0_INSERT_DIRECT_RD_MOD_WT(reg, mask, data) { \ 937ddb4d6cSJack Zhang size = sizeof(struct mmsch_v3_0_cmd_direct_read_modify_write); \ 947ddb4d6cSJack Zhang size_dw = size / 4; \ 957ddb4d6cSJack Zhang direct_rd_mod_wt.cmd_header.reg_offset = reg; \ 967ddb4d6cSJack Zhang direct_rd_mod_wt.mask_value = mask; \ 977ddb4d6cSJack Zhang direct_rd_mod_wt.write_data = data; \ 987ddb4d6cSJack Zhang memcpy((void *)table_loc, &direct_rd_mod_wt, size); \ 997ddb4d6cSJack Zhang table_loc += size_dw; \ 1007ddb4d6cSJack Zhang table_size += size_dw; \ 1017ddb4d6cSJack Zhang } 1027ddb4d6cSJack Zhang 1037ddb4d6cSJack Zhang #define MMSCH_V3_0_INSERT_DIRECT_WT(reg, value) { \ 1047ddb4d6cSJack Zhang size = sizeof(struct mmsch_v3_0_cmd_direct_write); \ 1057ddb4d6cSJack Zhang size_dw = size / 4; \ 1067ddb4d6cSJack Zhang direct_wt.cmd_header.reg_offset = reg; \ 1077ddb4d6cSJack Zhang direct_wt.reg_value = value; \ 1087ddb4d6cSJack Zhang memcpy((void *)table_loc, &direct_wt, size); \ 1097ddb4d6cSJack Zhang table_loc += size_dw; \ 1107ddb4d6cSJack Zhang table_size += size_dw; \ 1117ddb4d6cSJack Zhang } 1127ddb4d6cSJack Zhang 1137ddb4d6cSJack Zhang #define MMSCH_V3_0_INSERT_DIRECT_POLL(reg, mask, wait) { \ 1147ddb4d6cSJack Zhang size = sizeof(struct mmsch_v3_0_cmd_direct_polling); \ 1157ddb4d6cSJack Zhang size_dw = size / 4; \ 1167ddb4d6cSJack Zhang direct_poll.cmd_header.reg_offset = reg; \ 1177ddb4d6cSJack Zhang direct_poll.mask_value = mask; \ 1187ddb4d6cSJack Zhang direct_poll.wait_value = wait; \ 1197ddb4d6cSJack Zhang memcpy((void *)table_loc, &direct_poll, size); \ 1207ddb4d6cSJack Zhang table_loc += size_dw; \ 1217ddb4d6cSJack Zhang table_size += size_dw; \ 1227ddb4d6cSJack Zhang } 1237ddb4d6cSJack Zhang 1247ddb4d6cSJack Zhang #define MMSCH_V3_0_INSERT_END() { \ 1257ddb4d6cSJack Zhang size = sizeof(struct mmsch_v3_0_cmd_end); \ 1267ddb4d6cSJack Zhang size_dw = size / 4; \ 1277ddb4d6cSJack Zhang memcpy((void *)table_loc, &end, size); \ 1287ddb4d6cSJack Zhang table_loc += size_dw; \ 1297ddb4d6cSJack Zhang table_size += size_dw; \ 1307ddb4d6cSJack Zhang } 1317ddb4d6cSJack Zhang 1327ddb4d6cSJack Zhang #endif 133