qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Marcel Apfelbaum <marcel@redhat.com>
To: Jan Kiszka <jan.kiszka@web.de>, Peter Xu <peterx@redhat.com>,
	qemu-devel@nongnu.org
Cc: Rita Sinha <rita.sinha89@gmail.com>,
	ehabkost@redhat.com, mst@redhat.com, jasowang@redhat.com,
	pbonzini@redhat.com, imammedo@redhat.com, rth@twiddle.net
Subject: Re: [Qemu-devel] [PATCH 05/13] acpi: add DMAR scope definition for root IOAPIC
Date: Sun, 21 Feb 2016 17:54:25 +0200	[thread overview]
Message-ID: <56C9DDB1.8000305@redhat.com> (raw)
In-Reply-To: <56C9BE5D.60808@web.de>

On 02/21/2016 03:40 PM, Jan Kiszka wrote:
> On 2016-02-21 13:08, Marcel Apfelbaum wrote:
>> On 02/21/2016 01:38 PM, Marcel Apfelbaum wrote:
>>> On 02/19/2016 05:30 AM, Peter Xu wrote:
>>>> To enable interrupt remapping for intel IOMMU device, each IOAPIC device
>>>> in the system reported via ACPI MADT must be explicitly enumerated under
>>>> one specific remapping hardware unit. This patch adds the root-complex
>>>> IOAPIC into the default DMAR device.
>>>>
>>>> Please refer to VT-d spec 8.3.1.1 for more information.
>>>>
>>>> Signed-off-by: Peter Xu <peterx@redhat.com>
>>>> ---
>>>>    hw/i386/acpi-build.c        | 23 +++++++++++++++++++++--
>>>>    include/hw/acpi/acpi-defs.h | 15 +++++++++++++++
>>>>    2 files changed, 36 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
>>>> index d9e4f91..1cefe43 100644
>>>> --- a/hw/i386/acpi-build.c
>>>> +++ b/hw/i386/acpi-build.c
>>>> @@ -76,6 +76,9 @@
>>>>    #define ACPI_BUILD_DPRINTF(fmt, ...)
>>>>    #endif
>>>>
>>>> +/* Default IOAPIC ID */
>>>> +#define ACPI_BUILD_IOAPIC_ID 0x0
>>>> +
>>>>    typedef struct AcpiCpuInfo {
>>>>        DECLARE_BITMAP(found_cpus, ACPI_CPU_HOTPLUG_ID_LIMIT);
>>>>    } AcpiCpuInfo;
>>>> @@ -392,7 +395,6 @@ build_madt(GArray *table_data, GArray *linker,
>>>> AcpiCpuInfo *cpu)
>>>>        io_apic = acpi_data_push(table_data, sizeof *io_apic);
>>>>        io_apic->type = ACPI_APIC_IO;
>>>>        io_apic->length = sizeof(*io_apic);
>>>> -#define ACPI_BUILD_IOAPIC_ID 0x0
>>>>        io_apic->io_apic_id = ACPI_BUILD_IOAPIC_ID;
>>>>        io_apic->address = cpu_to_le32(IO_APIC_DEFAULT_ADDRESS);
>>>>        io_apic->interrupt = cpu_to_le32(0);
>>>> @@ -2511,6 +2513,9 @@ build_dmar_q35(GArray *table_data, GArray *linker)
>>>>        AcpiDmarHardwareUnit *drhd;
>>>>        uint8_t dmar_flags = 0;
>>>>        IntelIOMMUState *intel_iommu = acpi_get_iommu();
>>>> +    AcpiDmarDeviceScope *scope = NULL;
>>>> +    /* Root complex IOAPIC use one path[0] only */
>>>> +    uint16_t scope_size = sizeof(*scope) + sizeof(uint16_t);
>>>>
>>>>        assert(intel_iommu);
>>>>
>>>> @@ -2526,11 +2531,25 @@ build_dmar_q35(GArray *table_data, GArray
>>>> *linker)
>>>>        /* DMAR Remapping Hardware Unit Definition structure */
>>>>        drhd = acpi_data_push(table_data, sizeof(*drhd));
>>>>        drhd->type = cpu_to_le16(ACPI_DMAR_TYPE_HARDWARE_UNIT);
>>>> -    drhd->length = cpu_to_le16(sizeof(*drhd));   /* No device scope
>>>> now */
>>>> +    drhd->length = cpu_to_le16(sizeof(*drhd) + scope_size);
>>>>        drhd->flags = ACPI_DMAR_INCLUDE_PCI_ALL;
>>>>        drhd->pci_segment = cpu_to_le16(0);
>>>>        drhd->address = cpu_to_le64(Q35_HOST_BRIDGE_IOMMU_ADDR);
>>>>
>>>> +    /* Scope definition for the root-complex IOAPIC */
>>>> +    scope = acpi_data_push(table_data, scope_size);
>>>> +    scope->entry_type = cpu_to_le16(ACPI_DMAR_DEV_SCOPE_TYPE_IOAPIC);
>>>> +    scope->length = scope_size;
>>>> +    /*
>>>> +     * An arbitary but unique bus number, to be used to generate
>>>> +     * source ID for IOAPIC device in BDF format.
>>>> +     */
>>>> +#define ACPI_IOAPIC_BUS_IR         (0xf0)
>>>> +#define ACPI_IOAPIC_DEVFN_IR       (0x00)
>>>
>>> Hi,
>>>
>>> How do you know for sure there is no bus (or bus & device) having the
>>> number 0xf0 in the system?
>>> Now that we support multiple Root Complexes, using the  pxb-pcie
>>> device we can simply add a PCI root bus like this:
>>>       -device pxb-pcie,bus_nr=0xf0
>>> or we can add enough switches to get to this number.
>>>
>>> You could dynamically query for an unused PCI bus, but the number
>>> would change between the runs.
>>> Or, I suppose you can reserve a slot on bus 0 for that. It is
>>> interesting how it works on a real machine.
>>
>> thinking about it more, maybe we should let the firmware to assign the
>> bus/dev/fun for the IO APIC?
>
> We have the same problem over with VT-d and IR.
>
> I don't think the firmware is not the right place, otherwise there would
> be an interface in hw to adjust that parameters. I think we should
> simply make sure that the qemu user cannot assign devices to those
> addresses as they are reserved for the platform devices (the HPET
> requires another ID), or even reserve the hole bus for the platform.


