1 /*
2 * Copyright (C) 2021-2026, 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 */
ddrphy_phyinit_isdbytedisabled(struct stm32mp_ddr_config * config,struct pmu_smb_ddr_1d * mb_ddr_1d,uint32_t dbytenumber)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 #if STM32MP_DDR3_TYPE || STM32MP_DDR4_TYPE
26 disabledbyte = (dbytenumber > (config->uib.numactivedbytedfi0 - 1U)) ? 1 : 0;
27 #else /* STM32MP_LPDDR4_TYPE */
28 nad0 = config->uib.numactivedbytedfi0;
29 nad1 = config->uib.numactivedbytedfi1;
30
31 if ((nad0 + nad1) > config->uib.numdbyte) {
32 ERROR("%s %d\n", __func__, __LINE__);
33 VERBOSE("%s invalid PHY configuration:\n", __func__);
34 VERBOSE("numactivedbytedfi0(%u)+numactivedbytedfi1(%u)>numdbytes(%u).\n",
35 nad0, nad1, config->uib.numdbyte);
36 }
37
38 if (config->uib.dfi1exists != 0U) {
39 if (config->uib.numactivedbytedfi1 == 0U) {
40 /* Only dfi0 (ChA) is enabled, dfi1 (ChB) disabled */
41 disabledbyte = (dbytenumber > (config->uib.numactivedbytedfi0 - 1U)) ?
42 1 : 0;
43 } else {
44 /* DFI1 enabled */
45 disabledbyte = (((config->uib.numactivedbytedfi0 - 1U) < dbytenumber) &&
46 (dbytenumber < (config->uib.numdbyte / 2U))) ?
47 1 : (dbytenumber >
48 ((config->uib.numdbyte / 2U) +
49 config->uib.numactivedbytedfi1 - 1U)) ? 1 : 0;
50 }
51 } else {
52 disabledbyte = (dbytenumber > (config->uib.numactivedbytedfi0 - 1U)) ? 1 : 0;
53 }
54 #endif /* STM32MP_DDR3_TYPE || STM32MP_DDR4_TYPE */
55
56 /* Qualify results against MessageBlock */
57 #if STM32MP_DDR3_TYPE || STM32MP_DDR4_TYPE
58 if ((mb_ddr_1d->enableddqs < 1U) ||
59 (mb_ddr_1d->enableddqs > (uint8_t)(8U * config->uib.numactivedbytedfi0))) {
60 ERROR("%s %d\n", __func__, __LINE__);
61 VERBOSE("%s enableddqs(%u)\n", __func__, mb_ddr_1d->enableddqs);
62 VERBOSE("Value must be 0 < enableddqs < config->uib.numactivedbytedfi0 * 8.\n");
63 }
64
65 if (dbytenumber < 8) {
66 disabledbyte |= (int)mb_ddr_1d->disableddbyte & (0x1 << dbytenumber);
67 }
68 #else /* STM32MP_LPDDR4_TYPE */
69 if ((mb_ddr_1d->enableddqscha < 1U) ||
70 (mb_ddr_1d->enableddqscha > (uint8_t)(8U * config->uib.numactivedbytedfi0))) {
71 ERROR("%s %d\n", __func__, __LINE__);
72 VERBOSE("%s enableddqscha(%u)\n", __func__, mb_ddr_1d->enableddqscha);
73 VERBOSE("Value must be 0 < enableddqscha < config->uib.numactivedbytedfi0*8\n");
74 }
75
76 if ((config->uib.dfi1exists != 0U) && (config->uib.numactivedbytedfi1 > 0U) &&
77 ((mb_ddr_1d->enableddqschb < 1U) ||
78 (mb_ddr_1d->enableddqschb > (uint8_t)(8U * config->uib.numactivedbytedfi1)))) {
79 ERROR("%s %d\n", __func__, __LINE__);
80 VERBOSE("%s enableddqschb(%u)\n", __func__, mb_ddr_1d->enableddqschb);
81 VERBOSE("Value must be 0 < enableddqschb < config->uib.numactivedbytedfi1*8\n");
82 }
83 #endif /* STM32MP_DDR3_TYPE || STM32MP_DDR4_TYPE */
84
85 return disabledbyte;
86 }
87