377167325799aa15125cc4f86088a1dca5c6ba83
[coreboot.git] / src / vendorcode / amd / cimx / sb800 / ACPILIB.c
1 /*\r
2  *****************************************************************************\r
3  *\r
4  * This file is part of the coreboot project.\r
5  *\r
6  * Copyright (C) 2010 Advanced Micro Devices, Inc.\r
7  *\r
8  * This program is free software; you can redistribute it and/or modify\r
9  * it under the terms of the GNU General Public License as published by\r
10  * the Free Software Foundation; version 2 of the License.\r
11  *\r
12  * This program is distributed in the hope that it will be useful,\r
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
15  * GNU General Public License for more details.\r
16  *\r
17  * You should have received a copy of the GNU General Public License\r
18  * along with this program; if not, write to the Free Software\r
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA\r
20  * ***************************************************************************\r
21  *\r
22  */\r
23 \r
24 #include "SBPLATFORM.h"\r
25 \r
26 //\r
27 //\r
28 // Routine Description:\r
29 //\r
30 //  Locate ACPI table\r
31 //\r
32 // Arguments:\r
33 //\r
34 //  Signature - table signature\r
35 //\r
36 //Returns:\r
37 //\r
38 //  pointer to ACPI table\r
39 //\r
40 //\r
41 VOID*\r
42 ACPI_LocateTable (\r
43   IN       UINT32 Signature\r
44   )\r
45 {\r
46   UINT32  i;\r
47   UINT32* RsdPtr;\r
48   UINT32* Rsdt;\r
49   UINTN   tableOffset;\r
50   DESCRIPTION_HEADER* CurrentTable;\r
51 \r
52   RsdPtr = (UINT32*) (UINTN)0xe0000;\r
53   Rsdt = NULL;\r
54   do {\r
55     //if ( *RsdPtr == ' DSR' && *(RsdPtr + 1) == ' RTP' ) { //gcc multi-character character constant warning\r
56     if ( *RsdPtr == 0x20445352 && *(RsdPtr + 1) == 0x20525450) {\r
57 \r
58       Rsdt = (UINT32*) (UINTN) ((RSDP*)RsdPtr)->RsdtAddress;\r
59       break;\r
60     }\r
61     RsdPtr += 4;\r
62   } while ( RsdPtr <= (UINT32*) (UINTN)0xffff0 );\r
63   if ( Rsdt != NULL && ACPI_GetTableChecksum (Rsdt) == 0 ) {\r
64     for ( i = 0; i < (((DESCRIPTION_HEADER*)Rsdt)->Length - sizeof (DESCRIPTION_HEADER)) / 4; i++ ) {\r
65       tableOffset = *(UINTN*) ((UINT8*)Rsdt + sizeof (DESCRIPTION_HEADER) + i * 4);\r
66       CurrentTable = (DESCRIPTION_HEADER*)tableOffset;\r
67       if ( CurrentTable->Signature == Signature ) {\r
68         return CurrentTable;\r
69       }\r
70     }\r
71   }\r
72   return NULL;\r
73 }\r
74 \r
75 //\r
76 //\r
77 //  Routine Description:\r
78 //\r
79 //  Update table checksum\r
80 //\r
81 //  Arguments:\r
82 //\r
83 //  TablePtr - table pointer\r
84 //\r
85 //  Returns:\r
86 //\r
87 //  none\r
88 //\r
89 //\r
90 VOID\r
91 ACPI_SetTableChecksum (\r
92   IN       VOID* TablePtr\r
93   )\r
94 {\r
95   UINT8 Checksum;\r
96   Checksum = 0;\r
97   ((DESCRIPTION_HEADER*)TablePtr)->Checksum = 0;\r
98   Checksum = ACPI_GetTableChecksum (TablePtr);\r
99   ((DESCRIPTION_HEADER*)TablePtr)->Checksum = (UINT8)(0x100 - Checksum);\r
100 }\r
101 \r
102 //\r
103 //\r
104 //  Routine Description:\r
105 //\r
106 //  Get table checksum\r
107 //\r
108 //  Arguments:\r
109 //\r
110 //  TablePtr - table pointer\r
111 //\r
112 //  Returns:\r
113 //\r
114 //  none\r
115 //\r
116 //\r
117 UINT8\r
118 ACPI_GetTableChecksum (\r
119   IN       VOID* TablePtr\r
120   )\r
121 {\r
122   return GetByteSum (TablePtr, ((DESCRIPTION_HEADER*)TablePtr)->Length);\r
123 }\r
124 \r
125 \r
126 UINT8\r
127 GetByteSum (\r
128   IN       VOID* pData,\r
129   IN       UINT32 Length\r
130   )\r
131 {\r
132   UINT32  i;\r
133   UINT8 Checksum;\r
134   Checksum = 0;\r
135   for ( i = 0; i < Length; i++ ) {\r
136     Checksum = Checksum + (*((UINT8*)pData + i));\r
137   }\r
138   return Checksum;\r
139 }\r
140 VOID\r
141 GetSbAcpiMmioBase (\r
142   OUT     UINT32*    AcpiMmioBase\r
143   )\r
144 {\r
145   UINT32    Value16;\r
146 \r
147   ReadPMIO (SB_PMIOA_REG24 + 2, AccWidthUint16, &Value16);\r
148   *AcpiMmioBase = Value16 << 16;\r
149 }\r
150 \r
151 VOID\r
152 GetSbAcpiPmBase (\r
153   OUT     UINT16*    AcpiPmBase\r
154   )\r
155 {\r
156   ReadPMIO (SB_PMIOA_REG60, AccWidthUint16, AcpiPmBase);\r
157 }\r
158 \r