coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
memory.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
3 #include <baseboard/gpio.h>
4 #include <baseboard/variants.h>
5 #include <gpio.h>
6 
7 static const struct mb_cfg baseboard_memcfg = {
9 
10  .rcomp = {
11  /* Baseboard uses only 100ohm Rcomp resistors */
12  .resistor = 100,
13 
14  /* Baseboard Rcomp target values */
15  .targets = {40, 30, 30, 30, 30},
16  },
17 
18  /* DQ byte map */
19  .lpx_dq_map = {
20  .ddr0 = {
21  .dq0 = { 9, 11, 8, 10, 12, 14, 13, 15, },
22  .dq1 = { 4, 7, 6, 5, 2, 3, 0, 1, },
23  },
24  .ddr1 = {
25  .dq0 = { 15, 12, 14, 13, 9, 10, 11, 8, },
26  .dq1 = { 0, 1, 3, 2, 7, 5, 4, 6, },
27  },
28  .ddr2 = {
29  .dq0 = { 2, 3, 1, 0, 6, 7, 5, 4, },
30  .dq1 = { 15, 9, 14, 8, 11, 10, 13, 12, },
31  },
32  .ddr3 = {
33  .dq0 = { 3, 1, 2, 0, 4, 6, 7, 5, },
34  .dq1 = { 13, 15, 14, 12, 11, 9, 8, 10, },
35  },
36  .ddr4 = {
37  .dq0 = { 13, 12, 14, 15, 9, 8, 10, 11, },
38  .dq1 = { 4, 7, 5, 6, 1, 2, 0, 3, },
39  },
40  .ddr5 = {
41  .dq0 = { 5, 0, 6, 4, 3, 1, 7, 2, },
42  .dq1 = { 11, 9, 10, 8, 15, 12, 14, 13, },
43  },
44  .ddr6 = {
45  .dq0 = { 15, 12, 14, 13, 10, 9, 11, 8, },
46  .dq1 = { 0, 1, 2, 3, 5, 6, 4, 7, },
47  },
48  .ddr7 = {
49  .dq0 = { 0, 3, 1, 2, 4, 5, 6, 7, },
50  .dq1 = { 11, 8, 13, 14, 9, 12, 15, 10, },
51  },
52  },
53 
54  /* DQS CPU<>DRAM map */
55  .lpx_dqs_map = {
56  .ddr0 = { .dqs0 = 1, .dqs1 = 0 },
57  .ddr1 = { .dqs0 = 1, .dqs1 = 0 },
58  .ddr2 = { .dqs0 = 0, .dqs1 = 1 },
59  .ddr3 = { .dqs0 = 0, .dqs1 = 1 },
60  .ddr4 = { .dqs0 = 1, .dqs1 = 0 },
61  .ddr5 = { .dqs0 = 0, .dqs1 = 1 },
62  .ddr6 = { .dqs0 = 1, .dqs1 = 0 },
63  .ddr7 = { .dqs0 = 0, .dqs1 = 1 },
64  },
65 
66  .ect = 1, /* Enable Early Command Training */
67 };
68 
69 const struct mb_cfg *__weak variant_memory_params(void)
70 {
71  return &baseboard_memcfg;
72 }
73 
75 {
76  /*
77  * Memory configuration board straps
78  * GPIO_MEM_CONFIG_0 GPP_E11
79  * GPIO_MEM_CONFIG_1 GPP_E2
80  * GPIO_MEM_CONFIG_2 GPP_E1
81  * GPIO_MEM_CONFIG_3 GPP_E12
82  */
83  gpio_t spd_gpios[] = {
84  GPP_E11,
85  GPP_E2,
86  GPP_E1,
87  GPP_E12,
88  };
89 
90  return gpio_base2_value(spd_gpios, ARRAY_SIZE(spd_gpios));
91 }
92 
94 {
95  /* GPIO_MEM_CH_SEL GPP_E13 */
96  return gpio_get(GPP_E13);
97 }
98 
100 {
102  spd_info->cbfs_index = variant_memory_sku();
103 }
#define GPP_E13
#define GPP_E2
#define GPP_E11
#define GPP_E12
#define GPP_E1
@ MEM_TYPE_LP4X
Definition: meminit.h:13
#define ARRAY_SIZE(a)
Definition: helpers.h:12
@ MEM_TOPO_MEMORY_DOWN
Definition: meminit.h:25
int gpio_get(gpio_t gpio)
Definition: gpio.c:166
uint32_t gpio_base2_value(const gpio_t gpio[], int num_gpio)
Definition: gpio.c:30
const struct mb_cfg *__weak variant_memory_params(void)
Definition: memory.c:67
void variant_get_spd_info(struct mem_spd *spd_info)
Definition: memory.c:32
bool variant_is_half_populated(void)
Definition: memory.c:27
static const struct mb_cfg baseboard_memcfg
Definition: memory.c:7
int __weak variant_memory_sku(void)
Definition: memory.c:74
const struct smm_save_state_ops *legacy_ops __weak
Definition: save_state.c:8
Definition: meminit.h:71
enum mem_type type
Definition: meminit.h:72
Definition: spd.h:11