Received: by 2002:ac0:a5a7:0:0:0:0:0 with SMTP id m36-v6csp3311394imm; Mon, 13 Aug 2018 09:25:32 -0700 (PDT) X-Google-Smtp-Source: AA+uWPwLxLN4v62WedukHcfuxPkJjr3c8dFK44vW4tSBr1Eo2dk0Ir470b91Md9Zkh4ybJUjIzUN X-Received: by 2002:a17:902:aa46:: with SMTP id c6-v6mr17014989plr.313.1534177532214; Mon, 13 Aug 2018 09:25:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1534177532; cv=none; d=google.com; s=arc-20160816; b=0KL82q/u+/lVbju+OeiVVZdHUAidYJAKFBz1jBJCov5O2w3q3q+fzi3nFV1vMSy9Km CBMTT28X8vvt6ExaY4QjV+HRBok5dwJUnjEk5/hW3vnYa/Bla1CIq9s44Lxik4wr5EQu j0yHT/M2WFJ4cI7fQS71NJ/wcw/HeOePiCXMpOkLpwHy+Ev1tbsosRZ1eo4YUC6i+Gpl 7cVCoAIcMHDf1HnDZWg6bE23Yijeh2hXy+eivzzEiGmpxrILeMWLADBr8t2r3hYMbVuq I9vGGk2I7Nf1ffYCLlCu9j+I6QgaE78OnWUD03vdi5XooqzIpW4OMhbWBzOBWOVWNT7v XUlA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:content-transfer-encoding :content-language:accept-language:references:message-id:date :thread-index:thread-topic:subject:cc:to:from:dkim-signature :arc-authentication-results; bh=4K5wI47rse7QjPTzkXaiBhNUSRLjaGqA+lj2kKZUo1A=; b=FDJWUcJ35HC7Wie3GaV5paIk/KsUfITQEUFqvk9bFeCnv6g50ZOAsqZf7VOz6pmmX+ HzqJn55yQpumcCmwNmF7Wof7msajisnXB7JSszaPgaNoti2MOM6g9FXGNXHUeFW8YBc/ MxmafEL7QRPIo6wq5nb/GHSz1InScFDUgyad7UYU89VXe/q0rwOZeeKIhWo8WOdcGRk0 OOZtrvcJ0BhUubfZdbyamJ1/Dk+P9I39PpdPeK8z6GswFYqotljtRD5TjWMKU/WQFGzq OXme9PZp9wFcM4P+IXMxE0mpBfs9djL6u4sjYJhDjFV7yYVt+uCZt+d72H7hgTWRsgop z8uQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@synopsys.com header.s=mail header.b=fZ3FH6Rm; 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=pass (p=NONE sp=NONE dis=NONE) header.from=synopsys.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 3-v6si9580972plx.173.2018.08.13.09.25.16; Mon, 13 Aug 2018 09:25:32 -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=@synopsys.com header.s=mail header.b=fZ3FH6Rm; 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=pass (p=NONE sp=NONE dis=NONE) header.from=synopsys.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729900AbeHMTG7 (ORCPT + 99 others); Mon, 13 Aug 2018 15:06:59 -0400 Received: from smtprelay.synopsys.com ([198.182.47.9]:56045 "EHLO smtprelay.synopsys.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728293AbeHMTG7 (ORCPT ); Mon, 13 Aug 2018 15:06:59 -0400 Received: from mailhost.synopsys.com (mailhost2.synopsys.com [10.13.184.66]) by smtprelay.synopsys.com (Postfix) with ESMTP id E89F124E0262; Mon, 13 Aug 2018 09:24:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=synopsys.com; s=mail; t=1534177444; bh=ulOtXWp9+aW67dMzvtRC+8eVZhNBcXIrdFhBsI3athI=; h=From:To:CC:Subject:Date:References:From; b=fZ3FH6RmyCE1/QIvcn43fJNTTs+nnVf+6Lz7Xq0yANk9QdZ8m8rTvdfzIBNzxo2ur m9KECSjn+PkqfKol8wqQfT9XdSXZcLvVyyt4CDmXJ9FQCzFPzjQx2mqD/z+gXUD62L hO2wviD5L9tfNyd+B/vXofSRoFrcpMdTt1scwrsFr3egAL6UhKV5Y/bs5qOHu8eVBm I/nhHdYS/ZmpA8CdMfzBAaIRFeuer5fy60bYQRr2PKZcCyayN9zlpVKj3EveGornaM rPm9ghlnITV1ym0x0MK6VxuXub4wKvdYazPKy1vmY+g3j5Uz9jkprl0eMhDysF6GLX WxdbQUNCBBdKw== Received: from US01WXQAHTC1.internal.synopsys.com (us01wxqahtc1.internal.synopsys.com [10.12.238.230]) by mailhost.synopsys.com (Postfix) with ESMTP id D85A53DF3; Mon, 13 Aug 2018 09:24:03 -0700 (PDT) Received: from us01wembx1.internal.synopsys.com ([169.254.1.253]) by US01WXQAHTC1.internal.synopsys.com ([::1]) with mapi id 14.03.0361.001; Mon, 13 Aug 2018 09:24:03 -0700 From: Vineet Gupta To: Eugeniy Paltsev , "linux-snps-arc@lists.infradead.org" CC: "linux-kernel@vger.kernel.org" , "linux-arch@vger.kernel.org" , Alexey Brodkin , "hch@lst.de" Subject: Re: [PATCH v2 2/4] ARC: allow to use IOC and non-IOC DMA devices simultaneously Thread-Topic: [PATCH v2 2/4] ARC: allow to use IOC and non-IOC DMA devices simultaneously Thread-Index: AQHUKCIcL8IFt0D6VUGgJAndTq4yWQ== Date: Mon, 13 Aug 2018 16:24:02 +0000 Message-ID: References: <20180730162636.3556-1-Eugeniy.Paltsev@synopsys.com> <20180730162636.3556-3-Eugeniy.Paltsev@synopsys.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.144.199.104] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 07/30/2018 09:26 AM, Eugeniy Paltsev wrote:=0A= > @@ -1263,11 +1254,7 @@ void __init arc_cache_init_master(void)=0A= > if (is_isa_arcv2() && ioc_enable)=0A= > arc_ioc_setup();=0A= > =0A= > - if (is_isa_arcv2() && ioc_enable) {=0A= > - __dma_cache_wback_inv =3D __dma_cache_wback_inv_ioc;=0A= > - __dma_cache_inv =3D __dma_cache_inv_ioc;=0A= > - __dma_cache_wback =3D __dma_cache_wback_ioc;=0A= > - } else if (is_isa_arcv2() && l2_line_sz && slc_enable) {=0A= > + if (is_isa_arcv2() && l2_line_sz && slc_enable) {=0A= > __dma_cache_wback_inv =3D __dma_cache_wback_inv_slc;=0A= > __dma_cache_inv =3D __dma_cache_inv_slc;=0A= > __dma_cache_wback =3D __dma_cache_wback_slc;=0A= > diff --git a/arch/arc/mm/dma.c b/arch/arc/mm/dma.c=0A= > index cefb776a99ff..4d1466905e48 100644=0A= > --- a/arch/arc/mm/dma.c=0A= > +++ b/arch/arc/mm/dma.c=0A= > @@ -33,19 +33,7 @@ void *arch_dma_alloc(struct device *dev, size_t size, = dma_addr_t *dma_handle,=0A= > if (!page)=0A= > return NULL;=0A= > =0A= > - /*=0A= > - * IOC relies on all data (even coherent DMA data) being in cache=0A= > - * Thus allocate normal cached memory=0A= > - *=0A= > - * The gains with IOC are two pronged:=0A= > - * -For streaming data, elides need for cache maintenance, saving=0A= > - * cycles in flush code, and bus bandwidth as all the lines of a=0A= > - * buffer need to be flushed out to memory=0A= > - * -For coherent data, Read/Write to buffers terminate early in cache= =0A= > - * (vs. always going to memory - thus are faster)=0A= > - */=0A= > - if ((is_isa_arcv2() && ioc_enable) ||=0A= > - (attrs & DMA_ATTR_NON_CONSISTENT))=0A= > + if (attrs & DMA_ATTR_NON_CONSISTENT)=0A= > need_coh =3D 0;=0A= > =0A= > /*=0A= > @@ -95,8 +83,7 @@ void arch_dma_free(struct device *dev, size_t size, voi= d *vaddr,=0A= > struct page *page =3D virt_to_page(paddr);=0A= > int is_non_coh =3D 1;=0A= > =0A= > - is_non_coh =3D (attrs & DMA_ATTR_NON_CONSISTENT) ||=0A= > - (is_isa_arcv2() && ioc_enable);=0A= > + is_non_coh =3D (attrs & DMA_ATTR_NON_CONSISTENT);=0A= > =0A= > if (PageHighMem(page) || !is_non_coh)=0A= > iounmap((void __force __iomem *)vaddr);=0A= > @@ -182,3 +169,20 @@ void arch_sync_dma_for_cpu(struct device *dev, phys_= addr_t paddr,=0A= > break;=0A= > }=0A= > }=0A= =0A= I think we have some shenanigans with @ioc_enable now.=0A= Do note that it was more of a debug hack using when the hw feature was intr= oduced=0A= to be able to run same kernel on various FPGA bitfiles but just flicking a = global=0A= variable via the debugger.=0A= =0A= So per code below, if @ioc_enable is NOT set, we still use software assiste= d cache=0A= maintenance, but dma_{alloc,free} don't do use that variable. Have you trie= d=0A= testing the combination when @ioc_enable is set to 0 before boot ? And is t= hat works ?=0A= =0A= > +=0A= > +void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,=0A= > + const struct iommu_ops *iommu, bool coherent)=0A= > +{=0A= > + /*=0A= > + * IOC hardware snoops all DMA traffic keeping the caches consistent=0A= > + * with memory - eliding need for any explicit cache maintenance of=0A= > + * DMA buffers - so we can use dma_direct cache ops.=0A= > + */=0A= > + if (is_isa_arcv2() && ioc_enable && coherent) {=0A= > + set_dma_ops(dev, &dma_direct_ops);=0A= > + dev_info(dev, "use dma_direct_ops cache ops\n");=0A= > + } else {=0A= > + set_dma_ops(dev, &dma_noncoherent_ops);=0A= > + dev_info(dev, "use dma_noncoherent_ops cache ops\n");=0A= > + }=0A= > +}=0A= =0A=