Received: by 2002:a05:6359:6284:b0:131:369:b2a3 with SMTP id se4csp3167296rwb; Mon, 7 Aug 2023 09:10:01 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHpurG3xZHGynOfeSk0rdv6nINj+EjoCYE+rzaJK8Vcn3RsgFXEVNkWEwxSqNbzqhMYmcZ1 X-Received: by 2002:a05:6a21:1f14:b0:13d:56cb:6b9d with SMTP id ry20-20020a056a211f1400b0013d56cb6b9dmr7052828pzb.32.1691424601439; Mon, 07 Aug 2023 09:10:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1691424601; cv=none; d=google.com; s=arc-20160816; b=N5b78EpXBg5EQPwD1FkymKrFtlRtg6MsBYJkBcQB7hpvp7sKPM3NUYWqu590FD2nfQ 5cI8lnsUVrSLnI7Ixmw4LptaQHtJCsIizGVdqz6/1lE9DSx3x6I6O8N6/YFUBiLgHuks Dic41Be5Bh+fAvI2MHS8Yk9jsT4YAi0262psMsBQIBoRwHgdwZg7P/SazJlBVoRGd5tz dlaXetRnrO84jq1FJF4fZDjZn8OmjgKuj00ShR5o6zh0jK4vsyBdQiwY4yVA9m3RjgWs GL8AH5QZEiEptPKV1JJjCw9YOpctk2+74yVXnlWvlxT3D7me2+ja1wu6urR1oZOK7Jqi HHtg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:date:mime-version:references:subject:cc:to:from :dkim-signature:dkim-signature:message-id; bh=aiPd1kJ39cEUiKercbaDdBw1XcAUDDQu1AI+a4ZUPac=; fh=/92WVKYrcN3rA268QXyKzVtm/UtxHeI2lnbU295XDiQ=; b=ph28uUh56UQzjD21PwLlyAjJkFDmho/wraVb26rH7heX8SiHcUGdDCjeST+Fiv67t9 8giSNstIdRcW0eL5uSeiFXpA6zX1CzOQAa8W+YaKvIFp/2ZzH/DABFs+3tthy8ffZMNE tgJvNQh18beSdAFLqD6g+pCATG751Q/d7OxYJVx6Ct7z9CBSqEi9pwpkhXH326WBq134 UVdruVGJvMm72e4b7PztAQRurAgTeaOwheGN7sp12MHLJ97X5xbuBrMlSO9oJKmVVbGy TmBgh8pnREk5WvDFTa/7f3MEfgtUlO4Z+IRnDt+gfzGYEb0FZ3RF1QA8+NMZQqW12oaU C0hA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b=NU7iSmQf; dkim=neutral (no key) header.i=@linutronix.de header.s=2020e header.b=c0u5DRuW; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=linutronix.de Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id z7-20020a655a47000000b0056433b221b9si5706044pgs.477.2023.08.07.09.09.39; Mon, 07 Aug 2023 09:10:01 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b=NU7iSmQf; dkim=neutral (no key) header.i=@linutronix.de header.s=2020e header.b=c0u5DRuW; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=linutronix.de Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234693AbjHGN42 (ORCPT + 99 others); Mon, 7 Aug 2023 09:56:28 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41290 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232402AbjHGNzy (ORCPT ); Mon, 7 Aug 2023 09:55:54 -0400 Received: from galois.linutronix.de (Galois.linutronix.de [IPv6:2a0a:51c0:0:12e:550::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 75772199C for ; Mon, 7 Aug 2023 06:53:57 -0700 (PDT) Message-ID: <20230807135028.852716187@linutronix.de> DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1691416426; 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: references:references; bh=aiPd1kJ39cEUiKercbaDdBw1XcAUDDQu1AI+a4ZUPac=; b=NU7iSmQfUQwNrqJyCFAczRCZqUyKGATvOAUgm2VAVI3hydE0Djlcpn+HIWW4cVv5fHBMs+ h3z1aOSg8ZvOpur5AGs2hSqc6+o9sN8ZJ/kcZ6VphfRKxKvChB08vwFr/2lNgQAiPK6G/G i/R0n3Fkzb4lX4kNB5bKQgZPsaWFzQ+ZOe3pGjWn542YrPTbvERhsZUMkDo6TSO/AlVzyo Ti5365Vm/TOXVhjT1zOEPeZC+d1Gr/qv80awJovr895uvAbldkrQk28jatlY7quWM0Qjra EUO9f61Ey5gRitQ4SNJp7inm3oNnynRmNd9Ee80A3jgzhIdg6pdMtpir3Enhqw== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1691416426; 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: references:references; bh=aiPd1kJ39cEUiKercbaDdBw1XcAUDDQu1AI+a4ZUPac=; b=c0u5DRuWzz5yn+Xx0JLP4M+VQZfLcyZJhQUSKfjoCKpytodMjdCpVMXz8faPw1TLOMmmoX C3GH3ySuicSvuEBA== From: Thomas Gleixner To: LKML Cc: x86@kernel.org, Tom Lendacky , Andrew Cooper , Arjan van de Ven , Huang Rui , Juergen Gross , Dimitri Sivanich , Michael Kelley , Sohil Mehta , K Prateek Nayak , Kan Liang , Zhang Rui , "Paul E. McKenney" , Feng Tang , Andy Shevchenko Subject: [patch 46/53] x86/cpu/topology: Provide logical pkg/die mapping References: <20230807130108.853357011@linutronix.de> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Date: Mon, 7 Aug 2023 15:53:45 +0200 (CEST) X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED,SPF_HELO_NONE, SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org With the topology bitmaps in place the logical package and die IDs can trivially be retrieved by determining the bitmap weight of the relevant topology domain level up to and including the physical ID in question. Provide a function to that effect. Signed-off-by: Thomas Gleixner --- arch/x86/include/asm/topology.h | 2 ++ arch/x86/kernel/cpu/topology.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) --- a/arch/x86/include/asm/topology.h +++ b/arch/x86/include/asm/topology.h @@ -156,6 +156,8 @@ static inline unsigned int topology_max_ return __max_dies_per_package; } +int topology_get_logical_id(u32 apicid, enum x86_topology_domains at_level); + #ifdef CONFIG_SMP #define topology_cluster_id(cpu) (cpu_data(cpu).topo.l2c_id) #define topology_die_cpumask(cpu) (per_cpu(cpu_die_map, cpu)) --- a/arch/x86/kernel/cpu/topology.c +++ b/arch/x86/kernel/cpu/topology.c @@ -199,6 +199,34 @@ void __init topology_register_boot_apic( topology_register_apic(apic_id, CPU_ACPIID_INVALID, true); } +/** + * topology_get_logical_id - Retrieve the logical ID at a given topology domain level + * @apicid: The APIC ID for which to lookup the logical ID + * @at_level: The topology domain level to use + * + * @apicid must be a full APIC ID, not the normalized variant. It's valid to have + * all bits below the domain level specified by @at_level to be clear. So both + * real APIC IDs and backshifted normalized APIC IDs work correctly. + * + * Returns: + * - >= 0: The requested logical ID + * - -ERANGE: @apicid is out of range + * - -ENODEV: @apicid is not registered + */ +int topology_get_logical_id(u32 apicid, enum x86_topology_domains at_level) +{ + /* Remove the bits below @at_level to get the proper level ID of @apicid */ + unsigned int lvlid = topo_apicid(apicid, at_level); + + if (lvlid >= MAX_LOCAL_APIC) + return -ERANGE; + if (!test_bit(lvlid, apic_maps[at_level].map)) + return -ENODEV; + /* Get the number of set bits before @lvlid. */ + return bitmap_weight(apic_maps[at_level].map, lvlid); +} +EXPORT_SYMBOL_GPL(topology_get_logical_id); + #ifdef CONFIG_ACPI_HOTPLUG_CPU /** * topology_hotplug_apic - Handle a physical hotplugged APIC after boot