| /* |
| * Copyright (c) 2009 Mindspeed Technologies, Inc. |
| * |
| * This program is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU General Public License |
| * as published by the Free Software Foundation; either version 2 |
| * of the License, or (at your option) any later version. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| * |
| */ |
| #ifndef _FPPDIAG_LIB_H_ |
| #define _FPPDIAG_LIB_H_ |
| |
| #ifdef CFG_DIAGS |
| |
| #ifdef COMCERTO_2000 |
| |
| #define FPPDIAG_MAX_ARGS 4 /* 4 ought to be enough for anybody... */ |
| typedef u32 FPPDIAG_ARG_TYPE; /* Type size must be a multiple of 32-bit */ |
| |
| #if !defined(COMCERTO_2000_CONTROL) |
| #define PAGE_SIZE (1 << PAGE_SIZE_SHIFT) |
| #endif |
| |
| #define PAGE_SIZE_SHIFT 12 /**< This must be set to match the Linux PAGE_SIZE (4kB) */ |
| #define FPPDIAG_ENTRY_SHIFT 6 |
| #define FPPDIAG_ENTRY_SIZE (1 << FPPDIAG_ENTRY_SHIFT) |
| #define FPPDIAG_ENTRIES_PER_PAGE (PAGE_SIZE / FPPDIAG_ENTRY_SIZE) |
| #define FPPDIAG_ENTRY_HEADER_SIZE 4 |
| #define FPPDIAG_BUFFER_SIZE (FPPDIAG_ENTRY_SIZE - 4) /* Account for the 32 bits of metadata at start of buffer */ |
| |
| #define FPPDIAG_ENTRY_MASK_BITS (PAGE_SIZE_SHIFT - FPPDIAG_ENTRY_SHIFT) |
| #define FPPDIAG_ENTRY_MASK (( 1 << FPPDIAG_ENTRY_MASK_BITS ) - 1) |
| |
| #define FPPDIAG_MAX_STRING_LEN ((FPPDIAG_BUFFER_SIZE-FPPDIAG_MAX_ARGS*sizeof(FPPDIAG_ARG_TYPE))& ~0x3) /* aligned on 32-bits to avoid unaligned accesses. */ |
| |
| #else |
| #define FPPDIAG_CTL_BASE_ADDR 0x0A000460 |
| |
| #define PAGE_SIZE_SHIFT 12 /**< This must be set to match the Linux PAGE_SIZE (4kB) */ |
| #define PAGE_SIZE (1 << PAGE_SIZE_SHIFT) |
| #define FPPDIAG_ENTRY_SHIFT 8 |
| #define FPPDIAG_ENTRY_SIZE (1 << FPPDIAG_ENTRY_SHIFT) |
| #define FPPDIAG_ENTRIES_PER_PAGE (PAGE_SIZE / FPPDIAG_ENTRY_SIZE) |
| |
| #define FPPDIAG_ENTRY_MASK_BITS (PAGE_SIZE_SHIFT - FPPDIAG_ENTRY_SHIFT) |
| #define FPPDIAG_ENTRY_MASK (( 1 << FPPDIAG_ENTRY_MASK_BITS ) - 1) |
| #endif /* #ifdef COMCERTO_2000 */ |
| |
| typedef struct |
| { |
| unsigned int read_index; /* Read index into Ring buffer array */ |
| unsigned int write_index; /* Write index into Ring buffer array */ |
| } fppdiag_ctl_t; |
| |
| |
| struct fppdiag_config |
| { |
| unsigned int *rng_baseaddr; /**< Pointer to an array of page buffer addresses */ |
| unsigned int rng_size; /**< Size of the page buffer array */ |
| unsigned short diag_ctl_flag; /**< Global flag to maintain enable/disable diag*/ |
| unsigned short diag_log_flag; |
| unsigned int diag_mod_flag; /**< Module level flags to maintain diags */ |
| fppdiag_ctl_t *fppdiagctl; |
| }__attribute__((aligned(8))); |
| |
| /* Flags for DIAG_SET_CTL_FLAGS */ |
| #define FPPDIAG_CTL_ENABLE (1<<0) |
| #define FPPDIAG_CTL_FREERUN (1<<1) |
| |
| /* Flags for DIAG_SET_LOG_FLAGS */ |
| #define FPPDIAG_LOG_INFO (1<<0) |
| #define FPPDIAG_LOG_ERROR (1<<1) |
| #define FPPDIAG_LOG_CRITICAL (1<<2) |
| #define FPPDIAG_LOG_DEBUG (1<<3) |
| |
| /* Flags for DIAG_SET_MODULE_FLAGS */ |
| #define FPPDIAG_MODULE_IPV4 (1<<0) |
| #define FPPDIAG_MODULE_IPV6 (1<<1) |
| #define FPPDIAG_MODULE_PPPOE (1<<2) |
| #define FPPDIAG_MODULE_SEC (1<<3) |
| #define FPPDIAG_MODULE_IGMP (1<<4) |
| #define FPPDIAG_MODULE_VLAN (1<<5) |
| #define FPPDIAG_MODULE_RX (1<<6) |
| #define FPPDIAG_MODULE_TX (1<<7) |
| |
| |
| typedef struct { |
| u8 flags; |
| u8 dummy1; |
| u8 dummy2; |
| u8 dummy3; |
| u8 buffer[FPPDIAG_BUFFER_SIZE]; |
| } fppdiag_entry_t; |
| |
| /* Flags to be written at beginning of each entry */ |
| #define FPPDIAG_PRINT_ENTRY 0 |
| #define FPPDIAG_DUMP_ENTRY 1 |
| #define FPPDIAG_EXPT_ENTRY 2 |
| |
| #define REGISTER_COUNT 20 |
| |
| #if !defined (COMCERTO_2000_CONTROL) && !defined (COMCERTO_2000_TMU) |
| extern struct fppdiag_config fppdiagconfig; |
| |
| void fppdiag_init(void); |
| |
| void fppdiag_print(unsigned short log_id, unsigned int mod_id, const char* fmt, ...); |
| |
| void fppdiag_dump(unsigned short log_id, unsigned int mod_id, void* src_addr, unsigned int src_size); |
| |
| void fppdiag_exception_dump(U32* registers); |
| |
| #define PRINTF(str, ...) do { static const char string[] __attribute__ ((section(".pfe_diags_str"))) __attribute__ ((aligned (4))) = str; fppdiag_print(1, 1, string, ##__VA_ARGS__); } while (0) |
| #define DUMP(src_addr, src_size) do { fppdiag_dump(1, 1, src_addr, src_size); } while (0) |
| #endif |
| |
| #if defined(COMCERTO_2000_CONTROL) |
| int fppdiag_enable(u16 * p, u16 length); |
| int fppdiag_disable(void); |
| int fppdiag_update(u16* p, u16 length); |
| int fppdiag_dump_counters(void); |
| #endif |
| |
| #else |
| #define PRINTF(str, ...) do { } while (0) |
| #define DUMP(src_addr, src_size) do { } while (0) |
| |
| #endif /* ifdef CFG_DIAGS */ |
| #endif /* ifndef _FPPDIAG_LIB_H_ */ |