blob: a5db8fd3096e26fec34a061701ce4847ed040fff [file] [log] [blame]
Patrick Georgiac959032020-05-05 22:49:26 +02001/* SPDX-License-Identifier: GPL-2.0-or-later */
Jonathan Zhang8f895492020-01-16 11:16:45 -08002
3#include <assert.h>
Jonathan Zhang8f895492020-01-16 11:16:45 -08004#include <console/console.h>
Jonathan Zhang8f895492020-01-16 11:16:45 -08005#include <device/pci.h>
6#include <hob_iiouds.h>
7#include <intelblocks/cpulib.h>
8#include <intelblocks/pcr.h>
9#include <soc/iomap.h>
Jonathan Zhang8f895492020-01-16 11:16:45 -080010#include <soc/msr.h>
11#include <soc/pci_devs.h>
12#include <soc/pcr_ids.h>
13#include <soc/soc_util.h>
Andrey Petrov662da6c2020-03-16 22:46:57 -070014#include <soc/util.h>
Jonathan Zhang8f895492020-01-16 11:16:45 -080015
Jonathan Zhang8f895492020-01-16 11:16:45 -080016
17/*
18 * +-------------------------+ TOLM
19 * | System Management Mode |
20 * | code and data |
21 * | (TSEG) |
22 * +-------------------------+ SMM base (aligned)
23 * | |
24 * | Chipset Reserved Memory |
25 * | |
26 * +-------------------------+ top_of_ram (aligned)
27 * | |
28 * | CBMEM Root |
29 * | |
30 * +-------------------------+
31 * | |
32 * | FSP Reserved Memory |
33 * | |
34 * +-------------------------+
35 * | |
36 * | Various CBMEM Entries |
37 * | |
38 * +-------------------------+ top_of_stack (8 byte aligned)
39 * | |
40 * | stack (CBMEM Entry) |
41 * | |
42 * +-------------------------+
43 */
44
Marc Jones645bca42020-11-02 14:29:46 -070045const struct SystemMemoryMapHob *get_system_memory_map(void)
Jonathan Zhang8f895492020-01-16 11:16:45 -080046{
47 size_t hob_size;
Marc Jones645bca42020-11-02 14:29:46 -070048 const uint8_t mem_hob_guid[16] = FSP_SYSTEM_MEMORYMAP_HOB_GUID;
49 const struct SystemMemoryMapHob *memmap_addr;
50
51 memmap_addr = fsp_find_extension_hob_by_guid(mem_hob_guid, &hob_size);
Elyes Haouasf1ba7d62022-09-13 10:03:44 +020052 assert(memmap_addr && hob_size != 0);
Marc Jones645bca42020-11-02 14:29:46 -070053
54 return memmap_addr;
55}
56
Arthur Heymans550f55e2022-08-24 14:44:26 +020057bool is_pcie_iio_stack_res(const STACK_RES *res)
58{
Arthur Heymans470f1d32023-08-31 18:19:09 +020059 return res->BusBase < res->BusLimit;
Arthur Heymans550f55e2022-08-24 14:44:26 +020060}
61
Jonathan Zhangca520a72023-01-23 18:14:53 -080062uint8_t get_stack_busno(const uint8_t stack)
63{
64 if (stack >= MAX_IIO_STACK) {
65 printk(BIOS_ERR, "%s: Stack %u does not exist!\n", __func__, stack);
66 return 0;
67 }
68 const pci_devfn_t dev = PCI_DEV(UBOX_DECS_BUS, UBOX_DECS_DEV, UBOX_DECS_FUNC);
69 const uint16_t offset = stack / 4 ? UBOX_DECS_CPUBUSNO1_CSR : UBOX_DECS_CPUBUSNO_CSR;
70 return pci_io_read_config32(dev, offset) >> (8 * (stack % 4)) & 0xff;
71}
72
Marc Jones5851f9d2020-11-02 15:30:10 -070073uint32_t get_socket_stack_busno(uint32_t socket, uint32_t stack)
Jonathan Zhang8f895492020-01-16 11:16:45 -080074{
Arthur Heymans83b26222020-11-06 11:50:55 +010075 const IIO_UDS *hob = get_iio_uds();
Jonathan Zhang8f895492020-01-16 11:16:45 -080076
Marc Jones645bca42020-11-02 14:29:46 -070077 assert(socket < MAX_SOCKET && stack < MAX_IIO_STACK);
Jonathan Zhang8f895492020-01-16 11:16:45 -080078
Marc Jones645bca42020-11-02 14:29:46 -070079 return hob->PlatformData.CpuQpiInfo[socket].StackBus[stack];
80}
Jonathan Zhang8f895492020-01-16 11:16:45 -080081
Jonathan Zhangca520a72023-01-23 18:14:53 -080082uint32_t get_socket_ubox_busno(uint32_t socket)
83{
84 if (socket == 0)
85 return get_stack_busno(PCU_IIO_STACK);
86
87 return get_socket_stack_busno(socket, PCU_IIO_STACK);
88}
89
Marc Jones645bca42020-11-02 14:29:46 -070090void config_reset_cpl3_csrs(void)
Jonathan Zhang8f895492020-01-16 11:16:45 -080091{
Marc Jones645bca42020-11-02 14:29:46 -070092 uint32_t data, plat_info, max_min_turbo_limit_ratio;
Jonathan Zhang8f895492020-01-16 11:16:45 -080093
Marc Jones645bca42020-11-02 14:29:46 -070094 for (uint32_t socket = 0; socket < MAX_SOCKET; ++socket) {
95 uint32_t bus = get_socket_stack_busno(socket, PCU_IIO_STACK);
Jonathan Zhang8f895492020-01-16 11:16:45 -080096
Marc Jones645bca42020-11-02 14:29:46 -070097 /* configure PCU_CR0_FUN csrs */
98 pci_devfn_t cr0_dev = PCI_DEV(bus, PCU_DEV, PCU_CR0_FUN);
Nico Huberf4f365f2021-10-14 18:16:39 +020099 data = pci_s_read_config32(cr0_dev, PCU_CR0_P_STATE_LIMITS);
Marc Jones645bca42020-11-02 14:29:46 -0700100 data |= P_STATE_LIMITS_LOCK;
Nico Huberf4f365f2021-10-14 18:16:39 +0200101 pci_s_write_config32(cr0_dev, PCU_CR0_P_STATE_LIMITS, data);
Marc Jones645bca42020-11-02 14:29:46 -0700102
Nico Huberf4f365f2021-10-14 18:16:39 +0200103 plat_info = pci_s_read_config32(cr0_dev, PCU_CR0_PLATFORM_INFO);
Marc Jones645bca42020-11-02 14:29:46 -0700104 dump_csr64("", cr0_dev, PCU_CR0_PLATFORM_INFO);
105 max_min_turbo_limit_ratio =
106 (plat_info & MAX_NON_TURBO_LIM_RATIO_MASK) >>
107 MAX_NON_TURBO_LIM_RATIO_SHIFT;
108 printk(BIOS_SPEW, "plat_info: 0x%x, max_min_turbo_limit_ratio: 0x%x\n",
109 plat_info, max_min_turbo_limit_ratio);
110
111 /* configure PCU_CR1_FUN csrs */
112 pci_devfn_t cr1_dev = PCI_DEV(bus, PCU_DEV, PCU_CR1_FUN);
113
Nico Huberf4f365f2021-10-14 18:16:39 +0200114 data = pci_s_read_config32(cr1_dev, PCU_CR1_SAPMCTL);
Marc Jones645bca42020-11-02 14:29:46 -0700115 /* clear bits 27:31 - FSP sets this with 0x7 which needs to be cleared */
116 data &= 0x0fffffff;
117 data |= SAPMCTL_LOCK_MASK;
Nico Huberf4f365f2021-10-14 18:16:39 +0200118 pci_s_write_config32(cr1_dev, PCU_CR1_SAPMCTL, data);
Marc Jones645bca42020-11-02 14:29:46 -0700119
120 /* configure PCU_CR1_FUN csrs */
121 pci_devfn_t cr2_dev = PCI_DEV(bus, PCU_DEV, PCU_CR2_FUN);
122
123 data = PCIE_IN_PKGCSTATE_L1_MASK;
Nico Huberf4f365f2021-10-14 18:16:39 +0200124 pci_s_write_config32(cr2_dev, PCU_CR2_PKG_CST_ENTRY_CRITERIA_MASK, data);
Marc Jones645bca42020-11-02 14:29:46 -0700125
126 data = KTI_IN_PKGCSTATE_L1_MASK;
Nico Huberf4f365f2021-10-14 18:16:39 +0200127 pci_s_write_config32(cr2_dev, PCU_CR2_PKG_CST_ENTRY_CRITERIA_MASK2, data);
Marc Jones645bca42020-11-02 14:29:46 -0700128
129 data = PROCHOT_RATIO;
130 printk(BIOS_SPEW, "PCU_CR2_PROCHOT_RESPONSE_RATIO_REG data: 0x%x\n", data);
Nico Huberf4f365f2021-10-14 18:16:39 +0200131 pci_s_write_config32(cr2_dev, PCU_CR2_PROCHOT_RESPONSE_RATIO_REG, data);
Marc Jones645bca42020-11-02 14:29:46 -0700132 dump_csr("", cr2_dev, PCU_CR2_PROCHOT_RESPONSE_RATIO_REG);
133
Nico Huberf4f365f2021-10-14 18:16:39 +0200134 data = pci_s_read_config32(cr2_dev, PCU_CR2_DYNAMIC_PERF_POWER_CTL);
Marc Jones645bca42020-11-02 14:29:46 -0700135 data |= UNOCRE_PLIMIT_OVERRIDE_SHIFT;
Nico Huberf4f365f2021-10-14 18:16:39 +0200136 pci_s_write_config32(cr2_dev, PCU_CR2_DYNAMIC_PERF_POWER_CTL, data);
Jonathan Zhang8f895492020-01-16 11:16:45 -0800137 }
Marc Jonese1db55b2020-09-28 16:53:19 -0600138}
Jonathan Zhang8f895492020-01-16 11:16:45 -0800139
Marc Jones995a7e22020-10-28 17:08:54 -0600140/*
141 * EX: SKX-SP
142 * Ports Stack Stack(HOB) IioConfigIou
143 * ==========================================
144 * 0 CSTACK stack 0 IOU0
145 * 1A..1D PSTACKZ stack 1 IOU1
146 * 2A..2D PSTACK1 stack 2 IOU2
147 * 3A..3D PSTACK2 stack 3 IOU3
148 * 5A..4D PSTACK3 stack 4 IOU4
149 * 5A..5D PSTACK4 stack 5 IOU5
150 */
151int soc_get_stack_for_port(int port)
152{
153 if (port == PORT_0)
154 return CSTACK;
155 else if (port >= PORT_1A && port <= PORT_1D)
156 return PSTACK0;
157 else if (port >= PORT_2A && port <= PORT_2D)
158 return PSTACK1;
159 else if (port >= PORT_3A && port <= PORT_3D)
160 return PSTACK2;
161 else if (port >= PORT_4A && port <= PORT_4D)
162 return PSTACK3; // MCP0
163 else if (port >= PORT_5A && port <= PORT_5D)
164 return PSTACK4; // MCP1
165 else
166 return -1;
167}
Arthur Heymansa1cc5572020-11-06 12:53:33 +0100168
169uint8_t soc_get_iio_ioapicid(int socket, int stack)
170{
171 uint8_t ioapic_id = socket ? 0xf : 0x9;
172 switch (stack) {
173 case CSTACK:
174 break;
175 case PSTACK0:
176 ioapic_id += 1;
177 break;
178 case PSTACK1:
179 ioapic_id += 2;
180 break;
181 case PSTACK2:
182 ioapic_id += 3;
183 break;
184 default:
185 return 0xff;
186 }
187 return ioapic_id;
188}