All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Alex Bennée" <alex.bennee@linaro.org>
To: "André Przywara" <andre.przywara@arm.com>
Cc: "Julien Grall" <julien@xen.org>,
	xen-devel@lists.xenproject.org, masami.hiramatsu@linaro.org,
	ehem+xen@m5p.com, bertrand.marquis@arm.com,
	"Julien Grall" <jgrall@amazon.com>,
	"Stefano Stabellini" <sstabellini@kernel.org>,
	"Volodymyr Babchuk" <Volodymyr_Babchuk@epam.com>,
	"Andrew Cooper" <andrew.cooper3@citrix.com>,
	"George Dunlap" <george.dunlap@citrix.com>,
	"Ian Jackson" <iwj@xenproject.org>,
	"Jan Beulich" <jbeulich@suse.com>, "Wei Liu" <wl@xen.org>,
	"Roger Pau Monné" <roger.pau@citrix.com>
Subject: Re: [PATCH 0/4] xen/arm: Unbreak ACPI
Date: Wed, 30 Sep 2020 09:51:30 +0100	[thread overview]
Message-ID: <87a6x7przh.fsf@linaro.org> (raw)
In-Reply-To: <d4f86fcf-fe13-5d96-895f-2737300b6628@arm.com>


André Przywara <andre.przywara@arm.com> writes:

> On 29/09/2020 22:11, Alex Bennée wrote:
>
> Hi,
>
>> Julien Grall <julien@xen.org> writes:
>> 
>>> Hi Alex,
>>>
>>> On 29/09/2020 16:29, Alex Bennée wrote:
>>>>
>>>> Julien Grall <julien@xen.org> writes:
>>>>
>>>>> From: Julien Grall <jgrall@amazon.com>
>>>>>
>>>>> Hi all,
>>>>>
>>>>> Xen on ARM has been broken for quite a while on ACPI systems. This
>>>>> series aims to fix it.
>>>>>
>>>>> Unfortunately I don't have a system with ACPI v6.0 or later (QEMU seems
>>>>> to only support 5.1).
>
> Does QEMU provide ACPI tables? Or is this actually EDK2 generating
> them?

It certainly does - whether EDK2 mangles them afterwards is another
question. For the -M virt machine we currently generate:

  /* FADT */
  static void build_fadt_rev5(GArray *table_data, BIOSLinker *linker,
                              VirtMachineState *vms, unsigned dsdt_tbl_offset)
  {
      /* ACPI v5.1 */
      AcpiFadtData fadt = {
          .rev = 5,
          .minor_ver = 1,
          .flags = 1 << ACPI_FADT_F_HW_REDUCED_ACPI,
          .xdsdt_tbl_offset = &dsdt_tbl_offset,
      };

      switch (vms->psci_conduit) {
      case QEMU_PSCI_CONDUIT_DISABLED:
          fadt.arm_boot_arch = 0;
          break;
      case QEMU_PSCI_CONDUIT_HVC:
          fadt.arm_boot_arch = ACPI_FADT_ARM_PSCI_COMPLIANT |
                               ACPI_FADT_ARM_PSCI_USE_HVC;
          break;
      case QEMU_PSCI_CONDUIT_SMC:
          fadt.arm_boot_arch = ACPI_FADT_ARM_PSCI_COMPLIANT;
          break;
      default:
          g_assert_not_reached();
      }

      build_fadt(table_data, linker, &fadt, NULL, NULL);
  }

Looking through the code it seems we stop around 5.0 - even the new
fancy x86 microvm ACPI tables are described as /* ACPI 5.0: 4.1
Hardware-Reduced ACPI */.

>
>> So I did only some light testing.
>
> So about that v6.0 or later: it seems like the requirement comes from:
> commit 1c9bd43019cd "arm/acpi: Parse FADT table and get PSCI flags":
> "Since STAO table and the GIC version are introduced by ACPI 6.0, we
> will check the version and only parse FADT table with version >= 6.0. If
> firmware provides ACPI tables with ACPI version less than 6.0, OS will
> be messed up with those information, so disable ACPI if we get an FADT
> table with version less than 6.0."
>
> STAO (and XENV) have indeed been introduced by ACPI v6.0, but those
> tables are supposed to be *generated* by Xen and handed down to Dom0,
> they will never be provided by firmware (or parsed) by the Xen
> hypervisor. Checking the Linux code it seems to actually not (yet?)
> support the STAO named list, and currently finds and uses the STAO (UART
> block bit) regardless of the FADT version number.
>
> I can't find anything GIC related in the FADT, the whole GIC information
> is described in MADT.

