baseport/syborg/soundsc/virtio_defs.h
author Maciej Jablonski <maciej.jablonski@accenture.com>
Thu, 04 Mar 2010 00:55:21 +0000
changeset 45 01c1ffcc4fca
permissions -rw-r--r--
Audio driver for qemu simulator

/*
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Accenture Ltd
*
* Contributors:
*
* Description: This file is a part of sound driver for Syborg adaptation.
*
*/

#ifndef VIRTIO_DEFS_H
#define VIRTIO_DEFS_H

#include <e32def.h>
#include <kernel.h> // fot TPhysAddr

/// @file virtio_defs.h
/// most of definitions here come from VirtIo spec
/// and was made compatible to the qemu backend (which means diverged from spec)

namespace VirtIo
{

#define POW2ALIGN1(x) ((x)|((x)>>1))
#define POW2ALIGN2(x) ((x)|((x)>>2))
#define POW2ALIGN4(x) ((x)|((x)>>4))
#define POW2ALIGN8(x) ((x)|((x)>>8))
#define POW2ALIGN16(x) ((x)|((x)>>16))

///@brief Alignes \a x to the closest bigger or equal power2 value
#define POW2ALIGN(x) (POW2ALIGN16(POW2ALIGN8(POW2ALIGN4(POW2ALIGN2(POW2ALIGN1((x)-1)))))+1)

static const TUint KVirtIoAlignment = 0x1000;

enum 
	{
	EStatusReset = 0,
	EStatusAcknowledge = 1,
	EStatusDriverFound = 2,
	EStatusDriverInitialised = 4,
	EStatusFailed = 0x80
	};

enum 
	{
    EIoID             = 0,
    EIoDevType        = 1,
    EIoHostFeatures  = 2,
    EIoGuestFeatures = 3,
    EIoQueueBase     = 4,
    EIoQueueSize      = 5,
    EIoQueueSelect      = 6,
    EIoQueueNotify   = 7,
    EIoStatus	  	  = 8,
    EIoInterruptEnable     = 9,
    EIoInterruptStatus     = 10
	};

struct TRingDesc
	{
	enum 
		{
		EFlagNext = 1,
		EFlagWrite = 2
		};

	TUint64 iAddr;	// physical address
	TUint32 iLen;
	TUint16 iFlags;
	TUint16 iNext;
	};

struct TRingAvail
	{
	enum { EFlagInhibitNotifications = 1 };
	TUint16 iFlags;
	TUint16 iIdx;
	TUint16 iRing[1];
	};

struct TRingUsed
	{
	enum { EFlagInhibitNotifications = 1 };
	TUint16 iFlags;
	TUint16 iIdx;
		struct 
		{
		TUint32 iId;
		TUint32 iLen;
		} iRing[1];
	};

/// @brief Represents element of scatter gather list
struct TAddrLen
	{
	TPhysAddr iAddr;
	TUint32 iLen;
	};

/// Gives a pointer resulting with aliging \a v with \a a.
/// @note \a a must be power of 2.
template <typename T> T* Align( T* v, TUint a )
	{ return (T*)( ((TUint8*)v) + ((-(TUint)v)&(a-1)) ); }
	
/// Gives a pointer resulting with aliging \a v with \a a.
/// @note \a a must be power of 2.
template <typename T> T Align( T v, TUint a )
	{ return (v)+((-v)&(a-1)); }

}

#endif