/*
 *  diagdrv.h
 *   
 *  Copyright (C) 2004,2005 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#ifndef _PFE_DIAGS_H_
#define _PFE_DIAGS_H_

#ifdef FPP_DIAGNOSTICS
#include "fppdiag_lib.h"

#define NUM_PE_DIAGS 7 /**< No diags for the TMU PEs */


#define DEFAULT_RING_SIZE 32
#define MAX_RING_SIZE   256

#define FPPDIAG_MAX_AVBL_ENTRIES        100

#define CMD_FPPDIAG_ENABLE	0x1201
#define CMD_FPPDIAG_DISABLE	0x1202
#define CMD_FPPDIAG_UPDATE	0x1203
#define CMD_FPPDIAG_DUMP_CTRS 	0x1204


typedef struct fppdiag_config_host
{
        int ring_size;
}FPPCONFIG , *pFPPCONFIG;

typedef struct fppdiag_data
{
        int read_index;
        int entries_to_read;
}FPPDIAGDATA, *pFPPDIAGDATA;

typedef struct fppdiag_cmd
{
        union{
                unsigned short  log;
                unsigned int    module;
                unsigned int    state_size;
        }flags;
        unsigned int flags_enable;
}FPPDIAGCMD , *pFPPDIAGCMD;

typedef struct fppdiag_drv_info
{
        unsigned char   state;
        unsigned short  log;
        unsigned int    module;
}FPPDIAGINFO ,*pFPPDIAGINFO;

struct pfe_diags_info {
	unsigned long diags_str_base;
	unsigned long diags_str_size;
	char * diags_str_array;
};


#define FPPDIAG_MAJOR_NUMBER    200
#define FPPDIAG_DRIVER_NAME     "/dev/fppdiag/"


#define FPPDIAG_DRV_GET_RINGSIZE        _IOR(FPPDIAG_MAJOR_NUMBER,1,FPPCONFIG)
#define FPPDIAG_DRV_GETDATA             _IOR(FPPDIAG_MAJOR_NUMBER,2,FPPDIAGDATA)
#define FPPDIAG_DRV_FINDATA             _IOW(FPPDIAG_MAJOR_NUMBER,3,FPPDIAGDATA)
#define FPPDIAG_DRV_SET_STATE           _IOW(FPPDIAG_MAJOR_NUMBER,4,FPPDIAGCMD)
#define FPPDIAG_DRV_SET_MODULE          _IOW(FPPDIAG_MAJOR_NUMBER,5,FPPDIAGCMD)
#define FPPDIAG_DRV_SET_LOG             _IOW(FPPDIAG_MAJOR_NUMBER,6,FPPDIAGCMD)
#define FPPDIAG_DRV_GET_INFO            _IOR(FPPDIAG_MAJOR_NUMBER,7,FPPDIAGINFO)
#define FPPDIAG_DRV_DUMP_COUNTERS       _IOR(FPPDIAG_MAJOR_NUMBER,8,FPPDIAGINFO)



struct fppdiag_drv_dat
{
	struct fppdiag_config fpp_config;
	struct mutex lock;
	fppdiag_ctl_t *virt_fppdiagctl; /**< FPP diags control structure (points to same area as fpp_config.fppdiagctl, but with kernel space address) */
	void **virt_rng_baseaddr; /**< Pointer to an array of page buffer addresses (same as in fpp_config but pointer AND content are kernel space addresses) */
	dma_addr_t *pfe_rng_baseaddr; /**< Pointer to fpp_config.rng_baseaddr array (but with kernel space address) */
};

struct pfe_diags
{
	struct timer_list pfe_diags_timer;
	struct fppdiag_drv_dat *fppdiag_drv_data;
	struct pfe_diags_info class_diags_info;
	struct pfe_diags_info util_diags_info;
};

extern int comcerto_fpp_send_command(u16 fcode, u16 length, u16 *payload, u16 *resp_length, u16 *resp_payload);

#endif

int pfe_diags_init(struct pfe *pfe);
void pfe_diags_exit(struct pfe *pfe);
#endif /* _PFE_DIAGS_H_ */
