xref: /rk3399_ARM-atf/drivers/st/ddr/phy/phyinit/src/ddrphy_phyinit_isdbytedisabled.c (revision 52e486f6a6192bd18d36cdcbc35c59092eefc810)
1 /*
2  * Copyright (C) 2021-2024, STMicroelectronics - All Rights Reserved
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include <stdlib.h>
8 
9 #include <common/debug.h>
10 
11 #include <ddrphy_phyinit.h>
12 #include <ddrphy_wrapper.h>
13 
14 /*
15  * Helper function to determine if a given DByte is Disabled given PhyInit inputs.
16  * @return 1 if disabled, 0 if enabled.
17  */
18 int ddrphy_phyinit_isdbytedisabled(struct stm32mp_ddr_config *config,
19 				   struct pmu_smb_ddr_1d *mb_ddr_1d, uint32_t dbytenumber)
20 {
21 	int disabledbyte;
22 	uint32_t nad0 __maybe_unused;
23 	uint32_t nad1 __maybe_unused;
24 
25 	disabledbyte = 0; /* Default assume Dbyte is Enabled */
26 
27 #if STM32MP_DDR3_TYPE || STM32MP_DDR4_TYPE
28 	disabledbyte = (dbytenumber > (config->uib.numactivedbytedfi0 - 1U)) ? 1 : 0;
29 #else /* STM32MP_LPDDR4_TYPE */
30 	nad0 = config->uib.numactivedbytedfi0;
31 	nad1 = config->uib.numactivedbytedfi1;
32 
33 	if ((nad0 + nad1) > config->uib.numdbyte) {
34 		ERROR("%s %d\n", __func__, __LINE__);
35 		VERBOSE("%s invalid PHY configuration:\n", __func__);
36 		VERBOSE("numactivedbytedfi0(%u)+numactivedbytedfi1(%u)>numdbytes(%u).\n",
37 			nad0, nad1, config->uib.numdbyte);
38 	}
39 
40 	if (config->uib.dfi1exists != 0U) {
41 		if (config->uib.numactivedbytedfi1 == 0U) {
42 			/* Only dfi0 (ChA) is enabled, dfi1 (ChB) disabled */
43 			disabledbyte = (dbytenumber > (config->uib.numactivedbytedfi0 - 1U)) ?
44 				       1 : 0;
45 		} else {
46 			/* DFI1 enabled */
47 			disabledbyte = (((config->uib.numactivedbytedfi0 - 1U) < dbytenumber) &&
48 					(dbytenumber < (config->uib.numdbyte / 2U))) ?
49 				       1 : (dbytenumber >
50 					    ((config->uib.numdbyte / 2U) +
51 					     config->uib.numactivedbytedfi1 - 1U)) ? 1 : 0;
52 		}
53 	} else {
54 		disabledbyte = (dbytenumber > (config->uib.numactivedbytedfi0 - 1U)) ? 1 : 0;
55 	}
56 #endif /* STM32MP_DDR3_TYPE || STM32MP_DDR4_TYPE */
57 
58 	/* Qualify results against MessageBlock */
59 #if STM32MP_DDR3_TYPE || STM32MP_DDR4_TYPE
60 	if ((mb_ddr_1d->enableddqs < 1U) ||
61 	    (mb_ddr_1d->enableddqs > (uint8_t)(8U * config->uib.numactivedbytedfi0))) {
62 		ERROR("%s %d\n", __func__, __LINE__);
63 		VERBOSE("%s enableddqs(%u)\n", __func__, mb_ddr_1d->enableddqs);
64 		VERBOSE("Value must be 0 < enableddqs < config->uib.numactivedbytedfi0 * 8.\n");
65 	}
66 
67 	if (dbytenumber < 8) {
68 		disabledbyte |= (int)mb_ddr_1d->disableddbyte & (0x1 << dbytenumber);
69 	}
70 #else /* STM32MP_LPDDR4_TYPE */
71 	if ((mb_ddr_1d->enableddqscha < 1U) ||
72 	    (mb_ddr_1d->enableddqscha > (uint8_t)(8U * config->uib.numactivedbytedfi0))) {
73 		ERROR("%s %d\n", __func__, __LINE__);
74 		VERBOSE("%s enableddqscha(%u)\n", __func__, mb_ddr_1d->enableddqscha);
75 		VERBOSE("Value must be 0 < enableddqscha < config->uib.numactivedbytedfi0*8\n");
76 	}
77 
78 	if ((config->uib.dfi1exists != 0U) && (config->uib.numactivedbytedfi1 > 0U) &&
79 	    ((mb_ddr_1d->enableddqschb < 1U) ||
80 	     (mb_ddr_1d->enableddqschb > (uint8_t)(8U * config->uib.numactivedbytedfi1)))) {
81 		ERROR("%s %d\n", __func__, __LINE__);
82 		VERBOSE("%s enableddqschb(%u)\n", __func__, mb_ddr_1d->enableddqschb);
83 		VERBOSE("Value must be 0 < enableddqschb < config->uib.numactivedbytedfi1*8\n");
84 	}
85 #endif /* STM32MP_DDR3_TYPE || STM32MP_DDR4_TYPE */
86 
87 	return disabledbyte;
88 }
89