linux/drivers/firmware/dmi_scan.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2#include <linux/types.h>
   3#include <linux/string.h>
   4#include <linux/init.h>
   5#include <linux/module.h>
   6#include <linux/ctype.h>
   7#include <linux/dmi.h>
   8#include <linux/efi.h>
   9#include <linux/memblock.h>
  10#include <linux/random.h>
  11#include <asm/dmi.h>
  12#include <asm/unaligned.h>
  13
  14#ifndef SMBIOS_ENTRY_POINT_SCAN_START
  15#define SMBIOS_ENTRY_POINT_SCAN_START 0xF0000
  16#endif
  17
  18struct kobject *dmi_kobj;
  19EXPORT_SYMBOL_GPL(dmi_kobj);
  20
  21/*
  22 * DMI stands for "Desktop Management Interface".  It is part
  23 * of and an antecedent to, SMBIOS, which stands for System
  24 * Management BIOS.  See further: https://www.dmtf.org/standards
  25 */
  26static const char dmi_empty_string[] = "";
  27
  28static u32 dmi_ver __initdata;
  29static u32 dmi_len;
  30static u16 dmi_num;
  31static u8 smbios_entry_point[32];
  32static int smbios_entry_point_size;
  33
  34/* DMI system identification string used during boot */
  35static char dmi_ids_string[128] __initdata;
  36
  37static struct dmi_memdev_info {
  38        const char *device;
  39        const char *bank;
  40        u64 size;               /* bytes */
  41        u16 handle;
  42        u8 type;                /* DDR2, DDR3, DDR4 etc */
  43} *dmi_memdev;
  44static int dmi_memdev_nr;
  45
  46static const char * __init dmi_string_nosave(const struct dmi_header *dm, u8 s)
  47{
  48        const u8 *bp = ((u8 *) dm) + dm->length;
  49        const u8 *nsp;
  50
  51        if (s) {
  52                while (--s > 0 && *bp)
  53                        bp += strlen(bp) + 1;
  54
  55                /* Strings containing only spaces are considered empty */
  56                nsp = bp;
  57                while (*nsp == ' ')
  58                        nsp++;
  59                if (*nsp != '\0')
  60                        return bp;
  61        }
  62
  63        return dmi_empty_string;
  64}
  65
  66static const char * __init dmi_string(const struct dmi_header *dm, u8 s)
  67{
  68        const char *bp = dmi_string_nosave(dm, s);
  69        char *str;
  70        size_t len;
  71
  72        if (bp == dmi_empty_string)
  73                return dmi_empty_string;
  74
  75        len = strlen(bp) + 1;
  76        str = dmi_alloc(len);
  77        if (str != NULL)
  78                strcpy(str, bp);
  79
  80        return str;
  81}
  82
  83/*
  84 *      We have to be cautious here. We have seen BIOSes with DMI pointers
  85 *      pointing to completely the wrong place for example
  86 */
  87static void dmi_decode_table(u8 *buf,
  88                             void (*decode)(const struct dmi_header *, void *),
  89                             void *private_data)
  90{
  91        u8 *data = buf;
  92        int i = 0;
  93
  94        /*
  95         * Stop when we have seen all the items the table claimed to have
  96         * (SMBIOS < 3.0 only) OR we reach an end-of-table marker (SMBIOS
  97         * >= 3.0 only) OR we run off the end of the table (should never
  98         * happen but sometimes does on bogus implementations.)
  99         */
 100        while ((!dmi_num || i < dmi_num) &&
 101               (data - buf + sizeof(struct dmi_header)) <= dmi_len) {
 102                const struct dmi_header *dm = (const struct dmi_header *)data;
 103
 104                /*
 105                 *  We want to know the total length (formatted area and
 106                 *  strings) before decoding to make sure we won't run off the
 107                 *  table in dmi_decode or dmi_string
 108                 */
 109                data += dm->length;
 110                while ((data - buf < dmi_len - 1) && (data[0] || data[1]))
 111                        data++;
 112                if (data - buf < dmi_len - 1)
 113                        decode(dm, private_data);
 114
 115                data += 2;
 116                i++;
 117
 118                /*
 119                 * 7.45 End-of-Table (Type 127) [SMBIOS reference spec v3.0.0]
 120                 * For tables behind a 64-bit entry point, we have no item
 121                 * count and no exact table length, so stop on end-of-table
 122                 * marker. For tables behind a 32-bit entry point, we have
 123                 * seen OEM structures behind the end-of-table marker on
 124                 * some systems, so don't trust it.
 125                 */
 126                if (!dmi_num && dm->type == DMI_ENTRY_END_OF_TABLE)
 127                        break;
 128        }
 129
 130        /* Trim DMI table length if needed */
 131        if (dmi_len > data - buf)
 132                dmi_len = data - buf;
 133}
 134
 135static phys_addr_t dmi_base;
 136
 137static int __init dmi_walk_early(void (*decode)(const struct dmi_header *,
 138                void *))
 139{
 140        u8 *buf;
 141        u32 orig_dmi_len = dmi_len;
 142
 143        buf = dmi_early_remap(dmi_base, orig_dmi_len);
 144        if (buf == NULL)
 145                return -ENOMEM;
 146
 147        dmi_decode_table(buf, decode, NULL);
 148
 149        add_device_randomness(buf, dmi_len);
 150
 151        dmi_early_unmap(buf, orig_dmi_len);
 152        return 0;
 153}
 154
 155static int __init dmi_checksum(const u8 *buf, u8 len)
 156{
 157        u8 sum = 0;
 158        int a;
 159
 160        for (a = 0; a < len; a++)
 161                sum += buf[a];
 162
 163        return sum == 0;
 164}
 165
 166static const char *dmi_ident[DMI_STRING_MAX];
 167static LIST_HEAD(dmi_devices);
 168int dmi_available;
 169EXPORT_SYMBOL_GPL(dmi_available);
 170
 171/*
 172 *      Save a DMI string
 173 */
 174static void __init dmi_save_ident(const struct dmi_header *dm, int slot,
 175                int string)
 176{
 177        const char *d = (const char *) dm;
 178        const char *p;
 179
 180        if (dmi_ident[slot] || dm->length <= string)
 181                return;
 182
 183        p = dmi_string(dm, d[string]);
 184        if (p == NULL)
 185                return;
 186
 187        dmi_ident[slot] = p;
 188}
 189
 190static void __init dmi_save_release(const struct dmi_header *dm, int slot,
 191                int index)
 192{
 193        const u8 *minor, *major;
 194        char *s;
 195
 196        /* If the table doesn't have the field, let's return */
 197        if (dmi_ident[slot] || dm->length < index)
 198                return;
 199
 200        minor = (u8 *) dm + index;
 201        major = (u8 *) dm + index - 1;
 202
 203        /* As per the spec, if the system doesn't support this field,
 204         * the value is FF
 205         */
 206        if (*major == 0xFF && *minor == 0xFF)
 207                return;
 208
 209        s = dmi_alloc(8);
 210        if (!s)
 211                return;
 212
 213        sprintf(s, "%u.%u", *major, *minor);
 214
 215        dmi_ident[slot] = s;
 216}
 217
 218static void __init dmi_save_uuid(const struct dmi_header *dm, int slot,
 219                int index)
 220{
 221        const u8 *d;
 222        char *s;
 223        int is_ff = 1, is_00 = 1, i;
 224
 225        if (dmi_ident[slot] || dm->length < index + 16)
 226                return;
 227
 228        d = (u8 *) dm + index;
 229        for (i = 0; i < 16 && (is_ff || is_00); i++) {
 230                if (d[i] != 0x00)
 231                        is_00 = 0;
 232                if (d[i] != 0xFF)
 233                        is_ff = 0;
 234        }
 235
 236        if (is_ff || is_00)
 237                return;
 238
 239        s = dmi_alloc(16*2+4+1);
 240        if (!s)
 241                return;
 242
 243        /*
 244         * As of version 2.6 of the SMBIOS specification, the first 3 fields of
 245         * the UUID are supposed to be little-endian encoded.  The specification
 246         * says that this is the defacto standard.
 247         */
 248        if (dmi_ver >= 0x020600)
 249                sprintf(s, "%pUl", d);
 250        else
 251                sprintf(s, "%pUb", d);
 252
 253        dmi_ident[slot] = s;
 254}
 255
 256static void __init dmi_save_type(const struct dmi_header *dm, int slot,
 257                int index)
 258{
 259        const u8 *d;
 260        char *s;
 261
 262        if (dmi_ident[slot] || dm->length <= index)
 263                return;
 264
 265        s = dmi_alloc(4);
 266        if (!s)
 267                return;
 268
 269        d = (u8 *) dm + index;
 270        sprintf(s, "%u", *d & 0x7F);
 271        dmi_ident[slot] = s;
 272}
 273
 274static void __init dmi_save_one_device(int type, const char *name)
 275{
 276        struct dmi_device *dev;
 277
 278        /* No duplicate device */
 279        if (dmi_find_device(type, name, NULL))
 280                return;
 281
 282        dev = dmi_alloc(sizeof(*dev) + strlen(name) + 1);
 283        if (!dev)
 284                return;
 285
 286        dev->type = type;
 287        strcpy((char *)(dev + 1), name);
 288        dev->name = (char *)(dev + 1);
 289        dev->device_data = NULL;
 290        list_add(&dev->list, &dmi_devices);
 291}
 292
 293static void __init dmi_save_devices(const struct dmi_header *dm)
 294{
 295        int i, count = (dm->length - sizeof(struct dmi_header)) / 2;
 296
 297        for (i = 0; i < count; i++) {
 298                const char *d = (char *)(dm + 1) + (i * 2);
 299
 300                /* Skip disabled device */
 301                if ((*d & 0x80) == 0)
 302                        continue;
 303
 304                dmi_save_one_device(*d & 0x7f, dmi_string_nosave(dm, *(d + 1)));
 305        }
 306}
 307
 308static void __init dmi_save_oem_strings_devices(const struct dmi_header *dm)
 309{
 310        int i, count;
 311        struct dmi_device *dev;
 312
 313        if (dm->length < 0x05)
 314                return;
 315
 316        count = *(u8 *)(dm + 1);
 317        for (i = 1; i <= count; i++) {
 318                const char *devname = dmi_string(dm, i);
 319
 320                if (devname == dmi_empty_string)
 321                        continue;
 322
 323                dev = dmi_alloc(sizeof(*dev));
 324                if (!dev)
 325                        break;
 326
 327                dev->type = DMI_DEV_TYPE_OEM_STRING;
 328                dev->name = devname;
 329                dev->device_data = NULL;
 330
 331                list_add(&dev->list, &dmi_devices);
 332        }
 333}
 334
 335static void __init dmi_save_ipmi_device(const struct dmi_header *dm)
 336{
 337        struct dmi_device *dev;
 338        void *data;
 339
 340        data = dmi_alloc(dm->length);
 341        if (data == NULL)
 342                return;
 343
 344        memcpy(data, dm, dm->length);
 345
 346        dev = dmi_alloc(sizeof(*dev));
 347        if (!dev)
 348                return;
 349
 350        dev->type = DMI_DEV_TYPE_IPMI;
 351        dev->name = "IPMI controller";
 352        dev->device_data = data;
 353
 354        list_add_tail(&dev->list, &dmi_devices);
 355}
 356
 357static void __init dmi_save_dev_pciaddr(int instance, int segment, int bus,
 358                                        int devfn, const char *name, int type)
 359{
 360        struct dmi_dev_onboard *dev;
 361
 362        /* Ignore invalid values */
 363        if (type == DMI_DEV_TYPE_DEV_SLOT &&
 364            segment == 0xFFFF && bus == 0xFF && devfn == 0xFF)
 365                return;
 366
 367        dev = dmi_alloc(sizeof(*dev) + strlen(name) + 1);
 368        if (!dev)
 369                return;
 370
 371        dev->instance = instance;
 372        dev->segment = segment;
 373        dev->bus = bus;
 374        dev->devfn = devfn;
 375
 376        strcpy((char *)&dev[1], name);
 377        dev->dev.type = type;
 378        dev->dev.name = (char *)&dev[1];
 379        dev->dev.device_data = dev;
 380
 381        list_add(&dev->dev.list, &dmi_devices);
 382}
 383
 384static void __init dmi_save_extended_devices(const struct dmi_header *dm)
 385{
 386        const char *name;
 387        const u8 *d = (u8 *)dm;
 388
 389        if (dm->length < 0x0B)
 390                return;
 391
 392        /* Skip disabled device */
 393        if ((d[0x5] & 0x80) == 0)
 394                return;
 395
 396        name = dmi_string_nosave(dm, d[0x4]);
 397        dmi_save_dev_pciaddr(d[0x6], *(u16 *)(d + 0x7), d[0x9], d[0xA], name,
 398                             DMI_DEV_TYPE_DEV_ONBOARD);
 399        dmi_save_one_device(d[0x5] & 0x7f, name);
 400}
 401
 402static void __init dmi_save_system_slot(const struct dmi_header *dm)
 403{
 404        const u8 *d = (u8 *)dm;
 405
 406        /* Need SMBIOS 2.6+ structure */
 407        if (dm->length < 0x11)
 408                return;
 409        dmi_save_dev_pciaddr(*(u16 *)(d + 0x9), *(u16 *)(d + 0xD), d[0xF],
 410                             d[0x10], dmi_string_nosave(dm, d[0x4]),
 411                             DMI_DEV_TYPE_DEV_SLOT);
 412}
 413
 414static void __init count_mem_devices(const struct dmi_header *dm, void *v)
 415{
 416        if (dm->type != DMI_ENTRY_MEM_DEVICE)
 417                return;
 418        dmi_memdev_nr++;
 419}
 420
 421static void __init save_mem_devices(const struct dmi_header *dm, void *v)
 422{
 423        const char *d = (const char *)dm;
 424        static int nr;
 425        u64 bytes;
 426        u16 size;
 427
 428        if (dm->type != DMI_ENTRY_MEM_DEVICE || dm->length < 0x13)
 429                return;
 430        if (nr >= dmi_memdev_nr) {
 431                pr_warn(FW_BUG "Too many DIMM entries in SMBIOS table\n");
 432                return;
 433        }
 434        dmi_memdev[nr].handle = get_unaligned(&dm->handle);
 435        dmi_memdev[nr].device = dmi_string(dm, d[0x10]);
 436        dmi_memdev[nr].bank = dmi_string(dm, d[0x11]);
 437        dmi_memdev[nr].type = d[0x12];
 438
 439        size = get_unaligned((u16 *)&d[0xC]);
 440        if (size == 0)
 441                bytes = 0;
 442        else if (size == 0xffff)
 443                bytes = ~0ull;
 444        else if (size & 0x8000)
 445                bytes = (u64)(size & 0x7fff) << 10;
 446        else if (size != 0x7fff || dm->length < 0x20)
 447                bytes = (u64)size << 20;
 448        else
 449                bytes = (u64)get_unaligned((u32 *)&d[0x1C]) << 20;
 450
 451        dmi_memdev[nr].size = bytes;
 452        nr++;
 453}
 454
 455static void __init dmi_memdev_walk(void)
 456{
 457        if (dmi_walk_early(count_mem_devices) == 0 && dmi_memdev_nr) {
 458                dmi_memdev = dmi_alloc(sizeof(*dmi_memdev) * dmi_memdev_nr);
 459                if (dmi_memdev)
 460                        dmi_walk_early(save_mem_devices);
 461        }
 462}
 463
 464/*
 465 *      Process a DMI table entry. Right now all we care about are the BIOS
 466 *      and machine entries. For 2.5 we should pull the smbus controller info
 467 *      out of here.
 468 */
 469static void __init dmi_decode(const struct dmi_header *dm, void *dummy)
 470{
 471        switch (dm->type) {
 472        case 0:         /* BIOS Information */
 473                dmi_save_ident(dm, DMI_BIOS_VENDOR, 4);
 474                dmi_save_ident(dm, DMI_BIOS_VERSION, 5);
 475                dmi_save_ident(dm, DMI_BIOS_DATE, 8);
 476                dmi_save_release(dm, DMI_BIOS_RELEASE, 21);
 477                dmi_save_release(dm, DMI_EC_FIRMWARE_RELEASE, 23);
 478                break;
 479        case 1:         /* System Information */
 480                dmi_save_ident(dm, DMI_SYS_VENDOR, 4);
 481                dmi_save_ident(dm, DMI_PRODUCT_NAME, 5);
 482                dmi_save_ident(dm, DMI_PRODUCT_VERSION, 6);
 483                dmi_save_ident(dm, DMI_PRODUCT_SERIAL, 7);
 484                dmi_save_uuid(dm, DMI_PRODUCT_UUID, 8);
 485                dmi_save_ident(dm, DMI_PRODUCT_SKU, 25);
 486                dmi_save_ident(dm, DMI_PRODUCT_FAMILY, 26);
 487                break;
 488        case 2:         /* Base Board Information */
 489                dmi_save_ident(dm, DMI_BOARD_VENDOR, 4);
 490                dmi_save_ident(dm, DMI_BOARD_NAME, 5);
 491                dmi_save_ident(dm, DMI_BOARD_VERSION, 6);
 492                dmi_save_ident(dm, DMI_BOARD_SERIAL, 7);
 493                dmi_save_ident(dm, DMI_BOARD_ASSET_TAG, 8);
 494                break;
 495        case 3:         /* Chassis Information */
 496                dmi_save_ident(dm, DMI_CHASSIS_VENDOR, 4);
 497                dmi_save_type(dm, DMI_CHASSIS_TYPE, 5);
 498                dmi_save_ident(dm, DMI_CHASSIS_VERSION, 6);
 499                dmi_save_ident(dm, DMI_CHASSIS_SERIAL, 7);
 500                dmi_save_ident(dm, DMI_CHASSIS_ASSET_TAG, 8);
 501                break;
 502        case 9:         /* System Slots */
 503                dmi_save_system_slot(dm);
 504                break;
 505        case 10:        /* Onboard Devices Information */
 506                dmi_save_devices(dm);
 507                break;
 508        case 11:        /* OEM Strings */
 509                dmi_save_oem_strings_devices(dm);
 510                break;
 511        case 38:        /* IPMI Device Information */
 512                dmi_save_ipmi_device(dm);
 513                break;
 514        case 41:        /* Onboard Devices Extended Information */
 515                dmi_save_extended_devices(dm);
 516        }
 517}
 518
 519static int __init print_filtered(char *buf, size_t len, const char *info)
 520{
 521        int c = 0;
 522        const char *p;
 523
 524        if (!info)
 525                return c;
 526
 527        for (p = info; *p; p++)
 528                if (isprint(*p))
 529                        c += scnprintf(buf + c, len - c, "%c", *p);
 530                else
 531                        c += scnprintf(buf + c, len - c, "\\x%02x", *p & 0xff);
 532        return c;
 533}
 534
 535static void __init dmi_format_ids(char *buf, size_t len)
 536{
 537        int c = 0;
 538        const char *board;      /* Board Name is optional */
 539
 540        c += print_filtered(buf + c, len - c,
 541                            dmi_get_system_info(DMI_SYS_VENDOR));
 542        c += scnprintf(buf + c, len - c, " ");
 543        c += print_filtered(buf + c, len - c,
 544                            dmi_get_system_info(DMI_PRODUCT_NAME));
 545
 546        board = dmi_get_system_info(DMI_BOARD_NAME);
 547        if (board) {
 548                c += scnprintf(buf + c, len - c, "/");
 549                c += print_filtered(buf + c, len - c, board);
 550        }
 551        c += scnprintf(buf + c, len - c, ", BIOS ");
 552        c += print_filtered(buf + c, len - c,
 553                            dmi_get_system_info(DMI_BIOS_VERSION));
 554        c += scnprintf(buf + c, len - c, " ");
 555        c += print_filtered(buf + c, len - c,
 556                            dmi_get_system_info(DMI_BIOS_DATE));
 557}
 558
 559/*
 560 * Check for DMI/SMBIOS headers in the system firmware image.  Any
 561 * SMBIOS header must start 16 bytes before the DMI header, so take a
 562 * 32 byte buffer and check for DMI at offset 16 and SMBIOS at offset
 563 * 0.  If the DMI header is present, set dmi_ver accordingly (SMBIOS
 564 * takes precedence) and return 0.  Otherwise return 1.
 565 */
 566static int __init dmi_present(const u8 *buf)
 567{
 568        u32 smbios_ver;
 569
 570        if (memcmp(buf, "_SM_", 4) == 0 &&
 571            buf[5] < 32 && dmi_checksum(buf, buf[5])) {
 572                smbios_ver = get_unaligned_be16(buf + 6);
 573                smbios_entry_point_size = buf[5];
 574                memcpy(smbios_entry_point, buf, smbios_entry_point_size);
 575
 576                /* Some BIOS report weird SMBIOS version, fix that up */
 577                switch (smbios_ver) {
 578                case 0x021F:
 579                case 0x0221:
 580                        pr_debug("SMBIOS version fixup (2.%d->2.%d)\n",
 581                                 smbios_ver & 0xFF, 3);
 582                        smbios_ver = 0x0203;
 583                        break;
 584                case 0x0233:
 585                        pr_debug("SMBIOS version fixup (2.%d->2.%d)\n", 51, 6);
 586                        smbios_ver = 0x0206;
 587                        break;
 588                }
 589        } else {
 590                smbios_ver = 0;
 591        }
 592
 593        buf += 16;
 594
 595        if (memcmp(buf, "_DMI_", 5) == 0 && dmi_checksum(buf, 15)) {
 596                if (smbios_ver)
 597                        dmi_ver = smbios_ver;
 598                else
 599                        dmi_ver = (buf[14] & 0xF0) << 4 | (buf[14] & 0x0F);
 600                dmi_ver <<= 8;
 601                dmi_num = get_unaligned_le16(buf + 12);
 602                dmi_len = get_unaligned_le16(buf + 6);
 603                dmi_base = get_unaligned_le32(buf + 8);
 604
 605                if (dmi_walk_early(dmi_decode) == 0) {
 606                        if (smbios_ver) {
 607                                pr_info("SMBIOS %d.%d present.\n",
 608                                        dmi_ver >> 16, (dmi_ver >> 8) & 0xFF);
 609                        } else {
 610                                smbios_entry_point_size = 15;
 611                                memcpy(smbios_entry_point, buf,
 612                                       smbios_entry_point_size);
 613                                pr_info("Legacy DMI %d.%d present.\n",
 614                                        dmi_ver >> 16, (dmi_ver >> 8) & 0xFF);
 615                        }
 616                        dmi_format_ids(dmi_ids_string, sizeof(dmi_ids_string));
 617                        pr_info("DMI: %s\n", dmi_ids_string);
 618                        return 0;
 619                }
 620        }
 621
 622        return 1;
 623}
 624
 625/*
 626 * Check for the SMBIOS 3.0 64-bit entry point signature. Unlike the legacy
 627 * 32-bit entry point, there is no embedded DMI header (_DMI_) in here.
 628 */
 629static int __init dmi_smbios3_present(const u8 *buf)
 630{
 631        if (memcmp(buf, "_SM3_", 5) == 0 &&
 632            buf[6] < 32 && dmi_checksum(buf, buf[6])) {
 633                dmi_ver = get_unaligned_be32(buf + 6) & 0xFFFFFF;
 634                dmi_num = 0;                    /* No longer specified */
 635                dmi_len = get_unaligned_le32(buf + 12);
 636                dmi_base = get_unaligned_le64(buf + 16);
 637                smbios_entry_point_size = buf[6];
 638                memcpy(smbios_entry_point, buf, smbios_entry_point_size);
 639
 640                if (dmi_walk_early(dmi_decode) == 0) {
 641                        pr_info("SMBIOS %d.%d.%d present.\n",
 642                                dmi_ver >> 16, (dmi_ver >> 8) & 0xFF,
 643                                dmi_ver & 0xFF);
 644                        dmi_format_ids(dmi_ids_string, sizeof(dmi_ids_string));
 645                        pr_info("DMI: %s\n", dmi_ids_string);
 646                        return 0;
 647                }
 648        }
 649        return 1;
 650}
 651
 652static void __init dmi_scan_machine(void)
 653{
 654        char __iomem *p, *q;
 655        char buf[32];
 656
 657        if (efi_enabled(EFI_CONFIG_TABLES)) {
 658                /*
 659                 * According to the DMTF SMBIOS reference spec v3.0.0, it is
 660                 * allowed to define both the 64-bit entry point (smbios3) and
 661                 * the 32-bit entry point (smbios), in which case they should
 662                 * either both point to the same SMBIOS structure table, or the
 663                 * table pointed to by the 64-bit entry point should contain a
 664                 * superset of the table contents pointed to by the 32-bit entry
 665                 * point (section 5.2)
 666                 * This implies that the 64-bit entry point should have
 667                 * precedence if it is defined and supported by the OS. If we
 668                 * have the 64-bit entry point, but fail to decode it, fall
 669                 * back to the legacy one (if available)
 670                 */
 671                if (efi.smbios3 != EFI_INVALID_TABLE_ADDR) {
 672                        p = dmi_early_remap(efi.smbios3, 32);
 673                        if (p == NULL)
 674                                goto error;
 675                        memcpy_fromio(buf, p, 32);
 676                        dmi_early_unmap(p, 32);
 677
 678                        if (!dmi_smbios3_present(buf)) {
 679                                dmi_available = 1;
 680                                return;
 681                        }
 682                }
 683                if (efi.smbios == EFI_INVALID_TABLE_ADDR)
 684                        goto error;
 685
 686                /* This is called as a core_initcall() because it isn't
 687                 * needed during early boot.  This also means we can
 688                 * iounmap the space when we're done with it.
 689                 */
 690                p = dmi_early_remap(efi.smbios, 32);
 691                if (p == NULL)
 692                        goto error;
 693                memcpy_fromio(buf, p, 32);
 694                dmi_early_unmap(p, 32);
 695
 696                if (!dmi_present(buf)) {
 697                        dmi_available = 1;
 698                        return;
 699                }
 700        } else if (IS_ENABLED(CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK)) {
 701                p = dmi_early_remap(SMBIOS_ENTRY_POINT_SCAN_START, 0x10000);
 702                if (p == NULL)
 703                        goto error;
 704
 705                /*
 706                 * Same logic as above, look for a 64-bit entry point
 707                 * first, and if not found, fall back to 32-bit entry point.
 708                 */
 709                memcpy_fromio(buf, p, 16);
 710                for (q = p + 16; q < p + 0x10000; q += 16) {
 711                        memcpy_fromio(buf + 16, q, 16);
 712                        if (!dmi_smbios3_present(buf)) {
 713                                dmi_available = 1;
 714                                dmi_early_unmap(p, 0x10000);
 715                                return;
 716                        }
 717                        memcpy(buf, buf + 16, 16);
 718                }
 719
 720                /*
 721                 * Iterate over all possible DMI header addresses q.
 722                 * Maintain the 32 bytes around q in buf.  On the
 723                 * first iteration, substitute zero for the
 724                 * out-of-range bytes so there is no chance of falsely
 725                 * detecting an SMBIOS header.
 726                 */
 727                memset(buf, 0, 16);
 728                for (q = p; q < p + 0x10000; q += 16) {
 729                        memcpy_fromio(buf + 16, q, 16);
 730                        if (!dmi_present(buf)) {
 731                                dmi_available = 1;
 732                                dmi_early_unmap(p, 0x10000);
 733                                return;
 734                        }
 735                        memcpy(buf, buf + 16, 16);
 736                }
 737                dmi_early_unmap(p, 0x10000);
 738        }
 739 error:
 740        pr_info("DMI not present or invalid.\n");
 741}
 742
 743static ssize_t raw_table_read(struct file *file, struct kobject *kobj,
 744                              struct bin_attribute *attr, char *buf,
 745                              loff_t pos, size_t count)
 746{
 747        memcpy(buf, attr->private + pos, count);
 748        return count;
 749}
 750
 751static BIN_ATTR(smbios_entry_point, S_IRUSR, raw_table_read, NULL, 0);
 752static BIN_ATTR(DMI, S_IRUSR, raw_table_read, NULL, 0);
 753
 754static int __init dmi_init(void)
 755{
 756        struct kobject *tables_kobj;
 757        u8 *dmi_table;
 758        int ret = -ENOMEM;
 759
 760        if (!dmi_available)
 761                return 0;
 762
 763        /*
 764         * Set up dmi directory at /sys/firmware/dmi. This entry should stay
 765         * even after farther error, as it can be used by other modules like
 766         * dmi-sysfs.
 767         */
 768        dmi_kobj = kobject_create_and_add("dmi", firmware_kobj);
 769        if (!dmi_kobj)
 770                goto err;
 771
 772        tables_kobj = kobject_create_and_add("tables", dmi_kobj);
 773        if (!tables_kobj)
 774                goto err;
 775
 776        dmi_table = dmi_remap(dmi_base, dmi_len);
 777        if (!dmi_table)
 778                goto err_tables;
 779
 780        bin_attr_smbios_entry_point.size = smbios_entry_point_size;
 781        bin_attr_smbios_entry_point.private = smbios_entry_point;
 782        ret = sysfs_create_bin_file(tables_kobj, &bin_attr_smbios_entry_point);
 783        if (ret)
 784                goto err_unmap;
 785
 786        bin_attr_DMI.size = dmi_len;
 787        bin_attr_DMI.private = dmi_table;
 788        ret = sysfs_create_bin_file(tables_kobj, &bin_attr_DMI);
 789        if (!ret)
 790                return 0;
 791
 792        sysfs_remove_bin_file(tables_kobj,
 793                              &bin_attr_smbios_entry_point);
 794 err_unmap:
 795        dmi_unmap(dmi_table);
 796 err_tables:
 797        kobject_del(tables_kobj);
 798        kobject_put(tables_kobj);
 799 err:
 800        pr_err("dmi: Firmware registration failed.\n");
 801
 802        return ret;
 803}
 804subsys_initcall(dmi_init);
 805
 806/**
 807 *      dmi_setup - scan and setup DMI system information
 808 *
 809 *      Scan the DMI system information. This setups DMI identifiers
 810 *      (dmi_system_id) for printing it out on task dumps and prepares
 811 *      DIMM entry information (dmi_memdev_info) from the SMBIOS table
 812 *      for using this when reporting memory errors.
 813 */
 814void __init dmi_setup(void)
 815{
 816        dmi_scan_machine();
 817        if (!dmi_available)
 818                return;
 819
 820        dmi_memdev_walk();
 821        dump_stack_set_arch_desc("%s", dmi_ids_string);
 822}
 823
 824/**
 825 *      dmi_matches - check if dmi_system_id structure matches system DMI data
 826 *      @dmi: pointer to the dmi_system_id structure to check
 827 */
 828static bool dmi_matches(const struct dmi_system_id *dmi)
 829{
 830        int i;
 831
 832        for (i = 0; i < ARRAY_SIZE(dmi->matches); i++) {
 833                int s = dmi->matches[i].slot;
 834                if (s == DMI_NONE)
 835                        break;
 836                if (s == DMI_OEM_STRING) {
 837                        /* DMI_OEM_STRING must be exact match */
 838                        const struct dmi_device *valid;
 839
 840                        valid = dmi_find_device(DMI_DEV_TYPE_OEM_STRING,
 841                                                dmi->matches[i].substr, NULL);
 842                        if (valid)
 843                                continue;
 844                } else if (dmi_ident[s]) {
 845                        if (dmi->matches[i].exact_match) {
 846                                if (!strcmp(dmi_ident[s],
 847                                            dmi->matches[i].substr))
 848                                        continue;
 849                        } else {
 850                                if (strstr(dmi_ident[s],
 851                                           dmi->matches[i].substr))
 852                                        continue;
 853                        }
 854                }
 855
 856                /* No match */
 857                return false;
 858        }
 859        return true;
 860}
 861
 862/**
 863 *      dmi_is_end_of_table - check for end-of-table marker
 864 *      @dmi: pointer to the dmi_system_id structure to check
 865 */
 866static bool dmi_is_end_of_table(const struct dmi_system_id *dmi)
 867{
 868        return dmi->matches[0].slot == DMI_NONE;
 869}
 870
 871/**
 872 *      dmi_check_system - check system DMI data
 873 *      @list: array of dmi_system_id structures to match against
 874 *              All non-null elements of the list must match
 875 *              their slot's (field index's) data (i.e., each
 876 *              list string must be a substring of the specified
 877 *              DMI slot's string data) to be considered a
 878 *              successful match.
 879 *
 880 *      Walk the blacklist table running matching functions until someone
 881 *      returns non zero or we hit the end. Callback function is called for
 882 *      each successful match. Returns the number of matches.
 883 *
 884 *      dmi_setup must be called before this function is called.
 885 */
 886int dmi_check_system(const struct dmi_system_id *list)
 887{
 888        int count = 0;
 889        const struct dmi_system_id *d;
 890
 891        for (d = list; !dmi_is_end_of_table(d); d++)
 892                if (dmi_matches(d)) {
 893                        count++;
 894                        if (d->callback && d->callback(d))
 895                                break;
 896                }
 897
 898        return count;
 899}
 900EXPORT_SYMBOL(dmi_check_system);
 901
 902/**
 903 *      dmi_first_match - find dmi_system_id structure matching system DMI data
 904 *      @list: array of dmi_system_id structures to match against
 905 *              All non-null elements of the list must match
 906 *              their slot's (field index's) data (i.e., each
 907 *              list string must be a substring of the specified
 908 *              DMI slot's string data) to be considered a
 909 *              successful match.
 910 *
 911 *      Walk the blacklist table until the first match is found.  Return the
 912 *      pointer to the matching entry or NULL if there's no match.
 913 *
 914 *      dmi_setup must be called before this function is called.
 915 */
 916const struct dmi_system_id *dmi_first_match(const struct dmi_system_id *list)
 917{
 918        const struct dmi_system_id *d;
 919
 920        for (d = list; !dmi_is_end_of_table(d); d++)
 921                if (dmi_matches(d))
 922                        return d;
 923
 924        return NULL;
 925}
 926EXPORT_SYMBOL(dmi_first_match);
 927
 928/**
 929 *      dmi_get_system_info - return DMI data value
 930 *      @field: data index (see enum dmi_field)
 931 *
 932 *      Returns one DMI data value, can be used to perform
 933 *      complex DMI data checks.
 934 */
 935const char *dmi_get_system_info(int field)
 936{
 937        return dmi_ident[field];
 938}
 939EXPORT_SYMBOL(dmi_get_system_info);
 940
 941/**
 942 * dmi_name_in_serial - Check if string is in the DMI product serial information
 943 * @str: string to check for
 944 */
 945int dmi_name_in_serial(const char *str)
 946{
 947        int f = DMI_PRODUCT_SERIAL;
 948        if (dmi_ident[f] && strstr(dmi_ident[f], str))
 949                return 1;
 950        return 0;
 951}
 952
 953/**
 954 *      dmi_name_in_vendors - Check if string is in the DMI system or board vendor name
 955 *      @str: Case sensitive Name
 956 */
 957int dmi_name_in_vendors(const char *str)
 958{
 959        static int fields[] = { DMI_SYS_VENDOR, DMI_BOARD_VENDOR, DMI_NONE };
 960        int i;
 961        for (i = 0; fields[i] != DMI_NONE; i++) {
 962                int f = fields[i];
 963                if (dmi_ident[f] && strstr(dmi_ident[f], str))
 964                        return 1;
 965        }
 966        return 0;
 967}
 968EXPORT_SYMBOL(dmi_name_in_vendors);
 969
 970/**
 971 *      dmi_find_device - find onboard device by type/name
 972 *      @type: device type or %DMI_DEV_TYPE_ANY to match all device types
 973 *      @name: device name string or %NULL to match all
 974 *      @from: previous device found in search, or %NULL for new search.
 975 *
 976 *      Iterates through the list of known onboard devices. If a device is
 977 *      found with a matching @type and @name, a pointer to its device
 978 *      structure is returned.  Otherwise, %NULL is returned.
 979 *      A new search is initiated by passing %NULL as the @from argument.
 980 *      If @from is not %NULL, searches continue from next device.
 981 */
 982const struct dmi_device *dmi_find_device(int type, const char *name,
 983                                    const struct dmi_device *from)
 984{
 985        const struct list_head *head = from ? &from->list : &dmi_devices;
 986        struct list_head *d;
 987
 988        for (d = head->next; d != &dmi_devices; d = d->next) {
 989                const struct dmi_device *dev =
 990                        list_entry(d, struct dmi_device, list);
 991
 992                if (((type == DMI_DEV_TYPE_ANY) || (dev->type == type)) &&
 993                    ((name == NULL) || (strcmp(dev->name, name) == 0)))
 994                        return dev;
 995        }
 996
 997        return NULL;
 998}
 999EXPORT_SYMBOL(dmi_find_device);
