Received: by 2002:a25:8b12:0:0:0:0:0 with SMTP id i18csp1751581ybl; Sat, 10 Aug 2019 09:13:05 -0700 (PDT) X-Google-Smtp-Source: APXvYqx1QKAdEaavCqBdoLM3y5VenNAfWYhhy586QLjsd/+0wc4zEvsXUy9qikWIlH1a7Or76R9/ X-Received: by 2002:a63:9e54:: with SMTP id r20mr23307185pgo.64.1565453584822; Sat, 10 Aug 2019 09:13:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1565453584; cv=none; d=google.com; s=arc-20160816; b=elnPHegcLkmbTJUuXOrcRSuNnHFmZA1dGt4aoeeD2oHAbUJq1tYRTDa3N5O34exQP+ KZV2SDDjEo2vb+utIdP7BHnB+tAcqZTIgnfx+dGLLeX4YsCkaaRvp2aLc9CBNWH+2pOo ZwQFZ/1QxRIKaCH1IuBkGPIEsdmmRV1qu6hJacKhwZKcwO4g6t6UKlr23+vuerZuFHEI E9V9nt0svPRXxiROdkhpTvAFjqaXae0gSCA+2R/V3+SIqamn6Mi2K3sTMOOkkvRI6ryh EDDy/R6J/ad/Cidue/uj9WOfeIRhsW3RuZou7rV7YakdIlEY7lUaaiZyYy474DD0l49b 6vEQ== 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 :references:in-reply-to:date:cc:to:from:subject:message-id; bh=PfRVtfQdIFWKmQmjwT5bInuUrX8/NBgs5EHFe7TlS0s=; b=AWa5GBL5EU0ZxrqXAjWJWcvHXGnD1kDxKev//uzYHM0maHMQsH5WdNCrfn1Js2uX5O sIJ/k4qzxWubs8QjbIRCWULPd2N8qHlo4rq4XwguGtQMTcriKYWHBSx7JjL3djv8puly Vrl76MePUesWqCtTwLx4zdHhKfE6V3Ky5M5EFGjYgTDVqHb5vTCqPgjXM5eYb/hFaT9O RmsifZTBlV6MF2QJD27BWPIeQcOxzolIBQ+As9jUFcWR7qunUuMMJKcTss4G3s9Vlm6b sO5TYpoATfdk5y67yapd4e/vPc0dTU0GXb06Nv1MzNnzKrdcCpR3BHkQQs85byNiU4bt NTvA== 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=mediatek.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f89si7283465pje.50.2019.08.10.09.12.49; Sat, 10 Aug 2019 09:13: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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=mediatek.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726201AbfHJQMR (ORCPT + 99 others); Sat, 10 Aug 2019 12:12:17 -0400 Received: from mailgw02.mediatek.com ([1.203.163.81]:7236 "EHLO mailgw02.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1726048AbfHJQMR (ORCPT ); Sat, 10 Aug 2019 12:12:17 -0400 X-UUID: a8deb79787ff4323a683383e4bcc23b3-20190811 X-UUID: a8deb79787ff4323a683383e4bcc23b3-20190811 Received: from mtkcas35.mediatek.inc [(172.27.4.253)] by mailgw02.mediatek.com (envelope-from ) (mailgw01.mediatek.com ESMTP with TLS) with ESMTP id 1104069435; Sun, 11 Aug 2019 00:12:03 +0800 Received: from MTKCAS32.mediatek.inc (172.27.4.184) by MTKMBS31N2.mediatek.inc (172.27.4.87) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Sun, 11 Aug 2019 00:12:01 +0800 Received: from [10.17.3.153] (172.27.4.253) by MTKCAS32.mediatek.inc (172.27.4.170) with Microsoft SMTP Server id 15.0.1395.4 via Frontend Transport; Sun, 11 Aug 2019 00:12:00 +0800 Message-ID: <1565453520.19079.17.camel@mhfsdcap03> Subject: Re: [PATCH v11 09/12] soc: mediatek: cmdq: define the instruction struct From: houlong wei To: Bibby Hsieh CC: Jassi Brar , Matthias Brugger , Rob Herring , CK Hu =?UTF-8?Q?=28=E8=83=A1=E4=BF=8A=E5=85=89=29?= , "Daniel Kurtz" , Sascha Hauer , "devicetree@vger.kernel.org" , "linux-kernel@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , "linux-mediatek@lists.infradead.org" , srv_heupstream , Sascha Hauer , Philipp Zabel , "Nicolas Boichat" , YT Shen =?UTF-8?Q?=28=E6=B2=88=E5=B2=B3=E9=9C=86=29?= , Daoyuan Huang =?UTF-8?Q?=28=E9=BB=83=E9=81=93=E5=8E=9F=29?= , Jiaguang Zhang =?UTF-8?Q?=28=E5=BC=A0=E5=8A=A0=E5=B9=BF=29?= , Dennis-YC Hsieh =?UTF-8?Q?=28=E8=AC=9D=E5=AE=87=E5=93=B2=29?= , Ginny Chen =?UTF-8?Q?=28=E9=99=B3=E6=B2=BB=E5=82=91=29?= , Date: Sun, 11 Aug 2019 00:12:00 +0800 In-Reply-To: <20190729070106.9332-10-bibby.hsieh@mediatek.com> References: <20190729070106.9332-1-bibby.hsieh@mediatek.com> <20190729070106.9332-10-bibby.hsieh@mediatek.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.10.4-0ubuntu2 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-TM-SNTS-SMTP: 36B40D599FEE99665428D035A4900559F5A4021DCEB85292EBDDD62009BA69AC2000:8 X-MTK: N Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Bibby, I have inline comment in function cmdq_pkt_write_mask(). On Mon, 2019-07-29 at 15:01 +0800, Bibby Hsieh wrote: > Define an instruction structure for gce driver to append command. > This structure can make the client's code more readability. > > Signed-off-by: Bibby Hsieh > Reviewed-by: CK Hu > --- > drivers/soc/mediatek/mtk-cmdq-helper.c | 103 +++++++++++++++-------- > include/linux/mailbox/mtk-cmdq-mailbox.h | 2 + > 2 files changed, 72 insertions(+), 33 deletions(-) > > diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c > index 7aa0517ff2f3..0886c4967ca4 100644 > --- a/drivers/soc/mediatek/mtk-cmdq-helper.c > +++ b/drivers/soc/mediatek/mtk-cmdq-helper.c > @@ -9,12 +9,24 @@ > #include > #include > > -#define CMDQ_ARG_A_WRITE_MASK 0xffff > #define CMDQ_WRITE_ENABLE_MASK BIT(0) > #define CMDQ_EOC_IRQ_EN BIT(0) > #define CMDQ_EOC_CMD ((u64)((CMDQ_CODE_EOC << CMDQ_OP_CODE_SHIFT)) \ > << 32 | CMDQ_EOC_IRQ_EN) > > +struct cmdq_instruction { > + union { > + u32 value; > + u32 mask; > + }; > + union { > + u16 offset; > + u16 event; > + }; > + u8 subsys; > + u8 op; > +}; > + > static void cmdq_client_timeout(struct timer_list *t) > { > struct cmdq_client *client = from_timer(client, t, timer); > @@ -110,10 +122,8 @@ void cmdq_pkt_destroy(struct cmdq_pkt *pkt) > } > EXPORT_SYMBOL(cmdq_pkt_destroy); > > -static int cmdq_pkt_append_command(struct cmdq_pkt *pkt, enum cmdq_code code, > - u32 arg_a, u32 arg_b) > +static struct cmdq_instruction *cmdq_pkt_append_command(struct cmdq_pkt *pkt) > { > - u64 *cmd_ptr; > > if (unlikely(pkt->cmd_buf_size + CMDQ_INST_SIZE > pkt->buf_size)) { > /* > @@ -127,81 +137,108 @@ static int cmdq_pkt_append_command(struct cmdq_pkt *pkt, enum cmdq_code code, > pkt->cmd_buf_size += CMDQ_INST_SIZE; > WARN_ONCE(1, "%s: buffer size %u is too small !\n", > __func__, (u32)pkt->buf_size); > - return -ENOMEM; > + return NULL; > } > - cmd_ptr = pkt->va_base + pkt->cmd_buf_size; > - (*cmd_ptr) = (u64)((code << CMDQ_OP_CODE_SHIFT) | arg_a) << 32 | arg_b; > + > pkt->cmd_buf_size += CMDQ_INST_SIZE; > > - return 0; > + return pkt->va_base + pkt->cmd_buf_size - CMDQ_INST_SIZE; > } > > int cmdq_pkt_write(struct cmdq_pkt *pkt, u8 subsys, u16 offset, u32 value) > { > - u32 arg_a = (offset & CMDQ_ARG_A_WRITE_MASK) | > - (subsys << CMDQ_SUBSYS_SHIFT); > + struct cmdq_instruction *inst; > + > + inst = cmdq_pkt_append_command(pkt); > + if (!inst) > + return -ENOMEM; > + > + inst->op = CMDQ_CODE_WRITE; > + inst->value = value; > + inst->offset = offset; > + inst->subsys = subsys; > > - return cmdq_pkt_append_command(pkt, CMDQ_CODE_WRITE, arg_a, value); > + return 0; > } > EXPORT_SYMBOL(cmdq_pkt_write); > > int cmdq_pkt_write_mask(struct cmdq_pkt *pkt, u8 subsys, > u16 offset, u32 value, u32 mask) > { > + struct cmdq_instruction *inst; > u32 offset_mask = offset; > - int err = 0; > > if (mask != 0xffffffff) { > - err = cmdq_pkt_append_command(pkt, CMDQ_CODE_MASK, 0, ~mask); > + inst = cmdq_pkt_append_command(pkt); > + if (!inst) > + return -ENOMEM; > + > + inst->op = CMDQ_CODE_MASK; > + inst->mask = ~mask; There were some discussion about how to reduce cmdq buffer allocation times reuse a cmdq packet.Please refer to the below links. https://patchwork.kernel.org/patch/10193349/ https://patchwork.kernel.org/patch/10491161/ If we reuse a cmdq packet, we get the cmdq instruction buffer which may contains previous data. To generate correct instructions, we may need consider how to clear the previous data. 1.Set all members of a cmdq_instruction instance. e.g. Add two lines of code below for this case. inst->offset = 0; inst->subsys = 0; 2. Before reuse a packet, do memset() for the command buffer. How do you think about it? > offset_mask |= CMDQ_WRITE_ENABLE_MASK; > } > - err |= cmdq_pkt_write(pkt, value, subsys, offset_mask); > > - return err; > + return cmdq_pkt_write(pkt, subsys, offset_mask, value); > } > EXPORT_SYMBOL(cmdq_pkt_write_mask); > > int cmdq_pkt_wfe(struct cmdq_pkt *pkt, u16 event) > { > - u32 arg_b; > + struct cmdq_instruction *inst; > > if (event >= CMDQ_MAX_EVENT) > return -EINVAL; > > - /* > - * WFE arg_b > - * bit 0-11: wait value > - * bit 15: 1 - wait, 0 - no wait > - * bit 16-27: update value > - * bit 31: 1 - update, 0 - no update > - */ > - arg_b = CMDQ_WFE_UPDATE | CMDQ_WFE_WAIT | CMDQ_WFE_WAIT_VALUE; > + inst = cmdq_pkt_append_command(pkt); > + if (!inst) > + return -ENOMEM; > + > + inst->op = CMDQ_CODE_WFE; > + inst->value = CMDQ_WFE_OPTION; > + inst->event = event; > > - return cmdq_pkt_append_command(pkt, CMDQ_CODE_WFE, event, arg_b); > + return 0; > } > EXPORT_SYMBOL(cmdq_pkt_wfe); > > int cmdq_pkt_clear_event(struct cmdq_pkt *pkt, u16 event) > { > + struct cmdq_instruction *inst; > + > if (event >= CMDQ_MAX_EVENT) > return -EINVAL; > > - return cmdq_pkt_append_command(pkt, CMDQ_CODE_WFE, event, > - CMDQ_WFE_UPDATE); > + inst = cmdq_pkt_append_command(pkt); > + if (!inst) > + return -ENOMEM; > + > + inst->op = CMDQ_CODE_WFE; > + inst->value = CMDQ_WFE_UPDATE; > + inst->event = event; > + > + return 0; > } > EXPORT_SYMBOL(cmdq_pkt_clear_event); > > static int cmdq_pkt_finalize(struct cmdq_pkt *pkt) > { > - int err; > + struct cmdq_instruction *inst; > + > + inst = cmdq_pkt_append_command(pkt); > + if (!inst) > + return -ENOMEM; > > - /* insert EOC and generate IRQ for each command iteration */ > - err = cmdq_pkt_append_command(pkt, CMDQ_CODE_EOC, 0, CMDQ_EOC_IRQ_EN); > + inst->op = CMDQ_CODE_EOC; > + inst->value = CMDQ_EOC_IRQ_EN; > > - /* JUMP to end */ > - err |= cmdq_pkt_append_command(pkt, CMDQ_CODE_JUMP, 0, CMDQ_JUMP_PASS); > + inst = cmdq_pkt_append_command(pkt); > + if (!inst) > + return -ENOMEM; > + > + inst->op = CMDQ_CODE_JUMP; > + inst->value = CMDQ_JUMP_PASS; > > - return err; > + return 0; > } > > static void cmdq_pkt_flush_async_cb(struct cmdq_cb_data data) > diff --git a/include/linux/mailbox/mtk-cmdq-mailbox.h b/include/linux/mailbox/mtk-cmdq-mailbox.h > index 911475da7a53..c8adedefaf42 100644 > --- a/include/linux/mailbox/mtk-cmdq-mailbox.h > +++ b/include/linux/mailbox/mtk-cmdq-mailbox.h > @@ -19,6 +19,8 @@ > #define CMDQ_WFE_UPDATE BIT(31) > #define CMDQ_WFE_WAIT BIT(15) > #define CMDQ_WFE_WAIT_VALUE 0x1 > +#define CMDQ_WFE_OPTION (CMDQ_WFE_UPDATE | CMDQ_WFE_WAIT | \ > + CMDQ_WFE_WAIT_VALUE) > /** cmdq event maximum */ > #define CMDQ_MAX_EVENT 0x3ff >