From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-it0-x22d.google.com (mail-it0-x22d.google.com [IPv6:2607:f8b0:4001:c0b::22d]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 88C0A81C73 for ; Thu, 19 Jan 2017 14:01:09 -0800 (PST) Received: by mail-it0-x22d.google.com with SMTP id r185so7184851ita.0 for ; Thu, 19 Jan 2017 14:01:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=8U8lFSCu2ly0hHFksrqPzSDmDyDOWjExWUivKNA3cRg=; b=fz/TtPzZtbZMBzjkf2ZUPxP0WzMiL6w3mhhb286by28qmTRzA/mNzOCcnFy8QILZLA Ww/P8BW6gDb4SBps3qj1Gzj26M8kxfc2njOENWnNzK5zQ66OBuiY9921K/IgdRUqtXAL NqXWf+Wj6FliG0OETPOyhVZsWgme0A2XXedJ0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=8U8lFSCu2ly0hHFksrqPzSDmDyDOWjExWUivKNA3cRg=; b=lQqRfjXuky1EunXwJoMi/aAVwsflY7Au1qV2HtLfAKXrB6sEXw6ngBF1XV/dHrhBaw yU5dyfGG4HXIFp1J6LpwLS7EbyO5c/DFe+MVsMS80y6KvavLvqOF0JNmR9pkTnSMv8UU WZ9j6i8mzXVb+VCC1ispIb5lli2FjZg+k3SfhIA1qZYH9qu3btOnOTyGB38J2peDzTab m1d9Xj6S+OLfeumXsInzPhpT6YJgz23U63aOoQbVL4jcKodj5Fny1bnT0PkG/PPZPSMv sa5X+W0Brx5KdGR5sVJjKevCQrsCjnZ85v+OQgVKP2IbNQC0tBKJixXME+HSELPNJBOZ QqLA== X-Gm-Message-State: AIkVDXLpiOf20mGLlnNZmfRvur7SbTj0BFiliL1iD/bCERlo416zIrPT1tfC47veYfmfllMh/v6Fjzbif+tO1FvI X-Received: by 10.36.77.10 with SMTP id l10mr751918itb.59.1484863268139; Thu, 19 Jan 2017 14:01:08 -0800 (PST) MIME-Version: 1.0 Received: by 10.107.144.135 with HTTP; Thu, 19 Jan 2017 14:01:07 -0800 (PST) In-Reply-To: <20170119215731.GE4132@e104320-lin> References: <1484771046-21296-1-git-send-email-achin.gupta@arm.com> <20170118220500.GW25883@bivouac.eciton.net> <20170119123135.GB24076@e102648.cambridge.arm.com> <20170119215731.GE4132@e104320-lin> From: Ard Biesheuvel Date: Thu, 19 Jan 2017 22:01:07 +0000 Message-ID: To: Achin Gupta Cc: Leif Lindholm , "edk2-devel@lists.01.org" , nd@arm.com, Supreeth Venkatesh Subject: Re: [PATCH] ArmPlatformPkg/ArmVExpressPkg: Fix memory attributes for NOR Flash X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 19 Jan 2017 22:01:09 -0000 Content-Type: text/plain; charset=UTF-8 On 19 January 2017 at 21:57, Achin Gupta wrote: > Hi Ard, > > On Thu, Jan 19, 2017 at 06:16:00PM +0000, Ard Biesheuvel wrote: >> On 19 January 2017 at 12:31, Achin Gupta wrote: >> > Hi Leif/Ard, >> > >> > On Wed, Jan 18, 2017 at 10:05:00PM +0000, Leif Lindholm wrote: >> >> Hi Achin, >> >> >> >> On Wed, Jan 18, 2017 at 08:24:06PM +0000, achin.gupta@arm.com wrote: >> >> > From: Achin Gupta >> >> > >> >> > The NOR flash banks were being mapped in the translation tables with the same >> >> > memory attributes as RAM in the system. These attributes mark the region as >> >> > Normal Memory and could additionally be cacheable or non-cacheable. >> >> > >> >> > Either type of attributes are unsuitable for NOR Flash since write operations >> >> > could be performed on it. Normal Memory does not guarantee ordering of >> >> > transactions that Device memory does. So the commands sent to the Flash device >> >> > may not arrive in the right order unless barriers are used. Commands might not >> >> > get past the CPU caches in case the region has been mapped with cacheable >> >> > attributes. >> >> > >> >> > This patch fixes the problem by mapping the NOR Flash memory region with Device >> >> > memory attributes. >> >> >> >> To add some background to Ard's comment - this was not unintentionally >> >> done: >> >> https://github.com/tianocore/edk2/commit/19bb46c411279dcd30d540c56e5993c5f771c319 >> > >> > Thanks! I missed this commit. There is some background to the problem I am >> > facing below. >> > >> >> >> >> Was the reasoning behind this commit incorrect - do you have a >> >> (pre-DXE?) use-case that creates a problem? >> > >> > AFAIU, The current memory attributes for NOR Flash work only for reads. They >> > should additionally be RO to flag any unexpected writes. >> > >> > Mine is a DXE use case! In NorFlashDxe.c, commands are send to the Flash (erase >> > block etc.). They might never reach the device if there is a write-back cache in >> > between. So either device or Normal memory with non-cacheable/write-through >> > attributes and barriers should work. >> > >> > If I turn on cache state modelling in the Base FVP, the code gets stuck in >> > NorFlashReadStatusRegister() in the below loop in NorFlashEraseSingleBlock(): >> > >> > // Wait until the status register gives us the all clear >> > do { >> > StatusRegister = NorFlashReadStatusRegister (Instance, BlockAddress); >> > } while ((StatusRegister & P30_SR_BIT_WRITE) != P30_SR_BIT_WRITE); >> > >> > I think the SEND_NOR_COMMANDs at the beginning of the function get stuck in the >> > cache. Changing the flash memory attributes as per this patch solves the >> > problem. >> > >> > The original patch from Ard mentions that the NOR Flash DXE driver should change >> > the attributes of the region it wants to write to. Is this what is missing? >> > >> >> NorFlashFvbInitialize() in >> ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashFvbDxe.c contains the >> following calls: >> >> Status = gDS->AddMemorySpace ( >> EfiGcdMemoryTypeMemoryMappedIo, >> Instance->DeviceBaseAddress, RuntimeMmioRegionSize, >> EFI_MEMORY_UC | EFI_MEMORY_RUNTIME >> ); >> ASSERT_EFI_ERROR (Status); >> >> Status = gDS->SetMemorySpaceAttributes ( >> Instance->DeviceBaseAddress, RuntimeMmioRegionSize, >> EFI_MEMORY_UC | EFI_MEMORY_RUNTIME); >> ASSERT_EFI_ERROR (Status); >> >> which is supposed to set device attributes on the NOR region that is >> actually exposed to the upper layers as read-write capable. >> >> Perhaps you can enable GCD debugging to trace these calls, to ensure >> that the address you are stalled on is actually covered? > > Thanks for the pointer. Somehow NorFlashFvbInitialize() gets called and a valid > firmware volume header is not found. This irrespective of the state of cache > modelling. The function proceeds to install a header for which it first tries to > erase the Flash blocks reserved for variable storage. > > I am not sure why a FV header is not found. However the flash erase in response > happens with the pre-DXE memory attributes for the flash region. The GCD > services to change the attributes are called later. So this seems like a logical > error in the code. Does this make sense to you? Here is the trace for > reference. The last print was added by me. > >>>>> > add-symbol-file /home/achgup01/work/genfw/uefi/edk2/Build/ArmVExpress-FVP-AArch64/DEBUG_GCC49/AARCH64/ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe/DEBUG/ArmVeNorFlashDxe.dll 0xEAEA0000 > Loading driver at 0x000EAE90000 EntryPoint=0x000EAEA0044 ArmVeNorFlashDxe.efi > NorFlashWriteBlocks: informational - Had to enable HSYS_FLASH flag. > FvbRead(Parameters: Lba=0, Offset=0x0, *NumBytes=0x40, Buffer @ 0xF3FFF8A8) > NorFlashFvbInitialize > ValidateFvHeader: No Firmware Volume header present > NorFlashFvbInitialize: The FVB Header is not valid. > NorFlashFvbInitialize: Installing a correct one for this volume. > FvbEraseBlocks() > FvbEraseBlocks: Check if: ( StartingLba=0 + NumOfLba=3 - 1 ) > LastBlock=2. > FvbEraseBlocks: Erasing Lba=0 @ 0x0FFC0000. > NorFlashEraseSingleBlock: BlockAddress=0x0FFC0000 >>>>> > > Any pointers on the absent FV header and how NorFlashFvbInitialize() gets called > would be helpful. > Right, there is a 'feature' in the code to reinit the FV if it is corrupted, which is useful for emulators given that their NOR flash images are usually not backed by anything. For QEMU, we've added an FDF definition similar to what OVMF uses which is simply a binary dump of a pristine FV header. So yes, this is a logic error in the code: the reinit should not occur before the remapping of the region.