1ce21a1a9SSieu Mun Tang /* 292d22776SGirisha Dengi * Copyright (c) 2024-2025, Altera Corporation. All rights reserved. 3ce21a1a9SSieu Mun Tang * 4ce21a1a9SSieu Mun Tang * SPDX-License-Identifier: BSD-3-Clause 5ce21a1a9SSieu Mun Tang */ 6ce21a1a9SSieu Mun Tang 7ce21a1a9SSieu Mun Tang #ifndef AGILEX5_IOSSM_MAILBOX_H 8ce21a1a9SSieu Mun Tang #define AGILEX5_IOSSM_MAILBOX_H 9ce21a1a9SSieu Mun Tang 10ce21a1a9SSieu Mun Tang #include <stdbool.h> 11ce21a1a9SSieu Mun Tang #include <stdint.h> 12ce21a1a9SSieu Mun Tang #include <stdlib.h> 13ce21a1a9SSieu Mun Tang 14ce21a1a9SSieu Mun Tang #include "lib/mmio.h" 15ce21a1a9SSieu Mun Tang #include "agilex5_ddr.h" 16ce21a1a9SSieu Mun Tang 1792d22776SGirisha Dengi #define __bf_shf(x) (__builtin_ffsll(x) - 1U) 1892d22776SGirisha Dengi #define FIELD_GET(_mask, _reg) \ 1992d22776SGirisha Dengi ({ \ 2092d22776SGirisha Dengi (typeof(_mask))(((_reg) & (_mask)) >> __bf_shf(_mask)); \ 2192d22776SGirisha Dengi }) 2292d22776SGirisha Dengi 2392d22776SGirisha Dengi #define FIELD_PREP(_mask, _val) \ 2492d22776SGirisha Dengi ({ \ 2592d22776SGirisha Dengi ((typeof(_mask))(_val) << __bf_shf(_mask)) & (_mask); \ 2692d22776SGirisha Dengi }) 2792d22776SGirisha Dengi 2892d22776SGirisha Dengi #define IOSSM_TIMEOUT_MS 120000U 29ce21a1a9SSieu Mun Tang #define TIMEOUT_5000MS 5000 30ce21a1a9SSieu Mun Tang #define TIMEOUT TIMEOUT_5000MS 31ce21a1a9SSieu Mun Tang #define IOSSM_STATUS_CAL_SUCCESS BIT(0) 32ce21a1a9SSieu Mun Tang #define IOSSM_STATUS_CAL_FAIL BIT(1) 33ce21a1a9SSieu Mun Tang #define IOSSM_STATUS_CAL_BUSY BIT(2) 34ce21a1a9SSieu Mun Tang #define IOSSM_STATUS_COMMAND_RESPONSE_READY 1 35ce21a1a9SSieu Mun Tang #define IOSSM_CMD_RESPONSE_STATUS_OFFSET 0x45C 36ce21a1a9SSieu Mun Tang #define IOSSM_CMD_RESPONSE_DATA_0_OFFSET 0x458 37ce21a1a9SSieu Mun Tang #define IOSSM_CMD_RESPONSE_DATA_1_OFFSET 0x454 38ce21a1a9SSieu Mun Tang #define IOSSM_CMD_RESPONSE_DATA_2_OFFSET 0x450 39ce21a1a9SSieu Mun Tang #define IOSSM_CMD_REQ_OFFSET 0x43C 40ce21a1a9SSieu Mun Tang #define IOSSM_CMD_PARAM_0_OFFSET 0x438 41ce21a1a9SSieu Mun Tang #define IOSSM_CMD_PARAM_1_OFFSET 0x434 42ce21a1a9SSieu Mun Tang #define IOSSM_CMD_PARAM_2_OFFSET 0x430 43ce21a1a9SSieu Mun Tang #define IOSSM_CMD_PARAM_3_OFFSET 0x42C 44ce21a1a9SSieu Mun Tang #define IOSSM_CMD_PARAM_4_OFFSET 0x428 45ce21a1a9SSieu Mun Tang #define IOSSM_CMD_PARAM_5_OFFSET 0x424 46ce21a1a9SSieu Mun Tang #define IOSSM_CMD_PARAM_6_OFFSET 0x420 47ce21a1a9SSieu Mun Tang #define IOSSM_STATUS_OFFSET 0x400 48ce21a1a9SSieu Mun Tang #define IOSSM_CMD_RESPONSE_DATA_SHORT_MASK GENMASK(31, 16) 49ce21a1a9SSieu Mun Tang #define IOSSM_CMD_RESPONSE_DATA_SHORT(data) (((data) & \ 50ce21a1a9SSieu Mun Tang IOSSM_CMD_RESPONSE_DATA_SHORT_MASK) >> 16) 51ce21a1a9SSieu Mun Tang #define MAX_IO96B_SUPPORTED 2 52ce21a1a9SSieu Mun Tang #define MAX_MEM_INTERFACES_SUPPORTED 2 5392d22776SGirisha Dengi #define SZ_8 0x00000008 5492d22776SGirisha Dengi #define GET_INLINE_ECC_HW_DDR_SIZE(size) (((size) * 7) / 8) 5592d22776SGirisha Dengi 56*f1b1fae9SJit Loon Lim #define IOSSM_MEM_INTF_INFO_0_OFFSET 0x200 57*f1b1fae9SJit Loon Lim #define IOSSM_MEM_INTF_INFO_1_OFFSET 0x280 58*f1b1fae9SJit Loon Lim #define INTF_IP_TYPE_MASK GENMASK(31, 29) 59*f1b1fae9SJit Loon Lim #define INTF_INSTANCE_ID_MASK GENMASK(28, 24) 60*f1b1fae9SJit Loon Lim 61*f1b1fae9SJit Loon Lim #define IOSSM_ECC_ENABLE_INTF0_OFFSET 0x240 62*f1b1fae9SJit Loon Lim #define IOSSM_ECC_ENABLE_INTF1_OFFSET 0x2C0 63*f1b1fae9SJit Loon Lim #define INTF_ECC_ENABLE_TYPE_MASK GENMASK(1, 0) 64*f1b1fae9SJit Loon Lim #define INTF_ECC_TYPE_MASK BIT(8) 65*f1b1fae9SJit Loon Lim 66*f1b1fae9SJit Loon Lim #define MAX_MEM_INTERFACE_SUPPORTED 2 67*f1b1fae9SJit Loon Lim #define IOSSM_MEM_TOTAL_CAPACITY_INTF0_OFFSET 0x234 68*f1b1fae9SJit Loon Lim #define IOSSM_MEM_TOTAL_CAPACITY_INTF1_OFFSET 0x2B4 69*f1b1fae9SJit Loon Lim 70*f1b1fae9SJit Loon Lim /* offset info of MEM_TOTAL_CAPACITY_INTF */ 71*f1b1fae9SJit Loon Lim #define INTF_CAPACITY_GBITS_MASK GENMASK(7, 0) 72*f1b1fae9SJit Loon Lim 73*f1b1fae9SJit Loon Lim /* offset info of ECC_ENABLE_INTF */ 74*f1b1fae9SJit Loon Lim #define INTF_BIST_STATUS_MASK BIT(0) 75*f1b1fae9SJit Loon Lim 76*f1b1fae9SJit Loon Lim #define IOSSM_MEM_INIT_STATUS_INTF0_OFFSET 0x260 77*f1b1fae9SJit Loon Lim #define IOSSM_MEM_INIT_STATUS_INTF1_OFFSET 0x2E0 78*f1b1fae9SJit Loon Lim 7992d22776SGirisha Dengi /* ECC error status related register offsets/commands. */ 8092d22776SGirisha Dengi #define IOSSM_ECC_ERR_STATUS_OFFSET 0x300 8192d22776SGirisha Dengi #define IOSSM_ECC_ERR_DATA_START_OFFSET 0x310 8292d22776SGirisha Dengi #define IOSSM_ECC_CLEAR_ERR_BUFFER 0x0110 8392d22776SGirisha Dengi 8492d22776SGirisha Dengi /* Offset info of ECC_ERR_STATUS */ 8592d22776SGirisha Dengi #define ECC_ERR_COUNTER_MASK GENMASK(15, 0) 8692d22776SGirisha Dengi #define ECC_ERR_OVERFLOW_MASK GENMASK(31, 16) 8792d22776SGirisha Dengi 8892d22776SGirisha Dengi /* Offset info of ECC_ERR_DATA */ 8992d22776SGirisha Dengi #define ECC_ERR_IP_TYPE_MASK GENMASK(24, 22) 9092d22776SGirisha Dengi #define ECC_ERR_INSTANCE_ID_MASK GENMASK(21, 17) 9192d22776SGirisha Dengi #define ECC_ERR_SOURCE_ID_MASK GENMASK(16, 10) 9292d22776SGirisha Dengi #define ECC_ERR_TYPE_MASK GENMASK(9, 6) 9392d22776SGirisha Dengi #define ECC_ERR_ADDR_UPPER_MASK GENMASK(5, 0) 9492d22776SGirisha Dengi #define ECC_ERR_ADDR_LOWER_MASK GENMASK(31, 0) 9592d22776SGirisha Dengi 9692d22776SGirisha Dengi #define MAX_ECC_ERR_COUNT 16U 9792d22776SGirisha Dengi 98*f1b1fae9SJit Loon Lim #define IOSSM_CONTROLLER_TRIGGER_OFFSET 0x300 99*f1b1fae9SJit Loon Lim 10092d22776SGirisha Dengi #define BIST_START_ADDR_SPACE_MASK GENMASK(5, 0) 10192d22776SGirisha Dengi #define BIST_START_ADDR_LOW_MASK GENMASK(31, 0) 10292d22776SGirisha Dengi #define BIST_START_ADDR_HIGH_MASK GENMASK(37, 32) 103ce21a1a9SSieu Mun Tang 104ce21a1a9SSieu Mun Tang /* supported mailbox command type */ 105ce21a1a9SSieu Mun Tang enum iossm_mailbox_cmd_type { 106ce21a1a9SSieu Mun Tang CMD_NOP, 107ce21a1a9SSieu Mun Tang CMD_GET_SYS_INFO, 108ce21a1a9SSieu Mun Tang CMD_GET_MEM_INFO, 109ce21a1a9SSieu Mun Tang CMD_GET_MEM_CAL_INFO, 110ce21a1a9SSieu Mun Tang CMD_TRIG_CONTROLLER_OP, 111ce21a1a9SSieu Mun Tang CMD_TRIG_MEM_CAL_OP 112ce21a1a9SSieu Mun Tang }; 113ce21a1a9SSieu Mun Tang 11492d22776SGirisha Dengi /* ECC error types */ 11592d22776SGirisha Dengi enum ecc_error_type { 11692d22776SGirisha Dengi SINGLE_BIT_ERROR = 0, /* 0b0000 */ 11792d22776SGirisha Dengi MULTIPLE_SINGLE_BIT_ERRORS = 1, /* 0b0001 */ 11892d22776SGirisha Dengi DOUBLE_BIT_ERROR = 2, /* 0b0010 */ 11992d22776SGirisha Dengi MULTIPLE_DOUBLE_BIT_ERRORS = 3, /* 0b0011 */ 12092d22776SGirisha Dengi SINGLE_BIT_ERROR_SCRUBBING = 8, /* 0b1000 */ 12192d22776SGirisha Dengi WRITE_LINK_SINGLE_BIT_ERROR = 9, /* 0b1001 */ 12292d22776SGirisha Dengi WRITE_LINK_DOUBLE_BIT_ERROR = 10, /* 0b1010 */ 12392d22776SGirisha Dengi READ_LINK_SINGLE_BIT_ERROR = 11, /* 0b1011 */ 12492d22776SGirisha Dengi READ_LINK_DOUBLE_BIT_ERROR = 12, /* 0b1100 */ 12592d22776SGirisha Dengi READ_MODIFY_WRITE_DOUBLE_BIT_ERROR = 13 /* 0b1101 */ 12692d22776SGirisha Dengi }; 12792d22776SGirisha Dengi 128ce21a1a9SSieu Mun Tang /* supported mailbox command opcode */ 129ce21a1a9SSieu Mun Tang enum iossm_mailbox_cmd_opcode { 130ce21a1a9SSieu Mun Tang GET_MEM_INTF_INFO = 0x0001, 131ce21a1a9SSieu Mun Tang GET_MEM_TECHNOLOGY, 132ce21a1a9SSieu Mun Tang GET_MEMCLK_FREQ_KHZ, 133ce21a1a9SSieu Mun Tang GET_MEM_WIDTH_INFO, 134ce21a1a9SSieu Mun Tang ECC_ENABLE_SET = 0x0101, 135ce21a1a9SSieu Mun Tang ECC_ENABLE_STATUS, 136ce21a1a9SSieu Mun Tang ECC_INTERRUPT_STATUS, 137ce21a1a9SSieu Mun Tang ECC_INTERRUPT_ACK, 138ce21a1a9SSieu Mun Tang ECC_INTERRUPT_MASK, 139ce21a1a9SSieu Mun Tang ECC_WRITEBACK_ENABLE, 140ce21a1a9SSieu Mun Tang ECC_SCRUB_IN_PROGRESS_STATUS = 0x0201, 141ce21a1a9SSieu Mun Tang ECC_SCRUB_MODE_0_START, 142ce21a1a9SSieu Mun Tang ECC_SCRUB_MODE_1_START, 143ce21a1a9SSieu Mun Tang BIST_STANDARD_MODE_START = 0x0301, 144ce21a1a9SSieu Mun Tang BIST_RESULTS_STATUS, 145ce21a1a9SSieu Mun Tang BIST_MEM_INIT_START, 146ce21a1a9SSieu Mun Tang BIST_MEM_INIT_STATUS, 147ce21a1a9SSieu Mun Tang BIST_SET_DATA_PATTERN_UPPER, 148ce21a1a9SSieu Mun Tang BIST_SET_DATA_PATTERN_LOWER, 149ce21a1a9SSieu Mun Tang TRIG_MEM_CAL = 0x000a, 150ce21a1a9SSieu Mun Tang GET_MEM_CAL_STATUS 151ce21a1a9SSieu Mun Tang }; 152ce21a1a9SSieu Mun Tang 153ce21a1a9SSieu Mun Tang /* 154ce21a1a9SSieu Mun Tang * IOSSM mailbox required information 155ce21a1a9SSieu Mun Tang * 156ce21a1a9SSieu Mun Tang * @num_mem_interface: Number of memory interfaces instantiated 157ce21a1a9SSieu Mun Tang * @ip_type: IP type implemented on the IO96B 158ce21a1a9SSieu Mun Tang * @ip_instance_id: IP identifier for every IP instance implemented on the IO96B 15992d22776SGirisha Dengi * @memory_size[2]: Memory size for every IP instance implemented on the IO96B 160ce21a1a9SSieu Mun Tang */ 161ce21a1a9SSieu Mun Tang struct io96b_mb_ctrl { 162ce21a1a9SSieu Mun Tang uint32_t num_mem_interface; 163ce21a1a9SSieu Mun Tang uint32_t ip_type[2]; 164ce21a1a9SSieu Mun Tang uint32_t ip_instance_id[2]; 16592d22776SGirisha Dengi phys_size_t memory_size[2]; 166ce21a1a9SSieu Mun Tang }; 167ce21a1a9SSieu Mun Tang 168ce21a1a9SSieu Mun Tang /* 169ce21a1a9SSieu Mun Tang * IOSSM mailbox response outputs 170ce21a1a9SSieu Mun Tang * 171ce21a1a9SSieu Mun Tang * @cmd_resp_status: Command Interface status 172ce21a1a9SSieu Mun Tang * @cmd_resp_data_*: More spaces for command response 173ce21a1a9SSieu Mun Tang */ 174ce21a1a9SSieu Mun Tang struct io96b_mb_resp { 175ce21a1a9SSieu Mun Tang uint32_t cmd_resp_status; 176ce21a1a9SSieu Mun Tang uint32_t cmd_resp_data_0; 177ce21a1a9SSieu Mun Tang uint32_t cmd_resp_data_1; 178ce21a1a9SSieu Mun Tang uint32_t cmd_resp_data_2; 179ce21a1a9SSieu Mun Tang }; 180ce21a1a9SSieu Mun Tang 181ce21a1a9SSieu Mun Tang /* 182ce21a1a9SSieu Mun Tang * IO96B instance specific information 183ce21a1a9SSieu Mun Tang * 184ce21a1a9SSieu Mun Tang * @io96b_csr_addr: IO96B instance CSR address 185ce21a1a9SSieu Mun Tang * @cal_status: IO96B instance calibration status 186ce21a1a9SSieu Mun Tang * @mb_ctrl: IOSSM mailbox required information 187ce21a1a9SSieu Mun Tang */ 188ce21a1a9SSieu Mun Tang struct io96b_instance { 189ce21a1a9SSieu Mun Tang phys_addr_t io96b_csr_addr; 190ce21a1a9SSieu Mun Tang bool cal_status; 191ce21a1a9SSieu Mun Tang struct io96b_mb_ctrl mb_ctrl; 192ce21a1a9SSieu Mun Tang }; 193ce21a1a9SSieu Mun Tang 194ce21a1a9SSieu Mun Tang /* 195ce21a1a9SSieu Mun Tang * Overall IO96B instance(s) information 196ce21a1a9SSieu Mun Tang * 197ce21a1a9SSieu Mun Tang * @num_instance: Number of instance(s) assigned to HPS 198ce21a1a9SSieu Mun Tang * @overall_cal_status: Overall calibration status for all IO96B instance(s) 199ce21a1a9SSieu Mun Tang * @ddr_type: DDR memory type 200ce21a1a9SSieu Mun Tang * @ecc_status: ECC enable status (false = disabled, true = enabled) 201ce21a1a9SSieu Mun Tang * @overall_size: Total DDR memory size 202ce21a1a9SSieu Mun Tang * @io96b_0: IO96B 0 instance specific information 203ce21a1a9SSieu Mun Tang * @io96b_1: IO96B 1 instance specific information 204ce21a1a9SSieu Mun Tang */ 205ce21a1a9SSieu Mun Tang struct io96b_info { 206ce21a1a9SSieu Mun Tang uint8_t num_instance; 207ce21a1a9SSieu Mun Tang bool overall_cal_status; 208ce21a1a9SSieu Mun Tang const char *ddr_type; 209ce21a1a9SSieu Mun Tang bool ecc_status; 21092d22776SGirisha Dengi bool is_inline_ecc; 21192d22776SGirisha Dengi phys_size_t overall_size; 212ce21a1a9SSieu Mun Tang struct io96b_instance io96b_0; 213ce21a1a9SSieu Mun Tang struct io96b_instance io96b_1; 214ce21a1a9SSieu Mun Tang }; 215ce21a1a9SSieu Mun Tang 216ce21a1a9SSieu Mun Tang int io96b_mb_req(phys_addr_t io96b_csr_addr, uint32_t ip_type, uint32_t instance_id, 217ce21a1a9SSieu Mun Tang uint32_t usr_cmd_type, uint32_t usr_cmd_opcode, uint32_t cmd_param_0, 218ce21a1a9SSieu Mun Tang uint32_t cmd_param_1, uint32_t cmd_param_2, uint32_t cmd_param_3, 219ce21a1a9SSieu Mun Tang uint32_t cmd_param_4, uint32_t cmd_param_5, uint32_t cmd_param_6, 220ce21a1a9SSieu Mun Tang uint32_t resp_data_len, struct io96b_mb_resp *resp); 221ce21a1a9SSieu Mun Tang 222ce21a1a9SSieu Mun Tang /* Supported IOSSM mailbox function */ 223ce21a1a9SSieu Mun Tang void io96b_mb_init(struct io96b_info *io96b_ctrl); 224ce21a1a9SSieu Mun Tang int io96b_cal_status(phys_addr_t addr); 225ce21a1a9SSieu Mun Tang void init_mem_cal(struct io96b_info *io96b_ctrl); 226ce21a1a9SSieu Mun Tang int trig_mem_cal(struct io96b_info *io96b_ctrl); 227ce21a1a9SSieu Mun Tang int get_mem_technology(struct io96b_info *io96b_ctrl); 228ce21a1a9SSieu Mun Tang int get_mem_width_info(struct io96b_info *io96b_ctrl); 229ce21a1a9SSieu Mun Tang int ecc_enable_status(struct io96b_info *io96b_ctrl); 230ce21a1a9SSieu Mun Tang int bist_mem_init_start(struct io96b_info *io96b_ctrl); 23192d22776SGirisha Dengi bool get_ecc_dbe_status(struct io96b_info *io96b_ctrl); 232ce21a1a9SSieu Mun Tang 233ce21a1a9SSieu Mun Tang #endif /* AGILEX5_IOSSM_MAILBOX_H */ 234