From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wr1-f54.google.com (mail-wr1-f54.google.com [209.85.221.54]) by mx.groups.io with SMTP id smtpd.web11.12307.1632827679632793756 for ; Tue, 28 Sep 2021 04:14:40 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@nuviainc-com.20210112.gappssmtp.com header.s=20210112 header.b=6YUmDI+R; spf=pass (domain: nuviainc.com, ip: 209.85.221.54, mailfrom: leif@nuviainc.com) Received: by mail-wr1-f54.google.com with SMTP id t18so57412125wrb.0 for ; Tue, 28 Sep 2021 04:14:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nuviainc-com.20210112.gappssmtp.com; s=20210112; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to; bh=PtVdyWHcACVImnmEbbhzFpOtKx+HiOWeEdoZ8EJVA28=; b=6YUmDI+RCExCNlMrU5yZAZGkpPMMvaZDPn6CwkNK50rQZEQCGYMUTElbvnu1vwo9si FlW9H9b7ovJS9BpqFDFX/YNjHcIl1KE6KUTd6WZUNUzZoBwzNIftLmgvCjS1mGbR1OA/ NGLlaWLgWZhwzLVZK9VGfm1uCC/vW+N0MfMTPIKOhvSUI1Xj12SI7p1/iYAV9ojWbZ4r 1e4sn4Uvoh47l8MDJp9CcB3Cxdd44jAHGwo1gHAlB9h/34/mycbjYR5sYK3/aaA+T3mR 8+nUalkc0DRY0rqzTB6TSIMRiyFQ/FGhd6wcrPIdpaFH20fNtD+1K1TEJPuoDvI6kTwV LSVw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=PtVdyWHcACVImnmEbbhzFpOtKx+HiOWeEdoZ8EJVA28=; b=iWNv88Wms79VURk8tL44zS1rHwhmfrnXpmmuymjMxLsEeK5xPUr52J7AB8fbk9Z3S6 MhyhFM8oJYupFzFaX6ccIwzVhuyBGGbqVDba4eW9PqW3J9JEY41mh2jlipIIJRI1503P tZKPi5Bb/XhhZFAOvjI/1p+Uue5NAztYP3FMpR0rgVdC14BnBPTBf3D5A3M9YkqP8N7d RDzGU4LRaND6y0+YJFmyRJIj6OlJRZXf0TT4a5NtJu6ZPUFLafLT9Jy3NEVHQJH4LYF9 cjkxItOvLZyIg8QZ8kQognFVJ5E5KFim4daHUf6UCcxie9c0cIkWLLHBcPD/GSTrbQZC OQOA== X-Gm-Message-State: AOAM5310rZW+ALWjYKTo8axEN4uWlIX54U7XfV52lP0oSh+oWkpM20V3 aAGNUE8DEm+XwoZh4VS65GzoPA== X-Google-Smtp-Source: ABdhPJz0PenHVZYaqiwb+oFUoQiPOB7AWxKRPvsFMM1ri9wDocOEm6rFkTGr7xwGcyjaCgviCz7GHA== X-Received: by 2002:adf:f84e:: with SMTP id d14mr5986107wrq.359.1632827678040; Tue, 28 Sep 2021 04:14:38 -0700 (PDT) Return-Path: Received: from leviathan (cpc92314-cmbg19-2-0-cust559.5-4.cable.virginm.net. [82.11.186.48]) by smtp.gmail.com with ESMTPSA id y18sm18896160wrq.6.2021.09.28.04.14.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Sep 2021 04:14:37 -0700 (PDT) Date: Tue, 28 Sep 2021 12:14:35 +0100 From: "Leif Lindholm" To: Rebecca Cran Cc: devel@edk2.groups.io, Sami Mujawar , Ard Biesheuvel , Gerd Hoffmann , rfc@edk2.groups.io Subject: Re: [RFC] [PATCH 0/2] Proposal to add EFI_MP_SERVICES_PROTOCOL support for AARCH64 Message-ID: <20210928111435.poztq4cksagsogbw@leviathan> References: <20210925021752.20678-1-rebecca@nuviainc.com> MIME-Version: 1.0 In-Reply-To: <20210925021752.20678-1-rebecca@nuviainc.com> Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Fri, Sep 24, 2021 at 20:17:50 -0600, Rebecca Cran wrote: > I'd like to propose adding EFI_MP_SERVICES_PROTOCOL support for > AARCH64 systems. I've attached two patches to implement support for it > in the DXE phase, based on code in EmulatorPkg and UefiCpuPkg. It's added > under ArmPkg for now, but longer term it should probably be moved into > UefiCpuPkg. > > Patch 1/2 is the start of addressing the issue that the Aff0 field of > the MPIDR is no longer guaranteed to be the core, and should be referred > to in a more generic way: for example it could be the thread, with Aff1 > being the core and Aff2 the cluster. Clearly much more work is needed > to fully remove that assumption. Just to add to this: Aff0 was never defined by the architecture to be the "core", it was just the smallest schedulable entity. The intent being that whether you had multiple hardware threads per core or not, you could just use the affinity to determine whether There is also a bit in the MPIDR to indicate whether the core *had* multiple hardware threads. In recent processors (without any change to the architecture), ARM thought it would be beneficial to keep software developers on their toes by starting to use the hyperthreading layout even for processors without hyperthreading support. I.e. Aff0 is always 0 even though MT is 0: https://developer.arm.com/documentation/100798/0301/Register-descriptions/AArch64-system-registers/MPIDR-EL1--Multiprocessor-Affinity-Register--EL1 The justification being that an SoC might contain both processors with and without multiple hardware threads per core. Anyway, the point is that from at least Cortex-A76 onwards, Aff0 no longer maps to CoreId universally, and Aff1 no longer maps to ClusterId, for all non-threaded implementations. So we need to start cleaning up this use. This will possibly break some out-of-tree platforms, but I figure we're far enough from next stable tag for that not to matter too much. > Patch 2/2 implements the EFI_MP_SERVICES_PROTOCOL for DXE in Library/MpInitLib. Worth calling out in the cover letter that this is backed by PSCI. / Leif > CpuDxe initializes the MP support, and as a result gains a dependency on > MpInitLib. ArmVirt.dsc.inc needs updated to add the new library, as will > all AARCH64 platforms. > > I sent out a patch for MdeModulePkg last week to add a corresponding test > application, MpServicesTest (see https://edk2.groups.io/g/devel/message/80878). > > Rebecca Cran (2): > ArmPkg: Replace CoreId and ClusterId with Mpidr in ARM_CORE_INFO > struct > ArmPkg: Add Library/MpInitLib to support EFI_MP_SERVICES_PROTOCOL > > ArmPkg/ArmPkg.dec | 4 + > ArmPkg/ArmPkg.dsc | 4 + > ArmPkg/Drivers/CpuDxe/AArch64/Arch.c | 22 + > ArmPkg/Drivers/CpuDxe/Arm/Arch.c | 22 + > ArmPkg/Drivers/CpuDxe/CpuDxe.c | 2 + > ArmPkg/Drivers/CpuDxe/CpuDxe.h | 10 + > ArmPkg/Drivers/CpuDxe/CpuDxe.inf | 6 + > ArmPkg/Drivers/CpuDxe/CpuMpInit.c | 604 ++++++++ > ArmPkg/Include/Guid/ArmMpCoreInfo.h | 3 +- > ArmPkg/Include/Library/ArmLib.h | 4 + > ArmPkg/Include/Library/MpInitLib.h | 366 +++++ > ArmPkg/Library/MpInitLib/AArch64/MpFuncs.S | 61 + > ArmPkg/Library/MpInitLib/DxeMpInitLib.inf | 53 + > ArmPkg/Library/MpInitLib/DxeMpLib.c | 1498 ++++++++++++++++++++ > ArmPkg/Library/MpInitLib/InternalMpInitLib.h | 358 +++++ > ArmPlatformPkg/Library/ArmPlatformLibNull/ArmPlatformLibNull.c | 8 +- > ArmPlatformPkg/PrePeiCore/MainMPCore.c | 2 +- > ArmPlatformPkg/PrePi/MainMPCore.c | 2 +- > ArmVirtPkg/ArmVirt.dsc.inc | 3 + > 19 files changed, 3024 insertions(+), 8 deletions(-) > create mode 100644 ArmPkg/Drivers/CpuDxe/AArch64/Arch.c > create mode 100644 ArmPkg/Drivers/CpuDxe/Arm/Arch.c > create mode 100644 ArmPkg/Drivers/CpuDxe/CpuMpInit.c > create mode 100644 ArmPkg/Include/Library/MpInitLib.h > create mode 100644 ArmPkg/Library/MpInitLib/AArch64/MpFuncs.S > create mode 100644 ArmPkg/Library/MpInitLib/DxeMpInitLib.inf > create mode 100644 ArmPkg/Library/MpInitLib/DxeMpLib.c > create mode 100644 ArmPkg/Library/MpInitLib/InternalMpInitLib.h > > -- > 2.31.1 >