/*
 * Shared code between the legacy nci implementation which depended on the EROM and the
 * implementation which depends on vlsi_data.
 *
 * Copyright (C) 2024, Broadcom.
 *
 *      Unless you and Broadcom execute a separate written software license
 * agreement governing use of this software, this software is licensed to you
 * under the terms of the GNU General Public License version 2 (the "GPL"),
 * available at http://www.broadcom.com/licenses/GPLv2.php, with the
 * following added to such license:
 *
 *      As a special exception, the copyright holders of this software give you
 * permission to link this software with independent modules, and to copy and
 * distribute the resulting executable under terms of your choice, provided that
 * you also meet, for each linked independent module, the terms and conditions of
 * the license of that module.  An independent module is a module which is not
 * derived from this software.  The special exception does not apply to any
 * modifications of the software.
 *
 *
 * <<Broadcom-WL-IPTag/Dual:>>
 */
/**
 * @file
 * @brief Shared code between EROM dependent and vlsi dependent implementations.
 */

#ifndef _hal_nci_cmn_h_
#define _hal_nci_cmn_h_

#include <typedefs.h>

#define IDM_ERRSTATUS_ILLEGAL_ADDR_DECODE	13u	/* Illegal address decode error */
#define IDM_ERRSTATUS_SLAVE_ERROR_RESP		18u	/* Error response from slave */
#define IDM_ERRSTATUS_INTERNAL_TIMEOUT		20u	/* Internal timeout */

#define IDM_ERRSTATUS_ERROR_VALID	(1u << 30)	/* error status register is valid */
#define IDM_ERRSTATUS_ERR_ADDR_VALID	(1u << 31)	/* error addresses  MSB/LSB are valid */
#define IDM_ERRSTATUS_UNCORRECTED_ERR	(1u << 29)	/* error addresses  un corrected error */
#define IDM_ERRSTATUS_SECOND_ERR	(1u << 27)	/* error addresses  un corrected error */
#define IDM_ERRSTATUS_MISC_ERROR	(1u << 26)	/* MISC0 and MISC1 are valid */
#define IDM_ERRSTATUS_ERROR_CODE_MASK	0xffu		/* Indicates the type of error */


#define IDM_ERRCTLR_ENABLE		(1u << 0u)	/*  Global enable */
#define IDM_ERRCTLR_BUS			(1u << 1u)	/*  Enable Bus error detection */
#define IDM_ERRCTLR_UE			(1u << 2u)	/*  uncorrected error */

static const char BCMPOST_TRAP_RODATA(nci_axi_err_str[][16u]) = {
	 "AXI Decode Err ",
	 "AXI Slave Err ",
	 "AXI Timeout "
};

/* err_types */
#define NCI_TYPE_STR_DECODE_ERR		0u
#define NCI_TYPE_STR_SLAVE_ERR		1u
#define NCI_TYPE_STR_TIMEOUT		2u

#define NI_IDM_RESET_ENTRY 0x1
/* SpinWait for 5000us */
#define NCI_SPINWAIT_TIMEOUT		(500u * 10u)

/**
 * @struct idm_regs
 * @brief Network Interface IDM registers summary.
 * Common for ASNI, AMNI, PMNI etc. The address offset of these are at 0x100 from wrapper space.
 */
typedef volatile struct idm_regs {
	/* Check asni_regs/amni_regs for usage. */
	uint32 idm_device_id;		/* 0x100 */
	uint32 idm_config;		/* 0x104 */
	uint32 idm_errctlr;		/* 0x108 */
	uint32 PAD[1];
	uint32 idm_errstatus;		/* 0x110 */
	uint32 idm_erraddr_lsb;		/* 0x114 */
	uint32 idm_erraddr_msb;		/* 0x118 */
	uint32 PAD[3];
	uint32 idm_errmisc0;		/* 0x128 */
	uint32 idm_errmisc1;		/* 0x12C */
	uint32 idm_access_control;	/* 0x130 */
	uint32 idm_access_status;	/* 0x134 */
	uint32 idm_access_readid;	/* 0x138 */
	uint32 idm_access_writeid;	/* 0x13C */
	uint32 idm_reset_control;	/* 0x140 */
	uint32 idm_reset_status;	/* 0x144 */
	uint32 idm_reset_readid;	/* 0x148 */
	uint32 idm_reset_writeid;	/* 0x14C */
	uint32 idm_timeout_control;	/* 0x150 */
	uint32 idm_timeout_value;	/* 0x154 */
	uint32 idm_interrupt_status;	/* 0x158 */
	uint32 idm_interrupt_mask;	/* 0x15C */
	uint32 idm_errstatus_ns;	/* 0x160 */
	uint32 idm_erraddr_lsb_ns;	/* 0x164 */
	uint32 idm_erraddr_msb_ns;	/* 0x168 */
	uint32 PAD[3];
	uint32 idm_errmisc0_ns;		/* 0x178 */
	uint32 idm_errmisc1_ns;		/* 0x17C */
	uint32 PAD[1];
	uint32 idm_access_status_ns;	/* 0x184 */
	uint32 idm_access_readid_ns;	/* 0x188 */
	uint32 idm_access_writeid_ns;	/* 0x18C */
	uint32 PAD[1];
	uint32 idm_reset_status_ns;	/* 0x194 */
	uint32 idm_reset_readid_ns;	/* 0x198 */
	uint32 idm_reset_writeid_ns;	/* 0x19C */
	uint32 PAD[2];
	uint32 idm_interrupt_status_ns;	/* 0x1A8 */
	uint32 idm_interrupt_mask_ns;	/* 0x1AC */
} idm_regs_t;

