blob: 66b827f532a2eb38c65fda123b88b891631a5054 [file] [log] [blame]
Shuo Liue43f3872024-04-06 05:13:27 +08001/* SPDX-License-Identifier: GPL-2.0-or-later */
2
3#include <assert.h>
4#include <intelblocks/acpi.h>
5#include <soc/chip_common.h>
6#include <soc/util.h>
7#include <stdint.h>
Shuo Liue43f3872024-04-06 05:13:27 +08008
9static uintptr_t xeonsp_ioapic_bases[CONFIG_MAX_SOCKET * MAX_IIO_STACK + 1];
10
11size_t soc_get_ioapic_info(const uintptr_t *ioapic_bases[])
12{
13 int index = 0;
14 const IIO_UDS *hob = get_iio_uds();
15
16 *ioapic_bases = xeonsp_ioapic_bases;
17
18 for (int socket = 0; socket < CONFIG_MAX_SOCKET; socket++) {
19 if (!soc_cpu_is_enabled(socket))
20 continue;
21 for (int stack = 0; stack < MAX_IIO_STACK; ++stack) {
22 const STACK_RES *ri =
23 &hob->PlatformData.IIO_resource[socket].StackRes[stack];
24 uint32_t ioapic_base = ri->IoApicBase;
25 if (ioapic_base == 0 || ioapic_base == 0xFFFFFFFF)
26 continue;
27 xeonsp_ioapic_bases[index++] = ioapic_base;
28 /*
29 * Stack 0 has non-PCH IOAPIC and PCH IOAPIC.
30 * The IIO IOAPIC is placed at 0x1000 from the reported base.
31 */
32 if (socket == 0 && stack == 0) {
33 ioapic_base += 0x1000;
34 xeonsp_ioapic_bases[index++] = ioapic_base;
35 }
36 }
37 }
38
39 return index;
40}