xref: /OK3568_Linux_fs/kernel/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright 2014 Advanced Micro Devices, Inc.
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Permission is hereby granted, free of charge, to any person obtaining a
5*4882a593Smuzhiyun  * copy of this software and associated documentation files (the "Software"),
6*4882a593Smuzhiyun  * to deal in the Software without restriction, including without limitation
7*4882a593Smuzhiyun  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*4882a593Smuzhiyun  * and/or sell copies of the Software, and to permit persons to whom the
9*4882a593Smuzhiyun  * Software is furnished to do so, subject to the following conditions:
10*4882a593Smuzhiyun  *
11*4882a593Smuzhiyun  * The above copyright notice and this permission notice shall be included in
12*4882a593Smuzhiyun  * all copies or substantial portions of the Software.
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15*4882a593Smuzhiyun  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*4882a593Smuzhiyun  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17*4882a593Smuzhiyun  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18*4882a593Smuzhiyun  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19*4882a593Smuzhiyun  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20*4882a593Smuzhiyun  * OTHER DEALINGS IN THE SOFTWARE.
21*4882a593Smuzhiyun  *
22*4882a593Smuzhiyun  */
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #ifndef __AMDGPU_ATOMBIOS_H__
25*4882a593Smuzhiyun #define __AMDGPU_ATOMBIOS_H__
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun struct atom_clock_dividers {
28*4882a593Smuzhiyun 	u32 post_div;
29*4882a593Smuzhiyun 	union {
30*4882a593Smuzhiyun 		struct {
31*4882a593Smuzhiyun #ifdef __BIG_ENDIAN
32*4882a593Smuzhiyun 			u32 reserved : 6;
33*4882a593Smuzhiyun 			u32 whole_fb_div : 12;
34*4882a593Smuzhiyun 			u32 frac_fb_div : 14;
35*4882a593Smuzhiyun #else
36*4882a593Smuzhiyun 			u32 frac_fb_div : 14;
37*4882a593Smuzhiyun 			u32 whole_fb_div : 12;
38*4882a593Smuzhiyun 			u32 reserved : 6;
39*4882a593Smuzhiyun #endif
40*4882a593Smuzhiyun 		};
41*4882a593Smuzhiyun 		u32 fb_div;
42*4882a593Smuzhiyun 	};
43*4882a593Smuzhiyun 	u32 ref_div;
44*4882a593Smuzhiyun 	bool enable_post_div;
45*4882a593Smuzhiyun 	bool enable_dithen;
46*4882a593Smuzhiyun 	u32 vco_mode;
47*4882a593Smuzhiyun 	u32 real_clock;
48*4882a593Smuzhiyun 	/* added for CI */
49*4882a593Smuzhiyun 	u32 post_divider;
50*4882a593Smuzhiyun 	u32 flags;
51*4882a593Smuzhiyun };
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun struct atom_mpll_param {
54*4882a593Smuzhiyun 	union {
55*4882a593Smuzhiyun 		struct {
56*4882a593Smuzhiyun #ifdef __BIG_ENDIAN
57*4882a593Smuzhiyun 			u32 reserved : 8;
58*4882a593Smuzhiyun 			u32 clkfrac : 12;
59*4882a593Smuzhiyun 			u32 clkf : 12;
60*4882a593Smuzhiyun #else
61*4882a593Smuzhiyun 			u32 clkf : 12;
62*4882a593Smuzhiyun 			u32 clkfrac : 12;
63*4882a593Smuzhiyun 			u32 reserved : 8;
64*4882a593Smuzhiyun #endif
65*4882a593Smuzhiyun 		};
66*4882a593Smuzhiyun 		u32 fb_div;
67*4882a593Smuzhiyun 	};
68*4882a593Smuzhiyun 	u32 post_div;
69*4882a593Smuzhiyun 	u32 bwcntl;
70*4882a593Smuzhiyun 	u32 dll_speed;
71*4882a593Smuzhiyun 	u32 vco_mode;
72*4882a593Smuzhiyun 	u32 yclk_sel;
73*4882a593Smuzhiyun 	u32 qdr;
74*4882a593Smuzhiyun 	u32 half_rate;
75*4882a593Smuzhiyun };
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun #define MEM_TYPE_GDDR5  0x50
78*4882a593Smuzhiyun #define MEM_TYPE_GDDR4  0x40
79*4882a593Smuzhiyun #define MEM_TYPE_GDDR3  0x30
80*4882a593Smuzhiyun #define MEM_TYPE_DDR2   0x20
81*4882a593Smuzhiyun #define MEM_TYPE_GDDR1  0x10
82*4882a593Smuzhiyun #define MEM_TYPE_DDR3   0xb0
83*4882a593Smuzhiyun #define MEM_TYPE_MASK   0xf0
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun struct atom_memory_info {
86*4882a593Smuzhiyun 	u8 mem_vendor;
87*4882a593Smuzhiyun 	u8 mem_type;
88*4882a593Smuzhiyun };
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun #define MAX_AC_TIMING_ENTRIES 16
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun struct atom_memory_clock_range_table
93*4882a593Smuzhiyun {
94*4882a593Smuzhiyun 	u8 num_entries;
95*4882a593Smuzhiyun 	u8 rsv[3];
96*4882a593Smuzhiyun 	u32 mclk[MAX_AC_TIMING_ENTRIES];
97*4882a593Smuzhiyun };
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun #define VBIOS_MC_REGISTER_ARRAY_SIZE 32
100*4882a593Smuzhiyun #define VBIOS_MAX_AC_TIMING_ENTRIES 20
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun struct atom_mc_reg_entry {
103*4882a593Smuzhiyun 	u32 mclk_max;
104*4882a593Smuzhiyun 	u32 mc_data[VBIOS_MC_REGISTER_ARRAY_SIZE];
105*4882a593Smuzhiyun };
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun struct atom_mc_register_address {
108*4882a593Smuzhiyun 	u16 s1;
109*4882a593Smuzhiyun 	u8 pre_reg_data;
110*4882a593Smuzhiyun };
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun struct atom_mc_reg_table {
113*4882a593Smuzhiyun 	u8 last;
114*4882a593Smuzhiyun 	u8 num_entries;
115*4882a593Smuzhiyun 	struct atom_mc_reg_entry mc_reg_table_entry[VBIOS_MAX_AC_TIMING_ENTRIES];
116*4882a593Smuzhiyun 	struct atom_mc_register_address mc_reg_address[VBIOS_MC_REGISTER_ARRAY_SIZE];
117*4882a593Smuzhiyun };
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun #define MAX_VOLTAGE_ENTRIES 32
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun struct atom_voltage_table_entry
122*4882a593Smuzhiyun {
123*4882a593Smuzhiyun 	u16 value;
124*4882a593Smuzhiyun 	u32 smio_low;
125*4882a593Smuzhiyun };
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun struct atom_voltage_table
128*4882a593Smuzhiyun {
129*4882a593Smuzhiyun 	u32 count;
130*4882a593Smuzhiyun 	u32 mask_low;
131*4882a593Smuzhiyun 	u32 phase_delay;
132*4882a593Smuzhiyun 	struct atom_voltage_table_entry entries[MAX_VOLTAGE_ENTRIES];
133*4882a593Smuzhiyun };
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun struct amdgpu_gpio_rec
136*4882a593Smuzhiyun amdgpu_atombios_lookup_gpio(struct amdgpu_device *adev,
137*4882a593Smuzhiyun 			    u8 id);
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun struct amdgpu_i2c_bus_rec amdgpu_atombios_lookup_i2c_gpio(struct amdgpu_device *adev,
140*4882a593Smuzhiyun 							  uint8_t id);
141*4882a593Smuzhiyun void amdgpu_atombios_i2c_init(struct amdgpu_device *adev);
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun bool amdgpu_atombios_has_dce_engine_info(struct amdgpu_device *adev);
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun bool amdgpu_atombios_get_connector_info_from_object_table(struct amdgpu_device *adev);
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun int amdgpu_atombios_get_clock_info(struct amdgpu_device *adev);
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun int amdgpu_atombios_get_gfx_info(struct amdgpu_device *adev);
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun int amdgpu_atombios_get_vram_width(struct amdgpu_device *adev);
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun bool amdgpu_atombios_get_asic_ss_info(struct amdgpu_device *adev,
154*4882a593Smuzhiyun 				      struct amdgpu_atom_ss *ss,
155*4882a593Smuzhiyun 				      int id, u32 clock);
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun int amdgpu_atombios_get_clock_dividers(struct amdgpu_device *adev,
158*4882a593Smuzhiyun 				       u8 clock_type,
159*4882a593Smuzhiyun 				       u32 clock,
160*4882a593Smuzhiyun 				       bool strobe_mode,
161*4882a593Smuzhiyun 				       struct atom_clock_dividers *dividers);
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun int amdgpu_atombios_get_memory_pll_dividers(struct amdgpu_device *adev,
164*4882a593Smuzhiyun 					    u32 clock,
165*4882a593Smuzhiyun 					    bool strobe_mode,
166*4882a593Smuzhiyun 					    struct atom_mpll_param *mpll_param);
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun void amdgpu_atombios_set_engine_dram_timings(struct amdgpu_device *adev,
169*4882a593Smuzhiyun 					     u32 eng_clock, u32 mem_clock);
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun int amdgpu_atombios_get_leakage_id_from_vbios(struct amdgpu_device *adev,
172*4882a593Smuzhiyun 					      u16 *leakage_id);
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun int amdgpu_atombios_get_leakage_vddc_based_on_leakage_params(struct amdgpu_device *adev,
175*4882a593Smuzhiyun 							     u16 *vddc, u16 *vddci,
176*4882a593Smuzhiyun 							     u16 virtual_voltage_id,
177*4882a593Smuzhiyun 							     u16 vbios_voltage_id);
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun int amdgpu_atombios_get_voltage_evv(struct amdgpu_device *adev,
180*4882a593Smuzhiyun 				    u16 virtual_voltage_id,
181*4882a593Smuzhiyun 				    u16 *voltage);
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun bool
184*4882a593Smuzhiyun amdgpu_atombios_is_voltage_gpio(struct amdgpu_device *adev,
185*4882a593Smuzhiyun 				u8 voltage_type, u8 voltage_mode);
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun int amdgpu_atombios_get_voltage_table(struct amdgpu_device *adev,
188*4882a593Smuzhiyun 				      u8 voltage_type, u8 voltage_mode,
189*4882a593Smuzhiyun 				      struct atom_voltage_table *voltage_table);
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun int amdgpu_atombios_init_mc_reg_table(struct amdgpu_device *adev,
192*4882a593Smuzhiyun 				      u8 module_index,
193*4882a593Smuzhiyun 				      struct atom_mc_reg_table *reg_table);
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun bool amdgpu_atombios_has_gpu_virtualization_table(struct amdgpu_device *adev);
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun void amdgpu_atombios_scratch_regs_lock(struct amdgpu_device *adev, bool lock);
198*4882a593Smuzhiyun void amdgpu_atombios_scratch_regs_engine_hung(struct amdgpu_device *adev,
199*4882a593Smuzhiyun 					      bool hung);
200*4882a593Smuzhiyun bool amdgpu_atombios_scratch_need_asic_init(struct amdgpu_device *adev);
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun void amdgpu_atombios_copy_swap(u8 *dst, u8 *src, u8 num_bytes, bool to_le);
203*4882a593Smuzhiyun int amdgpu_atombios_get_max_vddc(struct amdgpu_device *adev, u8 voltage_type,
204*4882a593Smuzhiyun 			     u16 voltage_id, u16 *voltage);
205*4882a593Smuzhiyun int amdgpu_atombios_get_leakage_vddc_based_on_leakage_idx(struct amdgpu_device *adev,
206*4882a593Smuzhiyun 						      u16 *voltage,
207*4882a593Smuzhiyun 						      u16 leakage_idx);
208*4882a593Smuzhiyun void amdgpu_atombios_get_default_voltages(struct amdgpu_device *adev,
209*4882a593Smuzhiyun 					  u16 *vddc, u16 *vddci, u16 *mvdd);
210*4882a593Smuzhiyun int amdgpu_atombios_get_clock_dividers(struct amdgpu_device *adev,
211*4882a593Smuzhiyun 				       u8 clock_type,
212*4882a593Smuzhiyun 				       u32 clock,
213*4882a593Smuzhiyun 				       bool strobe_mode,
214*4882a593Smuzhiyun 				       struct atom_clock_dividers *dividers);
215*4882a593Smuzhiyun int amdgpu_atombios_get_svi2_info(struct amdgpu_device *adev,
216*4882a593Smuzhiyun 			      u8 voltage_type,
217*4882a593Smuzhiyun 			      u8 *svd_gpio_id, u8 *svc_gpio_id);
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun int amdgpu_atombios_get_data_table(struct amdgpu_device *adev,
220*4882a593Smuzhiyun 				   uint32_t table,
221*4882a593Smuzhiyun 				   uint16_t *size,
222*4882a593Smuzhiyun 				   uint8_t *frev,
223*4882a593Smuzhiyun 				   uint8_t *crev,
224*4882a593Smuzhiyun 				   uint8_t **addr);
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun void amdgpu_atombios_fini(struct amdgpu_device *adev);
227*4882a593Smuzhiyun int amdgpu_atombios_init(struct amdgpu_device *adev);
228*4882a593Smuzhiyun 
229*4882a593Smuzhiyun #endif
230