summaryrefslogtreecommitdiffstats
path: root/src/include/memory_info.h
blob: 74aa2a7b88db73530e1d5047164a440ab4acbfd1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/* Memory information */
/* SPDX-License-Identifier: GPL-2.0-only */

#ifndef _MEMORY_INFO_H_
#define _MEMORY_INFO_H_

#include <stdint.h>

#define DIMM_INFO_SERIAL_SIZE		4
#define DIMM_INFO_PART_NUMBER_SIZE	33
#define DIMM_INFO_TOTAL			64

/**
 * If this table is filled and put in CBMEM,
 * then these info in CBMEM will be used to generate smbios type 17 table
 *
 * Values are specified according to the JEDEC SPD Standard.
 */
struct dimm_info {
	/*
	 * Size of the module in MiB.
	 */
	uint32_t dimm_size;
	/*
	 * SMBIOS (not SPD) device type.
	 *
	 * See the smbios.h smbios_memory_type enum.
	 */
	uint16_t ddr_type;
	/*
	 * ddr_frequency is deprecated.
	 * Use max_speed_mts and configured_speed_mts instead.
	 */
	uint16_t ddr_frequency;
	uint8_t rank_per_dimm;
	/*
	 * Socket-ID
	 */
	uint8_t soc_num;
	/*
	 * Memory-Controller-ID
	 */
	uint8_t ctrlr_num;
	/*
	 * Channel-ID
	 */
	uint8_t channel_num;
	/*
	 * DIMM-ID
	 */
	uint8_t dimm_num;
	uint8_t bank_locator;
	/*
	 * SPD serial number.
	 */
	uint8_t serial[DIMM_INFO_SERIAL_SIZE];
	/*
	 * The last byte is '\0' for the end of string
	 *
	 * Must contain only printable ASCII.
	 */
	uint8_t module_part_number[DIMM_INFO_PART_NUMBER_SIZE];
	/*
	 * SPD Manufacturer ID
	 */
	uint16_t mod_id;
	/*
	 * SPD Module Type.
	 *
	 * See spd.h for valid values.
	 *
	 * e.g., SPD_RDIMM, SPD_SODIMM, SPD_MICRO_DIMM
	 */
	uint8_t mod_type;
	/*
	 * SPD bus width.
	 *
	 * Bits 0 - 2 encode the primary bus width:
	 *   0b000 = 8 bit width
	 *   0b001 = 16 bit width
	 *   0b010 = 32 bit width
	 *   0b011 = 64 bit width
	 *
	 * Bits 3 - 4 encode the extension bits (ECC):
	 *   0b00 = 0 extension bits
	 *   0b01 = 8 bit of ECC
	 *
	 * e.g.,
	 *   64 bit bus with 8 bits of ECC (72 bits total): 0b1011
	 *   64 bit bus with 0 bits of ECC (64 bits total): 0b0011
	 *
	 * See the smbios.h smbios_memory_bus_width enum.
	 */
	uint8_t bus_width;
	/*
	 * Voltage Level
	 */
	uint16_t vdd_voltage;
	/*
	 * Max speed in MT/s
	 * If the value is 0, ddr_frequency should be used instead.
	 */
	uint16_t max_speed_mts;
	/*
	 * Configured speed in MT/s
	 * If the value is 0, ddr_frequency should be used instead.
	 */
	uint16_t configured_speed_mts;
} __packed;

struct memory_info {
	/*
	 * SMBIOS error correction type.
	 * See the smbios.h smbios_memory_array_ecc enum.
	 */
	uint8_t ecc_type;
	/* Maximum capacity the DRAM controller/mainboard supports */
	uint32_t max_capacity_mib;
	/* Maximum number of DIMMs the DRAM controller/mainboard supports */
	uint16_t number_of_devices;

	/* active DIMM configuration */
	uint8_t dimm_cnt;
	struct dimm_info dimm[DIMM_INFO_TOTAL];
} __packed;

/*
 * mainboard_get_dram_part_num returns a DRAM part number override string
 *  return NULL = no part number override provided by mainboard
 *  return non-NULL = pointer to a string terminating in '\0'
 */
const char *mainboard_get_dram_part_num(void);
#endif