Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp2475815pxj; Mon, 10 May 2021 04:02:16 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxoBIx+TP0KvlgRKeLHy3EqfWSEkEAt7CcaO2yB30AbT54cUyqasn3jrn+weRrFjTJcifOl X-Received: by 2002:a92:c9cd:: with SMTP id k13mr21704305ilq.180.1620644536465; Mon, 10 May 2021 04:02:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620644536; cv=none; d=google.com; s=arc-20160816; b=Kb2k4ATsfkpN0FRzb0mFF4xd/6E8vPYCSwQkxLBwp9jDllLXkx21A7/L8AhPU1Shpo FC05aLFDHhjqRFJyWt4RytFj5uZnV24fE+HHn5So0AlWDfgJvN9qeP46XAgYi+WFBUKe 8hgONjA9Q/0kkPgyjxTTX2li5uG1siEq69GFWP3mx3tOWhd39kCxHN0RhKBeA1WI56b1 aQIxo0U/D4znSDUIfpuUcxRKj7yZsnT2W/DIoTQV9haXIQoLNgd3tJ4sa80noxmsZOh2 1LOWBlyWmGcMX5AVCCztIE4krIyX5C7+YWJJhKQdTV2KAgklH1wS/XRM+Tp82wyNe5Fu iCpA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=d9DCYTQLUBGPu4npXWGZfG7fmLLdvBfXeYqU8u7Io+k=; b=0e/m7oHk7yFEt81Q4cNuOEDj3dbKWw+gGB4NQOLZR1wAJuzd3fJPJJbyi404GMa0NM tVdOeSC6uqFoORbarFmlOk9bLW7FDpv7LsNKBedUUsRfeC/lyYx8glYfHzF04+HLgPoS fMv6+v4x7tQfM+/KPnko2+RJ9nNKy0SG11WL3IC05aGKidmxMFFoY2Swg87aTfFLsjLr ksb2jeuaet6w261+yKPt7AVGZpTafnHzlKlWWOtk3pFsG+iBypkdCZkVnRBi9Td9+peB m2NKC7DFpedIirn3qd5EZqfVb0wau3vrBrfecH50pmMi6mK/yRMI2kF+HKoCkq50H6Gw VnBw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=edjAGXOd; 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=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id r9si16135339ilt.62.2021.05.10.04.02.02; Mon, 10 May 2021 04:02:16 -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=@linuxfoundation.org header.s=korg header.b=edjAGXOd; 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=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233970AbhEJK7t (ORCPT + 99 others); Mon, 10 May 2021 06:59:49 -0400 Received: from mail.kernel.org ([198.145.29.99]:59362 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232495AbhEJKoW (ORCPT ); Mon, 10 May 2021 06:44:22 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id B5BBE61956; Mon, 10 May 2021 10:33:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1620642795; bh=DCkM3i8YW6SLbfZvq2H8pQMp56zEseL8FwD46XbIR5k=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=edjAGXOd686x3sCTzo+WJddra7ne+cYyQUJX6vGQdkWOhnq/PDrw9QOsKzLU3qBji P4e1ujqFBQZrWralMmMLCTvv+koKgbGotsXfd+A6D9vh2A6IUlEYB/S10BvgKscO9S y2xgq3aM8QMBL/1wokhcrkKnDEXBQLiIMkk3MzVE= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Bhaumik Bhatt , Loic Poulain , Hemant Kumar , Manivannan Sadhasivam , Sasha Levin Subject: [PATCH 5.10 055/299] bus: mhi: core: Destroy SBL devices when moving to mission mode Date: Mon, 10 May 2021 12:17:32 +0200 Message-Id: <20210510102006.696560199@linuxfoundation.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210510102004.821838356@linuxfoundation.org> References: <20210510102004.821838356@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Bhaumik Bhatt [ Upstream commit 925089c1900f588615db5bf4e1d9064a5f2c18c7 ] Currently, client devices are created in SBL or AMSS (mission mode) and only destroyed after power down or SYS ERROR. When moving between certain execution environments, such as from SBL to AMSS, no clean-up is required. This presents an issue where SBL-specific channels are left open and client drivers now run in an execution environment where they cannot operate. Fix this by expanding the mhi_destroy_device() to do an execution environment specific clean-up if one is requested. Close the gap and destroy devices in such scenarios that allow SBL client drivers to clean up once device enters mission mode. Signed-off-by: Bhaumik Bhatt Reviewed-by: Loic Poulain Reviewed-by: Hemant Kumar Reviewed-by: Manivannan Sadhasivam Link: https://lore.kernel.org/r/1614208985-20851-2-git-send-email-bbhatt@codeaurora.org Signed-off-by: Manivannan Sadhasivam Signed-off-by: Sasha Levin --- drivers/bus/mhi/core/main.c | 29 +++++++++++++++++++++++++---- drivers/bus/mhi/core/pm.c | 3 +++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/drivers/bus/mhi/core/main.c b/drivers/bus/mhi/core/main.c index f46f772e2557..d86ce1a06b75 100644 --- a/drivers/bus/mhi/core/main.c +++ b/drivers/bus/mhi/core/main.c @@ -227,8 +227,10 @@ static bool is_valid_ring_ptr(struct mhi_ring *ring, dma_addr_t addr) int mhi_destroy_device(struct device *dev, void *data) { + struct mhi_chan *ul_chan, *dl_chan; struct mhi_device *mhi_dev; struct mhi_controller *mhi_cntrl; + enum mhi_ee_type ee = MHI_EE_MAX; if (dev->bus != &mhi_bus_type) return 0; @@ -240,6 +242,17 @@ int mhi_destroy_device(struct device *dev, void *data) if (mhi_dev->dev_type == MHI_DEVICE_CONTROLLER) return 0; + ul_chan = mhi_dev->ul_chan; + dl_chan = mhi_dev->dl_chan; + + /* + * If execution environment is specified, remove only those devices that + * started in them based on ee_mask for the channels as we move on to a + * different execution environment + */ + if (data) + ee = *(enum mhi_ee_type *)data; + /* * For the suspend and resume case, this function will get called * without mhi_unregister_controller(). Hence, we need to drop the @@ -247,11 +260,19 @@ int mhi_destroy_device(struct device *dev, void *data) * be sure that there will be no instances of mhi_dev left after * this. */ - if (mhi_dev->ul_chan) - put_device(&mhi_dev->ul_chan->mhi_dev->dev); + if (ul_chan) { + if (ee != MHI_EE_MAX && !(ul_chan->ee_mask & BIT(ee))) + return 0; - if (mhi_dev->dl_chan) - put_device(&mhi_dev->dl_chan->mhi_dev->dev); + put_device(&ul_chan->mhi_dev->dev); + } + + if (dl_chan) { + if (ee != MHI_EE_MAX && !(dl_chan->ee_mask & BIT(ee))) + return 0; + + put_device(&dl_chan->mhi_dev->dev); + } dev_dbg(&mhi_cntrl->mhi_dev->dev, "destroy device for chan:%s\n", mhi_dev->name); diff --git a/drivers/bus/mhi/core/pm.c b/drivers/bus/mhi/core/pm.c index ce2aafe33d53..aeb895c08460 100644 --- a/drivers/bus/mhi/core/pm.c +++ b/drivers/bus/mhi/core/pm.c @@ -376,6 +376,7 @@ static int mhi_pm_mission_mode_transition(struct mhi_controller *mhi_cntrl) { struct mhi_event *mhi_event; struct device *dev = &mhi_cntrl->mhi_dev->dev; + enum mhi_ee_type current_ee = mhi_cntrl->ee; int i, ret; dev_dbg(dev, "Processing Mission Mode transition\n"); @@ -390,6 +391,8 @@ static int mhi_pm_mission_mode_transition(struct mhi_controller *mhi_cntrl) wake_up_all(&mhi_cntrl->state_event); + device_for_each_child(&mhi_cntrl->mhi_dev->dev, ¤t_ee, + mhi_destroy_device); mhi_cntrl->status_cb(mhi_cntrl, MHI_CB_EE_MISSION_MODE); /* Force MHI to be in M0 state before continuing */ -- 2.30.2