Received: by 10.192.165.156 with SMTP id m28csp487964imm; Fri, 13 Apr 2018 02:42:31 -0700 (PDT) X-Google-Smtp-Source: AIpwx49gUWVJl0Qj0vMDbeubS7XiEn+WdEQ7jh67UVAP8yD7d7EweBCl719c5OrpTc9wRGMy7FNK X-Received: by 10.98.212.67 with SMTP id u3mr10832636pfl.58.1523612551102; Fri, 13 Apr 2018 02:42:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1523612551; cv=none; d=google.com; s=arc-20160816; b=H6fc8E0PpVHVxylhW/zMcdfejO1NgfQz0ECj5rkHy9wHocSVZXWfDbAJFI4J/rZDJu F1VeEwNy2ohJNp++6fglgr4ClGc2AlPvLuOnFDIRIm+jDftYziMIzzlF63EKxhmZa54n 6EueWJgMFHgBMRdZVpeoc/V0wMdbu6G/vSjxgWMbOsK/piL1lvLhuIdjIF1DSr319IZR golYbAPj0DAS8kber5MEZt40le7SJ42JfNAw1JP3SXxp5DZmx3Q2yqOw/Uy804i784vA 5armKFzOdzoktQSGiMmYA1h7Qf7j8EeR7iYEiYDhouNfHmj36uQgFWCEHBnQc8y49/xR OeiA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:in-reply-to :mime-version:user-agent:date:message-id:from:cc:references:to :subject:arc-authentication-results; bh=F+TL3G4oNhHlpqy4yd4RJ0TAncYFzppKQSUjvg8jGQs=; b=zFHXAP2AqYP5Bimm3o5SP/G4xnBCDMqp79h+WrCqNoIjQpmU4QOpUWdan+PXioXnBq fO7+DOa1HZBmiaV4//DNK4AjpAONDQCkYBVExQ+j3dmWyHOmQrY73Ldn6tzys89fP6L3 ZRbSm3XRIhkeW6jtO1TR/AWmE4oDzU9fTtQffNfggqf96IQLnIQ/PJCW2M23kczwOvD7 kC5Bks7nSI5fn36IVpuckcZiORMTHrP28s3BevoiV4uYNeDWRqqoM0v1A2cyblGPyglA Jh8H4Gj290QG45Ji2kgQxu12upklEn3VfbeThnB0Djh684AN5ocyggjICGMI33ZTOeRW YUFQ== ARC-Authentication-Results: i=1; mx.google.com; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id k2-v6si5176816plt.406.2018.04.13.02.42.16; Fri, 13 Apr 2018 02:42:31 -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; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754103AbeDMIwP (ORCPT + 99 others); Fri, 13 Apr 2018 04:52:15 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:42650 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752446AbeDMIwL (ORCPT ); Fri, 13 Apr 2018 04:52:11 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 159B14072458; Fri, 13 Apr 2018 08:52:11 +0000 (UTC) Received: from localhost.localdomain (ovpn-116-192.ams2.redhat.com [10.36.116.192]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 641C32166BAE; Fri, 13 Apr 2018 08:52:08 +0000 (UTC) Subject: Re: [PATCH v3 2/2] vfio: platform: Add generic DT reset support To: Geert Uytterhoeven , Philipp Zabel 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> <1523542206.3689.10.camel@pengutronix.de> Cc: Sinan Kaya , Geert Uytterhoeven , Baptiste Reynal , Alex Williamson , Rob Herring , Mark Rutland , KVM list , "open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS" , Linux-Renesas , Linux Kernel Mailing List From: Auger Eric Message-ID: Date: Fri, 13 Apr 2018 10:52:07 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.5]); Fri, 13 Apr 2018 08:52:11 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.5]); Fri, 13 Apr 2018 08:52:11 +0000 (UTC) for IP:'10.11.54.6' DOMAIN:'int-mx06.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'eric.auger@redhat.com' RCPT:'' Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Geert, Philipp, On 12/04/18 18:02, Geert Uytterhoeven wrote: > Hi Philipp, > > On Thu, Apr 12, 2018 at 4:10 PM, Philipp Zabel wrote: >> On Thu, 2018-04-12 at 15:12 +0200, Geert Uytterhoeven wrote: >>> 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? >> >> If the reset control is requested as exclusive, any other driver >> requesting the same reset control will fail (or this reset_control_get >> will fail, whichever comes last). >> >>>> 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." >> >> This was written in 2012, and unfortunately the DT binding documentation >> does not inform hardware development, and has not been updated since. >> >> There's generally two kinds of reset uses: >> - either to bring a device into a known state at a given point in time, >> which is often done using a timed assert/deassert sequence, >> - or just to park a device while not in active use (must deassert any >> time before use, may or may not assert any time after use) >> >> For the former case, the above paragraph makes a lot of sense, because >> when it is necessary to reset a device that shares the reset line with >> another, either choice between disturbing the other device, or not >> being able to reset when necessary, is a bad one. The reset controller >> framework supports those use cases via the reset_control_get_exclusive >> function variants. >> >> But for the latter case, there is absolutely no need to forbid sharing >> reset lines among multiple devices, as deassertion/assertion can just be >> handled reference counted, like clocks or power management. The reset >> controller framework supports those use cases via the >> reset_control_get_shared function variants. >> >> The case we are talking about here is the first one. > > Except that vfio-platform wants to reset the device before and after its > use by the guest, for isolation reasons, which does cause a major > disturbance in case of a shared reset. Do we have any guarantee that drivers whose device are sharing the reset signal will have got the reset control when the vfio-platform driver calls reset_control_get_exclusive(). In such a case vfio-platform reset_control_get_exclusive() will fail and this is what we want. Otherwise it is unsafe, right. Doesn't this assumption look a little risky? Thanks Eric > >>> So according to the bindings, a specific reset should apply to a single >>> device only. >> >> Indeed sharing reset lines between peripherals has become unexpectedly >> common, making it impractical to forbid shared resets in the device >> tree. >> >>> A quick check shows there are several violators: > > [...] > >>> Perhaps we should start grouping devices sharing a reset signal in a >>> "simple-bus" node? >>> >>> Phillip: any comments? >> >> For some of those it may be possible, but that is basically just a work- >> around for reality not matching expectations. There may be other cases >> where devices sharing a reset line are not even in the same parent node >> because they are controlled via a different bus. In general, I don't >> think it is feasible or desirable to force grouping of devices that >> share the same reset line into a common parent node. > > At least for Renesas R-Car SoCs, I think this is feasible, as all affected > devices are currently grouped under the same /soc node. > I added subnodes for all devices sharing resets (one for pwm, 4 for USB2, > and one for USB3; display doesn't have resets yet), and it still boots ;-) > > However, ehci_platform_probe() cannot get its (optional) resets anymore. > Probably the reset controller framework needs to be taught to look for > shared resets in the parent node, too? > >> My suggestion would be to relax the language in the reset.txt DT >> bindings doc. > > Which is fine to keep the status quo with the hardware designers, but makes > it less likely for non-whitelisted generic reset controller support to > become acceptable for the vfio people... > > Gr{oetje,eeting}s, > > Geert >