From patchwork Wed Feb 5 18:21:48 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Greg Kurz X-Patchwork-Id: 1233970 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 48CVKD4TrDz9sSb for ; Thu, 6 Feb 2020 05:22:24 +1100 (AEDT) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=kaod.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 48CVKD1dzVzDqMT for ; Thu, 6 Feb 2020 05:22:24 +1100 (AEDT) X-Original-To: slof@lists.ozlabs.org Delivered-To: slof@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=softfail (domain owner discourages use of this host) smtp.mailfrom=kaod.org (client-ip=148.163.156.1; helo=mx0a-001b2d01.pphosted.com; envelope-from=groug@kaod.org; receiver=) Authentication-Results: lists.ozlabs.org; dmarc=none (p=none dis=none) header.from=kaod.org Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 48CVJj75M7zDqLg for ; Thu, 6 Feb 2020 05:21:57 +1100 (AEDT) Received: from pps.filterd (m0098404.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 015IFaUQ109331 for ; Wed, 5 Feb 2020 13:21:55 -0500 Received: from e06smtp07.uk.ibm.com (e06smtp07.uk.ibm.com [195.75.94.103]) by mx0a-001b2d01.pphosted.com with ESMTP id 2xyhmdhst5-1 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT) for ; Wed, 05 Feb 2020 13:21:55 -0500 Received: from localhost by e06smtp07.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 5 Feb 2020 18:21:53 -0000 Received: from b06avi18626390.portsmouth.uk.ibm.com (9.149.26.192) by e06smtp07.uk.ibm.com (192.168.101.137) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; (version=TLSv1/SSLv3 cipher=AES256-GCM-SHA384 bits=256/256) Wed, 5 Feb 2020 18:21:50 -0000 Received: from d06av26.portsmouth.uk.ibm.com (d06av26.portsmouth.uk.ibm.com [9.149.105.62]) by b06avi18626390.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 015IKun831850770 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 5 Feb 2020 18:20:56 GMT Received: from d06av26.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 8109EAE045; Wed, 5 Feb 2020 18:21:49 +0000 (GMT) Received: from d06av26.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 59E54AE051; Wed, 5 Feb 2020 18:21:49 +0000 (GMT) Received: from bahia.lan (unknown [9.145.71.236]) by d06av26.portsmouth.uk.ibm.com (Postfix) with ESMTP; Wed, 5 Feb 2020 18:21:49 +0000 (GMT) From: Greg Kurz To: Alexey Kardashevskiy Date: Wed, 05 Feb 2020 19:21:48 +0100 In-Reply-To: <158092689078.2344237.6072760291677054493.stgit@bahia.lan> References: <158092689078.2344237.6072760291677054493.stgit@bahia.lan> User-Agent: StGit/unknown-version MIME-Version: 1.0 X-TM-AS-GCONF: 00 x-cbid: 20020518-0028-0000-0000-000003D7B97C X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 20020518-0029-0000-0000-0000249C18FD Message-Id: <158092690859.2344237.16184914364427726409.stgit@bahia.lan> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.572 definitions=2020-02-05_05:2020-02-04, 2020-02-05 signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 suspectscore=0 spamscore=0 clxscore=1034 lowpriorityscore=0 priorityscore=1501 mlxscore=0 mlxlogscore=999 malwarescore=0 impostorscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2001150001 definitions=main-2002050140 Subject: [SLOF] [PATCH 3/3] fdt: Delete nodes of devices removed between boot and CAS X-BeenThere: slof@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Patches for https://github.com/aik/SLOF" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: slof@lists.ozlabs.org Errors-To: slof-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "SLOF" We recently fixed node creation at CAS in order to support early hotplug of devices between boot and CAS. Let's handle node removal now to support early hot *un*plug of devices. This is done in three phases: 1) all nodes from the boot time FDT are added a "slof,present-at-boot" property 2) during pass 0 of (fdt-fix-cas-node) all nodes from the CAS FDT are added a "slof,present-at-cas" property 3) loop on all nodes in the DT and delete the ones that only have the "slof,present-at-boot" property, and any alias they might have. In the same time, "slof,present-at-cas" properties are converted into "slof,present-at-boot" to allow further node removal in case of a subsequent device unplug and CAS sequence before quiesce (linux doesn't do that but it isn't explicitely forbidden by the spec). Signed-off-by: Greg Kurz --- board-qemu/slof/fdt.fs | 94 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/board-qemu/slof/fdt.fs b/board-qemu/slof/fdt.fs index 66f8fe74d9dd..1125f6702435 100644 --- a/board-qemu/slof/fdt.fs +++ b/board-qemu/slof/fdt.fs @@ -198,6 +198,8 @@ fdt-check-header decode-int dup fdt-create-dec fdt-create-enc 2drop THEN + 0 0 s" slof,present-at-boot" property + finish-device ; @@ -514,6 +516,9 @@ r> drop swap ( newnode? a1 ) fdt-debug IF ." Current now: " pwd get-node ." = " . cr THEN + fdt-cas-pass 0= IF + 0 0 s" slof,present-at-cas" property + THEN BEGIN fdt-next-tag dup OF_DT_END_NODE <> WHILE @@ -584,8 +589,97 @@ r> drop THEN ; +: alias-dev-path ( xt -- dev-path len ) + link> execute decode-string 2swap 2drop +; + +: alias-name ( xt -- alias-name len ) + link> >name name>string +; + +: fdt-cas-alias-obsolete? ( node xt -- true|false ) + alias-dev-path rot node>path str= +; + +: (fdt-cas-delete-obsolete-aliases) ( node xt -- ) + dup IF + dup @ 2 pick swap ( node xt node next-xt ) + recurse ( node xt ) + 2dup fdt-cas-alias-obsolete? IF + dup alias-name ( node xt alias-name len ) + fdt-debug IF ." Deleting alias " 2dup type cr THEN + delete-property ( node xt ) + THEN + THEN + 2drop +; + +: fdt-cas-delete-obsolete-aliases ( node -- ) + s" /aliases" find-node dup IF + ( node aliases ) + get-node >r + dup set-node + + node>properties @ cell+ @ ( node xt ) + over swap ( node node xt ) + (fdt-cas-delete-obsolete-aliases) ( node ) + + r> set-node + THEN + drop +; + +: fdt-cas-node-obsolete? ( node -- true|false) + s" slof,present-at-cas" 2 pick get-package-property IF + s" slof,present-at-boot" 2 pick get-package-property IF + \ Node not coming from the QEMU + FALSE + ELSE + \ Device got removed since last boot or CAS + 2drop + TRUE + THEN + ELSE + 2drop ( node ) + + get-node >r + dup set-node + + \ Any device present in the CAS FDT is now considered as if it was + \ present at boot, ie. cold plugged. This allows a subsequent CAS + \ to remove the node from the DT if the device gets unplugged in + \ between). + s" slof,present-at-cas" delete-property + 0 0 s" slof,present-at-boot" property + + r> set-node + FALSE + THEN + nip +; + +: (fdt-cas-search-obsolete-nodes) ( start node -- ) + dup IF + dup child 2 pick swap recurse + dup peer 2 pick swap recurse ( start node ) + + fdt-debug IF dup ." Inspecting node: " dup .node ." = " . cr THEN + dup fdt-cas-node-obsolete? IF + fdt-debug IF ." Deleting node" cr THEN + dup fdt-cas-delete-obsolete-aliases + dup delete-node + THEN + THEN + 2drop +; + +: fdt-cas-delete-obsolete-nodes ( start -- ) + s" /" find-device get-node (fdt-cas-search-obsolete-nodes) +; + : fdt-fix-cas-node ( start -- ) 0 to fdt-cas-pass dup (fdt-fix-cas-node) drop \ Add phandles + dup fdt-cas-delete-obsolete-nodes \ Delete removed devices 1 to fdt-cas-pass dup (fdt-fix-cas-node) drop \ Patch+add other properties 2 to fdt-cas-pass dup (fdt-fix-cas-node) drop \ Delete phandles from pass 0 drop