I think we are generating full data for both GIC2 and GIC3:

  /* MADT */
  static void
  build_madt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
  {
      VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
      int madt_start = table_data->len;
      const MemMapEntry *memmap = vms->memmap;
      const int *irqmap = vms->irqmap;
      AcpiMadtGenericDistributor *gicd;
      AcpiMadtGenericMsiFrame *gic_msi;
      int i;

      acpi_data_push(table_data, sizeof(AcpiMultipleApicTable));

      gicd = acpi_data_push(table_data, sizeof *gicd);
      gicd->type = ACPI_APIC_GENERIC_DISTRIBUTOR;
      gicd->length = sizeof(*gicd);
      gicd->base_address = cpu_to_le64(memmap[VIRT_GIC_DIST].base);
      gicd->version = vms->gic_version;

      for (i = 0; i < vms->smp_cpus; i++) {
          AcpiMadtGenericCpuInterface *gicc = acpi_data_push(table_data,
                                                             sizeof(*gicc));
          ARMCPU *armcpu = ARM_CPU(qemu_get_cpu(i));

          gicc->type = ACPI_APIC_GENERIC_CPU_INTERFACE;
          gicc->length = sizeof(*gicc);
          if (vms->gic_version == 2) {
              gicc->base_address = cpu_to_le64(memmap[VIRT_GIC_CPU].base);
              gicc->gich_base_address = cpu_to_le64(memmap[VIRT_GIC_HYP].base);
              gicc->gicv_base_address = cpu_to_le64(memmap[VIRT_GIC_VCPU].base);
          }
          gicc->cpu_interface_number = cpu_to_le32(i);
          gicc->arm_mpidr = cpu_to_le64(armcpu->mp_affinity);
          gicc->uid = cpu_to_le32(i);
          gicc->flags = cpu_to_le32(ACPI_MADT_GICC_ENABLED);

          if (arm_feature(&armcpu->env, ARM_FEATURE_PMU)) {
              gicc->performance_interrupt = cpu_to_le32(PPI(VIRTUAL_PMU_IRQ));
          }
          if (vms->virt) {
              gicc->vgic_interrupt = cpu_to_le32(PPI(ARCH_GIC_MAINT_IRQ));
          }
      }

      if (vms->gic_version == 3) {
          AcpiMadtGenericTranslator *gic_its;
          int nb_redist_regions = virt_gicv3_redist_region_count(vms);
          AcpiMadtGenericRedistributor *gicr = acpi_data_push(table_data,
                                                           sizeof *gicr);

          gicr->type = ACPI_APIC_GENERIC_REDISTRIBUTOR;
          gicr->length = sizeof(*gicr);
          gicr->base_address = cpu_to_le64(memmap[VIRT_GIC_REDIST].base);
          gicr->range_length = cpu_to_le32(memmap[VIRT_GIC_REDIST].size);

          if (nb_redist_regions == 2) {
              gicr = acpi_data_push(table_data, sizeof(*gicr));
              gicr->type = ACPI_APIC_GENERIC_REDISTRIBUTOR;
              gicr->length = sizeof(*gicr);
              gicr->base_address =
                  cpu_to_le64(memmap[VIRT_HIGH_GIC_REDIST2].base);
              gicr->range_length =
                  cpu_to_le32(memmap[VIRT_HIGH_GIC_REDIST2].size);
          }

          if (its_class_name() && !vmc->no_its) {
              gic_its = acpi_data_push(table_data, sizeof *gic_its);
              gic_its->type = ACPI_APIC_GENERIC_TRANSLATOR;
              gic_its->length = sizeof(*gic_its);
              gic_its->translation_id = 0;
              gic_its->base_address = cpu_to_le64(memmap[VIRT_GIC_ITS].base);
          }
      } else {
          gic_msi = acpi_data_push(table_data, sizeof *gic_msi);
          gic_msi->type = ACPI_APIC_GENERIC_MSI_FRAME;
          gic_msi->length = sizeof(*gic_msi);
          gic_msi->gic_msi_frame_id = 0;
          gic_msi->base_address = cpu_to_le64(memmap[VIRT_GIC_V2M].base);
          gic_msi->flags = cpu_to_le32(1);
          gic_msi->spi_count = cpu_to_le16(NUM_GICV2M_SPIS);
          gic_msi->spi_base = cpu_to_le16(irqmap[VIRT_GIC_V2M] + ARM_SPI_BASE);
      }

      build_header(linker, table_data,
                   (void *)(table_data->data + madt_start), "APIC",
                   table_data->len - madt_start, 3, NULL, NULL);
  }


>
> Linux/arm64 seems to be happy with ACPI >= v5.1:
> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/arm64/kernel/acpi.c#n148
>
> So can we relax the v6.0 requirement, to be actually >= v5.1? That is
> among the first to support ARM anyway, IIRC.
>
> I have only a smattering about ACPI, so happy to stand corrected.

