Received: by 2002:a05:6a10:9afc:0:0:0:0 with SMTP id t28csp330473pxm; Wed, 2 Mar 2022 16:33:44 -0800 (PST) X-Google-Smtp-Source: ABdhPJzgmwaB3E4bY8vnYkTufN66gSMN2c3+8dkM1mnJqT0Lhi0c2byiX8W7A6O+CKNgDDZBKSJP X-Received: by 2002:a63:5805:0:b0:378:975b:bc88 with SMTP id m5-20020a635805000000b00378975bbc88mr15450838pgb.501.1646267624056; Wed, 02 Mar 2022 16:33:44 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1646267624; cv=none; d=google.com; s=arc-20160816; b=gbiGN8XLbIgxC7CVH2HyhybVuZPfZoldrA49dMskFD0m7Jecswc3RbCczZTC/fDrlV 3pKnju89WDpv6+SOnWs8ynnC+1VQAWjmvGUTpFs2ddKM9HsuVTYTaKeCwukU8Lzij02z AiaQ6xfqgSWnC85hGsAT9QhBQWZBn6ewAxgd8vaAihXnKSC0eUywmJZdRSyXw3L0p/Xb zmnuzbsNK6+ZhnrwL3EU9i5EAeJi1BwzDkjovRJKZCi70OEsjwa7/txumMLZDnkQ5d6M O6Q71ONIaPdJHMxIsGxXLM1rTLBhVG3vOjFbk9+HpU3Vcg3N0LMHd3YZgULr7lJH796/ WafA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:cc:to:subject :message-id:date:from:in-reply-to:references:mime-version :dkim-signature; bh=U7HKj6OXNpn8w0FHPBjThBjt7E+v6QRWEFLnATeT8R8=; b=s88Lzis6llOlmRPEwboEYuGVzjsoRshKgVfTCgNaDZENo4C2ndZ+Kj7/IMpYMsG1z0 c3PFe8p8zOCpsOzN2KsWZk5vrsHepomU5mUkAER1+4dzWPYNgZj/TolFPecGq060vUiH 7hDUvEnKM0bDDifa26LMEG2mT57rzWFNtXH9WGvOQyE+V3dgt1pdQyz64z0nSrPX/F/d BjC4bntUWeavi9cYvfaXWiL5y8V136rXj7DlemjeEN7/p1ufbvVMDq7alcKTRoJNC4ys NA1Xo0cLFI/r3+2P+vv6bQVYP/pz6G4Drco489Ncc8d9G9EMOYqTw26QqksePIwWqQBc aRtw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@jms.id.au header.s=google header.b=WLBMwCy6; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [2620:137:e000::1:18]) by mx.google.com with ESMTPS id f17-20020a635551000000b0036527667e60si538934pgm.17.2022.03.02.16.33.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 02 Mar 2022 16:33:44 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) client-ip=2620:137:e000::1:18; Authentication-Results: mx.google.com; dkim=pass header.i=@jms.id.au header.s=google header.b=WLBMwCy6; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id CB67848899; Wed, 2 Mar 2022 15:43:51 -0800 (PST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229591AbiCBWtO (ORCPT + 99 others); Wed, 2 Mar 2022 17:49:14 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57856 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229471AbiCBWtL (ORCPT ); Wed, 2 Mar 2022 17:49:11 -0500 Received: from mail-qk1-x735.google.com (mail-qk1-x735.google.com [IPv6:2607:f8b0:4864:20::735]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 79B12532F3; Wed, 2 Mar 2022 14:48:16 -0800 (PST) Received: by mail-qk1-x735.google.com with SMTP id c7so2578849qka.7; Wed, 02 Mar 2022 14:48:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jms.id.au; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=U7HKj6OXNpn8w0FHPBjThBjt7E+v6QRWEFLnATeT8R8=; b=WLBMwCy66RwK5pcbN9MO2NlCO4R1IBn7Qs7xVB0w98jILthSuRoLP8XafWWl4uPv1O hVR0NCzTtmbukMx4/j2QaOu2Gjj2iacZYdj2peE2rq+d3x+v8oVqOqlqLMUnGuYW9n+9 SZfkcjilAsboHEAwkHUUMgr9870oCc6/lY6vo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=U7HKj6OXNpn8w0FHPBjThBjt7E+v6QRWEFLnATeT8R8=; b=lAOdqCFItRjZIxNiSbB8dTwxOq8otj3dZKD240voHMCeJq9veeqf9fchN0HLHxw9od 0vkLUDESRq55VSdWx9X/Ek+xEDbOGJWq6hR0D6j0yP9H6oZYx4fqjA/fbvI2yXMFrj2w OYGmYH25vsBHgI47Or3z4/dFvR7rdfa1gGKVNAv+YM2uxamWBmT40K0xY/2AVme9nVGO Pk5J4XrYpSWQ9W36rug6bSCVxjJFgljVMRB+sGx1X46calaLByT9Y733llQ50hKhoY8N A2t4lC2D2Rrbs+dBhLm5nFIAkCvz03hyKlg0Qs/e8YUh3zWJaEXratw3ohDrxTh+me1D B1Ng== X-Gm-Message-State: AOAM5322tEvuVVlv40Eo0ba4x+saiCo+r7GZiwE3aTQsxbQzw0rvmLXg ndVW6lBR2Zil5eWjE5hggs5ESIZ84xVisSN4+vPvS+35FTZeFw== X-Received: by 2002:a37:a147:0:b0:47a:be0e:4a0c with SMTP id k68-20020a37a147000000b0047abe0e4a0cmr16940793qke.165.1646261292872; Wed, 02 Mar 2022 14:48:12 -0800 (PST) MIME-Version: 1.0 References: <20220302173114.927476-1-clg@kaod.org> <20220302173114.927476-6-clg@kaod.org> In-Reply-To: <20220302173114.927476-6-clg@kaod.org> From: Joel Stanley Date: Wed, 2 Mar 2022 22:48:00 +0000 Message-ID: Subject: Re: [PATCH v2 05/10] spi: aspeed: Add support for direct mapping To: =?UTF-8?Q?C=C3=A9dric_Le_Goater?= Cc: linux-spi@vger.kernel.org, linux-mtd , Mark Brown , Tudor Ambarus , Pratyush Yadav , Miquel Raynal , Richard Weinberger , Vignesh Raghavendra , linux-aspeed , Andrew Jeffery , Chin-Ting Kuo , devicetree , Rob Herring , Linux ARM , Linux Kernel Mailing List Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RDNS_NONE,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, 2 Mar 2022 at 17:31, C=C3=A9dric Le Goater wrote: > > Use direct mapping to read the flash device contents. This operation > mode is called "Command mode" on Aspeed SoC SMC controllers. It uses a > Control Register for the settings to apply when a memory operation is > performed on the flash device mapping window. > > If the window is not big enough, fall back to the "User mode" to > perform the read. > > Since direct mapping now handles all reads of the flash device > contents, also use memcpy_fromio for other address spaces, such as > SFDP. > > Direct mapping for writes will come later when validated. > > Signed-off-by: C=C3=A9dric Le Goater Reviewed-by: Joel Stanley > --- > drivers/spi/spi-aspeed-smc.c | 67 ++++++++++++++++++++++++++++++++++-- > 1 file changed, 65 insertions(+), 2 deletions(-) > > diff --git a/drivers/spi/spi-aspeed-smc.c b/drivers/spi/spi-aspeed-smc.c > index 688f9472e0d7..b4854b521477 100644 > --- a/drivers/spi/spi-aspeed-smc.c > +++ b/drivers/spi/spi-aspeed-smc.c > @@ -324,8 +324,8 @@ static int do_aspeed_spi_exec_op(struct spi_mem *mem,= const struct spi_mem_op *o > if (!op->addr.nbytes) > ret =3D aspeed_spi_read_reg(chip, op); > else > - ret =3D aspeed_spi_read_user(chip, op, op->addr.v= al, > - op->data.nbytes, op->d= ata.buf.in); > + memcpy_fromio(op->data.buf.in, chip->ahb_base + o= p->addr.val, > + op->data.nbytes); > } else { > if (!op->addr.nbytes) > ret =3D aspeed_spi_write_reg(chip, op); > @@ -405,10 +405,73 @@ static int aspeed_spi_chip_set_default_window(struc= t aspeed_spi_chip *chip) > return chip->ahb_window_size ? 0 : -1; > } > > +static int aspeed_spi_dirmap_create(struct spi_mem_dirmap_desc *desc) > +{ > + struct aspeed_spi *aspi =3D spi_controller_get_devdata(desc->mem-= >spi->master); > + struct aspeed_spi_chip *chip =3D &aspi->chips[desc->mem->spi->chi= p_select]; > + struct spi_mem_op *op =3D &desc->info.op_tmpl; > + u32 ctl_val; > + int ret =3D 0; > + > + chip->clk_freq =3D desc->mem->spi->max_speed_hz; > + > + /* Only for reads */ > + if (op->data.dir !=3D SPI_MEM_DATA_IN) > + return -EOPNOTSUPP; > + > + if (desc->info.length > chip->ahb_window_size) > + dev_warn(aspi->dev, "CE%d window (%dMB) too small for map= ping", > + chip->cs, chip->ahb_window_size >> 20); > + > + /* Define the default IO read settings */ > + ctl_val =3D readl(chip->ctl) & ~CTRL_IO_CMD_MASK; > + ctl_val |=3D aspeed_spi_get_io_mode(op) | > + op->cmd.opcode << CTRL_COMMAND_SHIFT | > + CTRL_IO_DUMMY_SET(op->dummy.nbytes / op->dummy.buswidth) = | > + CTRL_IO_MODE_READ; > + > + /* Tune 4BYTE address mode */ > + if (op->addr.nbytes) { > + u32 addr_mode =3D readl(aspi->regs + CE_CTRL_REG); > + > + if (op->addr.nbytes =3D=3D 4) > + addr_mode |=3D (0x11 << chip->cs); > + else > + addr_mode &=3D ~(0x11 << chip->cs); > + writel(addr_mode, aspi->regs + CE_CTRL_REG); > + } > + > + /* READ mode is the controller default setting */ > + chip->ctl_val[ASPEED_SPI_READ] =3D ctl_val; > + writel(chip->ctl_val[ASPEED_SPI_READ], chip->ctl); > + > + dev_info(aspi->dev, "CE%d read buswidth:%d [0x%08x]\n", > + chip->cs, op->data.buswidth, chip->ctl_val[ASPEED_SPI_RE= AD]); > + > + return ret; > +} > + > +static int aspeed_spi_dirmap_read(struct spi_mem_dirmap_desc *desc, > + u64 offset, size_t len, void *buf) > +{ > + struct aspeed_spi *aspi =3D spi_controller_get_devdata(desc->mem-= >spi->master); > + struct aspeed_spi_chip *chip =3D &aspi->chips[desc->mem->spi->chi= p_select]; > + > + /* Switch to USER command mode if mapping window is too small */ > + if (chip->ahb_window_size < offset + len) > + aspeed_spi_read_user(chip, &desc->info.op_tmpl, offset, l= en, buf); > + else > + memcpy_fromio(buf, chip->ahb_base + offset, len); > + > + return len; > +} > + > static const struct spi_controller_mem_ops aspeed_spi_mem_ops =3D { > .supports_op =3D aspeed_spi_supports_op, > .exec_op =3D aspeed_spi_exec_op, > .get_name =3D aspeed_spi_get_name, > + .dirmap_create =3D aspeed_spi_dirmap_create, > + .dirmap_read =3D aspeed_spi_dirmap_read, > }; > > static void aspeed_spi_chip_set_type(struct aspeed_spi *aspi, unsigned i= nt cs, int type) > -- > 2.34.1 >