xref: /openbsd-src/sys/dev/pci/drm/amd/include/cgs_common.h (revision ad8b1aafbcc34f7eb86e4ebfd874be286017954b)
1*fb4d8502Sjsg /*
2*fb4d8502Sjsg  * Copyright 2015 Advanced Micro Devices, Inc.
3*fb4d8502Sjsg  *
4*fb4d8502Sjsg  * Permission is hereby granted, free of charge, to any person obtaining a
5*fb4d8502Sjsg  * copy of this software and associated documentation files (the "Software"),
6*fb4d8502Sjsg  * to deal in the Software without restriction, including without limitation
7*fb4d8502Sjsg  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*fb4d8502Sjsg  * and/or sell copies of the Software, and to permit persons to whom the
9*fb4d8502Sjsg  * Software is furnished to do so, subject to the following conditions:
10*fb4d8502Sjsg  *
11*fb4d8502Sjsg  * The above copyright notice and this permission notice shall be included in
12*fb4d8502Sjsg  * all copies or substantial portions of the Software.
13*fb4d8502Sjsg  *
14*fb4d8502Sjsg  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15*fb4d8502Sjsg  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*fb4d8502Sjsg  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17*fb4d8502Sjsg  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18*fb4d8502Sjsg  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19*fb4d8502Sjsg  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20*fb4d8502Sjsg  * OTHER DEALINGS IN THE SOFTWARE.
21*fb4d8502Sjsg  *
22*fb4d8502Sjsg  *
23*fb4d8502Sjsg  */
24*fb4d8502Sjsg #ifndef _CGS_COMMON_H
25*fb4d8502Sjsg #define _CGS_COMMON_H
26*fb4d8502Sjsg 
27*fb4d8502Sjsg #include "amd_shared.h"
28*fb4d8502Sjsg 
29*fb4d8502Sjsg struct cgs_device;
30*fb4d8502Sjsg 
31*fb4d8502Sjsg /**
32*fb4d8502Sjsg  * enum cgs_ind_reg - Indirect register spaces
33*fb4d8502Sjsg  */
34*fb4d8502Sjsg enum cgs_ind_reg {
35*fb4d8502Sjsg 	CGS_IND_REG__PCIE,
36*fb4d8502Sjsg 	CGS_IND_REG__SMC,
37*fb4d8502Sjsg 	CGS_IND_REG__UVD_CTX,
38*fb4d8502Sjsg 	CGS_IND_REG__DIDT,
39*fb4d8502Sjsg 	CGS_IND_REG_GC_CAC,
40*fb4d8502Sjsg 	CGS_IND_REG_SE_CAC,
41*fb4d8502Sjsg 	CGS_IND_REG__AUDIO_ENDPT
42*fb4d8502Sjsg };
43*fb4d8502Sjsg 
44*fb4d8502Sjsg /*
45*fb4d8502Sjsg  * enum cgs_ucode_id - Firmware types for different IPs
46*fb4d8502Sjsg  */
47*fb4d8502Sjsg enum cgs_ucode_id {
48*fb4d8502Sjsg 	CGS_UCODE_ID_SMU = 0,
49*fb4d8502Sjsg 	CGS_UCODE_ID_SMU_SK,
50*fb4d8502Sjsg 	CGS_UCODE_ID_SDMA0,
51*fb4d8502Sjsg 	CGS_UCODE_ID_SDMA1,
52*fb4d8502Sjsg 	CGS_UCODE_ID_CP_CE,
53*fb4d8502Sjsg 	CGS_UCODE_ID_CP_PFP,
54*fb4d8502Sjsg 	CGS_UCODE_ID_CP_ME,
55*fb4d8502Sjsg 	CGS_UCODE_ID_CP_MEC,
56*fb4d8502Sjsg 	CGS_UCODE_ID_CP_MEC_JT1,
57*fb4d8502Sjsg 	CGS_UCODE_ID_CP_MEC_JT2,
58*fb4d8502Sjsg 	CGS_UCODE_ID_GMCON_RENG,
59*fb4d8502Sjsg 	CGS_UCODE_ID_RLC_G,
60*fb4d8502Sjsg 	CGS_UCODE_ID_STORAGE,
61*fb4d8502Sjsg 	CGS_UCODE_ID_MAXIMUM,
62*fb4d8502Sjsg };
63*fb4d8502Sjsg 
64*fb4d8502Sjsg /**
65*fb4d8502Sjsg  * struct cgs_firmware_info - Firmware information
66*fb4d8502Sjsg  */
67*fb4d8502Sjsg struct cgs_firmware_info {
68*fb4d8502Sjsg 	uint16_t		version;
69*fb4d8502Sjsg 	uint16_t		fw_version;
70*fb4d8502Sjsg 	uint16_t		feature_version;
71*fb4d8502Sjsg 	uint32_t		image_size;
72*fb4d8502Sjsg 	uint64_t		mc_addr;
73*fb4d8502Sjsg 
74*fb4d8502Sjsg 	/* only for smc firmware */
75*fb4d8502Sjsg 	uint32_t		ucode_start_address;
76*fb4d8502Sjsg 
77*fb4d8502Sjsg 	void			*kptr;
78*fb4d8502Sjsg 	bool			is_kicker;
79*fb4d8502Sjsg };
80*fb4d8502Sjsg 
81*fb4d8502Sjsg typedef unsigned long cgs_handle_t;
82*fb4d8502Sjsg 
83*fb4d8502Sjsg /**
84*fb4d8502Sjsg  * cgs_read_register() - Read an MMIO register
85*fb4d8502Sjsg  * @cgs_device:	opaque device handle
86*fb4d8502Sjsg  * @offset:	register offset
87*fb4d8502Sjsg  *
88*fb4d8502Sjsg  * Return:  register value
89*fb4d8502Sjsg  */
90*fb4d8502Sjsg typedef uint32_t (*cgs_read_register_t)(struct cgs_device *cgs_device, unsigned offset);
91*fb4d8502Sjsg 
92*fb4d8502Sjsg /**
93*fb4d8502Sjsg  * cgs_write_register() - Write an MMIO register
94*fb4d8502Sjsg  * @cgs_device:	opaque device handle
95*fb4d8502Sjsg  * @offset:	register offset
96*fb4d8502Sjsg  * @value:	register value
97*fb4d8502Sjsg  */
98*fb4d8502Sjsg typedef void (*cgs_write_register_t)(struct cgs_device *cgs_device, unsigned offset,
99*fb4d8502Sjsg 				     uint32_t value);
100*fb4d8502Sjsg 
101*fb4d8502Sjsg /**
102*fb4d8502Sjsg  * cgs_read_ind_register() - Read an indirect register
103*fb4d8502Sjsg  * @cgs_device:	opaque device handle
104*fb4d8502Sjsg  * @offset:	register offset
105*fb4d8502Sjsg  *
106*fb4d8502Sjsg  * Return:  register value
107*fb4d8502Sjsg  */
108*fb4d8502Sjsg typedef uint32_t (*cgs_read_ind_register_t)(struct cgs_device *cgs_device, enum cgs_ind_reg space,
109*fb4d8502Sjsg 					    unsigned index);
110*fb4d8502Sjsg 
111*fb4d8502Sjsg /**
112*fb4d8502Sjsg  * cgs_write_ind_register() - Write an indirect register
113*fb4d8502Sjsg  * @cgs_device:	opaque device handle
114*fb4d8502Sjsg  * @offset:	register offset
115*fb4d8502Sjsg  * @value:	register value
116*fb4d8502Sjsg  */
117*fb4d8502Sjsg typedef void (*cgs_write_ind_register_t)(struct cgs_device *cgs_device, enum cgs_ind_reg space,
118*fb4d8502Sjsg 					 unsigned index, uint32_t value);
119*fb4d8502Sjsg 
120*fb4d8502Sjsg #define CGS_REG_FIELD_SHIFT(reg, field) reg##__##field##__SHIFT
121*fb4d8502Sjsg #define CGS_REG_FIELD_MASK(reg, field) reg##__##field##_MASK
122*fb4d8502Sjsg 
123*fb4d8502Sjsg #define CGS_REG_SET_FIELD(orig_val, reg, field, field_val)			\
124*fb4d8502Sjsg 	(((orig_val) & ~CGS_REG_FIELD_MASK(reg, field)) |			\
125*fb4d8502Sjsg 	 (CGS_REG_FIELD_MASK(reg, field) & ((field_val) << CGS_REG_FIELD_SHIFT(reg, field))))
126*fb4d8502Sjsg 
127*fb4d8502Sjsg #define CGS_REG_GET_FIELD(value, reg, field)				\
128*fb4d8502Sjsg 	(((value) & CGS_REG_FIELD_MASK(reg, field)) >> CGS_REG_FIELD_SHIFT(reg, field))
129*fb4d8502Sjsg 
130*fb4d8502Sjsg #define CGS_WREG32_FIELD(device, reg, field, val)	\
131*fb4d8502Sjsg 	cgs_write_register(device, mm##reg, (cgs_read_register(device, mm##reg) & ~CGS_REG_FIELD_MASK(reg, field)) | (val) << CGS_REG_FIELD_SHIFT(reg, field))
132*fb4d8502Sjsg 
133*fb4d8502Sjsg #define CGS_WREG32_FIELD_IND(device, space, reg, field, val)	\
134*fb4d8502Sjsg 	cgs_write_ind_register(device, space, ix##reg, (cgs_read_ind_register(device, space, ix##reg) & ~CGS_REG_FIELD_MASK(reg, field)) | (val) << CGS_REG_FIELD_SHIFT(reg, field))
135*fb4d8502Sjsg 
136*fb4d8502Sjsg typedef int (*cgs_get_firmware_info)(struct cgs_device *cgs_device,
137*fb4d8502Sjsg 				     enum cgs_ucode_id type,
138*fb4d8502Sjsg 				     struct cgs_firmware_info *info);
139*fb4d8502Sjsg 
140*fb4d8502Sjsg struct cgs_ops {
141*fb4d8502Sjsg 	/* MMIO access */
142*fb4d8502Sjsg 	cgs_read_register_t read_register;
143*fb4d8502Sjsg 	cgs_write_register_t write_register;
144*fb4d8502Sjsg 	cgs_read_ind_register_t read_ind_register;
145*fb4d8502Sjsg 	cgs_write_ind_register_t write_ind_register;
146*fb4d8502Sjsg 	/* Firmware Info */
147*fb4d8502Sjsg 	cgs_get_firmware_info get_firmware_info;
148*fb4d8502Sjsg };
149*fb4d8502Sjsg 
150*fb4d8502Sjsg struct cgs_os_ops; /* To be define in OS-specific CGS header */
151*fb4d8502Sjsg 
152*fb4d8502Sjsg struct cgs_device
153*fb4d8502Sjsg {
154*fb4d8502Sjsg 	const struct cgs_ops *ops;
155*fb4d8502Sjsg 	/* to be embedded at the start of driver private structure */
156*fb4d8502Sjsg };
157*fb4d8502Sjsg 
158*fb4d8502Sjsg /* Convenience macros that make CGS indirect function calls look like
159*fb4d8502Sjsg  * normal function calls */
160*fb4d8502Sjsg #define CGS_CALL(func,dev,...) \
161*fb4d8502Sjsg 	(((struct cgs_device *)dev)->ops->func(dev, ##__VA_ARGS__))
162*fb4d8502Sjsg #define CGS_OS_CALL(func,dev,...) \
163*fb4d8502Sjsg 	(((struct cgs_device *)dev)->os_ops->func(dev, ##__VA_ARGS__))
164*fb4d8502Sjsg 
165*fb4d8502Sjsg #define cgs_read_register(dev,offset)		\
166*fb4d8502Sjsg 	CGS_CALL(read_register,dev,offset)
167*fb4d8502Sjsg #define cgs_write_register(dev,offset,value)		\
168*fb4d8502Sjsg 	CGS_CALL(write_register,dev,offset,value)
169*fb4d8502Sjsg #define cgs_read_ind_register(dev,space,index)		\
170*fb4d8502Sjsg 	CGS_CALL(read_ind_register,dev,space,index)
171*fb4d8502Sjsg #define cgs_write_ind_register(dev,space,index,value)		\
172*fb4d8502Sjsg 	CGS_CALL(write_ind_register,dev,space,index,value)
173*fb4d8502Sjsg 
174*fb4d8502Sjsg #define cgs_get_firmware_info(dev, type, info)	\
175*fb4d8502Sjsg 	CGS_CALL(get_firmware_info, dev, type, info)
176*fb4d8502Sjsg 
177*fb4d8502Sjsg #endif /* _CGS_COMMON_H */
178