File Index
Files and directories
Sign in
FILE

hw_translate_dcn401.c

File preview with syntax highlighting.

linux-6.19.14/drivers/gpu/drm/amd/display/dc/gpio/dcn401/hw_translate_dcn401.c C
  1// SPDX-License-Identifier: MIT
  2//
  3// Copyright 2024 Advanced Micro Devices, Inc.
  4
  5#include "hw_translate_dcn401.h"
  6
  7#include "dm_services.h"
  8#include "include/gpio_types.h"
  9#include "../hw_translate.h"
 10
 11#include "dcn/dcn_4_1_0_offset.h"
 12#include "dcn/dcn_4_1_0_sh_mask.h"
 13
 14#define DCN_BASE__INST0_SEG2                       0x000034C0
 15/* begin *********************
 16 * macros to expend register list macro defined in HW object header file */
 17
 18/* DCN */
 19#define block HPD
 20#define reg_num 0
 21
 22#undef BASE_INNER
 23#define BASE_INNER(seg) DCN_BASE__INST0_SEG ## seg
 24
 25#define BASE(seg) BASE_INNER(seg)
 26
 27#undef REG
 28#define REG(reg_name)\
 29		BASE(reg ## reg_name ## _BASE_IDX) + reg ## reg_name
 30#define SF_HPD(reg_name, field_name, post_fix)\
 31	.field_name = reg_name ## __ ## field_name ## post_fix
 32
 33
 34/* macros to expend register list macro defined in HW object header file
 35 * end *********************/
 36
 37
 38static bool offset_to_id(
 39	uint32_t offset,
 40	uint32_t mask,
 41	enum gpio_id *id,
 42	uint32_t *en)
 43{
 44	switch (offset) {
 45	/* GENERIC */
 46	case REG(DC_GPIO_GENERIC_A):
 47		*id = GPIO_ID_GENERIC;
 48		switch (mask) {
 49		case DC_GPIO_GENERIC_A__DC_GPIO_GENERICA_A_MASK:
 50			*en = GPIO_GENERIC_A;
 51			return true;
 52		case DC_GPIO_GENERIC_A__DC_GPIO_GENERICB_A_MASK:
 53			*en = GPIO_GENERIC_B;
 54			return true;
 55		case DC_GPIO_GENERIC_A__DC_GPIO_GENERICC_A_MASK:
 56			*en = GPIO_GENERIC_C;
 57			return true;
 58		case DC_GPIO_GENERIC_A__DC_GPIO_GENERICD_A_MASK:
 59			*en = GPIO_GENERIC_D;
 60			return true;
 61		case DC_GPIO_GENERIC_A__DC_GPIO_GENERICE_A_MASK:
 62			*en = GPIO_GENERIC_E;
 63			return true;
 64		case DC_GPIO_GENERIC_A__DC_GPIO_GENERICF_A_MASK:
 65			*en = GPIO_GENERIC_F;
 66			return true;
 67		default:
 68			ASSERT_CRITICAL(false);
 69			return false;
 70		}
 71	break;
 72	/* HPD */
 73	case REG(DC_GPIO_HPD_A):
 74		*id = GPIO_ID_HPD;
 75		switch (mask) {
 76		case DC_GPIO_HPD_A__DC_GPIO_HPD1_A_MASK:
 77			*en = GPIO_HPD_1;
 78			return true;
 79		case DC_GPIO_HPD_A__DC_GPIO_HPD2_A_MASK:
 80			*en = GPIO_HPD_2;
 81			return true;
 82		case DC_GPIO_HPD_A__DC_GPIO_HPD3_A_MASK:
 83			*en = GPIO_HPD_3;
 84			return true;
 85		case DC_GPIO_HPD_A__DC_GPIO_HPD4_A_MASK:
 86			*en = GPIO_HPD_4;
 87			return true;
 88		case DC_GPIO_HPD_A__DC_GPIO_HPD5_A_MASK:
 89			*en = GPIO_HPD_5;
 90			return true;
 91		default:
 92			ASSERT_CRITICAL(false);
 93			return false;
 94		}
 95	break;
 96	/* REG(DC_GPIO_GENLK_MASK */
 97	case REG(DC_GPIO_GENLK_A):
 98		*id = GPIO_ID_GSL;
 99		switch (mask) {
100		case DC_GPIO_GENLK_A__DC_GPIO_GENLK_CLK_A_MASK:
101			*en = GPIO_GSL_GENLOCK_CLOCK;
102			return true;
103		case DC_GPIO_GENLK_A__DC_GPIO_GENLK_VSYNC_A_MASK:
104			*en = GPIO_GSL_GENLOCK_VSYNC;
105			return true;
106		case DC_GPIO_GENLK_A__DC_GPIO_SWAPLOCK_A_A_MASK:
107			*en = GPIO_GSL_SWAPLOCK_A;
108			return true;
109		case DC_GPIO_GENLK_A__DC_GPIO_SWAPLOCK_B_A_MASK:
110			*en = GPIO_GSL_SWAPLOCK_B;
111			return true;
112		default:
113			ASSERT_CRITICAL(false);
114			return false;
115		}
116	break;
117	/* DDC */
118	/* we don't care about the GPIO_ID for DDC
119	 * in DdcHandle it will use GPIO_ID_DDC_DATA/GPIO_ID_DDC_CLOCK
120	 * directly in the create method
121	 */
122	case REG(DC_GPIO_DDC1_A):
123		*en = GPIO_DDC_LINE_DDC1;
124		return true;
125	case REG(DC_GPIO_DDC2_A):
126		*en = GPIO_DDC_LINE_DDC2;
127		return true;
128	case REG(DC_GPIO_DDC3_A):
129		*en = GPIO_DDC_LINE_DDC3;
130		return true;
131	case REG(DC_GPIO_DDC4_A):
132		*en = GPIO_DDC_LINE_DDC4;
133		return true;
134	case REG(DC_GPIO_DDCVGA_A):
135		*en = GPIO_DDC_LINE_DDC_VGA;
136		return true;
137
138/*
139 *	case REG(DC_GPIO_I2CPAD_A): not exit
140 *	case REG(DC_GPIO_PWRSEQ_A):
141 *	case REG(DC_GPIO_PAD_STRENGTH_1):
142 *	case REG(DC_GPIO_PAD_STRENGTH_2):
143 *	case REG(DC_GPIO_DEBUG):
144 */
145	/* UNEXPECTED */
146	default:
147/*	case REG(DC_GPIO_SYNCA_A): not exist */
148		ASSERT_CRITICAL(false);
149		return false;
150	}
151}
152
153
154static bool id_to_offset(
155	enum gpio_id id,
156	uint32_t en,
157	struct gpio_pin_info *info)
158{
159	bool result = true;
160
161	switch (id) {
162	case GPIO_ID_DDC_DATA:
163		info->mask = DC_GPIO_DDC1_A__DC_GPIO_DDC1DATA_A_MASK;
164		switch (en) {
165		case GPIO_DDC_LINE_DDC1:
166			info->offset = REG(DC_GPIO_DDC1_A);
167		break;
168		case GPIO_DDC_LINE_DDC2:
169			info->offset = REG(DC_GPIO_DDC2_A);
170		break;
171		case GPIO_DDC_LINE_DDC3:
172			info->offset = REG(DC_GPIO_DDC3_A);
173		break;
174		case GPIO_DDC_LINE_DDC4:
175			info->offset = REG(DC_GPIO_DDC4_A);
176		break;
177/*		case GPIO_DDC_LINE_DDC5:
178			info->offset = REG(DC_GPIO_DDC5_A);
179		break; */
180		case GPIO_DDC_LINE_DDC_VGA:
181			info->offset = REG(DC_GPIO_DDCVGA_A);
182		break;
183		case GPIO_DDC_LINE_I2C_PAD:
184		default:
185			ASSERT_CRITICAL(false);
186			result = false;
187		}
188	break;
189	case GPIO_ID_DDC_CLOCK:
190		info->mask = DC_GPIO_DDC1_A__DC_GPIO_DDC1CLK_A_MASK;
191		switch (en) {
192		case GPIO_DDC_LINE_DDC1:
193			info->offset = REG(DC_GPIO_DDC1_A);
194		break;
195		case GPIO_DDC_LINE_DDC2:
196			info->offset = REG(DC_GPIO_DDC2_A);
197		break;
198		case GPIO_DDC_LINE_DDC3:
199			info->offset = REG(DC_GPIO_DDC3_A);
200		break;
201		case GPIO_DDC_LINE_DDC4:
202			info->offset = REG(DC_GPIO_DDC4_A);
203		break;
204/*		case GPIO_DDC_LINE_DDC5:
205			info->offset = REG(DC_GPIO_DDC5_A);
206		break; */
207		case GPIO_DDC_LINE_DDC_VGA:
208			info->offset = REG(DC_GPIO_DDCVGA_A);
209		break;
210		case GPIO_DDC_LINE_I2C_PAD:
211		default:
212			ASSERT_CRITICAL(false);
213			result = false;
214		}
215	break;
216	case GPIO_ID_GENERIC:
217		info->offset = REG(DC_GPIO_GENERIC_A);
218		switch (en) {
219		case GPIO_GENERIC_A:
220			info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICA_A_MASK;
221		break;
222		case GPIO_GENERIC_B:
223			info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICB_A_MASK;
224		break;
225		case GPIO_GENERIC_C:
226			info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICC_A_MASK;
227		break;
228		case GPIO_GENERIC_D:
229			info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICD_A_MASK;
230		break;
231		case GPIO_GENERIC_E:
232			info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICE_A_MASK;
233		break;
234		case GPIO_GENERIC_F:
235			info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICF_A_MASK;
236		break;
237		default:
238			ASSERT_CRITICAL(false);
239			result = false;
240		}
241	break;
242	case GPIO_ID_HPD:
243		info->offset = REG(DC_GPIO_HPD_A);
244		switch (en) {
245		case GPIO_HPD_1:
246			info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD1_A_MASK;
247		break;
248		case GPIO_HPD_2:
249			info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD2_A_MASK;
250		break;
251		case GPIO_HPD_3:
252			info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD3_A_MASK;
253		break;
254		case GPIO_HPD_4:
255			info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD4_A_MASK;
256		break;
257		case GPIO_HPD_5:
258			info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD5_A_MASK;
259		break;
260		default:
261			ASSERT_CRITICAL(false);
262			result = false;
263		}
264	break;
265	case GPIO_ID_GSL:
266		switch (en) {
267		case GPIO_GSL_GENLOCK_CLOCK:
268				/*not implmented*/
269			ASSERT_CRITICAL(false);
270			result = false;
271		break;
272		case GPIO_GSL_GENLOCK_VSYNC:
273			/*not implmented*/
274			ASSERT_CRITICAL(false);
275			result = false;
276		break;
277		case GPIO_GSL_SWAPLOCK_A:
278			/*not implmented*/
279			ASSERT_CRITICAL(false);
280			result = false;
281		break;
282		case GPIO_GSL_SWAPLOCK_B:
283			/*not implmented*/
284			ASSERT_CRITICAL(false);
285			result = false;
286
287		break;
288		default:
289			ASSERT_CRITICAL(false);
290			result = false;
291		}
292	break;
293	case GPIO_ID_SYNC:
294	case GPIO_ID_VIP_PAD:
295	default:
296		ASSERT_CRITICAL(false);
297		result = false;
298	}
299
300	if (result) {
301		info->offset_y = info->offset + 2;
302		info->offset_en = info->offset + 1;
303		info->offset_mask = info->offset - 1;
304
305		info->mask_y = info->mask;
306		info->mask_en = info->mask;
307		info->mask_mask = info->mask;
308	}
309
310	return result;
311}
312
313
314/* function table */
315static const struct hw_translate_funcs funcs = {
316	.offset_to_id = offset_to_id,
317	.id_to_offset = id_to_offset,
318};
319
320
321/*
322 * dal_hw_translate_dcn401_init
323 *
324 * @brief
325 * Initialize Hw translate function pointers.
326 *
327 * @param
328 * struct hw_translate *tr - [out] struct of function pointers
329 *
330 */
331void dal_hw_translate_dcn401_init(struct hw_translate *tr)
332{
333	tr->funcs = &funcs;
334}
335
~/ Read-only file preview.