/*
 * Broadcom EWP
 *
 * Software-specific EWP definitions shared between device and host side
 *
 * 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:>>
 */

#ifndef	_ewp_h_
#define	_ewp_h_

#include <typedefs.h>
#include <event_log.h>

#ifdef EWP_HW
#ifdef EVENT_LOG_COMPILE
#define EWP_LOG(args) EVENT_LOG_COMPACT_CAST_PAREN_ARGS(EVENT_LOG_TAG_EWP_HW, args)
#define EWP_ERR(args) EVENT_LOG_COMPACT_CAST_PAREN_ARGS(EVENT_LOG_TAG_EWP_HW, args)
#else
#define EWP_LOG(args)
#define EWP_ERR(args)
#endif /* EVENT_LOG_COMPILE */
#else
#define EWP_LOG(args)
#define EWP_ERR(args)
#endif /* EWP_HW */

enum {
	EWP_HW_STATE_INIT_PRESTART	= 0,		// f/w init has not yet started
	EWP_HW_STATE_INIT_START		= 1,		// f/w init has started
	EWP_HW_STATE_INIT_END		= 2,		// f/w init has ended successfully
	EWP_HW_STATE_INIT_TRAP		= 3,		// f/w init trapped
	EWP_HW_STATE_INIT_MAX
};

typedef struct ewp_hw_blk {
	uint PHYS_ADDR_N(addr);				// Start address of the buffer
	uint size;					// Size of the the buffer
} ewp_hw_blk_t;

/* Element indices to set elements in ewp_info structure using ewp_info_set() */
#define EWP_HW_INFO_INIT_LOG_BUF	1u		// init_log_buf
#define EWP_HW_INFO_MOD_DUMP_BUF	2u		// mod_dump_buf
#define EWP_HW_INFO_REG_DUMP_BUF	3u		// reg_dump_buf

#define EWP_HW_INFO_VER 0x1u
typedef struct ewp_hw_info {
	uint8 version;
	uint8 pad[2];
	uint8 pcie_hwhdr_rev;
	ewp_hw_blk_t init_log_buf;			// Info about buffer to save init logs
	ewp_hw_blk_t mod_dump_buf;			// Info about buffer to save module dumps
	ewp_hw_blk_t reg_dump_buf;			// Info about uffer to save reg dumps
} ewp_hw_info_t;

/* Element indices to set elements in ewp_info structure using ewp_info_set() */
#define EWP_INFO_HND_DEBUG		1u		// hnd_debug_addr
#define EWP_INFO_HND_DEBUG_PTR		2u		// hnd_debug_ptr_addr
#define EWP_INFO_SSSR_INFO		3u		// sssr_info_addr
#define EWP_INFO_SDTC_INFO		4u		// sdtc_info_addr

#ifdef COEX_CPU
#define EWP_INFO_COEX_CPU_INFO		5u		// coex_cpu_info_addr
#endif /* COEX_CPU */

#define EWP_INFO_ETB_CONFIG		6u		//etb_config_info_addr

#define EWP_INFO_VER 0x1u
typedef struct ewp_info {
	uint8 version;
	uint8 init_state;				// Init state
	uint16 flags;
	uint32 PHYS_ADDR_N(ewp_hw_info_addr);		// Ptr to ewp_hw_info_t
	uint32 PHYS_ADDR_N(hnd_debug_addr);		// Ptr to hnd_debug_t
	uint32 PHYS_ADDR_N(hnd_debug_ptr_addr);		// Ptr to hnd_debug_ptr_t
	uint32 PHYS_ADDR_N(sssr_info_addr);		// Ptr to sssr_reg_info_cmn_t
	uint32 PHYS_ADDR_N(sdtc_info_addr);		// Ptr to sdtc info
	uint32 PHYS_ADDR_N(coex_cpu_info_addr);		// Ptr to coex cpu info
	uint32 PHYS_ADDR_N(etb_config_info_addr);	// Ptr to etb_config_info_t
} ewp_info_t;

