1 /* $NetBSD: mmsch_v1_0.h,v 1.2 2021/12/18 23:44:59 riastradh Exp $ */ 2 3 /* 4 * Copyright 2017 Advanced Micro Devices, Inc. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the "Software"), 8 * to deal in the Software without restriction, including without limitation 9 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10 * and/or sell copies of the Software, and to permit persons to whom the 11 * Software is furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included in 14 * all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 * OTHER DEALINGS IN THE SOFTWARE. 23 * 24 */ 25 26 #ifndef __MMSCH_V1_0_H__ 27 #define __MMSCH_V1_0_H__ 28 29 #define MMSCH_VERSION_MAJOR 1 30 #define MMSCH_VERSION_MINOR 0 31 #define MMSCH_VERSION (MMSCH_VERSION_MAJOR << 16 | MMSCH_VERSION_MINOR) 32 33 enum mmsch_v1_0_command_type { 34 MMSCH_COMMAND__DIRECT_REG_WRITE = 0, 35 MMSCH_COMMAND__DIRECT_REG_POLLING = 2, 36 MMSCH_COMMAND__DIRECT_REG_READ_MODIFY_WRITE = 3, 37 MMSCH_COMMAND__INDIRECT_REG_WRITE = 8, 38 MMSCH_COMMAND__END = 0xf 39 }; 40 41 struct mmsch_v1_0_init_header { 42 uint32_t version; 43 uint32_t header_size; 44 uint32_t vce_init_status; 45 uint32_t uvd_init_status; 46 uint32_t vce_table_offset; 47 uint32_t vce_table_size; 48 uint32_t uvd_table_offset; 49 uint32_t uvd_table_size; 50 }; 51 52 struct mmsch_vf_eng_init_header { 53 uint32_t init_status; 54 uint32_t table_offset; 55 uint32_t table_size; 56 }; 57 58 struct mmsch_v1_1_init_header { 59 uint32_t version; 60 uint32_t total_size; 61 struct mmsch_vf_eng_init_header eng[2]; 62 }; 63 64 struct mmsch_v1_0_cmd_direct_reg_header { 65 uint32_t reg_offset : 28; 66 uint32_t command_type : 4; 67 }; 68 69 struct mmsch_v1_0_cmd_indirect_reg_header { 70 uint32_t reg_offset : 20; 71 uint32_t reg_idx_space : 8; 72 uint32_t command_type : 4; 73 }; 74 75 struct mmsch_v1_0_cmd_direct_write { 76 struct mmsch_v1_0_cmd_direct_reg_header cmd_header; 77 uint32_t reg_value; 78 }; 79 80 struct mmsch_v1_0_cmd_direct_read_modify_write { 81 struct mmsch_v1_0_cmd_direct_reg_header cmd_header; 82 uint32_t write_data; 83 uint32_t mask_value; 84 }; 85 86 struct mmsch_v1_0_cmd_direct_polling { 87 struct mmsch_v1_0_cmd_direct_reg_header cmd_header; 88 uint32_t mask_value; 89 uint32_t wait_value; 90 }; 91 92 struct mmsch_v1_0_cmd_end { 93 struct mmsch_v1_0_cmd_direct_reg_header cmd_header; 94 }; 95 96 struct mmsch_v1_0_cmd_indirect_write { 97 struct mmsch_v1_0_cmd_indirect_reg_header cmd_header; 98 uint32_t reg_value; 99 }; 100 101 static inline void mmsch_v1_0_insert_direct_wt(struct mmsch_v1_0_cmd_direct_write *direct_wt, 102 uint32_t *init_table, 103 uint32_t reg_offset, 104 uint32_t value) 105 { 106 direct_wt->cmd_header.reg_offset = reg_offset; 107 direct_wt->reg_value = value; 108 memcpy((void *)init_table, direct_wt, sizeof(struct mmsch_v1_0_cmd_direct_write)); 109 } 110 111 static inline void mmsch_v1_0_insert_direct_rd_mod_wt(struct mmsch_v1_0_cmd_direct_read_modify_write *direct_rd_mod_wt, 112 uint32_t *init_table, 113 uint32_t reg_offset, 114 uint32_t mask, uint32_t data) 115 { 116 direct_rd_mod_wt->cmd_header.reg_offset = reg_offset; 117 direct_rd_mod_wt->mask_value = mask; 118 direct_rd_mod_wt->write_data = data; 119 memcpy((void *)init_table, direct_rd_mod_wt, 120 sizeof(struct mmsch_v1_0_cmd_direct_read_modify_write)); 121 } 122 123 static inline void mmsch_v1_0_insert_direct_poll(struct mmsch_v1_0_cmd_direct_polling *direct_poll, 124 uint32_t *init_table, 125 uint32_t reg_offset, 126 uint32_t mask, uint32_t wait) 127 { 128 direct_poll->cmd_header.reg_offset = reg_offset; 129 direct_poll->mask_value = mask; 130 direct_poll->wait_value = wait; 131 memcpy((void *)init_table, direct_poll, sizeof(struct mmsch_v1_0_cmd_direct_polling)); 132 } 133 134 #define MMSCH_V1_0_INSERT_DIRECT_RD_MOD_WT(reg, mask, data) { \ 135 mmsch_v1_0_insert_direct_rd_mod_wt(&direct_rd_mod_wt, \ 136 init_table, (reg), \ 137 (mask), (data)); \ 138 init_table += sizeof(struct mmsch_v1_0_cmd_direct_read_modify_write)/4; \ 139 table_size += sizeof(struct mmsch_v1_0_cmd_direct_read_modify_write)/4; \ 140 } 141 142 #define MMSCH_V1_0_INSERT_DIRECT_WT(reg, value) { \ 143 mmsch_v1_0_insert_direct_wt(&direct_wt, \ 144 init_table, (reg), \ 145 (value)); \ 146 init_table += sizeof(struct mmsch_v1_0_cmd_direct_write)/4; \ 147 table_size += sizeof(struct mmsch_v1_0_cmd_direct_write)/4; \ 148 } 149 150 #define MMSCH_V1_0_INSERT_DIRECT_POLL(reg, mask, wait) { \ 151 mmsch_v1_0_insert_direct_poll(&direct_poll, \ 152 init_table, (reg), \ 153 (mask), (wait)); \ 154 init_table += sizeof(struct mmsch_v1_0_cmd_direct_polling)/4; \ 155 table_size += sizeof(struct mmsch_v1_0_cmd_direct_polling)/4; \ 156 } 157 158 #endif 159