Received: by 2002:a25:86ce:0:0:0:0:0 with SMTP id y14csp1216069ybm; Tue, 21 May 2019 10:22:04 -0700 (PDT) X-Google-Smtp-Source: APXvYqwW+UvXo2/IhY3r9keElQeq/bJzM2hmBojrhbYTviIoigEqRjLofc63BU6rkyBJr3TT/yOt X-Received: by 2002:a17:902:3fa5:: with SMTP id a34mr56366428pld.297.1558459324036; Tue, 21 May 2019 10:22:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1558459324; cv=none; d=google.com; s=arc-20160816; b=eLHYCi3phftER7t3czgYJhZZg3CioFTTkh6O9Q7dNagQBsc+rC5beSFFfyvBVpqgkY e0gc7r1Rb/LnY1tEfrQKXvqR8HP4I77aV9Vd5L87iSLlLoxK1ocfD05RvT/E0AMc99SS Z21LWp3A8QyWhCZ0Rci4mW/1fPK9Eefi0+7rXlqCuUl6U7Kp8mSOaH3E3bqyQ5tjKpnW KD4OyLyp3+SYI4uNr3KGnYwOv4+glNmsvlQsH+UCGS7ufyEAsP7DMsjBlUJYxUdFFMuw phCFDXNRBXLrS49GSp3QbAc52sONxLtFk+BsKBc3PGKOB0vHAJy2YtqRdrpIZJJs+2Ow 6M1w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:message-id:in-reply-to :subject:cc:to:from:date; bh=V5vqcLxdZaeLMvmGk6v0oohcry6AjGn4oOyPNztV3jc=; b=rhYROjuDRBXIEN8v+rr+qgHpv65d/aBSUL5qPoZq1YtkyFspzThfKxL3O6cEoHAf6M XfzJWTFjdndo3+4DITULSK4Sa0MRz3uesDRE5/6JrLqKNQpGl1KOOSB0EVISuFSQT580 5v6B/t3C1QNlcJD81jofWXbbf7D70XlQZ2mmWzlSP7mQr2Rfw50drHngI6djGTo3mvxG dHcst++c3HkMgFUjc1fDQZLprYIJSiYu+BjeSRQ79vf4jOSTbeGfwGTdqOZAOusDflRw twflssY3KSa2qWLriJxKtXcuk2csK20oO2DuxugQJeW/0d8JlcQiEkezzJ0SbJpZnHV8 plcA== 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d23si20459899pgd.198.2019.05.21.10.21.48; Tue, 21 May 2019 10:22:04 -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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729093AbfEURU0 (ORCPT + 99 others); Tue, 21 May 2019 13:20:26 -0400 Received: from iolanthe.rowland.org ([192.131.102.54]:33696 "HELO iolanthe.rowland.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1727990AbfEURU0 (ORCPT ); Tue, 21 May 2019 13:20:26 -0400 Received: (qmail 6374 invoked by uid 2102); 21 May 2019 13:20:25 -0400 Received: from localhost (sendmail-bs@127.0.0.1) by localhost with SMTP; 21 May 2019 13:20:25 -0400 Date: Tue, 21 May 2019 13:20:25 -0400 (EDT) From: Alan Stern X-X-Sender: stern@iolanthe.rowland.org To: Laurentiu Tudor cc: hch@lst.de, , , , , , , , Subject: Re: [PATCH v5 2/5] USB: use genalloc for USB HCs with local memory In-Reply-To: <20190521140748.20012-3-laurentiu.tudor@nxp.com> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, 21 May 2019 laurentiu.tudor@nxp.com wrote: > From: Laurentiu Tudor > > For HCs that have local memory, replace the current DMA API usage > with a genalloc generic allocator to manage the mappings for these > devices. To help users, introduce a new HCD API, > usb_hcd_setup_local_mem() that will setup up the genalloc backing > up the device local memory. It will be used in subsequent patches. > This is in preparation for dropping the existing "coherent" dma > mem declaration APIs. Current implementation was relying on a short > circuit in the DMA API that in the end, was acting as an allocator > for these type of devices. > > For context, see thread here: https://lkml.org/lkml/2019/4/22/357 > > Signed-off-by: Laurentiu Tudor > Signed-off-by: Fredrik Noring > --- > --- a/drivers/usb/core/hcd.c > +++ b/drivers/usb/core/hcd.c > @@ -29,6 +29,8 @@ > #include > #include > #include > +#include > +#include > > #include > #include > @@ -3039,6 +3041,40 @@ usb_hcd_platform_shutdown(struct platform_device *dev) > } > EXPORT_SYMBOL_GPL(usb_hcd_platform_shutdown); > > +int usb_hcd_setup_local_mem(struct usb_hcd *hcd, phys_addr_t phys_addr, > + dma_addr_t dma, size_t size) > +{ > + int err; > + void __iomem *local_mem; > + > + hcd->localmem_pool = devm_gen_pool_create(hcd->self.sysdev, PAGE_SHIFT, > + dev_to_node(hcd->self.sysdev), > + "ohci-hcd"); Surely that string is a mistake. You could use dev_name(hcd->self.sysdev) or a name passed by the caller. > + if (IS_ERR(hcd->localmem_pool)) > + return PTR_ERR(hcd->localmem_pool); > + > + local_mem = devm_memremap(hcd->self.sysdev, phys_addr, > + size, MEMREMAP_WC); > + if (!local_mem) > + return -ENOMEM; > + > + /* > + * Here we pass a dma_addr_t but the arg type is a phys_addr_t. > + * It's not backed by system memory and thus there's no kernel mapping > + * for it. > + */ > + err = gen_pool_add_virt(hcd->localmem_pool, (unsigned long)local_mem, > + dma, size, dev_to_node(hcd->self.sysdev)); > + if (err < 0) { > + dev_err(hcd->self.sysdev, "gen_pool_add_virt failed with %d\n", > + err); > + return err; > + } > + > + return 0; > +} > +EXPORT_SYMBOL_GPL(usb_hcd_setup_local_mem); If you have a usb_hcd_setup_local_mem() function then you should also have a usb_hcd_remove_local_mem() function. > --- a/drivers/usb/host/ohci-mem.c > +++ b/drivers/usb/host/ohci-mem.c > @@ -36,6 +36,12 @@ static void ohci_hcd_init (struct ohci_hcd *ohci) > > static int ohci_mem_init (struct ohci_hcd *ohci) > { > + if (ohci_to_hcd(ohci)->localmem_pool) { > + ohci->td_cache = NULL; > + ohci->ed_cache = NULL; > + return 0; > + } This really isn't necessary. The entire ohci_hcd structure is initialized to 0 when it is first allocated. > --- a/include/linux/usb/hcd.h > +++ b/include/linux/usb/hcd.h > @@ -216,6 +216,9 @@ struct usb_hcd { > #define HC_IS_RUNNING(state) ((state) & __ACTIVE) > #define HC_IS_SUSPENDED(state) ((state) & __SUSPEND) > > + /* allocator for HCs having local memory */ "allocator" is the wrong word -- an allocator is something that allocates. Perhaps "memory area" or something along those lines. Alan Stern