Skip to content

Commit

Permalink
intel-iommu: Combine the BIOS DMAR table warning messages
Browse files Browse the repository at this point in the history
We have nearly the same code for warnings repeated four times.  Move
it into a separate function.

Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
  • Loading branch information
Ben Hutchings authored and David Woodhouse committed May 19, 2010
1 parent 92946bc commit 3a8663e
Showing 1 changed file with 14 additions and 34 deletions.
48 changes: 14 additions & 34 deletions drivers/pci/dmar.c
Original file line number Diff line number Diff line change
Expand Up @@ -618,7 +618,15 @@ int __init dmar_table_init(void)
return 0;
}

static int bios_warned;
static void warn_invalid_dmar(u64 addr, const char *message)
{
WARN_ONCE(1, "Your BIOS is broken; DMAR reported at address %llx%s!\n"
"BIOS vendor: %s; Ver: %s; Product Version: %s\n",
addr, message,
dmi_get_system_info(DMI_BIOS_VENDOR),
dmi_get_system_info(DMI_BIOS_VERSION),
dmi_get_system_info(DMI_PRODUCT_VERSION));
}

int __init check_zero_address(void)
{
Expand All @@ -644,13 +652,7 @@ int __init check_zero_address(void)

drhd = (void *)entry_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));
bios_warned = 1;
warn_invalid_dmar(0, "");
goto failed;
}

Expand All @@ -663,14 +665,8 @@ int __init check_zero_address(void)
ecap = dmar_readq(addr + DMAR_ECAP_REG);
early_iounmap(addr, VTD_PAGE_SIZE);
if (cap == (uint64_t)-1 && ecap == (uint64_t)-1) {
/* Promote an attitude of violence to a BIOS engineer today */
WARN(1, "Your BIOS is broken; DMAR reported at address %llx returns all ones!\n"
"BIOS vendor: %s; Ver: %s; Product Version: %s\n",
drhd->address,
dmi_get_system_info(DMI_BIOS_VENDOR),
dmi_get_system_info(DMI_BIOS_VERSION),
dmi_get_system_info(DMI_PRODUCT_VERSION));
bios_warned = 1;
warn_invalid_dmar(drhd->address,
" returns all ones");
goto failed;
}
}
Expand Down Expand Up @@ -735,14 +731,7 @@ int alloc_iommu(struct dmar_drhd_unit *drhd)
int msagaw = 0;

if (!drhd->reg_base_addr) {
if (!bios_warned) {
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));
bios_warned = 1;
}
warn_invalid_dmar(0, "");
return -EINVAL;
}

Expand All @@ -762,16 +751,7 @@ int alloc_iommu(struct dmar_drhd_unit *drhd)
iommu->ecap = dmar_readq(iommu->reg + DMAR_ECAP_REG);

if (iommu->cap == (uint64_t)-1 && iommu->ecap == (uint64_t)-1) {
if (!bios_warned) {
/* Promote an attitude of violence to a BIOS engineer today */
WARN(1, "Your BIOS is broken; DMAR reported at address %llx returns all ones!\n"
"BIOS vendor: %s; Ver: %s; Product Version: %s\n",
drhd->reg_base_addr,
dmi_get_system_info(DMI_BIOS_VENDOR),
dmi_get_system_info(DMI_BIOS_VERSION),
dmi_get_system_info(DMI_PRODUCT_VERSION));
bios_warned = 1;
}
warn_invalid_dmar(drhd->reg_base_addr, " returns all ones");
goto err_unmap;
}

Expand Down

0 comments on commit 3a8663e

Please sign in to comment.