1193326Sed/*
2193326Sed * Copyright 2017 Advanced Micro Devices, Inc.
3193326Sed *
4193326Sed * Permission is hereby granted, free of charge, to any person obtaining a
5193326Sed * copy of this software and associated documentation files (the "Software"),
6193326Sed * to deal in the Software without restriction, including without limitation
7193326Sed * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8193326Sed * and/or sell copies of the Software, and to permit persons to whom the
9193326Sed * Software is furnished to do so, subject to the following conditions:
10193326Sed *
11193326Sed * The above copyright notice and this permission notice shall be included in
12193326Sed * all copies or substantial portions of the Software.
13193326Sed *
14193326Sed * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15200583Srdivacky * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16199482Srdivacky * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17198092Srdivacky * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18198092Srdivacky * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19193326Sed * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20204643Srdivacky * OTHER DEALINGS IN THE SOFTWARE.
21198092Srdivacky *
22198092Srdivacky */
23198092Srdivacky
24193326Sed#ifndef __MMSCH_V1_0_H__
25204643Srdivacky#define __MMSCH_V1_0_H__
26193326Sed
27193326Sed#define MMSCH_VERSION	0x1
28193326Sed
29204643Srdivackyenum mmsch_v1_0_command_type {
30204643Srdivacky	MMSCH_COMMAND__DIRECT_REG_WRITE = 0,
31204643Srdivacky	MMSCH_COMMAND__DIRECT_REG_POLLING = 2,
32204643Srdivacky	MMSCH_COMMAND__DIRECT_REG_READ_MODIFY_WRITE = 3,
33204643Srdivacky	MMSCH_COMMAND__INDIRECT_REG_WRITE = 8,
34204643Srdivacky	MMSCH_COMMAND__END = 0xf
35204643Srdivacky};
36204643Srdivacky
37204643Srdivackystruct mmsch_v1_0_init_header {
38204643Srdivacky	uint32_t version;
39204643Srdivacky	uint32_t header_size;
40204643Srdivacky	uint32_t vce_init_status;
41204643Srdivacky	uint32_t uvd_init_status;
42204643Srdivacky	uint32_t vce_table_offset;
43204643Srdivacky	uint32_t vce_table_size;
44204643Srdivacky	uint32_t uvd_table_offset;
45204643Srdivacky	uint32_t uvd_table_size;
46204643Srdivacky};
47204643Srdivacky
48204643Srdivackystruct mmsch_vf_eng_init_header {
49204643Srdivacky	uint32_t init_status;
50204643Srdivacky	uint32_t table_offset;
51204643Srdivacky	uint32_t table_size;
52204643Srdivacky};
53204643Srdivacky
54204643Srdivackystruct mmsch_v1_1_init_header {
55204643Srdivacky	uint32_t version;
56204643Srdivacky	uint32_t total_size;
57204643Srdivacky	struct mmsch_vf_eng_init_header eng[2];
58204643Srdivacky};
59204643Srdivacky
60204643Srdivackystruct mmsch_v1_0_cmd_direct_reg_header {
61204643Srdivacky	uint32_t reg_offset   : 28;
62204643Srdivacky	uint32_t command_type : 4;
63204643Srdivacky};
64204643Srdivacky
65204643Srdivackystruct mmsch_v1_0_cmd_indirect_reg_header {
66204643Srdivacky	uint32_t reg_offset    : 20;
67204643Srdivacky	uint32_t reg_idx_space : 8;
68204643Srdivacky	uint32_t command_type  : 4;
69204643Srdivacky};
70204643Srdivacky
71204643Srdivackystruct mmsch_v1_0_cmd_direct_write {
72204643Srdivacky	struct mmsch_v1_0_cmd_direct_reg_header cmd_header;
73204643Srdivacky	uint32_t reg_value;
74204643Srdivacky};
75204643Srdivacky
76204643Srdivackystruct mmsch_v1_0_cmd_direct_read_modify_write {
77204643Srdivacky	struct mmsch_v1_0_cmd_direct_reg_header cmd_header;
78204643Srdivacky	uint32_t write_data;
79204643Srdivacky	uint32_t mask_value;
80204643Srdivacky};
81204643Srdivacky
82204643Srdivackystruct mmsch_v1_0_cmd_direct_polling {
83204643Srdivacky	struct mmsch_v1_0_cmd_direct_reg_header cmd_header;
84204643Srdivacky	uint32_t mask_value;
85204643Srdivacky	uint32_t wait_value;
86204643Srdivacky};
87204643Srdivacky
88204643Srdivackystruct mmsch_v1_0_cmd_end {
89204643Srdivacky	struct mmsch_v1_0_cmd_direct_reg_header cmd_header;
90204643Srdivacky};
91204643Srdivacky
92204643Srdivackystruct mmsch_v1_0_cmd_indirect_write {
93204643Srdivacky	struct mmsch_v1_0_cmd_indirect_reg_header cmd_header;
94204643Srdivacky	uint32_t reg_value;
95204643Srdivacky};
96204643Srdivacky
97204643Srdivackystatic inline void mmsch_v1_0_insert_direct_wt(struct mmsch_v1_0_cmd_direct_write *direct_wt,
98204643Srdivacky					       uint32_t *init_table,
99204643Srdivacky					       uint32_t reg_offset,
100204643Srdivacky					       uint32_t value)
101204643Srdivacky{
102204643Srdivacky	direct_wt->cmd_header.reg_offset = reg_offset;
103204643Srdivacky	direct_wt->reg_value = value;
104204643Srdivacky	memcpy((void *)init_table, direct_wt, sizeof(struct mmsch_v1_0_cmd_direct_write));
105204643Srdivacky}
106204643Srdivacky
107204643Srdivackystatic inline void mmsch_v1_0_insert_direct_rd_mod_wt(struct mmsch_v1_0_cmd_direct_read_modify_write *direct_rd_mod_wt,
108204643Srdivacky						      uint32_t *init_table,
109204643Srdivacky						      uint32_t reg_offset,
110204643Srdivacky						      uint32_t mask, uint32_t data)
111204643Srdivacky{
112204643Srdivacky	direct_rd_mod_wt->cmd_header.reg_offset = reg_offset;
113204643Srdivacky	direct_rd_mod_wt->mask_value = mask;
114204643Srdivacky	direct_rd_mod_wt->write_data = data;
115204643Srdivacky	memcpy((void *)init_table, direct_rd_mod_wt,
116204643Srdivacky	       sizeof(struct mmsch_v1_0_cmd_direct_read_modify_write));
117204643Srdivacky}
118204643Srdivacky
119204643Srdivackystatic inline void mmsch_v1_0_insert_direct_poll(struct mmsch_v1_0_cmd_direct_polling *direct_poll,
120204643Srdivacky						 uint32_t *init_table,
121204643Srdivacky						 uint32_t reg_offset,
122204643Srdivacky						 uint32_t mask, uint32_t wait)
123204643Srdivacky{
124204643Srdivacky	direct_poll->cmd_header.reg_offset = reg_offset;
125204643Srdivacky	direct_poll->mask_value = mask;
126204643Srdivacky	direct_poll->wait_value = wait;
127204643Srdivacky	memcpy((void *)init_table, direct_poll, sizeof(struct mmsch_v1_0_cmd_direct_polling));
128204643Srdivacky}
129204643Srdivacky
130204643Srdivacky#define MMSCH_V1_0_INSERT_DIRECT_RD_MOD_WT(reg, mask, data) { \
131204643Srdivacky	mmsch_v1_0_insert_direct_rd_mod_wt(&direct_rd_mod_wt, \
132204643Srdivacky					   init_table, (reg), \
133204643Srdivacky					   (mask), (data)); \
134204643Srdivacky	init_table += sizeof(struct mmsch_v1_0_cmd_direct_read_modify_write)/4; \
135204643Srdivacky	table_size += sizeof(struct mmsch_v1_0_cmd_direct_read_modify_write)/4; \
136204643Srdivacky}
137204643Srdivacky
138204643Srdivacky#define MMSCH_V1_0_INSERT_DIRECT_WT(reg, value) { \
139204643Srdivacky	mmsch_v1_0_insert_direct_wt(&direct_wt, \
140204643Srdivacky				    init_table, (reg), \
141204643Srdivacky				    (value)); \
142204643Srdivacky	init_table += sizeof(struct mmsch_v1_0_cmd_direct_write)/4; \
143204643Srdivacky	table_size += sizeof(struct mmsch_v1_0_cmd_direct_write)/4; \
144204643Srdivacky}
145204643Srdivacky
146204643Srdivacky#define MMSCH_V1_0_INSERT_DIRECT_POLL(reg, mask, wait) { \
147204643Srdivacky	mmsch_v1_0_insert_direct_poll(&direct_poll, \
148204643Srdivacky				      init_table, (reg), \
149204643Srdivacky				      (mask), (wait)); \
150204643Srdivacky	init_table += sizeof(struct mmsch_v1_0_cmd_direct_polling)/4; \
151204643Srdivacky	table_size += sizeof(struct mmsch_v1_0_cmd_direct_polling)/4; \
152204643Srdivacky}
153204643Srdivacky
154204643Srdivacky#endif
155204643Srdivacky