| /***************************************************************************** |
| * |
| * Copyright (C) 2012 Advanced Micro Devices, Inc. |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are met: |
| * * Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * * Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * * Neither the name of Advanced Micro Devices, Inc. nor the names of |
| * its contributors may be used to endorse or promote products derived |
| * from this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
| * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| * DISCLAIMED. IN NO EVENT SHALL ADVANCED MICRO DEVICES, INC. BE LIABLE FOR ANY |
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| * |
| * |
| ***************************************************************************/ |
| |
| |
| #include "Platform.h" |
| |
| |
| void |
| ReadPMIO ( |
| UINT8 Address, |
| UINT8 OpFlag, |
| void* Value |
| ) |
| { |
| UINT8 i; |
| |
| OpFlag = OpFlag & 0x7f; |
| if (OpFlag == 0x02) OpFlag = 0x03; |
| for (i=0;i<=OpFlag;i++){ |
| WriteIO(0xCD6, AccWidthUint8, &Address); // SB_IOMAP_REGCD6 |
| Address++; |
| ReadIO(0xCD7, AccWidthUint8, (UINT8 *)Value+i); // SB_IOMAP_REGCD7 |
| } |
| } |
| |
| |
| void |
| WritePMIO ( |
| UINT8 Address, |
| UINT8 OpFlag, |
| void* Value |
| ) |
| { |
| UINT8 i; |
| |
| OpFlag = OpFlag & 0x7f; |
| if (OpFlag == 0x02) OpFlag = 0x03; |
| for (i=0;i<=OpFlag;i++){ |
| WriteIO(0xCD6, AccWidthUint8, &Address); // SB_IOMAP_REGCD6 |
| Address++; |
| WriteIO(0xCD7, AccWidthUint8, (UINT8 *)Value+i); // SB_IOMAP_REGCD7 |
| } |
| } |
| |
| |
| void |
| RWPMIO ( |
| UINT8 Address, |
| UINT8 OpFlag, |
| UINT32 AndMask, |
| UINT32 OrMask |
| ) |
| { |
| UINT32 Result; |
| |
| OpFlag = OpFlag & 0x7f; |
| ReadPMIO(Address,OpFlag,&Result); |
| Result = (Result & AndMask)| OrMask; |
| WritePMIO(Address,OpFlag,&Result); |
| } |
| |
| |
| void |
| ReadPMIO2 ( |
| UINT8 Address, |
| UINT8 OpFlag, |
| void* Value |
| ) |
| { |
| UINT8 i; |
| |
| OpFlag = OpFlag & 0x7f; |
| if (OpFlag == 0x02) OpFlag = 0x03; |
| for (i=0;i<=OpFlag;i++){ |
| WriteIO(0xCD0, AccWidthUint8, &Address); // SB_IOMAP_REGCD0 |
| Address++; |
| ReadIO(0xCD1, AccWidthUint8, (UINT8 *)Value+i); // SB_IOMAP_REGCD1 |
| } |
| } |
| |
| |
| void |
| WritePMIO2 ( |
| UINT8 Address, |
| UINT8 OpFlag, |
| void* Value |
| ) |
| { |
| UINT8 i; |
| |
| OpFlag = OpFlag & 0x7f; |
| if (OpFlag == 0x02) OpFlag = 0x03; |
| for (i=0;i<=OpFlag;i++){ |
| WriteIO(0xCD0, AccWidthUint8, &Address); // SB_IOMAP_REGCD0 |
| Address++; |
| WriteIO(0xCD1, AccWidthUint8, (UINT8 *)Value+i); // SB_IOMAP_REGCD1 |
| } |
| } |
| |
| |
| void |
| RWPMIO2 ( |
| UINT8 Address, |
| UINT8 OpFlag, |
| UINT32 AndMask, |
| UINT32 OrMask |
| ) |
| { |
| UINT32 Result; |
| |
| OpFlag = OpFlag & 0x7f; |
| ReadPMIO2(Address,OpFlag,&Result); |
| Result = (Result & AndMask)| OrMask; |
| WritePMIO2(Address,OpFlag,&Result); |
| } |
| |
| |
| void |
| EnterEcConfig() |
| { |
| UINT16 dwEcIndexPort; |
| |
| ReadPCI((LPC_BUS_DEV_FUN << 16) + SB_LPC_REGA4, AccWidthUint16 | S3_SAVE, &dwEcIndexPort); |
| dwEcIndexPort &= ~(UINT16)(BIT0); |
| RWIO(dwEcIndexPort, AccWidthUint8, 0x00, 0x5A); |
| } |
| |
| void |
| ExitEcConfig() |
| { |
| UINT16 dwEcIndexPort; |
| |
| ReadPCI((LPC_BUS_DEV_FUN << 16) + SB_LPC_REGA4, AccWidthUint16 | S3_SAVE, &dwEcIndexPort); |
| dwEcIndexPort &= ~(UINT16)(BIT0); |
| RWIO(dwEcIndexPort, AccWidthUint8, 0x00, 0xA5); |
| } |
| |
| |
| void |
| ReadEC8 ( |
| UINT8 Address, |
| UINT8* Value |
| ) |
| { |
| UINT16 dwEcIndexPort; |
| |
| ReadPCI((LPC_BUS_DEV_FUN << 16) + SB_LPC_REGA4, AccWidthUint16 | S3_SAVE, &dwEcIndexPort); |
| dwEcIndexPort &= ~(UINT16)(BIT0); |
| WriteIO(dwEcIndexPort, AccWidthUint8, &Address); // SB_IOMAP_REGCD6 |
| ReadIO(dwEcIndexPort+1, AccWidthUint8, Value); // SB_IOMAP_REGCD7 |
| } |
| |
| |
| void |
| WriteEC8 ( |
| UINT8 Address, |
| UINT8* Value |
| ) |
| { |
| UINT16 dwEcIndexPort; |
| |
| ReadPCI((LPC_BUS_DEV_FUN << 16) + SB_LPC_REGA4, AccWidthUint16 | S3_SAVE, &dwEcIndexPort); |
| dwEcIndexPort &= ~(UINT16)(BIT0); |
| WriteIO(dwEcIndexPort, AccWidthUint8, &Address); // SB_IOMAP_REGCD6 |
| WriteIO(dwEcIndexPort+1, AccWidthUint8, Value); // SB_IOMAP_REGCD7 |
| } |
| |
| |
| void |
| RWEC8 ( |
| UINT8 Address, |
| UINT8 AndMask, |
| UINT8 OrMask |
| ) |
| { |
| UINT8 Result; |
| ReadEC8(Address,&Result); |
| Result = (Result & AndMask)| OrMask; |
| WriteEC8(Address, &Result); |
| } |
| |
| |
| void |
| programPciByteTable ( |
| REG8MASK* pPciByteTable, |
| UINT16 dwTableSize |
| ) |
| { |
| UINT8 i, dbBusNo, dbDevFnNo; |
| UINT32 ddBDFR; |
| |
| dbBusNo = pPciByteTable->bRegIndex; |
| dbDevFnNo = pPciByteTable->bANDMask; |
| pPciByteTable++; |
| for (i = 1; i < dwTableSize; i++){ |
| if ( (pPciByteTable->bRegIndex==0xFF) && (pPciByteTable->bANDMask==0xFF) && (pPciByteTable->bORMask==0xFF) ){ |
| pPciByteTable++; |
| dbBusNo = pPciByteTable->bRegIndex; |
| dbDevFnNo = pPciByteTable->bANDMask; |
| } |
| else{ |
| ddBDFR = (dbBusNo << 24) + (dbDevFnNo << 16) + (pPciByteTable->bRegIndex) ; |
| TRACE((DMSG_SB_TRACE, "PFA=%X AND=%X, OR=%X\n", ddBDFR, pPciByteTable->bANDMask, pPciByteTable->bORMask)); |
| RWPCI(ddBDFR, AccWidthUint8 | S3_SAVE, pPciByteTable->bANDMask, pPciByteTable->bORMask); |
| pPciByteTable++; |
| } |
| } |
| } |
| |
| |
| void |
| programPmioByteTable ( |
| REG8MASK* pPmioByteTable, |
| UINT16 dwTableSize |
| ) |
| { |
| UINT8 i; |
| for (i = 0; i < dwTableSize; i++){ |
| TRACE((DMSG_SB_TRACE, "PMIO Reg = %X AndMask = %X OrMask = %X\n",pPmioByteTable->bRegIndex,pPmioByteTable->bANDMask, pPmioByteTable->bORMask)); |
| RWPMIO(pPmioByteTable->bRegIndex, AccWidthUint8 , pPmioByteTable->bANDMask, pPmioByteTable->bORMask); |
| pPmioByteTable++; |
| } |
| } |
| |
| |
| UINT8 |
| getClockMode ( |
| void |
| ) |
| { |
| UINT8 dbTemp=0; |
| |
| RWPMIO(SB_PMIO_REGB2, AccWidthUint8, 0xFF, BIT7); |
| ReadPMIO(SB_PMIO_REGB0, AccWidthUint8, &dbTemp); |
| return(dbTemp&BIT4); |
| } |
| |
| |
| UINT16 |
| readStrapStatus ( |
| void |
| ) |
| { |
| UINT16 dwTemp=0; |
| |
| RWPMIO(SB_PMIO_REGB2, AccWidthUint8, 0xFF, BIT7); |
| ReadPMIO(SB_PMIO_REGB0, AccWidthUint16, &dwTemp); |
| return(dwTemp); |
| } |