1000
1001/**
1002 *      dmi_get_date - parse a DMI date
1003 *      @field: data index (see enum dmi_field)
1004 *      @yearp: optional out parameter for the year
1005 *      @monthp: optional out parameter for the month
1006 *      @dayp: optional out parameter for the day
1007 *
1008 *      The date field is assumed to be in the form resembling
1009 *      [mm[/dd]]/yy[yy] and the result is stored in the out
1010 *      parameters any or all of which can be omitted.
1011 *
1012 *      If the field doesn't exist, all out parameters are set to zero
1013 *      and false is returned.  Otherwise, true is returned with any
1014 *      invalid part of date set to zero.
1015 *
1016 *      On return, year, month and day are guaranteed to be in the
1017 *      range of [0,9999], [0,12] and [0,31] respectively.
1018 */
1019bool dmi_get_date(int field, int *yearp, int *monthp, int *dayp)
1020{
1021        int year = 0, month = 0, day = 0;
1022        bool exists;
1023        const char *s, *y;
1024        char *e;
1025
1026        s = dmi_get_system_info(field);
1027        exists = s;
1028        if (!exists)
1029                goto out;
1030
1031        /*
1032         * Determine year first.  We assume the date string resembles
1033         * mm/dd/yy[yy] but the original code extracted only the year
1034         * from the end.  Keep the behavior in the spirit of no
1035         * surprises.
1036         */
1037        y = strrchr(s, '/');
1038        if (!y)
1039                goto out;
1040
1041        y++;
1042        year = simple_strtoul(y, &e, 10);
1043        if (y != e && year < 100) {     /* 2-digit year */
1044                year += 1900;
1045                if (year < 1996)        /* no dates < spec 1.0 */
1046                        year += 100;
1047        }
1048        if (year > 9999)                /* year should fit in %04d */
1049                year = 0;
1050
1051        /* parse the mm and dd */
1052        month = simple_strtoul(s, &e, 10);
1053        if (s == e || *e != '/' || !month || month > 12) {
1054                month = 0;
1055                goto out;
1056        }
1057
1058        s = e + 1;
1059        day = simple_strtoul(s, &e, 10);
1060        if (s == y || s == e || *e != '/' || day > 31)
1061                day = 0;
1062out:
1063        if (yearp)
1064                *yearp = year;
1065        if (monthp)
1066                *monthp = month;
1067        if (dayp)
1068                *dayp = day;
1069        return exists;
1070}
1071EXPORT_SYMBOL(dmi_get_date);
1072
1073/**
1074 *      dmi_get_bios_year - get a year out of DMI_BIOS_DATE field
1075 *
1076 *      Returns year on success, -ENXIO if DMI is not selected,
1077 *      or a different negative error code if DMI field is not present
1078 *      or not parseable.
1079 */
1080int dmi_get_bios_year(void)
1081{
1082        bool exists;
1083        int year;
1084
1085        exists = dmi_get_date(DMI_BIOS_DATE, &year, NULL, NULL);
1086        if (!exists)
1087                return -ENODATA;
1088
1089        return year ? year : -ERANGE;
1090}
1091EXPORT_SYMBOL(dmi_get_bios_year);
1092
1093/**
1094 *      dmi_walk - Walk the DMI table and get called back for every record
1095 *      @decode: Callback function
1096 *      @private_data: Private data to be passed to the callback function
1097 *
1098 *      Returns 0 on success, -ENXIO if DMI is not selected or not present,
1099 *      or a different negative error code if DMI walking fails.
1100 */
1101int dmi_walk(void (*decode)(const struct dmi_header *, void *),
1102             void *private_data)
1103{
1104        u8 *buf;
1105
1106        if (!dmi_available)
1107                return -ENXIO;
1108
1109        buf = dmi_remap(dmi_base, dmi_len);
1110        if (buf == NULL)
1111                return -ENOMEM;
1112
1113        dmi_decode_table(buf, decode, private_data);
1114
1115        dmi_unmap(buf);
1116        return 0;
1117}
1118EXPORT_SYMBOL_GPL(dmi_walk);
1119
1120/**
1121 * dmi_match - compare a string to the dmi field (if exists)
1122 * @f: DMI field identifier
1123 * @str: string to compare the DMI field to
1124 *
1125 * Returns true if the requested field equals to the str (including NULL).
1126 */
1127bool dmi_match(enum dmi_field f, const char *str)
1128{
1129        const char *info = dmi_get_system_info(f);
1130
1131        if (info == NULL || str == NULL)
1132                return info == str;
1133
1134        return !strcmp(info, str);
1135}
1136EXPORT_SYMBOL_GPL(dmi_match);
1137
1138void dmi_memdev_name(u16 handle, const char **bank, const char **device)
1139{
1140        int n;
1141
1142        if (dmi_memdev == NULL)
1143                return;
1144
1145        for (n = 0; n < dmi_memdev_nr; n++) {
1146                if (handle == dmi_memdev[n].handle) {
1147                        *bank = dmi_memdev[n].bank;
1148                        *device = dmi_memdev[n].device;
1149                        break;
1150                }
1151        }
1152}
1153EXPORT_SYMBOL_GPL(dmi_memdev_name);
1154
1155u64 dmi_memdev_size(u16 handle)
1156{
1157        int n;
1158
1159        if (dmi_memdev) {
1160                for (n = 0; n < dmi_memdev_nr; n++) {
1161                        if (handle == dmi_memdev[n].handle)
1162                                return dmi_memdev[n].size;
1163                }
1164        }
1165        return ~0ull;
1166}
1167EXPORT_SYMBOL_GPL(dmi_memdev_size);
1168
1169/**
1170 * dmi_memdev_type - get the memory type
1171 * @handle: DMI structure handle
1172 *
1173 * Return the DMI memory type of the module in the slot associated with the
1174 * given DMI handle, or 0x0 if no such DMI handle exists.
1175 */
1176u8 dmi_memdev_type(u16 handle)
1177{
1178        int n;
1179
1180        if (dmi_memdev) {
1181                for (n = 0; n < dmi_memdev_nr; n++) {
1182                        if (handle == dmi_memdev[n].handle)
1183                                return dmi_memdev[n].type;
1184                }
1185        }
1186        return 0x0;     /* Not a valid value */
1187}
1188EXPORT_SYMBOL_GPL(dmi_memdev_type);
1189
1190/**
1191 *      dmi_memdev_handle - get the DMI handle of a memory slot
1192 *      @slot: slot number
1193 *
1194 *      Return the DMI handle associated with a given memory slot, or %0xFFFF
1195 *      if there is no such slot.
1196 */
1197u16 dmi_memdev_handle(int slot)
1198{
1199        if (dmi_memdev && slot >= 0 && slot < dmi_memdev_nr)
1200                return dmi_memdev[slot].handle;
1201
1202        return 0xffff;  /* Not a valid value */
1203}
1204EXPORT_SYMBOL_GPL(dmi_memdev_handle);
1205