I'd certainly be happy with that as reduces the number of components
that need to be uprevved to get support.

>
> Cheers,
> Andre
>
>>>>
>>>> I was hoping to get more diagnostics out to get it working under QEMU
>>>> TCG so I think must of missed a step:
>>>>
>>>>    Loading Xen 4.15-unstable ...
>>>>    Loading Linux 4.19.0-11-arm64 ...
>>>>    Loading initial ramdisk ...
>>>>    Using modules provided by bootloader in FDT
>>>>    Xen 4.15-unstable (c/s Sat Sep 26 21:55:42 2020 +0100 git:72f3d495d0) EFI loader
>>>>    ...silence...
>>>>
>>>> I have a grub installed from testing on a buster base:
>>>>
>>>>    dpkg --status grub-arm64-efi
>>>>    Version: 2.04-8
>>>>
>>>> With:
>>>>
>>>>    GRUB_CMDLINE_LINUX_DEFAULT=""
>>>>    GRUB_CMDLINE_LINUX="console=ttyAMA0"
>>>>    GRUB_CMDLINE_LINUX_XEN_REPLACE="console=hvc0 earlyprintk=xen"
>>>>    GRUB_CMDLINE_XEN="loglvl=all guest_loglvl=all com1=115200,8n1,0x3e8,5console=com1,vg"
>>>>
>>>> And I built Xen with --enable-systemd and tweaked the hypervisor .config:
>>>>
>>>>    CONFIG_EXPERT=y
>>>>    CONFIG_ACPI=y
>>>>
>>>> So any pointers to make it more verbose would be helpful.
>>>
>>> The error is hapenning before Xen setup the console. You can get early 
>>> output on QEMU if you rebuild Xen with the following .config options:
>>>
>>> CONFIG_DEBUG=y
>>> CONFIG_EARLY_UART_CHOICE_PL011=y
>>> CONFIG_EARLY_UART_PL011=y
>>> CONFIG_EARLY_PRINTK=y
>>> CONFIG_EARLY_UART_BASE_ADDRESS=0x09000000
>>> CONFIG_EARLY_UART_PL011_BAUD_RATE=0
>>> CONFIG_EARLY_PRINTK_INC="debug-pl011.inc"
>> 
>> OK I can see it fails on the ACPI and then tries to fall back to FDT and
>> then fails to find the GIC:
>> 
>>   (XEN) CMDLINE[00000000f7bbe000]:chosen placeholder root=UUID=cf00cd3a-066b-4146-bedf-f811d3343077 ro console=hvc0 earlyprintk=xen
>>   (XEN)
>>   (XEN) Command line: placeholder loglvl=all guest_loglvl=all com1=115200,8n1,0x3e8,5console=com1,vg no-real-mode edd=off
>>   (XEN) parameter "placeholder" unknown!
>>   (XEN) parameter "no-real-mode" unknown!
>>   (XEN) parameter "edd" unknown!
>>   (XEN) ACPI: RSDP 138560000, 0024 (r2 BOCHS )
>>   (XEN) ACPI: XSDT 138550000, 004C (r1 BOCHS  BXPCFACP        1       1000013)
>>   (XEN) ACPI: FACP 138510000, 010C (r5 BOCHS  BXPCFACP        1 BXPC        1)
>>   (XEN) ACPI: DSDT 138520000, 14A6 (r2 BOCHS  BXPCDSDT        1 BXPC        1)
>>   (XEN) ACPI: APIC 138500000, 018C (r3 BOCHS  BXPCAPIC        1 BXPC        1)
>>   (XEN) ACPI: GTDT 1384F0000, 0060 (r2 BOCHS  BXPCGTDT        1 BXPC        1)
>>   (XEN) ACPI: MCFG 1384E0000, 003C (r1 BOCHS  BXPCMCFG        1 BXPC        1)
>>   (XEN) ACPI: SPCR 1384D0000, 0050 (r2 BOCHS  BXPCSPCR        1 BXPC        1)
>>   (XEN) Unsupported FADT revision 5.1, should be 6.0+, will disable ACPI
>>   (XEN) acpi_boot_table_init: FADT not found (-22)
>>   (XEN) Domain heap initialised
>>   (XEN) Booting using Device Tree
>>   (XEN) Platform: Generic System
>>   (XEN)
>>   (XEN) ****************************************
>>   (XEN) Panic on CPU 0:
>>   (XEN) Unable to find compatible GIC in the device tree
>>   (XEN) ****************************************
>>   (XEN)
>>   (XEN) Reboot in five seconds...
>> 
>> Despite saying it is going to reboot it never manages to. Any idea how
>> it is trying to reset the system?
>> 


