Received: by 2002:a25:ab43:0:0:0:0:0 with SMTP id u61csp3256231ybi; Mon, 10 Jun 2019 07:14:59 -0700 (PDT) X-Google-Smtp-Source: APXvYqzFQ31tnCRnSFbaQNRCKzoIrrTBkMJ7QsJOLCTxZx/H3bkZGDvj2Vn31W3OM0IjFf3PCZO0 X-Received: by 2002:a63:ce08:: with SMTP id y8mr7221650pgf.38.1560176098960; Mon, 10 Jun 2019 07:14:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1560176098; cv=none; d=google.com; s=arc-20160816; b=qFwWlCC0mrq+hHd+1KRhQ88v0J2ZEBFE0Sm4OJ+AHkmoz6/9BqoTaCCXuggxmb1MyG 2Y9aCUvQHriGgWSeUqMIQbJmaFelDqaZNSLaVL1S3eugSpFkTb1NFbLf+/IRAte90Vz8 A6vCMiXO4Zb078mGI1ZO6DsPq4sSE1snMpkzs8gKPrIxLkWrI8zV+P+TjgUMiSgKaiXX iXtKyBuSQDCCYEPIUEXBTRGXk78r5ToBgzdWhBQBk9Ty7ElTzL5u9fxwd6ny+frVgVs9 pVo9kswKX4NGIY0viPhguF/fizg1+Phdy0u/Zw/3PwetyQBPm3t6WuuTDB4usMX0I1F6 lFqg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=GHuyHjolQ7O6q52DXQqVPXTq1OLhhA/EKJmbX0hMYTk=; b=xb6ZJ4k6h/9HWdoRQE12HJr0yMmJ4zWobGncfR4LUWzc2p+grIeD8l2w/uT+9DYtsE Sdc0KqlEoa0E6ojPevdqYsZfv4sGvkyr3/jc71hZcTDcwT7BMqXkqKVqvo294k8yvJEh LJBlgZiQbqWSJ3WaJrIQLbTAhguDvcYjOpevxLM4TdrlU3gfAZCMGIxwWZjTzjvxIMGZ piDNWKFV/TvvSFTg86W+bjJIrsJfFFcZAO6ibiMU5w84PUQyNoSJ6XHXoH4K9lBe4cpQ gGTHFPOueKEK39ptEeyhAd9GDdvg+mux008PWza9rguChgTQc+75SwvFchZa8hbnO7jH vnTg== 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=nxp.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id p22si5091336plr.160.2019.06.10.07.14.43; Mon, 10 Jun 2019 07:14:58 -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=nxp.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2390778AbfFJOOf (ORCPT + 99 others); Mon, 10 Jun 2019 10:14:35 -0400 Received: from inva021.nxp.com ([92.121.34.21]:40284 "EHLO inva021.nxp.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2390516AbfFJOOe (ORCPT ); Mon, 10 Jun 2019 10:14:34 -0400 Received: from inva021.nxp.com (localhost [127.0.0.1]) by inva021.eu-rdc02.nxp.com (Postfix) with ESMTP id 320542007DA; Mon, 10 Jun 2019 16:14:33 +0200 (CEST) Received: from invc005.ap-rdc01.nxp.com (invc005.ap-rdc01.nxp.com [165.114.16.14]) by inva021.eu-rdc02.nxp.com (Postfix) with ESMTP id 48C0E2007D5; Mon, 10 Jun 2019 16:14:28 +0200 (CEST) Received: from localhost.localdomain (mega.ap.freescale.net [10.192.208.232]) by invc005.ap-rdc01.nxp.com (Postfix) with ESMTP id F1B6A402FB; Mon, 10 Jun 2019 22:14:21 +0800 (SGT) From: daniel.baluta@nxp.com To: jassisinghbrar@gmail.com, o.rempel@pengutronix.de Cc: shawnguo@kernel.org, s.hauer@pengutronix.de, linux-imx@nxp.com, kernel@pengutronix.de, festevam@gmail.com, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, aisheng.dong@nxp.com, Daniel Baluta Subject: [RFC PATCH 2/2] imx: mailbox: Introduce TX doorbell with ACK Date: Mon, 10 Jun 2019 22:16:09 +0800 Message-Id: <20190610141609.17559-3-daniel.baluta@nxp.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190610141609.17559-1-daniel.baluta@nxp.com> References: <20190610141609.17559-1-daniel.baluta@nxp.com> X-Virus-Scanned: ClamAV using ClamSMTP Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Daniel Baluta TX doorbell with ACK will allow us to push the doorbell ring button (trigger GIR) and also will allow us to handle the response from DSP. DSP firmware found on i.MX8 boards implements a duplex communication protocol over MU channels. On the host side (Linux) we need to plugin into Sound Open Firmware IPC communication infrastructure which handles all the details (e.g message queuing, tx/rx logic) [1] and the users are only required to provide the following callbacks: - send_msg (for Tx) - irq_handler (Ack of Tx, request from DSP) In order to implement send_msg and irq_handler we will use two MU channels: * channel #0, TX doorbell with ACK * channel #1, RX doorbell Sending a request Host -> DSP (channel #0) - send_msg callback - write data into SHMEM - push doorbell ring button (trigger GIR) - irq handler - handle DSP request (channel #1) - read SHMEM and trigger SOF IPC state machine - send ACK (push doorbell ring button for channel #1) - handle DSP response (ACK) (channel #0) - read SHMEM and trigger IPC state machine The easisest way to implement this is to directly access the MU registers but since the MU is abstracted using the mailbox interface we need to use that instead. [1] https://elixir.bootlin.com/linux/v5.2-rc4/source/sound/soc/sof/ipc.c Signed-off-by: Daniel Baluta --- drivers/mailbox/imx-mailbox.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/mailbox/imx-mailbox.c b/drivers/mailbox/imx-mailbox.c index 9f74dee1a58c..3a91611e17d2 100644 --- a/drivers/mailbox/imx-mailbox.c +++ b/drivers/mailbox/imx-mailbox.c @@ -42,6 +42,7 @@ enum imx_mu_chan_type { IMX_MU_TYPE_RX, /* Rx */ IMX_MU_TYPE_TXDB, /* Tx doorbell */ IMX_MU_TYPE_RXDB, /* Rx doorbell */ + IMX_MU_TYPE_TXDB_ACK /* Tx doorbell with Ack */ }; struct imx_mu_con_priv { @@ -124,6 +125,7 @@ static irqreturn_t imx_mu_isr(int irq, void *p) (ctrl & IMX_MU_xCR_RIEn(cp->idx)); break; case IMX_MU_TYPE_RXDB: + case IMX_MU_TYPE_TXDB_ACK: val &= IMX_MU_xSR_GIPn(cp->idx) & (ctrl & IMX_MU_xCR_GIEn(cp->idx)); break; @@ -200,6 +202,7 @@ static int imx_mu_startup(struct mbox_chan *chan) imx_mu_xcr_rmw(priv, IMX_MU_xCR_RIEn(cp->idx), 0); break; case IMX_MU_TYPE_RXDB: + case IMX_MU_TYPE_TXDB_ACK: imx_mu_xcr_rmw(priv, IMX_MU_xCR_GIEn(cp->idx), 0); break; default: -- 2.17.1