diff options
Diffstat (limited to 'drivers/ddr/altera/iossm_mailbox.h')
| -rw-r--r-- | drivers/ddr/altera/iossm_mailbox.h | 136 | 
1 files changed, 136 insertions, 0 deletions
| diff --git a/drivers/ddr/altera/iossm_mailbox.h b/drivers/ddr/altera/iossm_mailbox.h new file mode 100644 index 00000000000..6f794781d30 --- /dev/null +++ b/drivers/ddr/altera/iossm_mailbox.h @@ -0,0 +1,136 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (C) 2025 Altera Corporation <www.altera.com> + * + */ + +#define MAX_IO96B_SUPPORTED			2 +#define MAX_MEM_INTERFACE_SUPPORTED			2 +#define NUM_CMD_RESPONSE_DATA			3 +#define NUM_CMD_PARAM				7 + +/* supported mailbox command type */ +enum iossm_mailbox_cmd_type  { +	CMD_NOP, +	CMD_GET_SYS_INFO, +	CMD_GET_MEM_INFO, +	CMD_GET_MEM_CAL_INFO, +	CMD_TRIG_CONTROLLER_OP, +	CMD_TRIG_MEM_CAL_OP +}; + +/* supported mailbox command opcode */ +enum iossm_mailbox_cmd_opcode  { +	ECC_ENABLE_SET = 0x0101, +	ECC_INTERRUPT_MASK = 0x0105, +	ECC_WRITEBACK_ENABLE = 0x0106, +	ECC_INJECT_ERROR = 0x0109, +	ECC_SCRUB_MODE_0_START = 0x0202, +	ECC_SCRUB_MODE_1_START = 0x0203, +	BIST_STANDARD_MODE_START = 0x0301, +	BIST_MEM_INIT_START = 0x0303, +	BIST_SET_DATA_PATTERN_UPPER = 0x0305, +	BIST_SET_DATA_PATTERN_LOWER = 0x0306, +	TRIG_MEM_CAL = 0x000a +}; + +/* + * IOSSM mailbox required information + * + * @num_mem_interface:	Number of memory interfaces instantiated + * @ip_type:		IP type implemented on the IO96B + * @ip_instance_id:	IP identifier for every IP instance implemented on the IO96B + */ +struct io96b_mb_ctrl { +	u32 num_mem_interface; +	u32 ip_type[2]; +	u32 ip_id[2]; +}; + +/* CMD_REQ Register Definition */ +#define CMD_TARGET_IP_TYPE_MASK		GENMASK(31, 29) +#define CMD_TARGET_IP_INSTANCE_ID_MASK	GENMASK(28, 24) +#define CMD_TYPE_MASK			GENMASK(23, 16) +#define CMD_OPCODE_MASK			GENMASK(15, 0) + +/* + * IOSSM mailbox request + * @ip_type:	    IP type for the specified memory interface + * @ip_id:	    IP instance ID for the specified memory interface + * @usr_cmd_type:   User desire IOSSM mailbox command type + * @usr_cmd_opcode: User desire IOSSM mailbox command opcode + * @cmd_param_*:    Parameters (if applicable) for the requested IOSSM mailbox command + */ +struct io96b_mb_req { +	u32 ip_type; +	u32 ip_id; +	u32 usr_cmd_type; +	u32 usr_cmd_opcode; +	u32 cmd_param[NUM_CMD_PARAM]; +}; + +/* + * IOSSM mailbox response outputs + * + * @cmd_resp_status: Command Interface status + * @cmd_resp_data_*: More spaces for command response + */ +struct io96b_mb_resp { +	u32 cmd_resp_status; +	u32 cmd_resp_data[NUM_CMD_RESPONSE_DATA]; +}; + +/* + * IO96B instance specific information + * + * @size:		Memory size + * @io96b_csr_addr:	IO96B instance CSR address + * @cal_status:		IO96B instance calibration status + * @mb_ctrl:		IOSSM mailbox required information + */ +struct io96b_instance { +	u16 size; +	phys_addr_t io96b_csr_addr; +	bool cal_status; +	struct io96b_mb_ctrl mb_ctrl; +}; + +/* + * Overall IO96B instance(s) information + * + * @num_instance:	Number of instance(s) assigned to HPS + * @overall_cal_status: Overall calibration status for all IO96B instance(s) + * @ddr_type:		DDR memory type + * @ecc_status:		ECC enable status (false = disabled, true = enabled) + * @overall_size:	Total DDR memory size + * @io96b[]:		IO96B instance specific information + * @ckgen_lock:		IO96B GEN PLL lock (false = not locked, true = locked) + * @num_port:		Number of IO96B port. + * @io96b_pll:		Selected IO96B PLL. Example bit 0: EMIF0 PLL A selected, + *			bit 1: EMIF0 PLL B selected, bit 2 - EMIF1 PLL A selected, + *			bit 3: EMIF1 PLL B selected + */ +struct io96b_info { +	u8 num_instance; +	bool overall_cal_status; +	const char *ddr_type; +	bool ecc_status; +	u16 overall_size; +	struct io96b_instance io96b[MAX_IO96B_SUPPORTED]; +	bool ckgen_lock; +	u8 num_port; +	u8 io96b_pll; +}; + +int io96b_mb_req(phys_addr_t io96b_csr_addr, struct io96b_mb_req req, +		 u32 resp_data_len, struct io96b_mb_resp *resp); + +/* Supported IOSSM mailbox function */ +void io96b_mb_init(struct io96b_info *io96b_ctrl); +int io96b_cal_status(phys_addr_t addr); +void init_mem_cal(struct io96b_info *io96b_ctrl); +int get_mem_technology(struct io96b_info *io96b_ctrl); +int get_mem_width_info(struct io96b_info *io96b_ctrl); +int ecc_enable_status(struct io96b_info *io96b_ctrl); +int bist_mem_init_start(struct io96b_info *io96b_ctrl); +bool ecc_interrupt_status(struct io96b_info *io96b_ctrl); | 
