coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
state_machine.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <Porting.h>
4 #include <AGESA.h>
5 #include <amdblocks/biosram.h>
6 #include <arch/io.h>
7 #include <cf9_reset.h>
8 #include <console/console.h>
9 #include <device/device.h>
10 #include <device/pci_def.h>
11 #include <device/pci_ops.h>
12 #include <smp/node.h>
15 #include <sb_cimx.h>
16 
17 void platform_BeforeInitReset(struct sysinfo *cb, AMD_RESET_PARAMS *Reset)
18 {
19  if (!boot_cpu())
20  return;
21 
23 
24  /* Reboots with outb(3,0x92), outb(4,0xcf9) or triple-fault all
25  * would fail later in AmdInitPost(), when DRAM is already configured
26  * and C6DramLock bit has been set.
27  *
28  * As a workaround, do a hard reset to clear C6DramLock bit.
29  */
30 
31 #ifdef __SIMPLE_DEVICE__
32  pci_devfn_t dev = PCI_DEV(0, 0x18, 2);
33 #else
34  struct device *dev = pcidev_on_root(0x18, 2);
35 #endif
36  u32 mct_cfg_lo = pci_read_config32(dev, 0x118);
37  if (mct_cfg_lo & (1<<19)) {
38  printk(BIOS_CRIT, "C6DramLock is set, resetting\n");
39  system_reset();
40  }
41 
42 }
43 
44 void platform_BeforeInitEarly(struct sysinfo *cb, AMD_EARLY_PARAMS *Early)
45 {
46 }
47 
48 void platform_BeforeInitPost(struct sysinfo *cb, AMD_POST_PARAMS *Post)
49 {
50  Post->MemConfig.BottomIo = (UINT16)(MIN(0xE0000000,
51  MAX(0x28000000, CONFIG_BOTTOMIO_POSITION)) >> 24) & 0xF8;
52 }
53 
54 void platform_AfterInitPost(struct sysinfo *cb, AMD_POST_PARAMS *Post)
55 {
56  backup_top_of_low_cacheable(Post->MemConfig.Sub4GCacheTop);
57 }
58 
59 void platform_BeforeInitResume(struct sysinfo *cb, AMD_RESUME_PARAMS *Resume)
60 {
61  OemInitResume(&Resume->S3DataBlock);
62 }
63 
64 void platform_AfterInitResume(struct sysinfo *cb, AMD_RESUME_PARAMS *Resume)
65 {
66 }
67 
68 void platform_BeforeInitEnv(struct sysinfo *cb, AMD_ENV_PARAMS *Env)
69 {
70  EmptyHeap();
71 }
72 
73 void platform_AfterInitEnv(struct sysinfo *cb, AMD_ENV_PARAMS *Env)
74 {
75  amd_initenv();
76 }
77 
78 void platform_BeforeS3LateRestore(struct sysinfo *cb, AMD_S3LATE_PARAMS *S3Late)
79 {
80  OemS3LateRestore(&S3Late->S3DataBlock);
81 }
82 
83 void platform_AfterS3LateRestore(struct sysinfo *cb, AMD_S3LATE_PARAMS *S3Late)
84 {
85 }
86 
87 void platform_BeforeInitMid(struct sysinfo *cb, AMD_MID_PARAMS *Mid)
88 {
91 
92  amd_initcpuio();
93 }
94 
95 void platform_BeforeInitLate(struct sysinfo *cb, AMD_LATE_PARAMS *Late)
96 {
97 }
98 
99 void platform_AfterInitLate(struct sysinfo *cb, AMD_LATE_PARAMS *Late)
100 {
101  sb_Late_Post();
102 }
103 
104 void platform_AfterS3Save(struct sysinfo *cb, AMD_S3SAVE_PARAMS *S3Save)
105 {
106  OemS3Save(&S3Save->S3DataBlock);
107 }
void amd_initenv(void)
Definition: fixme.c:54
void amd_initcpuio(void)
Definition: fixme.c:11
void backup_top_of_low_cacheable(uintptr_t ramtop)
Definition: biosram.c:61
#define MIN(a, b)
Definition: helpers.h:37
#define MAX(a, b)
Definition: helpers.h:40
void system_reset(void)
Definition: cf9_reset.c:37
int boot_cpu(void)
Definition: psp.c:5
#define printk(level,...)
Definition: stdlib.h:16
DEVTREE_CONST struct device * pcidev_on_root(uint8_t dev, uint8_t fn)
Definition: device_const.c:260
void EmptyHeap(void)
Definition: heapmanager.c:36
void sb_Poweron_Init(void)
South Bridge CIMx romstage entry, wrapper of sbPowerOnInit entry point.
Definition: early.c:12
static __always_inline u32 pci_read_config32(const struct device *dev, u16 reg)
Definition: pci_ops.h:58
void sb_After_Pci_Init(void)
Definition: late.c:259
void sb_Mid_Post_Init(void)
Definition: late.c:266
void sb_Late_Post(void)
Definition: late.c:273
#define BIOS_CRIT
BIOS_CRIT - Recovery unlikely.
Definition: loglevel.h:56
void platform_BeforeInitReset(struct sysinfo *cb, AMD_RESET_PARAMS *Reset)
Definition: state_machine.c:17
void platform_AfterInitLate(struct sysinfo *cb, AMD_LATE_PARAMS *Late)
Definition: state_machine.c:99
void platform_BeforeS3LateRestore(struct sysinfo *cb, AMD_S3LATE_PARAMS *S3Late)
Definition: state_machine.c:78
void platform_BeforeInitMid(struct sysinfo *cb, AMD_MID_PARAMS *Mid)
Definition: state_machine.c:87
void platform_AfterS3LateRestore(struct sysinfo *cb, AMD_S3LATE_PARAMS *S3Late)
Definition: state_machine.c:83
void platform_BeforeInitEnv(struct sysinfo *cb, AMD_ENV_PARAMS *Env)
Definition: state_machine.c:68
void platform_BeforeInitLate(struct sysinfo *cb, AMD_LATE_PARAMS *Late)
Definition: state_machine.c:95
void platform_BeforeInitPost(struct sysinfo *cb, AMD_POST_PARAMS *Post)
Definition: state_machine.c:48
void platform_BeforeInitEarly(struct sysinfo *cb, AMD_EARLY_PARAMS *Early)
Definition: state_machine.c:44
void platform_AfterInitPost(struct sysinfo *cb, AMD_POST_PARAMS *Post)
Definition: state_machine.c:54
void platform_BeforeInitResume(struct sysinfo *cb, AMD_RESUME_PARAMS *Resume)
Definition: state_machine.c:59
void platform_AfterInitEnv(struct sysinfo *cb, AMD_ENV_PARAMS *Env)
Definition: state_machine.c:73
void platform_AfterInitResume(struct sysinfo *cb, AMD_RESUME_PARAMS *Resume)
Definition: state_machine.c:64
void platform_AfterS3Save(struct sysinfo *cb, AMD_S3SAVE_PARAMS *S3Save)
AGESA_STATUS OemS3LateRestore(AMD_S3_PARAMS *dataBlock)
Definition: oem_s3.c:63
AGESA_STATUS OemInitResume(AMD_S3_PARAMS *dataBlock)
Definition: oem_s3.c:47
#define PCI_DEV(SEGBUS, DEV, FN)
Definition: pci_type.h:14
u32 pci_devfn_t
Definition: pci_type.h:8
AGESA_STATUS OemS3Save(AMD_S3_PARAMS *dataBlock)
uint32_t u32
Definition: stdint.h:51
Definition: device.h:107