130c8a20dSKhristine Andreea Barbulescu /* 230c8a20dSKhristine Andreea Barbulescu * Copyright 2020-2025 NXP 330c8a20dSKhristine Andreea Barbulescu * 430c8a20dSKhristine Andreea Barbulescu * SPDX-License-Identifier: BSD-3-Clause 530c8a20dSKhristine Andreea Barbulescu */ 630c8a20dSKhristine Andreea Barbulescu 730c8a20dSKhristine Andreea Barbulescu #ifndef DDR_UTILS_H 830c8a20dSKhristine Andreea Barbulescu #define DDR_UTILS_H 930c8a20dSKhristine Andreea Barbulescu 1030c8a20dSKhristine Andreea Barbulescu #include <stdbool.h> 1130c8a20dSKhristine Andreea Barbulescu #include <stdlib.h> 1230c8a20dSKhristine Andreea Barbulescu 1330c8a20dSKhristine Andreea Barbulescu #include <lib/mmio.h> 1430c8a20dSKhristine Andreea Barbulescu 1530c8a20dSKhristine Andreea Barbulescu #include <platform_def.h> 1630c8a20dSKhristine Andreea Barbulescu 1730c8a20dSKhristine Andreea Barbulescu /* Possible errors */ 1830c8a20dSKhristine Andreea Barbulescu #define NO_ERR 0x00000000U 1930c8a20dSKhristine Andreea Barbulescu #define TIMEOUT_ERR 0x00000002U 2030c8a20dSKhristine Andreea Barbulescu #define TRAINING_FAILED 0x00000003U 2130c8a20dSKhristine Andreea Barbulescu #define BITFIELD_EXCEEDED 0x00000004U 2230c8a20dSKhristine Andreea Barbulescu #define DEASSERT_FAILED 0x00000005U 2330c8a20dSKhristine Andreea Barbulescu 24a4efd428SKhristine Andreea Barbulescu /* DDRC related */ 25a4efd428SKhristine Andreea Barbulescu #define DDRC_BASE 0x403C0000U 26a4efd428SKhristine Andreea Barbulescu #define OFFSET_DDRC_SWCTL 0x320U 27a4efd428SKhristine Andreea Barbulescu #define OFFSET_DDRC_DFIMISC 0x1B0U 28a4efd428SKhristine Andreea Barbulescu #define OFFSET_DDRC_PWRCTL 0x30U 29a4efd428SKhristine Andreea Barbulescu #define OFFSET_DDRC_SWSTAT 0x324U 30a4efd428SKhristine Andreea Barbulescu #define OFFSET_DDRC_DFITMG0 0x190U 31a4efd428SKhristine Andreea Barbulescu #define OFFSET_DDRC_DBG1 0x304U 32a4efd428SKhristine Andreea Barbulescu 33a4efd428SKhristine Andreea Barbulescu /* DDRC masks and values */ 34a4efd428SKhristine Andreea Barbulescu #define MSTR_LPDDR4_VAL 0x20U 35a4efd428SKhristine Andreea Barbulescu #define SWSTAT_SW_DONE 1U 36a4efd428SKhristine Andreea Barbulescu #define SWSTAT_SW_NOT_DONE 0U 37a4efd428SKhristine Andreea Barbulescu #define SWCTL_SWDONE_DONE 0x1U 38a4efd428SKhristine Andreea Barbulescu #define SWCTL_SWDONE_ENABLE 0x0U 39a4efd428SKhristine Andreea Barbulescu #define SWSTAT_SWDONE_ACK_MASK GENMASK_32(1U, 0U) 40a4efd428SKhristine Andreea Barbulescu 41a4efd428SKhristine Andreea Barbulescu #define MSTR_DRAM_MASK GENMASK_32(5U, 0U) 42a4efd428SKhristine Andreea Barbulescu #define MSTR_ACT_RANKS_MASK GENMASK_32(25U, 24U) 43a4efd428SKhristine Andreea Barbulescu #define MSTR_DUAL_RANK_VAL 0x3000000U 44a4efd428SKhristine Andreea Barbulescu #define MSTR_BURST_RDWR_POS 16 45a4efd428SKhristine Andreea Barbulescu #define MSTR_BURST_RDWR_MASK 0xFU 46a4efd428SKhristine Andreea Barbulescu #define DFITMG0_PHY_CLK_POS 15 47a4efd428SKhristine Andreea Barbulescu #define DFITMG0_PHY_CLK_MASK 0x1U 48a4efd428SKhristine Andreea Barbulescu 49a4efd428SKhristine Andreea Barbulescu #define DDR_SS_AXI_PARITY_ENABLE_MASK GENMASK_32(12U, 4U) 50a4efd428SKhristine Andreea Barbulescu #define DDR_SS_AXI_PARITY_TYPE_MASK GENMASK_32(24U, 16U) 51a4efd428SKhristine Andreea Barbulescu #define DDR_SS_DFI_1_ENABLED 0x1U 52a4efd428SKhristine Andreea Barbulescu #define DBG1_DISABLE_DE_QUEUEING 0x0U 53a4efd428SKhristine Andreea Barbulescu #define RFSHCTL3_DISABLE_AUTO_REFRESH 0x1U 54a4efd428SKhristine Andreea Barbulescu 55a4efd428SKhristine Andreea Barbulescu #define PWRCTL_POWER_DOWN_ENABLE_MASK BIT_32(1) 56a4efd428SKhristine Andreea Barbulescu #define PWRCTL_SELF_REFRESH_ENABLE_MASK BIT_32(0) 57a4efd428SKhristine Andreea Barbulescu #define PWRCTL_EN_DFI_DRAM_CLOCK_DIS_MASK BIT_32(3) 58a4efd428SKhristine Andreea Barbulescu #define DFIMISC_DFI_INIT_COMPLETE_EN_MASK BIT_32(0) 59a4efd428SKhristine Andreea Barbulescu 6030c8a20dSKhristine Andreea Barbulescu #define TRAINING_OK_MSG 0x07U 6130c8a20dSKhristine Andreea Barbulescu #define TRAINING_FAILED_MSG 0xFFU 6230c8a20dSKhristine Andreea Barbulescu 6330c8a20dSKhristine Andreea Barbulescu #define APBONLY_DCTWRITEPROT_ACK_EN 0U 6430c8a20dSKhristine Andreea Barbulescu #define APBONLY_DCTWRITEPROT_ACK_DIS 1U 6530c8a20dSKhristine Andreea Barbulescu 6630c8a20dSKhristine Andreea Barbulescu /* PHY related */ 6730c8a20dSKhristine Andreea Barbulescu #define DDR_PHYA_APBONLY_UCTSHADOWREGS 0x40380404U 6830c8a20dSKhristine Andreea Barbulescu #define UCT_WRITE_PROT_SHADOW_MASK 0x1U 6930c8a20dSKhristine Andreea Barbulescu #define DDR_PHYA_DCTWRITEPROT 0x4038040CU 7030c8a20dSKhristine Andreea Barbulescu #define DDR_PHYA_APBONLY_UCTWRITEONLYSHADOW 0x40380410U 71a4efd428SKhristine Andreea Barbulescu #define OFFSET_DDRC_RFSHCTL3 0x60U 7230c8a20dSKhristine Andreea Barbulescu #define UCT_WRITE_PROT_SHADOW_ACK 0x0U 73a4efd428SKhristine Andreea Barbulescu #define TXDQDLY_COARSE 6U 74a4efd428SKhristine Andreea Barbulescu #define DDRPHY_PIPE_DFI_MISC 1U 75a4efd428SKhristine Andreea Barbulescu #define ARDPTR_INITVAL_ADDR 0x40381494U 76a4efd428SKhristine Andreea Barbulescu 77a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_RR_1_0 0x403B004CU 78a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_RR_0_1 0x403B004DU 79a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_RW_1_1 0x403B0050U 80a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_RW_1_0 0x403B0051U 81a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_RW_0_1 0x403B0054U 82a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_RW_0_0 0x403B0055U 83a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_WR_1_1 0x403B0058U 84a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_WR_1_0 0x403B0059U 85a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_WR_0_1 0x403B005CU 86a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_WR_0_0 0x403B005DU 87a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_WW_1_0 0x403B0060U 88a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_WW_0_1 0x403B0061U 89a4efd428SKhristine Andreea Barbulescu 90a4efd428SKhristine Andreea Barbulescu #define CDD_CHB_RR_1_0 0x403B00B1U 91a4efd428SKhristine Andreea Barbulescu #define CDD_CHB_RR_0_1 0x403B00B4U 92a4efd428SKhristine Andreea Barbulescu #define CDD_CHB_RW_1_1 0x403B00B5U 93a4efd428SKhristine Andreea Barbulescu #define CDD_CHB_RW_1_0 0x403B00B8U 94a4efd428SKhristine Andreea Barbulescu #define CDD_CHB_RW_0_1 0x403B00B9U 95a4efd428SKhristine Andreea Barbulescu #define CDD_CHB_RW_0_0 0x403B00BCU 96a4efd428SKhristine Andreea Barbulescu #define CDD_CHB_WR_1_1 0x403B00BDU 97a4efd428SKhristine Andreea Barbulescu #define CDD_CHB_WR_1_0 0x403B00C0U 98a4efd428SKhristine Andreea Barbulescu #define CDD_CHB_WR_0_1 0x403B00C1U 99a4efd428SKhristine Andreea Barbulescu #define CDD_CHB_WR_0_0 0x403B00C4U 100a4efd428SKhristine Andreea Barbulescu #define CDD_CHB_WW_1_0 0x403B00C5U 101a4efd428SKhristine Andreea Barbulescu #define CDD_CHB_WW_0_1 0x403B00C8U 102a4efd428SKhristine Andreea Barbulescu 103a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_RR_1_0_DDR3 0x403B0059U 104a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_RR_0_1_DDR3 0x403B0060U 105a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_RW_1_1_DDR3 0x403B008DU 106a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_RW_1_0_DDR3 0x403B0090U 107a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_RW_0_1_DDR3 0x403B0095U 108a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_RW_0_0_DDR3 0x403B0098U 109a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_WR_1_1_DDR3 0x403B00ADU 110a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_WR_1_0_DDR3 0x403B00B0U 111a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_WR_0_1_DDR3 0x403B00B5U 112a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_WR_0_0_DDR3 0x403B00B8U 113a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_WW_1_0_DDR3 0x403B0071U 114a4efd428SKhristine Andreea Barbulescu #define CDD_CHA_WW_0_1_DDR3 0x403B0078U 115a4efd428SKhristine Andreea Barbulescu 116a4efd428SKhristine Andreea Barbulescu #define DBYTE0_TXDQSDLYTG0_U0 0x40394B4CU 117a4efd428SKhristine Andreea Barbulescu #define DBYTE0_TXDQSDLYTG0_U1 0x40394B50U 118a4efd428SKhristine Andreea Barbulescu #define DBYTE1_TXDQSDLYTG0_U0 0x40396B4CU 119a4efd428SKhristine Andreea Barbulescu #define DBYTE1_TXDQSDLYTG0_U1 0x40396B50U 120a4efd428SKhristine Andreea Barbulescu #define DBYTE2_TXDQSDLYTG0_U0 0x40398B4CU 121a4efd428SKhristine Andreea Barbulescu #define DBYTE2_TXDQSDLYTG0_U1 0x40398B50U 122a4efd428SKhristine Andreea Barbulescu #define DBYTE3_TXDQSDLYTG0_U0 0x4039AB4CU 123a4efd428SKhristine Andreea Barbulescu #define DBYTE3_TXDQSDLYTG0_U1 0x4039AB50U 124a4efd428SKhristine Andreea Barbulescu 125a4efd428SKhristine Andreea Barbulescu #define DBYTE0_TXDQSDLYTG1_U0 0x40394B6CU 126a4efd428SKhristine Andreea Barbulescu #define DBYTE0_TXDQSDLYTG1_U1 0x40394B70U 127a4efd428SKhristine Andreea Barbulescu #define DBYTE1_TXDQSDLYTG1_U0 0x40396B6CU 128a4efd428SKhristine Andreea Barbulescu #define DBYTE1_TXDQSDLYTG1_U1 0x40396B70U 129a4efd428SKhristine Andreea Barbulescu #define DBYTE2_TXDQSDLYTG1_U0 0x40398B6CU 130a4efd428SKhristine Andreea Barbulescu #define DBYTE2_TXDQSDLYTG1_U1 0x40398B70U 131a4efd428SKhristine Andreea Barbulescu #define DBYTE3_TXDQSDLYTG1_U0 0x4039AB6CU 132a4efd428SKhristine Andreea Barbulescu #define DBYTE3_TXDQSDLYTG1_U1 0x4039AB70U 133a4efd428SKhristine Andreea Barbulescu 134a4efd428SKhristine Andreea Barbulescu #define VREF_CA_A0 0x403B0095U 135a4efd428SKhristine Andreea Barbulescu #define VREF_CA_A1 0x403B0098U 136a4efd428SKhristine Andreea Barbulescu #define VREF_CA_B0 0x403B00FCU 137a4efd428SKhristine Andreea Barbulescu #define VREF_CA_B1 0x403B00FDU 138a4efd428SKhristine Andreea Barbulescu 139a4efd428SKhristine Andreea Barbulescu #define VREF_DQ_A0 0x403B0099U 140a4efd428SKhristine Andreea Barbulescu #define VREF_DQ_A1 0x403B009CU 141a4efd428SKhristine Andreea Barbulescu #define VREF_DQ_B0 0x403B0100U 142a4efd428SKhristine Andreea Barbulescu #define VREF_DQ_B1 0x403B0101U 143a4efd428SKhristine Andreea Barbulescu 144a4efd428SKhristine Andreea Barbulescu /* DDR Subsystem */ 145a4efd428SKhristine Andreea Barbulescu #define DDR_SS_REG 0x403D0000U 14630c8a20dSKhristine Andreea Barbulescu 14730c8a20dSKhristine Andreea Barbulescu /* Default timeout for DDR PHY operations */ 14830c8a20dSKhristine Andreea Barbulescu #define DEFAULT_TIMEOUT_US 1000000U 14930c8a20dSKhristine Andreea Barbulescu 150*47f0a591SKhristine Andreea Barbulescu /* Start addresses of IMEM and DMEM memory areas */ 151*47f0a591SKhristine Andreea Barbulescu #define IMEM_START_ADDR 0x403A0000U 152*47f0a591SKhristine Andreea Barbulescu #define DMEM_START_ADDR 0x403B0000U 153*47f0a591SKhristine Andreea Barbulescu 154a4efd428SKhristine Andreea Barbulescu struct cdd_type { 155a4efd428SKhristine Andreea Barbulescu uint8_t rr; 156a4efd428SKhristine Andreea Barbulescu uint8_t rw; 157a4efd428SKhristine Andreea Barbulescu uint8_t wr; 158a4efd428SKhristine Andreea Barbulescu uint8_t ww; 159a4efd428SKhristine Andreea Barbulescu }; 160a4efd428SKhristine Andreea Barbulescu 161a4efd428SKhristine Andreea Barbulescu struct space_timing_params { 162a4efd428SKhristine Andreea Barbulescu struct cdd_type cdd; 163a4efd428SKhristine Andreea Barbulescu uint8_t vref_ca; 164a4efd428SKhristine Andreea Barbulescu uint8_t vref_dq; 165a4efd428SKhristine Andreea Barbulescu uint16_t tphy_wrdata_delay; 166a4efd428SKhristine Andreea Barbulescu }; 167a4efd428SKhristine Andreea Barbulescu 16830c8a20dSKhristine Andreea Barbulescu /* Wait until firmware finishes execution and return training result */ 16930c8a20dSKhristine Andreea Barbulescu uint32_t wait_firmware_execution(void); 17030c8a20dSKhristine Andreea Barbulescu 171a4efd428SKhristine Andreea Barbulescu /* Set default AXI parity. */ 172a4efd428SKhristine Andreea Barbulescu uint32_t set_axi_parity(void); 173a4efd428SKhristine Andreea Barbulescu 174a4efd428SKhristine Andreea Barbulescu /* Modify bitfield value with delta, given bitfield position and mask */ 175a4efd428SKhristine Andreea Barbulescu bool update_bf(uint32_t *v, uint8_t pos, uint32_t mask, int32_t delta); 176a4efd428SKhristine Andreea Barbulescu 177a4efd428SKhristine Andreea Barbulescu /* Read Critical Delay Differences from message block and store max values */ 178a4efd428SKhristine Andreea Barbulescu void read_cdds(void); 179a4efd428SKhristine Andreea Barbulescu 180a4efd428SKhristine Andreea Barbulescu /* Read trained VrefCA from message block and store average value */ 181a4efd428SKhristine Andreea Barbulescu void read_vref_ca(void); 182a4efd428SKhristine Andreea Barbulescu 183a4efd428SKhristine Andreea Barbulescu /* Read trained VrefDQ from message block and store average value */ 184a4efd428SKhristine Andreea Barbulescu void read_vref_dq(void); 185a4efd428SKhristine Andreea Barbulescu 186a4efd428SKhristine Andreea Barbulescu /* Calculate DFITMG1.dfi_t_wrdata_delay */ 187a4efd428SKhristine Andreea Barbulescu void compute_tphy_wrdata_delay(void); 188a4efd428SKhristine Andreea Barbulescu 18930c8a20dSKhristine Andreea Barbulescu #endif /* DDR_UTILS_H */ 190