coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
spd_util.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <arch/cpu.h>
4 #include <intelblocks/mp_init.h>
5 #include <stdint.h>
6 #include <string.h>
7 
8 #include "../board_id.h"
9 #include "spd.h"
10 
15  icl_y_lpddr4 = 6
16 };
17 
18 void mainboard_fill_dq_map_ch0(void *dq_map_ptr)
19 {
20  /* DQ byte map Ch0 */
21  const u8 dq_map[12] = {
22  0x0F, 0xF0, 0x0F, 0xF0, 0xFF, 0x00,
23  0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
24 
25  memcpy(dq_map_ptr, dq_map, sizeof(dq_map));
26 }
27 
28 void mainboard_fill_dq_map_ch1(void *dq_map_ptr)
29 {
30  const u8 dq_map[12] = {
31  0x0F, 0xF0, 0x0F, 0xF0, 0xFF, 0x00,
32  0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
33 
34  memcpy(dq_map_ptr, dq_map, sizeof(dq_map));
35 }
36 
37 static uint8_t get_spd_index(void)
38 {
39  uint8_t spd_index = (get_board_id() & 0x1F) & 0x7;
40 
41  return spd_index;
42 }
43 
44 void mainboard_fill_dqs_map_ch0(void *dqs_map_ptr)
45 {
46  /* DQS CPU<>DRAM map Ch0 */
47  const u8 dqs_map_u_ddr[8] = { 2, 0, 1, 3, 6, 4, 7, 5 };
48  const u8 dqs_map_u_lpddr[8] = { 2, 3, 0, 1, 7, 6, 4, 5 };
49  const u8 dqs_map_u_lpddr_type_3[8] = { 2, 3, 1, 0, 7, 6, 4, 5 };
50  const u8 dqs_map_y_lpddr[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
51 
52  switch (get_spd_index()) {
53  case icl_u_ddr4:
54  memcpy(dqs_map_ptr, dqs_map_u_ddr, sizeof(dqs_map_u_ddr));
55  break;
56  case icl_u_lpddr4:
57  memcpy(dqs_map_ptr, dqs_map_u_lpddr, sizeof(dqs_map_u_lpddr));
58  break;
60  memcpy(dqs_map_ptr, dqs_map_u_lpddr_type_3,
61  sizeof(dqs_map_u_lpddr_type_3));
62  break;
63  case icl_y_lpddr4:
64  memcpy(dqs_map_ptr, dqs_map_y_lpddr, sizeof(dqs_map_y_lpddr));
65  break;
66  default:
67  break;
68  }
69 }
70 
71 void mainboard_fill_dqs_map_ch1(void *dqs_map_ptr)
72 {
73  /* DQS CPU<>DRAM map Ch1 */
74  const u8 dqs_map_u_ddr[8] = { 1, 3, 2, 0, 5, 7, 6, 4 };
75  const u8 dqs_map_u_lpddr[8] = { 1, 0, 3, 2, 5, 4, 7, 6 };
76  const u8 dqs_map_y_lpddr[8] = { 0, 1, 2, 3, 5, 4, 7, 6 };
77 
78  switch (get_spd_index()) {
79  case icl_u_ddr4:
80  memcpy(dqs_map_ptr, dqs_map_u_ddr, sizeof(dqs_map_u_ddr));
81  break;
82  case icl_u_lpddr4:
84  memcpy(dqs_map_ptr, dqs_map_u_lpddr, sizeof(dqs_map_u_lpddr));
85  break;
86  case icl_y_lpddr4:
87  memcpy(dqs_map_ptr, dqs_map_y_lpddr, sizeof(dqs_map_y_lpddr));
88  break;
89  default:
90  break;
91  }
92 }
93 
94 void mainboard_fill_rcomp_res_data(void *rcomp_ptr)
95 {
96  /* Rcomp resistor */
97  const u16 RcompResistor[3] = { 100, 100, 100 };
98  memcpy(rcomp_ptr, RcompResistor, sizeof(RcompResistor));
99 }
100 
101 void mainboard_fill_rcomp_strength_data(void *rcomp_strength_ptr)
102 {
103  /* Rcomp target */
104  static const u16 RcompTarget_DDR4[5] = {
105  100, 33, 32, 33, 28 };
106  static const u16 RcompTarget_LPDDR4_Ax[5] = {
107  80, 40, 40, 40, 30 };
108  static const u16 RcompTarget_LPDDR4_Bx[5] = {
109  60, 20, 20, 20, 20 };
110 
111  switch (get_spd_index()) {
112  case icl_u_ddr4:
113  memcpy(rcomp_strength_ptr, RcompTarget_DDR4,
114  sizeof(RcompTarget_DDR4));
115  break;
116  case icl_y_lpddr4:
117  case icl_u_lpddr4:
118  case icl_u_lpddr4_type_3:
120  memcpy(rcomp_strength_ptr, RcompTarget_LPDDR4_Ax,
121  sizeof(RcompTarget_LPDDR4_Ax));
122  else
123  memcpy(rcomp_strength_ptr, RcompTarget_LPDDR4_Bx,
124  sizeof(RcompTarget_LPDDR4_Bx));
125  break;
126  default:
127  break;
128  }
129 }
void * memcpy(void *dest, const void *src, size_t n)
Definition: memcpy.c:7
uint32_t cpu_get_cpuid(void)
Definition: cpu_common.c:63
#define CPUID_ICELAKE_A0
Definition: cpu_ids.h:39
void mainboard_fill_rcomp_res_data(void *rcomp_ptr)
Definition: spd_util.c:28
void mainboard_fill_rcomp_strength_data(void *rcomp_strength_ptr)
Definition: spd_util.c:36
void mainboard_fill_dqs_map_ch1(void *dqs_map_ptr)
Definition: spd_util.c:71
void mainboard_fill_dq_map_ch0(void *dq_map_ptr)
Definition: spd_util.c:18
void mainboard_fill_dq_map_ch1(void *dq_map_ptr)
Definition: spd_util.c:28
static uint8_t get_spd_index(void)
Definition: spd_util.c:37
icl_dimm_type
Definition: spd_util.c:11
@ icl_u_ddr4
Definition: spd_util.c:12
@ icl_u_lpddr4
Definition: spd_util.c:13
@ icl_u_lpddr4_type_3
Definition: spd_util.c:14
@ icl_y_lpddr4
Definition: spd_util.c:15
void mainboard_fill_dqs_map_ch0(void *dqs_map_ptr)
Definition: spd_util.c:44
static const int spd_index[32]
Definition: memory.c:10
static uint8_t get_board_id(void)
Definition: boardid.c:14
static const u8 dq_map[][12]
Definition: memory.c:9
uint16_t u16
Definition: stdint.h:48
uint8_t u8
Definition: stdint.h:45
unsigned char uint8_t
Definition: stdint.h:8