0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024 #ifndef __MMSCH_V3_0_H__
0025 #define __MMSCH_V3_0_H__
0026
0027 #include "amdgpu_vcn.h"
0028
0029 #define MMSCH_VERSION_MAJOR 3
0030 #define MMSCH_VERSION_MINOR 0
0031 #define MMSCH_VERSION (MMSCH_VERSION_MAJOR << 16 | MMSCH_VERSION_MINOR)
0032
0033 enum mmsch_v3_0_command_type {
0034 MMSCH_COMMAND__DIRECT_REG_WRITE = 0,
0035 MMSCH_COMMAND__DIRECT_REG_POLLING = 2,
0036 MMSCH_COMMAND__DIRECT_REG_READ_MODIFY_WRITE = 3,
0037 MMSCH_COMMAND__INDIRECT_REG_WRITE = 8,
0038 MMSCH_COMMAND__END = 0xf
0039 };
0040
0041 struct mmsch_v3_0_table_info {
0042 uint32_t init_status;
0043 uint32_t table_offset;
0044 uint32_t table_size;
0045 };
0046
0047 struct mmsch_v3_0_init_header {
0048 uint32_t version;
0049 uint32_t total_size;
0050 struct mmsch_v3_0_table_info inst[AMDGPU_MAX_VCN_INSTANCES];
0051 };
0052
0053 struct mmsch_v3_0_cmd_direct_reg_header {
0054 uint32_t reg_offset : 28;
0055 uint32_t command_type : 4;
0056 };
0057
0058 struct mmsch_v3_0_cmd_indirect_reg_header {
0059 uint32_t reg_offset : 20;
0060 uint32_t reg_idx_space : 8;
0061 uint32_t command_type : 4;
0062 };
0063
0064 struct mmsch_v3_0_cmd_direct_write {
0065 struct mmsch_v3_0_cmd_direct_reg_header cmd_header;
0066 uint32_t reg_value;
0067 };
0068
0069 struct mmsch_v3_0_cmd_direct_read_modify_write {
0070 struct mmsch_v3_0_cmd_direct_reg_header cmd_header;
0071 uint32_t write_data;
0072 uint32_t mask_value;
0073 };
0074
0075 struct mmsch_v3_0_cmd_direct_polling {
0076 struct mmsch_v3_0_cmd_direct_reg_header cmd_header;
0077 uint32_t mask_value;
0078 uint32_t wait_value;
0079 };
0080
0081 struct mmsch_v3_0_cmd_end {
0082 struct mmsch_v3_0_cmd_direct_reg_header cmd_header;
0083 };
0084
0085 struct mmsch_v3_0_cmd_indirect_write {
0086 struct mmsch_v3_0_cmd_indirect_reg_header cmd_header;
0087 uint32_t reg_value;
0088 };
0089
0090 #define MMSCH_V3_0_INSERT_DIRECT_RD_MOD_WT(reg, mask, data) { \
0091 size = sizeof(struct mmsch_v3_0_cmd_direct_read_modify_write); \
0092 size_dw = size / 4; \
0093 direct_rd_mod_wt.cmd_header.reg_offset = reg; \
0094 direct_rd_mod_wt.mask_value = mask; \
0095 direct_rd_mod_wt.write_data = data; \
0096 memcpy((void *)table_loc, &direct_rd_mod_wt, size); \
0097 table_loc += size_dw; \
0098 table_size += size_dw; \
0099 }
0100
0101 #define MMSCH_V3_0_INSERT_DIRECT_WT(reg, value) { \
0102 size = sizeof(struct mmsch_v3_0_cmd_direct_write); \
0103 size_dw = size / 4; \
0104 direct_wt.cmd_header.reg_offset = reg; \
0105 direct_wt.reg_value = value; \
0106 memcpy((void *)table_loc, &direct_wt, size); \
0107 table_loc += size_dw; \
0108 table_size += size_dw; \
0109 }
0110
0111 #define MMSCH_V3_0_INSERT_DIRECT_POLL(reg, mask, wait) { \
0112 size = sizeof(struct mmsch_v3_0_cmd_direct_polling); \
0113 size_dw = size / 4; \
0114 direct_poll.cmd_header.reg_offset = reg; \
0115 direct_poll.mask_value = mask; \
0116 direct_poll.wait_value = wait; \
0117 memcpy((void *)table_loc, &direct_poll, size); \
0118 table_loc += size_dw; \
0119 table_size += size_dw; \
0120 }
0121
0122 #define MMSCH_V3_0_INSERT_END() { \
0123 size = sizeof(struct mmsch_v3_0_cmd_end); \
0124 size_dw = size / 4; \
0125 memcpy((void *)table_loc, &end, size); \
0126 table_loc += size_dw; \
0127 table_size += size_dw; \
0128 }
0129
0130 #endif