static int ir_parse_ioapic_hpet_scope(struct acpi_dmar_header *header, struct intel_iommu *iommu) { struct acpi_dmar_hardware_unit *drhd; struct acpi_dmar_device_scope *scope; void *start, *end; drhd = (struct acpi_dmar_hardware_unit *)header; start = (void *)(drhd + 1); end = ((void *)drhd) + header->length; while (start < end) { scope = start; if (scope->entry_type == ACPI_DMAR_SCOPE_TYPE_IOAPIC) { if (ir_ioapic_num == MAX_IO_APICS) { #ifdef CONFIG_DEBUG_PRINTK printk(KERN_WARNING "Exceeded Max IO APICS\n"); #else ; #endif return -1; } #ifdef CONFIG_DEBUG_PRINTK printk(KERN_INFO "IOAPIC id %d under DRHD base " " 0x%Lx IOMMU %d\n", scope->enumeration_id, drhd->address, iommu->seq_id); #else ; #endif ir_parse_one_ioapic_scope(scope, iommu); } else if (scope->entry_type == ACPI_DMAR_SCOPE_TYPE_HPET) { if (ir_hpet_num == MAX_HPET_TBS) { #ifdef CONFIG_DEBUG_PRINTK printk(KERN_WARNING "Exceeded Max HPET blocks\n"); #else ; #endif return -1; } #ifdef CONFIG_DEBUG_PRINTK printk(KERN_INFO "HPET id %d under DRHD base" " 0x%Lx\n", scope->enumeration_id, drhd->address); #else ; #endif ir_parse_one_hpet_scope(scope, iommu); } start += scope->length; } return 0; }
static int ir_parse_ioapic_hpet_scope(struct acpi_dmar_header *header, struct intel_iommu *iommu) { struct acpi_dmar_hardware_unit *drhd; struct acpi_dmar_device_scope *scope; void *start, *end; drhd = (struct acpi_dmar_hardware_unit *)header; start = (void *)(drhd + 1); end = ((void *)drhd) + header->length; while (start < end) { scope = start; if (scope->entry_type == ACPI_DMAR_SCOPE_TYPE_IOAPIC) { if (ir_ioapic_num == MAX_IO_APICS) { ; return -1; } // printk(KERN_INFO "IOAPIC id %d under DRHD base " // " 0x%Lx IOMMU %d\n", scope->enumeration_id, ; ir_parse_one_ioapic_scope(scope, iommu); } else if (scope->entry_type == ACPI_DMAR_SCOPE_TYPE_HPET) { if (ir_hpet_num == MAX_HPET_TBS) { ; return -1; } // printk(KERN_INFO "HPET id %d under DRHD base" // " 0x%Lx\n", scope->enumeration_id, ; ir_parse_one_hpet_scope(scope, iommu); } start += scope->length; } return 0; }
static int ir_parse_ioapic_hpet_scope(struct acpi_dmar_header *header, struct intel_iommu *iommu) { int ret = 0; struct acpi_dmar_hardware_unit *drhd; struct acpi_dmar_device_scope *scope; void *start, *end; drhd = (struct acpi_dmar_hardware_unit *)header; start = (void *)(drhd + 1); end = ((void *)drhd) + header->length; while (start < end && ret == 0) { scope = start; if (scope->entry_type == ACPI_DMAR_SCOPE_TYPE_IOAPIC) ret = ir_parse_one_ioapic_scope(scope, iommu, drhd); else if (scope->entry_type == ACPI_DMAR_SCOPE_TYPE_HPET) ret = ir_parse_one_hpet_scope(scope, iommu, drhd); start += scope->length; } return ret; }