Received: by 2002:a89:d88:0:b0:1fa:5c73:8e2d with SMTP id eb8csp2545440lqb; Tue, 28 May 2024 03:25:34 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCVoN5hGWVPn0p9ECQN0YfuU7PGukec6wyBvDkUP0g0DvRamsei2N5r+piBJnJmvXu2H6+2mSRM8qe2RnCy2S1/RGEDxijfhBrltai3dYA== X-Google-Smtp-Source: AGHT+IELzXBHEWGGrLfDgOuqXgCWOR+N9jmsxk5akPW4awCr30gPq5cgD4/R7KRfm041cd31pvzX X-Received: by 2002:a17:907:94cb:b0:a62:ee4d:5401 with SMTP id a640c23a62f3a-a62ee4d5598mr397387966b.65.1716891934049; Tue, 28 May 2024 03:25:34 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1716891934; cv=pass; d=google.com; s=arc-20160816; b=rv96YhGP+n66u/PgIy/KZt+aqZlLjKvDxqh7l+Lia8CIeKf01nn7HjfQMC9v3t7cAE +EyDFLlwwMwWx/TWmv18Sw9m+fy4WtcE0NeZ4Q1cSnrOqgN8Ax0kTW7EjlfyfastNlsB ulpxrYuMJD7YEXi7nhrO4nRl4Mp2jDZKWCM+kQX0v/MKluHMI6ZlGlvBaDYffvGk/wC6 vWuTDQdQg9H5FlBVWXV5kdzdwYhpql1TExJB0qJcXHiYdVYWuOsnAzfMBWx7FL8+9nSG aKmDHWwq0Nz7kxxKC4040FhM8kgBiWLb+aFPm35fYdz75iKyH5L4jCeCFCO3dw1s+MiB fiVA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:in-reply-to:content-language:from :references:cc:to:subject:user-agent:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:date:message-id:dkim-signature; bh=YuyCdFlQC/UfT3GWzMW9DgqmXzWGBbDd7qmciqCf5B4=; fh=+Oqfc304Xt9+3TQLA0mTwZ9Tl6SyzVeWJEzT/JXjgJM=; b=g+qlxIghMI7cn3WV9U5mz5zAbRHgHOkD4P9XUV1Is0VBjOsTyMjxokAWd/9nKAG3f6 AZYPMONy55aROcGNmx3bdeTvSEh9blLiaqiwRpp5SvJG4YDvHKg6R5WvQt8aorMNb487 +RpQcrU96U9VF+CQ9BnfOyk3rXKRfeaPEqD697iW3BkyJwjNDazQUU5+78C636QHA6Ce LJZQoNzKZd0bgkPOEftBc9JlgOwaN5aCnnKflcoREzVLONlRFip9KaA1Ro0N/4oGl+OT F6wXrkSrl5vma8SqaswZP9FDIyZa5/1HL2GeXDi0re7Nl24hVb8PDKq2vifCA569W+E0 AcJQ==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@collabora.com header.s=mail header.b=eKXOV461; arc=pass (i=1 spf=pass spfdomain=collabora.com dkim=pass dkdomain=collabora.com dmarc=pass fromdomain=collabora.com); spf=pass (google.com: domain of linux-kernel+bounces-192110-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-192110-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=collabora.com Return-Path: Received: from am.mirrors.kernel.org (am.mirrors.kernel.org. [147.75.80.249]) by mx.google.com with ESMTPS id a640c23a62f3a-a626cd95a9esi486224366b.863.2024.05.28.03.25.33 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 May 2024 03:25:34 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-192110-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) client-ip=147.75.80.249; Authentication-Results: mx.google.com; dkim=pass header.i=@collabora.com header.s=mail header.b=eKXOV461; arc=pass (i=1 spf=pass spfdomain=collabora.com dkim=pass dkdomain=collabora.com dmarc=pass fromdomain=collabora.com); spf=pass (google.com: domain of linux-kernel+bounces-192110-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-192110-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=collabora.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by am.mirrors.kernel.org (Postfix) with ESMTPS id 95D2E1F22D40 for ; Tue, 28 May 2024 10:25:33 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 314D916C852; Tue, 28 May 2024 10:24:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="eKXOV461" Received: from madrid.collaboradmins.com (madrid.collaboradmins.com [46.235.227.194]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 82D9F16B74E; Tue, 28 May 2024 10:24:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=46.235.227.194 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1716891892; cv=none; b=Zy/KoaowXnIO9Z0nNq+zouIL5LTOEhC9764fKgrLAAIzdSOgPArsYD9e4rTrPGf9aFYCPYjQ6AsKVoUp9gueno8+95qhfewyXG/pTr3kg6U12V92TwHh0iie4vEXFdLO9H8SX1j2Dfv9F/AjAJI6p/iTxaNAQ2FQQni3cYz0G3s= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1716891892; c=relaxed/simple; bh=BTP5T/FnJEg0tTgg03f/vFW9oqFqFOqTuqLp+c8wd0I=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=Pa/22GBRwjonBM9kg2NGbxnkkEee3JZprcMZ3axDqf8BHhvz181pRlAs0ecjvTkZilTXQf285ho7D//5RfMJWiaO1bo01kgvAH2xnoT7mHaMFlGWO+mjxL08YCs1DFaipIh44T3qJ6U79Im9yF5ieFwsXLQNlwlXDTTz6OLzlhI= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=eKXOV461; arc=none smtp.client-ip=46.235.227.194 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1716891888; bh=BTP5T/FnJEg0tTgg03f/vFW9oqFqFOqTuqLp+c8wd0I=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=eKXOV4619CjkWDXyulcDZI972BUE8J+WDNlZmJRgqPiQ1VnLW4lOdRQ9fgT0lcCJR MZEwHU7KyoGG+kAh0vxH1ypBSQITuoNKHXDNGx3l+/ZPQ6P7gsmABpntUexUjJvpU8 y1B3gRKAScWuRfGd/Iz1C3yBZY2Pm49GSmBuW9OsiF6k4H/MLAkT4n5eUuAEwIAlhx /Cf/25PzttE/AwRZPIWiiUpoVZ5lSEgvEkD4FKebjwQOF7Z0N6bc+pQPkPMVZS2RJf Uz5ZXCVD9lrBWRyH7c91k+r7h+UaYWREaSunJ4/ul7tHtZ8n5NDllBHk1WXI+bGMj/ 33HLaqUTc688w== Received: from [100.113.186.2] (cola.collaboradmins.com [195.201.22.229]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: kholk11) by madrid.collaboradmins.com (Postfix) with ESMTPSA id D7911378215E; Tue, 28 May 2024 10:24:47 +0000 (UTC) Message-ID: Date: Tue, 28 May 2024 12:24:47 +0200 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v6 3/8] soc: mediatek: cmdq: Add cmdq_pkt_logic_command to support math operation To: "Jason-JH.Lin" , Jassi Brar , Krzysztof Kozlowski , Rob Herring , Matthias Brugger , Chun-Kuang Hu Cc: Conor Dooley , Jason-ch Chen , Singo Chang , Nancy Lin , Shawn Sung , linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, dri-devel@lists.freedesktop.org, Project_Global_Chrome_Upstream_Group@mediatek.com References: <20240525230810.24623-1-jason-jh.lin@mediatek.com> <20240525230810.24623-4-jason-jh.lin@mediatek.com> From: AngeloGioacchino Del Regno Content-Language: en-US In-Reply-To: <20240525230810.24623-4-jason-jh.lin@mediatek.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Il 26/05/24 01:08, Jason-JH.Lin ha scritto: > Add cmdq_pkt_logic_command to support math operation. > > cmdq_pkt_logic_command can append logic command to the CMDQ packet, > ask GCE to execute a arithmetic calculate instruction, > such as add, subtract, multiply, AND, OR and NOT, etc. > > Note that all arithmetic instructions are unsigned calculations. > If there are any overflows, GCE will sent the invalid IRQ to notify > CMDQ driver. > > Signed-off-by: Jason-JH.Lin > Signed-off-by: Hsiao Chien Sung > --- > drivers/soc/mediatek/mtk-cmdq-helper.c | 36 ++++++++++++++++++++++ > include/linux/soc/mediatek/mtk-cmdq.h | 42 ++++++++++++++++++++++++++ > 2 files changed, 78 insertions(+) > > diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c > index 046522664dc1..42fae05f61a8 100644 > --- a/drivers/soc/mediatek/mtk-cmdq-helper.c > +++ b/drivers/soc/mediatek/mtk-cmdq-helper.c > @@ -15,10 +15,19 @@ > /* dedicate the last GPR_R15 to assign the register address to be poll */ > #define CMDQ_POLL_ADDR_GPR (15) > #define CMDQ_EOC_IRQ_EN BIT(0) > +#define CMDQ_IMMEDIATE_VALUE 0 > #define CMDQ_REG_TYPE 1 > #define CMDQ_JUMP_RELATIVE 0 > #define CMDQ_JUMP_ABSOLUTE 1 > > +#define CMDQ_OPERAND_GET_IDX_VALUE(operand) \ > + ({ \ > + struct cmdq_operand *op = operand; \ > + op->reg ? op->idx : op->value; \ > + }) I think this CMDQ_OPERAND_GET_IDX_VALUE would be better expressed as a (inline?) function instead... static inline u16 cmdq_operand_get_idx_value(struct cmdq_operand *op) { return op->reg ? op->idx : op->value; } and maybe the same for the other definition too.. static inline u16 cmdq_operand_type(struct cmdq_operand *op) { return op->reg ? CMDQ_REG_TYPE : CMDQ_IMMEDIATE_VALUE; } but definitely the first one is what I don't like much, the second one can pass. Cheers, Angelo > +#define CMDQ_OPERAND_TYPE(operand) \ > + ((operand)->reg ? CMDQ_REG_TYPE : CMDQ_IMMEDIATE_VALUE) > + > struct cmdq_instruction { > union { > u32 value; > @@ -461,6 +470,33 @@ int cmdq_pkt_poll_addr(struct cmdq_pkt *pkt, dma_addr_t addr, u32 value, u32 mas > } > EXPORT_SYMBOL(cmdq_pkt_poll_addr); > > +int cmdq_pkt_logic_command(struct cmdq_pkt *pkt, u16 result_reg_idx, > + struct cmdq_operand *left_operand, > + enum cmdq_logic_op s_op, > + struct cmdq_operand *right_operand) > +{ > + struct cmdq_instruction inst = { {0} }; > + u32 left_idx_value; > + u32 right_idx_value; > + > + if (!left_operand || !right_operand || s_op >= CMDQ_LOGIC_MAX) > + return -EINVAL; > + > + left_idx_value = CMDQ_OPERAND_GET_IDX_VALUE(left_operand); > + right_idx_value = CMDQ_OPERAND_GET_IDX_VALUE(right_operand); > + inst.op = CMDQ_CODE_LOGIC; > + inst.dst_t = CMDQ_REG_TYPE; > + inst.src_t = CMDQ_OPERAND_TYPE(left_operand); > + inst.arg_c_t = CMDQ_OPERAND_TYPE(right_operand); > + inst.sop = s_op; > + inst.reg_dst = result_reg_idx; > + inst.src_reg = left_idx_value; > + inst.arg_c = right_idx_value; > + > + return cmdq_pkt_append_command(pkt, inst); > +} > +EXPORT_SYMBOL(cmdq_pkt_logic_command); > + > int cmdq_pkt_assign(struct cmdq_pkt *pkt, u16 reg_idx, u32 value) > { > struct cmdq_instruction inst = {}; > diff --git a/include/linux/soc/mediatek/mtk-cmdq.h b/include/linux/soc/mediatek/mtk-cmdq.h > index d4a8e34505e6..5bee6f7fc400 100644 > --- a/include/linux/soc/mediatek/mtk-cmdq.h > +++ b/include/linux/soc/mediatek/mtk-cmdq.h > @@ -25,6 +25,31 @@ > > struct cmdq_pkt; > > +enum cmdq_logic_op { > + CMDQ_LOGIC_ASSIGN = 0, > + CMDQ_LOGIC_ADD = 1, > + CMDQ_LOGIC_SUBTRACT = 2, > + CMDQ_LOGIC_MULTIPLY = 3, > + CMDQ_LOGIC_XOR = 8, > + CMDQ_LOGIC_NOT = 9, > + CMDQ_LOGIC_OR = 10, > + CMDQ_LOGIC_AND = 11, > + CMDQ_LOGIC_LEFT_SHIFT = 12, > + CMDQ_LOGIC_RIGHT_SHIFT = 13, > + CMDQ_LOGIC_MAX, > +}; > + > +struct cmdq_operand { > + /* register type */ > + bool reg; > + union { > + /* index */ > + u16 idx; > + /* value */ > + u16 value; > + }; > +}; > + > struct cmdq_client_reg { > u8 subsys; > u16 offset; > @@ -272,6 +297,23 @@ int cmdq_pkt_poll(struct cmdq_pkt *pkt, u8 subsys, > int cmdq_pkt_poll_mask(struct cmdq_pkt *pkt, u8 subsys, > u16 offset, u32 value, u32 mask); > > +/** > + * cmdq_pkt_logic_command() - Append logic command to the CMDQ packet, ask GCE to > + * execute an instruction that store the result of logic operation > + * with left and right operand into result_reg_idx. > + * @pkt: the CMDQ packet > + * @result_reg_idx: SPR index that store operation result of left_operand and right_operand > + * @left_operand: left operand > + * @s_op: the logic operator enum > + * @right_operand: right operand > + * > + * Return: 0 for success; else the error code is returned > + */ > +int cmdq_pkt_logic_command(struct cmdq_pkt *pkt, u16 result_reg_idx, > + struct cmdq_operand *left_operand, > + enum cmdq_logic_op s_op, > + struct cmdq_operand *right_operand); > + > /** > * cmdq_pkt_assign() - Append logic assign command to the CMDQ packet, ask GCE > * to execute an instruction that set a constant value into