diff options
Diffstat (limited to 'arch/powerpc/include/asm/iseries')
| -rw-r--r-- | arch/powerpc/include/asm/iseries/alpaca.h | 31 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/iseries/hv_call.h | 111 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/iseries/hv_call_event.h | 201 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/iseries/hv_call_sc.h | 50 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/iseries/hv_call_xm.h | 61 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/iseries/hv_lp_config.h | 128 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/iseries/hv_lp_event.h | 162 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/iseries/hv_types.h | 112 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/iseries/iommu.h | 37 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/iseries/it_lp_queue.h | 78 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/iseries/lpar_map.h | 85 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/iseries/mf.h | 51 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/iseries/vio.h | 265 |
13 files changed, 1372 insertions, 0 deletions
diff --git a/arch/powerpc/include/asm/iseries/alpaca.h b/arch/powerpc/include/asm/iseries/alpaca.h new file mode 100644 index 00000000000..c0cce6727a6 --- /dev/null +++ b/arch/powerpc/include/asm/iseries/alpaca.h | |||
| @@ -0,0 +1,31 @@ | |||
| 1 | /* | ||
| 2 | * Copyright © 2008 Stephen Rothwell IBM Corporation | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License as published by | ||
| 6 | * the Free Software Foundation; either version 2 of the License, or | ||
| 7 | * (at your option) any later version. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope that it will be useful, | ||
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | * GNU General Public License for more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License | ||
| 15 | * along with this program; if not, write to the Free Software | ||
| 16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 17 | */ | ||
| 18 | #ifndef _ASM_POWERPC_ISERIES_ALPACA_H | ||
| 19 | #define _ASM_POWERPC_ISERIES_ALPACA_H | ||
| 20 | |||
| 21 | /* | ||
| 22 | * This is the part of the paca that the iSeries hypervisor | ||
| 23 | * needs to be statically initialised. Immediately after boot | ||
| 24 | * we switch to the normal Linux paca. | ||
| 25 | */ | ||
| 26 | struct alpaca { | ||
| 27 | struct lppaca *lppaca_ptr; /* Pointer to LpPaca for PLIC */ | ||
| 28 | const void *reg_save_ptr; /* Pointer to LpRegSave for PLIC */ | ||
| 29 | }; | ||
| 30 | |||
| 31 | #endif /* _ASM_POWERPC_ISERIES_ALPACA_H */ | ||
diff --git a/arch/powerpc/include/asm/iseries/hv_call.h b/arch/powerpc/include/asm/iseries/hv_call.h new file mode 100644 index 00000000000..162d653ad51 --- /dev/null +++ b/arch/powerpc/include/asm/iseries/hv_call.h | |||
| @@ -0,0 +1,111 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2001 Mike Corrigan IBM Corporation | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License as published by | ||
| 6 | * the Free Software Foundation; either version 2 of the License, or | ||
| 7 | * (at your option) any later version. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope that it will be useful, | ||
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | * GNU General Public License for more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License | ||
| 15 | * along with this program; if not, write to the Free Software | ||
| 16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 17 | * | ||
| 18 | * This file contains the "hypervisor call" interface which is used to | ||
| 19 | * drive the hypervisor from the OS. | ||
| 20 | */ | ||
| 21 | #ifndef _ASM_POWERPC_ISERIES_HV_CALL_H | ||
| 22 | #define _ASM_POWERPC_ISERIES_HV_CALL_H | ||
| 23 | |||
| 24 | #include <asm/iseries/hv_call_sc.h> | ||
| 25 | #include <asm/iseries/hv_types.h> | ||
| 26 | #include <asm/paca.h> | ||
| 27 | |||
| 28 | /* Type of yield for HvCallBaseYieldProcessor */ | ||
| 29 | #define HvCall_YieldTimed 0 /* Yield until specified time (tb) */ | ||
| 30 | #define HvCall_YieldToActive 1 /* Yield until all active procs have run */ | ||
| 31 | #define HvCall_YieldToProc 2 /* Yield until the specified processor has run */ | ||
| 32 | |||
| 33 | /* interrupt masks for setEnabledInterrupts */ | ||
| 34 | #define HvCall_MaskIPI 0x00000001 | ||
| 35 | #define HvCall_MaskLpEvent 0x00000002 | ||
| 36 | #define HvCall_MaskLpProd 0x00000004 | ||
| 37 | #define HvCall_MaskTimeout 0x00000008 | ||
| 38 | |||
| 39 | /* Log buffer formats */ | ||
| 40 | #define HvCall_LogBuffer_ASCII 0 | ||
| 41 | #define HvCall_LogBuffer_EBCDIC 1 | ||
| 42 | |||
| 43 | #define HvCallBaseAckDeferredInts HvCallBase + 0 | ||
| 44 | #define HvCallBaseCpmPowerOff HvCallBase + 1 | ||
| 45 | #define HvCallBaseGetHwPatch HvCallBase + 2 | ||
| 46 | #define HvCallBaseReIplSpAttn HvCallBase + 3 | ||
| 47 | #define HvCallBaseSetASR HvCallBase + 4 | ||
| 48 | #define HvCallBaseSetASRAndRfi HvCallBase + 5 | ||
| 49 | #define HvCallBaseSetIMR HvCallBase + 6 | ||
| 50 | #define HvCallBaseSendIPI HvCallBase + 7 | ||
| 51 | #define HvCallBaseTerminateMachine HvCallBase + 8 | ||
| 52 | #define HvCallBaseTerminateMachineSrc HvCallBase + 9 | ||
| 53 | #define HvCallBaseProcessPlicInterrupts HvCallBase + 10 | ||
| 54 | #define HvCallBaseIsPrimaryCpmOrMsdIpl HvCallBase + 11 | ||
| 55 | #define HvCallBaseSetVirtualSIT HvCallBase + 12 | ||
| 56 | #define HvCallBaseVaryOffThisProcessor HvCallBase + 13 | ||
| 57 | #define HvCallBaseVaryOffMemoryChunk HvCallBase + 14 | ||
| 58 | #define HvCallBaseVaryOffInteractivePercentage HvCallBase + 15 | ||
| 59 | #define HvCallBaseSendLpProd HvCallBase + 16 | ||
| 60 | #define HvCallBaseSetEnabledInterrupts HvCallBase + 17 | ||
| 61 | #define HvCallBaseYieldProcessor HvCallBase + 18 | ||
| 62 | #define HvCallBaseVaryOffSharedProcUnits HvCallBase + 19 | ||
| 63 | #define HvCallBaseSetVirtualDecr HvCallBase + 20 | ||
| 64 | #define HvCallBaseClearLogBuffer HvCallBase + 21 | ||
| 65 | #define HvCallBaseGetLogBufferCodePage HvCallBase + 22 | ||
| 66 | #define HvCallBaseGetLogBufferFormat HvCallBase + 23 | ||
| 67 | #define HvCallBaseGetLogBufferLength HvCallBase + 24 | ||
| 68 | #define HvCallBaseReadLogBuffer HvCallBase + 25 | ||
| 69 | #define HvCallBaseSetLogBufferFormatAndCodePage HvCallBase + 26 | ||
| 70 | #define HvCallBaseWriteLogBuffer HvCallBase + 27 | ||
| 71 | #define HvCallBaseRouter28 HvCallBase + 28 | ||
| 72 | #define HvCallBaseRouter29 HvCallBase + 29 | ||
| 73 | #define HvCallBaseRouter30 HvCallBase + 30 | ||
| 74 | #define HvCallBaseSetDebugBus HvCallBase + 31 | ||
| 75 | |||
| 76 | #define HvCallCcSetDABR HvCallCc + 7 | ||
| 77 | |||
| 78 | static inline void HvCall_setVirtualDecr(void) | ||
| 79 | { | ||
| 80 | /* | ||
| 81 | * Ignore any error return codes - most likely means that the | ||
| 82 | * target value for the LP has been increased and this vary off | ||
| 83 | * would bring us below the new target. | ||
| 84 | */ | ||
| 85 | HvCall0(HvCallBaseSetVirtualDecr); | ||
| 86 | } | ||
| 87 | |||
| 88 | static inline void HvCall_yieldProcessor(unsigned typeOfYield, u64 yieldParm) | ||
| 89 | { | ||
| 90 | HvCall2(HvCallBaseYieldProcessor, typeOfYield, yieldParm); | ||
| 91 | } | ||
| 92 | |||
| 93 | static inline void HvCall_setEnabledInterrupts(u64 enabledInterrupts) | ||
| 94 | { | ||
| 95 | HvCall1(HvCallBaseSetEnabledInterrupts, enabledInterrupts); | ||
| 96 | } | ||
| 97 | |||
| 98 | static inline void HvCall_setLogBufferFormatAndCodepage(int format, | ||
| 99 | u32 codePage) | ||
| 100 | { | ||
| 101 | HvCall2(HvCallBaseSetLogBufferFormatAndCodePage, format, codePage); | ||
| 102 | } | ||
| 103 | |||
| 104 | extern void HvCall_writeLogBuffer(const void *buffer, u64 bufLen); | ||
| 105 | |||
| 106 | static inline void HvCall_sendIPI(struct paca_struct *targetPaca) | ||
| 107 | { | ||
| 108 | HvCall1(HvCallBaseSendIPI, targetPaca->paca_index); | ||
| 109 | } | ||
| 110 | |||
| 111 | #endif /* _ASM_POWERPC_ISERIES_HV_CALL_H */ | ||
diff --git a/arch/powerpc/include/asm/iseries/hv_call_event.h b/arch/powerpc/include/asm/iseries/hv_call_event.h new file mode 100644 index 00000000000..cc029d388e1 --- /dev/null +++ b/arch/powerpc/include/asm/iseries/hv_call_event.h | |||
| @@ -0,0 +1,201 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2001 Mike Corrigan IBM Corporation | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License as published by | ||
| 6 | * the Free Software Foundation; either version 2 of the License, or | ||
| 7 | * (at your option) any later version. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope that it will be useful, | ||
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | * GNU General Public License for more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License | ||
| 15 | * along with this program; if not, write to the Free Software | ||
| 16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 17 | * | ||
| 18 | * This file contains the "hypervisor call" interface which is used to | ||
| 19 | * drive the hypervisor from the OS. | ||
| 20 | */ | ||
| 21 | #ifndef _ASM_POWERPC_ISERIES_HV_CALL_EVENT_H | ||
| 22 | #define _ASM_POWERPC_ISERIES_HV_CALL_EVENT_H | ||
| 23 | |||
| 24 | #include <linux/types.h> | ||
| 25 | #include <linux/dma-mapping.h> | ||
| 26 | |||
| 27 | #include <asm/iseries/hv_call_sc.h> | ||
| 28 | #include <asm/iseries/hv_types.h> | ||
| 29 | #include <asm/abs_addr.h> | ||
| 30 | |||
| 31 | struct HvLpEvent; | ||
| 32 | |||
| 33 | typedef u8 HvLpEvent_Type; | ||
| 34 | typedef u8 HvLpEvent_AckInd; | ||
| 35 | typedef u8 HvLpEvent_AckType; | ||
| 36 | |||
| 37 | typedef u8 HvLpDma_Direction; | ||
| 38 | typedef u8 HvLpDma_AddressType; | ||
| 39 | |||
| 40 | typedef u64 HvLpEvent_Rc; | ||
| 41 | typedef u64 HvLpDma_Rc; | ||
| 42 | |||
| 43 | #define HvCallEventAckLpEvent HvCallEvent + 0 | ||
| 44 | #define HvCallEventCancelLpEvent HvCallEvent + 1 | ||
| 45 | #define HvCallEventCloseLpEventPath HvCallEvent + 2 | ||
| 46 | #define HvCallEventDmaBufList HvCallEvent + 3 | ||
| 47 | #define HvCallEventDmaSingle HvCallEvent + 4 | ||
| 48 | #define HvCallEventDmaToSp HvCallEvent + 5 | ||
| 49 | #define HvCallEventGetOverflowLpEvents HvCallEvent + 6 | ||
| 50 | #define HvCallEventGetSourceLpInstanceId HvCallEvent + 7 | ||
| 51 | #define HvCallEventGetTargetLpInstanceId HvCallEvent + 8 | ||
| 52 | #define HvCallEventOpenLpEventPath HvCallEvent + 9 | ||
| 53 | #define HvCallEventSetLpEventStack HvCallEvent + 10 | ||
| 54 | #define HvCallEventSignalLpEvent HvCallEvent + 11 | ||
| 55 | #define HvCallEventSignalLpEventParms HvCallEvent + 12 | ||
| 56 | #define HvCallEventSetInterLpQueueIndex HvCallEvent + 13 | ||
| 57 | #define HvCallEventSetLpEventQueueInterruptProc HvCallEvent + 14 | ||
| 58 | #define HvCallEventRouter15 HvCallEvent + 15 | ||
| 59 | |||
| 60 | static inline void HvCallEvent_getOverflowLpEvents(u8 queueIndex) | ||
| 61 | { | ||
| 62 | HvCall1(HvCallEventGetOverflowLpEvents, queueIndex); | ||
| 63 | } | ||
| 64 | |||
| 65 | static inline void HvCallEvent_setInterLpQueueIndex(u8 queueIndex) | ||
| 66 | { | ||
| 67 | HvCall1(HvCallEventSetInterLpQueueIndex, queueIndex); | ||
| 68 | } | ||
| 69 | |||
| 70 | static inline void HvCallEvent_setLpEventStack(u8 queueIndex, | ||
| 71 | char *eventStackAddr, u32 eventStackSize) | ||
| 72 | { | ||
| 73 | HvCall3(HvCallEventSetLpEventStack, queueIndex, | ||
| 74 | virt_to_abs(eventStackAddr), eventStackSize); | ||
| 75 | } | ||
| 76 | |||
| 77 | static inline void HvCallEvent_setLpEventQueueInterruptProc(u8 queueIndex, | ||
| 78 | u16 lpLogicalProcIndex) | ||
| 79 | { | ||
| 80 | HvCall2(HvCallEventSetLpEventQueueInterruptProc, queueIndex, | ||
| 81 | lpLogicalProcIndex); | ||
| 82 | } | ||
| 83 | |||
| 84 | static inline HvLpEvent_Rc HvCallEvent_signalLpEvent(struct HvLpEvent *event) | ||
| 85 | { | ||
| 86 | return HvCall1(HvCallEventSignalLpEvent, virt_to_abs(event)); | ||
| 87 | } | ||
| 88 | |||
| 89 | static inline HvLpEvent_Rc HvCallEvent_signalLpEventFast(HvLpIndex targetLp, | ||
| 90 | HvLpEvent_Type type, u16 subtype, HvLpEvent_AckInd ackInd, | ||
| 91 | HvLpEvent_AckType ackType, HvLpInstanceId sourceInstanceId, | ||
| 92 | HvLpInstanceId targetInstanceId, u64 correlationToken, | ||
| 93 | u64 eventData1, u64 eventData2, u64 eventData3, | ||
| 94 | u64 eventData4, u64 eventData5) | ||
| 95 | { | ||
| 96 | /* Pack the misc bits into a single Dword to pass to PLIC */ | ||
| 97 | union { | ||
| 98 | struct { | ||
| 99 | u8 ack_and_target; | ||
| 100 | u8 type; | ||
| 101 | u16 subtype; | ||
| 102 | HvLpInstanceId src_inst; | ||
| 103 | HvLpInstanceId target_inst; | ||
| 104 | } parms; | ||
| 105 | u64 dword; | ||
| 106 | } packed; | ||
| 107 | |||
| 108 | packed.parms.ack_and_target = (ackType << 7) | (ackInd << 6) | targetLp; | ||
| 109 | packed.parms.type = type; | ||
| 110 | packed.parms.subtype = subtype; | ||
| 111 | packed.parms.src_inst = sourceInstanceId; | ||
| 112 | packed.parms.target_inst = targetInstanceId; | ||
| 113 | |||
| 114 | return HvCall7(HvCallEventSignalLpEventParms, packed.dword, | ||
| 115 | correlationToken, eventData1, eventData2, | ||
| 116 | eventData3, eventData4, eventData5); | ||
| 117 | } | ||
| 118 | |||
| 119 | extern void *iseries_hv_alloc(size_t size, dma_addr_t *dma_handle, gfp_t flag); | ||
| 120 | extern void iseries_hv_free(size_t size, void *vaddr, dma_addr_t dma_handle); | ||
| 121 | extern dma_addr_t iseries_hv_map(void *vaddr, size_t size, | ||
| 122 | enum dma_data_direction direction); | ||
| 123 | extern void iseries_hv_unmap(dma_addr_t dma_handle, size_t size, | ||
| 124 | enum dma_data_direction direction); | ||
| 125 | |||
| 126 | static inline HvLpEvent_Rc HvCallEvent_ackLpEvent(struct HvLpEvent *event) | ||
| 127 | { | ||
| 128 | return HvCall1(HvCallEventAckLpEvent, virt_to_abs(event)); | ||
| 129 | } | ||
| 130 | |||
| 131 | static inline HvLpEvent_Rc HvCallEvent_cancelLpEvent(struct HvLpEvent *event) | ||
| 132 | { | ||
| 133 | return HvCall1(HvCallEventCancelLpEvent, virt_to_abs(event)); | ||
| 134 | } | ||
| 135 | |||
| 136 | static inline HvLpInstanceId HvCallEvent_getSourceLpInstanceId( | ||
| 137 | HvLpIndex targetLp, HvLpEvent_Type type) | ||
| 138 | { | ||
| 139 | return HvCall2(HvCallEventGetSourceLpInstanceId, targetLp, type); | ||
| 140 | } | ||
| 141 | |||
| 142 | static inline HvLpInstanceId HvCallEvent_getTargetLpInstanceId( | ||
| 143 | HvLpIndex targetLp, HvLpEvent_Type type) | ||
| 144 | { | ||
| 145 | return HvCall2(HvCallEventGetTargetLpInstanceId, targetLp, type); | ||
| 146 | } | ||
| 147 | |||
| 148 | static inline void HvCallEvent_openLpEventPath(HvLpIndex targetLp, | ||
| 149 | HvLpEvent_Type type) | ||
| 150 | { | ||
| 151 | HvCall2(HvCallEventOpenLpEventPath, targetLp, type); | ||
| 152 | } | ||
| 153 | |||
| 154 | static inline void HvCallEvent_closeLpEventPath(HvLpIndex targetLp, | ||
| 155 | HvLpEvent_Type type) | ||
| 156 | { | ||
| 157 | HvCall2(HvCallEventCloseLpEventPath, targetLp, type); | ||
| 158 | } | ||
| 159 | |||
| 160 | static inline HvLpDma_Rc HvCallEvent_dmaBufList(HvLpEvent_Type type, | ||
| 161 | HvLpIndex remoteLp, HvLpDma_Direction direction, | ||
| 162 | HvLpInstanceId localInstanceId, | ||
| 163 | HvLpInstanceId remoteInstanceId, | ||
| 164 | HvLpDma_AddressType localAddressType, | ||
| 165 | HvLpDma_AddressType remoteAddressType, | ||
| 166 | /* Do these need to be converted to absolute addresses? */ | ||
| 167 | u64 localBufList, u64 remoteBufList, u32 transferLength) | ||
| 168 | { | ||
| 169 | /* Pack the misc bits into a single Dword to pass to PLIC */ | ||
| 170 | union { | ||
| 171 | struct { | ||
| 172 | u8 flags; | ||
| 173 | HvLpIndex remote; | ||
| 174 | u8 type; | ||
| 175 | u8 reserved; | ||
| 176 | HvLpInstanceId local_inst; | ||
| 177 | HvLpInstanceId remote_inst; | ||
| 178 | } parms; | ||
| 179 | u64 dword; | ||
| 180 | } packed; | ||
| 181 | |||
| 182 | packed.parms.flags = (direction << 7) | | ||
| 183 | (localAddressType << 6) | (remoteAddressType << 5); | ||
| 184 | packed.parms.remote = remoteLp; | ||
| 185 | packed.parms.type = type; | ||
| 186 | packed.parms.reserved = 0; | ||
| 187 | packed.parms.local_inst = localInstanceId; | ||
| 188 | packed.parms.remote_inst = remoteInstanceId; | ||
| 189 | |||
| 190 | return HvCall4(HvCallEventDmaBufList, packed.dword, localBufList, | ||
| 191 | remoteBufList, transferLength); | ||
| 192 | } | ||
| 193 | |||
| 194 | static inline HvLpDma_Rc HvCallEvent_dmaToSp(void *local, u32 remote, | ||
| 195 | u32 length, HvLpDma_Direction dir) | ||
| 196 | { | ||
| 197 | return HvCall4(HvCallEventDmaToSp, virt_to_abs(local), remote, | ||
| 198 | length, dir); | ||
| 199 | } | ||
| 200 | |||
| 201 | #endif /* _ASM_POWERPC_ISERIES_HV_CALL_EVENT_H */ | ||
diff --git a/arch/powerpc/include/asm/iseries/hv_call_sc.h b/arch/powerpc/include/asm/iseries/hv_call_sc.h new file mode 100644 index 00000000000..f5d21095925 --- /dev/null +++ b/arch/powerpc/include/asm/iseries/hv_call_sc.h | |||
| @@ -0,0 +1,50 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2001 Mike Corrigan IBM Corporation | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License as published by | ||
| 6 | * the Free Software Foundation; either version 2 of the License, or | ||
| 7 | * (at your option) any later version. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope that it will be useful, | ||
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | * GNU General Public License for more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License | ||
| 15 | * along with this program; if not, write to the Free Software | ||
| 16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 17 | */ | ||
| 18 | #ifndef _ASM_POWERPC_ISERIES_HV_CALL_SC_H | ||
| 19 | #define _ASM_POWERPC_ISERIES_HV_CALL_SC_H | ||
| 20 | |||
| 21 | #include <linux/types.h> | ||
| 22 | |||
| 23 | #define HvCallBase 0x8000000000000000ul | ||
| 24 | #define HvCallCc 0x8001000000000000ul | ||
| 25 | #define HvCallCfg 0x8002000000000000ul | ||
| 26 | #define HvCallEvent 0x8003000000000000ul | ||
| 27 | #define HvCallHpt 0x8004000000000000ul | ||
| 28 | #define HvCallPci 0x8005000000000000ul | ||
| 29 | #define HvCallSm 0x8007000000000000ul | ||
| 30 | #define HvCallXm 0x8009000000000000ul | ||
| 31 | |||
| 32 | extern u64 HvCall0(u64); | ||
| 33 | extern u64 HvCall1(u64, u64); | ||
| 34 | extern u64 HvCall2(u64, u64, u64); | ||
| 35 | extern u64 HvCall3(u64, u64, u64, u64); | ||
| 36 | extern u64 HvCall4(u64, u64, u64, u64, u64); | ||
| 37 | extern u64 HvCall5(u64, u64, u64, u64, u64, u64); | ||
| 38 | extern u64 HvCall6(u64, u64, u64, u64, u64, u64, u64); | ||
| 39 | extern u64 HvCall7(u64, u64, u64, u64, u64, u64, u64, u64); | ||
| 40 | |||
| 41 | extern u64 HvCall0Ret16(u64, void *); | ||
| 42 | extern u64 HvCall1Ret16(u64, void *, u64); | ||
| 43 | extern u64 HvCall2Ret16(u64, void *, u64, u64); | ||
| 44 | extern u64 HvCall3Ret16(u64, void *, u64, u64, u64); | ||
| 45 | extern u64 HvCall4Ret16(u64, void *, u64, u64, u64, u64); | ||
| 46 | extern u64 HvCall5Ret16(u64, void *, u64, u64, u64, u64, u64); | ||
| 47 | extern u64 HvCall6Ret16(u64, void *, u64, u64, u64, u64, u64, u64); | ||
| 48 | extern u64 HvCall7Ret16(u64, void *, u64, u64 ,u64 ,u64 ,u64 ,u64 ,u64); | ||
| 49 | |||
| 50 | #endif /* _ASM_POWERPC_ISERIES_HV_CALL_SC_H */ | ||
diff --git a/arch/powerpc/include/asm/iseries/hv_call_xm.h b/arch/powerpc/include/asm/iseries/hv_call_xm.h new file mode 100644 index 00000000000..392ac3f54df --- /dev/null +++ b/arch/powerpc/include/asm/iseries/hv_call_xm.h | |||
| @@ -0,0 +1,61 @@ | |||
| 1 | /* | ||
| 2 | * This file contains the "hypervisor call" interface which is used to | ||
| 3 | * drive the hypervisor from SLIC. | ||
| 4 | */ | ||
| 5 | #ifndef _ASM_POWERPC_ISERIES_HV_CALL_XM_H | ||
| 6 | #define _ASM_POWERPC_ISERIES_HV_CALL_XM_H | ||
| 7 | |||
| 8 | #include <asm/iseries/hv_call_sc.h> | ||
| 9 | #include <asm/iseries/hv_types.h> | ||
| 10 | |||
| 11 | #define HvCallXmGetTceTableParms HvCallXm + 0 | ||
| 12 | #define HvCallXmTestBus HvCallXm + 1 | ||
| 13 | #define HvCallXmConnectBusUnit HvCallXm + 2 | ||
| 14 | #define HvCallXmLoadTod HvCallXm + 8 | ||
| 15 | #define HvCallXmTestBusUnit HvCallXm + 9 | ||
| 16 | #define HvCallXmSetTce HvCallXm + 11 | ||
| 17 | #define HvCallXmSetTces HvCallXm + 13 | ||
| 18 | |||
| 19 | static inline void HvCallXm_getTceTableParms(u64 cb) | ||
| 20 | { | ||
| 21 | HvCall1(HvCallXmGetTceTableParms, cb); | ||
| 22 | } | ||
| 23 | |||
| 24 | static inline u64 HvCallXm_setTce(u64 tceTableToken, u64 tceOffset, u64 tce) | ||
| 25 | { | ||
| 26 | return HvCall3(HvCallXmSetTce, tceTableToken, tceOffset, tce); | ||
| 27 | } | ||
| 28 | |||
| 29 | static inline u64 HvCallXm_setTces(u64 tceTableToken, u64 tceOffset, | ||
| 30 | u64 numTces, u64 tce1, u64 tce2, u64 tce3, u64 tce4) | ||
| 31 | { | ||
| 32 | return HvCall7(HvCallXmSetTces, tceTableToken, tceOffset, numTces, | ||
| 33 | tce1, tce2, tce3, tce4); | ||
| 34 | } | ||
| 35 | |||
| 36 | static inline u64 HvCallXm_testBus(u16 busNumber) | ||
| 37 | { | ||
| 38 | return HvCall1(HvCallXmTestBus, busNumber); | ||
| 39 | } | ||
| 40 | |||
| 41 | static inline u64 HvCallXm_testBusUnit(u16 busNumber, u8 subBusNumber, | ||
| 42 | u8 deviceId) | ||
| 43 | { | ||
| 44 | return HvCall2(HvCallXmTestBusUnit, busNumber, | ||
| 45 | (subBusNumber << 8) | deviceId); | ||
| 46 | } | ||
| 47 | |||
| 48 | static inline u64 HvCallXm_connectBusUnit(u16 busNumber, u8 subBusNumber, | ||
| 49 | u8 deviceId, u64 interruptToken) | ||
| 50 | { | ||
| 51 | return HvCall5(HvCallXmConnectBusUnit, busNumber, | ||
| 52 | (subBusNumber << 8) | deviceId, interruptToken, 0, | ||
| 53 | 0 /* HvLpConfig::mapDsaToQueueIndex(HvLpDSA(busNumber, xBoard, xCard)) */); | ||
| 54 | } | ||
| 55 | |||
| 56 | static inline u64 HvCallXm_loadTod(void) | ||
| 57 | { | ||
| 58 | return HvCall0(HvCallXmLoadTod); | ||
| 59 | } | ||
| 60 | |||
| 61 | #endif /* _ASM_POWERPC_ISERIES_HV_CALL_XM_H */ | ||
diff --git a/arch/powerpc/include/asm/iseries/hv_lp_config.h b/arch/powerpc/include/asm/iseries/hv_lp_config.h new file mode 100644 index 00000000000..a006fd1e4a2 --- /dev/null +++ b/arch/powerpc/include/asm/iseries/hv_lp_config.h | |||
| @@ -0,0 +1,128 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2001 Mike Corrigan IBM Corporation | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License as published by | ||
| 6 | * the Free Software Foundation; either version 2 of the License, or | ||
| 7 | * (at your option) any later version. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope that it will be useful, | ||
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | * GNU General Public License for more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License | ||
| 15 | * along with this program; if not, write to the Free Software | ||
| 16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 17 | */ | ||
| 18 | #ifndef _ASM_POWERPC_ISERIES_HV_LP_CONFIG_H | ||
| 19 | #define _ASM_POWERPC_ISERIES_HV_LP_CONFIG_H | ||
| 20 | |||
| 21 | /* | ||
| 22 | * This file contains the interface to the LPAR configuration data | ||
| 23 | * to determine which resources should be allocated to each partition. | ||
| 24 | */ | ||
| 25 | |||
| 26 | #include <asm/iseries/hv_call_sc.h> | ||
| 27 | #include <asm/iseries/hv_types.h> | ||
| 28 | |||
| 29 | enum { | ||
| 30 | HvCallCfg_Cur = 0, | ||
| 31 | HvCallCfg_Init = 1, | ||
| 32 | HvCallCfg_Max = 2, | ||
| 33 | HvCallCfg_Min = 3 | ||
| 34 | }; | ||
| 35 | |||
| 36 | #define HvCallCfgGetSystemPhysicalProcessors HvCallCfg + 6 | ||
| 37 | #define HvCallCfgGetPhysicalProcessors HvCallCfg + 7 | ||
| 38 | #define HvCallCfgGetMsChunks HvCallCfg + 9 | ||
| 39 | #define HvCallCfgGetSharedPoolIndex HvCallCfg + 20 | ||
| 40 | #define HvCallCfgGetSharedProcUnits HvCallCfg + 21 | ||
| 41 | #define HvCallCfgGetNumProcsInSharedPool HvCallCfg + 22 | ||
| 42 | #define HvCallCfgGetVirtualLanIndexMap HvCallCfg + 30 | ||
| 43 | #define HvCallCfgGetHostingLpIndex HvCallCfg + 32 | ||
| 44 | |||
| 45 | extern HvLpIndex HvLpConfig_getLpIndex_outline(void); | ||
| 46 | extern HvLpIndex HvLpConfig_getLpIndex(void); | ||
| 47 | extern HvLpIndex HvLpConfig_getPrimaryLpIndex(void); | ||
| 48 | |||
| 49 | static inline u64 HvLpConfig_getMsChunks(void) | ||
| 50 | { | ||
| 51 | return HvCall2(HvCallCfgGetMsChunks, HvLpConfig_getLpIndex(), | ||
| 52 | HvCallCfg_Cur); | ||
| 53 | } | ||
| 54 | |||
| 55 | static inline u64 HvLpConfig_getSystemPhysicalProcessors(void) | ||
| 56 | { | ||
| 57 | return HvCall0(HvCallCfgGetSystemPhysicalProcessors); | ||
| 58 | } | ||
| 59 | |||
| 60 | static inline u64 HvLpConfig_getNumProcsInSharedPool(HvLpSharedPoolIndex sPI) | ||
| 61 | { | ||
| 62 | return (u16)HvCall1(HvCallCfgGetNumProcsInSharedPool, sPI); | ||
| 63 | } | ||
| 64 | |||
| 65 | static inline u64 HvLpConfig_getPhysicalProcessors(void) | ||
| 66 | { | ||
| 67 | return HvCall2(HvCallCfgGetPhysicalProcessors, HvLpConfig_getLpIndex(), | ||
| 68 | HvCallCfg_Cur); | ||
| 69 | } | ||
| 70 | |||
| 71 | static inline HvLpSharedPoolIndex HvLpConfig_getSharedPoolIndex(void) | ||
| 72 | { | ||
| 73 | return HvCall1(HvCallCfgGetSharedPoolIndex, HvLpConfig_getLpIndex()); | ||
| 74 | } | ||
| 75 | |||
| 76 | static inline u64 HvLpConfig_getSharedProcUnits(void) | ||
| 77 | { | ||
| 78 | return HvCall2(HvCallCfgGetSharedProcUnits, HvLpConfig_getLpIndex(), | ||
| 79 | HvCallCfg_Cur); | ||
| 80 | } | ||
| 81 | |||
| 82 | static inline u64 HvLpConfig_getMaxSharedProcUnits(void) | ||
| 83 | { | ||
| 84 | return HvCall2(HvCallCfgGetSharedProcUnits, HvLpConfig_getLpIndex(), | ||
| 85 | HvCallCfg_Max); | ||
| 86 | } | ||
| 87 | |||
| 88 | static inline u64 HvLpConfig_getMaxPhysicalProcessors(void) | ||
| 89 | { | ||
| 90 | return HvCall2(HvCallCfgGetPhysicalProcessors, HvLpConfig_getLpIndex(), | ||
| 91 | HvCallCfg_Max); | ||
| 92 | } | ||
| 93 | |||
| 94 | static inline HvLpVirtualLanIndexMap HvLpConfig_getVirtualLanIndexMapForLp( | ||
| 95 | HvLpIndex lp) | ||
| 96 | { | ||
| 97 | /* | ||
| 98 | * This is a new function in V5R1 so calls to this on older | ||
| 99 | * hypervisors will return -1 | ||
| 100 | */ | ||
| 101 | u64 retVal = HvCall1(HvCallCfgGetVirtualLanIndexMap, lp); | ||
| 102 | if (retVal == -1) | ||
| 103 | retVal = 0; | ||
| 104 | return retVal; | ||
| 105 | } | ||
| 106 | |||
| 107 | static inline HvLpVirtualLanIndexMap HvLpConfig_getVirtualLanIndexMap(void) | ||
| 108 | { | ||
| 109 | return HvLpConfig_getVirtualLanIndexMapForLp( | ||
| 110 | HvLpConfig_getLpIndex_outline()); | ||
| 111 | } | ||
| 112 | |||
| 113 | static inline int HvLpConfig_doLpsCommunicateOnVirtualLan(HvLpIndex lp1, | ||
| 114 | HvLpIndex lp2) | ||
| 115 | { | ||
| 116 | HvLpVirtualLanIndexMap virtualLanIndexMap1 = | ||
| 117 | HvLpConfig_getVirtualLanIndexMapForLp(lp1); | ||
| 118 | HvLpVirtualLanIndexMap virtualLanIndexMap2 = | ||
| 119 | HvLpConfig_getVirtualLanIndexMapForLp(lp2); | ||
| 120 | return ((virtualLanIndexMap1 & virtualLanIndexMap2) != 0); | ||
| 121 | } | ||
| 122 | |||
| 123 | static inline HvLpIndex HvLpConfig_getHostingLpIndex(HvLpIndex lp) | ||
| 124 | { | ||
| 125 | return HvCall1(HvCallCfgGetHostingLpIndex, lp); | ||
| 126 | } | ||
| 127 | |||
| 128 | #endif /* _ASM_POWERPC_ISERIES_HV_LP_CONFIG_H */ | ||
diff --git a/arch/powerpc/include/asm/iseries/hv_lp_event.h b/arch/powerpc/include/asm/iseries/hv_lp_event.h new file mode 100644 index 00000000000..8f5da7d7720 --- /dev/null +++ b/arch/powerpc/include/asm/iseries/hv_lp_event.h | |||
| @@ -0,0 +1,162 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2001 Mike Corrigan IBM Corporation | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License as published by | ||
| 6 | * the Free Software Foundation; either version 2 of the License, or | ||
| 7 | * (at your option) any later version. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope that it will be useful, | ||
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | * GNU General Public License for more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License | ||
| 15 | * along with this program; if not, write to the Free Software | ||
| 16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 17 | */ | ||
| 18 | |||
| 19 | /* This file contains the class for HV events in the system. */ | ||
| 20 | |||
| 21 | #ifndef _ASM_POWERPC_ISERIES_HV_LP_EVENT_H | ||
| 22 | #define _ASM_POWERPC_ISERIES_HV_LP_EVENT_H | ||
| 23 | |||
| 24 | #include <asm/types.h> | ||
| 25 | #include <asm/ptrace.h> | ||
| 26 | #include <asm/iseries/hv_types.h> | ||
| 27 | #include <asm/iseries/hv_call_event.h> | ||
| 28 | |||
| 29 | /* | ||
| 30 | * HvLpEvent is the structure for Lp Event messages passed between | ||
| 31 | * partitions through PLIC. | ||
| 32 | */ | ||
| 33 | |||
| 34 | struct HvLpEvent { | ||
| 35 | u8 flags; /* Event flags x00-x00 */ | ||
| 36 | u8 xType; /* Type of message x01-x01 */ | ||
| 37 | u16 xSubtype; /* Subtype for event x02-x03 */ | ||
| 38 | u8 xSourceLp; /* Source LP x04-x04 */ | ||
| 39 | u8 xTargetLp; /* Target LP x05-x05 */ | ||
| 40 | u8 xSizeMinus1; /* Size of Derived class - 1 x06-x06 */ | ||
| 41 | u8 xRc; /* RC for Ack flows x07-x07 */ | ||
| 42 | u16 xSourceInstanceId; /* Source sides instance id x08-x09 */ | ||
| 43 | u16 xTargetInstanceId; /* Target sides instance id x0A-x0B */ | ||
| 44 | union { | ||
| 45 | u32 xSubtypeData; /* Data usable by the subtype x0C-x0F */ | ||
| 46 | u16 xSubtypeDataShort[2]; /* Data as 2 shorts */ | ||
| 47 | u8 xSubtypeDataChar[4]; /* Data as 4 chars */ | ||
| 48 | } x; | ||
| 49 | |||
| 50 | u64 xCorrelationToken; /* Unique value for source/type x10-x17 */ | ||
| 51 | }; | ||
| 52 | |||
| 53 | typedef void (*LpEventHandler)(struct HvLpEvent *); | ||
| 54 | |||
| 55 | /* Register a handler for an event type - returns 0 on success */ | ||
| 56 | extern int HvLpEvent_registerHandler(HvLpEvent_Type eventType, | ||
| 57 | LpEventHandler hdlr); | ||
| 58 | |||
| 59 | /* | ||
| 60 | * Unregister a handler for an event type | ||
| 61 | * | ||
| 62 | * This call will sleep until the handler being removed is guaranteed to | ||
| 63 | * be no longer executing on any CPU. Do not call with locks held. | ||
| 64 | * | ||
| 65 | * returns 0 on success | ||
| 66 | * Unregister will fail if there are any paths open for the type | ||
| 67 | */ | ||
| 68 | extern int HvLpEvent_unregisterHandler(HvLpEvent_Type eventType); | ||
| 69 | |||
| 70 | /* | ||
| 71 | * Open an Lp Event Path for an event type | ||
| 72 | * returns 0 on success | ||
| 73 | * openPath will fail if there is no handler registered for the event type. | ||
| 74 | * The lpIndex specified is the partition index for the target partition | ||
| 75 | * (for VirtualIo, VirtualLan and SessionMgr) other types specify zero) | ||
| 76 | */ | ||
| 77 | extern int HvLpEvent_openPath(HvLpEvent_Type eventType, HvLpIndex lpIndex); | ||
| 78 | |||
| 79 | /* | ||
| 80 | * Close an Lp Event Path for a type and partition | ||
| 81 | * returns 0 on success | ||
| 82 | */ | ||
| 83 | extern int HvLpEvent_closePath(HvLpEvent_Type eventType, HvLpIndex lpIndex); | ||
| 84 | |||
| 85 | #define HvLpEvent_Type_Hypervisor 0 | ||
| 86 | #define HvLpEvent_Type_MachineFac 1 | ||
| 87 | #define HvLpEvent_Type_SessionMgr 2 | ||
| 88 | #define HvLpEvent_Type_SpdIo 3 | ||
| 89 | #define HvLpEvent_Type_VirtualBus 4 | ||
| 90 | #define HvLpEvent_Type_PciIo 5 | ||
| 91 | #define HvLpEvent_Type_RioIo 6 | ||
| 92 | #define HvLpEvent_Type_VirtualLan 7 | ||
| 93 | #define HvLpEvent_Type_VirtualIo 8 | ||
| 94 | #define HvLpEvent_Type_NumTypes 9 | ||
| 95 | |||
| 96 | #define HvLpEvent_Rc_Good 0 | ||
| 97 | #define HvLpEvent_Rc_BufferNotAvailable 1 | ||
| 98 | #define HvLpEvent_Rc_Cancelled 2 | ||
| 99 | #define HvLpEvent_Rc_GenericError 3 | ||
| 100 | #define HvLpEvent_Rc_InvalidAddress 4 | ||
| 101 | #define HvLpEvent_Rc_InvalidPartition 5 | ||
| 102 | #define HvLpEvent_Rc_InvalidSize 6 | ||
| 103 | #define HvLpEvent_Rc_InvalidSubtype 7 | ||
| 104 | #define HvLpEvent_Rc_InvalidSubtypeData 8 | ||
| 105 | #define HvLpEvent_Rc_InvalidType 9 | ||
| 106 | #define HvLpEvent_Rc_PartitionDead 10 | ||
| 107 | #define HvLpEvent_Rc_PathClosed 11 | ||
| 108 | #define HvLpEvent_Rc_SubtypeError 12 | ||
| 109 | |||
| 110 | #define HvLpEvent_Function_Ack 0 | ||
| 111 | #define HvLpEvent_Function_Int 1 | ||
| 112 | |||
| 113 | #define HvLpEvent_AckInd_NoAck 0 | ||
| 114 | #define HvLpEvent_AckInd_DoAck 1 | ||
| 115 | |||
| 116 | #define HvLpEvent_AckType_ImmediateAck 0 | ||
| 117 | #define HvLpEvent_AckType_DeferredAck 1 | ||
| 118 | |||
| 119 | #define HV_LP_EVENT_INT 0x01 | ||
| 120 | #define HV_LP_EVENT_DO_ACK 0x02 | ||
| 121 | #define HV_LP_EVENT_DEFERRED_ACK 0x04 | ||
| 122 | #define HV_LP_EVENT_VALID 0x80 | ||
| 123 | |||
| 124 | #define HvLpDma_Direction_LocalToRemote 0 | ||
| 125 | #define HvLpDma_Direction_RemoteToLocal 1 | ||
| 126 | |||
| 127 | #define HvLpDma_AddressType_TceIndex 0 | ||
| 128 | #define HvLpDma_AddressType_RealAddress 1 | ||
| 129 | |||
| 130 | #define HvLpDma_Rc_Good 0 | ||
| 131 | #define HvLpDma_Rc_Error 1 | ||
| 132 | #define HvLpDma_Rc_PartitionDead 2 | ||
| 133 | #define HvLpDma_Rc_PathClosed 3 | ||
| 134 | #define HvLpDma_Rc_InvalidAddress 4 | ||
| 135 | #define HvLpDma_Rc_InvalidLength 5 | ||
| 136 | |||
| 137 | static inline int hvlpevent_is_valid(struct HvLpEvent *h) | ||
| 138 | { | ||
| 139 | return h->flags & HV_LP_EVENT_VALID; | ||
| 140 | } | ||
| 141 | |||
| 142 | static inline void hvlpevent_invalidate(struct HvLpEvent *h) | ||
| 143 | { | ||
| 144 | h->flags &= ~ HV_LP_EVENT_VALID; | ||
| 145 | } | ||
| 146 | |||
| 147 | static inline int hvlpevent_is_int(struct HvLpEvent *h) | ||
| 148 | { | ||
| 149 | return h->flags & HV_LP_EVENT_INT; | ||
| 150 | } | ||
| 151 | |||
| 152 | static inline int hvlpevent_is_ack(struct HvLpEvent *h) | ||
| 153 | { | ||
| 154 | return !hvlpevent_is_int(h); | ||
| 155 | } | ||
| 156 | |||
| 157 | static inline int hvlpevent_need_ack(struct HvLpEvent *h) | ||
| 158 | { | ||
| 159 | return h->flags & HV_LP_EVENT_DO_ACK; | ||
| 160 | } | ||
| 161 | |||
| 162 | #endif /* _ASM_POWERPC_ISERIES_HV_LP_EVENT_H */ | ||
diff --git a/arch/powerpc/include/asm/iseries/hv_types.h b/arch/powerpc/include/asm/iseries/hv_types.h new file mode 100644 index 00000000000..c3e6d2a1d1c --- /dev/null +++ b/arch/powerpc/include/asm/iseries/hv_types.h | |||
| @@ -0,0 +1,112 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2001 Mike Corrigan IBM Corporation | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License as published by | ||
| 6 | * the Free Software Foundation; either version 2 of the License, or | ||
| 7 | * (at your option) any later version. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope that it will be useful, | ||
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | * GNU General Public License for more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License | ||
| 15 | * along with this program; if not, write to the Free Software | ||
| 16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 17 | */ | ||
| 18 | #ifndef _ASM_POWERPC_ISERIES_HV_TYPES_H | ||
| 19 | #define _ASM_POWERPC_ISERIES_HV_TYPES_H | ||
| 20 | |||
| 21 | /* | ||
| 22 | * General typedefs for the hypervisor. | ||
| 23 | */ | ||
| 24 | |||
| 25 | #include <asm/types.h> | ||
| 26 | |||
| 27 | typedef u8 HvLpIndex; | ||
| 28 | typedef u16 HvLpInstanceId; | ||
| 29 | typedef u64 HvLpTOD; | ||
| 30 | typedef u64 HvLpSystemSerialNum; | ||
| 31 | typedef u8 HvLpDeviceSerialNum[12]; | ||
| 32 | typedef u16 HvLpSanHwSet; | ||
| 33 | typedef u16 HvLpBus; | ||
| 34 | typedef u16 HvLpBoard; | ||
| 35 | typedef u16 HvLpCard; | ||
| 36 | typedef u8 HvLpDeviceType[4]; | ||
| 37 | typedef u8 HvLpDeviceModel[3]; | ||
| 38 | typedef u64 HvIoToken; | ||
| 39 | typedef u8 HvLpName[8]; | ||
| 40 | typedef u32 HvIoId; | ||
| 41 | typedef u64 HvRealMemoryIndex; | ||
| 42 | typedef u32 HvLpIndexMap; /* Must hold HVMAXARCHITECTEDLPS bits!!! */ | ||
| 43 | typedef u16 HvLpVrmIndex; | ||
| 44 | typedef u32 HvXmGenerationId; | ||
| 45 | typedef u8 HvLpBusPool; | ||
| 46 | typedef u8 HvLpSharedPoolIndex; | ||
| 47 | typedef u16 HvLpSharedProcUnitsX100; | ||
| 48 | typedef u8 HvLpVirtualLanIndex; | ||
| 49 | typedef u16 HvLpVirtualLanIndexMap; /* Must hold HVMAXARCHITECTEDVIRTUALLANS bits!!! */ | ||
| 50 | typedef u16 HvBusNumber; /* Hypervisor Bus Number */ | ||
| 51 | typedef u8 HvSubBusNumber; /* Hypervisor SubBus Number */ | ||
| 52 | typedef u8 HvAgentId; /* Hypervisor DevFn */ | ||
| 53 | |||
| 54 | |||
| 55 | #define HVMAXARCHITECTEDLPS 32 | ||
| 56 | #define HVMAXARCHITECTEDVIRTUALLANS 16 | ||
| 57 | #define HVMAXARCHITECTEDVIRTUALDISKS 32 | ||
| 58 | #define HVMAXARCHITECTEDVIRTUALCDROMS 8 | ||
| 59 | #define HVMAXARCHITECTEDVIRTUALTAPES 8 | ||
| 60 | #define HVCHUNKSIZE (256 * 1024) | ||
| 61 | #define HVPAGESIZE (4 * 1024) | ||
| 62 | #define HVLPMINMEGSPRIMARY 256 | ||
| 63 | #define HVLPMINMEGSSECONDARY 64 | ||
| 64 | #define HVCHUNKSPERMEG 4 | ||
| 65 | #define HVPAGESPERMEG 256 | ||
| 66 | #define HVPAGESPERCHUNK 64 | ||
| 67 | |||
| 68 | #define HvLpIndexInvalid ((HvLpIndex)0xff) | ||
| 69 | |||
| 70 | /* | ||
| 71 | * Enums for the sub-components under PLIC | ||
| 72 | * Used in HvCall and HvPrimaryCall | ||
| 73 | */ | ||
| 74 | enum { | ||
| 75 | HvCallCompId = 0, | ||
| 76 | HvCallCpuCtlsCompId = 1, | ||
| 77 | HvCallCfgCompId = 2, | ||
| 78 | HvCallEventCompId = 3, | ||
| 79 | HvCallHptCompId = 4, | ||
| 80 | HvCallPciCompId = 5, | ||
| 81 | HvCallSlmCompId = 6, | ||
| 82 | HvCallSmCompId = 7, | ||
| 83 | HvCallSpdCompId = 8, | ||
| 84 | HvCallXmCompId = 9, | ||
| 85 | HvCallRioCompId = 10, | ||
| 86 | HvCallRsvd3CompId = 11, | ||
| 87 | HvCallRsvd2CompId = 12, | ||
| 88 | HvCallRsvd1CompId = 13, | ||
| 89 | HvCallMaxCompId = 14, | ||
| 90 | HvPrimaryCallCompId = 0, | ||
| 91 | HvPrimaryCallCfgCompId = 1, | ||
| 92 | HvPrimaryCallPciCompId = 2, | ||
| 93 | HvPrimaryCallSmCompId = 3, | ||
| 94 | HvPrimaryCallSpdCompId = 4, | ||
| 95 | HvPrimaryCallXmCompId = 5, | ||
| 96 | HvPrimaryCallRioCompId = 6, | ||
| 97 | HvPrimaryCallRsvd7CompId = 7, | ||
| 98 | HvPrimaryCallRsvd6CompId = 8, | ||
| 99 | HvPrimaryCallRsvd5CompId = 9, | ||
| 100 | HvPrimaryCallRsvd4CompId = 10, | ||
| 101 | HvPrimaryCallRsvd3CompId = 11, | ||
| 102 | HvPrimaryCallRsvd2CompId = 12, | ||
| 103 | HvPrimaryCallRsvd1CompId = 13, | ||
| 104 | HvPrimaryCallMaxCompId = HvCallMaxCompId | ||
| 105 | }; | ||
| 106 | |||
| 107 | struct HvLpBufferList { | ||
| 108 | u64 addr; | ||
| 109 | u64 len; | ||
| 110 | }; | ||
| 111 | |||
| 112 | #endif /* _ASM_POWERPC_ISERIES_HV_TYPES_H */ | ||
diff --git a/arch/powerpc/include/asm/iseries/iommu.h b/arch/powerpc/include/asm/iseries/iommu.h new file mode 100644 index 00000000000..1b9692c6089 --- /dev/null +++ b/arch/powerpc/include/asm/iseries/iommu.h | |||
| @@ -0,0 +1,37 @@ | |||
| 1 | #ifndef _ASM_POWERPC_ISERIES_IOMMU_H | ||
| 2 | #define _ASM_POWERPC_ISERIES_IOMMU_H | ||
| 3 | |||
| 4 | /* | ||
| 5 | * Copyright (C) 2005 Stephen Rothwell, IBM Corporation | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License as published by | ||
| 9 | * the Free Software Foundation; either version 2 of the License, or | ||
| 10 | * (at your option) any later version. | ||
| 11 | * | ||
| 12 | * This program is distributed in the hope that it will be useful, | ||
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 15 | * GNU General Public License for more details. | ||
| 16 | * | ||
| 17 | * You should have received a copy of the GNU General Public License | ||
| 18 | * along with this program; if not, write to the: | ||
| 19 | * Free Software Foundation, Inc., | ||
| 20 | * 59 Temple Place, Suite 330, | ||
| 21 | * Boston, MA 02111-1307 USA | ||
| 22 | */ | ||
| 23 | |||
| 24 | struct pci_dev; | ||
| 25 | struct vio_dev; | ||
| 26 | struct device_node; | ||
| 27 | struct iommu_table; | ||
| 28 | |||
| 29 | /* Get table parameters from HV */ | ||
| 30 | extern void iommu_table_getparms_iSeries(unsigned long busno, | ||
| 31 | unsigned char slotno, unsigned char virtbus, | ||
| 32 | struct iommu_table *tbl); | ||
| 33 | |||
| 34 | extern struct iommu_table *vio_build_iommu_table_iseries(struct vio_dev *dev); | ||
| 35 | extern void iommu_vio_init(void); | ||
| 36 | |||
| 37 | #endif /* _ASM_POWERPC_ISERIES_IOMMU_H */ | ||
diff --git a/arch/powerpc/include/asm/iseries/it_lp_queue.h b/arch/powerpc/include/asm/iseries/it_lp_queue.h new file mode 100644 index 00000000000..42827883882 --- /dev/null +++ b/arch/powerpc/include/asm/iseries/it_lp_queue.h | |||
| @@ -0,0 +1,78 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2001 Mike Corrigan IBM Corporation | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License as published by | ||
| 6 | * the Free Software Foundation; either version 2 of the License, or | ||
| 7 | * (at your option) any later version. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope that it will be useful, | ||
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | * GNU General Public License for more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License | ||
| 15 | * along with this program; if not, write to the Free Software | ||
| 16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 17 | */ | ||
| 18 | #ifndef _ASM_POWERPC_ISERIES_IT_LP_QUEUE_H | ||
| 19 | #define _ASM_POWERPC_ISERIES_IT_LP_QUEUE_H | ||
| 20 | |||
| 21 | /* | ||
| 22 | * This control block defines the simple LP queue structure that is | ||
| 23 | * shared between the hypervisor (PLIC) and the OS in order to send | ||
| 24 | * events to an LP. | ||
| 25 | */ | ||
| 26 | |||
| 27 | #include <asm/types.h> | ||
| 28 | #include <asm/ptrace.h> | ||
| 29 | |||
| 30 | #define IT_LP_MAX_QUEUES 8 | ||
| 31 | |||
| 32 | #define IT_LP_NOT_USED 0 /* Queue will not be used by PLIC */ | ||
| 33 | #define IT_LP_DEDICATED_IO 1 /* Queue dedicated to IO processor specified */ | ||
| 34 | #define IT_LP_DEDICATED_LP 2 /* Queue dedicated to LP specified */ | ||
| 35 | #define IT_LP_SHARED 3 /* Queue shared for both IO and LP */ | ||
| 36 | |||
| 37 | #define IT_LP_EVENT_STACK_SIZE 4096 | ||
| 38 | #define IT_LP_EVENT_MAX_SIZE 256 | ||
| 39 | #define IT_LP_EVENT_ALIGN 64 | ||
| 40 | |||
| 41 | struct hvlpevent_queue { | ||
| 42 | /* | ||
| 43 | * The hq_current_event is the pointer to the next event stack entry | ||
| 44 | * that will become valid. The OS must peek at this entry to determine | ||
| 45 | * if it is valid. PLIC will set the valid indicator as the very last | ||
| 46 | * store into that entry. | ||
| 47 | * | ||
| 48 | * When the OS has completed processing of the event then it will mark | ||
| 49 | * the event as invalid so that PLIC knows it can store into that event | ||
| 50 | * location again. | ||
| 51 | * | ||
| 52 | * If the event stack fills and there are overflow events, then PLIC | ||
| 53 | * will set the hq_overflow_pending flag in which case the OS will | ||
| 54 | * have to fetch the additional LP events once they have drained the | ||
| 55 | * event stack. | ||
| 56 | * | ||
| 57 | * The first 16-bytes are known by both the OS and PLIC. The remainder | ||
| 58 | * of the cache line is for use by the OS. | ||
| 59 | */ | ||
| 60 | u8 hq_overflow_pending; /* 0x00 Overflow events are pending */ | ||
| 61 | u8 hq_status; /* 0x01 DedicatedIo or DedicatedLp or NotUsed */ | ||
| 62 | u16 hq_proc_index; /* 0x02 Logical Proc Index for correlation */ | ||
| 63 | u8 hq_reserved1[12]; /* 0x04 */ | ||
| 64 | char *hq_current_event; /* 0x10 */ | ||
| 65 | char *hq_last_event; /* 0x18 */ | ||
| 66 | char *hq_event_stack; /* 0x20 */ | ||
| 67 | u8 hq_index; /* 0x28 unique sequential index. */ | ||
| 68 | u8 hq_reserved2[3]; /* 0x29-2b */ | ||
| 69 | spinlock_t hq_lock; | ||
| 70 | }; | ||
| 71 | |||
| 72 | extern struct hvlpevent_queue hvlpevent_queue; | ||
| 73 | |||
| 74 | extern int hvlpevent_is_pending(void); | ||
| 75 | extern void process_hvlpevents(void); | ||
| 76 | extern void setup_hvlpevent_queue(void); | ||
| 77 | |||
| 78 | #endif /* _ASM_POWERPC_ISERIES_IT_LP_QUEUE_H */ | ||
diff --git a/arch/powerpc/include/asm/iseries/lpar_map.h b/arch/powerpc/include/asm/iseries/lpar_map.h new file mode 100644 index 00000000000..5e9f3e128ee --- /dev/null +++ b/arch/powerpc/include/asm/iseries/lpar_map.h | |||
| @@ -0,0 +1,85 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2001 Mike Corrigan IBM Corporation | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License as published by | ||
| 6 | * the Free Software Foundation; either version 2 of the License, or | ||
| 7 | * (at your option) any later version. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope that it will be useful, | ||
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | * GNU General Public License for more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License | ||
| 15 | * along with this program; if not, write to the Free Software | ||
| 16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 17 | */ | ||
| 18 | #ifndef _ASM_POWERPC_ISERIES_LPAR_MAP_H | ||
| 19 | #define _ASM_POWERPC_ISERIES_LPAR_MAP_H | ||
| 20 | |||
| 21 | #ifndef __ASSEMBLY__ | ||
| 22 | |||
| 23 | #include <asm/types.h> | ||
| 24 | |||
| 25 | #endif | ||
| 26 | |||
| 27 | /* | ||
| 28 | * The iSeries hypervisor will set up mapping for one or more | ||
| 29 | * ESID/VSID pairs (in SLB/segment registers) and will set up | ||
| 30 | * mappings of one or more ranges of pages to VAs. | ||
| 31 | * We will have the hypervisor set up the ESID->VSID mapping | ||
| 32 | * for the four kernel segments (C-F). With shared processors, | ||
| 33 | * the hypervisor will clear all segment registers and reload | ||
| 34 | * these four whenever the processor is switched from one | ||
| 35 | * partition to another. | ||
| 36 | */ | ||
| 37 | |||
| 38 | /* The Vsid and Esid identified below will be used by the hypervisor | ||
| 39 | * to set up a memory mapping for part of the load area before giving | ||
| 40 | * control to the Linux kernel. The load area is 64 MB, but this must | ||
| 41 | * not attempt to map the whole load area. The Hashed Page Table may | ||
| 42 | * need to be located within the load area (if the total partition size | ||
| 43 | * is 64 MB), but cannot be mapped. Typically, this should specify | ||
| 44 | * to map half (32 MB) of the load area. | ||
| 45 | * | ||
| 46 | * The hypervisor will set up page table entries for the number of | ||
| 47 | * pages specified. | ||
| 48 | * | ||
| 49 | * In 32-bit mode, the hypervisor will load all four of the | ||
| 50 | * segment registers (identified by the low-order four bits of the | ||
| 51 | * Esid field. In 64-bit mode, the hypervisor will load one SLB | ||
| 52 | * entry to map the Esid to the Vsid. | ||
| 53 | */ | ||
| 54 | |||
| 55 | #define HvEsidsToMap 2 | ||
| 56 | #define HvRangesToMap 1 | ||
| 57 | |||
| 58 | /* Hypervisor initially maps 32MB of the load area */ | ||
| 59 | #define HvPagesToMap 8192 | ||
| 60 | |||
| 61 | #ifndef __ASSEMBLY__ | ||
| 62 | struct LparMap { | ||
| 63 | u64 xNumberEsids; // Number of ESID/VSID pairs | ||
| 64 | u64 xNumberRanges; // Number of VA ranges to map | ||
| 65 | u64 xSegmentTableOffs; // Page number within load area of seg table | ||
| 66 | u64 xRsvd[5]; | ||
| 67 | struct { | ||
| 68 | u64 xKernelEsid; // Esid used to map kernel load | ||
| 69 | u64 xKernelVsid; // Vsid used to map kernel load | ||
| 70 | } xEsids[HvEsidsToMap]; | ||
| 71 | struct { | ||
| 72 | u64 xPages; // Number of pages to be mapped | ||
| 73 | u64 xOffset; // Offset from start of load area | ||
| 74 | u64 xVPN; // Virtual Page Number | ||
| 75 | } xRanges[HvRangesToMap]; | ||
| 76 | }; | ||
| 77 | |||
| 78 | extern const struct LparMap xLparMap; | ||
| 79 | |||
| 80 | #endif /* __ASSEMBLY__ */ | ||
| 81 | |||
| 82 | /* the fixed address where the LparMap exists */ | ||
| 83 | #define LPARMAP_PHYS 0x7000 | ||
| 84 | |||
| 85 | #endif /* _ASM_POWERPC_ISERIES_LPAR_MAP_H */ | ||
diff --git a/arch/powerpc/include/asm/iseries/mf.h b/arch/powerpc/include/asm/iseries/mf.h new file mode 100644 index 00000000000..eb851a9c9e5 --- /dev/null +++ b/arch/powerpc/include/asm/iseries/mf.h | |||
| @@ -0,0 +1,51 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2001 Troy D. Armstrong IBM Corporation | ||
| 3 | * Copyright (C) 2004 Stephen Rothwell IBM Corporation | ||
| 4 | * | ||
| 5 | * This modules exists as an interface between a Linux secondary partition | ||
| 6 | * running on an iSeries and the primary partition's Virtual Service | ||
| 7 | * Processor (VSP) object. The VSP has final authority over powering on/off | ||
| 8 | * all partitions in the iSeries. It also provides miscellaneous low-level | ||
| 9 | * machine facility type operations. | ||
| 10 | * | ||
| 11 | * This program is free software; you can redistribute it and/or modify | ||
| 12 | * it under the terms of the GNU General Public License as published by | ||
| 13 | * the Free Software Foundation; either version 2 of the License, or | ||
| 14 | * (at your option) any later version. | ||
| 15 | * | ||
| 16 | * This program is distributed in the hope that it will be useful, | ||
| 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 19 | * GNU General Public License for more details. | ||
| 20 | * | ||
| 21 | * You should have received a copy of the GNU General Public License | ||
| 22 | * along with this program; if not, write to the Free Software | ||
| 23 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 24 | */ | ||
| 25 | #ifndef _ASM_POWERPC_ISERIES_MF_H | ||
| 26 | #define _ASM_POWERPC_ISERIES_MF_H | ||
| 27 | |||
| 28 | #include <linux/types.h> | ||
| 29 | |||
| 30 | #include <asm/iseries/hv_types.h> | ||
| 31 | #include <asm/iseries/hv_call_event.h> | ||
| 32 | |||
| 33 | struct rtc_time; | ||
| 34 | |||
| 35 | typedef void (*MFCompleteHandler)(void *clientToken, int returnCode); | ||
| 36 | |||
| 37 | extern void mf_allocate_lp_events(HvLpIndex targetLp, HvLpEvent_Type type, | ||
| 38 | unsigned size, unsigned amount, MFCompleteHandler hdlr, | ||
| 39 | void *userToken); | ||
| 40 | extern void mf_deallocate_lp_events(HvLpIndex targetLp, HvLpEvent_Type type, | ||
| 41 | unsigned count, MFCompleteHandler hdlr, void *userToken); | ||
| 42 | |||
| 43 | extern void mf_power_off(void); | ||
| 44 | extern void mf_reboot(char *cmd); | ||
| 45 | |||
| 46 | extern void mf_display_src(u32 word); | ||
| 47 | extern void mf_display_progress(u16 value); | ||
| 48 | |||
| 49 | extern void mf_init(void); | ||
| 50 | |||
| 51 | #endif /* _ASM_POWERPC_ISERIES_MF_H */ | ||
diff --git a/arch/powerpc/include/asm/iseries/vio.h b/arch/powerpc/include/asm/iseries/vio.h new file mode 100644 index 00000000000..f9ac0d00b95 --- /dev/null +++ b/arch/powerpc/include/asm/iseries/vio.h | |||
| @@ -0,0 +1,265 @@ | |||
| 1 | /* -*- linux-c -*- | ||
| 2 | * | ||
| 3 | * iSeries Virtual I/O Message Path header | ||
| 4 | * | ||
| 5 | * Authors: Dave Boutcher <boutcher@us.ibm.com> | ||
| 6 | * Ryan Arnold <ryanarn@us.ibm.com> | ||
| 7 | * Colin Devilbiss <devilbis@us.ibm.com> | ||
| 8 | * | ||
| 9 | * (C) Copyright 2000 IBM Corporation | ||
| 10 | * | ||
| 11 | * This header file is used by the iSeries virtual I/O device | ||
| 12 | * drivers. It defines the interfaces to the common functions | ||
| 13 | * (implemented in drivers/char/viopath.h) as well as defining | ||
| 14 | * common functions and structures. Currently (at the time I | ||
| 15 | * wrote this comment) the iSeries virtual I/O device drivers | ||
| 16 | * that use this are | ||
| 17 | * drivers/block/viodasd.c | ||
| 18 | * drivers/char/viocons.c | ||
| 19 | * drivers/char/viotape.c | ||
| 20 | * drivers/cdrom/viocd.c | ||
| 21 | * | ||
| 22 | * The iSeries virtual ethernet support (veth.c) uses a whole | ||
| 23 | * different set of functions. | ||
| 24 | * | ||
| 25 | * This program is free software; you can redistribute it and/or | ||
| 26 | * modify it under the terms of the GNU General Public License as | ||
| 27 | * published by the Free Software Foundation; either version 2 of the | ||
| 28 | * License, or (at your option) anyu later version. | ||
| 29 | * | ||
| 30 | * This program is distributed in the hope that it will be useful, but | ||
| 31 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 32 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 33 | * General Public License for more details. | ||
| 34 | * | ||
| 35 | * You should have received a copy of the GNU General Public License | ||
| 36 | * along with this program; if not, write to the Free Software Foundation, | ||
| 37 | * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 38 | * | ||
| 39 | */ | ||
| 40 | #ifndef _ASM_POWERPC_ISERIES_VIO_H | ||
| 41 | #define _ASM_POWERPC_ISERIES_VIO_H | ||
| 42 | |||
| 43 | #include <asm/iseries/hv_types.h> | ||
| 44 | #include <asm/iseries/hv_lp_event.h> | ||
| 45 | |||
| 46 | /* | ||
| 47 | * iSeries virtual I/O events use the subtype field in | ||
| 48 | * HvLpEvent to figure out what kind of vio event is coming | ||
| 49 | * in. We use a table to route these, and this defines | ||
| 50 | * the maximum number of distinct subtypes | ||
| 51 | */ | ||
| 52 | #define VIO_MAX_SUBTYPES 8 | ||
| 53 | |||
| 54 | #define VIOMAXBLOCKDMA 12 | ||
| 55 | |||
| 56 | struct open_data { | ||
| 57 | u64 disk_size; | ||
| 58 | u16 max_disk; | ||
| 59 | u16 cylinders; | ||
| 60 | u16 tracks; | ||
| 61 | u16 sectors; | ||
| 62 | u16 bytes_per_sector; | ||
| 63 | }; | ||
| 64 | |||
| 65 | struct rw_data { | ||
| 66 | u64 offset; | ||
| 67 | struct { | ||
| 68 | u32 token; | ||
| 69 | u32 reserved; | ||
| 70 | u64 len; | ||
| 71 | } dma_info[VIOMAXBLOCKDMA]; | ||
| 72 | }; | ||
| 73 | |||
| 74 | struct vioblocklpevent { | ||
| 75 | struct HvLpEvent event; | ||
| 76 | u32 reserved; | ||
| 77 | u16 version; | ||
| 78 | u16 sub_result; | ||
| 79 | u16 disk; | ||
| 80 | u16 flags; | ||
| 81 | union { | ||
| 82 | struct open_data open_data; | ||
| 83 | struct rw_data rw_data; | ||
| 84 | u64 changed; | ||
| 85 | } u; | ||
| 86 | }; | ||
| 87 | |||
| 88 | #define vioblockflags_ro 0x0001 | ||
| 89 | |||
| 90 | enum vioblocksubtype { | ||
| 91 | vioblockopen = 0x0001, | ||
| 92 | vioblockclose = 0x0002, | ||
| 93 | vioblockread = 0x0003, | ||
| 94 | vioblockwrite = 0x0004, | ||
| 95 | vioblockflush = 0x0005, | ||
| 96 | vioblockcheck = 0x0007 | ||
| 97 | }; | ||
| 98 | |||
| 99 | struct viocdlpevent { | ||
| 100 | struct HvLpEvent event; | ||
| 101 | u32 reserved; | ||
| 102 | u16 version; | ||
| 103 | u16 sub_result; | ||
| 104 | u16 disk; | ||
| 105 | u16 flags; | ||
| 106 | u32 token; | ||
| 107 | u64 offset; /* On open, max number of disks */ | ||
| 108 | u64 len; /* On open, size of the disk */ | ||
| 109 | u32 block_size; /* Only set on open */ | ||
| 110 | u32 media_size; /* Only set on open */ | ||
| 111 | }; | ||
| 112 | |||
| 113 | enum viocdsubtype { | ||
| 114 | viocdopen = 0x0001, | ||
| 115 | viocdclose = 0x0002, | ||
| 116 | viocdread = 0x0003, | ||
| 117 | viocdwrite = 0x0004, | ||
| 118 | viocdlockdoor = 0x0005, | ||
| 119 | viocdgetinfo = 0x0006, | ||
| 120 | viocdcheck = 0x0007 | ||
| 121 | }; | ||
| 122 | |||
| 123 | struct viotapelpevent { | ||
| 124 | struct HvLpEvent event; | ||
| 125 | u32 reserved; | ||
| 126 | u16 version; | ||
| 127 | u16 sub_type_result; | ||
| 128 | u16 tape; | ||
| 129 | u16 flags; | ||
| 130 | u32 token; | ||
| 131 | u64 len; | ||
| 132 | union { | ||
| 133 | struct { | ||
| 134 | u32 tape_op; | ||
| 135 | u32 count; | ||
| 136 | } op; | ||
| 137 | struct { | ||
| 138 | u32 type; | ||
| 139 | u32 resid; | ||
| 140 | u32 dsreg; | ||
| 141 | u32 gstat; | ||
| 142 | u32 erreg; | ||
| 143 | u32 file_no; | ||
| 144 | u32 block_no; | ||
| 145 | } get_status; | ||
| 146 | struct { | ||
| 147 | u32 block_no; | ||
| 148 | } get_pos; | ||
| 149 | } u; | ||
| 150 | }; | ||
| 151 | |||
| 152 | enum viotapesubtype { | ||
| 153 | viotapeopen = 0x0001, | ||
| 154 | viotapeclose = 0x0002, | ||
| 155 | viotaperead = 0x0003, | ||
| 156 | viotapewrite = 0x0004, | ||
| 157 | viotapegetinfo = 0x0005, | ||
| 158 | viotapeop = 0x0006, | ||
| 159 | viotapegetpos = 0x0007, | ||
| 160 | viotapesetpos = 0x0008, | ||
| 161 | viotapegetstatus = 0x0009 | ||
| 162 | }; | ||
| 163 | |||
| 164 | /* | ||
| 165 | * Each subtype can register a handler to process their events. | ||
| 166 | * The handler must have this interface. | ||
| 167 | */ | ||
| 168 | typedef void (vio_event_handler_t) (struct HvLpEvent * event); | ||
| 169 | |||
| 170 | extern int viopath_open(HvLpIndex remoteLp, int subtype, int numReq); | ||
| 171 | extern int viopath_close(HvLpIndex remoteLp, int subtype, int numReq); | ||
| 172 | extern int vio_setHandler(int subtype, vio_event_handler_t * beh); | ||
| 173 | extern int vio_clearHandler(int subtype); | ||
| 174 | extern int viopath_isactive(HvLpIndex lp); | ||
| 175 | extern HvLpInstanceId viopath_sourceinst(HvLpIndex lp); | ||
| 176 | extern HvLpInstanceId viopath_targetinst(HvLpIndex lp); | ||
| 177 | extern void vio_set_hostlp(void); | ||
| 178 | extern void *vio_get_event_buffer(int subtype); | ||
| 179 | extern void vio_free_event_buffer(int subtype, void *buffer); | ||
| 180 | |||
| 181 | extern struct vio_dev *vio_create_viodasd(u32 unit); | ||
| 182 | |||
| 183 | extern HvLpIndex viopath_hostLp; | ||
| 184 | extern HvLpIndex viopath_ourLp; | ||
| 185 | |||
| 186 | #define VIOCHAR_MAX_DATA 200 | ||
| 187 | |||
| 188 | #define VIOMAJOR_SUBTYPE_MASK 0xff00 | ||
| 189 | #define VIOMINOR_SUBTYPE_MASK 0x00ff | ||
| 190 | #define VIOMAJOR_SUBTYPE_SHIFT 8 | ||
| 191 | |||
| 192 | #define VIOVERSION 0x0101 | ||
| 193 | |||
| 194 | /* | ||
| 195 | * This is the general structure for VIO errors; each module should have | ||
| 196 | * a table of them, and each table should be terminated by an entry of | ||
| 197 | * { 0, 0, NULL }. Then, to find a specific error message, a module | ||
| 198 | * should pass its local table and the return code. | ||
| 199 | */ | ||
| 200 | struct vio_error_entry { | ||
| 201 | u16 rc; | ||
| 202 | int errno; | ||
| 203 | const char *msg; | ||
| 204 | }; | ||
| 205 | extern const struct vio_error_entry *vio_lookup_rc( | ||
| 206 | const struct vio_error_entry *local_table, u16 rc); | ||
| 207 | |||
| 208 | enum viosubtypes { | ||
| 209 | viomajorsubtype_monitor = 0x0100, | ||
| 210 | viomajorsubtype_blockio = 0x0200, | ||
| 211 | viomajorsubtype_chario = 0x0300, | ||
| 212 | viomajorsubtype_config = 0x0400, | ||
| 213 | viomajorsubtype_cdio = 0x0500, | ||
| 214 | viomajorsubtype_tape = 0x0600, | ||
| 215 | viomajorsubtype_scsi = 0x0700 | ||
| 216 | }; | ||
| 217 | |||
| 218 | enum vioconfigsubtype { | ||
| 219 | vioconfigget = 0x0001, | ||
| 220 | }; | ||
| 221 | |||
| 222 | enum viorc { | ||
| 223 | viorc_good = 0x0000, | ||
| 224 | viorc_noConnection = 0x0001, | ||
| 225 | viorc_noReceiver = 0x0002, | ||
| 226 | viorc_noBufferAvailable = 0x0003, | ||
| 227 | viorc_invalidMessageType = 0x0004, | ||
| 228 | viorc_invalidRange = 0x0201, | ||
| 229 | viorc_invalidToken = 0x0202, | ||
| 230 | viorc_DMAError = 0x0203, | ||
| 231 | viorc_useError = 0x0204, | ||
| 232 | viorc_releaseError = 0x0205, | ||
| 233 | viorc_invalidDisk = 0x0206, | ||
| 234 | viorc_openRejected = 0x0301 | ||
| 235 | }; | ||
| 236 | |||
| 237 | /* | ||
| 238 | * The structure of the events that flow between us and OS/400 for chario | ||
| 239 | * events. You can't mess with this unless the OS/400 side changes too. | ||
| 240 | */ | ||
| 241 | struct viocharlpevent { | ||
| 242 | struct HvLpEvent event; | ||
| 243 | u32 reserved; | ||
| 244 | u16 version; | ||
| 245 | u16 subtype_result_code; | ||
| 246 | u8 virtual_device; | ||
| 247 | u8 len; | ||
| 248 | u8 data[VIOCHAR_MAX_DATA]; | ||
| 249 | }; | ||
| 250 | |||
| 251 | #define VIOCHAR_WINDOW 10 | ||
| 252 | |||
| 253 | enum viocharsubtype { | ||
| 254 | viocharopen = 0x0001, | ||
| 255 | viocharclose = 0x0002, | ||
| 256 | viochardata = 0x0003, | ||
| 257 | viocharack = 0x0004, | ||
| 258 | viocharconfig = 0x0005 | ||
| 259 | }; | ||
| 260 | |||
| 261 | enum viochar_rc { | ||
| 262 | viochar_rc_ebusy = 1 | ||
| 263 | }; | ||
| 264 | |||
| 265 | #endif /* _ASM_POWERPC_ISERIES_VIO_H */ | ||
