129461e4cSJit Loon Lim /* 229461e4cSJit Loon Lim * Copyright (c) 2022-2023, Intel Corporation. All rights reserved. 329461e4cSJit Loon Lim * 429461e4cSJit Loon Lim * SPDX-License-Identifier: BSD-3-Clause 529461e4cSJit Loon Lim */ 629461e4cSJit Loon Lim 729461e4cSJit Loon Lim #ifndef DDR_H 829461e4cSJit Loon Lim #define DDR_H 929461e4cSJit Loon Lim 1029461e4cSJit Loon Lim #include <lib/mmio.h> 1129461e4cSJit Loon Lim #include "socfpga_handoff.h" 1229461e4cSJit Loon Lim 13*68bb3e83SJit Loon Lim enum ddr_type { 14*68bb3e83SJit Loon Lim DDR_TYPE_LPDDR4_0, 15*68bb3e83SJit Loon Lim DDR_TYPE_LPDDR4_1, 16*68bb3e83SJit Loon Lim DDR_TYPE_DDR4, 17*68bb3e83SJit Loon Lim DDR_TYPE_LPDDR5_0, 18*68bb3e83SJit Loon Lim DDR_TYPE_LPDDR5_1, 19*68bb3e83SJit Loon Lim DDR_TYPE_DDR5, 20*68bb3e83SJit Loon Lim DDR_TYPE_UNKNOWN 21*68bb3e83SJit Loon Lim }; 22*68bb3e83SJit Loon Lim 23*68bb3e83SJit Loon Lim /* Region size for ECCCFG0.ecc_region_map */ 24*68bb3e83SJit Loon Lim enum region_size { 25*68bb3e83SJit Loon Lim ONE_EIGHT, 26*68bb3e83SJit Loon Lim ONE_SIXTEENTH, 27*68bb3e83SJit Loon Lim ONE_THIRTY_SECOND, 28*68bb3e83SJit Loon Lim ONE_SIXTY_FOURTH 29*68bb3e83SJit Loon Lim }; 30*68bb3e83SJit Loon Lim 31*68bb3e83SJit Loon Lim /* DATATYPE DEFINATION */ 32*68bb3e83SJit Loon Lim typedef unsigned long long phys_addr_t; 33*68bb3e83SJit Loon Lim typedef unsigned long long phys_size_t; 34*68bb3e83SJit Loon Lim 3529461e4cSJit Loon Lim /* MACRO DEFINATION */ 3629461e4cSJit Loon Lim #define IO96B_0_REG_BASE 0x18400000 3729461e4cSJit Loon Lim #define IO96B_1_REG_BASE 0x18800000 3829461e4cSJit Loon Lim #define IO96B_CSR_BASE 0x05000000 3929461e4cSJit Loon Lim #define IO96B_CSR_REG(reg) (IO96B_CSR_BASE + reg) 4029461e4cSJit Loon Lim 4129461e4cSJit Loon Lim #define IOSSM_CMD_MAX_WORD_SIZE 7U 4229461e4cSJit Loon Lim #define IOSSM_RESP_MAX_WORD_SIZE 4U 4329461e4cSJit Loon Lim 4429461e4cSJit Loon Lim #define CCU_REG_BASE 0x1C000000 4529461e4cSJit Loon Lim #define DMI0_DMIUSMCTCR 0x7300 4629461e4cSJit Loon Lim #define DMI1_DMIUSMCTCR 0x8300 4729461e4cSJit Loon Lim #define CCU_DMI_ALLOCEN BIT(1) 4829461e4cSJit Loon Lim #define CCU_DMI_LOOKUPEN BIT(2) 4929461e4cSJit Loon Lim #define CCU_REG(reg) (CCU_REG_BASE + reg) 5029461e4cSJit Loon Lim 5129461e4cSJit Loon Lim // CMD_RESPONSE_STATUS Register 5229461e4cSJit Loon Lim #define CMD_RESPONSE_STATUS 0x45C 5329461e4cSJit Loon Lim #define CMD_RESPONSE_OFFSET 0x4 5429461e4cSJit Loon Lim #define CMD_RESPONSE_DATA_SHORT_MASK GENMASK(31, 16) 5529461e4cSJit Loon Lim #define CMD_RESPONSE_DATA_SHORT_OFFSET 16 5629461e4cSJit Loon Lim #define STATUS_CMD_RESPONSE_ERROR_MASK GENMASK(7, 5) 5729461e4cSJit Loon Lim #define STATUS_CMD_RESPONSE_ERROR_OFFSET 5 5829461e4cSJit Loon Lim #define STATUS_GENERAL_ERROR_MASK GENMASK(4, 1) 5929461e4cSJit Loon Lim #define STATUS_GENERAL_ERROR_OFFSET 1 6029461e4cSJit Loon Lim #define STATUS_COMMAND_RESPONSE_READY 0x1 6129461e4cSJit Loon Lim #define STATUS_COMMAND_RESPONSE_READY_CLEAR 0x0 6229461e4cSJit Loon Lim #define STATUS_COMMAND_RESPONSE_READY_MASK 0x1 6329461e4cSJit Loon Lim #define STATUS_COMMAND_RESPONSE_READY_OFFSET 0 6429461e4cSJit Loon Lim #define STATUS_COMMAND_RESPONSE(x) (((x) & \ 6529461e4cSJit Loon Lim STATUS_COMMAND_RESPONSE_READY_MASK) >> \ 6629461e4cSJit Loon Lim STATUS_COMMAND_RESPONSE_READY_OFFSET) 6729461e4cSJit Loon Lim 6829461e4cSJit Loon Lim // CMD_REQ Register 6929461e4cSJit Loon Lim #define CMD_STATUS 0x400 7029461e4cSJit Loon Lim #define CMD_PARAM 0x438 7129461e4cSJit Loon Lim #define CMD_REQ 0x43C 7229461e4cSJit Loon Lim #define CMD_PARAM_OFFSET 0x4 7329461e4cSJit Loon Lim #define CMD_TARGET_IP_TYPE_MASK GENMASK(31, 29) 7429461e4cSJit Loon Lim #define CMD_TARGET_IP_TYPE_OFFSET 29 7529461e4cSJit Loon Lim #define CMD_TARGET_IP_INSTANCE_ID_MASK GENMASK(28, 24) 7629461e4cSJit Loon Lim #define CMD_TARGET_IP_INSTANCE_ID_OFFSET 24 7729461e4cSJit Loon Lim #define CMD_TYPE_MASK GENMASK(23, 16) 7829461e4cSJit Loon Lim #define CMD_TYPE_OFFSET 16 7929461e4cSJit Loon Lim #define CMD_OPCODE_MASK GENMASK(15, 0) 8029461e4cSJit Loon Lim #define CMD_OPCODE_OFFSET 0 8129461e4cSJit Loon Lim 8229461e4cSJit Loon Lim #define CMD_INIT 0 8329461e4cSJit Loon Lim 8429461e4cSJit Loon Lim #define OPCODE_GET_MEM_INTF_INFO 0x0001 8529461e4cSJit Loon Lim #define OPCODE_GET_MEM_TECHNOLOGY 0x0002 8629461e4cSJit Loon Lim #define OPCODE_GET_MEM_WIDTH_INFO 0x0004 8729461e4cSJit Loon Lim #define OPCODE_TRIG_MEM_CAL 0x000A 8829461e4cSJit Loon Lim #define OPCODE_ECC_ENABLE_STATUS 0x0102 8929461e4cSJit Loon Lim #define OPCODE_ECC_INTERRUPT_MASK 0x0105 9029461e4cSJit Loon Lim #define OPCODE_ECC_SCRUB_MODE_0_START 0x0202 9129461e4cSJit Loon Lim #define OPCODE_ECC_SCRUB_MODE_1_START 0x0203 9229461e4cSJit Loon Lim #define OPCODE_BIST_RESULTS_STATUS 0x0302 9329461e4cSJit Loon Lim #define OPCODE_BIST_MEM_INIT_START 0x0303 9429461e4cSJit Loon Lim // Please update according to IOSSM mailbox spec 9529461e4cSJit Loon Lim #define MBOX_ID_IOSSM 0x00 9629461e4cSJit Loon Lim #define MBOX_CMD_GET_SYS_INFO 0x01 9729461e4cSJit Loon Lim // Please update according to IOSSM mailbox spec 9829461e4cSJit Loon Lim #define MBOX_CMD_GET_MEM_INFO 0x02 9929461e4cSJit Loon Lim #define MBOX_CMD_TRIG_CONTROLLER_OP 0x04 10029461e4cSJit Loon Lim #define MBOX_CMD_TRIG_MEM_CAL_OP 0x05 10129461e4cSJit Loon Lim #define MBOX_CMD_POKE_REG 0xFD 10229461e4cSJit Loon Lim #define MBOX_CMD_PEEK_REG 0xFE 10329461e4cSJit Loon Lim #define MBOX_CMD_GET_DEBUG_LOG 0xFF 10429461e4cSJit Loon Lim // Please update according to IOSSM mailbox spec 10529461e4cSJit Loon Lim #define MBOX_CMD_DIRECT 0x00 10629461e4cSJit Loon Lim 10729461e4cSJit Loon Lim #define SOCFPGA_SYSMGR_BOOT_SCRATCH_POR_0_MASK 0x01 10829461e4cSJit Loon Lim 10929461e4cSJit Loon Lim #define IOSSM_MB_WRITE(addr, data) mmio_write_32(addr, data) 11029461e4cSJit Loon Lim 111*68bb3e83SJit Loon Lim /* DDR4 Register */ 112*68bb3e83SJit Loon Lim #define DDR4_PWRCTL_OFFSET 0x30 113*68bb3e83SJit Loon Lim #define DDR4_SBRCTL_OFFSET 0x0F24 114*68bb3e83SJit Loon Lim #define DDR4_SBRSTAT_OFFSET 0x0F28 115*68bb3e83SJit Loon Lim #define DDR4_SBRWDATA0_OFFSET 0x0F2C 116*68bb3e83SJit Loon Lim #define DDR4_SBRSTART0_OFFSET 0x0F38 117*68bb3e83SJit Loon Lim #define DDR4_SBRWDATA1_OFFSET 0x0F30 118*68bb3e83SJit Loon Lim #define DDR4_SBRSTART1_OFFSET 0x0F3C 119*68bb3e83SJit Loon Lim #define DDR4_SBRRANGE0_OFFSET 0x0F40 120*68bb3e83SJit Loon Lim #define DDR4_SBRRANGE1_OFFSET 0x0F44 121*68bb3e83SJit Loon Lim #define DDR4_ECCCFG0_OFFSET 0x70 122*68bb3e83SJit Loon Lim #define DDR4_ECCCFG1_OFFSET 0x74 123*68bb3e83SJit Loon Lim #define DDR4_PCTRL0_OFFSET 0x0490 124*68bb3e83SJit Loon Lim 125*68bb3e83SJit Loon Lim #define LPDDR4_ECCCFG0_ECC_REGION_MAP_GRANU_SHIFT 30 126*68bb3e83SJit Loon Lim #define ALL_PROTECTED 0x7F 127*68bb3e83SJit Loon Lim #define LPDDR4_ECCCFG0_ECC_REGION_MAP_SHIFT 8 128*68bb3e83SJit Loon Lim 129*68bb3e83SJit Loon Lim 130*68bb3e83SJit Loon Lim 131*68bb3e83SJit Loon Lim #define LPDDR4_ECCCFG1_ECC_REGIONS_PARITY_LOCK BIT(4) 132*68bb3e83SJit Loon Lim #define DDR4_PCTRL0_PORT_EN BIT(0) 133*68bb3e83SJit Loon Lim #define DDR4_SBRCTL_SCRUB_EN BIT(0) 134*68bb3e83SJit Loon Lim #define DDR4_SBRSTAT_SCRUB_BUSY BIT(0) 135*68bb3e83SJit Loon Lim #define DDR4_SBRCTL_SCRUB_BURST_1 BIT(4) 136*68bb3e83SJit Loon Lim #define DDR4_SBRCTL_SCRUB_WRITE BIT(2) 137*68bb3e83SJit Loon Lim #define DDR4_SBRSTAT_SCRUB_DONE BIT(1) 138*68bb3e83SJit Loon Lim 13929461e4cSJit Loon Lim /* FUNCTION DEFINATION */ 14029461e4cSJit Loon Lim int ddr_calibration_check(void); 14129461e4cSJit Loon Lim 14229461e4cSJit Loon Lim int iossm_mb_init(void); 14329461e4cSJit Loon Lim 14429461e4cSJit Loon Lim int iossm_mb_read_response(void); 14529461e4cSJit Loon Lim 14629461e4cSJit Loon Lim int iossm_mb_send(uint32_t cmd_target_ip_type, uint32_t cmd_target_ip_instance_id, 14729461e4cSJit Loon Lim uint32_t cmd_type, uint32_t cmd_opcode, uint32_t *args, 14829461e4cSJit Loon Lim unsigned int len); 14929461e4cSJit Loon Lim 15029461e4cSJit Loon Lim int ddr_iossm_mailbox_cmd(uint32_t cmd); 15129461e4cSJit Loon Lim 15229461e4cSJit Loon Lim int ddr_init(void); 15329461e4cSJit Loon Lim 15429461e4cSJit Loon Lim int ddr_config_handoff(handoff *hoff_ptr); 15529461e4cSJit Loon Lim 15629461e4cSJit Loon Lim void ddr_enable_ns_access(void); 15729461e4cSJit Loon Lim 15829461e4cSJit Loon Lim void ddr_enable_firewall(void); 15929461e4cSJit Loon Lim 16029461e4cSJit Loon Lim bool is_ddr_init_in_progress(void); 16129461e4cSJit Loon Lim 162*68bb3e83SJit Loon Lim int ddr_zerofill_scrubber(phys_addr_t umctl2_base, enum ddr_type umctl2_type); 163*68bb3e83SJit Loon Lim 164*68bb3e83SJit Loon Lim int ddr_config_scrubber(phys_addr_t umctl2_base, enum ddr_type umctl2_type); 165*68bb3e83SJit Loon Lim 166*68bb3e83SJit Loon Lim int poll_idle_status(uint32_t addr, uint32_t mask, uint32_t match, uint32_t delay_ms); 167*68bb3e83SJit Loon Lim 16829461e4cSJit Loon Lim #endif 169