1/* SPDX-License-Identifier: MIT */
2/*
3 * Copyright 2023 Advanced Micro Devices, Inc.
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be included in
13 * all copies or substantial portions of the Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
19 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21 * OTHER DEALINGS IN THE SOFTWARE.
22 *
23 * Authors: AMD
24 *
25 */
26
27#ifndef _DCN35_PG_CNTL_H_
28#define _DCN35_PG_CNTL_H_
29
30#include "pg_cntl.h"
31
32#define PG_CNTL_REG_LIST_DCN35()\
33	SR(DOMAIN0_PG_CONFIG), \
34	SR(DOMAIN1_PG_CONFIG), \
35	SR(DOMAIN2_PG_CONFIG), \
36	SR(DOMAIN3_PG_CONFIG), \
37	SR(DOMAIN16_PG_CONFIG), \
38	SR(DOMAIN17_PG_CONFIG), \
39	SR(DOMAIN18_PG_CONFIG), \
40	SR(DOMAIN19_PG_CONFIG), \
41	SR(DOMAIN22_PG_CONFIG), \
42	SR(DOMAIN23_PG_CONFIG), \
43	SR(DOMAIN24_PG_CONFIG), \
44	SR(DOMAIN25_PG_CONFIG), \
45	SR(DOMAIN0_PG_STATUS), \
46	SR(DOMAIN1_PG_STATUS), \
47	SR(DOMAIN2_PG_STATUS), \
48	SR(DOMAIN3_PG_STATUS), \
49	SR(DOMAIN16_PG_STATUS), \
50	SR(DOMAIN17_PG_STATUS), \
51	SR(DOMAIN18_PG_STATUS), \
52	SR(DOMAIN19_PG_STATUS), \
53	SR(DOMAIN22_PG_STATUS), \
54	SR(DOMAIN23_PG_STATUS), \
55	SR(DOMAIN24_PG_STATUS), \
56	SR(DOMAIN25_PG_STATUS), \
57	SR(DC_IP_REQUEST_CNTL)
58
59#define PG_CNTL_SF(reg_name, field_name, post_fix)\
60	.field_name = reg_name ## __ ## field_name ## post_fix
61
62#define PG_CNTL_MASK_SH_LIST_DCN35(mask_sh) \
63	PG_CNTL_SF(DOMAIN0_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
64	PG_CNTL_SF(DOMAIN0_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
65	PG_CNTL_SF(DOMAIN1_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
66	PG_CNTL_SF(DOMAIN1_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
67	PG_CNTL_SF(DOMAIN2_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
68	PG_CNTL_SF(DOMAIN2_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
69	PG_CNTL_SF(DOMAIN3_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
70	PG_CNTL_SF(DOMAIN3_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
71	PG_CNTL_SF(DOMAIN16_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
72	PG_CNTL_SF(DOMAIN16_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
73	PG_CNTL_SF(DOMAIN17_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
74	PG_CNTL_SF(DOMAIN17_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
75	PG_CNTL_SF(DOMAIN18_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
76	PG_CNTL_SF(DOMAIN18_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
77	PG_CNTL_SF(DOMAIN19_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
78	PG_CNTL_SF(DOMAIN19_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
79	PG_CNTL_SF(DOMAIN22_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
80	PG_CNTL_SF(DOMAIN22_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
81	PG_CNTL_SF(DOMAIN23_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
82	PG_CNTL_SF(DOMAIN23_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
83	PG_CNTL_SF(DOMAIN24_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
84	PG_CNTL_SF(DOMAIN24_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
85	PG_CNTL_SF(DOMAIN25_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
86	PG_CNTL_SF(DOMAIN25_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
87	PG_CNTL_SF(DOMAIN0_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
88	PG_CNTL_SF(DOMAIN0_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
89	PG_CNTL_SF(DOMAIN1_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
90	PG_CNTL_SF(DOMAIN1_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
91	PG_CNTL_SF(DOMAIN2_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
92	PG_CNTL_SF(DOMAIN2_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
93	PG_CNTL_SF(DOMAIN3_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
94	PG_CNTL_SF(DOMAIN3_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
95	PG_CNTL_SF(DOMAIN16_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
96	PG_CNTL_SF(DOMAIN16_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
97	PG_CNTL_SF(DOMAIN17_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
98	PG_CNTL_SF(DOMAIN17_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
99	PG_CNTL_SF(DOMAIN18_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
100	PG_CNTL_SF(DOMAIN18_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
101	PG_CNTL_SF(DOMAIN19_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
102	PG_CNTL_SF(DOMAIN19_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
103	PG_CNTL_SF(DOMAIN22_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
104	PG_CNTL_SF(DOMAIN22_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
105	PG_CNTL_SF(DOMAIN23_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
106	PG_CNTL_SF(DOMAIN23_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
107	PG_CNTL_SF(DOMAIN24_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
108	PG_CNTL_SF(DOMAIN24_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
109	PG_CNTL_SF(DOMAIN25_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
110	PG_CNTL_SF(DOMAIN25_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
111	PG_CNTL_SF(DC_IP_REQUEST_CNTL, IP_REQUEST_EN, mask_sh)
112
113#define PG_CNTL_REG_FIELD_LIST(type) \
114	type IPS2;\
115	type IPS1;\
116	type IPS0;\
117	type IPS0_All
118
119#define PG_CNTL_DCN35_REG_FIELD_LIST(type) \
120	type IP_REQUEST_EN; \
121	type DOMAIN_POWER_FORCEON; \
122	type DOMAIN_POWER_GATE; \
123	type DOMAIN_DESIRED_PWR_STATE; \
124	type DOMAIN_PGFSM_PWR_STATUS
125
126struct pg_cntl_shift {
127	PG_CNTL_REG_FIELD_LIST(uint8_t);
128	PG_CNTL_DCN35_REG_FIELD_LIST(uint8_t);
129};
130
131struct pg_cntl_mask {
132	PG_CNTL_REG_FIELD_LIST(uint32_t);
133	PG_CNTL_DCN35_REG_FIELD_LIST(uint32_t);
134};
135
136struct pg_cntl_registers {
137	uint32_t LONO_STATE;
138	uint32_t DC_IP_REQUEST_CNTL;
139	uint32_t DOMAIN0_PG_CONFIG;
140	uint32_t DOMAIN1_PG_CONFIG;
141	uint32_t DOMAIN2_PG_CONFIG;
142	uint32_t DOMAIN3_PG_CONFIG;
143	uint32_t DOMAIN16_PG_CONFIG;
144	uint32_t DOMAIN17_PG_CONFIG;
145	uint32_t DOMAIN18_PG_CONFIG;
146	uint32_t DOMAIN19_PG_CONFIG;
147	uint32_t DOMAIN22_PG_CONFIG;
148	uint32_t DOMAIN23_PG_CONFIG;
149	uint32_t DOMAIN24_PG_CONFIG;
150	uint32_t DOMAIN25_PG_CONFIG;
151	uint32_t DOMAIN0_PG_STATUS;
152	uint32_t DOMAIN1_PG_STATUS;
153	uint32_t DOMAIN2_PG_STATUS;
154	uint32_t DOMAIN3_PG_STATUS;
155	uint32_t DOMAIN16_PG_STATUS;
156	uint32_t DOMAIN17_PG_STATUS;
157	uint32_t DOMAIN18_PG_STATUS;
158	uint32_t DOMAIN19_PG_STATUS;
159	uint32_t DOMAIN22_PG_STATUS;
160	uint32_t DOMAIN23_PG_STATUS;
161	uint32_t DOMAIN24_PG_STATUS;
162	uint32_t DOMAIN25_PG_STATUS;
163};
164
165struct dcn_pg_cntl {
166	struct pg_cntl base;
167	const struct pg_cntl_registers *regs;
168	const struct pg_cntl_shift *pg_cntl_shift;
169	const struct pg_cntl_mask *pg_cntl_mask;
170};
171
172void pg_cntl35_dsc_pg_control(struct pg_cntl *pg_cntl, unsigned int dsc_inst, bool power_on);
173void pg_cntl35_hubp_dpp_pg_control(struct pg_cntl *pg_cntl,
174	unsigned int hubp_dpp_inst, bool power_on);
175void pg_cntl35_hpo_pg_control(struct pg_cntl *pg_cntl, bool power_on);
176void pg_cntl35_io_clk_pg_control(struct pg_cntl *pg_cntl, bool power_on);
177void pg_cntl35_plane_otg_pg_control(struct pg_cntl *pg_cntl, bool power_on);
178void pg_cntl35_mpcc_pg_control(struct pg_cntl *pg_cntl,
179	unsigned int mpcc_inst, bool power_on);
180void pg_cntl35_opp_pg_control(struct pg_cntl *pg_cntl,
181	unsigned int opp_inst, bool power_on);
182void pg_cntl35_optc_pg_control(struct pg_cntl *pg_cntl,
183	unsigned int optc_inst, bool power_on);
184void pg_cntl35_dwb_pg_control(struct pg_cntl *pg_cntl, bool power_on);
185void pg_cntl35_init_pg_status(struct pg_cntl *pg_cntl);
186
187struct pg_cntl *pg_cntl35_create(
188	struct dc_context *ctx,
189	const struct pg_cntl_registers *regs,
190	const struct pg_cntl_shift *pg_cntl_shift,
191	const struct pg_cntl_mask *pg_cntl_mask);
192
193void dcn_pg_cntl_destroy(struct pg_cntl **pg_cntl);
194
195#endif /* DCN35_PG_CNTL */
196