coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
mainboard.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <amdblocks/acpimmio.h>
4 
5 #include <console/console.h>
6 #include <device/device.h>
7 #include <device/mmio.h>
8 #include <device/pci_ops.h>
9 #include <device/pci_def.h>
11 #include <smbios.h>
12 #include <string.h>
17 #include "gpio_ftns.h"
18 #include <AGESA.h>
19 #include <AMD.h>
21 
22 /***********************************************************
23  * These arrays set up the FCH PCI_INTR registers 0xC00/0xC01.
24  * This table is responsible for physically routing the PIC and
25  * IOAPIC IRQs to the different PCI devices on the system. It
26  * is read and written via registers 0xC00/0xC01 as an
27  * Index/Data pair. These values are chipset and mainboard
28  * dependent and should be updated accordingly.
29  *
30  * These values are used by the PCI configuration space,
31  * MP Tables. TODO: Make ACPI use these values too.
32  *
33  * The PCI INTA/B/C/D pins are connected to
34  * FCH pins INTE/F/G/H on the schematic so these need
35  * to be routed as well.
36  */
38  /* INTA# - INTH# */
39  [0x00] = 0x0A,0x0B,0x0A,0x0B,0x0A,0x0B,0x0A,0x0B,
40  /* Misc-nil,0,1,2, INT from Serial irq */
41  [0x08] = 0x00,0xF1,0x00,0x00,0x1F,0x1F,0x1F,0x1F,
42  /* SCI, SMBUS0, ASF, HDA, FC, GEC, PerfMon */
43  [0x10] = 0x1F,0x1F,0x1F,0x0A,0x1F,0x1F,0x1F,
44  /* IMC INT0 - 5 */
45  [0x20] = 0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,
46  /* USB Devs 18/19/20/22 INTA-C */
47  [0x30] = 0x0A,0x0B,0x0A,0x0B,0x0A,0x0B,0x0A,
48  /* IDE, SATA */
49  [0x40] = 0x0B,0x0B,
50  /* GPPInt0 - 3 */
51  [0x50] = 0x0A,0x0B,0x0A,0x0B
52 };
53 
55  /* INTA# - INTH# */
56  [0x00] = 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
57  /* Misc-nil,0,1,2, INT from Serial irq */
58  [0x08] = 0x00,0x00,0x00,0x00,0x1F,0x1F,0x1F,0x1F,
59  /* SCI, SMBUS0, ASF, HDA, FC, GEC, PerMon */
60  [0x10] = 0x09,0x1F,0x1F,0x10,0x1F,0x12,0x1F,
61  /* IMC INT0 - 5 */
62  [0x20] = 0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,
63  /* USB Devs 18/19/22/20 INTA-C */
64  [0x30] = 0x12,0x11,0x12,0x11,0x12,0x11,0x12,
65  /* IDE, SATA */
66  [0x40] = 0x11,0x13,
67  /* GPPInt0 - 3 */
68  [0x50] = 0x10,0x11,0x12,0x13
69 };
70 
71 /*
72  * This table defines the index into the picr/intr_data
73  * tables for each device. Any enabled device and slot
74  * that uses hardware interrupts should have an entry
75  * in this table to define its index into the FCH
76  * PCI_INTR register 0xC00/0xC01. This index will define
77  * the interrupt that it should use. Putting PIRQ_A into
78  * the PIN A index for a device will tell that device to
79  * use PIC IRQ 10 if it uses PIN A for its hardware INT.
80  */
81 /*
82  * The PCI slot INTA/B/C/D connected to PIRQE/F/G/H
83  * but because of PCI INT_PIN swizzle isn't implemented to match
84  * the IDSEL (dev 3) of the slot, the table is adjusted for the
85  * swizzle and INTA is connected to PIRQH so PINA/B/C/D on
86  * off-chip devices should get mapped to PIRQH/E/F/G.
87  */
88 static const struct pirq_struct mainboard_pirq_data[] = {
89  /* {PCI_devfn, {PIN A, PIN B, PIN C, PIN D}}, */
90  {GFX_DEVFN, {PIRQ_A, PIRQ_B, PIRQ_NC, PIRQ_NC}}, /* VGA: 01.0 */
91  {NB_PCIE_PORT1_DEVFN, {PIRQ_A, PIRQ_B, PIRQ_C, PIRQ_D}}, /* NIC: 04.0 */
92  {NB_PCIE_PORT2_DEVFN, {PIRQ_A, PIRQ_B, PIRQ_C, PIRQ_D}}, /* NIC: 05.0 */
93  {NB_PCIE_PORT3_DEVFN, {PIRQ_A, PIRQ_B, PIRQ_C, PIRQ_D}}, /* NIC: 06.0 */
94  {NB_PCIE_PORT4_DEVFN, {PIRQ_A, PIRQ_B, PIRQ_C, PIRQ_D}}, /* miniPCIe: 07.0 */
95  {SATA_DEVFN, {PIRQ_SATA, PIRQ_NC, PIRQ_NC, PIRQ_NC}}, /* SATA: 11.0 */
96  {OHCI1_DEVFN, {PIRQ_OHCI1, PIRQ_NC, PIRQ_NC, PIRQ_NC}}, /* OHCI1: 12.0 */
97  {EHCI1_DEVFN, {PIRQ_NC, PIRQ_EHCI1, PIRQ_NC, PIRQ_NC}}, /* EHCI1: 12.2 */
98  {OHCI2_DEVFN, {PIRQ_OHCI2, PIRQ_NC, PIRQ_NC, PIRQ_NC}}, /* OHCI2: 13.0 */
99  {EHCI2_DEVFN, {PIRQ_NC, PIRQ_EHCI2, PIRQ_NC, PIRQ_NC}}, /* EHCI2: 13.2 */
100  {SMBUS_DEVFN, {PIRQ_SMBUS, PIRQ_NC, PIRQ_NC, PIRQ_NC}}, /* SMBUS: 14.0 */
101  {IDE_DEVFN, {PIRQ_NC, PIRQ_IDE, PIRQ_NC, PIRQ_NC}}, /* IDE: 14.1 */
102  {HDA_DEVFN, {PIRQ_HDA, PIRQ_NC, PIRQ_NC, PIRQ_NC}}, /* HDA: 14.2 */
103  {SB_PCI_PORT_DEVFN, {PIRQ_H, PIRQ_E, PIRQ_F, PIRQ_G}}, /* PCI bdg: 14.4 */
104  {OHCI4_DEVFN, {PIRQ_NC, PIRQ_NC, PIRQ_OHCI4, PIRQ_NC}}, /* OHCI4: 14.5 */
105  {SB_PCIE_PORT1_DEVFN, {PIRQ_A, PIRQ_B, PIRQ_C, PIRQ_D}}, /* miniPCIe: 15.0 */
106  {OHCI3_DEVFN, {PIRQ_OHCI3, PIRQ_NC, PIRQ_NC, PIRQ_NC}}, /* OHCI3: 16.0 */
107  {EHCI3_DEVFN, {PIRQ_NC, PIRQ_EHCI3, PIRQ_NC, PIRQ_NC}}, /* EHCI3: 16.2 */
108 };
109 
110 /* PIRQ Setup */
111 static void pirq_setup(void)
112 {
117 }
118 
119 /* Wrapper to enable GPIO/UART devices under menuconfig. Revisit
120  * once configuration file format for SPI flash storage is complete.
121  */
122 #define SIO_PORT 0x2e
123 
124 static void config_gpio_mux(void)
125 {
126  struct device *uart, *gpio;
127 
130  if (uart)
131  uart->enabled = CONFIG(APU1_PINMUX_UART_C);
132  if (gpio)
133  gpio->enabled = CONFIG(APU1_PINMUX_GPIO0);
134 
137  if (uart)
138  uart->enabled = CONFIG(APU1_PINMUX_UART_D);
139  if (gpio)
140  gpio->enabled = CONFIG(APU1_PINMUX_GPIO1);
141 }
142 
143 static void pnp_raw_resource(struct device *dev, u8 reg, u8 val)
144 {
145  struct resource *res;
146  res = new_resource(dev, reg);
147  res->base = val;
148  res->size = 0;
150 }
151 
152 static void config_addon_uart(void)
153 {
154  struct device *uart;
155 
157  if (uart && uart->enabled && CONFIG(UART_C_RS485))
158  pnp_raw_resource(uart, 0xf2, 0x12);
159 
161  if (uart && uart->enabled && CONFIG(UART_D_RS485))
162  pnp_raw_resource(uart, 0xf2, 0x12);
163 }
164 
165 /**********************************************
166  * Enable the dedicated functions of the board.
167  **********************************************/
168 #if CONFIG(GENERATE_SMBIOS_TABLES)
169 static int mainboard_smbios_type16(DMI_INFO *agesa_dmi, int *handle, unsigned long *current)
170 {
171  const u32 max_capacity = get_spd_offset() ? 4 : 2; /* 4GB or 2GB variant */
172 
174  sizeof(*t), *handle);
175 
178  t->memory_error_correction = agesa_dmi->T16.MemoryErrorCorrection;
179  t->maximum_capacity = max_capacity * 1024 * 1024;
182 
183  const int len = smbios_full_table_len(&t->header, t->eos);
184  *current += len;
185  return len;
186 }
187 
188 static int mainboard_smbios_type17(DMI_INFO *agesa_dmi, int *handle, unsigned long *current)
189 {
191  sizeof(*t), *handle + 1);
192 
193  t->phys_memory_array_handle = *handle;
195  t->total_width = agesa_dmi->T17[0][0][0].TotalWidth;
196  t->data_width = agesa_dmi->T17[0][0][0].DataWidth;
197  t->size = agesa_dmi->T17[0][0][0].MemorySize;
198  /* AGESA DMI returns form factor = 0, override it with SPD value */
200  t->device_set = agesa_dmi->T17[0][0][0].DeviceSet;
201  t->device_locator = smbios_add_string(t->eos, agesa_dmi->T17[0][0][0].DeviceLocator);
202  t->bank_locator = smbios_add_string(t->eos, agesa_dmi->T17[0][0][0].BankLocator);
203  t->memory_type = agesa_dmi->T17[0][0][0].MemoryType;
204  t->type_detail = *(u16 *)&agesa_dmi->T17[0][0][0].TypeDetail;
205  t->speed = agesa_dmi->T17[0][0][0].Speed;
206  t->manufacturer = agesa_dmi->T17[0][0][0].ManufacturerIdCode;
207  t->serial_number = smbios_add_string(t->eos, agesa_dmi->T17[0][0][0].SerialNumber);
208  t->part_number = smbios_add_string(t->eos, agesa_dmi->T17[0][0][0].PartNumber);
209  t->attributes = agesa_dmi->T17[0][0][0].Attributes;
210  t->extended_size = agesa_dmi->T17[0][0][0].ExtSize;
211  t->clock_speed = agesa_dmi->T17[0][0][0].ConfigSpeed;
212  t->minimum_voltage = 1500; /* From SPD: 1.5V */
213  t->maximum_voltage = 1500;
214 
215  const int len = smbios_full_table_len(&t->header, t->eos);
216  *current += len;
217  return len;
218 }
219 
220 static int mainboard_smbios_data(struct device *dev, int *handle,
221  unsigned long *current)
222 {
223  DMI_INFO *agesa_dmi;
224  int len;
225 
227 
228  if (!agesa_dmi)
229  return 0;
230 
231  len = mainboard_smbios_type16(agesa_dmi, handle, current);
232  len += mainboard_smbios_type17(agesa_dmi, handle, current);
233 
234  *handle += 2;
235 
236  return len;
237 }
238 #endif
239 
240 static void mainboard_enable(struct device *dev)
241 {
242  /* Maintain this text unchanged for manufacture process. */
243  printk(BIOS_INFO, "Mainboard " CONFIG_MAINBOARD_PART_NUMBER " Enable.\n");
244 
245  config_gpio_mux();
247 
248  /* Power off unused clock pins of GPP PCIe devices
249  * GPP CLK0-2 are connected to the 3 ethernet chips
250  * GPP CLK3-4 are connected to the miniPCIe slots
251  */
252  misc_write8(0, 0x21);
253  misc_write8(1, 0x43);
254  /* GPP CLK5 is only connected to test pads -> disable */
255  misc_write8(2, 0x05);
256  /* disable unconnected GPP CLK6-8 and SLT_GFX_CLK */
257  misc_write8(3, 0);
258  misc_write8(4, 0);
259 
260  /* Initialize the PIRQ data structures for consumption */
261  pirq_setup();
262 #if CONFIG(GENERATE_SMBIOS_TABLES)
263  dev->ops->get_smbios_data = mainboard_smbios_data;
264 #endif
265 }
266 
267 /*
268  * We will stuff a modified version of the first NICs (BDF 1:0.0) MAC address
269  * into the smbios serial number location.
270  */
272 {
273  static char serial[10];
274  struct device *dev;
275  uintptr_t bar18;
276  u32 mac_addr = 0;
277  int i;
278 
279  /* Already initialized. */
280  if (serial[0] != 0)
281  return serial;
282 
283  dev = pcidev_on_root(4, 0);
284  if (dev)
285  dev = pcidev_path_behind(dev->link_list, PCI_DEVFN(0, 0));
286  if (!dev)
287  return serial;
288 
289  /* Read in the last 3 bytes of NIC's MAC address. */
291  bar18 &= 0xFFFFFFF0;
292  for (i = 3; i < 6; i++) {
293  mac_addr <<= 8;
294  mac_addr |= read8((u8 *)bar18 + i);
295  }
296  mac_addr &= 0x00FFFFFF;
297  mac_addr /= 4;
298  mac_addr -= 64;
299 
300  snprintf(serial, sizeof(serial), "%d", mac_addr);
301  return serial;
302 }
303 
304 /*
305  * Set up "Over Current Control 1" (reg 0x58) on the first OHCI device.
306  * The remaining ports on the second device are for mcpie2/sdcard and
307  * can stay at the power-on default value.
308  *
309  * The schematic shows this transposed mapping for the first device:
310  * chipset port 0 -> port 1 (j12 external 2, usboc0#)
311  * chipset port 1 -> port 4 (j17 mpcie1)
312  * chipset port 2 -> port 2 (j14 header row1, usboc1#)
313  * chipset port 3 -> port 3 (j14 header row2, usboc1#)
314  * chipset port 4 -> port 0 (j12 external 1. usboc0#)
315  *
316  * Register mapping:
317  * bit0-3: Mapping for HS Port 0
318  * bit4-7: Mapping for HS Port 1
319  * bit8-11: Mapping for HS Port 2
320  * bit12-15: Mapping for HS Port 3
321  * bit16-19: Mapping for HS Port 4
322  * bit20-31: Reserved (0)
323  *
324  * power-on default: 0xfffff
325  * A value >7 will disable the overcurrent detection.
326  */
327 static void usb_oc_setup(void)
328 {
329  struct device *dev = pcidev_on_root(0x12, 0);
330 
331  pci_write_config32(dev, 0x58, 0x011f0);
332 }
333 
334 /*
335  * We will stuff the memory size into the smbios sku location.
336  */
337 const char *smbios_system_sku(void)
338 {
339  static char sku[5];
340  if (sku[0] != 0)
341  return sku;
342 
343  if (!get_spd_offset())
344  snprintf(sku, sizeof(sku), "2 GB");
345  else
346  snprintf(sku, sizeof(sku), "4 GB");
347  return sku;
348 }
349 
350 static void mainboard_final(void *chip_info)
351 {
352  /* Maintain this text unchanged for manufacture process. */
353  printk(BIOS_INFO, "Mainboard " CONFIG_MAINBOARD_PART_NUMBER " Final.\n");
354 
355  /*
356  * LED1/D7/GPIO_189 should be 0
357  * LED2/D6/GPIO_190 should be 1
358  * LED3/D5/GPIO_191 should be 1
359  */
363  usb_oc_setup();
364 }
365 
368  .final = mainboard_final,
369 };
struct chip_operations mainboard_ops
Definition: mainboard.c:19
@ PIRQ_A
Definition: acpi_pirq_gen.h:22
@ PIRQ_C
Definition: acpi_pirq_gen.h:24
@ PIRQ_G
Definition: acpi_pirq_gen.h:28
@ PIRQ_H
Definition: acpi_pirq_gen.h:29
@ PIRQ_E
Definition: acpi_pirq_gen.h:26
@ PIRQ_D
Definition: acpi_pirq_gen.h:25
@ PIRQ_F
Definition: acpi_pirq_gen.h:27
@ PIRQ_B
Definition: acpi_pirq_gen.h:23
static void misc_write8(uint8_t reg, uint8_t value)
Definition: acpimmio.h:271
@ PICK_DMI
Definition: agesa_helper.h:10
void configure_gpio(u8 gpio, u8 iomux_ftn, u8 setting)
Definition: gpio_ftns.c:8
int get_spd_offset(void)
Definition: gpio_ftns.c:25
#define GPIO_OUTPUT
Definition: gpio_ftns.h:23
#define GPIO_191
Definition: gpio_ftns.h:21
#define GPIO_DATA_HIGH
Definition: gpio_ftns.h:27
#define GPIO_DATA_LOW
Definition: gpio_ftns.h:26
#define GPIO_189
Definition: gpio_ftns.h:19
#define GPIO_FTN_1
Definition: gpio_ftns.h:22
#define GPIO_190
Definition: gpio_ftns.h:20
static uint8_t read8(const void *addr)
Definition: mmio.h:12
int smbios_add_string(u8 *start, const char *str)
Definition: smbios.c:40
void * smbios_carve_table(unsigned long start, u8 type, u8 length, u16 handle)
Definition: smbios.c:91
int smbios_full_table_len(struct smbios_header *header, u8 *str_table_start)
Definition: smbios.c:86
#define ARRAY_SIZE(a)
Definition: helpers.h:12
#define printk(level,...)
Definition: stdlib.h:16
DEVTREE_CONST struct device * pcidev_path_behind(const struct bus *parent, pci_devfn_t devfn)
Definition: device_const.c:211
DEVTREE_CONST struct device * dev_find_slot_pnp(u16 port, u16 device)
Given a PnP port and a device number, find the device structure.
Definition: device_const.c:331
DEVTREE_CONST struct device * pcidev_on_root(uint8_t dev, uint8_t fn)
Definition: device_const.c:260
struct resource * new_resource(struct device *dev, unsigned int index)
See if a resource structure already exists for a given index and if not allocate one.
Definition: device_util.c:346
void * agesawrapper_getlateinitptr(int pick)
Definition: acpi_tables.c:34
@ CONFIG
Definition: dsi_common.h:201
static int mainboard_smbios_data(struct device *dev, int *handle, unsigned long *current)
Definition: mainboard.c:18
const char * smbios_system_sku(void)
Definition: mainboard.c:174
enum project_sku sku
Definition: mainboard.c:51
static __always_inline void pci_write_config32(const struct device *dev, u16 reg, u32 val)
Definition: pci_ops.h:76
static __always_inline u32 pci_read_config32(const struct device *dev, u16 reg)
Definition: pci_ops.h:58
@ MEMORY_ARRAY_USE_SYSTEM
Definition: smbios.h:220
@ SMBIOS_MEMORY_DEVICE
Definition: smbios.h:250
@ SMBIOS_PHYS_MEMORY_ARRAY
Definition: smbios.h:249
@ MEMORY_FORMFACTOR_SODIMM
Definition: smbios.h:158
@ MEMORY_ARRAY_LOCATION_SYSTEM_BOARD
Definition: smbios.h:202
unsigned int serial
Definition: edid.c:52
#define BIOS_INFO
BIOS_INFO - Expected events.
Definition: loglevel.h:113
#define NCT5104D_SP3
Definition: nct5104d.h:29
#define NCT5104D_GPIO0
Definition: nct5104d.h:40
#define NCT5104D_SP4
Definition: nct5104d.h:30
#define NCT5104D_GPIO1
Definition: nct5104d.h:41
#define NB_PCIE_PORT2_DEVFN
Definition: pci_devs.h:34
#define NB_PCIE_PORT3_DEVFN
Definition: pci_devs.h:35
#define NB_PCIE_PORT4_DEVFN
Definition: pci_devs.h:36
#define NB_PCIE_PORT1_DEVFN
Definition: pci_devs.h:33
#define GFX_DEVFN
Definition: pci_devs.h:13
static void config_gpio_mux(void)
Definition: mainboard.c:124
#define SIO_PORT
Definition: mainboard.c:122
const char * smbios_mainboard_serial_number(void)
Definition: mainboard.c:271
static void config_addon_uart(void)
Definition: mainboard.c:152
static void usb_oc_setup(void)
Definition: mainboard.c:327
static const u8 mainboard_picr_data[FCH_INT_TABLE_SIZE]
Definition: mainboard.c:37
static const struct pirq_struct mainboard_pirq_data[]
Definition: mainboard.c:88
static void mainboard_final(void *chip_info)
Definition: mainboard.c:350
static void pnp_raw_resource(struct device *dev, u8 reg, u8 val)
Definition: mainboard.c:143
static void mainboard_enable(struct device *dev)
Definition: mainboard.c:240
static void pirq_setup(void)
Definition: mainboard.c:111
static const u8 mainboard_intr_data[FCH_INT_TABLE_SIZE]
Definition: mainboard.c:54
#define PCI_DEVFN(slot, func)
Definition: pci_def.h:548
#define PCI_BASE_ADDRESS_2
Definition: pci_def.h:65
#define IORESOURCE_IRQ
Definition: resource.h:11
#define IORESOURCE_ASSIGNED
Definition: resource.h:34
#define PIRQ_SATA
#define PIRQ_SMBUS
#define PIRQ_NC
#define SMBUS_DEVFN
Definition: pci_devs.h:117
u32 pirq_data_size
Definition: amd_pci_util.c:12
const u8 * intr_data_ptr
Definition: amd_pci_util.c:13
const u8 * picr_data_ptr
Definition: amd_pci_util.c:14
const struct pirq_struct * pirq_data_ptr
Definition: amd_pci_util.c:11
#define SATA_DEVFN
Definition: pci_devs.h:83
#define PIRQ_HDA
#define EHCI1_DEVFN
Definition: pci_devs.h:170
#define PIRQ_OHCI2
#define PIRQ_OHCI1
#define PIRQ_EHCI3
#define PIRQ_IDE
#define PIRQ_OHCI4
#define PIRQ_OHCI3
#define PIRQ_EHCI2
#define PIRQ_EHCI1
#define HDA_DEVFN
Definition: pci_devs.h:69
#define OHCI4_DEVFN
Definition: pci_devs.h:37
#define OHCI1_DEVFN
Definition: pci_devs.h:34
#define EHCI3_DEVFN
Definition: pci_devs.h:49
#define SB_PCI_PORT_DEVFN
Definition: pci_devs.h:82
#define OHCI3_DEVFN
Definition: pci_devs.h:36
#define EHCI2_DEVFN
Definition: pci_devs.h:48
#define OHCI2_DEVFN
Definition: pci_devs.h:35
#define FCH_INT_TABLE_SIZE
#define SB_PCIE_PORT1_DEVFN
Definition: pci_devs.h:87
#define IDE_DEVFN
Definition: pci_devs.h:56
uint32_t u32
Definition: stdint.h:51
unsigned long uintptr_t
Definition: stdint.h:21
uint16_t u16
Definition: stdint.h:48
uint8_t u8
Definition: stdint.h:45
void(* enable_dev)(struct device *dev)
Definition: device.h:24
Definition: device.h:107
struct device_operations * ops
Definition: device.h:143
DEVTREE_CONST struct bus * link_list
Definition: device.h:139
DEVTREE_CONST void * chip_info
Definition: device.h:164
unsigned int enabled
Definition: device.h:122
Definition: pinmux.c:36
unsigned long flags
Definition: resource.h:49
resource_t base
Definition: resource.h:45
resource_t size
Definition: resource.h:46
struct smbios_header header
Definition: smbios.h:849
u16 number_of_memory_devices
Definition: smbios.h:855
u8 memory_error_correction
Definition: smbios.h:852
u16 memory_error_information_handle
Definition: smbios.h:854
u32 maximum_capacity
Definition: smbios.h:853
u8 eos[2]
Definition: smbios.h:857
u16 memory_error_information_handle
Definition: smbios.h:863
u8 manufacturer
Definition: smbios.h:874
u16 data_width
Definition: smbios.h:865
u8 device_locator
Definition: smbios.h:869
u16 type_detail
Definition: smbios.h:872
u32 extended_size
Definition: smbios.h:879
u16 minimum_voltage
Definition: smbios.h:881
u16 clock_speed
Definition: smbios.h:880
u8 bank_locator
Definition: smbios.h:870
u8 serial_number
Definition: smbios.h:875
u8 form_factor
Definition: smbios.h:867
u8 memory_type
Definition: smbios.h:871
u8 device_set
Definition: smbios.h:868
u8 eos[2]
Definition: smbios.h:884
u16 phys_memory_array_handle
Definition: smbios.h:862
u16 total_width
Definition: smbios.h:864
u8 attributes
Definition: smbios.h:878
struct smbios_header header
Definition: smbios.h:861
u16 maximum_voltage
Definition: smbios.h:882
u8 part_number
Definition: smbios.h:877
u8 val
Definition: sys.c:300
int snprintf(char *buf, size_t size, const char *fmt,...)
Note: This file is only for POSIX compatibility, and is meant to be chain-included via string....
Definition: vsprintf.c:35