From patchwork Wed Dec 27 04:51:27 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anup Patel X-Patchwork-Id: 10133445 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id BE3F16020A for ; Wed, 27 Dec 2017 04:51:53 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id AE09A2CE97 for ; Wed, 27 Dec 2017 04:51:53 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id A1FDA2D8B9; Wed, 27 Dec 2017 04:51:53 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=unavailable version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1AB592CE9B for ; Wed, 27 Dec 2017 04:51:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751539AbdL0Evm (ORCPT ); Tue, 26 Dec 2017 23:51:42 -0500 Received: from mail-pl0-f68.google.com ([209.85.160.68]:47056 "EHLO mail-pl0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751407AbdL0Evk (ORCPT ); Tue, 26 Dec 2017 23:51:40 -0500 Received: by mail-pl0-f68.google.com with SMTP id i6so18919058plt.13 for ; Tue, 26 Dec 2017 20:51:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=brainfault-org.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id; bh=1C8m8tAsJTps51iaVDGtT8Do75NU1baOd0UoCB7k/g4=; b=akrKrm87MfiB2i4bEEPNnf3angbp6DvwMtr26uNVqtMwDzPXVAg22pWpPn21wtSTFq C7PqOTpmCLh7hrWT66o/rp1jzRJ3CNygxUKlZOMnwct1DPkwtUD4AckApMUd4dZc/Go2 VUQmM8b9fqP2rRmNNMcVnAmiFHod/ElkXJ+Tbp9PIdwrHowRngyyKP5adpD+iPqXY4Ad G+hUsPx8ngmAdb7lAMM9BH4D5kik42S2vqZlxWascyw0grmKKLBDIiboFtiTjBrhHttm lBiE7/sA3CkOyVOl8OJYiGx8d1GIf4JtnKfEpp3AP5Oq7UM85ukfOz70bfyMPF6X2IjR a7sA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=1C8m8tAsJTps51iaVDGtT8Do75NU1baOd0UoCB7k/g4=; b=gxGlLg9PA/9POVusBJ/uqwtKGGip4Fxp7bo0p1z9brutG7xg8kMZuYucXQSFjxfhzx k41wFo/f265Tw0CKAbQQXXjYVdZOywYssHvOGhtFV4gUAXXJTDo4BlxpO7JYqknxI1eW lH1qJSV3oHzOCqn9f1Pd+PyuZbpEgFIQtPMg7scE6fwMmbaELYwbaQyTAjUeFP/aMZpC 5b0VRcpr+2My79OkrdnirzZCUFZO1T4FkJ5v4CZUZevotAsqwCeyKbmIHywv85iO+6pC TT7JfFcuW1MvPx42d/X0+ruh/1aWb7XjX1Kck6T5aoKZ0/4LnJ5Cp2KhfzyKTK8h8b/b HK1g== X-Gm-Message-State: AKGB3mLUKQAIv/hrjqKDiPTf8GIsgH5txNyjt9Z7CBkY/3ytvnKBjf/Q 9Dr6xzJsSU83JvSeEUKvHhz0AQ== X-Google-Smtp-Source: ACJfBouhFhAphSyKUNQx1h9fLNepRYNNUZ554v1KmA/ytO+Ojmw6XBQaoixWCIhTox35dk8iyjovHw== X-Received: by 10.84.141.164 with SMTP id 33mr27484698plv.375.1514350300135; Tue, 26 Dec 2017 20:51:40 -0800 (PST) Received: from anup-ubuntu64.qualcomm.com (blr-bdr-fw-01_globalnat_allzones-outside.qualcomm.com. [103.229.18.19]) by smtp.googlemail.com with ESMTPSA id g1sm10810718pgc.32.2017.12.26.20.51.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 26 Dec 2017 20:51:38 -0800 (PST) From: Anup Patel To: Ohad Ben-Cohen , Bjorn Andersson Cc: linux-remoteproc@vger.kernel.org, linux-kernel@vger.kernel.org, Anup Patel , stable@vger.kernel.org Subject: [PATCH] rpmsg: virtio_rpmsg_bus: fix rpmsg_probe() for virtio-mmio transport Date: Wed, 27 Dec 2017 10:21:27 +0530 Message-Id: <1514350287-27048-1-git-send-email-anup@brainfault.org> X-Mailer: git-send-email 2.7.4 Sender: linux-remoteproc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-remoteproc@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP When virtio-rpmsg device is provided via virtio-mmio transport, the dma_alloc_coherent() (called by rpmsg_probe()) fails on ARM/ARM64 systems because "vdev->dev.parent->parent" device is used as parameter to dma_alloc_coherent(). The "vdev->dev.parent->parent" device represents underlying remoteproc platform device when virtio-rpmsg device is provided via virtio-remoteproc transport. When virtio-rpmsg device is provided via virtio-mmio transport, the "vdev->dev.parent->parent" device represents the parent device of virtio-mmio platform device and dma_alloc_coherent() fails for this device because generally there is no corresponding platform device and dma_ops are not setup for "vdev->dev.parent->parent". This patch fixes dma_alloc_coherent() usage in rpmsg_probe() by trying dma_alloc_coherent() with "vdev->dev.parent" device when it fails with "vdev->dev.parent->parent" device. Fixes: b5ab5e24e960 ("remoteproc: maintain a generic child device for each rproc") Signed-off-by: Anup Patel Cc: stable@vger.kernel.org --- drivers/rpmsg/virtio_rpmsg_bus.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/drivers/rpmsg/virtio_rpmsg_bus.c b/drivers/rpmsg/virtio_rpmsg_bus.c index 82b8300..7f8710a 100644 --- a/drivers/rpmsg/virtio_rpmsg_bus.c +++ b/drivers/rpmsg/virtio_rpmsg_bus.c @@ -64,6 +64,7 @@ struct virtproc_info { struct virtio_device *vdev; struct virtqueue *rvq, *svq; + struct device *bufs_dev; void *rbufs, *sbufs; unsigned int num_bufs; unsigned int buf_size; @@ -924,9 +925,16 @@ static int rpmsg_probe(struct virtio_device *vdev) total_buf_space, &vrp->bufs_dma, GFP_KERNEL); if (!bufs_va) { - err = -ENOMEM; - goto vqs_del; - } + bufs_va = dma_alloc_coherent(vdev->dev.parent, + total_buf_space, &vrp->bufs_dma, + GFP_KERNEL); + if (!bufs_va) { + err = -ENOMEM; + goto vqs_del; + } else + vrp->bufs_dev = vdev->dev.parent; + } else + vrp->bufs_dev = vdev->dev.parent->parent; dev_dbg(&vdev->dev, "buffers: va %p, dma %pad\n", bufs_va, &vrp->bufs_dma); @@ -988,7 +996,7 @@ static int rpmsg_probe(struct virtio_device *vdev) return 0; free_coherent: - dma_free_coherent(vdev->dev.parent->parent, total_buf_space, + dma_free_coherent(vrp->bufs_dev, total_buf_space, bufs_va, vrp->bufs_dma); vqs_del: vdev->config->del_vqs(vrp->vdev); @@ -1023,7 +1031,7 @@ static void rpmsg_remove(struct virtio_device *vdev) vdev->config->del_vqs(vrp->vdev); - dma_free_coherent(vdev->dev.parent->parent, total_buf_space, + dma_free_coherent(vrp->bufs_dev, total_buf_space, vrp->rbufs, vrp->bufs_dma); kfree(vrp);