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