sigh
[coreboot.git] / src / vendorcode / amd / cimx / sb900 / AcpiLib.c
1 /*;********************************************************************************
2 ;
3 ; Copyright (c) 2011, Advanced Micro Devices, Inc.
4 ; All rights reserved.
5
6 ; Redistribution and use in source and binary forms, with or without
7 ; modification, are permitted provided that the following conditions are met:
8 ;     * Redistributions of source code must retain the above copyright
9 ;       notice, this list of conditions and the following disclaimer.
10 ;     * Redistributions in binary form must reproduce the above copyright
11 ;       notice, this list of conditions and the following disclaimer in the
12 ;       documentation and/or other materials provided with the distribution.
13 ;     * Neither the name of Advanced Micro Devices, Inc. nor the names of 
14 ;       its contributors may be used to endorse or promote products derived 
15 ;       from this software without specific prior written permission.
16
17 ; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18 ; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 ; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 ; DISCLAIMED. IN NO EVENT SHALL ADVANCED MICRO DEVICES, INC. BE LIABLE FOR ANY
21 ; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 ; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23 ; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24 ; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 ; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26 ; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28 ;*********************************************************************************/
29
30 #include "SbPlatform.h"
31 #include "cbtypes.h"
32
33 //
34 //
35 // Routine Description:
36 //
37 //  Locate ACPI table
38 //
39 // Arguments:
40 //
41 //  Signature - table signature
42 //
43 //Returns:
44 //
45 //  pointer to ACPI table
46 //
47 //
48 VOID*
49 ACPI_LocateTable (
50   IN       unsigned int Signature
51   )
52 {
53   UINT32  i;
54   UINT32* RsdPtr;
55   UINT32* Rsdt;
56   UINTN   tableOffset;
57   DESCRIPTION_HEADER* CurrentTable;
58   RsdPtr = (UINT32*) (UINTN)0xe0000;
59   Rsdt = NULL;
60   do {
61 //    if ( *RsdPtr == ' DSR' && *(RsdPtr + 1) == ' RTP' ) {
62 //    if ( (*RsdPtr == 0x52534420) && (*(RsdPtr + 1) == 0x50545220) ) {
63     if ( (*RsdPtr == 0x20445352) && (*(RsdPtr + 1) == 0x20525450) ) {
64       Rsdt = (UINT32*) (UINTN) ((RSDP*)RsdPtr)->RsdtAddress;
65       break;
66     }
67     RsdPtr += 4;
68   } while ( RsdPtr <= (UINT32*) (UINTN)0xffff0 );
69   if ( Rsdt != NULL && ACPI_GetTableChecksum (Rsdt) == 0 ) {
70     for ( i = 0; i < (((DESCRIPTION_HEADER*)Rsdt)->Length - sizeof (DESCRIPTION_HEADER)) / 4; i++ ) {
71       tableOffset = *(UINTN*) ((UINT8*)Rsdt + sizeof (DESCRIPTION_HEADER) + i * 4);
72       CurrentTable = (DESCRIPTION_HEADER*)tableOffset;
73       if ( CurrentTable->Signature == Signature ) {
74         return CurrentTable;
75       }
76     }
77   }
78   return NULL;
79 }
80
81 //
82 //
83 //  Routine Description:
84 //
85 //  Update table checksum
86 //
87 //  Arguments:
88 //
89 //  TablePtr - table pointer
90 //
91 //  Returns:
92 //
93 //  none
94 //
95 //
96 VOID
97 ACPI_SetTableChecksum (
98   IN       VOID* TablePtr
99   )
100 {
101   UINT8 Checksum;
102   Checksum = 0;
103   ((DESCRIPTION_HEADER*)TablePtr)->Checksum = 0;
104   Checksum = ACPI_GetTableChecksum (TablePtr);
105   ((DESCRIPTION_HEADER*)TablePtr)->Checksum = (UINT8) (0x100 - Checksum);
106 }
107
108 //
109 //
110 //  Routine Description:
111 //
112 //  Get table checksum
113 //
114 //  Arguments:
115 //
116 //  TablePtr - table pointer
117 //
118 //  Returns:
119 //
120 //  none
121 //
122 //
123 UINT8
124 ACPI_GetTableChecksum (
125   IN       VOID* TablePtr
126   )
127 {
128   return GetByteSum (TablePtr, ((DESCRIPTION_HEADER*)TablePtr)->Length);
129 }
130
131
132 UINT8
133 GetByteSum (
134   IN       VOID* pData,
135   IN       UINT32 Length
136   )
137 {
138   UINT32  i;
139   UINT8 Checksum;
140   Checksum = 0;
141   for ( i = 0; i < Length; i++ ) {
142     Checksum = Checksum + (*((UINT8*)pData + i));
143   }
144   return Checksum;
145 }
146 VOID
147 GetSbAcpiMmioBase (
148   OUT     UINT32*    AcpiMmioBase
149   )
150 {
151   UINT32    Value16;
152
153   ReadPMIO (SB_PMIOA_REG24 + 2, AccWidthUint16, &Value16);
154   *AcpiMmioBase = Value16 << 16;
155 }
156
157 VOID
158 GetSbAcpiPmBase (
159   OUT     UINT16*    AcpiPmBase
160   )
161 {
162   ReadPMIO (SB_PMIOA_REG60, AccWidthUint16, AcpiPmBase);
163 }
164
165 VOID
166 SetAcpiPma (
167   IN     UINT8    pmaControl
168   )
169 {
170   UINT16 pmaBase;
171   UINT16 dwValue;
172   ReadMEM (ACPI_MMIO_BASE + PMIO_BASE + SB_PMIOA_REG74, AccWidthUint16, &dwValue);
173   dwValue &= ~BIT6;
174   WriteMEM (ACPI_MMIO_BASE + PMIO_BASE + SB_PMIOA_REG74, AccWidthUint16, &dwValue);
175   ReadMEM (ACPI_MMIO_BASE + PMIO_BASE + SB_PMIOA_REG6E, AccWidthUint16, &pmaBase);
176   WriteIo8 (pmaBase, pmaControl);
177   RWMEM (ACPI_MMIO_BASE + SMI_BASE + SB_PMIOA_REG98 + 3, AccWidthUint8, ~BIT7, pmaControl << 7);
178 }
179