From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from us-smtp-delivery-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.61]) by mx.groups.io with SMTP id smtpd.web11.13725.1593006131579275705 for ; Wed, 24 Jun 2020 06:42:11 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=XevuwLYB; spf=pass (domain: redhat.com, ip: 205.139.110.61, mailfrom: drjones@redhat.com) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1593006130; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=GchDQWbmKkzD7ywnjCH1fd7UcsBJzxjBIINFLjVK/xE=; b=XevuwLYBA7GqswefUL0bj0ajqlQurfLVIMkpXQk/bpI1OQupzlTvFRD0hizUiXc0++tiaj SMyWnW+UvfLneg5GuAk5UXup4lYIkEfj/hWIeIUJLP9CPi/jEQrUL9AR2H5UCOZZRb2t66 VdAe033MniyCqbhV1UyQ+1xie3w8s3Y= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-110-E54TqTu5NZ6SbAOueyZejQ-1; Wed, 24 Jun 2020 09:42:03 -0400 X-MC-Unique: E54TqTu5NZ6SbAOueyZejQ-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 3B19F107ACCD; Wed, 24 Jun 2020 13:42:02 +0000 (UTC) Received: from kamzik.brq.redhat.com (unknown [10.40.194.54]) by smtp.corp.redhat.com (Postfix) with ESMTPS id C3E4710013D9; Wed, 24 Jun 2020 13:41:57 +0000 (UTC) Date: Wed, 24 Jun 2020 15:41:54 +0200 From: Andrew Jones To: Philippe =?utf-8?Q?Mathieu-Daud=C3=A9?= Cc: Ard Biesheuvel , devel@edk2.groups.io, lersek@redhat.com, Eric Auger Subject: Re: [edk2-devel] [PATCH] ArmVirtPkg/NorFlashQemuLib: disable NOR flash DT nodes upon discovery Message-ID: <20200624134154.isbcqvscs7eidbd4@kamzik.brq.redhat.com> References: <20200623175700.1564281-1-ard.biesheuvel@arm.com> <85a63fc4-f3d1-1e17-bf1d-dace59bb02a8@arm.com> <2a43b904-5172-0fb3-6d40-e1fd3b652fe7@redhat.com> MIME-Version: 1.0 In-Reply-To: X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=drjones@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit Content-Disposition: inline On Wed, Jun 24, 2020 at 03:02:49PM +0200, Philippe Mathieu-Daudé wrote: > On 6/24/20 1:43 PM, Ard Biesheuvel wrote: > > On 6/24/20 1:20 PM, Laszlo Ersek via groups.io wrote: > >> (CC Drew, Eric) > >> > >> On 06/24/20 09:19, Ard Biesheuvel wrote: > >> > >>> The arm64 defconfig was recently updated with MTD support, and so the > >>> flash banks are now claimed by the CFI flash driver. I saw the same on > >>> 32-bit ARM today, and I am not sure if it is a change there or whether > >>> it was always like that (for multi_v7_defconfig) but there is no good > >>> reason to keep supporting this. > >> > >> Can the same (problematic) kernel driver binding occur via the ACPI > >> DSDT? > >> > >> In this fw patch we hide the flash chip(s) from the guest kernel via > >> Device Tree only. > >> > >> There isn't much I guess we can (or should) do about ACPI in the > >> firmware, but it would still be a conflict between the fw driver and the > >> kernel driver -- we might have to address that in QEMU (hide the pflash > >> in the ACPI generator when UEFI is used as guest firmware). > >> > >> IIRC, in QEMU, we use "arm_boot_info.firmware_loaded", from > >> , to represent UEFI: > >> > >>>      /* Boot firmware has been loaded, typically at address 0, with > >>> -bios or > >>>       * -pflash. It also implies that fw_cfg_find() will succeed. > >>>       */ > >>>      bool firmware_loaded; > >> > >> And we already seem to have this exact kind of distinction in QEMU; see > >> for example "hw/arm/virt.c": > >> > >>>      if (has_ged && aarch64 && firmware_loaded && > >>> virt_is_acpi_enabled(vms)) { > >>>          vms->acpi_dev = create_acpi_ged(vms); > >>>      } else { > >>>          create_gpio(vms); > >>>      } > >> > >> coming from commit cff51ac978c4 ("hw/arm/virt: Enable device memory > >> cold/hot plug with ACPI boot", 2019-10-05). > >> > >> And (same file): > >> > >>>          if (!vms->bootinfo.firmware_loaded || > >>> !virt_is_acpi_enabled(vms)) { > >>>              return HOTPLUG_HANDLER(machine); > >>>          } > >> > >> coming from commit 70e89132c9e6 ("hw/arm/virt: Add the virtio-iommu > >> device tree mappings", 2020-02-27). > >> > >> ... Ah, I think I've found it [hw/arm/virt-acpi-build.c]: > >> > >>> /* DSDT */ > >>> static void > >>> build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState > >>> *vms) > >>> { > >>>      Aml *scope, *dsdt; > >>>      MachineState *ms = MACHINE(vms); > >>>      const MemMapEntry *memmap = vms->memmap; > >>>      const int *irqmap = vms->irqmap; > >>> > >>>      dsdt = init_aml_allocator(); > >>>      /* Reserve space for header */ > >>>      acpi_data_push(dsdt->buf, sizeof(AcpiTableHeader)); > >>> > >>>      /* When booting the VM with UEFI, UEFI takes ownership of the > >>> RTC hardware. > >>>       * While UEFI can use libfdt to disable the RTC device node in > >>> the DTB that > >>>       * it passes to the OS, it cannot modify AML. Therefore, we > >>> won't generate > >>>       * the RTC ACPI device at all when using UEFI. > >>>       */ > >>>      scope = aml_scope("\\_SB"); > >>>      acpi_dsdt_add_cpus(scope, vms->smp_cpus); > >>>      acpi_dsdt_add_uart(scope, &memmap[VIRT_UART], > >>>                         (irqmap[VIRT_UART] + ARM_SPI_BASE)); > >>>      acpi_dsdt_add_flash(scope, &memmap[VIRT_FLASH]); > >> > >> The ACPI generator already takes the RTC into account; see QEMU commit > >> 67736a25f865 ("ARM: virt: Don't generate RTC ACPI device when using > >> UEFI", 2016-01-15). > >> > >> Should we do the same for the acpi_dsdt_add_flash() call, now? > >> > >> (This also suggests that my consideration of "firmware_loaded" above is > >> irrelevant, if we end up modifying the build_dsdt() function -- on > >> AARCH64, ACPI is only defined in UEFI terms (namely, as a UEFI system > >> config table), so in this function, the presence of UEFI can be assumed > >> "yes".) > >> > > > > I wasn't aware that we even expose the flash in the DSDT. In any case, > > no driver exists in Linux today that claims the LNRO0015 _HID, and so I > > agree we should simply remove it entirely. > > > > However, I am no longer able to contribute to QEMU, so I was hoping you > > or Phil could take the action? > > I try to stay as far as possible from ACPI, but here it seems > fair I assign myself to this (except if Drew/Eric prefer to > do it, of course!). I don't mind doing it. IIUC, all we need to do is remove the flash device from the DSDT to "hide" it from the guest. Of course we'll need some compat code too in order to only do this for machine types 5.1 and later, and that means that running guest kernels which want to bind the flash on 5.0 and older machine types will still have the problem. Also, it seems a bit odd to hide hardware from the guest OS. Wouldn't it be better to somehow flag that the hardare may be in use by firmware, and therefore is only safe to use if runtime services are not used? I'm not sure ACPI supports that for table entries like these, but maybe some _STA value indicates something like it. I'll take a look at the spec. Thanks, drew