#ifdef COEX_CPU
#define EWP_COEX_CPU_INFO_VER 0x1u
typedef struct ewp_coex_cpu_info {
	uint8 version;
	uint8 pad[3];
	uint32 itcm_sz;
	uint32 dtcm_sz;
	uint32 PHYS_ADDR_N(itcm_base);
	uint32 PHYS_ADDR_N(dtcm_base);
} ewp_coex_cpu_info_t;
#endif /* COEX_CPU */

#define ETB_USER_SDTC_MAX_SIZE (32 * 1024)
#define ETB_USER_ETM_MAX_SIZE (32 * 1024)
#define ETB_USER_ETMCOEX_MAX_SIZE (16 * 1024)

typedef enum etb_user {
	ETB_USER_SDTC =         0,
	ETB_USER_ETM =          1,
	ETB_USER_ETM_COEX =     2,
	ETB_USER_MAC_SDTC =     3,
	ETB_USER_MAX
} etb_user_t;

typedef struct etb_block {
	bool inited;					// ETB block inited ?
	uint8 type;					// Size of the blk
	uint16 size;					// type: ETM CA7/CM7, SDTC
	uint32 addr;					// Base addr of the blk
	uint32 rwp;					// TMC read/write pointer
} etb_block_t;

#define EWP_ETB_CONFIG_INFO_VER_1 0x1u
typedef struct etb_config_info_cmn {
	uint8 version;					// Version
	uint8 num_etb;					// Max no. of ETBs
	uint8 pad[2];
} etb_config_info_cmn_t;

typedef struct etb_config_info_v1 {
/* remove "BCM_ETB_CFG_TRANSITIONAL_FLAG", once all components use 'hdr' */
#ifdef BCM_ETB_CFG_TRANSITIONAL_FLAG
	etb_config_info_cmn_t hdr;
#else
	uint8 version;					// Version
	uint8 num_etb;					// Max no. of ETBs
	uint8 pad[2];
#endif /* BCM_ETB_CFG_TRANSITIONAL_FLAG */
	etb_block_t eblk[];				// Individual ETB blocks
} etb_config_info_v1_t;

#define EWP_ETB_CONFIG_INFO_VER_2 0x2u
typedef struct etb_config_info_v2 {
/* remove "BCM_ETB_CFG_TRANSITIONAL_FLAG", once all components use 'hdr' */
#ifdef BCM_ETB_CFG_TRANSITIONAL_FLAG
	etb_config_info_cmn_t hdr;
#else
	uint8 version;					// Version
	uint8 num_etb;					// Max no. of ETBs
	uint8 pad[2];
#endif /* BCM_ETB_CFG_TRANSITIONAL_FLAG */
	uint32	ram_start_pa;				// RAM start address
	uint32	rom_start_pa;				// ROM start address
	uint32	aslr_ram_offset;			// ASLR RAM offset
	uint32	aslr_rom_offset;			// ASLR ROM offset
	uint32	ram_size;				// RAM Size
	uint32	rom_size;				// ROM size
	etb_block_t eblk[];				// Individual ETB blocks
} etb_config_info_v2_t;
/* remove "BCM_ETB_CFG_TRANSITIONAL_FLAG", once all components use 'hdr' */
#ifdef BCM_ETB_CFG_TRANSITIONAL_FLAG
#define EWP_ETB_CONFIG_INFO_VER	EWP_ETB_CONFIG_INFO_VER_2
typedef etb_config_info_v2_t etb_config_info_t;
#else
#define EWP_ETB_CONFIG_INFO_VER	EWP_ETB_CONFIG_INFO_VER_1
typedef etb_config_info_v1_t etb_config_info_t;
#endif /* BCM_ETB_CFG_TRANSITIONAL_FLAG */

#endif	/* _bcmpcie_h_ */
