SB700 southbridge: AMD SB700/SP5100 southbridge CIMX code
[coreboot.git] / src / vendorcode / amd / cimx / sb700 / ACPILIB.c
1 /*****************************************************************************
2  *
3  * Copyright (C) 2012 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
31
32 #include        "Platform.h"
33
34 /*++
35
36 Routine Description:
37
38   Locate ACPI table
39
40 Arguments:
41
42   Signature - table signature
43
44 Returns:
45
46   pointer to ACPI table
47
48 --*/
49 void* ACPI_LocateTable(
50         UINT32 Signature
51 )
52 {
53         UINT32  i;
54         UINT32* RsdPtr = (UINT32*)0xe0000;
55         UINT32* Rsdt = NULL;
56         DESCRIPTION_HEADER* CurrentTable;
57         do{
58 //              if (*RsdPtr == ' DSR' && *(RsdPtr+1) == ' RTP'){
59                 if ((*RsdPtr == Int32FromChar ('R', 'S', 'D', ' ')) && (*(RsdPtr+1) == Int32FromChar ('R', 'T', 'P', ' '))){
60                         Rsdt = (UINT32*)((RSDP*)RsdPtr)->RsdtAddress;
61                         break;
62                 }
63                 RsdPtr+=4;
64         }while (RsdPtr <= (UINT32*)0xffff0);
65         if(Rsdt != NULL && ACPI_GetTableChecksum(Rsdt)==0){
66                 for (i = 0;i < (((DESCRIPTION_HEADER*)Rsdt)->Length - sizeof(DESCRIPTION_HEADER))/4;i++){
67                         CurrentTable = (DESCRIPTION_HEADER*)*(UINT32*)((UINT8*)Rsdt + sizeof(DESCRIPTION_HEADER) + i*4);
68                         if (CurrentTable->Signature == Signature) return CurrentTable;
69                 }
70         }
71         return NULL;
72 }
73
74 /*++
75
76 Routine Description:
77
78   Update table checksum
79
80 Arguments:
81
82   TablePtr - table pointer
83
84 Returns:
85
86   none
87
88 --*/
89 void  ACPI_SetTableChecksum(
90         void* TablePtr
91 )
92 {
93         UINT8 Checksum = 0;
94         ((DESCRIPTION_HEADER*)TablePtr)->Checksum = 0;
95         Checksum = ACPI_GetTableChecksum(TablePtr);
96         ((DESCRIPTION_HEADER*)TablePtr)->Checksum = 0x100 - Checksum;
97 }
98
99 /*++
100
101 Routine Description:
102
103   Get table checksum
104
105 Arguments:
106
107   TablePtr - table pointer
108
109 Returns:
110
111   none
112
113 --*/
114 UINT8  ACPI_GetTableChecksum(
115         void* TablePtr
116 )
117 {
118         return GetByteSum(TablePtr,((DESCRIPTION_HEADER*)TablePtr)->Length);
119 }
120