/*
 * HND Run Time Environment debug info area
 *
 * Copyright (C) 2020, 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	_HND_DEBUG_H
#define	_HND_DEBUG_H

/* Magic number at a magic location to find HND_DEBUG pointers */
#define HND_DEBUG_PTR_PTR_MAGIC 0x50504244u	/* DBPP */

#ifndef _LANGUAGE_ASSEMBLY

#include <typedefs.h>

/* Includes only when building dongle code */

/* We use explicit sizes here since this gets included from different
 * systems.  The sizes must be the size of the creating system
 * (currently 32 bit ARM) since this is gleaned from  dump.
 */

#ifdef FWID
extern uint32 gFWID;
#endif

enum hnd_debug_reloc_entry_type {
	HND_DEBUG_RELOC_ENTRY_TYPE_ROM		= 0u,
	HND_DEBUG_RELOC_ENTRY_TYPE_RAM		= 1u,
	HND_DEBUG_RELOC_ENTRY_TYPE_MTH_STACK	= 2u, /* main thread stack */
};
typedef uint32 hnd_debug_reloc_entry_type_t;

typedef struct hnd_debug_reloc_entry {
	/* Identifies the type(hnd_debug_reloc_entry_type) of the data */
	hnd_debug_reloc_entry_type_t type;
	uint32 phys_addr;		/* Physical address */
	uint32 virt_addr;		/* Virtual address */
	uint32 size;			/* Specifies the size of the segment */
} hnd_debug_reloc_entry_t;

/* Define pointers for use on other systems */
#define _HD_EVLOG_P		uint32
#define _HD_CONS_P		uint32
#define _HD_TRAP_P		uint32
#define _HD_DEBUG_RELOC_ENTRY_P	uint32
#define _HD_DEBUG_RELOC_P	uint32

/* MMU relocation info in the debug area */
typedef struct hnd_debug_reloc {
	_HD_DEBUG_RELOC_ENTRY_P hnd_reloc_ptr;	/* contains the pointer to the MMU reloc table */
	uint32 hnd_reloc_ptr_size;		/* Specifies the size of the MMU reloc table */
} hnd_debug_reloc_t;

/* Number of MMU relocation entries supported in v2 */
#define RELOC_NUM_ENTRIES		4u

/* Total MMU relocation table size for v2 */
#define HND_DEBUG_RELOC_PTR_SIZE	(RELOC_NUM_ENTRIES * sizeof(hnd_debug_reloc_entry_t))

#define HND_DEBUG_VERSION_1	1u	/* Legacy, version 1 */
#define HND_DEBUG_VERSION_2	2u	/* Version 2 contains the MMU information
					 * used for stack virtualization, etc.
					 */

/* Legacy debug version for older branches. */
#define HND_DEBUG_VERSION	HND_DEBUG_VERSION_1

/* This struct is placed at a well-defined location, and contains a pointer to hnd_debug. */
typedef struct hnd_debug_ptr {
	uint32	magic;

	/* RAM address of 'hnd_debug'. For legacy versions of this struct, it is a 0-indexed
	 * offset instead.
	 */
	uint32	hnd_debug_addr;

	/* Base address of RAM. This field does not exist for legacy versions of this struct.  */
	uint32	ram_base_addr;

} hnd_debug_ptr_t;
extern hnd_debug_ptr_t debug_info_ptr;

#define  HND_DEBUG_EPIVERS_MAX_STR_LEN		32u

/* chip id string is 8 bytes long with null terminator. Example 43452a3 */
#define  HND_DEBUG_BUILD_SIGNATURE_CHIPID_LEN	13u

#define  HND_DEBUG_BUILD_SIGNATURE_FWID_LEN	17u

/* ver=abc.abc.abc.abcdefgh size = 24bytes. 6 bytes extra for expansion */
#define  HND_DEBUG_BUILD_SIGNATURE_VER_LEN	30u

