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 */
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 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