/**
 * @struct asni_regs
 * @brief AXI Slave Network Interface registers
 */
typedef volatile struct asni_regs {
	uint32 node_type;		/* 0x000 */
	uint32 node_info;		/* 0x004 */
	uint32 secr_acc;		/* 0x008 */
	uint32 pmusela;			/* 0x00c */
	uint32 pmuselb;			/* 0x010 */
	uint32 PAD[11];
	uint32 node_feat;		/* 0x040 */
	uint32 bursplt;			/* 0x044 */
	uint32 addr_remap;		/* 0x048 */
	uint32 PAD[13];
	uint32 sildbg;			/* 0x080 */
	uint32 qosctl;			/* 0x084 */
	uint32 wdatthrs;		/* 0x088 */
	uint32 arqosovr;		/* 0x08c */
	uint32 awqosovr;		/* 0x090 */
	uint32 atqosot;			/* 0x094 */
	uint32 arqosot;			/* 0x098 */
	uint32 awqosot;			/* 0x09c */
	uint32 axqosot;			/* 0x0a0 */
	uint32 qosrdpk;			/* 0x0a4 */
	uint32 qosrdbur;		/* 0x0a8 */
	uint32 qosrdavg;		/* 0x0ac */
	uint32 qoswrpk;			/* 0x0b0 */
	uint32 qoswrbur;		/* 0x0b4 */
	uint32 qoswravg;		/* 0x0b8 */
	uint32 qoscompk;		/* 0x0bc */
	uint32 qoscombur;		/* 0x0c0 */
	uint32 qoscomavg;		/* 0x0c4 */
	uint32 qosrbbqv;		/* 0x0c8 */
	uint32 qoswrbqv;		/* 0x0cc */
	uint32 qoscombqv;		/* 0x0d0 */
	uint32 PAD[11];
	idm_regs_t ni;			/* 0x100 - 0x1ac */
} asni_regs_t;

/**
 * @struct amni_regs
 * @brief AXI Master Network Interface registers
 */
typedef volatile struct amni_regs {
	uint32 node_type;		/* 0x000 */
	uint32 node_info;		/* 0x004 */
	uint32 secr_acc;		/* 0x008 */
	uint32 pmusela;			/* 0x00c */
	uint32 pmuselb;			/* 0x010 */
	uint32 PAD[11];
	uint32 node_feat;		/* 0x040 */
	uint32 PAD[15];
	uint32 sildbg;			/* 0x080 */
	uint32 qosacc;			/* 0x084 */
	uint32 PAD[26];
	uint32 interrupt_status;	/* 0x0f0 */
	uint32 interrupt_mask;		/* 0x0f4 */
	uint32 interrupt_status_ns;	/* 0x0f8 */
	uint32 interrupt_mask_ns;	/* 0x0FC */
	idm_regs_t ni;			/* 0x100 - 0x1ac */
} amni_regs_t;

/**
 * @struct nci_error_container
 * @brief A container for pointers to last error ints.
 */
typedef struct nci_error_container {
	uint32 error_log_status;      /**< The axi error log status. */
	uint32 errlog_lo;             /**< The axi errlog lo. */
	uint32 errlog_hi;             /**< The axi errlog hi. */
	uint32 errlog_id;             /**< The axi errlog id. */
	uint32 errlog_trans_sts;      /**< The axi errlog trans sts. */
	uint32 idm_access_status;     /**< The idm access status. */
	uint32 idm_access_readid;     /**< The idm read id. */
	uint32 idm_access_writeid;    /**< The idm write id. */
	uint32 idm_reset_status;      /**< The idm reset status. */
	uint32 idm_interrupt_status;  /**< The idm interrupt status. */
	uint32 wrapper_addr;          /**< The address of the wrapper that had an error. */
} nci_error_container_t;

/**
 * @struct nci_error_logger_container
 * @brief A container for arguments passed to nci_error_logger.
 */
typedef struct nci_error_logger_container {
	void *osh;         /**< OS handle. */
	uint32 wrapper;     /**< AXI wrapper address for this error. */
	volatile idm_regs_t *idm_regs;  /**< Pointer to the container with e error information. */
	nci_error_container_t *error_cont;  /**< Pointer to error container. */
	uint32 error_sts;  /**< error_sts from the idm register. */
	uint16 err_type;   /**< An err_type from the macro list above. */
	bool is_master;    /**< True if this error is from a master wrapper, false otherwise. */
	bool is_secure;    /**< True if the error is from secure idm registers, false otherwise. */
} nci_error_logger_container_t;

/* Helper for logging parsed errors. */
void nci_error_logger(nci_error_logger_container_t *cont);
/* Helper for reading nci errors from a wrapper. */
uint32 nci_error_helper(void *osh, void *wrapper, bool is_master,
	nci_error_container_t *error_cont, uint32 wrapper_daddr);

#endif  /* _hal_nci_cmn_h_ */