typedef struct hnd_debug {
	uint32	magic;
#define HND_DEBUG_MAGIC 0x47424544u	/* 'DEBG' */

#ifndef HND_DEBUG_USE_V2
	uint32	version;		/* Legacy, debug struct version */
#else
	/* Note: The original uint32 version is split into two fields:
	 * uint16 version and uint16 length to accomidate future expansion
	 * of the strucutre.
	 *
	 * The length field is not populated for the version 1 of the structure.
	 */
	uint16	version;		/* Debug struct version */
	uint16	length;			/* Size of the whole structure in bytes */
#endif /* HND_DEBUG_USE_V2 */

	uint32	fwid;			/* 4 bytes of fw info */
	char	epivers[HND_DEBUG_EPIVERS_MAX_STR_LEN];

	_HD_TRAP_P PHYS_ADDR_N(trap_ptr);	/* trap_t data struct physical address. */
	_HD_CONS_P PHYS_ADDR_N(console);	/* Console physical address. */

	uint32	ram_base;
	uint32	ram_size;

	uint32	rom_base;
	uint32	rom_size;

	_HD_EVLOG_P PHYS_ADDR_N(event_log_top);	/* EVENT_LOG physical address. */

	/* To populated fields below,
	 * INCLUDE_BUILD_SIGNATURE_IN_SOCRAM needs to be enabled
	 */
	char fwid_signature[HND_DEBUG_BUILD_SIGNATURE_FWID_LEN]; /* fwid=<FWID> */
	/* ver=abc.abc.abc.abcdefgh size = 24bytes. 6 bytes extra for expansion */
	char ver_signature[HND_DEBUG_BUILD_SIGNATURE_VER_LEN];
	char chipid_signature[HND_DEBUG_BUILD_SIGNATURE_CHIPID_LEN]; /* chip=12345a3 */

#ifdef HND_DEBUG_USE_V2
	/* Version 2 fields */
	/* Specifies the hnd debug MMU info */
	_HD_DEBUG_RELOC_P	hnd_debug_reloc_ptr;
#endif /* HND_DEBUG_USE_V2 */
} hnd_debug_t;

#ifdef HND_DEBUG_USE_V2
#define HND_DEBUG_V1_SIZE       (OFFSETOF(hnd_debug_t, chipid_signature) + \
				 sizeof(((hnd_debug_t *)0)->chipid_signature))

#define HND_DEBUG_V2_BASE_SIZE  (OFFSETOF(hnd_debug_t, hnd_debug_reloc_ptr) + \
				 sizeof(((hnd_debug_t *)0)->hnd_debug_reloc_ptr))
#endif /* HND_DEBUG_USE_V2 */

/* The following structure is used in populating build information */
typedef struct hnd_build_info {
	uint8 version; /* Same as HND_DEBUG_VERSION */
	uint8 rsvd[3]; /* Reserved fields for padding purposes */
	/* To populated fields below,
	 * INCLUDE_BUILD_SIGNATURE_IN_SOCRAM needs to be enabled
	 */
	uint32 fwid;
	uint32 ver[4];
	char chipid_signature[HND_DEBUG_BUILD_SIGNATURE_CHIPID_LEN]; /* chip=12345a3 */
} hnd_build_info_t;

/*
 * timeval_t and prstatus_t are copies of the Linux structures.
 * Included here because we need the definitions for the target processor
 * (32 bits) and not the definition on the host this is running on
 * (which could be 64 bits).
 */

typedef struct             {    /* Time value with microsecond resolution    */
	uint32 tv_sec;	/* Seconds                                   */
	uint32 tv_usec;	/* Microseconds                              */
} timeval_t;

/* Linux/ARM 32 prstatus for notes section */
typedef struct prstatus {
	  int32 si_signo; 	/* Signal number */
	  int32 si_code; 	/* Extra code */
	  int32 si_errno; 	/* Errno */
	  uint16 pr_cursig; 	/* Current signal.  */
	  uint16 unused;
	  uint32 pr_sigpend;	/* Set of pending signals.  */
	  uint32 pr_sighold;	/* Set of held signals.  */
	  uint32 pr_pid;
	  uint32 pr_ppid;
	  uint32 pr_pgrp;
	  uint32 pr_sid;
	  timeval_t pr_utime;	/* User time.  */
	  timeval_t pr_stime;	/* System time.  */
	  timeval_t pr_cutime;	/* Cumulative user time.  */
	  timeval_t pr_cstime;	/* Cumulative system time.  */
	  uint32 uregs[18];
	  int32 pr_fpvalid;	/* True if math copro being used.  */
} prstatus_t;

/* for mkcore and other utilities use */
#define DUMP_INFO_PTR_PTR_0   0x74
#define DUMP_INFO_PTR_PTR_1   0x78
#define DUMP_INFO_PTR_PTR_2   0xf0
#define DUMP_INFO_PTR_PTR_3   0xf8
#define DUMP_INFO_PTR_PTR_4   0x874
#define DUMP_INFO_PTR_PTR_5   0x878
#define DUMP_INFO_PTR_PTR_END 0xffffffff
#define DUMP_INFO_PTR_PTR_LIST	DUMP_INFO_PTR_PTR_0, \
		DUMP_INFO_PTR_PTR_1,					\
		DUMP_INFO_PTR_PTR_2,					\
		DUMP_INFO_PTR_PTR_3,					\
		DUMP_INFO_PTR_PTR_4,					\
		DUMP_INFO_PTR_PTR_5,					\
		DUMP_INFO_PTR_PTR_END

extern bool hnd_debug_info_in_trap_context(void);

/* Get build information. */
extern int hnd_build_info_get(void *ctx, void *arg2, uint32 *buf, uint16 *len);

#endif /* !LANGUAGE_ASSEMBLY */

#endif /* _HND_DEBUG_H */
