DEFINE_DMI_ATTR_WITH_SHOW(bios_version,                0444, DMI_BIOS_VERSION);
 DEFINE_DMI_ATTR_WITH_SHOW(bios_date,           0444, DMI_BIOS_DATE);
 DEFINE_DMI_ATTR_WITH_SHOW(sys_vendor,          0444, DMI_SYS_VENDOR);
+DEFINE_DMI_ATTR_WITH_SHOW(bios_release,                0444, DMI_BIOS_RELEASE);
+DEFINE_DMI_ATTR_WITH_SHOW(ec_firmware_release, 0444, DMI_EC_FIRMWARE_RELEASE);
 DEFINE_DMI_ATTR_WITH_SHOW(product_name,                0444, DMI_PRODUCT_NAME);
 DEFINE_DMI_ATTR_WITH_SHOW(product_version,     0444, DMI_PRODUCT_VERSION);
 DEFINE_DMI_ATTR_WITH_SHOW(product_serial,      0400, DMI_PRODUCT_SERIAL);
                { "bvn", DMI_BIOS_VENDOR },
                { "bvr", DMI_BIOS_VERSION },
                { "bd",  DMI_BIOS_DATE },
+               { "br",  DMI_BIOS_RELEASE },
+               { "efr", DMI_EC_FIRMWARE_RELEASE },
                { "svn", DMI_SYS_VENDOR },
                { "pn",  DMI_PRODUCT_NAME },
                { "pvr", DMI_PRODUCT_VERSION },
        ADD_DMI_ATTR(bios_vendor,       DMI_BIOS_VENDOR);
        ADD_DMI_ATTR(bios_version,      DMI_BIOS_VERSION);
        ADD_DMI_ATTR(bios_date,         DMI_BIOS_DATE);
+       ADD_DMI_ATTR(bios_release,      DMI_BIOS_RELEASE);
+       ADD_DMI_ATTR(ec_firmware_release, DMI_EC_FIRMWARE_RELEASE);
        ADD_DMI_ATTR(sys_vendor,        DMI_SYS_VENDOR);
        ADD_DMI_ATTR(product_name,      DMI_PRODUCT_NAME);
        ADD_DMI_ATTR(product_version,   DMI_PRODUCT_VERSION);
 
        dmi_ident[slot] = p;
 }
 
+static void __init dmi_save_release(const struct dmi_header *dm, int slot,
+               int index)
+{
+       const u8 *minor, *major;
+       char *s;
+
+       /* If the table doesn't have the field, let's return */
+       if (dmi_ident[slot] || dm->length < index)
+               return;
+
+       minor = (u8 *) dm + index;
+       major = (u8 *) dm + index - 1;
+
+       /* As per the spec, if the system doesn't support this field,
+        * the value is FF
+        */
+       if (*major == 0xFF && *minor == 0xFF)
+               return;
+
+       s = dmi_alloc(8);
+       if (!s)
+               return;
+
+       sprintf(s, "%u.%u", *major, *minor);
+
+       dmi_ident[slot] = s;
+}
+
 static void __init dmi_save_uuid(const struct dmi_header *dm, int slot,
                int index)
 {
                dmi_save_ident(dm, DMI_BIOS_VENDOR, 4);
                dmi_save_ident(dm, DMI_BIOS_VERSION, 5);
                dmi_save_ident(dm, DMI_BIOS_DATE, 8);
+               dmi_save_release(dm, DMI_BIOS_RELEASE, 21);
+               dmi_save_release(dm, DMI_EC_FIRMWARE_RELEASE, 23);
                break;
        case 1:         /* System Information */
                dmi_save_ident(dm, DMI_SYS_VENDOR, 4);
 
        { "bvn", DMI_BIOS_VENDOR },
        { "bvr", DMI_BIOS_VERSION },
        { "bd",  DMI_BIOS_DATE },
+       { "br",  DMI_BIOS_RELEASE },
+       { "efr", DMI_EC_FIRMWARE_RELEASE },
        { "svn", DMI_SYS_VENDOR },
        { "pn",  DMI_PRODUCT_NAME },
        { "pvr", DMI_PRODUCT_VERSION },