Received: by 2002:a05:6a10:eb17:0:0:0:0 with SMTP id hx23csp552063pxb; Fri, 3 Sep 2021 08:02:06 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzHHQYtuNAaNetZJdjQHBfehJnpOvgRI5kdYF+wOapnB2QRRZMB+wIf/X9yJb3wqN4ZAEJH X-Received: by 2002:a05:6e02:13e1:: with SMTP id w1mr2944019ilj.116.1630681326720; Fri, 03 Sep 2021 08:02:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1630681326; cv=none; d=google.com; s=arc-20160816; b=O9esLNd6xY6SLBEoQqIFPVr5ry1t4o+fIKryUN/5l9121QOawthUk9gUOmzpCoTpRl ny7Pkl2KJPHH5nolmymd0NmRAj832JzkzgdEJEDa+XB3O/UPc5lHfE/pG2ZoTNBNaGtV S89Ho/ow4vx5j4KSdJ6rPmywt4PlioZt3SG8f46YSy5wFq4yWmBWTzCIjAYXZ30z13x1 KMgdFzt4Fa9dCZibmuPfltlTnBLqEwI20NSxIqi7ueftISHkfBxZqU8i3BVrxXy+LNpa 3vhp1SPD9u8DHPVqpFCd4D+vcIbv2r9aaW4794myJmecU3CtuozrEkVJsFI+zD34ASPK j5YQ== 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:dkim-signature; bh=y7oax2WjNGURd1GkomlqToeSiDl1RItan+FEw+ytogc=; b=bJI0NXc0M3F4Ac6rcHnevQryfItLOqXjI1x3KoMJhUlrV2ezCZVbO2onQydaojZxv2 xI9Qg/g7FCMsAy6dJs83mW/MgaO+kIiyWKG7SGiRhAh0Y2mdUBld5pKNfwjx61kQLzlU jbIOJEE8/2GdVSNj5p4jFysvXvDxbBdPSQ0cOYnQmO9wYFJ4mFBa/BOap7+ip4k0p500 lWX/t6qXxkrJid50bLceF0uq3b3h5idxCOrtEH2abkEH9/Z1s9/hHIeeBQk5cMsheZY1 AuLFfNcKSTDQ1S569ghF6kBrQWPr2RcGsPiK4JbAJW0mIHqzsuHMmubDbxcTult88ZuV oMCA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=Ey8NLLAg; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 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 vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id jg5si5555132ejc.106.2021.09.03.08.01.38; Fri, 03 Sep 2021 08:02:06 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=Ey8NLLAg; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 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 S1349534AbhICO7z (ORCPT + 99 others); Fri, 3 Sep 2021 10:59:55 -0400 Received: from mail.kernel.org ([198.145.29.99]:38448 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1349488AbhICO7y (ORCPT ); Fri, 3 Sep 2021 10:59:54 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id E1A2F61056; Fri, 3 Sep 2021 14:58:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1630681134; bh=z2uRNQz69xBL8uUWPBxwwZ7QJqE9ZEA/iXaX6H4y+UY=; h=References:In-Reply-To:From:Date:Subject:To:Cc:From; b=Ey8NLLAgfpVpIfyi4xTG+Djq62tDNLOGexgzdXvhhiRcK5YT0ztW/q+/siwO2XqJL 6TCrnYRQkI+UKO4Tiye+nVbvZqxEK+w/1PLgOjGnrIXGIVStncXwXbwJQByBsgslfl KUySJYdWC3sZn326zwGRoxsiYtbXjw7LTzKec2FuqAgFuEwPLzoq2DhBCyX4p6r0Be jvGKpQztMJ05XxiRL3Et5dHpkFfE+asdkTpbbR4r6ihJilV5UJxxjhm7MYem77x8hM atpj0JhJtk3GKnEgOafWJGRQaH3UmnWp3CjukZotywGGjb+TEi1knQbbAAV0ORswD3 ahrTrgT7VW+1w== Received: by mail-ej1-f47.google.com with SMTP id me10so12613175ejb.11; Fri, 03 Sep 2021 07:58:54 -0700 (PDT) X-Gm-Message-State: AOAM530Ev9qG9AxZLTpSM4t3uuF4y5JkPjarmaRRHo4les/UB66NGYuo shS+dp1LQ1sQHabMjm60QDIymsgMJMCPTZnanw== X-Received: by 2002:a17:906:7250:: with SMTP id n16mr4642476ejk.147.1630681133366; Fri, 03 Sep 2021 07:58:53 -0700 (PDT) MIME-Version: 1.0 References: <20210902025528.1017391-1-saravanak@google.com> <20210902025528.1017391-3-saravanak@google.com> In-Reply-To: From: Rob Herring Date: Fri, 3 Sep 2021 09:58:42 -0500 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH v1 2/2] of: platform: Mark bus devices nodes with FWNODE_FLAG_NEVER_PROBES To: Saravana Kannan Cc: Greg Kroah-Hartman , "Rafael J. Wysocki" , Frank Rowand , Len Brown , Ulf Hansson , Android Kernel Team , "linux-kernel@vger.kernel.org" , devicetree@vger.kernel.org, "open list:ACPI FOR ARM64 (ACPI/arm64)" Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Sep 2, 2021 at 8:16 PM Saravana Kannan wrote: > > On Thu, Sep 2, 2021 at 5:53 PM Rob Herring wrote: > > > > On Thu, Sep 2, 2021 at 2:29 PM Saravana Kannan wrote: > > > > > > On Thu, Sep 2, 2021 at 12:03 PM Rob Herring wrote: > > > > > > > > On Thu, Sep 2, 2021 at 11:57 AM Saravana Kannan wrote: > > > > > > > > > > On Thu, Sep 2, 2021 at 7:24 AM Rob Herring wrote: > > > > > > > > > > > > On Wed, Sep 1, 2021 at 9:55 PM Saravana Kannan wrote: > > > > > > > > > > > > > > We don't want fw_devlink creating device links for bus devices as > > > > > > > they'll never probe. So mark those device node with this flag. > > > > > > > > > > > > > > Signed-off-by: Saravana Kannan > > > > > > > --- > > > > > > > drivers/of/platform.c | 16 ++++++++++++++++ > > > > > > > 1 file changed, 16 insertions(+) > > > > > > > > > > > > > > diff --git a/drivers/of/platform.c b/drivers/of/platform.c > > > > > > > index 74afbb7a4f5e..42b3936d204a 100644 > > > > > > > --- a/drivers/of/platform.c > > > > > > > +++ b/drivers/of/platform.c > > > > > > > @@ -392,6 +392,22 @@ static int of_platform_bus_create(struct device_node *bus, > > > > > > > if (!dev || !of_match_node(matches, bus)) > > > > > > > return 0; > > > > > > > > > > > > > > + /* > > > > > > > + * If the bus node has only one compatible string value and it has > > > > > > > + * matched as a bus node, it's never going to get probed by a device > > > > > > > + * driver. So flag it as such so that fw_devlink knows not to create > > > > > > > + * device links with this device. > > > > > > > + * > > > > > > > + * This doesn't catch all devices that'll never probe, but this is good > > > > > > > + * enough for now. > > > > > > > + * > > > > > > > + * This doesn't really work for PPC because of how it uses > > > > > > > + * of_platform_bus_probe() to add normal devices. So ignore PPC cases. > > > > > > > + */ > > > > > > > + if (!IS_ENABLED(CONFIG_PPC) && > > > > > > > + of_property_count_strings(bus, "compatible") == 1) > > > > > > > + bus->fwnode.flags |= FWNODE_FLAG_NOT_DEVICE; > > > > > > > > > > > > This looks fragile relying on 1 compatible string, and the DT flags in > > > > > > this code have been fragile too. I'm pretty sure we have cases of > > > > > > simple-bus or simple-mfd that also have another compatible. > > > > > > > > > > > > Couldn't we solve this with a simple driver? > > > > > > > > > > Oh, I didn't think you'd like that. I'd lean towards that option too > > > > > if we can address some of the other concerns below. > > > > > > > > > > > Make 'simple-pm-bus' > > > > > > driver work for other cases? > > > > > > > > > > > BTW, this patch doesn't even work for > > > > > > simple-pm-bus. > > > > > > > > > > How do you mean? Because simple-pm-bus already has a driver and > > > > > doesn't set "matches" param when it calls of_platform_populate() and > > > > > this flag won't be set. So at least for simple-pm-bus I don't see any > > > > > issue. > > > > > > > > You're right. > > > > > > > > > I was trying to reuse of_default_bus_match_table without explicitly > > > > > referring to it, but if it's confusing I can add a separate list of > > > > > compatible strings and use those here instead of using "matches". > > > > > > > > What happens with a non-default table? I'm not sure we can assume the > > > > same behavior. > > > > > > > > > > A driver for simple-bus may cause issues if there's a > > > > > > more specific driver to bind to as we don't handle that. It's simply > > > > > > whichever matches first. > > > > > > > > > > Right, this is my worry. Especially for devices like this (there are > > > > > plenty of cases like this) which have a driver that probes them but > > > > > also lists simple-bus > > > > > https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/arm/boot/dts/arm-realview-pb11mp.dts?id=73f3af7b4611d77bdaea303fb639333eb28e37d7#n299 > > > > > > > > Uhh, that one is certainly a leakage of wanting an soc_device in the > > > > hierarchy, not any real bus structure reflecting the h/w. I'm not a > > > > fan of the soc_device stuff and its optional nature. Everything is an > > > > SoC, so it should always be there? Or your device hierarchy should > > > > change when you decide to add a soc_device? > > > > > > > > > So as long as there's a compatible string that's not one of the > > > > > "transparent" busses, this driver shouldn't match. So, I don't think I > > > > > can get away from checking the compatible strings. > > > > > > > > > > How about I check here to make sure all the "compatible" strings are > > > > > from an approved transparent bus list, and if it's true, I use > > > > > driver_override to force match it to a transparent bus driver? Would > > > > > you be okay with that? > > > > > > > > Can't we do that within a driver? We check this and fail probe if > > > > there's a more specific compatible. Then another driver can match and > > > > probe. > > > > > > I was thinking that initially, but if we fail a probe, the driver core > > > will permanently give up (won't search further) or might end up > > > retrying with the same driver and never get to the other driver. I'll > > > send out a v2 with what I described above. It's not too bad and it > > > will also allow us to handle the PPC cases (we'll just need to keep > > > adding the simple-bus equivalent entries to a table). > > > > I wasn't sure, but I traced the calls and it looks like based on > > __driver_attach() that if a driver fails probe another one matching > > should get to probe: > > __driver_attach() is called over every device already in a bus. It's > called only when a new driver is registered. So it makes sense that > one ignores the error returned from probe(). You don't want to fail > driver registration because one specific device needs to defer probe. The behavior should be the same no matter whether the device or driver is registered first. Deferred probe errors are handled differently AFAICT. > > The comment is actually from __device_attach_driver() > > > > > /* > > * Ignore errors returned by ->probe so that the next driver can try > > * its luck. > > */ > > I saw that comment too, but isn't the comment wrong/stale? I don't know... > > bus_probe_device() -> device_initial_probe() -> __device_attach(). > > In __device_attach() we have: > ret = bus_for_each_drv(dev->bus, NULL, &data, __device_attach_driver); > > If you look at bus_for_each_drv()'s comment: > * ...... If @fn returns anything but 0, we break out > * and return it. If @start is not NULL, we use it as the head > * of the list. > > Inside __device_attach_driver() we see: > /* > * Ignore errors returned by ->probe so that the next driver can try > * its luck. > */ > ret = driver_probe_device(drv, dev); > if (ret < 0) > return ret; > > So if probe() returned an error, we'd return it right back out. And > then bus_for_each_drv() will stop searching for more drivers that > match. With the exception of deferred probe, probe errors are made positive and then ignored. > So I don't think one driver can give up after a match and have another > driver give a device a shot. I think it just needs to be tried out... I would like the above to work because it at least partially solves the problem of multiple drivers matching. It only works if the fallback driver knows there's a better match though which is this case. If we don't know then a better match would have to unbind the first driver and bind to the better match. I'm not sure that could ever work generically. Rob