forked from Minki/linux
6c1bfbd9df
Add /sys/firmware/lefi/boardinfo to get mainboard and BIOS info easily on the Loongson platform, this is useful to point out the current used mainboard type and BIOS version when there exists problems related with hardware or firmware. The related structures are already defined in the interface specification about firmware and kernel which are common requirement and specific for Loongson64, so only add a new boardinfo.c file in arch/mips/loongson64. E.g. with this patch: [loongson@linux ~]$ cat /sys/firmware/lefi/boardinfo Board Info Manufacturer : LEMOTE Board Name : LEMOTE-LS3A4000-7A1000-1w-V01-pc Family : LOONGSON3 BIOS Info Vendor : Kunlun Version : Kunlun-A1901-V4.1.3-20200414093938 ROM Size : 4 KB Release Date : 2020-04-14 By the way, using dmidecode command can get the similar info if there exists SMBIOS in firmware, but the fact is that there is no SMBIOS on some machines, we can see nothing when execute dmidecode, like this: [root@linux loongson]# dmidecode # dmidecode 2.12 # No SMBIOS nor DMI entry point found, sorry. Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn> Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
49 lines
1.3 KiB
C
49 lines
1.3 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
#include <linux/kobject.h>
|
|
#include <boot_param.h>
|
|
|
|
static ssize_t boardinfo_show(struct kobject *kobj,
|
|
struct kobj_attribute *attr, char *buf)
|
|
{
|
|
char board_manufacturer[64] = {0};
|
|
char *tmp_board_manufacturer = board_manufacturer;
|
|
char bios_vendor[64] = {0};
|
|
char *tmp_bios_vendor = bios_vendor;
|
|
|
|
strcpy(board_manufacturer, eboard->name);
|
|
strcpy(bios_vendor, einter->description);
|
|
|
|
return sprintf(buf,
|
|
"Board Info\n"
|
|
"Manufacturer\t\t: %s\n"
|
|
"Board Name\t\t: %s\n"
|
|
"Family\t\t\t: LOONGSON3\n\n"
|
|
"BIOS Info\n"
|
|
"Vendor\t\t\t: %s\n"
|
|
"Version\t\t\t: %s\n"
|
|
"ROM Size\t\t: %d KB\n"
|
|
"Release Date\t\t: %s\n",
|
|
strsep(&tmp_board_manufacturer, "-"),
|
|
eboard->name,
|
|
strsep(&tmp_bios_vendor, "-"),
|
|
einter->description,
|
|
einter->size,
|
|
especial->special_name);
|
|
}
|
|
static struct kobj_attribute boardinfo_attr = __ATTR(boardinfo, 0444,
|
|
boardinfo_show, NULL);
|
|
|
|
static int __init boardinfo_init(void)
|
|
{
|
|
struct kobject *lefi_kobj;
|
|
|
|
lefi_kobj = kobject_create_and_add("lefi", firmware_kobj);
|
|
if (!lefi_kobj) {
|
|
pr_err("lefi: Firmware registration failed.\n");
|
|
return -ENOMEM;
|
|
}
|
|
|
|
return sysfs_create_file(lefi_kobj, &boardinfo_attr.attr);
|
|
}
|
|
late_initcall(boardinfo_init);
|