Received: by 2002:a05:6358:c692:b0:131:369:b2a3 with SMTP id fe18csp4543677rwb; Mon, 31 Jul 2023 08:23:50 -0700 (PDT) X-Google-Smtp-Source: APBJJlF5MlDOGAp2WJKKCJQpj5yItM3PTTqJ3bmmvv9Tij57QPdYXRWwC4Cy2ujC0ffeEHrQAoOk X-Received: by 2002:a05:6512:612:b0:4fe:b04:dfac with SMTP id b18-20020a056512061200b004fe0b04dfacmr163391lfe.0.1690817030334; Mon, 31 Jul 2023 08:23:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1690817030; cv=none; d=google.com; s=arc-20160816; b=S7oQ3yVtf2BMVEDXqQOhU/JpOUt2WbCEZaSFDrUmKXOPWYPQSMnuHM7jT5HrZtWPUH qYtvZuJHEu5aqzx+I/+hVvtJzzl3pXWiVhyki2K1vOMGAo/CueHMc2FqObvskXyeTM8W J5V/Bi7AieIS7YPdVXrNZOo8sbePMnJ7Zf9GPVotsep9jtHDy8M/C73TCMfHSWMx4BIj CISVNDfuFboEvkcZ79boq7vZys80e1FpeuqEl938/wnUv2KnVnkO7JZSlaZ0GD/pGE5h sBBAE0L7it7clEf22/GD+NrPbrLzQCMSdBbeYnkcMhnLhA7QknqpbcgzoR8CJ+SYNJJQ daJA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:user-agent:in-reply-to:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :dkim-signature; bh=LH8xvIUm2eO+A8pOg6hYThaiqEq6kQOODVAVfrpOeE0=; fh=rP1wqdNNppR78dp50hstggubIp8hTsZfm4IB+1rAXI0=; b=ygFOZllsWtAvzSsTYnP0uDhWJDoFPO+p0HIJCKo7l1lySZxdkFrBwCeTLpUMnxrDS+ cqg21usgUqqSmNKKUko2mqrDrwUUNHgn8Dw3EUaqyKIKDTlAY0J7wYqtERy0/dYSeEiB U8SwPLF2pMyuFaIHLUYjBTWHrzNdNLDTKx11DHomKFUd6SqWxeUR4oL8+fe0JnH9A9AS sn/1gIYUSLdDTMe2nLdLCWHlsjOmXrWrFX0ZqadeKthbcQTbAuvU7Wvx3DsBhRXiJqaE muxQpJTYogg2WiDWWxLuqPA5ZwMqofD3wnom7L9u3NfAPRPjbVjai5fosRiWJQi1nxCB ccig== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b="rjdDrbf/"; 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=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id f18-20020a056402151200b0052257c0e629si7513881edw.316.2023.07.31.08.23.25; Mon, 31 Jul 2023 08:23:50 -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=@kernel.org header.s=k20201202 header.b="rjdDrbf/"; 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=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232245AbjGaO7b (ORCPT + 99 others); Mon, 31 Jul 2023 10:59:31 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57658 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230075AbjGaO7a (ORCPT ); Mon, 31 Jul 2023 10:59:30 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4C19C120 for ; Mon, 31 Jul 2023 07:59:29 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id C3ED861197 for ; Mon, 31 Jul 2023 14:59:28 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 04391C433C8; Mon, 31 Jul 2023 14:59:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1690815568; bh=ftge1M69ijmBVOxHxPxv2q9+9zEr6xMXecTox9VQe8k=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=rjdDrbf/PKhk5wBVpvxxsySO7Uq9c19P6HdwKJYDR2c//OG2UlN5MOxxlrh9N3Drl xwouc27hiraaCqwlMLRGJY/fzkZ2Nw1Y6+vKbbrbKl4SEaP7ciVP/nRD4KBQWjaD1m Hsa12YDaQuQhD8vOa2gL707L7wBsTXDB6UkaeFi/txhLFkGhkuC/5kvozqckoPr7sb uaOgVwBsaAW4QXC7714K9fyJW7Nrmef2AC3qrq7h9ynx3FX8lnEnENW888vfk/pZK9 jgnJQfhZZfH/rso4of5MLWMbqk9S0ov5op7pZ3FaE+Yt3CHZD6MTzv+ntFNrUEmwGd ZrwhsD2jmVsGQ== Date: Mon, 31 Jul 2023 15:59:23 +0100 From: Will Deacon To: Anshuman Khandual Cc: linux-arm-kernel@lists.infradead.org, suzuki.poulose@arm.com, Catalin Marinas , Mark Rutland , linux-kernel@vger.kernel.org Subject: Re: [PATCH 1/3] arm_pmu: acpi: Add a representative platform device for TRBE Message-ID: <20230731145922.GB24881@willie-the-truck> References: <20230728112733.359620-1-anshuman.khandual@arm.com> <20230728112733.359620-2-anshuman.khandual@arm.com> <20230728144056.GE21718@willie-the-truck> <3ee165d7-3727-53cc-295d-a2108734952d@arm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <3ee165d7-3727-53cc-295d-a2108734952d@arm.com> User-Agent: Mutt/1.10.1 (2018-07-13) X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE 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 On Mon, Jul 31, 2023 at 05:38:38PM +0530, Anshuman Khandual wrote: > On 7/28/23 20:10, Will Deacon wrote: > > On Fri, Jul 28, 2023 at 04:57:31PM +0530, Anshuman Khandual wrote: > >> diff --git a/drivers/perf/arm_pmu_acpi.c b/drivers/perf/arm_pmu_acpi.c > >> index 90815ad762eb..dd3df6729808 100644 > >> --- a/drivers/perf/arm_pmu_acpi.c > >> +++ b/drivers/perf/arm_pmu_acpi.c [...] > >> + ret = platform_device_register(&trbe_acpi_dev); > >> + if (ret < 0) { > >> + pr_warn("ACPI: TRBE: Unable to register device\n"); > >> + acpi_unregister_gsi(gsi); > >> + } > >> +} > >> +#else > >> +static inline void arm_trbe_acpi_register_device(void) > >> +{ > >> + > >> +} > >> +#endif /* CONFIG_CORESIGHT_TRBE */ > > > > This looks like you ran s/spe/trbe/ over the SPE device registration > > code :) > > Yeah, almost :) > > > Please can you refactor things so we don't have all the duplication? I > > suspect this won't be the last device which needs the same treatement. > > Should the refactoring just accommodate SPE, and TRBE or make it more generic to > accommodate future devices as well. Something like the following enumeration. > > enum arm_platform_device { > ARM_PLATFORM_DEVICE_SPE, > ARM_PLATFORM_DEVICE_TRBE, > ARM_PLATFORM_DEVICE_MAX, > }; > > But that would require adding some helper functions to select these following > elements based on the above enumeration via a common function > > - gicc->XXX_interrupt > - ACPI_MADT_GICC_SPE/TRBE for header length comparison > - static struct platform_device/resources (static objects in the file) > > Seems like will add much more code for a refactor. Did you have something else > in mind for the refactor. All I'm saying is that we shouldn't have identical copies of the code to walk the MADT, pull out the irqs and register the device. So something like the totally untested hack below. I probably broke something, but hopefully you see what I mean. Will --->8 diff --git a/drivers/perf/arm_pmu_acpi.c b/drivers/perf/arm_pmu_acpi.c index 90815ad762eb..7f1cf36c6e69 100644 --- a/drivers/perf/arm_pmu_acpi.c +++ b/drivers/perf/arm_pmu_acpi.c @@ -69,6 +69,62 @@ static void arm_pmu_acpi_unregister_irq(int cpu) acpi_unregister_gsi(gsi); } +static int +arm_acpi_register_pmu_device(struct platform_device *pdev, u8 len, + u16 (*parse_gsi)(struct acpi_madt_generic_interrupt *)) +{ + int cpu, hetid, irq, ret; + bool matched = false; + u16 gsi = 0; + + if (pdev->num_resources != 1) + return -ENXIO; + + if (pdev->resource[0].flags != IORESOURCE_IRQ) + return -ENXIO; + + /* + * Sanity check all the GICC tables for the same interrupt number. + * For now, we only support homogeneous ACPI machines. + */ + for_each_possible_cpu(cpu) { + struct acpi_madt_generic_interrupt *gicc; + u16 this_gsi; + + gicc = acpi_cpu_get_madt_gicc(cpu); + if (gicc->header.length < len) + return matched ? -ENXIO : 0; + + this_gsi = parse_gsi(gicc); + if (!matched) { + hetid = find_acpi_cpu_topology_hetero_id(cpu); + gsi = this_gsi; + matched = true; + } else if (hetid != find_acpi_cpu_topology_hetero_id(cpu) || + gsi != this_gsi) { + pr_warn("ACPI: %s: must be homogeneous\n", pdev->name); + return -ENXIO; + } + } + + irq = acpi_register_gsi(NULL, gsi, ACPI_LEVEL_SENSITIVE, + ACPI_ACTIVE_HIGH); + if (irq < 0) { + pr_warn("ACPI: %s Unable to register interrupt: %d\n", + pdev->name, gsi); + return -ENXIO; + } + + pdev->resource[0].start = irq; + ret = platform_device_register(pdev); + if (ret < 0) { + pr_warn("ACPI: %s: Unable to register device\n", pdev->name); + acpi_unregister_gsi(gsi); + } + + return ret; +} + #if IS_ENABLED(CONFIG_ARM_SPE_PMU) static struct resource spe_resources[] = { { @@ -89,49 +145,18 @@ static struct platform_device spe_dev = { * and create a SPE device if we detect a recent MADT with * a homogeneous PPI mapping. */ +static u16 arm_spe_parse_gsi(struct acpi_madt_generic_interrupt *gicc) +{ + return gicc->spe_interrupt; +} + static void arm_spe_acpi_register_device(void) { - int cpu, hetid, irq, ret; - bool first = true; - u16 gsi = 0; + int err = arm_acpi_register_pmu_device(&spe_dev, ACPI_MADT_GICC_SPE, + arm_spe_parse_gsi); - /* - * Sanity check all the GICC tables for the same interrupt number. - * For now, we only support homogeneous ACPI/SPE machines. - */ - for_each_possible_cpu(cpu) { - struct acpi_madt_generic_interrupt *gicc; - - gicc = acpi_cpu_get_madt_gicc(cpu); - if (gicc->header.length < ACPI_MADT_GICC_SPE) - return; - - if (first) { - gsi = gicc->spe_interrupt; - if (!gsi) - return; - hetid = find_acpi_cpu_topology_hetero_id(cpu); - first = false; - } else if ((gsi != gicc->spe_interrupt) || - (hetid != find_acpi_cpu_topology_hetero_id(cpu))) { - pr_warn("ACPI: SPE must be homogeneous\n"); - return; - } - } - - irq = acpi_register_gsi(NULL, gsi, ACPI_LEVEL_SENSITIVE, - ACPI_ACTIVE_HIGH); - if (irq < 0) { - pr_warn("ACPI: SPE Unable to register interrupt: %d\n", gsi); - return; - } - - spe_resources[0].start = irq; - ret = platform_device_register(&spe_dev); - if (ret < 0) { - pr_warn("ACPI: SPE: Unable to register device\n"); - acpi_unregister_gsi(gsi); - } + if (err) + pr_warn("ACPI: Failed to register SPE device\n"); } #else static inline void arm_spe_acpi_register_device(void)