|
@@ -173,12 +173,21 @@ dmar_parse_one_drhd(struct acpi_dmar_header *header)
|
|
|
struct dmar_drhd_unit *dmaru;
|
|
|
int ret = 0;
|
|
|
|
|
|
+ drhd = (struct acpi_dmar_hardware_unit *)header;
|
|
|
+ if (!drhd->address) {
|
|
|
+ /* Promote an attitude of violence to a BIOS engineer today */
|
|
|
+ WARN(1, "Your BIOS is broken; DMAR reported at address zero!\n"
|
|
|
+ "BIOS vendor: %s; Ver: %s; Product Version: %s\n",
|
|
|
+ dmi_get_system_info(DMI_BIOS_VENDOR),
|
|
|
+ dmi_get_system_info(DMI_BIOS_VERSION),
|
|
|
+ dmi_get_system_info(DMI_PRODUCT_VERSION));
|
|
|
+ return -ENODEV;
|
|
|
+ }
|
|
|
dmaru = kzalloc(sizeof(*dmaru), GFP_KERNEL);
|
|
|
if (!dmaru)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
dmaru->hdr = header;
|
|
|
- drhd = (struct acpi_dmar_hardware_unit *)header;
|
|
|
dmaru->reg_base_addr = drhd->address;
|
|
|
dmaru->segment = drhd->segment;
|
|
|
dmaru->include_all = drhd->flags & 0x1; /* BIT0: INCLUDE_ALL */
|