1 /* SPDX-License-Identifier: GPL-2.0-only */
4 #include <device/device.h>
5 #include <device/pci.h>
6 #include <hob_cxlnode.h>
7 #include <intelblocks/cpulib.h>
10 #include <soc/pci_devs.h>
11 #include <soc/soc_util.h>
15 #include <pc80/mc146818rtc.h>
17 const EWL_PRIVATE_DATA
*get_ewl_hob(void)
20 static const EWL_PRIVATE_DATA
*hob
;
21 const uint8_t ewl_id_hob_guid
[16] = FSP_HOB_EWLID_GUID
;
26 hob
= fsp_find_extension_hob_by_guid(ewl_id_hob_guid
, &hob_size
);
27 assert(hob
!= NULL
&& hob_size
!= 0);
31 const SYSTEM_INFO_VAR
*get_system_info_hob(void)
34 static const SYSTEM_INFO_VAR
*hob
;
35 const uint8_t system_info_hob_guid
[16] = FSP_HOB_SYSTEMINFO_GUID
;
40 hob
= fsp_find_extension_hob_by_guid(system_info_hob_guid
, &hob_size
);
41 assert(hob
!= NULL
&& hob_size
!= 0);
45 const struct SystemMemoryMapHob
*get_system_memory_map(void)
48 const uint8_t mem_hob_guid
[16] = FSP_SYSTEM_MEMORYMAP_HOB_GUID
;
49 const struct SystemMemoryMapHob
**memmap_addr
;
51 memmap_addr
= (const struct SystemMemoryMapHob
**)fsp_find_extension_hob_by_guid(
52 mem_hob_guid
, &hob_size
);
53 /* hob_size is the size of the 8-byte address not the hob data */
54 assert(memmap_addr
!= NULL
&& hob_size
!= 0);
55 /* assert the pointer to the hob is not NULL */
56 assert(*memmap_addr
!= NULL
);
61 const struct SystemMemoryMapElement
*get_system_memory_map_elment(uint8_t *num
)
63 const struct SystemMemoryMapHob
*hob
= get_system_memory_map();
67 *num
= hob
->numberEntries
;
71 bool is_pcie_iio_stack_res(const STACK_RES
*res
)
73 return res
->Personality
== TYPE_UBOX_IIO
;
76 bool is_ubox_stack_res(const STACK_RES
*res
)
78 return res
->Personality
== TYPE_UBOX
;
81 bool is_ioat_iio_stack_res(const STACK_RES
*res
)
83 return res
->Personality
== TYPE_DINO
;
87 * Given a stack resource, figure out whether the corresponding stack has
89 * It goes through pds (proximity domains) structure to see if there is any
90 * generic initiator has device with bus # falls between bus base and
93 bool is_iio_cxl_stack_res(const STACK_RES
*res
)
95 for (uint8_t i
= 0; i
< pds
.num_pds
; i
++) {
96 if (pds
.pds
[i
].pd_type
== PD_TYPE_PROCESSOR
)
99 uint32_t bus
= PCI_BDF(pds
.pds
[i
].dev
) >> 20;
100 if (bus
>= res
->BusBase
&& bus
<= res
->BusLimit
)
107 const CXL_NODE_SOCKET
*get_cxl_node(void)
110 static const CXL_NODE_SOCKET
*hob
;
111 static bool hob_check
= 0;
112 const uint8_t fsp_hob_cxl_node_socket_guid
[16] = FSP_HOB_CXLNODE_GUID
;
117 hob
= fsp_find_extension_hob_by_guid(fsp_hob_cxl_node_socket_guid
, &hob_size
);
119 if (hob
== NULL
|| hob_size
== 0)
121 "FSP_HOB_CXLNODE_GUID not found: CXL may not be installed\n");
125 uint8_t get_cxl_node_count(void)
127 const CXL_NODE_SOCKET
*hob
= get_cxl_node();
131 for (uint8_t skt_id
= 0; skt_id
< MAX_SOCKET
; skt_id
++)
132 count
+= hob
[skt_id
].CxlNodeCount
;
138 /* Returns the UBOX(offset) bus number for socket0 */
139 uint8_t socket0_get_ubox_busno(uint8_t offset
)
141 const IIO_UDS
*hob
= get_iio_uds();
143 for (int stack
= 0; stack
< MAX_LOGIC_IIO_STACK
; ++stack
) {
144 if (hob
->PlatformData
.IIO_resource
[0].StackRes
[stack
].Personality
146 return (hob
->PlatformData
.IIO_resource
[0].StackRes
[stack
].BusBase
149 die("Unable to locate UBOX BUS NO");
152 void bios_done_msr(void *unused
)
154 msr_t msr
= rdmsr(MSR_BIOS_DONE
);
155 if (!(msr
.lo
& XEON_SP_ENABLE_IA_UNTRUSTED
)) { /* if already locked skip update */
156 msr
.lo
|= XEON_SP_ENABLE_IA_UNTRUSTED
;
157 wrmsr(MSR_BIOS_DONE
, msr
);
161 void soc_set_mrc_cold_boot_flag(bool cold_boot_required
)
163 uint8_t mrc_status
= cmos_read(CMOS_OFFSET_MRC_STATUS
);
164 uint8_t new_mrc_status
= (mrc_status
& 0xfe) | cold_boot_required
;
165 printk(BIOS_SPEW
, "MRC status: 0x%02x want 0x%02x\n", mrc_status
, new_mrc_status
);
166 if (new_mrc_status
!= mrc_status
)
167 cmos_write(new_mrc_status
, CMOS_OFFSET_MRC_STATUS
);
170 bool is_memtype_reserved(uint16_t mem_type
)
172 return !!(mem_type
& MEM_TYPE_RESERVED
);
175 bool is_memtype_non_volatile(uint16_t mem_type
)
177 return !(mem_type
& MEMTYPE_VOLATILE_MASK
);
180 bool is_memtype_processor_attached(uint16_t mem_type
)
183 * Refer to the definition of MEM_TYPE enum type in
184 * vendorcode/intel/fsp/fsp2_0/sapphirerapids_sp/MemoryMapDataHob.h,
185 * values less than MemTypeCxlAccVolatileMem represents
186 * processor attached memory
188 return (mem_type
< MemTypeCxlAccVolatileMem
);