Received: by 2002:a25:e7d8:0:0:0:0:0 with SMTP id e207csp684564ybh; Tue, 10 Mar 2020 06:26:22 -0700 (PDT) X-Google-Smtp-Source: ADFU+vtWDYC0vBfVKS6i67ZHD9r+igUKJapAaIrCIjjohgPoMi0Hd6cxDpKh487WggMCDh8QK2px X-Received: by 2002:aca:5454:: with SMTP id i81mr1174693oib.23.1583846782514; Tue, 10 Mar 2020 06:26:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1583846782; cv=none; d=google.com; s=arc-20160816; b=yI+5NR2lGcU/vw2OV4U1q6Ii//ef/la3qs6XfY/NHJ0/Zh1k2zqEgruhU5XN9A7iu/ qIF8+KiyXcbXOQKtHOijxV+Zo692WlvoNjvjsOCQVKCf3x/uHncH6fM4Dj+Z3Fiz2x9/ is6yJL/v8KWf61o8+66LKJK3MhcfRs6CzTdU7Cx9huF2Sj3YxAZxzMk9ZzshoZiLWud1 GdFHg9E4OgRtbaGeK8lTdveyr6aTE6lgX4wybSXC8x3/UjkeC71gEvEhet34aPWJg0m7 3aQSwKWDNBXxsuhDn6B3MlwJckk5S2eEu4iTPumPRs4Ltxf364i+i04TsajRCkvhV6ea aK7Q== 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:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=L5BYBNpnWw3oXBaMuB/0bPcozamzktzkxLF/smpK7RI=; b=dPQgNVP8rSOm/Cgod0Ivcb/vQVlz6AtemH1QruVOSmUnnwt59GLGs08NhQqdcdxF/c pexHJe95CyLPvCDn/d1LlHr+ESiW4M2cd7+UEDUsh23LHLBi+G4eWXJx7nONQ7lwjAb+ ON9VtjPZVpJpNoB+aks3oBWK85jVg6bxgvf0GW/3ntXR18dRGr5fJuWrY6L0T3w+TDv6 V41tkm4MqEyLn25rvtaPIrinABPmvBifJu/LQotv0Emu83nHn1Nbw9bkCoGU8rf+rJMo 54jwv72YoR0SfJ8FMykdwSdQkvN+m490bGlxAE823ZHfmgeOLi2BFg4qr07dMHmjGSWE OfFQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=MeJSP2HU; 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 n4si5381748oic.213.2020.03.10.06.26.10; Tue, 10 Mar 2020 06:26:22 -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=pass header.i=@kernel.org header.s=default header.b=MeJSP2HU; 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 S1727524AbgCJNZG (ORCPT + 99 others); Tue, 10 Mar 2020 09:25:06 -0400 Received: from mail.kernel.org ([198.145.29.99]:38088 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728185AbgCJM6L (ORCPT ); Tue, 10 Mar 2020 08:58:11 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id B900E20674; Tue, 10 Mar 2020 12:58:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1583845090; bh=d++i2rxskDMNAcTw7Q5XEt6x9MQycNx2Ds0IINKJFzA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MeJSP2HUHkVlNVKW40HgECkMVGCSxZMphobV2sMQ1xo/OycuuWw1fmwW8Amxu4025 fc6ouoW8Wa4cNcxNVrhs3/ozSl6AjZOjE83hSmEnSxn3B/1gGxeLF/fJYj/OWK4VIG HL+m+BEF1FtnyX3qZPVUVbNeV4IMX0IzSXpLUgOk= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Leonard Crestez , Peng Fan , ": Oleksij Rempel" , Shawn Guo Subject: [PATCH 5.5 058/189] firmware: imx: scu: Ensure sequential TX Date: Tue, 10 Mar 2020 13:38:15 +0100 Message-Id: <20200310123645.453176342@linuxfoundation.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200310123639.608886314@linuxfoundation.org> References: <20200310123639.608886314@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Leonard Crestez commit 26d0fba29c96241de8a9d16f045b1de49875884c upstream. SCU requires that all messages words are written sequentially but linux MU driver implements multiple independent channels for each register so ordering between different channels must be ensured by SCU API interface. Wait for tx_done before every send to ensure that no queueing happens at the mailbox channel level. Fixes: edbee095fafb ("firmware: imx: add SCU firmware driver support") Signed-off-by: Leonard Crestez Cc: Reviewed-by: Peng Fan Reviewed-by:: Oleksij Rempel Signed-off-by: Shawn Guo Signed-off-by: Greg Kroah-Hartman --- drivers/firmware/imx/imx-scu.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) --- a/drivers/firmware/imx/imx-scu.c +++ b/drivers/firmware/imx/imx-scu.c @@ -29,6 +29,7 @@ struct imx_sc_chan { struct mbox_client cl; struct mbox_chan *ch; int idx; + struct completion tx_done; }; struct imx_sc_ipc { @@ -100,6 +101,14 @@ int imx_scu_get_handle(struct imx_sc_ipc } EXPORT_SYMBOL(imx_scu_get_handle); +/* Callback called when the word of a message is ack-ed, eg read by SCU */ +static void imx_scu_tx_done(struct mbox_client *cl, void *mssg, int r) +{ + struct imx_sc_chan *sc_chan = container_of(cl, struct imx_sc_chan, cl); + + complete(&sc_chan->tx_done); +} + static void imx_scu_rx_callback(struct mbox_client *c, void *msg) { struct imx_sc_chan *sc_chan = container_of(c, struct imx_sc_chan, cl); @@ -149,6 +158,19 @@ static int imx_scu_ipc_write(struct imx_ for (i = 0; i < hdr->size; i++) { sc_chan = &sc_ipc->chans[i % 4]; + + /* + * SCU requires that all messages words are written + * sequentially but linux MU driver implements multiple + * independent channels for each register so ordering between + * different channels must be ensured by SCU API interface. + * + * Wait for tx_done before every send to ensure that no + * queueing happens at the mailbox channel level. + */ + wait_for_completion(&sc_chan->tx_done); + reinit_completion(&sc_chan->tx_done); + ret = mbox_send_message(sc_chan->ch, &data[i]); if (ret < 0) return ret; @@ -247,6 +269,11 @@ static int imx_scu_probe(struct platform cl->knows_txdone = true; cl->rx_callback = imx_scu_rx_callback; + /* Initial tx_done completion as "done" */ + cl->tx_done = imx_scu_tx_done; + init_completion(&sc_chan->tx_done); + complete(&sc_chan->tx_done); + sc_chan->sc_ipc = sc_ipc; sc_chan->idx = i % 4; sc_chan->ch = mbox_request_channel_byname(cl, chan_name);