coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
systemagent.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <cpu/x86/msr.h>
4 #include <delay.h>
5 #include <device/device.h>
6 #include <device/pci_ops.h>
9 #include <option.h>
10 #include <soc/cpu.h>
11 #include <soc/iomap.h>
12 #include <soc/msr.h>
13 #include <soc/pci_devs.h>
14 #include <soc/systemagent.h>
15 #include <types.h>
16 #include "chip.h"
17 
18 bool soc_vtd_enabled(void)
19 {
20  const unsigned int vtd = get_uint_option("vtd", 1);
21  if (!vtd)
22  return false;
23  struct device *const root_dev = pcidev_path_on_root(SA_DEVFN_ROOT);
24  return root_dev &&
25  !(pci_read_config32(root_dev, CAPID0_A) & VTD_DISABLE);
26 }
27 
28 /*
29  * SoC implementation
30  *
31  * Add all known fixed memory ranges for Host Controller/Memory
32  * controller.
33  */
34 void soc_add_fixed_mmio_resources(struct device *dev, int *index)
35 {
36  static const struct sa_mmio_descriptor soc_fixed_resources[] = {
37  { PCIEXBAR, CONFIG_ECAM_MMCONF_BASE_ADDRESS, CONFIG_ECAM_MMCONF_LENGTH,
38  "PCIEXBAR" },
39  { MCHBAR, MCH_BASE_ADDRESS, MCH_BASE_SIZE, "MCHBAR" },
40  { DMIBAR, DMI_BASE_ADDRESS, DMI_BASE_SIZE, "DMIBAR" },
41  { EPBAR, EP_BASE_ADDRESS, EP_BASE_SIZE, "EPBAR" },
42  { GDXCBAR, GDXC_BASE_ADDRESS, GDXC_BASE_SIZE, "GDXCBAR" },
44  };
45 
46  sa_add_fixed_mmio_resources(dev, index, soc_fixed_resources,
47  ARRAY_SIZE(soc_fixed_resources));
48 
49  if (soc_vtd_enabled()) {
53 
56  }
57 }
58 
59 /*
60  * SoC implementation
61  *
62  * Perform System Agent Initialization during Ramstage phase.
63  */
64 void soc_systemagent_init(struct device *dev)
65 {
66  struct soc_power_limits_config *soc_config;
68 
69  /* Enable Power Aware Interrupt Routing */
71 
72  /* Enable BIOS Reset CPL */
74 
75  /* Configure turbo power limits 1ms after reset complete bit */
76  mdelay(1);
78  soc_config = &config->power_limits_config;
80 }
81 
83  uint64_t *prmrr_mask)
84 {
85  msr_t msr;
87  *prmrr_base = (uint64_t) msr.hi << 32 | msr.lo;
89  *prmrr_mask = (uint64_t) msr.hi << 32 | msr.lo;
90  return 0;
91 }
92 
94 {
95  switch (capid0_a_ddrsz) {
96  case 1:
97  return 8192;
98  case 2:
99  return 4096;
100  case 3:
101  return 2048;
102  default:
103  return 32768;
104  }
105 }
void soc_add_fixed_mmio_resources(struct device *dev, int *index)
Definition: systemagent.c:25
void soc_systemagent_init(struct device *dev)
Definition: systemagent.c:53
uint32_t soc_systemagent_max_chan_capacity_mib(u8 capid0_a_ddrsz)
Definition: systemagent.c:96
int soc_get_uncore_prmmr_base_and_mask(uint64_t *prmrr_base, uint64_t *prmrr_mask)
Definition: systemagent.c:48
#define ARRAY_SIZE(a)
Definition: helpers.h:12
void enable_bios_reset_cpl(void)
void enable_power_aware_intr(void)
Definition: systemagent.c:298
void sa_add_fixed_mmio_resources(struct device *dev, int *resource_cnt, const struct sa_mmio_descriptor *sa_fixed_resources, size_t count)
Definition: systemagent.c:87
#define MSR_UNCORE_PRMRR_PHYS_BASE
Definition: haswell.h:58
#define MSR_UNCORE_PRMRR_PHYS_MASK
Definition: haswell.h:59
void set_power_limits(u8 power_limit_1_time)
Definition: haswell_init.c:313
void mdelay(unsigned int msecs)
Definition: delay.c:2
bool is_devfn_enabled(unsigned int devfn)
Definition: device_const.c:382
DEVTREE_CONST struct device * pcidev_path_on_root(pci_devfn_t devfn)
Definition: device_const.c:255
#define CAPID0_A
Definition: host_bridge.h:65
#define MCHBAR
Definition: host_bridge.h:7
#define PCIEXBAR
Definition: host_bridge.h:32
#define VTD_DISABLE
Definition: host_bridge.h:67
#define DMIBAR
Definition: host_bridge.h:33
#define EPBAR
Definition: host_bridge.h:6
#define EDRAMBAR
Definition: mchbar.h:19
#define GDXCBAR
Definition: mchbar.h:22
static __always_inline msr_t rdmsr(unsigned int index)
Definition: msr.h:146
#define config_of_soc()
Definition: device.h:394
static __always_inline u32 pci_read_config32(const struct device *dev, u16 reg)
Definition: pci_ops.h:58
#define DMI_BASE_ADDRESS
Definition: iomap.h:37
#define EP_BASE_ADDRESS
Definition: iomap.h:40
#define MCH_BASE_ADDRESS
Definition: iomap.h:82
enum board_config config
Definition: memory.c:448
#define DMI_BASE_SIZE
Definition: memmap.h:8
#define EP_BASE_SIZE
Definition: memmap.h:10
#define EDRAM_BASE_ADDRESS
Definition: memmap.h:12
#define GDXC_BASE_SIZE
Definition: memmap.h:16
#define MCH_BASE_SIZE
Definition: memmap.h:6
#define GDXC_BASE_ADDRESS
Definition: memmap.h:15
#define EDRAM_BASE_SIZE
Definition: memmap.h:13
unsigned int get_uint_option(const char *name, const unsigned int fallback)
Definition: option.c:116
#define MOBILE_SKU_PL1_TIME_SEC
Definition: power_limit.h:16
static const struct sa_mmio_descriptor soc_gfxvt_mmio_descriptor
Definition: systemagent.h:36
static const struct sa_mmio_descriptor soc_vtvc0_mmio_descriptor
Definition: systemagent.h:43
bool soc_vtd_enabled(void)
Definition: systemagent.c:18
#define SA_DEVFN_ROOT
Definition: pci_devs.h:23
#define SA_DEVFN_IGD
Definition: pci_devs.h:32
unsigned int uint32_t
Definition: stdint.h:14
unsigned long long uint64_t
Definition: stdint.h:17
uint8_t u8
Definition: stdint.h:45
Definition: device.h:107
unsigned int hi
Definition: msr.h:112
unsigned int lo
Definition: msr.h:111
unsigned int index
Definition: systemagent.h:45