Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp1046677ybt; Tue, 7 Jul 2020 06:38:51 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy6FOADlblL1dK/atthmCjkWyNfGzrZEZAkl336GV8+d70EKvoJGDxONPJbS+ayvTRFYukS X-Received: by 2002:a17:906:a892:: with SMTP id ha18mr48483509ejb.462.1594129131708; Tue, 07 Jul 2020 06:38:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1594129131; cv=none; d=google.com; s=arc-20160816; b=sLTyZ9Z55XQvARU/OEfsJqRkz6bPUGPvOc5fdafqYU7EPShrDa3mLdFLsggo0O+sJA QYTZDWCghloeMIbSGW4ZUowETpk2ieODOxz3UllIBeoPn4ElD3SmyY8LaTu4UfRfcKE/ 6te6zqNGK97W4Cy8mIl0MSjIetGYg4TibZt3oLrLxQurdiNmAiNb4deUtYqOmLtotvdT Hp9KSIQr9i90hVwkq2rlgt5pilL4ZEb2jNRI4Hb7y0tp7ruZuJ43zlT4L0y6mgnspdRx VsgMz308GspR9TpX/4qxDHEWVGko2B+8UVPtYpawdAu4GfKHnyL2m8XTL6o4AsB6j/fm v5YA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-language :content-transfer-encoding:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:dmarc-filter :dkim-signature; bh=LZZpM5Sq9nJUd9VR8NYFaZSzGprpVL3iGnjSrySQ+fM=; b=KBFXvm0CS7M6rETYpvphgly1YHaIR5GvvzZbZDIRAIozPoTvL8W0Gyyh57tEXM8xvc pzPfxYcuk1y1so5ZIts8lM4tiHQ4bidSv8dw5j7ZwPyT3y8CWi57GSjah9+twlG47ktR Lovni4Y3CHt6bslBlAR2T52ISVhSycJNtcQwpWr2gyk/oN6Zq4oUrP4P7q/oVOZVsmSR Pcysh3rZrgycdy1s5pM2Gi04Jhny3QaVRSO9H2V+JQq352A1Bcww6uQxDpAq5uoOhotu zqtdbP4yhrg/gFIjxs/PHZuexmqkfchNJZcHZK46g4YiNvWlF7AJ8xvCrhUAgVWyn082 vNhg== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@mg.codeaurora.org header.s=smtp header.b=NofnNWoj; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id z14si14674315ejw.332.2020.07.07.06.38.28; Tue, 07 Jul 2020 06:38:51 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=fail header.i=@mg.codeaurora.org header.s=smtp header.b=NofnNWoj; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728248AbgGGNh7 (ORCPT + 99 others); Tue, 7 Jul 2020 09:37:59 -0400 Received: from m43-7.mailgun.net ([69.72.43.7]:33315 "EHLO m43-7.mailgun.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728020AbgGGNh7 (ORCPT ); Tue, 7 Jul 2020 09:37:59 -0400 DKIM-Signature: a=rsa-sha256; v=1; c=relaxed/relaxed; d=mg.codeaurora.org; q=dns/txt; s=smtp; t=1594129078; h=Content-Transfer-Encoding: Content-Type: In-Reply-To: MIME-Version: Date: Message-ID: From: References: Cc: To: Subject: Sender; bh=LZZpM5Sq9nJUd9VR8NYFaZSzGprpVL3iGnjSrySQ+fM=; b=NofnNWojcM5NQBsU7gZsR+C6JMmxv4HX3olo3AFzQZ5ZK+wxeXFuHlL2+32PX1/9WrhVE+dH dOg40ONesUTZeFdI6nXTtKkedbJ7wa3P2+O+KlcBdjXzexcSj7GzMVaBD0H0DuTtFj8Ie7G4 bnPcFcUbgcS8++FTF5zwp0kBE3E= X-Mailgun-Sending-Ip: 69.72.43.7 X-Mailgun-Sid: WyI0MWYwYSIsICJsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnIiwgImJlOWU0YSJd Received: from smtp.codeaurora.org (ec2-35-166-182-171.us-west-2.compute.amazonaws.com [35.166.182.171]) by smtp-out-n07.prod.us-west-2.postgun.com with SMTP id 5f047aaef97e988aabc8b7d0 (version=TLS1.2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256); Tue, 07 Jul 2020 13:37:50 GMT Received: by smtp.codeaurora.org (Postfix, from userid 1001) id 76C63C433CB; Tue, 7 Jul 2020 13:37:50 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-caf-mail-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.0 required=2.0 tests=ALL_TRUSTED,SPF_NONE, URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from [192.168.0.15] (unknown [183.83.138.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: akashast) by smtp.codeaurora.org (Postfix) with ESMTPSA id 2208EC433C8; Tue, 7 Jul 2020 13:37:45 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 2208EC433C8 Authentication-Results: aws-us-west-2-caf-mail-1.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: aws-us-west-2-caf-mail-1.web.codeaurora.org; spf=none smtp.mailfrom=akashast@codeaurora.org Subject: Re: [PATCH 3/3] spi: spi-geni-qcom: Get rid of most overhead in prepare_message() To: Douglas Anderson , Mark Brown , Andy Gross , Bjorn Andersson Cc: linux-arm-msm@vger.kernel.org, mkshah@codeaurora.org, swboyd@chromium.org, georgi.djakov@linaro.org, ctheegal@codeaurora.org, mka@chromium.org, linux-kernel@vger.kernel.org, linux-spi@vger.kernel.org References: <20200702004509.2333554-1-dianders@chromium.org> <20200701174506.3.I2b3d7aeb1ea622335482cce60c58d2f8381e61dd@changeid> From: Akash Asthana Message-ID: <2d54dadc-5e73-f40a-aa08-7c0cf4d16886@codeaurora.org> Date: Tue, 7 Jul 2020 19:07:43 +0530 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.9.0 MIME-Version: 1.0 In-Reply-To: <20200701174506.3.I2b3d7aeb1ea622335482cce60c58d2f8381e61dd@changeid> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-Language: en-US Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 7/2/2020 6:15 AM, Douglas Anderson wrote: > There's a bunch of overhead in spi-geni-qcom's prepare_message. Get > rid of it. Before this change spi_geni_prepare_message() took around > 14.5 us. After this change, spi_geni_prepare_message() takes about > 1.75 us (as measured by ftrace). > > What's here: > * We're always in FIFO mode, so no need to call it for every transfer. > This avoids a whole ton of readl/writel calls. > * We don't need to write a whole pile of config registers if the mode > isn't changing. Cache the last mode and only do the work if needed. > * For several registers we were trying to do read/modify/write, but > there was no reason. The registers only have one thing in them, so > just write them. > > Signed-off-by: Douglas Anderson > --- > > drivers/spi/spi-geni-qcom.c | 54 +++++++++++++++++-------------------- > 1 file changed, 24 insertions(+), 30 deletions(-) > > diff --git a/drivers/spi/spi-geni-qcom.c b/drivers/spi/spi-geni-qcom.c > index f51279608fc7..97fac5ea6afd 100644 > --- a/drivers/spi/spi-geni-qcom.c > +++ b/drivers/spi/spi-geni-qcom.c > @@ -77,6 +77,7 @@ struct spi_geni_master { > u32 tx_fifo_depth; > u32 fifo_width_bits; > u32 tx_wm; > + u32 last_mode; > unsigned long cur_speed_hz; > unsigned int cur_bits_per_word; > unsigned int tx_rem_bytes; > @@ -177,8 +178,6 @@ static void spi_setup_word_len(struct spi_geni_master *mas, u16 mode, > struct geni_se *se = &mas->se; > u32 word_len; > > - word_len = readl(se->base + SE_SPI_WORD_LEN); > - > /* > * If bits_per_word isn't a byte aligned value, set the packing to be > * 1 SPI word per FIFO word. > @@ -187,10 +186,9 @@ static void spi_setup_word_len(struct spi_geni_master *mas, u16 mode, > pack_words = mas->fifo_width_bits / bits_per_word; > else > pack_words = 1; > - word_len &= ~WORD_LEN_MSK; > - word_len |= ((bits_per_word - MIN_WORD_LEN) & WORD_LEN_MSK); > geni_se_config_packing(&mas->se, bits_per_word, pack_words, msb_first, > true, true); > + word_len = (bits_per_word - MIN_WORD_LEN) & WORD_LEN_MSK; > writel(word_len, se->base + SE_SPI_WORD_LEN); > } > > @@ -238,38 +236,34 @@ static int setup_fifo_params(struct spi_device *spi_slv, > { > struct spi_geni_master *mas = spi_master_get_devdata(spi); > struct geni_se *se = &mas->se; > - u32 loopback_cfg, cpol, cpha, demux_output_inv; > + u32 loopback_cfg = 0, cpol = 0, cpha = 0, demux_output_inv = 0; > u32 demux_sel; > > - loopback_cfg = readl(se->base + SE_SPI_LOOPBACK); > - cpol = readl(se->base + SE_SPI_CPOL); > - cpha = readl(se->base + SE_SPI_CPHA); > - demux_output_inv = 0; > - loopback_cfg &= ~LOOPBACK_MSK; > - cpol &= ~CPOL; > - cpha &= ~CPHA; > + if (mas->last_mode != spi_slv->mode) { > + if (spi_slv->mode & SPI_LOOP) > + loopback_cfg = LOOPBACK_ENABLE; > > - if (spi_slv->mode & SPI_LOOP) > - loopback_cfg |= LOOPBACK_ENABLE; > + if (spi_slv->mode & SPI_CPOL) > + cpol = CPOL; > > - if (spi_slv->mode & SPI_CPOL) > - cpol |= CPOL; > + if (spi_slv->mode & SPI_CPHA) > + cpha = CPHA; > > - if (spi_slv->mode & SPI_CPHA) > - cpha |= CPHA; > + if (spi_slv->mode & SPI_CS_HIGH) > + demux_output_inv = BIT(spi_slv->chip_select); > > - if (spi_slv->mode & SPI_CS_HIGH) > - demux_output_inv = BIT(spi_slv->chip_select); > + demux_sel = spi_slv->chip_select; > + mas->cur_bits_per_word = spi_slv->bits_per_word; > > - demux_sel = spi_slv->chip_select; > - mas->cur_bits_per_word = spi_slv->bits_per_word; > + spi_setup_word_len(mas, spi_slv->mode, spi_slv->bits_per_word); > + writel(loopback_cfg, se->base + SE_SPI_LOOPBACK); > + writel(demux_sel, se->base + SE_SPI_DEMUX_SEL); > + writel(cpha, se->base + SE_SPI_CPHA); > + writel(cpol, se->base + SE_SPI_CPOL); > + writel(demux_output_inv, se->base + SE_SPI_DEMUX_OUTPUT_INV); > > - spi_setup_word_len(mas, spi_slv->mode, spi_slv->bits_per_word); > - writel(loopback_cfg, se->base + SE_SPI_LOOPBACK); > - writel(demux_sel, se->base + SE_SPI_DEMUX_SEL); > - writel(cpha, se->base + SE_SPI_CPHA); > - writel(cpol, se->base + SE_SPI_CPOL); > - writel(demux_output_inv, se->base + SE_SPI_DEMUX_OUTPUT_INV); > + mas->last_mode = spi_slv->mode; > + } > > return geni_spi_set_clock_and_bw(mas, spi_slv->max_speed_hz); > } Yeah looks good to me, the default/reset value of these registers are 0 we don't have to preserve any bits here. We can directly update the register with required value. Reviewed-by: Akash Asthana -- The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,\na Linux Foundation Collaborative Project