/*
 * Copyright (C) 2001  Mike Corrigan IBM Corporation
 *
 * 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 _ASM_POWERPC_ISERIES_HV_TYPES_H
#define _ASM_POWERPC_ISERIES_HV_TYPES_H

/*
 * General typedefs for the hypervisor.
 */

#include <asm/types.h>

typedef u8	HvLpIndex;
typedef u16	HvLpInstanceId;
typedef u64	HvLpTOD;
typedef u64	HvLpSystemSerialNum;
typedef u8	HvLpDeviceSerialNum[12];
typedef u16	HvLpSanHwSet;
typedef u16	HvLpBus;
typedef u16	HvLpBoard;
typedef u16	HvLpCard;
typedef u8	HvLpDeviceType[4];
typedef u8	HvLpDeviceModel[3];
typedef u64	HvIoToken;
typedef u8	HvLpName[8];
typedef u32	HvIoId;
typedef u64	HvRealMemoryIndex;
typedef u32	HvLpIndexMap;	/* Must hold HVMAXARCHITECTEDLPS bits!!! */
typedef u16	HvLpVrmIndex;
typedef u32	HvXmGenerationId;
typedef u8	HvLpBusPool;
typedef u8	HvLpSharedPoolIndex;
typedef u16	HvLpSharedProcUnitsX100;
typedef u8	HvLpVirtualLanIndex;
typedef u16	HvLpVirtualLanIndexMap;	/* Must hold HVMAXARCHITECTEDVIRTUALLANS bits!!! */
typedef u16	HvBusNumber;	/* Hypervisor Bus Number */
typedef u8	HvSubBusNumber;	/* Hypervisor SubBus Number */
typedef u8	HvAgentId;	/* Hypervisor DevFn */


#define HVMAXARCHITECTEDLPS		32
#define HVMAXARCHITECTEDVIRTUALLANS	16
#define HVMAXARCHITECTEDVIRTUALDISKS	32
#define HVMAXARCHITECTEDVIRTUALCDROMS	8
#define HVMAXARCHITECTEDVIRTUALTAPES	8
#define HVCHUNKSIZE			(256 * 1024)
#define HVPAGESIZE			(4 * 1024)
#define HVLPMINMEGSPRIMARY		256
#define HVLPMINMEGSSECONDARY		64
#define HVCHUNKSPERMEG			4
#define HVPAGESPERMEG			256
#define HVPAGESPERCHUNK			64

#define HvLpIndexInvalid		((HvLpIndex)0xff)

/*
 * Enums for the sub-components under PLIC
 * Used in HvCall  and HvPrimaryCall
 */
enum {
	HvCallCompId = 0,
	HvCallCpuCtlsCompId = 1,
	HvCallCfgCompId = 2,
	HvCallEventCompId = 3,
	HvCallHptCompId = 4,
	HvCallPciCompId = 5,
	HvCallSlmCompId = 6,
	HvCallSmCompId = 7,
	HvCallSpdCompId = 8,
	HvCallXmCompId = 9,
	HvCallRioCompId = 10,
	HvCallRsvd3CompId = 11,
	HvCallRsvd2CompId = 12,
	HvCallRsvd1CompId = 13,
	HvCallMaxCompId = 14,
	HvPrimaryCallCompId = 0,
	HvPrimaryCallCfgCompId = 1,
	HvPrimaryCallPciCompId = 2,
	HvPrimaryCallSmCompId = 3,
	HvPrimaryCallSpdCompId = 4,
	HvPrimaryCallXmCompId = 5,
	HvPrimaryCallRioCompId = 6,
	HvPrimaryCallRsvd7CompId = 7,
	HvPrimaryCallRsvd6CompId = 8,
	HvPrimaryCallRsvd5CompId = 9,
	HvPrimaryCallRsvd4CompId = 10,
	HvPrimaryCallRsvd3CompId = 11,
	HvPrimaryCallRsvd2CompId = 12,
	HvPrimaryCallRsvd1CompId = 13,
	HvPrimaryCallMaxCompId = HvCallMaxCompId
};

struct HvLpBufferList {
	u64 addr;
	u64 len;
};

#endif /* _ASM_POWERPC_ISERIES_HV_TYPES_H */
