Received: by 2002:a05:7412:8d10:b0:f3:1519:9f41 with SMTP id bj16csp1985803rdb; Thu, 7 Dec 2023 14:52:34 -0800 (PST) X-Google-Smtp-Source: AGHT+IEqXZM9hfG6X0zXFlR2A4ThTBOgmfUEHiwpXlnQ4MEih47riZsk0nAuVbY72Udt45stY5jj X-Received: by 2002:a05:6a20:7484:b0:18f:97c:615d with SMTP id p4-20020a056a20748400b0018f097c615dmr4118156pzd.90.1701989554452; Thu, 07 Dec 2023 14:52:34 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1701989554; cv=none; d=google.com; s=arc-20160816; b=klFCc9865pryT1V6pkQ9Xh8tow38+/A5MBsERecTebKd5PZ4H3xhu7V9hlVty5C646 UrtSayliGfI1PZSGnu0TbjIN+bse1dw6Bz28IN26kIcW5lJ0Gim8ENwbB+dHWRkTHBQH 4dEDyfKb+UUpY0vhtI/2YO4+mERp9OAp0jhhBndwHX9lOTqPRH+bQRjCTBEct4bJ7xlb iBwW7Amz8J2+HlaMuMODR18/3/ZXbeBh6bYzSVsl7Ym+sqzmNaxm9MF2gB3s1DKXDRzo d8Wl5jeOpwdAAatqVtjyG/OT6IZFo35CMJVdkwOMyzNiJn4z+SnOuBA6CdD362OSjXQW /GUg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:cc:to:subject :message-id:date:from:in-reply-to:references:mime-version :dkim-signature; bh=HfcvtwbGlEyrF2irEqHOC217HyVfK+T1wkNJM3EpkJ0=; fh=dKD0V+qARsvbtedAJivV5fCwUL1NkvPJzUfFW07lA2k=; b=aRK6nPUZpjsbvSS91lu4t+kxoLUJUqEeGxGSv6O7CP5ksX/JK+tuvbb9cXbmHtxj1Q jyNM6a6u9ACJYBVPprDiK0k7ldHC8wGJ2Gkhn3VavWlA3eXGGas+8BvZP+LpREAPnE8w u6ZU66Mgmx+edM+Gbm+tRSLWBSOMpVcDJQQfvn1Nowfoog0raOnjRoLqyvMhFP5VRkyI m9Ad0QzXOUqLi8fCi9f6ikzu9v7xyd0HJpX1vQAcmgSsdpx1hvH1zH1ebHM18OF0oGrR Ss44/z7hn9MZTDvsThv3GyuaFSOqBKZOlOamKgN+U3aY20y9DhnOFfWJutE30s96SM7r nbnw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=NnOmXd6J; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.34 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 howler.vger.email (howler.vger.email. [23.128.96.34]) by mx.google.com with ESMTPS id b1-20020a056a00114100b006ce702e8930si413259pfm.215.2023.12.07.14.52.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 Dec 2023 14:52:34 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.34 as permitted sender) client-ip=23.128.96.34; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=NnOmXd6J; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.34 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by howler.vger.email (Postfix) with ESMTP id D9E36852682E; Thu, 7 Dec 2023 14:52:26 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at howler.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231461AbjLGWwK (ORCPT + 99 others); Thu, 7 Dec 2023 17:52:10 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50612 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229634AbjLGWwI (ORCPT ); Thu, 7 Dec 2023 17:52:08 -0500 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3D8A1170C for ; Thu, 7 Dec 2023 14:52:11 -0800 (PST) Received: by smtp.kernel.org (Postfix) with ESMTPSA id C4100C433C8; Thu, 7 Dec 2023 22:52:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1701989530; bh=HGADqaQgJ+Ygr3T4IO/0dGsxAN2q2tX+T8CN+umeUWA=; h=References:In-Reply-To:From:Date:Subject:To:Cc:From; b=NnOmXd6J55uZV5c/Q8lnyXY+WrZAYHCXvvLCSD+sb+IJe/FyfuWaSQDmufnULAsj6 uSvIfYlALZYlwCM1kPyEqu5Uhzsmmbbqz72UVCXOlcvJzNAm/uL5p9D5k+zrFUuCOd rb0UrsAY34/ZjP2vcOgpuSjO1MRBnfOhafqvwFJ14eku0I/Y9OikWfJ4E8DrOz0VOy t89C3KQvK2mSNYedx2kGc/bcvRKrH58r/LVHJlLcDDnW04c0j8Cg/PmsVdijlWPRdy 2gAtdSkokCW/87z/lKlwFsw7TcNWbYOpv7r91uVpOIpv3yp1Mga84VN/BuTRHzk3KX Ld0V0ouH62qnA== Received: by mail-lf1-f53.google.com with SMTP id 2adb3069b0e04-50be10acaf9so1323969e87.1; Thu, 07 Dec 2023 14:52:10 -0800 (PST) X-Gm-Message-State: AOJu0YwkHmgcheK8oe/pXEnn4UA5N1+Ih3wA3bSJTD+FjNO7qbLbB1Bt 0XZfvbQfJMlbxKTqO/ZFzQh6boJCPBn+W5WF/w== X-Received: by 2002:a19:8c5d:0:b0:50b:e73c:b574 with SMTP id i29-20020a198c5d000000b0050be73cb574mr3136537lfj.32.1701989528934; Thu, 07 Dec 2023 14:52:08 -0800 (PST) MIME-Version: 1.0 References: <20231130165700.685764-1-herve.codina@bootlin.com> <20231204134335.3ded3d46@bootlin.com> <20231204163014.4da383f2@bootlin.com> <20231205090452.7c601eb5@bootlin.com> In-Reply-To: <20231205090452.7c601eb5@bootlin.com> From: Rob Herring Date: Thu, 7 Dec 2023 16:51:56 -0600 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH v2 0/2] Attach DT nodes to existing PCI devices To: Herve Codina Cc: Greg Kroah-Hartman , "Rafael J. Wysocki" , Bjorn Helgaas , Lizhi Hou , Max Zhen , Sonal Santan , Stefano Stabellini , Jonathan Cameron , "linux-kernel@vger.kernel.org" , PCI , Allan Nielsen , Horatiu Vultur , Steen Hegelund , Thomas Petazzoni Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-1.2 required=5.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on howler.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (howler.vger.email [0.0.0.0]); Thu, 07 Dec 2023 14:52:27 -0800 (PST) On Tue, Dec 5, 2023 at 2:05=E2=80=AFAM Herve Codina wrote: > > On Mon, 4 Dec 2023 17:03:21 -0600 > Rob Herring wrote: > > > On Mon, Dec 4, 2023 at 9:30=E2=80=AFAM Herve Codina wrote: > > > > > > Hi Rob, > > > > > > On Mon, 4 Dec 2023 07:59:09 -0600 > > > Rob Herring wrote: > > > > > > [...] > > > > > > > > > diff --git a/drivers/pci/bus.c b/drivers/pci/bus.c > > > > > > index 9c2137dae429..46b252bbe500 100644 > > > > > > --- a/drivers/pci/bus.c > > > > > > +++ b/drivers/pci/bus.c > > > > > > @@ -342,8 +342,6 @@ void pci_bus_add_device(struct pci_dev *dev= ) > > > > > > */ > > > > > > pcibios_bus_add_device(dev); > > > > > > pci_fixup_device(pci_fixup_final, dev); > > > > > > - if (pci_is_bridge(dev)) > > > > > > - of_pci_make_dev_node(dev); > > > > > > pci_create_sysfs_dev_files(dev); > > > > > > pci_proc_attach_device(dev); > > > > > > pci_bridge_d3_update(dev); > > > > > > diff --git a/drivers/pci/of.c b/drivers/pci/of.c > > > > > > index 51e3dd0ea5ab..e15eaf0127fc 100644 > > > > > > --- a/drivers/pci/of.c > > > > > > +++ b/drivers/pci/of.c > > > > > > @@ -31,6 +31,8 @@ int pci_set_of_node(struct pci_dev *dev) > > > > > > return 0; > > > > > > > > > > > > node =3D of_pci_find_child_device(dev->bus->dev.of_node= , dev->devfn); > > > > > > + if (!node && pci_is_bridge(dev)) > > > > > > + of_pci_make_dev_node(dev); > > > > > > if (!node) > > > > > > return 0; > > > > > > > > > > Maybe it is too early. > > > > > of_pci_make_dev_node() creates a node and fills some properties b= ased on > > > > > some already set values available in the PCI device such as its s= truct resource > > > > > values. > > > > > We need to have some values set by the PCI infra in order to crea= te our DT node > > > > > with correct values. > > > > > > > > Indeed, that's probably the issue I'm having. In that case, > > > > DECLARE_PCI_FIXUP_HEADER should work. That's later, but still befor= e > > > > device_add(). > > > > > > > > I think modifying sysfs after device_add() is going to race with > > > > userspace. Userspace is notified of a new device, and then the of_n= ode > > > > link may or may not be there when it reads sysfs. Also, not sure if > > > > we'll need DT modaliases with PCI devices, but they won't work if t= he > > > > DT node is not set before device_add(). > > > > > > Ok, we can try using DECLARE_PCI_FIXUP_HEADER. > > > On your side, is moving from DECLARE_PCI_FIXUP_EARLY to DECLARE_PCI_F= IXUP_HEADER > > > fix your QEMU unittest ? > > > > No... I think the problem is we aren't setting the fwnode, just the of_node ptr, but I haven't had a chance to verify that. > > And testing the bridge part crashes. That's because there's a > > dependency on the bridge->subordinate to write out bus-range and > > interrupt-map. I think the fix there is we should just not write those > > properties. The bus range isn't needed because the kernel does its own > > assignments. For interrupt-map, it is only needed if "interrupts" is > > present in the child devices. If not present, then the standard PCI > > swizzling is used. Alternatively, I think the interrupt mapping could > > be simplified to just implement the standard swizzling at each level > > which isn't dependent on any of the devices on the bus. I gave that a > > go where each interrupt-map just points to the parent bridge, but ran > > into an issue that the bridge nodes don't have a phandle. That should > > be fixable, but I'd rather go with the first option. I suppose that > > depends on how the interrupts downstream of the PCI device need to get > > resolved. It could be that the PCI device serves as the interrupt > > controller and can resolve the parent interrupt on its own (which may > > be needed for ACPI host anyways). > > About interrupt, I am a bit stuck on my side. > My dtso (applied at PCI device level) contains the following: > fragment@0 { > target-path=3D""; > __overlay__ { > pci-ep-bus@0 { > compatible =3D "simple-bus"; > #address-cells =3D <1>; > #size-cells =3D <1>; > > /* > * map @0xe2000000 (32MB) to BAR0 (CPU) > * map @0xe0000000 (16MB) to BAR1 (AMBA) > */ > ranges =3D <0xe2000000 0x00 0x00 0x00 0x2= 000000 > 0xe0000000 0x01 0x00 0x00 0x100= 0000>; > > itc: itc { > compatible =3D "microchip,lan966x= -itc"; > #interrupt-cells =3D <1>; > interrupt-controller; > reg =3D <0xe00c0120 0x190>; > }; > > ... > }; > }; > }; > > I have a 'simple-bus' with a 'ranges' property to translate the BAR addre= sses > then several devices. Among them a interrupt controller (itc). Its parent > interrupt is the one used by the PCI device (INTA). > I cannot describe this parent interrupt in the dtso because to that I nee= d the > parent interrupt phandle which will be know only at runtime. But you don't. The logic to find the interrupt parent is walk up the parent nodes until you find 'interrupt-parent' or '#interrupt-controller' (and interrupt-map always has #interrupt-controller). So your overlay just needs 'interrupts =3D <1>' for INTA and it should all just work. That of course implies that we need interrupt properties in all the bridges which I was hoping to avoid. In the ACPI case, for DT interrupt parsing to work, we're going to need to end up in an 'interrupt-controller' node somewhere. I think the options are either we walk interrupt-map properties up to the host bridge which then points to something or the PCI device is the interrupt controller. I think the PCI device is the right place. How the downstream interrupts are routed to PCI interrupts are defined by the device. That would work the same way for both DT and ACPI. If you are concerned about implementing in each driver needing this, some library functions can mitigate that. I'm trying to play around with the IRQ domains and get this to work, but not having any luck yet. > Of course, I can modified the overlay applied to tweak the 'interrupt' an= d > 'interrupt-parent' in the itc node from my PCI device driver at runtime b= ut I > would like to avoid this kind of tweak in the PCI device driver. > This kind of tweak is overlay dependent and needs to be done by each PCI > device driver that need to work with interrupts. > > For BAR addresses translation, we use the 'ranges' property at the PCI de= vice > node to translate 0 0 0 to BAR0, 1 0 0 to BAR1, ... > What do you think about a new 'irq-ranges' property to translate the irq = number > and get the irq parent controller base. > > irq-ranges =3D ; Seems fragile as you have to know something about the parent (the # of cells), but you don't have the phandle. If you needed multiple entries, you couldn't parse this. Rob