Received: by 2002:ac0:e350:0:0:0:0:0 with SMTP id g16csp320638imn; Thu, 4 Aug 2022 07:15:19 -0700 (PDT) X-Google-Smtp-Source: AA6agR6rPdOnI+c5Oh58uOWTrIYSVyAkHIs/aRYi6a357xWpT2BAIvm+syPOvGCEuos+/ePf9bt6 X-Received: by 2002:a17:907:a427:b0:72b:8cc5:5487 with SMTP id sg39-20020a170907a42700b0072b8cc55487mr1557201ejc.354.1659622519094; Thu, 04 Aug 2022 07:15:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1659622519; cv=none; d=google.com; s=arc-20160816; b=nk1jcBGtzrCHY3y3+f/xX3khhGbCA07RIpemLgcPnlEWZTDgjKAeqDTStrMt05ihZb 0MnEbJeYfmJMz7Y7QJWtOv8uudWrRYMdGMcOTLCEWqnmG3Y8zz+74r+8F0oVOLS/gKWG v+YIgc8fwwraYiaRi5JhGJCEGrGrJm24V0kCB4DVqt1seDYkXtfPrBRcwrXbXVcOlVOm 8i2BKsj8u3iyqg3XPPPoRGCojI4LyVJkQ1GsEhdAj6gHX/jlbxQUXSOjtNkB2/kNn1ht 2JR0h0WDJcQAOxdyqxpJDEmHdB9J34Ytq8Mv22MnFyWjIVo/6Li0tPHNDfI7E4/334R7 rJRQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version; bh=RVis2Ihdo+FWMtIacjJD8ErJe1tWhkWW6oIz8sN5Dhw=; b=ddGit5skBsRBSmE/aMIKYNOLwcUopDOtDe/FCbSVY5cPLWrpJRYIgZ+LcDbb1Wk7MP 1Yb4fD1INMs8QkDT0rNRYdynJxy+go/S+r0LYJMqeFiU6Rn0ft7fcxW03vEZg68SFEG1 rarP9EexejWO3B1LTn0Wzib+yYebqydD/LeXukCAM1elNySC75eLkvQx4b8lBc+wPR1K eL+AK2xXOwRb0G/LEyvD6lJd8lhRhVtIj1R1nWNsmgUOFTJOImVMkeDFQm9oJqYHSL7T RU4h/wd/LpDuSEHXEpTAtRB3a15m8EEnW0lS9AV0L9seUTPPTmYUtaN05Oj7UhuoI07s HVKg== ARC-Authentication-Results: i=1; mx.google.com; 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 ew15-20020a056402538f00b0043df391fcb0si1183235edb.586.2022.08.04.07.14.52; Thu, 04 Aug 2022 07:15:19 -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; 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 S239600AbiHDOLZ (ORCPT + 99 others); Thu, 4 Aug 2022 10:11:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34390 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233161AbiHDOLY (ORCPT ); Thu, 4 Aug 2022 10:11:24 -0400 Received: from mail-yw1-f179.google.com (mail-yw1-f179.google.com [209.85.128.179]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 526432AE11; Thu, 4 Aug 2022 07:11:22 -0700 (PDT) Received: by mail-yw1-f179.google.com with SMTP id 00721157ae682-328303afa6eso50769197b3.10; Thu, 04 Aug 2022 07:11:22 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc; bh=RVis2Ihdo+FWMtIacjJD8ErJe1tWhkWW6oIz8sN5Dhw=; b=4ODuFudNsVEzFa1yCZEL/ZBvyRxusE7J+5fp2SnDRIkO+nck+tVtIj6nlWxEdvfXGu XeMvJ9DTgFWVJGR25U+3Pu/zFDiViU9KrfexGJ563oA3GtgFSUQUi4Y+xCfnZSoKrEX/ AEBhlM3ZBWFpsjQQIeinCjEyRoj7jO1i++X23fohJNoBoWMk4FqNR5dyjIoS4Rqfsz9P FIdwJ3L7ykxehGZm2IXumAnxr4HtBEFXK40yOnaCK3jnYTqmOozX0kbbWyVssV7LWTbT zCbCbkjvHFu5WcGh0+rYcwYcZSSUZLx13BccCgGA62FWHQxiZm3+0zuOl6mDewvYfgVh essw== X-Gm-Message-State: ACgBeo2NNmKn6B0xI/Tb4g37llOFHTV60EgblSWmOJZI6g/kagxzLorE gDgnuwE5mvD6PQlut9xqfBxZY6OA78k2VuZlW9eK7FzhFrI= X-Received: by 2002:a0d:f647:0:b0:328:317c:9069 with SMTP id g68-20020a0df647000000b00328317c9069mr1799719ywf.301.1659622280838; Thu, 04 Aug 2022 07:11:20 -0700 (PDT) MIME-Version: 1.0 References: <5592689.DvuYhMxLoT@kreacher> <29f01ef7-03f7-817b-630b-52be72c83396@redhat.com> <85cd941e-c892-677b-1582-c294c7efe770@redhat.com> In-Reply-To: From: "Rafael J. Wysocki" Date: Thu, 4 Aug 2022 16:11:09 +0200 Message-ID: Subject: Re: [RFC][PATCH] ACPI: EC: Make evaluate acpi_ec_add() _REG for EC operation regions To: Hans de Goede Cc: "Rafael J. Wysocki" , Linux ACPI , LKML Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-1.4 required=5.0 tests=BAYES_00, FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS, RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_PASS autolearn=no 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 Thu, Aug 4, 2022 at 4:08 PM Rafael J. Wysocki wrote: > > On Thu, Aug 4, 2022 at 3:57 PM Hans de Goede wrote: > > > > Hi, > > > > On 8/4/22 15:51, Rafael J. Wysocki wrote: > > > Hi Hans, > > > > > > On Thu, Aug 4, 2022 at 1:57 PM Hans de Goede wrote: > > >> > > >> Hi Rafael, > > >> > > >> Sorry for the slow response... > > > > > > No sweat. > > > > > >> On 7/7/22 21:31, Rafael J. Wysocki wrote: > > >>> On Wed, Jul 6, 2022 at 10:26 PM Hans de Goede wrote: > > >>>> > > >>>> Hi, > > >>>> > > >>>> On 7/6/22 14:37, Rafael J. Wysocki wrote: > > >>>>> From: Rafael J. Wysocki > > >>>>> > > >>>>> acpi_ec_ecdt_probe() is called between acpi_load_tables() and > > >>>>> acpi_enable_subsystem(). It passes ACPI_ROOT_OBJECT as ec->handle > > >>>>> to acpi_ec_setup() and so ACPI_ROOT_OBJECT is passed to > > >>>>> acpi_install_address_space_handler() via ec_install_handlers(). > > >>>>> > > >>>>> Next, acpi_ns_validate_handle() converts it to acpi_gbl_root_node > > >>>>> which is passed to acpi_ev_install_space_handler() and the handler is > > >>>>> installed for acpi_gbl_root_node. > > >>>>> > > >>>>> Now, acpi_gbl_root_node is passed to acpi_ev_execute_reg_methods() which > > >>>>> evaluates _REG for any ACPI_ADR_SPACE_EC regions it can find in the > > >>>>> namespace which should not be necessary, because the OS is expected to > > >>>>> make the ECDT operation regions available before evaluating any AML, so > > >>>>> in particular AML is not expected to check the evaluation of _REG before > > >>>>> it accesses these operation regions (see ACPI 6.4, Section 6.5.4, > > >>>>> exception 2 [1]). Doing that is also problematic, because the _REG > > >>>>> methods for the ACPI_ADR_SPACE_EC regions may depend on various _INI, so > > >>>>> they should be be evaluated before running acpi_initialize_objects() [2]. > > >>>>> > > >>>>> Address this problem by modifying acpi_install_address_space_handler() > > >>>>> to avoid evaluating _REG for ACPI_ADR_SPACE_EC regions when the handler > > >>>>> is installed for acpi_gbl_root_node which indicates the ECDT case. > > >>>>> > > >>>>> However, this needs to be accompanied by an EC driver change to > > >>>>> actually trigger the evaluation of _REG for the ACPI_ADR_SPACE_EC > > >>>>> regions when it finds the EC object in the namespace. > > >>>>> > > >>>>> Link: https://uefi.org/specs/ACPI/6.4/06_Device_Configuration/Device_Configuration.html#reg-region # [1] > > >>>>> Link: https://github.com/acpica/acpica/pull/786 # [2] > > >>>>> Signed-off-by: Rafael J. Wysocki > > >>>>> --- > > >>>>> > > >>>>> Note: This change doesn't make any practical difference on any of the systems > > >>>>> in my office. > > >>>>> > > >>>>> --- > > >>>>> drivers/acpi/acpica/evxfregn.c | 12 ++++++++++++ > > >>>>> drivers/acpi/ec.c | 7 +++++++ > > >>>>> 2 files changed, 19 insertions(+) > > >>>>> > > >>>>> Index: linux-pm/drivers/acpi/ec.c > > >>>>> =================================================================== > > >>>>> --- linux-pm.orig/drivers/acpi/ec.c > > >>>>> +++ linux-pm/drivers/acpi/ec.c > > >>>>> @@ -1632,6 +1632,13 @@ static int acpi_ec_add(struct acpi_devic > > >>>>> acpi_handle_debug(ec->handle, "duplicated.\n"); > > >>>>> acpi_ec_free(ec); > > >>>>> ec = boot_ec; > > >>>>> + /* > > >>>>> + * Uninstall the EC address space handler and let > > >>>>> + * acpi_ec_setup() install it again along with > > >>>>> + * evaluating _REG methogs associated with > > >>>>> + * ACPI_ADR_SPACE_EC operation regions. > > >>>>> + */ > > >>>>> + ec_remove_handlers(ec); > > >>>> > > >>>> This will call the _REG method to get called with ACPI_REG_DISCONNECT (0) > > >>>> as second argument which may lead to unexpected consequences so I'm not > > >>>> in favor of doing things this way. > > >>>> > > >>>> IMHO it would be much better to instead have flags; or if flags are > > >>>> disliked a separate function to only call _REG later on. > > >>> > > >>> I'm aware of the _REG(EC, 0) part, but I thought that it might be the > > >>> right thing to do. > > >>> > > >>> First off, I'm a bit concerned about leaving the EC address space > > >>> handler attached to the root node after we have discovered the proper > > >>> EC object in the namespace, because that's inconsistent with the "no > > >>> ECDT" case. > > >> > > >> True, but in the ECDT case the EC opregion should work anywhere > > >> according to the spec, so I believe it is consistent with the spec. > > > > > > That's until the proper EC object is discovered, though. > > > > > >>> It leaves a potential problem on the table too, because acpi_ec_add() > > >>> changes boot_ec->handle from ACPI_ROOT_OBJECT to ec->handle and if > > >>> ec_remove_handlers() is called for it after that, it will fail to > > >>> remove the handler, but it will clear the > > >>> EC_FLAGS_EC_HANDLER_INSTALLED flag (so the change above is actually > > >>> incorrect, because it should remove the handler before changing > > >>> boot_ec->handle). > > >> > > >> You are right, but this can be fixed by keeping track of the handle > > >> used when registering the handler, e.g. something like this: > > >> > > >> From fceb436703bc8f0e29b7613246a83c039b631cb4 Mon Sep 17 00:00:00 2001 > > >> From: Hans de Goede > > >> Date: Thu, 4 Aug 2022 13:38:35 +0200 > > >> Subject: [PATCH] ACPI: EC: Fix EC address space handler unregistration > > >> > > >> When an ECDT table is present the EC address space handler gets registered > > >> on the root node. So to unregister it properly the unregister call also > > >> must be done on the root node. > > >> > > >> Store the ACPI handle used for the acpi_install_address_space_handler() > > >> call and use te same handle for the acpi_remove_address_space_handler() > > >> call. > > >> > > >> Reported-by: Rafael J. Wysocki > > >> Signed-off-by: Hans de Goede > > >> --- > > >> drivers/acpi/ec.c | 4 +++- > > >> drivers/acpi/internal.h | 1 + > > >> 2 files changed, 4 insertions(+), 1 deletion(-) > > >> > > >> diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c > > >> index 1e93677e4b82..6aa8210501d3 100644 > > >> --- a/drivers/acpi/ec.c > > >> +++ b/drivers/acpi/ec.c > > >> @@ -1483,6 +1483,7 @@ static int ec_install_handlers(struct acpi_ec *ec, struct acpi_device *device, > > >> return -ENODEV; > > >> } > > >> set_bit(EC_FLAGS_EC_HANDLER_INSTALLED, &ec->flags); > > >> + ec->address_space_handler_handle = ec->handle; > > >> } > > >> > > >> if (call_reg && !test_bit(EC_FLAGS_EC_REG_CALLED, &ec->flags)) { > > >> @@ -1543,7 +1544,8 @@ static int ec_install_handlers(struct acpi_ec *ec, struct acpi_device *device, > > >> static void ec_remove_handlers(struct acpi_ec *ec) > > >> { > > >> if (test_bit(EC_FLAGS_EC_HANDLER_INSTALLED, &ec->flags)) { > > >> - if (ACPI_FAILURE(acpi_remove_address_space_handler(ec->handle, > > >> + if (ACPI_FAILURE(acpi_remove_address_space_handler( > > >> + ec->address_space_handler_handle, > > >> ACPI_ADR_SPACE_EC, &acpi_ec_space_handler))) > > >> pr_err("failed to remove space handler\n"); > > >> clear_bit(EC_FLAGS_EC_HANDLER_INSTALLED, &ec->flags); > > >> diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h > > >> index 628bf8f18130..140af11d0c39 100644 > > >> --- a/drivers/acpi/internal.h > > >> +++ b/drivers/acpi/internal.h > > >> @@ -173,6 +173,7 @@ enum acpi_ec_event_state { > > >> > > >> struct acpi_ec { > > >> acpi_handle handle; > > >> + acpi_handle address_space_handler_handle; > > >> int gpe; > > >> int irq; > > >> unsigned long command_addr; > > >> -- > > > > > > This works. > > > > > > I would rename address_space_handler_handle to something like > > > address_space_handler_holder. > > > > Ok, I'll rename this for the official upstream submission. > > > > >> This fixes ec_remove_handlers() without requiring (IMHO) risky changes > > >> where we call _REG() multiple times. > > >> > > >> Also note that ec_remove_handlers() is only ever called from > > >> acpi_ec_driver.remove which in practice never runs since the EC never > > >> gets hot unplugged (arguably the entire remove code could be removed). > > > > > > Indeed. > > > > > >>> But in order to move the EC address space handler under the EC object, > > >>> it needs to be uninstalled and for this purpose AML needs to be told > > >>> that it's not there, so evaluating _REG(EC, 0) seems reasonable to me > > >>> even though I agree that it is somewhat risky. > > >> > > >> I'm pretty worried that calling _REG(EC, 0) will cause problems > > >> the _REG handlers run pretty early on and various BIOS/ACPI table > > >> authors seem to (ab)use this to do some sort of early setup > > >> of some things in _REG, That is pretty much how this whole thread > > >> has started. Given all the weirdness some ACPI tables do in their > > >> _REG handling running _REG 3 times: > > >> > > >> 1. _REG(EC, 1) > > >> 2. _REG(EC, 0) > > >> 3. _REG(EC, 1) > > >> > > >> really seems like a bad idea to me. I have the feeling that this is > > >> asking for trouble. > > > > > > OK, fair enough. > > > > > >>> Second, the spec is kind of suggesting doing it (cf. the "These > > >>> operation regions may become inaccessible after OSPM runs > > >>> _REG(EmbeddedControl, 0)" comment in the _REG definition section). > > >> > > >> That is boilerplate documentation copy and pasted from all the > > >> other address space handlers the spec defines. I'm not sure if > > >> Windows ever actually calls _REG(EmbeddedControl, 0) and I would > > >> not be surprised if Windows does not do this. > > >> > > >>> Moreover, I don't quite like the ACPI_NO_INSTALL_SPACE_HANDLER flag, > > >>> because it causes the "handler installation" to actually do something > > >>> else. > > >> > > >> As mentioned before (IIRC) I would be more then happy to respin both > > >> the ACPICA as well as the Linux ACPI bits to introduce / use 2 new > > >> functions for this, lets say: > > >> > > >> 1. acpi_install_address_space_handler_no__reg() > > > > > > So we need this in ACPICA, because it doesn't make sense to drop and > > > re-acquire the namespace mutex around _REG evaluation in the non-EC > > > case. > > > > Right, just like the flags changes in this RFC getting this fixed > > will require some work on the ACPICA side + then Linux changes > > using the new ACPICA functions. > > > > > But as stated before I would prefer to introduce an > > > acpi_install_address_space_handler_internal() taking an additional > > > BOOL run__reg argument and I would define > > > acpi_install_address_space_handler() and the new > > > acpi_install_address_space_handler_no__reg() as wrappers around it. > > > > Right, that is how it will look like inside ACPICA, but API consumers > > will just see a new acpi_install_address_space_handler_no__reg() > > getting introduced. > > Well, one more thing about it. > > This would be a very generic interface with a very specific use case. > Moreover, the use case in question is already detectable in > acpi_install_address_space_handler(). > > Namely, the _REG evaluation can be skipped automatically if an > ACPI_ADR_SPACE_EC handler is installed at the root of the ACPI > namespace (because it doesn't even make sense to evaluate _REG then). > If this is done, we don't need the extra argument. More specifically, bail out of acpi_ev_execute_reg_methods() early if the space ID is ACPI_ADR_SPACE_EC and node is the namespace root, in which case the EC address space can be regarded as a "must always be accessible" one. > Hmm? > > > > > > >> 2. acpi_run_address_space_handler__reg() > > > > > > So this would just be a wrapper around acpi_ev_execute_reg_methods() > > > that would acquire the namespace mutex around it, right? [I think > > > that it should also acquire acpi_gbl_namespace_rw_lock along the lines > > > of acpi_walk_namespace(), though.] > > > > Ack. > > > > > I would call it acpi_execute_reg_methods() then. > > > > acpi_execute_reg_methods() works for me. > > > > I'll try to prepare a new ACPICA pull-req with the discussed > > changes + a Linux series on top sometime the coming few weeks. > > > > Regards, > > > > Hans > >