I understand, but it is the firmware that assign addresses, not QEMU/user.
We need a way to tell the firmware not to use a certain address range, we can do that
with fw_config I suppose.

Reserving a bus might be easier, we take the bus number out from host bridges CRS
ranges and each platform device can be assigned a slot. We would need to select the bus carefully
to not collide with other PCI hierarchies. Maybe bus 0xFF.

Thanks,
Marcel

>
> Jan
>

  reply	other threads:[~2016-02-21 15:54 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-19  3:30 [Qemu-devel] [PATCH 00/13] IOMMU: Enable interrupt remapping for Intel IOMMU Peter Xu
2016-02-19  3:30 ` [Qemu-devel] [PATCH 01/13] q35: add "int-remap" flag to enable intr Peter Xu
2016-02-21 10:38   ` Marcel Apfelbaum
2016-02-23  3:48     ` Peter Xu
2016-02-25 15:47       ` Marcel Apfelbaum
2016-04-08  7:30     ` Peter Xu
2016-04-11 10:07       ` Marcel Apfelbaum
2016-02-19  3:30 ` [Qemu-devel] [PATCH 02/13] acpi: enable INTR for DMAR report structure Peter Xu
2016-02-21 11:05   ` Marcel Apfelbaum
2016-04-08  8:07     ` Peter Xu
2016-02-19  3:30 ` [Qemu-devel] [PATCH 03/13] intel_iommu: allow queued invalidation for IR Peter Xu
2016-02-19  3:30 ` [Qemu-devel] [PATCH 04/13] intel_iommu: set IR bit for ECAP register Peter Xu
2016-02-19  3:30 ` [Qemu-devel] [PATCH 05/13] acpi: add DMAR scope definition for root IOAPIC Peter Xu
2016-02-21 11:38   ` Marcel Apfelbaum
2016-02-21 12:08     ` Marcel Apfelbaum
2016-02-21 13:40       ` Jan Kiszka
2016-02-21 15:54         ` Marcel Apfelbaum [this message]
2016-02-21 16:01           ` Jan Kiszka
2016-04-08  9:53             ` Peter Xu
2016-02-19  3:30 ` [Qemu-devel] [PATCH 06/13] intel_iommu: define interrupt remap table addr register Peter Xu
2016-02-19  3:30 ` [Qemu-devel] [PATCH 07/13] intel_iommu: handle interrupt remap enable Peter Xu
2016-02-19  3:30 ` [Qemu-devel] [PATCH 08/13] intel_iommu: define several structs for IOMMU IR Peter Xu
2016-02-19  3:30 ` [Qemu-devel] [PATCH 09/13] intel_iommu: provide helper function vtd_get_iommu Peter Xu
2016-02-19  3:30 ` [Qemu-devel] [PATCH 10/13] ioapic-common: add iommu for IOAPICCommonState Peter Xu
2016-02-19  3:30 ` [Qemu-devel] [PATCH 11/13] intel_iommu: add IR translation faults defines Peter Xu
2016-02-21 15:56   ` Marcel Apfelbaum
2016-04-08 10:03     ` Peter Xu
2016-02-19  3:30 ` [Qemu-devel] [PATCH 12/13] intel_iommu: ioapic: IR support for emulated IOAPIC Peter Xu
2016-02-19  3:30 ` [Qemu-devel] [PATCH 13/13] intel_iommu: Add support for PCI MSI remap Peter Xu
2016-02-19  6:46 ` [Qemu-devel] [PATCH 00/13] IOMMU: Enable interrupt remapping for Intel IOMMU Jan Kiszka
2016-02-19  7:43   ` Peter Xu
2016-02-19  8:34     ` Jan Kiszka
2016-02-19  9:29       ` Peter Xu
2016-02-19  9:58         ` Paolo Bonzini
2016-02-19 10:15           ` Jan Kiszka
2016-02-19 11:39             ` Peter Xu
2016-02-19 11:43               ` Jan Kiszka
2016-02-19 11:34           ` Peter Xu
2016-02-19 11:43             ` Jan Kiszka
2016-02-19 16:22               ` Radim Krčmář
2016-02-20 10:05         ` Jan Kiszka
2016-02-19 16:38   ` Radim Krčmář
2016-02-23  5:03     ` Peter Xu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=56C9DDB1.8000305@redhat.com \
    --to=marcel@redhat.com \
    --cc=ehabkost@redhat.com \
    --cc=imammedo@redhat.com \
    --cc=jan.kiszka@web.de \
    --cc=jasowang@redhat.com \
    --cc=mst@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peterx@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=rita.sinha89@gmail.com \
    --cc=rth@twiddle.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).