-- 
Alex Bennée


  reply	other threads:[~2020-09-30  8:51 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-26 20:55 [PATCH 0/4] xen/arm: Unbreak ACPI Julien Grall
2020-09-26 20:55 ` [PATCH 1/4] xen/acpi: Rework acpi_os_map_memory() and acpi_os_unmap_memory() Julien Grall
2020-09-28  8:18   ` Jan Beulich
2020-09-28  9:58     ` Julien Grall
2020-09-28 10:09       ` Jan Beulich
2020-09-28 10:39         ` Julien Grall
2020-10-10  9:49           ` Julien Grall
2020-10-10 10:04             ` Julien Grall
2020-09-29 11:10   ` Rahul Singh
2020-10-01  0:06   ` Stefano Stabellini
2020-10-01 15:09     ` Julien Grall
2020-09-26 20:55 ` [PATCH 2/4] xen/arm: acpi: The fixmap area should always be cleared during failure/unmap Julien Grall
2020-09-29 11:13   ` Rahul Singh
2020-10-01  0:30   ` Stefano Stabellini
2020-10-01 15:14     ` Julien Grall
2020-09-26 20:55 ` [PATCH 3/4] xen/arm: Check if the platform is not using ACPI before initializing Dom0less Julien Grall
2020-09-29 11:17   ` Rahul Singh
2020-09-30 23:26   ` Stefano Stabellini
2020-09-26 20:55 ` [PATCH 4/4] xen/arm: Introduce fw_unreserved_regions() and use it Julien Grall
2020-09-30 23:40   ` Stefano Stabellini
2020-10-01 15:34     ` Julien Grall
2020-09-27  1:47 ` [PATCH 0/4] xen/arm: Unbreak ACPI Elliott Mitchell
2020-09-29 15:28   ` Elliott Mitchell
2020-09-28  6:47 ` Masami Hiramatsu
2020-09-28 12:41   ` [PATCH] xen: acpi: Hide UART address only if SPCR exists Masami Hiramatsu
2020-09-28 12:42     ` Masami Hiramatsu
2021-01-19  7:25     ` Elliott Mitchell
2021-01-20 18:05       ` Julien Grall
2020-09-28 13:00   ` [PATCH 0/4] xen/arm: Unbreak ACPI Masami Hiramatsu
2020-10-16 22:33     ` Xen-ARM EFI/ACPI problems (was: Re: [PATCH 0/4] xen/arm: Unbreak ACPI) Elliott Mitchell
2020-10-17  5:12       ` Elliott Mitchell
2020-10-08 18:39   ` [PATCH 0/4] xen/arm: Unbreak ACPI Elliott Mitchell
2020-10-09  9:39     ` Julien Grall
2020-10-09 14:22       ` Elliott Mitchell
2020-10-09 18:15         ` Julien Grall
2020-10-09 22:36           ` Elliott Mitchell
2020-10-09 21:49   ` Elliott Mitchell
2020-10-10 11:02   ` Julien Grall
2020-10-12 19:02     ` Stefano Stabellini
2020-10-12 21:34       ` Elliott Mitchell
2020-10-14  1:06         ` Stefano Stabellini
2020-10-14  1:37           ` Elliott Mitchell
2020-10-14 17:47             ` Julien Grall
2020-10-15 18:00               ` Stefano Stabellini
2020-10-14 17:44       ` Julien Grall
2020-09-29 11:10 ` Rahul Singh
2020-09-29 15:29 ` Alex Bennée
2020-09-29 17:07   ` Julien Grall
2020-09-29 21:11     ` Alex Bennée
2020-09-29 23:39       ` André Przywara
2020-09-30  8:51         ` Alex Bennée [this message]
2020-09-30 10:35         ` Julien Grall
2020-09-30  9:42       ` Julien Grall
2020-09-30 10:38         ` Alex Bennée
2020-09-30 11:10           ` Julien Grall

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=87a6x7przh.fsf@linaro.org \
    --to=alex.bennee@linaro.org \
    --cc=Volodymyr_Babchuk@epam.com \
    --cc=andre.przywara@arm.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=bertrand.marquis@arm.com \
    --cc=ehem+xen@m5p.com \
    --cc=george.dunlap@citrix.com \
    --cc=iwj@xenproject.org \
    --cc=jbeulich@suse.com \
    --cc=jgrall@amazon.com \
    --cc=julien@xen.org \
    --cc=masami.hiramatsu@linaro.org \
    --cc=roger.pau@citrix.com \
    --cc=sstabellini@kernel.org \
    --cc=wl@xen.org \
    --cc=xen-devel@lists.xenproject.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.