[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 2/4] AMD IOMMU: cover all functions of a device even if ACPI only tells us of func 0
>>> On 15.02.13 at 18:21, Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx> wrote: > On 02/15/2013 11:20 AM, Jan Beulich wrote: >> >> static int __init get_last_bdf_acpi(struct acpi_table_header *table) >> { >> const struct acpi_ivrs_header *ivrs_block; >> unsigned long length = sizeof(struct acpi_table_ivrs); >> + int last_bdf = 0; >> >> while ( table->length > (length + sizeof(*ivrs_block)) ) >> { >> ivrs_block = (struct acpi_ivrs_header *)((u8 *)table + length); >> if ( table->length < (length + ivrs_block->length) ) >> return -ENODEV; >> - if ( ivrs_block->type == ACPI_IVRS_TYPE_HARDWARE && >> - get_last_bdf_ivhd( >> + if ( ivrs_block->type == ACPI_IVRS_TYPE_HARDWARE ) >> + { >> + int ret = get_last_bdf_ivhd( >> container_of(ivrs_block, const struct acpi_ivrs_hardware, >> - header)) != 0 ) >> - return -ENODEV; >> + header)); >> + >> + if ( ret < 0 ) >> + return ret; >> + UPDATE_LAST_BDF(ret); > > Why do we need UPDATE_LAST_BDF () here? It is updated in > get_last_bdf_ivhd () above. No, because "last_bdf" now is a local variable. >> + } >> length += ivrs_block->length; >> } >> - return 0; >> + >> + return last_bdf; >> } > > ... > >> --- a/xen/drivers/passthrough/amd/pci_amd_iommu.c >> +++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c >> @@ -28,12 +28,38 @@ >> #include <asm/hvm/svm/amd-iommu-proto.h> >> #include "../ats.h" >> >> +static bool_t __read_mostly init_done; >> + >> struct amd_iommu *find_iommu_for_device(int seg, int bdf) >> { >> struct ivrs_mappings *ivrs_mappings = get_ivrs_mappings(seg); >> >> - return ivrs_mappings && bdf < ivrs_bdf_entries ? >> ivrs_mappings[bdf].iommu >> - : NULL; >> + if ( !ivrs_mappings || bdf >= ivrs_bdf_entries ) >> + return NULL; >> + >> + if ( unlikely(!ivrs_mappings[bdf].iommu) && likely(init_done) ) >> + { >> + unsigned int bd0 = bdf & ~PCI_FUNC(~0); >> + >> + if ( ivrs_mappings[bd0].iommu ) >> + { >> + struct ivrs_mappings tmp = ivrs_mappings[bd0]; >> + >> + tmp.iommu = NULL; >> + if ( tmp.dte_requestor_id == bd0 ) >> + tmp.dte_requestor_id = bdf; > > Is it possible to have tmp.dte_requestor_id != bd0 Sure - when there was an alias entry for it (I assume e.g. in the case of the device sitting behind a legacy PCI bridge). Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |