Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp1509365yba; Thu, 4 Apr 2019 12:13:55 -0700 (PDT) X-Google-Smtp-Source: APXvYqxCfSa2fp4vYgQmE7Cl/Lsk9a4th84u7t6emfc5SHMuXHbuHlVBvWekMRc+sm/b2mL2k+L0 X-Received: by 2002:a65:6091:: with SMTP id t17mr7592809pgu.328.1554405234969; Thu, 04 Apr 2019 12:13:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1554405234; cv=none; d=google.com; s=arc-20160816; b=IAjOT75Xh0rzr+8aWM5Gx9Ih8Hljkl6gw1bkRfqgxUYkJ3vByH/cNkU+s9Uz3WgFoL BNSlB/oi8NkC3N/6oKHgEezSipR4mdFO1hF71JCQbHt9EAHdfjWGM3ApW5rU/RfVNsnp xFPfxqFXuiSzZXKS8BslFks48htxc1mguaA3MavPubeBMxw7Z0nXRWgBUsgFXT3isIBG 2f/QBmW8RIB8fw99Dpx2sYDxy5ZXwBTd4b9LAZl8vcSAgFDrJLvIfiX2J/pSGfIxq3RG UtZbJ+ihRvHwyGXtVqbBBU85RXtYwhn1pbeuXr54W5R/F8+NSuua5dVRDnbI0Dj6wBBI D8+Q== 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 :organization:references:in-reply-to:message-id:subject:cc:to:from :date; bh=PFEy9uH0LUxNv5wE0WP9smPmaBIWaYRxSIO5uCpJ3ms=; b=iWMQwSvqqNAjDskJr+05DhfnKINWnUWKD+oxLMB3S9Iw5+jj5gX+SNoRWuxrxlg4Ua imGFO9uFUZEUTidE53y7pqrHp9HJhHy2/G4QdpisqFdnO7dlBznYWFg69weLLukgVKlI XLX5JQtmyAD74uJ00F1j/UDMQrUmN1+Js3BEeP1yplC1MWD9oK3eR1yHhhxwGsivxV+y v2Rx+3Sb04mwH88aIwA8j4JDl+gi0Gs42XYU+sviy/DthJPMm3AqDZXeOYbfLWp260fK fsshI3/kMRX5VhGWPTpncqYFnvVacGmTLLeW0oh5dHRusmx1ywzTlWKjhd8YoH9W4wb2 4uwg== 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=collabora.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id x3si16697754pll.268.2019.04.04.12.13.39; Thu, 04 Apr 2019 12:13:54 -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=collabora.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730204AbfDDTMk (ORCPT + 99 others); Thu, 4 Apr 2019 15:12:40 -0400 Received: from bhuna.collabora.co.uk ([46.235.227.227]:59940 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729908AbfDDTMk (ORCPT ); Thu, 4 Apr 2019 15:12:40 -0400 Received: from localhost (unknown [IPv6:2a01:e0a:2c:6930:5cf4:84a1:2763:fe0d]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: bbrezillon) by bhuna.collabora.co.uk (Postfix) with ESMTPSA id 92A9A282B70; Thu, 4 Apr 2019 20:12:37 +0100 (BST) Date: Thu, 4 Apr 2019 21:12:34 +0200 From: Boris Brezillon To: Sergei Shtylyov Cc: masonccyang@mxic.com.tw, bbrezillon@kernel.org, broonie@kernel.org, devicetree@vger.kernel.org, Geert Uytterhoeven , Simon Horman , juliensu@mxic.com.tw, lee.jones@linaro.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-spi@vger.kernel.org, marek.vasut@gmail.com, mark.rutland@arm.com, robh+dt@kernel.org, zhengxunli@mxic.com.tw Subject: Re: [PATCH v9 2/3] spi: Add Renesas R-Car Gen3 RPC-IF SPI controller driver Message-ID: <20190404211234.5468e7a4@collabora.com> In-Reply-To: <7467d695-8922-16b2-03d4-fb4bbdda125a@cogentembedded.com> References: <1553847606-18122-1-git-send-email-masonccyang@mxic.com.tw> <1553847606-18122-3-git-send-email-masonccyang@mxic.com.tw> <231f7423-bf13-99f8-427b-530f5446348b@cogentembedded.com> <6d60bbef-a8ef-849e-33f3-3db35cefc09f@cogentembedded.com> <7467d695-8922-16b2-03d4-fb4bbdda125a@cogentembedded.com> Organization: Collabora X-Mailer: Claws Mail 3.17.3 (GTK+ 2.24.32; x86_64-redhat-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, 4 Apr 2019 21:56:19 +0300 Sergei Shtylyov wrote: > Hello! > > On 04/03/2019 12:20 PM, masonccyang@mxic.com.tw wrote: > > >> >> > +static void rpc_spi_mem_set_prep_op_cfg(struct spi_device *spi, > >> >> > + const struct spi_mem_op *op, > >> >> > + u64 *offs, size_t *len) > >> >> > +{ > >> >> > + struct rpc_spi *rpc = spi_controller_get_devdata(spi->controller); > >> >> > + > >> >> > + rpc->cmd = RPC_SMCMR_CMD(op->cmd.opcode); > >> >> > + rpc->smenr = RPC_SMENR_CDE | > >> >> > + RPC_SMENR_CDB(ilog2(op->cmd.buswidth)); > >> >> > + rpc->totalxferlen = 1; > >> >> > + rpc->xfer_dir = SPI_MEM_NO_DATA; > >> >> > + rpc->xferlen = 0; > >> >> > + rpc->addr = 0; > >> >> > + > >> >> > + if (op->addr.nbytes) { > >> >> > + rpc->smenr |= RPC_SMENR_ADB(ilog2(op->addr.buswidth)); > >> >> > + if (op->addr.nbytes == 4) > >> >> > + rpc->smenr |= RPC_SMENR_ADE(0xf); > >> >> > + else > >> >> > + rpc->smenr |= RPC_SMENR_ADE(0x7); > >> >> > + > >> >> > + if (offs && len) > >> >> > + rpc->addr = *offs; > >> >> > + else > >> >> > + rpc->addr = op->addr.val; > >> >> > + rpc->totalxferlen += op->addr.nbytes; > >> >> > + } > >> >> > + > >> >> > + if (op->dummy.nbytes) { > >> >> > + rpc->smenr |= RPC_SMENR_DME; > >> >> > + rpc->dummy = RPC_SMDMCR_DMCYC(op->dummy.nbytes); > >> >> > >> >> So you haven't fixed this bug? I repeat, the driver doesn't work right > >> >> w/o this fixed! > >> > > >> > Do you mean > >> > > >> > rpc->dummy = RPC_SMDMCR_DMCYC(op->dummy.nbytes) * 8; ? > >> > >> Yes. Or some other code that amounts to it. > > Oops, I wasn't attentive enough, I was proposing: > > rpc->dummy = RPC_SMDMCR_DMCYC(op->dummy.nbytes * 8); > > > why not setting "op->dummy.nbytes = 7" from spi-nor.c protocol layer ? > > We want 8 dummy clocks, not 8 dummy bytes. And if you'd looked into > spi_nor_read_sfdp(), you'd have seen that it requests 8 dummy clocks already. > > > driver may check device ID or something else to setup op->dummy.nbytes. > > The RDSFDP command is not chip specific. > > > I think it is not a good idea to *8 in spi host driver. > > >> > What is your flash part number? > >> > >> Spansion/Cypress S25FS512S. The datasheet says there must be 8 dummy cycles > >> for the RSFDP command... > >> > >> > The problem you found is in 1 bit or 4 bits width ? > >> > >> 1-bit, I think. > >> > >> >> > >> >> [...] > >> >> > +static ssize_t rpc_spi_mem_dirmap_read(struct spi_mem_dirmap_desc *desc, > >> >> > + u64 offs, size_t len, void *buf) > >> >> > +{ > >> >> > + struct rpc_spi *rpc = > >> >> > + spi_controller_get_devdata(desc->mem->spi->controller); > >> >> > + int ret; > >> >> > + > >> >> > + if (offs + desc->info.offset + len > U32_MAX) > >> >> > + return -EINVAL; > >> >> > + > >> >> > + if (len > 0x4000000) > >> >> > + len = 0x4000000; > >> >> > >> >> Ugh... > >> > > >> > by mtd->size ? > >> > >> That'd be better, yes. > >> > > > > Oops, it seems hard to get mtd->size info. from spi_mem_dirmap, > > It's in desc->info.length, no? It's the lengths of the mapping which not necessarily mtd->size, but in the SPI NOR case it is :-). Anyway, you should not assume dirmapdesc->info.length == memory_device->size. > > > I would like to keep 0x4000000. > > I'm seeing Boris in the CC's... Boris, is it legitimate to limit > a single dirmap read by the memory "window" size? Or should we try to > serve any valid transfer length? If by memory window you're talking about the memory region reserved in the CPU address space, then no. It should not be limited to this size if possible. Most HW have a way to configure an offset to apply to the spi-mem operation, and in that case, the driver should change this offset on the fly when one tries to access a region that's outside of the currently configured window. > > >> >> > + > >> >> > + ret = rpc_spi_set_freq(rpc, desc->mem->spi->max_speed_hz); > >> >> > + if (ret) > >> >> > + return ret; > >> >> > + > >> >> > + rpc_spi_mem_set_prep_op_cfg(desc->mem->spi, > >> >> > + &desc->info.op_tmpl, &offs, &len); > >> >> > + > >> >> > + regmap_update_bits(rpc->regmap, RPC_CMNCR, RPC_CMNCR_MD, 0); > >> >> > + regmap_write(rpc->regmap, RPC_DRCR, RPC_DRCR_RBURST(32) | > >> >> > + RPC_DRCR_RBE); > >> >> > + > >> >> > + regmap_write(rpc->regmap, RPC_DRCMR, rpc->cmd); > >> >> > + regmap_write(rpc->regmap, RPC_DREAR, RPC_DREAR_EAC(1)); > >> >> > >> >> So you're not even trying to support flashes larger than the > >> read dirmap? > >> >> Now I don't think it's acceptable (and I have rewritten this code > >> internally). > >> > > >> > what about the size comes form mtd->size ? > >> > >> I'm not talking about size here; we should use the full address. > >> I'm attaching > >> my patch... > > > > okay,got it! > > what about just > > - regmap_write(rpc->mfd->regmap, RPC_DREAR, RPC_DREAR_EAC(1)); > > + regmap_write(rpc->mfd->regmap, RPC_DREAR, > > + RPC_DREAR_EAV(offs >> 25) | RPC_DREAR_EAC(1)); > > > > because only > 64MByte size make RPC_DREAR_EAV() work. > > Boris, what's your opinion on this? > Note that for the write dirmap we have just 256-byte buffer (reusing > the read cache). Is it legitimate to limit the served length to 256 bytes? I don't know what the HW is capable of, but drivers should use any try they have to dynamically move the memory map window (make it point at a different spi-mem offset on demand). Note that dirmap_read/write() are allowed to return less than the amount of data requested, in that case the caller should continue reading at the offset where things stopped. This avoids having to implement a loop that splits things in several accesses when the access cannot be done in one step.