blob: fa7309fd27b926578f484f23ea6e9c0c9d8465bc [file] [log] [blame]
Angel Pons8a3453f2020-04-02 23:48:19 +02001/* SPDX-License-Identifier: GPL-2.0-only */
2/* This file is part of the coreboot project. */
Nico Huber34d80362019-10-24 15:14:42 +02003
4#include <stdint.h>
5#include <string.h>
6#include <ctype.h>
7#include <commonlib/helpers.h>
8#include <uuid.h>
9#include <console/console.h>
10#include <device/device.h>
11#include <device/i2c_bus.h>
12#include <smbios.h>
13
14#include "eeprom.h"
15
16#define MAX_STRING_LENGTH UUID_STRLEN
17
18static struct device *eeprom;
19
20static const char *eeprom_read_string(const enum bx26_strings idx)
21{
22 static char str[MAX_STRING_LENGTH + 1];
23
24 if (!eeprom) {
25 printk(BIOS_WARNING, "DMI: Serial EEPROM not found\n");
26 str[0] = '\0';
27 return str;
28 }
29
30 const size_t offset = bx26_locations[idx].offset;
31 const size_t length = MIN(bx26_locations[idx].length, MAX_STRING_LENGTH);
32
33 if (i2c_dev_read_at16(eeprom, (u8 *)str, length, offset) != length) {
34 printk(BIOS_WARNING, "DMI: Failed to read serial EEPROM\n");
35 str[0] = '\0';
36 } else {
37 unsigned int i;
38 /* Terminate at first non-printable character. */
39 for (i = 0; i < length; ++i) {
40 if (!isprint(str[i]))
41 break;
42 }
43 str[i] = '\0';
44 }
45
46 return str;
47}
48
49const char *smbios_system_manufacturer(void)
50{
51 return eeprom_read_string(SYSTEM_MANUFACTURER);
52}
53
54const char *smbios_system_product_name(void)
55{
56 return eeprom_read_string(SYSTEM_PRODUCT_NAME);
57}
58
59const char *smbios_system_serial_number(void)
60{
61 return eeprom_read_string(SYSTEM_SERIAL_NUMBER);
62}
63
64const char *smbios_system_version(void)
65{
66 return eeprom_read_string(SYSTEM_VERSION);
67}
68
69void smbios_system_set_uuid(u8 *const uuid)
70{
71 if (parse_uuid(uuid, eeprom_read_string(SYSTEM_UUID))) {
72 printk(BIOS_WARNING, "DMI: Cannot parse UUID\n");
73 memset(uuid, 0x00, UUID_LEN);
74 }
75}
76
77const char *smbios_mainboard_serial_number(void)
78{
79 return eeprom_read_string(BOARD_SERIAL_NUMBER);
80}
81
82const char *smbios_mainboard_version(void)
83{
84 return eeprom_read_string(BOARD_VERSION);
85}
86
87static void enable_dev(struct device *dev)
88{
89 if (dev->path.type != DEVICE_PATH_I2C || (dev->path.i2c.device & 0xf0) != 0x50)
90 return;
91 eeprom = dev;
92}
93
94struct chip_operations drivers_secunet_dmi_ops = {
95 CHIP_NAME("secunet DMI")
96 .enable_dev = enable_dev,
97};