coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
smbios.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <smbios.h>
4 #include "smbios.h"
5 #include <string.h>
6 #include <commonlib/helpers.h>
7 #include <device/dram/ddr3.h>
8 #include <dimm_info_util.h>
9 
10 #define EXTENSION_BUS_WIDTH_8BITS 8
11 
12 /* Fill the SMBIOS memory information from FSP MEM_INFO_DATA_HOB in CBMEM.*/
13 void dimm_info_fill(struct dimm_info *dimm, u32 dimm_capacity, u8 ddr_type,
14  u32 frequency, u8 rank_per_dimm, u8 channel_id, u8 dimm_id,
15  const char *module_part_num, size_t module_part_number_size,
16  const u8 *module_serial_num, u16 data_width, u32 vdd_voltage,
17  bool ecc_support, u16 mod_id, u8 mod_type)
18 {
19  dimm->mod_id = mod_id;
20  dimm->mod_type = mod_type;
21  dimm->dimm_size = dimm_capacity;
22  dimm->ddr_type = ddr_type;
23  dimm->ddr_frequency = frequency;
24  dimm->rank_per_dimm = rank_per_dimm;
25  dimm->channel_num = channel_id;
26  dimm->dimm_num = dimm_id;
27  if (vdd_voltage > 0xFFFF) {
28  dimm->vdd_voltage = 0xFFFF;
29  } else {
30  dimm->vdd_voltage = vdd_voltage;
31  }
32 
33  strncpy((char *)dimm->module_part_number,
34  module_part_num,
35  MIN(sizeof(dimm->module_part_number),
36  module_part_number_size));
37  if (module_serial_num)
38  memcpy(dimm->serial, module_serial_num,
40 
41  uint16_t total_width = data_width;
42 
43  if (ecc_support)
44  total_width += EXTENSION_BUS_WIDTH_8BITS;
45 
46  dimm->bus_width = smbios_bus_width_to_spd_width(ddr_type, total_width, data_width);
47 }
void * memcpy(void *dest, const void *src, size_t n)
Definition: memcpy.c:7
#define MIN(a, b)
Definition: helpers.h:37
uint8_t smbios_bus_width_to_spd_width(uint8_t ddr_type, uint16_t total_width, uint16_t data_width)
Convert the SMBIOS bit widths into an SPD encoded width.
Definition: dimm_info_util.c:9
Utilities for decoding DDR3 SPDs.
#define DIMM_INFO_SERIAL_SIZE
Definition: memory_info.h:9
#define EXTENSION_BUS_WIDTH_8BITS
Definition: smbios.c:10
void dimm_info_fill(struct dimm_info *dimm, u32 dimm_capacity, u8 ddr_type, u32 frequency, u8 rank_per_dimm, u8 channel_id, u8 dimm_id, const char *module_part_num, size_t module_part_number_size, const u8 *module_serial_num, u16 data_width, u32 vdd_voltage, bool ecc_support, u16 mod_id, u8 mod_type)
Definition: smbios.c:13
unsigned short uint16_t
Definition: stdint.h:11
uint32_t u32
Definition: stdint.h:51
uint16_t u16
Definition: stdint.h:48
uint8_t u8
Definition: stdint.h:45
char * strncpy(char *to, const char *from, int count)
Definition: string.c:72
If this table is filled and put in CBMEM, then these info in CBMEM will be used to generate smbios ty...
Definition: memory_info.h:19
uint8_t mod_type
Definition: memory_info.h:60
uint8_t rank_per_dimm
Definition: memory_info.h:35
uint8_t channel_num
Definition: memory_info.h:36
uint8_t dimm_num
Definition: memory_info.h:37
uint8_t bus_width
Definition: memory_info.h:80
uint8_t module_part_number[DIMM_INFO_PART_NUMBER_SIZE]
Definition: memory_info.h:48
uint16_t ddr_type
Definition: memory_info.h:29
uint8_t serial[DIMM_INFO_SERIAL_SIZE]
Definition: memory_info.h:42
uint16_t vdd_voltage
Definition: memory_info.h:84
uint16_t ddr_frequency
Definition: memory_info.h:34
uint16_t mod_id
Definition: memory_info.h:52
uint32_t dimm_size
Definition: memory_info.h:23