Commit 45dc76aa authored by Stephen Rothwell's avatar Stephen Rothwell Committed by Linus Torvalds

[PATCH] ppc64 iSeries: header file white space cleanups

This patch just contains white space and comment cleanups in the iSeries
headers files.  There are no semantic changes.
Signed-off-by: default avatarStephen Rothwell <sfr@canb.auug.org.au>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 0e3e4a1c
......@@ -16,19 +16,13 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
//===========================================================================
//
// This file contains the "hypervisor call" interface which is used to
// drive the hypervisor from the OS.
//
//===========================================================================
/*
* This file contains the "hypervisor call" interface which is used to
* drive the hypervisor from the OS.
*/
#ifndef _HVCALL_H
#define _HVCALL_H
//-------------------------------------------------------------------
// Standard Includes
//-------------------------------------------------------------------
#include <asm/iSeries/HvCallSc.h>
#include <asm/iSeries/HvTypes.h>
#include <asm/paca.h>
......@@ -76,9 +70,9 @@ enum HvCall_VaryOffChunkRc
*/
/* Type of yield for HvCallBaseYieldProcessor */
#define HvCall_YieldTimed 0 // Yield until specified time (tb)
#define HvCall_YieldToActive 1 // Yield until all active procs have run
#define HvCall_YieldToProc 2 // Yield until the specified processor has run
#define HvCall_YieldTimed 0 /* Yield until specified time (tb) */
#define HvCall_YieldToActive 1 /* Yield until all active procs have run */
#define HvCall_YieldToProc 2 /* Yield until the specified processor has run */
/* interrupt masks for setEnabledInterrupts */
#define HvCall_MaskIPI 0x00000001
......@@ -125,71 +119,65 @@ enum HvCall_VaryOffChunkRc
#define HvCallCcSetDABR HvCallCc + 7
//=====================================================================================
static inline void HvCall_setVirtualDecr(void)
{
/* Ignore any error return codes - most likely means that the target value for the
* LP has been increased and this vary off would bring us below the new target. */
/*
* Ignore any error return codes - most likely means that the
* target value for the LP has been increased and this vary off
* would bring us below the new target.
*/
HvCall0(HvCallBaseSetVirtualDecr);
}
//=====================================================================
static inline void HvCall_yieldProcessor(unsigned typeOfYield, u64 yieldParm)
{
HvCall2( HvCallBaseYieldProcessor, typeOfYield, yieldParm );
HvCall2(HvCallBaseYieldProcessor, typeOfYield, yieldParm);
}
//=====================================================================
static inline void HvCall_setEnabledInterrupts(u64 enabledInterrupts)
{
HvCall1(HvCallBaseSetEnabledInterrupts,enabledInterrupts);
HvCall1(HvCallBaseSetEnabledInterrupts, enabledInterrupts);
}
//=====================================================================
static inline void HvCall_clearLogBuffer(HvLpIndex lpindex)
{
HvCall1(HvCallBaseClearLogBuffer,lpindex);
HvCall1(HvCallBaseClearLogBuffer, lpindex);
}
//=====================================================================
static inline u32 HvCall_getLogBufferCodePage(HvLpIndex lpindex)
{
u32 retVal = HvCall1(HvCallBaseGetLogBufferCodePage,lpindex);
u32 retVal = HvCall1(HvCallBaseGetLogBufferCodePage, lpindex);
return retVal;
}
//=====================================================================
static inline int HvCall_getLogBufferFormat(HvLpIndex lpindex)
{
int retVal = HvCall1(HvCallBaseGetLogBufferFormat,lpindex);
int retVal = HvCall1(HvCallBaseGetLogBufferFormat, lpindex);
return retVal;
}
//=====================================================================
static inline u32 HvCall_getLogBufferLength(HvLpIndex lpindex)
{
u32 retVal = HvCall1(HvCallBaseGetLogBufferLength,lpindex);
u32 retVal = HvCall1(HvCallBaseGetLogBufferLength, lpindex);
return retVal;
}
//=====================================================================
static inline void HvCall_setLogBufferFormatAndCodepage(int format, u32 codePage)
{
HvCall2(HvCallBaseSetLogBufferFormatAndCodePage,format, codePage);
HvCall2(HvCallBaseSetLogBufferFormatAndCodePage, format, codePage);
}
//=====================================================================
int HvCall_readLogBuffer(HvLpIndex lpindex, void *buffer, u64 bufLen);
void HvCall_writeLogBuffer(const void *buffer, u64 bufLen);
extern int HvCall_readLogBuffer(HvLpIndex lpindex, void *buffer, u64 bufLen);
extern void HvCall_writeLogBuffer(const void *buffer, u64 bufLen);
//=====================================================================
static inline void HvCall_sendIPI(struct paca_struct * targetPaca)
static inline void HvCall_sendIPI(struct paca_struct *targetPaca)
{
HvCall1( HvCallBaseSendIPI, targetPaca->paca_index );
HvCall1(HvCallBaseSendIPI, targetPaca->paca_index);
}
//=====================================================================
static inline void HvCall_terminateMachineSrc(void)
{
HvCall0( HvCallBaseTerminateMachineSrc );
HvCall0(HvCallBaseTerminateMachineSrc);
}
static inline void HvCall_setDABR(unsigned long val)
......
......@@ -16,28 +16,17 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
//=====================================================================================
//
// This file contains the "hypervisor call" interface which is used to
// drive the hypervisor from the OS.
//
//=====================================================================================
/*
* This file contains the "hypervisor call" interface which is used to
* drive the hypervisor from the OS.
*/
#ifndef _HVCALLCFG_H
#define _HVCALLCFG_H
//-------------------------------------------------------------------
// Standard Includes
//-------------------------------------------------------------------
#include <asm/iSeries/HvCallSc.h>
#include <asm/iSeries/HvTypes.h>
//-------------------------------------------------------------------------------------
// Constants
//-------------------------------------------------------------------------------------
enum HvCallCfg_ReqQual
{
enum HvCallCfg_ReqQual {
HvCallCfg_Cur = 0,
HvCallCfg_Init = 1,
HvCallCfg_Max = 2,
......@@ -78,96 +67,101 @@ enum HvCallCfg_ReqQual
#define HvCallCfgGetLpExecutionMode HvCallCfg + 31
#define HvCallCfgGetHostingLpIndex HvCallCfg + 32
//====================================================================
static inline HvLpIndex HvCallCfg_getLps(void)
{
HvLpIndex retVal = HvCall0(HvCallCfgGetLps);
// getPaca()->adjustHmtForNoOfSpinLocksHeld();
return retVal;
}
//====================================================================
static inline int HvCallCfg_isBusDedicated(u64 busIndex)
{
int retVal = HvCall1(HvCallCfgIsBusDedicated,busIndex);
// getPaca()->adjustHmtForNoOfSpinLocksHeld();
return retVal;
}
//====================================================================
static inline HvLpIndex HvCallCfg_getBusOwner(u64 busIndex)
{
HvLpIndex retVal = HvCall1(HvCallCfgGetBusOwner,busIndex);
// getPaca()->adjustHmtForNoOfSpinLocksHeld();
return retVal;
}
//====================================================================
static inline HvLpIndexMap HvCallCfg_getBusAllocation(u64 busIndex)
{
HvLpIndexMap retVal = HvCall1(HvCallCfgGetBusAllocation,busIndex);
// getPaca()->adjustHmtForNoOfSpinLocksHeld();
return retVal;
}
//====================================================================
static inline HvLpIndexMap HvCallCfg_getActiveLpMap(void)
{
HvLpIndexMap retVal = HvCall0(HvCallCfgGetActiveLpMap);
// getPaca()->adjustHmtForNoOfSpinLocksHeld();
return retVal;
}
//====================================================================
static inline HvLpVirtualLanIndexMap HvCallCfg_getVirtualLanIndexMap(HvLpIndex lp)
static inline HvLpVirtualLanIndexMap HvCallCfg_getVirtualLanIndexMap(
HvLpIndex lp)
{
// This is a new function in V5R1 so calls to this on older
// hypervisors will return -1
/*
* This is a new function in V5R1 so calls to this on older
* hypervisors will return -1
*/
u64 retVal = HvCall1(HvCallCfgGetVirtualLanIndexMap, lp);
if(retVal == -1)
if (retVal == -1)
retVal = 0;
// getPaca()->adjustHmtForNoOfSpinLocksHeld();
return retVal;
}
//===================================================================
static inline u64 HvCallCfg_getSystemMsChunks(void)
{
u64 retVal = HvCall0(HvCallCfgGetSystemMsChunks);
// getPaca()->adjustHmtForNoOfSpinLocksHeld();
return retVal;
}
//===================================================================
static inline u64 HvCallCfg_getMsChunks(HvLpIndex lp,enum HvCallCfg_ReqQual qual)
static inline u64 HvCallCfg_getMsChunks(HvLpIndex lp,
enum HvCallCfg_ReqQual qual)
{
u64 retVal = HvCall2(HvCallCfgGetMsChunks,lp,qual);
// getPaca()->adjustHmtForNoOfSpinLocksHeld();
return retVal;
}
//===================================================================
static inline u64 HvCallCfg_getMinRuntimeMsChunks(HvLpIndex lp)
{
// NOTE: This function was added in v5r1 so older hypervisors will return a -1 value
u64 retVal = HvCall1(HvCallCfgGetMinRuntimeMsChunks,lp);
// getPaca()->adjustHmtForNoOfSpinLocksHeld();
return retVal;
/*
* NOTE: This function was added in v5r1 so older hypervisors
* will return a -1 value
*/
return HvCall1(HvCallCfgGetMinRuntimeMsChunks, lp);
}
//===================================================================
static inline u64 HvCallCfg_setMinRuntimeMsChunks(u64 chunks)
{
u64 retVal = HvCall1(HvCallCfgSetMinRuntimeMsChunks,chunks);
// getPaca()->adjustHmtForNoOfSpinLocksHeld();
return retVal;
}
//===================================================================
static inline u64 HvCallCfg_getSystemPhysicalProcessors(void)
{
u64 retVal = HvCall0(HvCallCfgGetSystemPhysicalProcessors);
// getPaca()->adjustHmtForNoOfSpinLocksHeld();
return retVal;
}
//===================================================================
static inline u64 HvCallCfg_getPhysicalProcessors(HvLpIndex lp,enum HvCallCfg_ReqQual qual)
static inline u64 HvCallCfg_getPhysicalProcessors(HvLpIndex lp,
enum HvCallCfg_ReqQual qual)
{
u64 retVal = HvCall2(HvCallCfgGetPhysicalProcessors,lp,qual);
// getPaca()->adjustHmtForNoOfSpinLocksHeld();
return retVal;
}
//===================================================================
static inline u64 HvCallCfg_getConfiguredBusUnitsForInterruptProc(HvLpIndex lp,
u16 hvLogicalProcIndex)
{
......@@ -176,7 +170,7 @@ static inline u64 HvCallCfg_getConfiguredBusUnitsForInterruptProc(HvLpIndex lp,
return retVal;
}
//==================================================================
static inline HvLpSharedPoolIndex HvCallCfg_getSharedPoolIndex(HvLpIndex lp)
{
HvLpSharedPoolIndex retVal =
......@@ -185,15 +179,16 @@ static inline HvLpSharedPoolIndex HvCallCfg_getSharedPoolIndex(HvLpIndex lp)
return retVal;
}
//==================================================================
static inline u64 HvCallCfg_getSharedProcUnits(HvLpIndex lp,enum HvCallCfg_ReqQual qual)
static inline u64 HvCallCfg_getSharedProcUnits(HvLpIndex lp,
enum HvCallCfg_ReqQual qual)
{
u64 retVal = HvCall2(HvCallCfgGetSharedProcUnits,lp,qual);
// getPaca()->adjustHmtForNoOfSpinLocksHeld();
return retVal;
}
//==================================================================
static inline u64 HvCallCfg_getNumProcsInSharedPool(HvLpSharedPoolIndex sPI)
{
u16 retVal = HvCall1(HvCallCfgGetNumProcsInSharedPool,sPI);
......@@ -201,13 +196,12 @@ static inline u64 HvCallCfg_getNumProcsInSharedPool(HvLpSharedPoolIndex sPI)
return retVal;
}
//==================================================================
static inline HvLpIndex HvCallCfg_getHostingLpIndex(HvLpIndex lp)
{
u64 retVal = HvCall1(HvCallCfgGetHostingLpIndex,lp);
// getPaca()->adjustHmtForNoOfSpinLocksHeld();
return retVal;
}
#endif /* _HVCALLCFG_H */
......@@ -16,7 +16,6 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*
* This file contains the "hypervisor call" interface which is used to
* drive the hypervisor from the OS.
......@@ -24,9 +23,6 @@
#ifndef _HVCALLEVENT_H
#define _HVCALLEVENT_H
/*
* Standard Includes
*/
#include <asm/iSeries/HvCallSc.h>
#include <asm/iSeries/HvTypes.h>
#include <asm/abs_addr.h>
......@@ -85,13 +81,13 @@ typedef u64 HvLpDma_Rc;
static inline void HvCallEvent_getOverflowLpEvents(u8 queueIndex)
{
HvCall1(HvCallEventGetOverflowLpEvents,queueIndex);
HvCall1(HvCallEventGetOverflowLpEvents, queueIndex);
// getPaca()->adjustHmtForNoOfSpinLocksHeld();
}
static inline void HvCallEvent_setInterLpQueueIndex(u8 queueIndex)
{
HvCall1(HvCallEventSetInterLpQueueIndex,queueIndex);
HvCall1(HvCallEventSetInterLpQueueIndex, queueIndex);
// getPaca()->adjustHmtForNoOfSpinLocksHeld();
}
......@@ -138,7 +134,7 @@ static inline HvLpEvent_Rc HvCallEvent_signalLpEventFast(HvLpIndex targetLp,
{
HvLpEvent_Rc retVal;
// Pack the misc bits into a single Dword to pass to PLIC
/* Pack the misc bits into a single Dword to pass to PLIC */
union {
struct HvCallEvent_PackedParms parms;
u64 dword;
......@@ -225,7 +221,7 @@ static inline HvLpDma_Rc HvCallEvent_dmaBufList(HvLpEvent_Type type,
u64 localBufList, u64 remoteBufList, u32 transferLength)
{
HvLpDma_Rc retVal;
// Pack the misc bits into a single Dword to pass to PLIC
/* Pack the misc bits into a single Dword to pass to PLIC */
union {
struct HvCallEvent_PackedDmaParms parms;
u64 dword;
......@@ -257,7 +253,7 @@ static inline HvLpDma_Rc HvCallEvent_dmaSingle(HvLpEvent_Type type,
u64 localAddrOrTce, u64 remoteAddrOrTce, u32 transferLength)
{
HvLpDma_Rc retVal;
// Pack the misc bits into a single Dword to pass to PLIC
/* Pack the misc bits into a single Dword to pass to PLIC */
union {
struct HvCallEvent_PackedDmaParms parms;
u64 dword;
......@@ -280,7 +276,7 @@ static inline HvLpDma_Rc HvCallEvent_dmaSingle(HvLpEvent_Type type,
return retVal;
}
static inline HvLpDma_Rc HvCallEvent_dmaToSp(void* local, u32 remote,
static inline HvLpDma_Rc HvCallEvent_dmaToSp(void *local, u32 remote,
u32 length, HvLpDma_Direction dir)
{
u64 abs_addr;
......@@ -293,5 +289,4 @@ static inline HvLpDma_Rc HvCallEvent_dmaToSp(void* local, u32 remote,
return retVal;
}
#endif /* _HVCALLEVENT_H */
......@@ -19,21 +19,15 @@
#ifndef _HVCALLHPT_H
#define _HVCALLHPT_H
//============================================================================
//
// This file contains the "hypervisor call" interface which is used to
// drive the hypervisor from the OS.
//
//============================================================================
/*
* This file contains the "hypervisor call" interface which is used to
* drive the hypervisor from the OS.
*/
#include <asm/iSeries/HvCallSc.h>
#include <asm/iSeries/HvTypes.h>
#include <asm/mmu.h>
//-----------------------------------------------------------------------------
// Constants
//-----------------------------------------------------------------------------
#define HvCallHptGetHptAddress HvCallHpt + 0
#define HvCallHptGetHptPages HvCallHpt + 1
#define HvCallHptSetPp HvCallHpt + 5
......@@ -47,81 +41,76 @@
#define HvCallHptInvalidateSetSwBitsGet HvCallHpt + 18
//============================================================================
static inline u64 HvCallHpt_getHptAddress(void)
{
u64 retval = HvCall0(HvCallHptGetHptAddress);
// getPaca()->adjustHmtForNoOfSpinLocksHeld();
return retval;
}
//============================================================================
static inline u64 HvCallHpt_getHptPages(void)
{
u64 retval = HvCall0(HvCallHptGetHptPages);
// getPaca()->adjustHmtForNoOfSpinLocksHeld();
return retval;
}
//=============================================================================
static inline void HvCallHpt_setPp(u32 hpteIndex, u8 value)
{
HvCall2( HvCallHptSetPp, hpteIndex, value );
HvCall2(HvCallHptSetPp, hpteIndex, value);
// getPaca()->adjustHmtForNoOfSpinLocksHeld();
}
//=============================================================================
static inline void HvCallHpt_setSwBits(u32 hpteIndex, u8 bitson, u8 bitsoff )
static inline void HvCallHpt_setSwBits(u32 hpteIndex, u8 bitson, u8 bitsoff)
{
HvCall3( HvCallHptSetSwBits, hpteIndex, bitson, bitsoff );
HvCall3(HvCallHptSetSwBits, hpteIndex, bitson, bitsoff);
// getPaca()->adjustHmtForNoOfSpinLocksHeld();
}
//=============================================================================
static inline void HvCallHpt_invalidateNoSyncICache(u32 hpteIndex)
static inline void HvCallHpt_invalidateNoSyncICache(u32 hpteIndex)
{
HvCall1( HvCallHptInvalidateNoSyncICache, hpteIndex );
HvCall1(HvCallHptInvalidateNoSyncICache, hpteIndex);
// getPaca()->adjustHmtForNoOfSpinLocksHeld();
}
//=============================================================================
static inline u64 HvCallHpt_invalidateSetSwBitsGet(u32 hpteIndex, u8 bitson, u8 bitsoff )
static inline u64 HvCallHpt_invalidateSetSwBitsGet(u32 hpteIndex, u8 bitson,
u8 bitsoff)
{
u64 compressedStatus;
compressedStatus = HvCall4( HvCallHptInvalidateSetSwBitsGet, hpteIndex, bitson, bitsoff, 1 );
HvCall1( HvCallHptInvalidateNoSyncICache, hpteIndex );
compressedStatus = HvCall4(HvCallHptInvalidateSetSwBitsGet,
hpteIndex, bitson, bitsoff, 1);
HvCall1(HvCallHptInvalidateNoSyncICache, hpteIndex);
// getPaca()->adjustHmtForNoOfSpinLocksHeld();
return compressedStatus;
}
//=============================================================================
static inline u64 HvCallHpt_findValid( HPTE *hpte, u64 vpn )
static inline u64 HvCallHpt_findValid(HPTE *hpte, u64 vpn)
{
u64 retIndex = HvCall3Ret16( HvCallHptFindValid, hpte, vpn, 0, 0 );
// getPaca()->adjustHmtForNoOfSpinLocksHeld();
return retIndex;
}
//=============================================================================
static inline u64 HvCallHpt_findNextValid( HPTE *hpte, u32 hpteIndex, u8 bitson, u8 bitsoff )
static inline u64 HvCallHpt_findNextValid(HPTE *hpte, u32 hpteIndex,
u8 bitson, u8 bitsoff)
{
u64 retIndex = HvCall3Ret16( HvCallHptFindNextValid, hpte, hpteIndex, bitson, bitsoff );
// getPaca()->adjustHmtForNoOfSpinLocksHeld();
return retIndex;
}
//=============================================================================
static inline void HvCallHpt_get( HPTE *hpte, u32 hpteIndex )
static inline void HvCallHpt_get(HPTE *hpte, u32 hpteIndex)
{
HvCall2Ret16( HvCallHptGet, hpte, hpteIndex, 0 );
HvCall2Ret16(HvCallHptGet, hpte, hpteIndex, 0);
// getPaca()->adjustHmtForNoOfSpinLocksHeld();
}
//============================================================================
static inline void HvCallHpt_addValidate( u32 hpteIndex,
u32 hBit,
HPTE *hpte )
static inline void HvCallHpt_addValidate(u32 hpteIndex, u32 hBit, HPTE *hpte)
{
HvCall4( HvCallHptAddValidate, hpteIndex,
hBit, (*((u64 *)hpte)), (*(((u64 *)hpte)+1)) );
HvCall4(HvCallHptAddValidate, hpteIndex, hBit, (*((u64 *)hpte)),
(*(((u64 *)hpte)+1)));
// getPaca()->adjustHmtForNoOfSpinLocksHeld();
}
//=============================================================================
#endif /* _HVCALLHPT_H */
/************************************************************************/
/* Provides the Hypervisor PCI calls for iSeries Linux Parition. */
/* Copyright (C) 2001 <Wayne G Holm> <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 */
/************************************************************************/
/* Change Activity: */
/* Created, Jan 9, 2001 */
/************************************************************************/
/*
* Provides the Hypervisor PCI calls for iSeries Linux Parition.
* Copyright (C) 2001 <Wayne G Holm> <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
*
* Change Activity:
* Created, Jan 9, 2001
*/
#ifndef _HVCALLPCI_H
#define _HVCALLPCI_H
......@@ -61,25 +61,28 @@ enum HvCallPci_DeviceType {
struct HvCallPci_DeviceInfo {
u32 deviceType; // See DeviceType enum for values
u32 deviceType; /* See DeviceType enum for values */
};
struct HvCallPci_BusUnitInfo {
u32 sizeReturned; // length of data returned
u32 deviceType; // see DeviceType enum for values
u32 sizeReturned; /* length of data returned */
u32 deviceType; /* see DeviceType enum for values */
};
struct HvCallPci_BridgeInfo {
struct HvCallPci_BusUnitInfo busUnitInfo; // Generic bus unit info
u8 subBusNumber; // Bus number of secondary bus
u8 maxAgents; // Max idsels on secondary bus
u8 maxSubBusNumber; // Max Sub Bus
u8 logicalSlotNumber; // Logical Slot Number for IOA
struct HvCallPci_BusUnitInfo busUnitInfo; /* Generic bus unit info */
u8 subBusNumber; /* Bus number of secondary bus */
u8 maxAgents; /* Max idsels on secondary bus */
u8 maxSubBusNumber; /* Max Sub Bus */
u8 logicalSlotNumber; /* Logical Slot Number for IOA */
};
// Maximum BusUnitInfo buffer size. Provided for clients so they can allocate
// a buffer big enough for any type of bus unit. Increase as needed.
/*
* Maximum BusUnitInfo buffer size. Provided for clients so
* they can allocate a buffer big enough for any type of bus
* unit. Increase as needed.
*/
enum {HvCallPci_MaxBusUnitInfoSize = 128};
struct HvCallPci_BarParms {
......@@ -123,10 +126,8 @@ enum HvCallPci_VpdType {
#define HvCallPciUnmaskInterrupts HvCallPci + 49
#define HvCallPciGetBusUnitInfo HvCallPci + 50
//============================================================================
static inline u64 HvCallPci_configLoad8(u16 busNumber, u8 subBusNumber,
u8 deviceId, u32 offset,
u8 *value)
u8 deviceId, u32 offset, u8 *value)
{
struct HvCallPci_DsaAddr dsa;
struct HvCallPci_LoadReturn retVal;
......@@ -145,10 +146,9 @@ static inline u64 HvCallPci_configLoad8(u16 busNumber, u8 subBusNumber,
return retVal.rc;
}
//============================================================================
static inline u64 HvCallPci_configLoad16(u16 busNumber, u8 subBusNumber,
u8 deviceId, u32 offset,
u16 *value)
u8 deviceId, u32 offset, u16 *value)
{
struct HvCallPci_DsaAddr dsa;
struct HvCallPci_LoadReturn retVal;
......@@ -167,10 +167,9 @@ static inline u64 HvCallPci_configLoad16(u16 busNumber, u8 subBusNumber,
return retVal.rc;
}
//============================================================================
static inline u64 HvCallPci_configLoad32(u16 busNumber, u8 subBusNumber,
u8 deviceId, u32 offset,
u32 *value)
u8 deviceId, u32 offset, u32 *value)
{
struct HvCallPci_DsaAddr dsa;
struct HvCallPci_LoadReturn retVal;
......@@ -189,10 +188,9 @@ static inline u64 HvCallPci_configLoad32(u16 busNumber, u8 subBusNumber,
return retVal.rc;
}
//============================================================================
static inline u64 HvCallPci_configStore8(u16 busNumber, u8 subBusNumber,
u8 deviceId, u32 offset,
u8 value)
u8 deviceId, u32 offset, u8 value)
{
struct HvCallPci_DsaAddr dsa;
u64 retVal;
......@@ -209,10 +207,9 @@ static inline u64 HvCallPci_configStore8(u16 busNumber, u8 subBusNumber,
return retVal;
}
//============================================================================
static inline u64 HvCallPci_configStore16(u16 busNumber, u8 subBusNumber,
u8 deviceId, u32 offset,
u16 value)
u8 deviceId, u32 offset, u16 value)
{
struct HvCallPci_DsaAddr dsa;
u64 retVal;
......@@ -229,10 +226,9 @@ static inline u64 HvCallPci_configStore16(u16 busNumber, u8 subBusNumber,
return retVal;
}
//============================================================================
static inline u64 HvCallPci_configStore32(u16 busNumber, u8 subBusNumber,
u8 deviceId, u32 offset,
u32 value)
u8 deviceId, u32 offset, u32 value)
{
struct HvCallPci_DsaAddr dsa;
u64 retVal;
......@@ -249,13 +245,10 @@ static inline u64 HvCallPci_configStore32(u16 busNumber, u8 subBusNumber,
return retVal;
}
//============================================================================
static inline u64 HvCallPci_barLoad8(u16 busNumberParm,
u8 subBusParm,
u8 deviceIdParm,
u8 barNumberParm,
u64 offsetParm,
u8* valueParm)
static inline u64 HvCallPci_barLoad8(u16 busNumberParm, u8 subBusParm,
u8 deviceIdParm, u8 barNumberParm, u64 offsetParm,
u8 *valueParm)
{
struct HvCallPci_DsaAddr dsa;
struct HvCallPci_LoadReturn retVal;
......@@ -275,13 +268,10 @@ static inline u64 HvCallPci_barLoad8(u16 busNumberParm,
return retVal.rc;
}
//============================================================================
static inline u64 HvCallPci_barLoad16(u16 busNumberParm,
u8 subBusParm,
u8 deviceIdParm,
u8 barNumberParm,
u64 offsetParm,
u16* valueParm)
static inline u64 HvCallPci_barLoad16(u16 busNumberParm, u8 subBusParm,
u8 deviceIdParm, u8 barNumberParm, u64 offsetParm,
u16 *valueParm)
{
struct HvCallPci_DsaAddr dsa;
struct HvCallPci_LoadReturn retVal;
......@@ -301,13 +291,10 @@ static inline u64 HvCallPci_barLoad16(u16 busNumberParm,
return retVal.rc;
}
//============================================================================
static inline u64 HvCallPci_barLoad32(u16 busNumberParm,
u8 subBusParm,
u8 deviceIdParm,
u8 barNumberParm,
u64 offsetParm,
u32* valueParm)
static inline u64 HvCallPci_barLoad32(u16 busNumberParm, u8 subBusParm,
u8 deviceIdParm, u8 barNumberParm, u64 offsetParm,
u32 *valueParm)
{
struct HvCallPci_DsaAddr dsa;
struct HvCallPci_LoadReturn retVal;
......@@ -327,13 +314,10 @@ static inline u64 HvCallPci_barLoad32(u16 busNumberParm,
return retVal.rc;
}
//============================================================================
static inline u64 HvCallPci_barLoad64(u16 busNumberParm,
u8 subBusParm,
u8 deviceIdParm,
u8 barNumberParm,
u64 offsetParm,
u64* valueParm)
static inline u64 HvCallPci_barLoad64(u16 busNumberParm, u8 subBusParm,
u8 deviceIdParm, u8 barNumberParm, u64 offsetParm,
u64 *valueParm)
{
struct HvCallPci_DsaAddr dsa;
struct HvCallPci_LoadReturn retVal;
......@@ -353,12 +337,9 @@ static inline u64 HvCallPci_barLoad64(u16 busNumberParm,
return retVal.rc;
}
//============================================================================
static inline u64 HvCallPci_barStore8(u16 busNumberParm,
u8 subBusParm,
u8 deviceIdParm,
u8 barNumberParm,
u64 offsetParm,
static inline u64 HvCallPci_barStore8(u16 busNumberParm, u8 subBusParm,
u8 deviceIdParm, u8 barNumberParm, u64 offsetParm,
u8 valueParm)
{
struct HvCallPci_DsaAddr dsa;
......@@ -377,12 +358,9 @@ static inline u64 HvCallPci_barStore8(u16 busNumberParm,
return retVal;
}
//============================================================================
static inline u64 HvCallPci_barStore16(u16 busNumberParm,
u8 subBusParm,
u8 deviceIdParm,
u8 barNumberParm,
u64 offsetParm,
static inline u64 HvCallPci_barStore16(u16 busNumberParm, u8 subBusParm,
u8 deviceIdParm, u8 barNumberParm, u64 offsetParm,
u16 valueParm)
{
struct HvCallPci_DsaAddr dsa;
......@@ -401,12 +379,9 @@ static inline u64 HvCallPci_barStore16(u16 busNumberParm,
return retVal;
}
//============================================================================
static inline u64 HvCallPci_barStore32(u16 busNumberParm,
u8 subBusParm,
u8 deviceIdParm,
u8 barNumberParm,
u64 offsetParm,
static inline u64 HvCallPci_barStore32(u16 busNumberParm, u8 subBusParm,
u8 deviceIdParm, u8 barNumberParm, u64 offsetParm,
u32 valueParm)
{
struct HvCallPci_DsaAddr dsa;
......@@ -425,12 +400,9 @@ static inline u64 HvCallPci_barStore32(u16 busNumberParm,
return retVal;
}
//============================================================================
static inline u64 HvCallPci_barStore64(u16 busNumberParm,
u8 subBusParm,
u8 deviceIdParm,
u8 barNumberParm,
u64 offsetParm,
static inline u64 HvCallPci_barStore64(u16 busNumberParm, u8 subBusParm,
u8 deviceIdParm, u8 barNumberParm, u64 offsetParm,
u64 valueParm)
{
struct HvCallPci_DsaAddr dsa;
......@@ -449,9 +421,8 @@ static inline u64 HvCallPci_barStore64(u16 busNumberParm,
return retVal;
}
//============================================================================
static inline u64 HvCallPci_eoi(u16 busNumberParm,
u8 subBusParm,
static inline u64 HvCallPci_eoi(u16 busNumberParm, u8 subBusParm,
u8 deviceIdParm)
{
struct HvCallPci_DsaAddr dsa;
......@@ -469,13 +440,9 @@ static inline u64 HvCallPci_eoi(u16 busNumberParm,
return retVal.rc;
}
//============================================================================
static inline u64 HvCallPci_getBarParms(u16 busNumberParm,
u8 subBusParm,
u8 deviceIdParm,
u8 barNumberParm,
u64 parms,
u32 sizeofParms)
static inline u64 HvCallPci_getBarParms(u16 busNumberParm, u8 subBusParm,
u8 deviceIdParm, u8 barNumberParm, u64 parms, u32 sizeofParms)
{
struct HvCallPci_DsaAddr dsa;
u64 retVal;
......@@ -493,11 +460,9 @@ static inline u64 HvCallPci_getBarParms(u16 busNumberParm,
return retVal;
}
//============================================================================
static inline u64 HvCallPci_maskFisr(u16 busNumberParm,
u8 subBusParm,
u8 deviceIdParm,
u64 fisrMask)
static inline u64 HvCallPci_maskFisr(u16 busNumberParm, u8 subBusParm,
u8 deviceIdParm, u64 fisrMask)
{
struct HvCallPci_DsaAddr dsa;
u64 retVal;
......@@ -514,11 +479,9 @@ static inline u64 HvCallPci_maskFisr(u16 busNumberParm,
return retVal;
}
//============================================================================
static inline u64 HvCallPci_unmaskFisr(u16 busNumberParm,
u8 subBusParm,
u8 deviceIdParm,
u64 fisrMask)
static inline u64 HvCallPci_unmaskFisr(u16 busNumberParm, u8 subBusParm,
u8 deviceIdParm, u64 fisrMask)
{
struct HvCallPci_DsaAddr dsa;
u64 retVal;
......@@ -535,11 +498,9 @@ static inline u64 HvCallPci_unmaskFisr(u16 busNumberParm,
return retVal;
}
//============================================================================
static inline u64 HvCallPci_setSlotReset(u16 busNumberParm,
u8 subBusParm,
u8 deviceIdParm,
u64 onNotOff)
static inline u64 HvCallPci_setSlotReset(u16 busNumberParm, u8 subBusParm,
u8 deviceIdParm, u64 onNotOff)
{
struct HvCallPci_DsaAddr dsa;
u64 retVal;
......@@ -556,12 +517,9 @@ static inline u64 HvCallPci_setSlotReset(u16 busNumberParm,
return retVal;
}
//============================================================================
static inline u64 HvCallPci_getDeviceInfo(u16 busNumberParm,
u8 subBusParm,
u8 deviceNumberParm,
u64 parms,
u32 sizeofParms)
static inline u64 HvCallPci_getDeviceInfo(u16 busNumberParm, u8 subBusParm,
u8 deviceNumberParm, u64 parms, u32 sizeofParms)
{
struct HvCallPci_DsaAddr dsa;
u64 retVal;
......@@ -578,11 +536,9 @@ static inline u64 HvCallPci_getDeviceInfo(u16 busNumberParm,
return retVal;
}
//============================================================================
static inline u64 HvCallPci_maskInterrupts(u16 busNumberParm,
u8 subBusParm,
u8 deviceIdParm,
u64 interruptMask)
static inline u64 HvCallPci_maskInterrupts(u16 busNumberParm, u8 subBusParm,
u8 deviceIdParm, u64 interruptMask)
{
struct HvCallPci_DsaAddr dsa;
u64 retVal;
......@@ -599,11 +555,9 @@ static inline u64 HvCallPci_maskInterrupts(u16 busNumberParm,
return retVal;
}
//============================================================================
static inline u64 HvCallPci_unmaskInterrupts(u16 busNumberParm,
u8 subBusParm,
u8 deviceIdParm,
u64 interruptMask)
static inline u64 HvCallPci_unmaskInterrupts(u16 busNumberParm, u8 subBusParm,
u8 deviceIdParm, u64 interruptMask)
{
struct HvCallPci_DsaAddr dsa;
u64 retVal;
......@@ -620,13 +574,9 @@ static inline u64 HvCallPci_unmaskInterrupts(u16 busNumberParm,
return retVal;
}
//============================================================================
static inline u64 HvCallPci_getBusUnitInfo(u16 busNumberParm,
u8 subBusParm,
u8 deviceIdParm,
u64 parms,
u32 sizeofParms)
static inline u64 HvCallPci_getBusUnitInfo(u16 busNumberParm, u8 subBusParm,
u8 deviceIdParm, u64 parms, u32 sizeofParms)
{
struct HvCallPci_DsaAddr dsa;
u64 retVal;
......@@ -643,9 +593,9 @@ static inline u64 HvCallPci_getBusUnitInfo(u16 busNumberParm,
return retVal;
}
//============================================================================
static inline int HvCallPci_getBusVpd(u16 busNumParm, u64 destParm, u16 sizeParm)
static inline int HvCallPci_getBusVpd(u16 busNumParm, u64 destParm,
u16 sizeParm)
{
int xRetSize;
u64 xRc = HvCall4(HvCallPciGetCardVpd, busNumParm, destParm, sizeParm, HvCallPci_BusVpd);
......@@ -656,9 +606,9 @@ static inline int HvCallPci_getBusVpd(u16 busNumParm, u64 destParm, u16 sizeParm
xRetSize = xRc & 0xFFFF;
return xRetSize;
}
//============================================================================
static inline int HvCallPci_getBusAdapterVpd(u16 busNumParm, u64 destParm, u16 sizeParm)
static inline int HvCallPci_getBusAdapterVpd(u16 busNumParm, u64 destParm,
u16 sizeParm)
{
int xRetSize;
u64 xRc = HvCall4(HvCallPciGetCardVpd, busNumParm, destParm, sizeParm, HvCallPci_BusAdapterVpd);
......@@ -669,5 +619,5 @@ static inline int HvCallPci_getBusAdapterVpd(u16 busNumParm, u64 destParm, u16 s
xRetSize = xRc & 0xFFFF;
return xRetSize;
}
//============================================================================
#endif /* _HVCALLPCI_H */
......@@ -30,22 +30,22 @@
#define HvCallSm 0x8007000000000000ul
#define HvCallXm 0x8009000000000000ul
u64 HvCall0( u64 );
u64 HvCall1( u64, u64 );
u64 HvCall2( u64, u64, u64 );
u64 HvCall3( u64, u64, u64, u64 );
u64 HvCall4( u64, u64, u64, u64, u64 );
u64 HvCall5( u64, u64, u64, u64, u64, u64 );
u64 HvCall6( u64, u64, u64, u64, u64, u64, u64 );
u64 HvCall7( u64, u64, u64, u64, u64, u64, u64, u64 );
u64 HvCall0(u64);
u64 HvCall1(u64, u64);
u64 HvCall2(u64, u64, u64);
u64 HvCall3(u64, u64, u64, u64);
u64 HvCall4(u64, u64, u64, u64, u64);
u64 HvCall5(u64, u64, u64, u64, u64, u64);
u64 HvCall6(u64, u64, u64, u64, u64, u64, u64);
u64 HvCall7(u64, u64, u64, u64, u64, u64, u64, u64);
u64 HvCall0Ret16( u64, void * );
u64 HvCall1Ret16( u64, void *, u64 );
u64 HvCall2Ret16( u64, void *, u64, u64 );
u64 HvCall3Ret16( u64, void *, u64, u64, u64 );
u64 HvCall4Ret16( u64, void *, u64, u64, u64, u64 );
u64 HvCall5Ret16( u64, void *, u64, u64, u64, u64, u64 );
u64 HvCall6Ret16( u64, void *, u64, u64, u64, u64, u64, u64 );
u64 HvCall7Ret16( u64, void *, u64, u64 ,u64 ,u64 ,u64 ,u64 ,u64 );
u64 HvCall0Ret16(u64, void *);
u64 HvCall1Ret16(u64, void *, u64);
u64 HvCall2Ret16(u64, void *, u64, u64);
u64 HvCall3Ret16(u64, void *, u64, u64, u64);
u64 HvCall4Ret16(u64, void *, u64, u64, u64, u64);
u64 HvCall5Ret16(u64, void *, u64, u64, u64, u64, u64);
u64 HvCall6Ret16(u64, void *, u64, u64, u64, u64, u64, u64);
u64 HvCall7Ret16(u64, void *, u64, u64 ,u64 ,u64 ,u64 ,u64 ,u64);
#endif /* _HVCALLSC_H */
......@@ -19,34 +19,23 @@
#ifndef _HVCALLSM_H
#define _HVCALLSM_H
//============================================================================
//
// This file contains the "hypervisor call" interface which is used to
// drive the hypervisor from the OS.
//
//============================================================================
/*
* This file contains the "hypervisor call" interface which is used to
* drive the hypervisor from the OS.
*/
//-------------------------------------------------------------------
// Standard Includes
//-------------------------------------------------------------------
#include <asm/iSeries/HvCallSc.h>
#include <asm/iSeries/HvTypes.h>
//-----------------------------------------------------------------------------
// Constants
//-----------------------------------------------------------------------------
#define HvCallSmGet64BitsOfAccessMap HvCallSm + 11
//============================================================================
static inline u64 HvCallSm_get64BitsOfAccessMap(
HvLpIndex lpIndex, u64 indexIntoBitMap )
static inline u64 HvCallSm_get64BitsOfAccessMap(HvLpIndex lpIndex,
u64 indexIntoBitMap)
{
u64 retval = HvCall2(HvCallSmGet64BitsOfAccessMap, lpIndex,
indexIntoBitMap );
// getPaca()->adjustHmtForNoOfSpinLocksHeld();
return retval;
}
//============================================================================
#endif /* _HVCALLSM_H */
//============================================================================
// Header File Id
// Name______________: HvCallXm.H
//
// Description_______:
//
// This file contains the "hypervisor call" interface which is used to
// drive the hypervisor from SLIC.
//
//============================================================================
/*
* This file contains the "hypervisor call" interface which is used to
* drive the hypervisor from SLIC.
*/
#ifndef _HVCALLXM_H
#define _HVCALLXM_H
//-------------------------------------------------------------------
// Forward declarations
//-------------------------------------------------------------------
//-------------------------------------------------------------------
// Standard Includes
//-------------------------------------------------------------------
#include <asm/iSeries/HvCallSc.h>
#include <asm/iSeries/HvTypes.h>
//-----------------------------------------------------------------------------
// Constants
//-----------------------------------------------------------------------------
#define HvCallXmGetTceTableParms HvCallXm + 0
#define HvCallXmTestBus HvCallXm + 1
#define HvCallXmConnectBusUnit HvCallXm + 2
......@@ -33,47 +16,46 @@
#define HvCallXmSetTce HvCallXm + 11
#define HvCallXmSetTces HvCallXm + 13
//============================================================================
static inline void HvCallXm_getTceTableParms(u64 cb)
{
HvCall1(HvCallXmGetTceTableParms, cb);
// getPaca()->adjustHmtForNoOfSpinLocksHeld();
}
//============================================================================
static inline u64 HvCallXm_setTce(u64 tceTableToken, u64 tceOffset, u64 tce)
{
u64 retval = HvCall3(HvCallXmSetTce, tceTableToken, tceOffset, tce );
// getPaca()->adjustHmtForNoOfSpinLocksHeld();
return retval;
}
//============================================================================
static inline u64 HvCallXm_setTces(u64 tceTableToken, u64 tceOffset, u64 numTces, u64 tce1, u64 tce2, u64 tce3, u64 tce4)
static inline u64 HvCallXm_setTces(u64 tceTableToken, u64 tceOffset,
u64 numTces, u64 tce1, u64 tce2, u64 tce3, u64 tce4)
{
u64 retval = HvCall7(HvCallXmSetTces, tceTableToken, tceOffset, numTces,
tce1, tce2, tce3, tce4 );
// getPaca()->adjustHmtForNoOfSpinLocksHeld();
return retval;
}
//=============================================================================
static inline u64 HvCallXm_testBus(u16 busNumber)
{
u64 retVal = HvCall1(HvCallXmTestBus, busNumber);
// getPaca()->adjustHmtForNoOfSpinLocksHeld();
return retVal;
}
//=====================================================================================
static inline u64 HvCallXm_testBusUnit(u16 busNumber, u8 subBusNumber, u8 deviceId)
static inline u64 HvCallXm_testBusUnit(u16 busNumber, u8 subBusNumber,
u8 deviceId)
{
u64 busUnitNumber = (subBusNumber << 8) | deviceId;
u64 retVal = HvCall2(HvCallXmTestBusUnit, busNumber, busUnitNumber);
// getPaca()->adjustHmtForNoOfSpinLocksHeld();
return retVal;
}
//=====================================================================================
static inline u64 HvCallXm_connectBusUnit(u16 busNumber, u8 subBusNumber, u8 deviceId,
u64 interruptToken)
static inline u64 HvCallXm_connectBusUnit(u16 busNumber, u8 subBusNumber,
u8 deviceId, u64 interruptToken)
{
u64 busUnitNumber = (subBusNumber << 8) | deviceId;
u64 queueIndex = 0; // HvLpConfig::mapDsaToQueueIndex(HvLpDSA(busNumber, xBoard, xCard));
......@@ -83,13 +65,12 @@ static inline u64 HvCallXm_connectBusUnit(u16 busNumber, u8 subBusNumber, u8 dev
// getPaca()->adjustHmtForNoOfSpinLocksHeld();
return retVal;
}
//=====================================================================================
static inline u64 HvCallXm_loadTod(void)
{
u64 retVal = HvCall0(HvCallXmLoadTod);
// getPaca()->adjustHmtForNoOfSpinLocksHeld();
return retVal;
}
//=====================================================================================
#endif /* _HVCALLXM_H */
......@@ -19,262 +19,285 @@
#ifndef _HVLPCONFIG_H
#define _HVLPCONFIG_H
//===========================================================================
//
// This file contains the interface to the LPAR configuration data
// to determine which resources should be allocated to each partition.
//
//===========================================================================
/*
* This file contains the interface to the LPAR configuration data
* to determine which resources should be allocated to each partition.
*/
#include <asm/iSeries/HvCallCfg.h>
#include <asm/iSeries/HvTypes.h>
#include <asm/iSeries/ItLpNaca.h>
#include <asm/iSeries/LparData.h>
//-------------------------------------------------------------------
// Constants
//-------------------------------------------------------------------
extern HvLpIndex HvLpConfig_getLpIndex_outline(void);
//===================================================================
static inline HvLpIndex HvLpConfig_getLpIndex(void)
{
return itLpNaca.xLpIndex;
}
//===================================================================
static inline HvLpIndex HvLpConfig_getPrimaryLpIndex(void)
{
return itLpNaca.xPrimaryLpIndex;
}
//=================================================================
static inline HvLpIndex HvLpConfig_getLps(void)
{
return HvCallCfg_getLps();
}
//=================================================================
static inline HvLpIndexMap HvLpConfig_getActiveLpMap(void)
{
return HvCallCfg_getActiveLpMap();
}
//=================================================================
static inline u64 HvLpConfig_getSystemMsMegs(void)
{
return HvCallCfg_getSystemMsChunks() / HVCHUNKSPERMEG;
}
//=================================================================
static inline u64 HvLpConfig_getSystemMsChunks(void)
{
return HvCallCfg_getSystemMsChunks();
}
//=================================================================
static inline u64 HvLpConfig_getSystemMsPages(void)
{
return HvCallCfg_getSystemMsChunks() * HVPAGESPERCHUNK;
}
//================================================================
static inline u64 HvLpConfig_getMsMegs(void)
{
return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(),HvCallCfg_Cur) / HVCHUNKSPERMEG;
return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(), HvCallCfg_Cur)
/ HVCHUNKSPERMEG;
}
//================================================================
static inline u64 HvLpConfig_getMsChunks(void)
{
return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(),HvCallCfg_Cur);
return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(), HvCallCfg_Cur);
}
//================================================================
static inline u64 HvLpConfig_getMsPages(void)
{
return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(),HvCallCfg_Cur) * HVPAGESPERCHUNK;
return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(), HvCallCfg_Cur)
* HVPAGESPERCHUNK;
}
//================================================================
static inline u64 HvLpConfig_getMinMsMegs(void)
{
return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(),HvCallCfg_Min) / HVCHUNKSPERMEG;
return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(), HvCallCfg_Min)
/ HVCHUNKSPERMEG;
}
//================================================================
static inline u64 HvLpConfig_getMinMsChunks(void)
{
return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(),HvCallCfg_Min);
return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(), HvCallCfg_Min);
}
//================================================================
static inline u64 HvLpConfig_getMinMsPages(void)
{
return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(),HvCallCfg_Min) * HVPAGESPERCHUNK;
return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(), HvCallCfg_Min)
* HVPAGESPERCHUNK;
}
//================================================================
static inline u64 HvLpConfig_getMinRuntimeMsMegs(void)
{
return HvCallCfg_getMinRuntimeMsChunks(HvLpConfig_getLpIndex()) / HVCHUNKSPERMEG;
return HvCallCfg_getMinRuntimeMsChunks(HvLpConfig_getLpIndex())
/ HVCHUNKSPERMEG;
}
//===============================================================
static inline u64 HvLpConfig_getMinRuntimeMsChunks(void)
{
return HvCallCfg_getMinRuntimeMsChunks(HvLpConfig_getLpIndex());
}
//===============================================================
static inline u64 HvLpConfig_getMinRuntimeMsPages(void)
{
return HvCallCfg_getMinRuntimeMsChunks(HvLpConfig_getLpIndex()) * HVPAGESPERCHUNK;
return HvCallCfg_getMinRuntimeMsChunks(HvLpConfig_getLpIndex())
* HVPAGESPERCHUNK;
}
//===============================================================
static inline u64 HvLpConfig_getMaxMsMegs(void)
{
return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(),HvCallCfg_Max) / HVCHUNKSPERMEG;
return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(), HvCallCfg_Max)
/ HVCHUNKSPERMEG;
}
//===============================================================
static inline u64 HvLpConfig_getMaxMsChunks(void)
{
return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(),HvCallCfg_Max);
return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(), HvCallCfg_Max);
}
//===============================================================
static inline u64 HvLpConfig_getMaxMsPages(void)
{
return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(),HvCallCfg_Max) * HVPAGESPERCHUNK;
return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(), HvCallCfg_Max)
* HVPAGESPERCHUNK;
}
//===============================================================
static inline u64 HvLpConfig_getInitMsMegs(void)
{
return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(),HvCallCfg_Init) / HVCHUNKSPERMEG;
return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(), HvCallCfg_Init)
/ HVCHUNKSPERMEG;
}
//===============================================================
static inline u64 HvLpConfig_getInitMsChunks(void)
{
return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(),HvCallCfg_Init);
return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(), HvCallCfg_Init);
}
//===============================================================
static inline u64 HvLpConfig_getInitMsPages(void)
{ return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(),HvCallCfg_Init) * HVPAGESPERCHUNK;
{
return HvCallCfg_getMsChunks(HvLpConfig_getLpIndex(), HvCallCfg_Init)
* HVPAGESPERCHUNK;
}
//===============================================================
static inline u64 HvLpConfig_getSystemPhysicalProcessors(void)
{
return HvCallCfg_getSystemPhysicalProcessors();
}
//===============================================================
static inline u64 HvLpConfig_getSystemLogicalProcessors(void)
{
return HvCallCfg_getSystemPhysicalProcessors() * (/*getPaca()->getSecondaryThreadCount() +*/ 1);
return HvCallCfg_getSystemPhysicalProcessors()
* (/*getPaca()->getSecondaryThreadCount() +*/ 1);
}
//===============================================================
static inline u64 HvLpConfig_getNumProcsInSharedPool(HvLpSharedPoolIndex sPI)
{
return HvCallCfg_getNumProcsInSharedPool(sPI);
}
//===============================================================
static inline u64 HvLpConfig_getPhysicalProcessors(void)
{
return HvCallCfg_getPhysicalProcessors(HvLpConfig_getLpIndex(),HvCallCfg_Cur);
return HvCallCfg_getPhysicalProcessors(HvLpConfig_getLpIndex(),
HvCallCfg_Cur);
}
//===============================================================
static inline u64 HvLpConfig_getLogicalProcessors(void)
{
return HvCallCfg_getPhysicalProcessors(HvLpConfig_getLpIndex(),HvCallCfg_Cur) * (/*getPaca()->getSecondaryThreadCount() +*/ 1);
return HvCallCfg_getPhysicalProcessors(HvLpConfig_getLpIndex(),
HvCallCfg_Cur)
* (/*getPaca()->getSecondaryThreadCount() +*/ 1);
}
//===============================================================
static inline HvLpSharedPoolIndex HvLpConfig_getSharedPoolIndex(void)
{
return HvCallCfg_getSharedPoolIndex(HvLpConfig_getLpIndex());
}
//===============================================================
static inline u64 HvLpConfig_getSharedProcUnits(void)
{
return HvCallCfg_getSharedProcUnits(HvLpConfig_getLpIndex(),HvCallCfg_Cur);
return HvCallCfg_getSharedProcUnits(HvLpConfig_getLpIndex(),
HvCallCfg_Cur);
}
//===============================================================
static inline u64 HvLpConfig_getMinSharedProcUnits(void)
{
return HvCallCfg_getSharedProcUnits(HvLpConfig_getLpIndex(),HvCallCfg_Min);
return HvCallCfg_getSharedProcUnits(HvLpConfig_getLpIndex(),
HvCallCfg_Min);
}
//===============================================================
static inline u64 HvLpConfig_getMaxSharedProcUnits(void)
{
return HvCallCfg_getSharedProcUnits(HvLpConfig_getLpIndex(),HvCallCfg_Max);
return HvCallCfg_getSharedProcUnits(HvLpConfig_getLpIndex(),
HvCallCfg_Max);
}
//===============================================================
static inline u64 HvLpConfig_getMinPhysicalProcessors(void)
{
return HvCallCfg_getPhysicalProcessors(HvLpConfig_getLpIndex(),HvCallCfg_Min);
return HvCallCfg_getPhysicalProcessors(HvLpConfig_getLpIndex(),
HvCallCfg_Min);
}
//===============================================================
static inline u64 HvLpConfig_getMinLogicalProcessors(void)
{
return HvCallCfg_getPhysicalProcessors(HvLpConfig_getLpIndex(),HvCallCfg_Min) * (/*getPaca()->getSecondaryThreadCount() +*/ 1);
return HvCallCfg_getPhysicalProcessors(HvLpConfig_getLpIndex(),
HvCallCfg_Min)
* (/*getPaca()->getSecondaryThreadCount() +*/ 1);
}
//===============================================================
static inline u64 HvLpConfig_getMaxPhysicalProcessors(void)
{
return HvCallCfg_getPhysicalProcessors(HvLpConfig_getLpIndex(),HvCallCfg_Max);
return HvCallCfg_getPhysicalProcessors(HvLpConfig_getLpIndex(),
HvCallCfg_Max);
}
//===============================================================
static inline u64 HvLpConfig_getMaxLogicalProcessors(void)
{
return HvCallCfg_getPhysicalProcessors(HvLpConfig_getLpIndex(),HvCallCfg_Max) * (/*getPaca()->getSecondaryThreadCount() +*/ 1);
return HvCallCfg_getPhysicalProcessors(HvLpConfig_getLpIndex(),
HvCallCfg_Max)
* (/*getPaca()->getSecondaryThreadCount() +*/ 1);
}
//===============================================================
static inline u64 HvLpConfig_getInitPhysicalProcessors(void)
{
return HvCallCfg_getPhysicalProcessors(HvLpConfig_getLpIndex(),HvCallCfg_Init);
return HvCallCfg_getPhysicalProcessors(HvLpConfig_getLpIndex(),
HvCallCfg_Init);
}
//===============================================================
static inline u64 HvLpConfig_getInitLogicalProcessors(void)
{
return HvCallCfg_getPhysicalProcessors(HvLpConfig_getLpIndex(),HvCallCfg_Init) * (/*getPaca()->getSecondaryThreadCount() +*/ 1);
return HvCallCfg_getPhysicalProcessors(HvLpConfig_getLpIndex(),
HvCallCfg_Init)
* (/*getPaca()->getSecondaryThreadCount() +*/ 1);
}
//================================================================
static inline HvLpVirtualLanIndexMap HvLpConfig_getVirtualLanIndexMap(void)
{
return HvCallCfg_getVirtualLanIndexMap(HvLpConfig_getLpIndex_outline());
}
//===============================================================
static inline HvLpVirtualLanIndexMap HvLpConfig_getVirtualLanIndexMapForLp(HvLpIndex lp)
static inline HvLpVirtualLanIndexMap HvLpConfig_getVirtualLanIndexMapForLp(
HvLpIndex lp)
{
return HvCallCfg_getVirtualLanIndexMap(lp);
}
//================================================================
static inline HvLpIndex HvLpConfig_getBusOwner(HvBusNumber busNumber)
{
return HvCallCfg_getBusOwner(busNumber);
}
//===============================================================
static inline int HvLpConfig_isBusDedicated(HvBusNumber busNumber)
{
return HvCallCfg_isBusDedicated(busNumber);
}
//================================================================
static inline HvLpIndexMap HvLpConfig_getBusAllocation(HvBusNumber busNumber)
{
return HvCallCfg_getBusAllocation(busNumber);
}
//================================================================
// returns the absolute real address of the load area
/* returns the absolute real address of the load area */
static inline u64 HvLpConfig_getLoadAddress(void)
{
return itLpNaca.xLoadAreaAddr & 0x7fffffffffffffff;
}
//================================================================
static inline u64 HvLpConfig_getLoadPages(void)
{
return itLpNaca.xLoadAreaChunks * HVPAGESPERCHUNK;
}
//================================================================
static inline int HvLpConfig_isBusOwnedByThisLp(HvBusNumber busNumber)
{
HvLpIndex busOwner = HvLpConfig_getBusOwner(busNumber);
return (busOwner == HvLpConfig_getLpIndex());
}
//================================================================
static inline int HvLpConfig_doLpsCommunicateOnVirtualLan(HvLpIndex lp1, HvLpIndex lp2)
static inline int HvLpConfig_doLpsCommunicateOnVirtualLan(HvLpIndex lp1,
HvLpIndex lp2)
{
HvLpVirtualLanIndexMap virtualLanIndexMap1 = HvCallCfg_getVirtualLanIndexMap( lp1 );
HvLpVirtualLanIndexMap virtualLanIndexMap2 = HvCallCfg_getVirtualLanIndexMap( lp2 );
HvLpVirtualLanIndexMap virtualLanIndexMap1 =
HvCallCfg_getVirtualLanIndexMap(lp1);
HvLpVirtualLanIndexMap virtualLanIndexMap2 =
HvCallCfg_getVirtualLanIndexMap(lp2);
return ((virtualLanIndexMap1 & virtualLanIndexMap2) != 0);
}
//================================================================
static inline HvLpIndex HvLpConfig_getHostingLpIndex(HvLpIndex lp)
{
return HvCallCfg_getHostingLpIndex(lp);
}
//================================================================
#endif /* _HVLPCONFIG_H */
......@@ -17,11 +17,8 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
//======================================================================
//
// This file contains the class for HV events in the system.
//
//=====================================================================
/* This file contains the class for HV events in the system. */
#ifndef _HVLPEVENT_H
#define _HVLPEVENT_H
......@@ -30,69 +27,70 @@
#include <asm/iSeries/HvTypes.h>
#include <asm/iSeries/HvCallEvent.h>
//=====================================================================
//
// HvLpEvent is the structure for Lp Event messages passed between
// partitions through PLIC.
//
//=====================================================================
struct HvEventFlags
{
u8 xValid:1; // Indicates a valid request x00-x00
u8 xRsvd1:4; // Reserved ...
u8 xAckType:1; // Immediate or deferred ...
u8 xAckInd:1; // Indicates if ACK required ...
u8 xFunction:1; // Interrupt or Acknowledge ...
/*
* HvLpEvent is the structure for Lp Event messages passed between
* partitions through PLIC.
*/
struct HvEventFlags {
u8 xValid:1; /* Indicates a valid request x00-x00 */
u8 xRsvd1:4; /* Reserved ... */
u8 xAckType:1; /* Immediate or deferred ... */
u8 xAckInd:1; /* Indicates if ACK required ... */
u8 xFunction:1; /* Interrupt or Acknowledge ... */
};
struct HvLpEvent
{
struct HvEventFlags xFlags; // Event flags x00-x00
u8 xType; // Type of message x01-x01
u16 xSubtype; // Subtype for event x02-x03
u8 xSourceLp; // Source LP x04-x04
u8 xTargetLp; // Target LP x05-x05
u8 xSizeMinus1; // Size of Derived class - 1 x06-x06
u8 xRc; // RC for Ack flows x07-x07
u16 xSourceInstanceId; // Source sides instance id x08-x09
u16 xTargetInstanceId; // Target sides instance id x0A-x0B
struct HvLpEvent {
struct HvEventFlags xFlags; /* Event flags x00-x00 */
u8 xType; /* Type of message x01-x01 */
u16 xSubtype; /* Subtype for event x02-x03 */
u8 xSourceLp; /* Source LP x04-x04 */
u8 xTargetLp; /* Target LP x05-x05 */
u8 xSizeMinus1; /* Size of Derived class - 1 x06-x06 */
u8 xRc; /* RC for Ack flows x07-x07 */
u16 xSourceInstanceId; /* Source sides instance id x08-x09 */
u16 xTargetInstanceId; /* Target sides instance id x0A-x0B */
union {
u32 xSubtypeData; // Data usable by the subtype x0C-x0F
u16 xSubtypeDataShort[2]; // Data as 2 shorts
u8 xSubtypeDataChar[4]; // Data as 4 chars
u32 xSubtypeData; /* Data usable by the subtype x0C-x0F */
u16 xSubtypeDataShort[2]; /* Data as 2 shorts */
u8 xSubtypeDataChar[4]; /* Data as 4 chars */
} x;
u64 xCorrelationToken; // Unique value for source/type x10-x17
u64 xCorrelationToken; /* Unique value for source/type x10-x17 */
};
// Lp Event handler function
typedef void (*LpEventHandler)(struct HvLpEvent *, struct pt_regs *);
// Register a handler for an event type
// returns 0 on success
extern int HvLpEvent_registerHandler( HvLpEvent_Type eventType, LpEventHandler hdlr);
/* Register a handler for an event type - returns 0 on success */
extern int HvLpEvent_registerHandler(HvLpEvent_Type eventType,
LpEventHandler hdlr);
// Unregister a handler for an event type
// This call will sleep until the handler being removed is guaranteed to
// be no longer executing on any CPU. Do not call with locks held.
//
// returns 0 on success
// Unregister will fail if there are any paths open for the type
extern int HvLpEvent_unregisterHandler( HvLpEvent_Type eventType );
// Open an Lp Event Path for an event type
// returns 0 on success
// openPath will fail if there is no handler registered for the event type.
// The lpIndex specified is the partition index for the target partition
// (for VirtualIo, VirtualLan and SessionMgr) other types specify zero)
extern int HvLpEvent_openPath( HvLpEvent_Type eventType, HvLpIndex lpIndex );
/*
* Unregister a handler for an event type
*
* This call will sleep until the handler being removed is guaranteed to
* be no longer executing on any CPU. Do not call with locks held.
*
* returns 0 on success
* Unregister will fail if there are any paths open for the type
*/
extern int HvLpEvent_unregisterHandler(HvLpEvent_Type eventType);
/*
* Open an Lp Event Path for an event type
* returns 0 on success
* openPath will fail if there is no handler registered for the event type.
* The lpIndex specified is the partition index for the target partition
* (for VirtualIo, VirtualLan and SessionMgr) other types specify zero)
*/
extern int HvLpEvent_openPath(HvLpEvent_Type eventType, HvLpIndex lpIndex);
// Close an Lp Event Path for a type and partition
// returns 0 on sucess
extern int HvLpEvent_closePath( HvLpEvent_Type eventType, HvLpIndex lpIndex );
/*
* Close an Lp Event Path for a type and partition
* returns 0 on sucess
*/
extern int HvLpEvent_closePath(HvLpEvent_Type eventType, HvLpIndex lpIndex);
#define HvLpEvent_Type_Hypervisor 0
#define HvLpEvent_Type_MachineFac 1
......@@ -141,4 +139,4 @@ extern int HvLpEvent_closePath( HvLpEvent_Type eventType, HvLpIndex lpIndex );
#define HvLpDma_Rc_InvalidAddress 4
#define HvLpDma_Rc_InvalidLength 5
#endif // _HVLPEVENT_H
#endif /* _HVLPEVENT_H */
......@@ -19,47 +19,43 @@
#ifndef _HVRELEASEDATA_H
#define _HVRELEASEDATA_H
//=============================================================================
//
// This control block contains the critical information about the
// release so that it can be changed in the future (ie, the virtual
// address of the OS's NACA).
//
/*
* This control block contains the critical information about the
* release so that it can be changed in the future (ie, the virtual
* address of the OS's NACA).
*/
#include <asm/types.h>
#include <asm/naca.h>
//=============================================================================
//
// When we IPL a secondary partition, we will check if if the
// secondary xMinPlicVrmIndex > the primary xVrmIndex.
// If it is then this tells PLIC that this secondary is not
// supported running on this "old" of a level of PLIC.
//
// Likewise, we will compare the primary xMinSlicVrmIndex to
// the secondary xVrmIndex.
// If the primary xMinSlicVrmDelta > secondary xVrmDelta then we
// know that this PLIC does not support running an OS "that old".
//
//=============================================================================
/*
* When we IPL a secondary partition, we will check if if the
* secondary xMinPlicVrmIndex > the primary xVrmIndex.
* If it is then this tells PLIC that this secondary is not
* supported running on this "old" of a level of PLIC.
*
* Likewise, we will compare the primary xMinSlicVrmIndex to
* the secondary xVrmIndex.
* If the primary xMinSlicVrmDelta > secondary xVrmDelta then we
* know that this PLIC does not support running an OS "that old".
*/
struct HvReleaseData
{
u32 xDesc; // Descriptor "HvRD" ebcdic x00-x03
u16 xSize; // Size of this control block x04-x05
u16 xVpdAreasPtrOffset; // Offset in NACA of ItVpdAreas x06-x07
struct naca_struct * xSlicNacaAddr; // Virt addr of SLIC NACA x08-x0F
u32 xMsNucDataOffset; // Offset of Linux Mapping Data x10-x13
u32 xRsvd1; // Reserved x14-x17
u16 xTagsMode:1; // 0 == tags active, 1 == tags inactive
u16 xAddressSize:1; // 0 == 64-bit, 1 == 32-bit
u16 xNoSharedProcs:1; // 0 == shared procs, 1 == no shared
u16 xNoHMT:1; // 0 == allow HMT, 1 == no HMT
u16 xRsvd2:12; // Reserved x18-x19
u16 xVrmIndex; // VRM Index of OS image x1A-x1B
u16 xMinSupportedPlicVrmIndex;// Min PLIC level (soft) x1C-x1D
u16 xMinCompatablePlicVrmIndex;// Min PLIC levelP (hard) x1E-x1F
char xVrmName[12]; // Displayable name x20-x2B
char xRsvd3[20]; // Reserved x2C-x3F
struct HvReleaseData {
u32 xDesc; /* Descriptor "HvRD" ebcdic x00-x03 */
u16 xSize; /* Size of this control block x04-x05 */
u16 xVpdAreasPtrOffset; /* Offset in NACA of ItVpdAreas x06-x07 */
struct naca_struct *xSlicNacaAddr; /* Virt addr of SLIC NACA x08-x0F */
u32 xMsNucDataOffset; /* Offset of Linux Mapping Data x10-x13 */
u32 xRsvd1; /* Reserved x14-x17 */
u16 xTagsMode:1; /* 0 == tags active, 1 == tags inactive */
u16 xAddressSize:1; /* 0 == 64-bit, 1 == 32-bit */
u16 xNoSharedProcs:1; /* 0 == shared procs, 1 == no shared */
u16 xNoHMT:1; /* 0 == allow HMT, 1 == no HMT */
u16 xRsvd2:12; /* Reserved x18-x19 */
u16 xVrmIndex; /* VRM Index of OS image x1A-x1B */
u16 xMinSupportedPlicVrmIndex; /* Min PLIC level (soft) x1C-x1D */
u16 xMinCompatablePlicVrmIndex; /* Min PLIC levelP (hard) x1E-x1F */
char xVrmName[12]; /* Displayable name x20-x2B */
char xRsvd3[20]; /* Reserved x2C-x3F */
};
#endif /* _HVRELEASEDATA_H */
......@@ -19,23 +19,12 @@
#ifndef _HVTYPES_H
#define _HVTYPES_H
//===========================================================================
// Header File Id
// Name______________: HvTypes.H
//
// Description_______:
//
// General typedefs for the hypervisor.
//
// Declared Class(es):
//
//===========================================================================
/*
* General typedefs for the hypervisor.
*/
#include <asm/types.h>
//-------------------------------------------------------------------
// Typedefs
//-------------------------------------------------------------------
typedef u8 HvLpIndex;
typedef u16 HvLpInstanceId;
typedef u64 HvLpTOD;
......@@ -51,17 +40,17 @@ typedef u64 HvIoToken;
typedef u8 HvLpName[8];
typedef u32 HvIoId;
typedef u64 HvRealMemoryIndex;
typedef u32 HvLpIndexMap; // Must hold HvMaxArchitectedLps bits!!!
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
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
......@@ -69,8 +58,8 @@ typedef u8 HvAgentId; // Hypervisor DevFn
#define HVMAXARCHITECTEDVIRTUALDISKS 32
#define HVMAXARCHITECTEDVIRTUALCDROMS 8
#define HVMAXARCHITECTEDVIRTUALTAPES 8
#define HVCHUNKSIZE 256 * 1024
#define HVPAGESIZE 4 * 1024
#define HVCHUNKSIZE (256 * 1024)
#define HVPAGESIZE (4 * 1024)
#define HVLPMINMEGSPRIMARY 256
#define HVLPMINMEGSSECONDARY 64
#define HVCHUNKSPERMEG 4
......@@ -81,12 +70,11 @@ typedef u8 HvAgentId; // Hypervisor DevFn
#define HvMaxArchitectedVirtualLans ((HvLpVirtualLanIndex)16)
#define HvLpIndexInvalid ((HvLpIndex)0xff)
//--------------------------------------------------------------------
// Enums for the sub-components under PLIC
// Used in HvCall and HvPrimaryCall
//--------------------------------------------------------------------
enum HvCallCompIds
{
/*
* Enums for the sub-components under PLIC
* Used in HvCall and HvPrimaryCall
*/
enum HvCallCompIds {
HvCallCompId = 0,
HvCallCpuCtlsCompId = 1,
HvCallCfgCompId = 2,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment