2005-06-22 04:15:33 +04:00
/*
* 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
*/
2005-04-17 02:20:36 +04:00
2005-10-14 11:16:17 +04:00
# ifndef _PLATFORMS_ISERIES_CALL_PCI_H
# define _PLATFORMS_ISERIES_CALL_PCI_H
2005-04-17 02:20:36 +04:00
2005-11-02 03:37:22 +03:00
# include <asm/iseries/hv_call_sc.h>
2005-11-02 05:46:07 +03:00
# include <asm/iseries/hv_types.h>
2005-04-17 02:20:36 +04:00
/*
* DSA = = Direct Select Address
* this struct must be 64 bits in total
*/
struct HvCallPci_DsaAddr {
u16 busNumber ; /* PHB index? */
2005-06-22 04:15:33 +04:00
u8 subBusNumber ; /* PCI bus number? */
u8 deviceId ; /* device and function? */
2005-04-17 02:20:36 +04:00
u8 barNumber ;
u8 reserved [ 3 ] ;
} ;
union HvDsaMap {
u64 DsaAddr ;
struct HvCallPci_DsaAddr Dsa ;
} ;
struct HvCallPci_LoadReturn {
u64 rc ;
u64 value ;
} ;
enum HvCallPci_DeviceType {
HvCallPci_NodeDevice = 1 ,
2005-06-22 04:15:33 +04:00
HvCallPci_SpDevice = 2 ,
HvCallPci_IopDevice = 3 ,
HvCallPci_BridgeDevice = 4 ,
HvCallPci_MultiFunctionDevice = 5 ,
HvCallPci_IoaDevice = 6
2005-04-17 02:20:36 +04:00
} ;
struct HvCallPci_DeviceInfo {
2005-06-22 04:15:33 +04:00
u32 deviceType ; /* See DeviceType enum for values */
2005-04-17 02:20:36 +04:00
} ;
2005-06-22 04:15:33 +04:00
2005-04-17 02:20:36 +04:00
struct HvCallPci_BusUnitInfo {
2005-06-22 04:15:33 +04:00
u32 sizeReturned ; /* length of data returned */
u32 deviceType ; /* see DeviceType enum for values */
2005-04-17 02:20:36 +04:00
} ;
struct HvCallPci_BridgeInfo {
2005-06-22 04:15:33 +04:00
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 */
2005-04-17 02:20:36 +04:00
} ;
2005-06-22 04:15:33 +04:00
/*
* Maximum BusUnitInfo buffer size . Provided for clients so
* they can allocate a buffer big enough for any type of bus
* unit . Increase as needed .
*/
2005-04-17 02:20:36 +04:00
enum { HvCallPci_MaxBusUnitInfoSize = 128 } ;
struct HvCallPci_BarParms {
u64 vaddr ;
u64 raddr ;
u64 size ;
u64 protectStart ;
u64 protectEnd ;
u64 relocationOffset ;
2005-06-22 04:15:33 +04:00
u64 pciAddress ;
2005-04-17 02:20:36 +04:00
u64 reserved [ 3 ] ;
2005-06-22 04:15:33 +04:00
} ;
2005-04-17 02:20:36 +04:00
enum HvCallPci_VpdType {
2005-06-22 04:15:33 +04:00
HvCallPci_BusVpd = 1 ,
2005-04-17 02:20:36 +04:00
HvCallPci_BusAdapterVpd = 2
} ;
# define HvCallPciConfigLoad8 HvCallPci + 0
# define HvCallPciConfigLoad16 HvCallPci + 1
# define HvCallPciConfigLoad32 HvCallPci + 2
# define HvCallPciConfigStore8 HvCallPci + 3
# define HvCallPciConfigStore16 HvCallPci + 4
# define HvCallPciConfigStore32 HvCallPci + 5
# define HvCallPciEoi HvCallPci + 16
# define HvCallPciGetBarParms HvCallPci + 18
# define HvCallPciMaskFisr HvCallPci + 20
# define HvCallPciUnmaskFisr HvCallPci + 21
# define HvCallPciSetSlotReset HvCallPci + 25
# define HvCallPciGetDeviceInfo HvCallPci + 27
# define HvCallPciGetCardVpd HvCallPci + 28
# define HvCallPciBarLoad8 HvCallPci + 40
# define HvCallPciBarLoad16 HvCallPci + 41
# define HvCallPciBarLoad32 HvCallPci + 42
# define HvCallPciBarLoad64 HvCallPci + 43
# define HvCallPciBarStore8 HvCallPci + 44
# define HvCallPciBarStore16 HvCallPci + 45
# define HvCallPciBarStore32 HvCallPci + 46
# define HvCallPciBarStore64 HvCallPci + 47
# define HvCallPciMaskInterrupts HvCallPci + 48
# define HvCallPciUnmaskInterrupts HvCallPci + 49
# define HvCallPciGetBusUnitInfo HvCallPci + 50
static inline u64 HvCallPci_configLoad16 ( u16 busNumber , u8 subBusNumber ,
2005-06-22 04:15:33 +04:00
u8 deviceId , u32 offset , u16 * value )
2005-04-17 02:20:36 +04:00
{
struct HvCallPci_DsaAddr dsa ;
struct HvCallPci_LoadReturn retVal ;
2005-06-22 04:15:33 +04:00
* ( ( u64 * ) & dsa ) = 0 ;
2005-04-17 02:20:36 +04:00
dsa . busNumber = busNumber ;
dsa . subBusNumber = subBusNumber ;
dsa . deviceId = deviceId ;
HvCall3Ret16 ( HvCallPciConfigLoad16 , & retVal , * ( u64 * ) & dsa , offset , 0 ) ;
* value = retVal . value ;
return retVal . rc ;
}
2005-06-22 04:15:33 +04:00
2006-05-19 10:43:58 +04:00
static inline u64 HvCallPci_configLoad32 ( u16 busNumber , u8 subBusNumber ,
u8 deviceId , u32 offset , u32 * value )
{
struct HvCallPci_DsaAddr dsa ;
struct HvCallPci_LoadReturn retVal ;
* ( ( u64 * ) & dsa ) = 0 ;
dsa . busNumber = busNumber ;
dsa . subBusNumber = subBusNumber ;
dsa . deviceId = deviceId ;
HvCall3Ret16 ( HvCallPciConfigLoad32 , & retVal , * ( u64 * ) & dsa , offset , 0 ) ;
* value = retVal . value ;
return retVal . rc ;
}
2005-06-22 04:15:33 +04:00
static inline u64 HvCallPci_configStore8 ( u16 busNumber , u8 subBusNumber ,
u8 deviceId , u32 offset , u8 value )
2005-04-17 02:20:36 +04:00
{
struct HvCallPci_DsaAddr dsa ;
2005-06-22 04:15:33 +04:00
* ( ( u64 * ) & dsa ) = 0 ;
2005-04-17 02:20:36 +04:00
dsa . busNumber = busNumber ;
dsa . subBusNumber = subBusNumber ;
dsa . deviceId = deviceId ;
2005-06-22 04:15:35 +04:00
return HvCall4 ( HvCallPciConfigStore8 , * ( u64 * ) & dsa , offset , value , 0 ) ;
2005-04-17 02:20:36 +04:00
}
2005-06-22 04:15:33 +04:00
static inline u64 HvCallPci_eoi ( u16 busNumberParm , u8 subBusParm ,
u8 deviceIdParm )
2005-04-17 02:20:36 +04:00
{
struct HvCallPci_DsaAddr dsa ;
struct HvCallPci_LoadReturn retVal ;
* ( ( u64 * ) & dsa ) = 0 ;
dsa . busNumber = busNumberParm ;
dsa . subBusNumber = subBusParm ;
dsa . deviceId = deviceIdParm ;
HvCall1Ret16 ( HvCallPciEoi , & retVal , * ( u64 * ) & dsa ) ;
return retVal . rc ;
}
2005-06-22 04:15:33 +04:00
static inline u64 HvCallPci_getBarParms ( u16 busNumberParm , u8 subBusParm ,
u8 deviceIdParm , u8 barNumberParm , u64 parms , u32 sizeofParms )
2005-04-17 02:20:36 +04:00
{
struct HvCallPci_DsaAddr dsa ;
* ( ( u64 * ) & dsa ) = 0 ;
dsa . busNumber = busNumberParm ;
dsa . subBusNumber = subBusParm ;
dsa . deviceId = deviceIdParm ;
dsa . barNumber = barNumberParm ;
2005-06-22 04:15:35 +04:00
return HvCall3 ( HvCallPciGetBarParms , * ( u64 * ) & dsa , parms , sizeofParms ) ;
2005-04-17 02:20:36 +04:00
}
2005-06-22 04:15:33 +04:00
static inline u64 HvCallPci_maskFisr ( u16 busNumberParm , u8 subBusParm ,
u8 deviceIdParm , u64 fisrMask )
2005-04-17 02:20:36 +04:00
{
struct HvCallPci_DsaAddr dsa ;
2005-06-22 04:15:33 +04:00
* ( ( u64 * ) & dsa ) = 0 ;
2005-04-17 02:20:36 +04:00
dsa . busNumber = busNumberParm ;
dsa . subBusNumber = subBusParm ;
dsa . deviceId = deviceIdParm ;
2005-06-22 04:15:35 +04:00
return HvCall2 ( HvCallPciMaskFisr , * ( u64 * ) & dsa , fisrMask ) ;
2005-04-17 02:20:36 +04:00
}
2005-06-22 04:15:33 +04:00
static inline u64 HvCallPci_unmaskFisr ( u16 busNumberParm , u8 subBusParm ,
u8 deviceIdParm , u64 fisrMask )
2005-04-17 02:20:36 +04:00
{
struct HvCallPci_DsaAddr dsa ;
2005-06-22 04:15:33 +04:00
* ( ( u64 * ) & dsa ) = 0 ;
2005-04-17 02:20:36 +04:00
dsa . busNumber = busNumberParm ;
dsa . subBusNumber = subBusParm ;
dsa . deviceId = deviceIdParm ;
2005-06-22 04:15:35 +04:00
return HvCall2 ( HvCallPciUnmaskFisr , * ( u64 * ) & dsa , fisrMask ) ;
2005-04-17 02:20:36 +04:00
}
2005-06-22 04:15:33 +04:00
static inline u64 HvCallPci_getDeviceInfo ( u16 busNumberParm , u8 subBusParm ,
u8 deviceNumberParm , u64 parms , u32 sizeofParms )
2005-04-17 02:20:36 +04:00
{
struct HvCallPci_DsaAddr dsa ;
* ( ( u64 * ) & dsa ) = 0 ;
dsa . busNumber = busNumberParm ;
dsa . subBusNumber = subBusParm ;
dsa . deviceId = deviceNumberParm < < 4 ;
2005-06-22 04:15:35 +04:00
return HvCall3 ( HvCallPciGetDeviceInfo , * ( u64 * ) & dsa , parms , sizeofParms ) ;
2005-04-17 02:20:36 +04:00
}
2005-06-22 04:15:33 +04:00
static inline u64 HvCallPci_maskInterrupts ( u16 busNumberParm , u8 subBusParm ,
u8 deviceIdParm , u64 interruptMask )
2005-04-17 02:20:36 +04:00
{
struct HvCallPci_DsaAddr dsa ;
2005-06-22 04:15:33 +04:00
* ( ( u64 * ) & dsa ) = 0 ;
2005-04-17 02:20:36 +04:00
dsa . busNumber = busNumberParm ;
dsa . subBusNumber = subBusParm ;
dsa . deviceId = deviceIdParm ;
2005-06-22 04:15:35 +04:00
return HvCall2 ( HvCallPciMaskInterrupts , * ( u64 * ) & dsa , interruptMask ) ;
2005-04-17 02:20:36 +04:00
}
2005-06-22 04:15:33 +04:00
static inline u64 HvCallPci_unmaskInterrupts ( u16 busNumberParm , u8 subBusParm ,
u8 deviceIdParm , u64 interruptMask )
2005-04-17 02:20:36 +04:00
{
struct HvCallPci_DsaAddr dsa ;
2005-06-22 04:15:33 +04:00
* ( ( u64 * ) & dsa ) = 0 ;
2005-04-17 02:20:36 +04:00
dsa . busNumber = busNumberParm ;
dsa . subBusNumber = subBusParm ;
dsa . deviceId = deviceIdParm ;
2005-06-22 04:15:35 +04:00
return HvCall2 ( HvCallPciUnmaskInterrupts , * ( u64 * ) & dsa , interruptMask ) ;
2005-04-17 02:20:36 +04:00
}
2005-06-22 04:15:33 +04:00
static inline u64 HvCallPci_getBusUnitInfo ( u16 busNumberParm , u8 subBusParm ,
u8 deviceIdParm , u64 parms , u32 sizeofParms )
2005-04-17 02:20:36 +04:00
{
struct HvCallPci_DsaAddr dsa ;
2005-06-22 04:15:33 +04:00
* ( ( u64 * ) & dsa ) = 0 ;
2005-04-17 02:20:36 +04:00
dsa . busNumber = busNumberParm ;
dsa . subBusNumber = subBusParm ;
dsa . deviceId = deviceIdParm ;
2005-06-22 04:15:35 +04:00
return HvCall3 ( HvCallPciGetBusUnitInfo , * ( u64 * ) & dsa , parms ,
sizeofParms ) ;
2005-04-17 02:20:36 +04:00
}
2005-06-22 04:15:33 +04:00
static inline int HvCallPci_getBusVpd ( u16 busNumParm , u64 destParm ,
u16 sizeParm )
2005-04-17 02:20:36 +04:00
{
2005-06-22 04:15:35 +04:00
u64 xRc = HvCall4 ( HvCallPciGetCardVpd , busNumParm , destParm ,
sizeParm , HvCallPci_BusVpd ) ;
2005-04-17 02:20:36 +04:00
if ( xRc = = - 1 )
2005-06-22 04:15:35 +04:00
return - 1 ;
2005-04-17 02:20:36 +04:00
else
2005-06-22 04:15:35 +04:00
return xRc & 0xFFFF ;
2005-04-17 02:20:36 +04:00
}
2005-10-14 11:16:17 +04:00
# endif /* _PLATFORMS_ISERIES_CALL_PCI_H */