Received: by 10.192.165.156 with SMTP id m28csp1944879imm; Thu, 12 Apr 2018 06:16:19 -0700 (PDT) X-Google-Smtp-Source: AIpwx48EfN31rfJhlQUDPZAokp7HDlPUYsTeww4DpUkT6wbqWBklFQMFKD7aN00NTZUf4em5ezYY X-Received: by 10.99.109.142 with SMTP id i136mr695052pgc.306.1523538979686; Thu, 12 Apr 2018 06:16:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1523538979; cv=none; d=google.com; s=arc-20160816; b=VVnGM21mIIqdqc6L4sOj3BsDtf7dPpwR2WfRUM8Z5G9d0/mIrAVId1bCR7aKArNlAm EptHr3U0SnDlFiMVbxS3ooeOMrOqS3hmpq8uFwvFH3ZsJyKVa2TKcULXJOYhhg6s0Pyl UnjN6fTI9radX1Aoq4ykkhsEj5UFFGY2h6oX5xTd/UvoDzSjsPNSqJFScY2Gd2Y3+C4/ N3hcL/FIN05JM8BaSUUh6RhiLI/knmNZD54R7M+6RW9gCsL3TZa1Nzm3wksoEord3wTE j0XhhI3gvHZt9ermfQoZeRRzYlwptQYZzSqkViLdgmh5ljwWaOdKChqmb/0Kq047LGUG qrsA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :references:in-reply-to:mime-version:dkim-signature :arc-authentication-results; bh=ZwcNWMLXKaKFqaSYUTx98xEYu56hYtodzDAWf5fjmCk=; b=bvr+L9ZiCoLM/kKYWS6qZahoJb57kbHDvhqbQV5n5a2uRSdzey/cP96fNgibuRRvRM ja5xuREPqYsIGlCKcc3BRNXnhtfd+1+tEXQioYfzxOmNbzpBjn/tVkcQOJxaz1qJGn9v 2WwXb9hiad6uBpt4cVOJ9W/BeU/S9yL5N/Zd50/XCOf/Wn/gMSrt+3JsmWdK+AlbnZY/ 6y1XbbJrTM9rPayT/3EtL8R+4beNq8ueTFGvHLmg6PQQAqDCEsNO0TwaqC6bhQQxyRz/ APpcHWyKtQEC88b+TyVC5j6M2sseg28UXRxKeFPynIoVTEhJ3BDSc6bsDPEMNzXZzN/P mk4g== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@gmail.com header.s=20161025 header.b=j4NxeK9U; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id c7-v6si3202879plo.597.2018.04.12.06.15.42; Thu, 12 Apr 2018 06:16:19 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=fail header.i=@gmail.com header.s=20161025 header.b=j4NxeK9U; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752935AbeDLNMm (ORCPT + 99 others); Thu, 12 Apr 2018 09:12:42 -0400 Received: from mail-qt0-f193.google.com ([209.85.216.193]:38439 "EHLO mail-qt0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751832AbeDLNMk (ORCPT ); Thu, 12 Apr 2018 09:12:40 -0400 Received: by mail-qt0-f193.google.com with SMTP id z23so6079849qti.5; Thu, 12 Apr 2018 06:12:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:sender:in-reply-to:references:from:date:message-id :subject:to:cc; bh=ZwcNWMLXKaKFqaSYUTx98xEYu56hYtodzDAWf5fjmCk=; b=j4NxeK9UZl/vPNZn2vsXQlxlLh3MvzTpI8kiHfvKX+fXYmubGPFHK2wbgMoFEzbUA4 mBg8hhE4JMEWZXgTtyoYZMe/uLFf5dmZQIMBL0nnghRSw/qWSDkfrf2Izbsr4es7gOgy +5VMHRQTkEXf8YRL5nxKeN8l4CG0dvS3C+LYt/hVO/H58pEnMs7h2+E24ScpMuQ4i+/4 xntgrj421ekUQloTvXyWA/cK03SD4q6k/WYWESjnFhwt+t+kPu0BrLHmGcvMmuvFLGwz hjuf3ZGOsvbRapGcbpLzoMAMZwiqBQmKBrujye4YDZM7iCxS6b43kM/7JakP/VhW1+QJ zYOA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:sender:in-reply-to:references:from :date:message-id:subject:to:cc; bh=ZwcNWMLXKaKFqaSYUTx98xEYu56hYtodzDAWf5fjmCk=; b=uZ0aFgJVa6rdKipUmHBy/6WVVyOCnHUIGp/l2DxLkgWgJwUMMCwB/Nb6W6gZVyx1NS gqpBZ0rf4PvBfb9c1l+vJTsgu3jsxpury7E1YmFBNUVpzodXuQ/rL/WRsuRx7zKb8gsm GFJLy6xvRx+2SUIMLbPRiqHZXB2fhx0Qpm6UiMM9sreUU127pdDQ1r5vQaa5JENaHy5c OPY37cv5bbz5+2vfiaBYJK7dhHDSozoe/r6n79L2DmAyy0cBsyA76DiafEJ+tEwcdKwQ sm0S3gdochvBmwjlxZsaNBobF3vawqgMQPyVlh2zZUZLS/cFRmxsQX4otQ6M+WLdol8z 9kGA== X-Gm-Message-State: ALQs6tBIimVsc1pzUB44k45Cc3a2VLBVtR3M5JOXP1DdiWeIhEdgho+Y VVX3A3CyiU1Az/tY25shP6UjW628nKQaL0mmpMg= X-Received: by 10.237.43.130 with SMTP id e2mr1142437qtd.272.1523538759218; Thu, 12 Apr 2018 06:12:39 -0700 (PDT) MIME-Version: 1.0 Received: by 10.200.23.67 with HTTP; Thu, 12 Apr 2018 06:12:38 -0700 (PDT) In-Reply-To: References: <1523438149-16433-1-git-send-email-geert+renesas@glider.be> <1523438149-16433-4-git-send-email-geert+renesas@glider.be> <2e09425d-0f27-3069-3421-e454ee70e3b2@redhat.com> From: Geert Uytterhoeven Date: Thu, 12 Apr 2018 15:12:38 +0200 X-Google-Sender-Auth: LhI8gTR9DiRt0d5Q5W1cqYZHN_Y Message-ID: Subject: Re: [PATCH v3 2/2] vfio: platform: Add generic DT reset support To: Sinan Kaya Cc: Auger Eric , Geert Uytterhoeven , Baptiste Reynal , Alex Williamson , Philipp Zabel , Rob Herring , Mark Rutland , KVM list , "open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS" , Linux-Renesas , Linux Kernel Mailing List Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Sinan, On Thu, Apr 12, 2018 at 2:36 PM, Sinan Kaya wrote: > On 4/12/2018 7:49 AM, Auger Eric wrote: >> On 12/04/18 13:32, Geert Uytterhoeven wrote: >>> On Thu, Apr 12, 2018 at 12:31 PM, Auger Eric wrote: >>>> On 11/04/18 11:15, Geert Uytterhoeven wrote: >>>>> Vfio-platform requires reset support, provided either by ACPI, or, on DT >>>>> platforms, by a device-specific reset driver matching against the >>>>> device's compatible value. >>>>> >>>>> On many SoCs, devices are connected to an SoC-internal reset controller. >>>>> If the reset hierarchy is described in DT using "resets" properties, >>>>> such devices can be reset in a generic way through the reset controller >>>>> subsystem. Hence add support for this, avoiding the need to write >>>>> device-specific reset drivers for each single device on affected SoCs. >>>>> >>>>> Devices that do require a more complex reset procedure can still provide >>>>> a device-specific reset driver, as that takes precedence. >>>>> >>>>> Note that this functionality depends on CONFIG_RESET_CONTROLLER=y, and >>>>> becomes a no-op (as in: "No reset function found for device") if reset >>>>> controller support is disabled. >>>>> >>>>> Signed-off-by: Geert Uytterhoeven >>>>> Reviewed-by: Philipp Zabel >>> >>>>> --- a/drivers/vfio/platform/vfio_platform_common.c >>>>> +++ b/drivers/vfio/platform/vfio_platform_common.c >>> >>>>> @@ -127,8 +130,16 @@ static int vfio_platform_get_reset(struct vfio_platform_device *vdev) >>>>> vdev->of_reset = vfio_platform_lookup_reset(vdev->compat, >>>>> &vdev->reset_module); >>>>> } >>>>> + if (vdev->of_reset) >>>>> + return 0; >>>>> + >>>>> + rstc = of_reset_control_get_exclusive(vdev->device->of_node, NULL); >>>> >>>> Shouldn't we prefer the top level reset_control_get_exclusive()? >>> >>> I guess that should work, too. >>> >>>> To make sure about the exclusive/shared terminology, does >>>> get_reset_control_get_exclusive() check we have an exclusive wire >>>> between this device and the reset controller? >>> >>> AFAIU, the "exclusive" means that only a single user can obtain access to >>> the reset, and it does not guarantee that we have an exclusive wire between >>> the device and the reset controller. >>> >>> The latter depends on the SoC's reset topology. If a reset wire is shared >>> by multiple devices (e.g. resets shared by PWM or Display Unit devices on >>> R-Car SoCs), exporting a subset of these devices to a guest is a bad idea, >>> indeed. >> >> So who's going to check this assigned device will not trigger a reset of >> other non assigned devices sharing the same reset controller? > > I like the direction in general. I was hoping that you'd call it of_reset_control > rather than reset_control. You mean vfio_platform_device.of_reset_control? If we switch to reset_control_get_exclusive(), that doesn't make much sense... > Is there anything in the OF spec about what to expect from DT's reset? Documentation/devicetree/bindings/reset/reset.txt says: "A word on where to place reset signal consumers in device tree: It is possible in hardware for a reset signal to affect multiple logically separate HW blocks at once. In this case, it would be unwise to represent this reset signal in the DT node of each affected HW block, since if activated, an unrelated block may be reset. Instead, reset signals should be represented in the DT node where it makes most sense to control it; this may be a bus node if all children of the bus are affected by the reset signal, or an individual HW block node for dedicated reset signals. The intent of this binding is to give appropriate software access to the reset signals in order to manage the HW, rather than to slavishly enumerate the reset signal that affects each HW block." So according to the bindings, a specific reset should apply to a single device only. A quick check shows there are several violators: $ for i in $(git grep -lw resets -- "*dts*"); do grep -w resets $i | sort | uniq -c | sed -e "s@^@$i:@g"; done | grep -v ": 1 " arch/arm/boot/dts/aspeed-g4.dtsi: 14 resets = <&syscon ASPEED_RESET_I2C>; arch/arm/boot/dts/aspeed-g5.dtsi: 14 resets = <&syscon ASPEED_RESET_I2C>; arch/arm/boot/dts/atlas7.dtsi: 2 resets = <&car 29>; arch/arm/boot/dts/gemini.dtsi: 2 resets = <&syscon GEMINI_RESET_IDE>; arch/arm/boot/dts/meson8.dtsi: 2 resets = <&reset RESET_USB_OTG>; arch/arm/boot/dts/meson8b.dtsi: 2 resets = <&reset RESET_USB_OTG>; arch/arm/boot/dts/r8a7743.dtsi: 7 resets = <&cpg 523>; arch/arm/boot/dts/r8a7743.dtsi: 2 resets = <&cpg 703>; arch/arm/boot/dts/r8a7743.dtsi: 2 resets = <&cpg 704>; arch/arm/boot/dts/r8a7745.dtsi: 7 resets = <&cpg 523>; arch/arm/boot/dts/r8a7745.dtsi: 2 resets = <&cpg 703>; arch/arm/boot/dts/r8a7745.dtsi: 2 resets = <&cpg 704>; arch/arm/boot/dts/r8a7790.dtsi: 3 resets = <&cpg 703>; arch/arm/boot/dts/r8a7790.dtsi: 2 resets = <&cpg 704>; arch/arm/boot/dts/r8a7791.dtsi: 2 resets = <&cpg 703>; arch/arm/boot/dts/r8a7791.dtsi: 2 resets = <&cpg 704>; arch/arm/boot/dts/r8a7794.dtsi: 2 resets = <&cpg 703>; arch/arm/boot/dts/r8a7794.dtsi: 2 resets = <&cpg 704>; arch/arm/boot/dts/stih410.dtsi: 2 resets = <&powerdown STIH407_USB2_PORT0_POWERDOWN>, arch/arm/boot/dts/stih410.dtsi: 2 resets = <&powerdown STIH407_USB2_PORT1_POWERDOWN>, arch/arm/boot/dts/stih410.dtsi: 2 resets = <&softreset STIH407_PICOPHY_SOFTRESET>, arch/arm/boot/dts/stih418.dtsi: 2 resets = <&powerdown STIH407_USB2_PORT0_POWERDOWN>, arch/arm/boot/dts/stih418.dtsi: 2 resets = <&powerdown STIH407_USB2_PORT1_POWERDOWN>, arch/arm/boot/dts/stih418.dtsi: 2 resets = <&softreset STIH407_PICOPHY_SOFTRESET>, arch/arm/boot/dts/sun9i-a80.dtsi: 2 resets = <&de_clocks RST_FE0>; arch/arm/boot/dts/sun9i-a80.dtsi: 2 resets = <&usb_clocks RST_USB0_HCI>; arch/arm/boot/dts/sun9i-a80.dtsi: 2 resets = <&usb_clocks RST_USB2_HCI>; arch/arm/boot/dts/sunxi-h3-h5.dtsi: 2 resets = <&ccu RST_BUS_EHCI0>, <&ccu RST_BUS_OHCI0>; arch/arm/boot/dts/sunxi-h3-h5.dtsi: 2 resets = <&ccu RST_BUS_EHCI1>, <&ccu RST_BUS_OHCI1>; arch/arm/boot/dts/sunxi-h3-h5.dtsi: 2 resets = <&ccu RST_BUS_EHCI2>, <&ccu RST_BUS_OHCI2>; arch/arm/boot/dts/sunxi-h3-h5.dtsi: 2 resets = <&ccu RST_BUS_EHCI3>, <&ccu RST_BUS_OHCI3>; arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi: 2 resets = <&reset RESET_USB_OTG>; arch/arm64/boot/dts/nvidia/tegra186.dtsi: 2 resets = <&bpmp TEGRA186_RESET_DSI>; arch/arm64/boot/dts/renesas/r8a7795.dtsi: 3 resets = <&cpg 328>; arch/arm64/boot/dts/renesas/r8a7795.dtsi: 7 resets = <&cpg 523>; arch/arm64/boot/dts/renesas/r8a7795.dtsi: 3 resets = <&cpg 700>; arch/arm64/boot/dts/renesas/r8a7795.dtsi: 3 resets = <&cpg 701>; arch/arm64/boot/dts/renesas/r8a7795.dtsi: 3 resets = <&cpg 702>; arch/arm64/boot/dts/renesas/r8a7795.dtsi: 3 resets = <&cpg 703>; arch/arm64/boot/dts/renesas/r8a7796.dtsi: 3 resets = <&cpg 328>; arch/arm64/boot/dts/renesas/r8a7796.dtsi: 7 resets = <&cpg 523>; arch/arm64/boot/dts/renesas/r8a7796.dtsi: 3 resets = <&cpg 702>; arch/arm64/boot/dts/renesas/r8a7796.dtsi: 3 resets = <&cpg 703>; arch/arm64/boot/dts/renesas/r8a77965.dtsi: 3 resets = <&cpg 328>; arch/arm64/boot/dts/renesas/r8a77965.dtsi: 7 resets = <&cpg 523>; arch/arm64/boot/dts/renesas/r8a77965.dtsi: 2 resets = <&cpg 702>; arch/arm64/boot/dts/renesas/r8a77965.dtsi: 4 resets = <&cpg 703>; arch/arm64/boot/dts/renesas/r8a77995.dtsi: 4 resets = <&cpg 523>; arch/arm64/boot/dts/renesas/r8a77995.dtsi: 3 resets = <&cpg 703>; $ Perhaps we should start grouping devices sharing a reset signal in a "simple-bus" node? Phillip: any comments? > ACPI spec is clear. We are doing a device specific reset aka function level > reset here. It does not impact other devices in the system. Assumed all ACPI implementations comply, of course. Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds