/*******************************************************************************
Copyright (C) Marvell International Ltd. and its affiliates

********************************************************************************
Marvell GPL License Option

If you received this File from Marvell, you may opt to use, redistribute and/or 
modify this File in accordance with the terms and conditions of the General 
Public License Version 2, June 1991 (the "GPL License"), a copy of which is 
available along with the File in the license.txt file or by writing to the Free 
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or 
on the worldwide web at http://www.gnu.org/licenses/gpl.txt. 

THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED 
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY 
DISCLAIMED.  The GPL License provides additional details about this warranty 
disclaimer.

*******************************************************************************/
/*******************************************************************************
* mvOsBios.h - O.S. interface header file for BIOS IAL
*
* DESCRIPTION:
*       This header file contains OS dependent definition for BIOS
*
* DEPENDENCIES:
*
* FILE REVISION NUMBER:
*       $Revision: 1.7 $
*******************************************************************************/

#ifndef __INCmvOsSUBooth
#define __INCmvOsSUBooth

#include "mvTypes.h"
#include "mvOs.h"

/* Definitions */
#if defined (LOG_DEBUG) || defined (LOG_ERROR)
    #define PRNTHEXTSINGLE
    #define DEBUG_IAL
    #define DEBUG_IAL_SERIAL
#endif

#if defined(REG_DEBUG)
extern int reg_arry[REG_ARRAY_SIZE][3];
extern int reg_arry_index;
#endif

/*
 * Override CORE Driver SW queue size to 1. The CORE Driver SW queue is not
 * used for issuing UDMA commands; so minimizing this to 1 makes it possible
 * to minimize footprint of BIOS Extension driver when statically allocating
 * the channel's data structures.
 */
#define MV_SATA_OVERRIDE_SW_QUEUE_SIZE
#define MV_SATA_REQUESTED_SW_QUEUE_SIZE 1


#define MV_REGS_ACCESSED_BY_IO_BAR
/* System dependent macro for flushing CPU write cache */
#define MV_CPU_WRITE_BUFFER_FLUSH()     

/* System dependent register read / write in byte/word/dword variants */
unsigned long readRegister (unsigned long base, unsigned long offset);
void writeRegister (unsigned long base, unsigned long offset, unsigned long value);
/*void pioWrite16bit (unsigned short offset, unsigned short data);
unsigned short pioRead16bit (unsigned short offset);*/
void waitForKeystroke (void);
unsigned short readSegmentOffset16bit (unsigned short segment_, unsigned short offset_);
unsigned char readSegmentOffset8bit (unsigned short segment_, unsigned short offset_);
void writeSegmentOffset16bit (unsigned short segment_, unsigned short offset_, unsigned short value_);
void writeSegmentOffset8bit (unsigned short segment_, unsigned short offset_, unsigned char value_);
void memcpySegmentOffset32bitForward (unsigned short segment_,
                                      unsigned short destinationOffset_,
                                      unsigned short sourceOffset_,
                                      unsigned short byteCount_);


MV_U16 mvSwapShort(MV_U16 data);
MV_U32 mvSwapWord(MV_U32 data);

#ifdef PRNTHEXTSINGLE
void printHexSingle(char *fmt, unsigned short value_);
#else
    #define printHexSingle(x,y)
#endif

/* System dependent little endian from / to CPU conversions */
#if (_BYTE_ORDER == _BIG_ENDIAN)
#       define MV_CPU_TO_LE16(x)        MV_16BIT_LE(x)
#       define MV_CPU_TO_LE32(x)        MV_32BIT_LE(x)

#       define MV_LE16_TO_CPU(x)        MV_16BIT_LE(x)
#       define MV_LE32_TO_CPU(x)        MV_32BIT_LE(x)
#else
#       define MV_CPU_TO_LE16(x)        (x)
#       define MV_CPU_TO_LE32(x)        (x)

#       define MV_LE16_TO_CPU(x)        (x)
#       define MV_LE32_TO_CPU(x)        (x)
#endif


/* System dependent register read / write in byte/word/dword variants */
/* Write 32/16/8 bit NonCacheable */
#if defined(REG_DEBUG)
#define MV_WRITE_CHAR(address, data)                                           \
        ((*((volatile unsigned char *)(reglog((address), (data), 0xFFFFFFFF))))=	\
        ((unsigned char)(data)))
#else
#define MV_WRITE_CHAR(address, data)                                           \
        ((*((volatile unsigned char *)(address)))=             \
        ((unsigned char)(data)))
#endif

#if defined(REG_DEBUG)
#define MV_WRITE_SHORT(address, data)                                          \
        ((*((volatile unsigned short *)(reglog((address), (data), 0xFFFFFFFF)))) =	\
        ((unsigned short)(data)))
#else
#define MV_WRITE_SHORT(address, data)                                          \
        ((*((volatile unsigned short *)(address))) =           \
        ((unsigned short)(data)))
#endif

#if defined(REG_DEBUG)
#define MV_WRITE_WORD(address, data)                                           \
        ((*((volatile unsigned int *)(reglog((address), (data), 0xFFFFFFFF)))) =             \
        ((unsigned int)(data)))
#else
#define MV_WRITE_WORD(address, data)                                           \
        ((*((volatile unsigned int *)(address))) =             \
        ((unsigned int)(data)))
#endif

/* Read 32/16/8 bit NonCacheable - returns data direct. */

#define MV_READCHAR(address)                                                   \
        ((*((volatile unsigned char *)(address))))

#define MV_READSHORT(address)                                                  \
        ((*((volatile unsigned short *)(address))))

#define MV_READWORD(address)                                                   \
        ((*((volatile unsigned int *)(address))))

#define MV_REG_WRITE_BYTE(base, offset, val)    MV_WRITE_CHAR(base + offset, val)
#define MV_REG_WRITE_WORD(base, offset, val)    MV_WRITE_SHORT(base + offset, MV_CPU_TO_LE16(val))
#define MV_REG_WRITE_DWORD(base, offset, val)   MV_WRITE_WORD(base + offset, MV_CPU_TO_LE32(val))
#define MV_REG_READ_BYTE(base, offset)  	MV_READCHAR(base + offset)
#define MV_REG_READ_WORD(base, offset)  	mvSwapShort(MV_READSHORT(base + offset))
#define MV_REG_READ_DWORD(base, offset) 	mvSwapWord(MV_READWORD(base + offset))


/* System dependant typedefs */
typedef void            	   *MV_VOID_PTR;
typedef unsigned long              *MV_U32_PTR;
typedef unsigned short             *MV_U16_PTR;
typedef unsigned char              *MV_U8_PTR;
typedef char                       *MV_CHAR_PTR;
typedef unsigned long   	    MV_BUS_ADDR_T;
typedef unsigned long   	    MV_CPU_FLAGS;

/* Structures  */
/* System dependent structure */
typedef struct mvOsSemaphore
{
    unsigned long lock;
    unsigned long flags;
} MV_OS_SEMAPHORE;

/* Typedefs    */
typedef enum mvBoolean
{
    MV_SFALSE, MV_STRUE
} MV_BOOLEAN;


/* Functions (User implemented)*/
#include "sata/CoreDriver/mvLog.h"

/* Semaphore init, take and release */
#define mvOsSemInit(x) MV_TRUE
#define mvOsSemTake(x) 
#define mvOsSemRelease(x) 

/* Delay function in micro seconds resolution */
#define mvMicroSecondsDelay(dummy, time) udelay(time)

#endif /* __INCmvOsSUBooth */
