On Wed, Sep 12, 2018 at 02:24:52PM -0500, Brijesh Singh wrote: > > > On 09/12/2018 11:35 AM, Igor Mammedov wrote: > ... > > > > + /* > > > + * When interrupt remapping is enabled, Linux IOMMU driver also > > > checks > > > + * for special IVHD device (type IO-APIC), which is typically > > > presented > > > + * as PCI device 14:00.0. > > Probably it shouldn't be a 'typically' device from somewhere but rather > > address > > fetched from corresponding device model QEMU implements. > > > > IOAPIC is not presented as a true PCI device to guest OS. When IOMMU is > enabled a pseudo address space to added under root PCI bus. PCI 14:0.0 > presents to this pseudo device. > > > > > > + */ > > > + if (s->intr_enabled) { > > > + build_append_int_noprefix(table_data, 0x0100a00000000048, 8); > > ^^ this is > > incomprehensible, > > where does this magic number comes from and how was it calculated? > > > > In order to provide interrupt remap support, a special IVHD device need > to be added, the magic number uses the format defined in Table 95 (IVHD > device entry type codes). > > 0x01 00a0 00 00 0000 48 > > Byte 0: 0x48 (special device) > Byte 1 & 2: must be zero > Byte 3: 0 (dte setting) > Byte 4: 0 (handle) > Byte 5 & 6: IOAPIC devfn (14:0.0)
Do you mean *bus* devfn? devfn is 0.0. > Byte 7: 0x1 (IOAPIC) - See Table 97 in spec Above should go into code comment, along with first (oldest) version of spec that has this table. Additionally the number is IMHO more readable as: (0x1ull << 56) | (PCI_BUILD_BDF(14, 0) << 40) | 0x48 (assuming I got what it should be). > > > > + } > > > + > > > build_header(linker, table_data, (void *)(table_data->data + > > > iommu_start), > > > "IVRS", table_data->len - iommu_start, 1, NULL, NULL); > > > } > >