📄 sysalib.s
字号:
isync /* context sync req'd before tlbie */sysALoop: tlbie p0 addi p0,p0,0x1000 /* increment bits 15-19 */ bdnz sysALoop /* decrement CTR, branch if CTR != 0 */ sync /* sync instr req'd after tlbie */ /* initialize Small Data Area (SDA) start address */#if FALSE /* XXX TPR NO SDA for now */ lis r2, HI(_SDA2_BASE_) addi r2, r2, LO(_SDA2_BASE_) lis r13, HI(_SDA_BASE_) addi r13, r13, LO(_SDA_BASE_)#endif addi sp, sp, -FRAMEBASESZ /* get frame stack */ li r3, BOOT_WARM_AUTOBOOT b usrInit /* never returns - starts up kernel */FUNC_END(_sysInit)/******************************************************************************* sysInByte - reads a byte from an io address.** This function reads a byte from a specified io address.** RETURNS: byte from address.* UCHAR sysInByte* (* UCHAR * pAddr /@ Virtual I/O addr to read from @/* )*/FUNC_BEGIN(sysInByte) eieio /* Sync I/O operation */ sync lbzx p0,r0,p0 /* Read byte from I/O space */ bclr 20,0 /* Return to caller */FUNC_END(sysInByte)/******************************************************************************** sysOutByte - writes a byte to an io address.** This function writes a byte to a specified io address.** RETURNS: N/A* VOID sysOutByte* (* UCHAR * pAddr, /@ Virtual I/O addr to write to @/* UCHAR data /@ data to be written @/* )*/FUNC_BEGIN(sysOutByte) stbx p1,r0,p0 /* Write a byte to PCI space */ eieio /* Sync I/O operation */ sync bclr 20,0 /* Return to caller */FUNC_END(sysOutByte)/******************************************************************************* sysInWord - reads a word from an address, swapping the bytes.** This function reads a swapped word from a specified * address.** RETURNS:* Returns swapped 16 bit data from the specified address.* USHORT sysInWord* (* ULONG address, /@ addr to read from @/* )*/FUNC_BEGIN(sysInWord) eieio /* Sync I/O operation */ sync lhbrx p0,r0,p0 /* Read and swap */ bclr 20,0 /* Return to caller */FUNC_END(sysInWord)/******************************************************************************* sysOutWord - writes a word to an address swapping the bytes.** This function writes a swapped word to a specified * address.** RETURNS: N/A* VOID sysOutWord* (* ULONG address, /@ Virtual addr to write to @/* UINT16 data /@ Data to be written @/* )*/FUNC_BEGIN(sysOutWord) sthbrx p1,r0,p0 /* Write with swap to address */ eieio /* Sync I/O operation */ sync bclr 20,0 /* Return to caller */FUNC_END(sysOutWord)/******************************************************************************* sysInLong - reads a long from an address.** This function reads a long from a specified PCI Config Space (little-endian)* address.** RETURNS:* Returns 32 bit data from the specified register. Note that for PCI systems* if no target responds, the data returned to the CPU will be 0xffffffff.* ULONG sysInLong* (* ULONG address, /@ Virtual addr to read from @/* )*/FUNC_BEGIN(sysInLong) eieio /* Sync I/O operation */ sync lwbrx p0,r0,p0 /* Read and swap from address */ bclr 20,0 /* Return to caller */FUNC_END(sysInLong)/******************************************************************************** sysOutLong - write a swapped long to address.** This routine will store a 32-bit data item (input as big-endian)* into an address in little-endian mode.** RETURNS: N/A* VOID sysOutLong* (* ULONG address, /@ Virtual addr to write to @/* ULONG data /@ Data to be written @/* )*/FUNC_BEGIN(sysOutLong) stwbrx p1,r0,p0 /* store data as little-endian */ eieio /* Sync I/O operation */ sync bclr 20,0FUNC_END(sysOutLong)/******************************************************************************** sysPciRead32 - read 32 bit PCI data** This routine will read a 32-bit data item from PCI (I/O or* memory) space.** RETURNS: N/A* VOID sysPciRead32* (* ULONG * pAddr, /@ Virtual addr to read from @/* ULONG * pResult /@ location to receive data @/* )*/FUNC_BEGIN(sysPciRead32) eieio /* Sync I/O operation */ lwbrx p0,r0,p0 /* get the data and swap the bytes */ stw p0,0(p1) /* store into address ptd. to by p1 */ bclr 20,0FUNC_END(sysPciRead32)/******************************************************************************** sysPciWrite32 - write a 32 bit data item to PCI space** This routine will store a 32-bit data item (input as big-endian)* into PCI (I/O or memory) space in little-endian mode.** RETURNS: N/A* VOID sysPciWrite32* (* ULONG * pAddr, /@ Virtual addr to write to @/* ULONG data /@ Data to be written @/* )*/FUNC_BEGIN(sysPciWrite32) stwbrx p1,r0,p0 /* store data as little-endian */ bclr 20,0FUNC_END(sysPciWrite32)/******************************************************************************* sysPciInByte - reads a byte from PCI Config Space.** This function reads a byte from a specified PCI Config Space address.** RETURNS:* Returns 8 bit data from the specified register. Note that for PCI systems* if no target responds, the data returned to the CPU will be 0xff.* UINT8 sysPciInByte* (* UINT8 * pAddr, /@ Virtual addr to read from @/* )*/FUNC_BEGIN(sysPciInByte) eieio /* Sync I/O operation */ lbzx p0,r0,p0 /* Read byte from PCI space */ bclr 20,0 /* Return to caller */FUNC_END(sysPciInByte)/******************************************************************************* sysPciInWord - reads a word (16-bit big-endian) from PCI Config Space.** This function reads a word from a specified PCI Config Space (little-endian)* address.** RETURNS:* Returns 16 bit data from the specified register. Note that for PCI systems* if no target responds, the data returned to the CPU will be 0xffff.* USHORT sysPciInWord* (* USHORT * pAddr, /@ Virtual addr to read from @/* )*/FUNC_BEGIN(sysPciInWord) eieio /* Sync I/O operation */ lhbrx p0,r0,p0 /* Read and swap from PCI space */ bclr 20,0 /* Return to caller */FUNC_END(sysPciInWord)/******************************************************************************* sysPciInLong - reads a long (32-bit big-endian) from PCI Config Space.** This function reads a long from a specified PCI Config Space (little-endian)* address.** RETURNS:* Returns 32 bit data from the specified register. Note that for PCI systems* if no target responds, the data returned to the CPU will be 0xffffffff.* ULONG sysPciInLong* (* ULONG * pAddr, /@ Virtual addr to read from @/* )*/FUNC_BEGIN(sysPciInLong) eieio /* Sync I/O operation */ lwbrx p0,r0,p0 /* Read and swap from PCI space */ bclr 20,0 /* Return to caller */FUNC_END(sysPciInLong)/******************************************************************************** sysPciOutByte - writes a byte to PCI Config Space.** This function writes a byte to a specified PCI Config Space address.** RETURNS: N/A* VOID sysPciOutByte* (* UINT8 * pAddr, /@ Virtual addr to write to @/* UINT8 data /@ Data to be written @/* )*/FUNC_BEGIN(sysPciOutByte) stbx p1,r0,p0 /* Write a byte to PCI space */ bclr 20,0 /* Return to caller */FUNC_END(sysPciOutByte)/******************************************************************************** sysPciOutWord - writes a word (16-bit big-endian) to PCI Config Space.** This function writes a word to a specified PCI Config Space (little-endian)* address.** RETURNS: N/A* VOID sysPciOutWord* (* USHORT * pAddr, /@ Virtual addr to write to @/* USHORT data /@ Data to be written @/* )*/FUNC_BEGIN(sysPciOutWord) sthbrx p1,r0,p0 /* Write with swap to PCI space */ bclr 20,0 /* Return to caller */FUNC_END(sysPciOutWord)/******************************************************************************** sysPciOutLong - writes a long (32-bit big-endian) to PCI Config Space.** This function writes a long to a specified PCI Config Space (little-endian)* address.** RETURNS: N/A* VOID sysPciOutLong* (* ULONG * pAddr, /@ Virtual addr to write to @/* ULONG data /@ Data to be written @/* )*/FUNC_BEGIN(sysPciOutLong) stwbrx p1,r0,p0 /* Write big-endian long to little-endian */ mr p0,p1 /* PCI space */ bclr 20,0 /* Return to caller */FUNC_END(sysPciOutLong)/********************************************************************************* sysMemProbeSup - sysBusProbe support routine** This routine is called to try to read byte, word, or long, as specified* by length, from the specified source to the specified destination.** RETURNS: OK if successful probe, else ERROR* STATUS sysMemProbeSup* (* int length, /@ length of cell to test (1, 2, 4) @/* char * src, /@ address to read @/* char * dest /@ address to write @/* )*/FUNC_BEGIN(sysMemProbeSup) addi p7, p0, 0 /* save length to p7 */ xor p0, p0, p0 /* set return status */ cmpwi p7, 1 /* check for byte access */ bne sbpShort /* no, go check for short word access */ lbz p6, 0(p1) /* load byte from source */ stb p6, 0(p2) /* store byte to destination */ isync /* enforce for immediate exception handling */ blrsbpShort: cmpwi p7, 2 /* check for short word access */ bne sbpWord /* no, check for word access */ lhz p6, 0(p1) /* load half word from source */ sth p6, 0(p2) /* store half word to destination */ isync /* enforce for immediate exception handling */ blrsbpWord: cmpwi p7, 4 /* check for short word access */ bne sysProbeExc /* no, check for double word access */ lwz p6, 0(p1) /* load half word from source */ stw p6, 0(p2) /* store half word to destination */ isync /* enforce for immediate exception handling */ blrsysProbeExc: li p0, -1 /* shouldn't ever get here, but... */ blrFUNC_END(sysMemProbeSup)/********************************************************************** * sysPVRReadSys - Read the content of the PVR register * Once the PVR is read, the 16 least significant bits are shifted * off. * Input - None * Return - upper 16 bits of PVR stored in r3 */FUNC_BEGIN(sysPVRReadSys)/* mfspr r4, PVR_REG*/ /* read PVR *//* srwi r3, r4, 16*/ /* shift off the least 16 bits */ mfspr r3, PVR /* read PVR */ blrFUNC_END(sysPVRReadSys)/********************************************************************************* sysSioRead - this function reads a register from the UIO chip** In order to read data from the desired Super IO register, the index register* must be written to with the offset of the of the register to be read. The * desired byte of data is then read from the data register.** RETURNS: byte read from data register** From a C point of view, the routine is defined as follows:UINT8 sysSioRead ( UINT8 * pSioIndexReg, /@ pointer to SIO index register base addr @/ UINT8 sioRegOffset /@ offset of register to read from @/ )*/FUNC_BEGIN(sysSioRead) stb r4,0(r3) /* write index register with register offset */ eieio sync lbz r3,1(r3) /* retrieve specified reg offset contents */ eieio sync bclr 20,0 /* return to caller */FUNC_END(sysSioRead)/********************************************************************************* sysSioWrite - this function writes a register to the UIO chip** In order to write data to the desired Super IO register, the index* register must be written to with the offset of the of the register to be* modified. The desired byte of data can then be written via the data* register.** RETURNS: N/A** From a C point of view, the routine is defined as follows:void sysSioWrite ( UINT8 * pSioIndexReg, /@ pointer to SIO index register base addr @/ UINT8 sioRegOffset, /@ offset of register to write to @/ UINT8 data /@ 8-bit data to be written @/ )*/FUNC_BEGIN(sysSioWrite) stb r4,0(r3) /* write index register with register offset */ eieio sync stb r5,1(r3) /* 1st write */ eieio sync stb r5,1(r3) /* 2nd write */ eieio sync bclr 20,0 /* return to caller */FUNC_END(sysSioWrite)#if defined(INCLUDE_CACHE_L2) #include "sysL2BackCache.s"#endif#if !defined(SP8240)#include "sysCacheLockALib.s"#endif#if defined(INCLUDE_CACHE_L3) #include "sysL3Cache.s"#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -