Received: by 2002:a05:6358:3188:b0:123:57c1:9b43 with SMTP id q8csp1915265rwd; Fri, 9 Jun 2023 04:13:51 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ4tvnP3Hbi/O3W5Ou51TJAOqX9Vc/RCIDhLQy5+gaeuWz6Tym1GniPCurSK+PVKE5hvnsLs X-Received: by 2002:a05:6a20:8e29:b0:10c:38d3:437c with SMTP id y41-20020a056a208e2900b0010c38d3437cmr751822pzj.58.1686309230763; Fri, 09 Jun 2023 04:13:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1686309230; cv=none; d=google.com; s=arc-20160816; b=Q4isu9AaKARgDluRdfPClCJOk0nbAK/DGmr84KuYl3aXHWGxM2hkECu7bvWUzeb0hF Il8g+b64ajvKRuttVAxwwgAF4rA/gBy2Z7qILfBnJbAJ0HH6iipYE2h0Lpcrl+a82aev hKNTmPYUPIy24aHbmpLfe9avPkyJDwfwTbKDtT7PVvXgE/m7cj8mQzJO8wdXADDpGohv nWUSKByFlXGDffR9958oxBevQhb6dCEQDgoZAY6mdfZNyhBmB+9ZmfGcP0ogfITvstum gUBMyCEohtBxIs6TRFDaKEtAvpHPXYAD7KK18N++PGkImc6oNfq9xXXqWJKbxcF4qpkM I/zQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:in-reply-to:from :references:cc:to:content-language:subject:user-agent:mime-version :date:message-id:dkim-signature; bh=BzSyFtFdXcnd2HT0HS0gqYm2mT8eWVT9T37dAgibYaE=; b=a4Dhj4ykmyRTThuoAHkZCfoNuirBXlJ0xGQgUfJpxbN+IYX5Wsddjb/3AJAKUIQQME QoImG9TuWGwyyl4ibrIn/BrNJ4ypsuktNRTW7tmbQN2H9Beq3mGtKKV413lD4cemmajE aEvgFnPkjVAVk0zRcbAH0Oh5wH2ksz1Wu3BFMuZM/hgUOj/7n3BPFyl2h+NmbqG+ny4r S36Dqey7XHR83FtAxJB/k13nhn0AnFDVYu7IQFBv84x404XyQPdmeg9s+29ryPveoWh2 bMa0DVe1WAIJnREJYaPflw59c+360oFxOJUM5JfPnir4QvXcKHUVCa5k9Yrsj0m6K35o Qt3A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sberdevices.ru header.s=mail header.b=iIwhIrEH; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=sberdevices.ru Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id i71-20020a63874a000000b00512fab9493dsi2443357pge.740.2023.06.09.04.13.38; Fri, 09 Jun 2023 04:13:50 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@sberdevices.ru header.s=mail header.b=iIwhIrEH; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=sberdevices.ru Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231168AbjFILAY (ORCPT + 99 others); Fri, 9 Jun 2023 07:00:24 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50546 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230477AbjFILAV (ORCPT ); Fri, 9 Jun 2023 07:00:21 -0400 Received: from mx.sberdevices.ru (mx.sberdevices.ru [45.89.227.171]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 637BD211C for ; Fri, 9 Jun 2023 04:00:16 -0700 (PDT) Received: from s-lin-edge02.sberdevices.ru (localhost [127.0.0.1]) by mx.sberdevices.ru (Postfix) with ESMTP id 3DC2B5FD90; Fri, 9 Jun 2023 14:00:13 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sberdevices.ru; s=mail; t=1686308413; bh=BzSyFtFdXcnd2HT0HS0gqYm2mT8eWVT9T37dAgibYaE=; h=Message-ID:Date:MIME-Version:Subject:To:From:Content-Type; b=iIwhIrEHgiJBZcjqFXIOdLAKV4Fj4v1NVFIKCN9cj2pwpMSn+26WrFFPwYkiNcR6H zWm6tEssID3X1tSyGiwh6DKtbpUEbkiIHpkWlbo5tzHzK/iiUVttnzwGfXOjKMkw8/ SpXOaomSu3Sc+9LEem+gZF+f/vMTQadvBD4GdCstryi4uEzMKK2Fecq6XkxlWz8rWB fA3PRDqgwfRoZNvIbDQmGWHrvJiKK5ANsKsMfSe+rki4os1dt+kd9c0DKWlmbZQOSB 7heG8M1R4MOWdv64rIMYS7cana4gnX+b+NBbofUEbI953MLWC63x4ZCNOk9dsQGOAa GwE/BQd/5Re1g== Received: from S-MS-EXCH01.sberdevices.ru (S-MS-EXCH01.sberdevices.ru [172.16.1.4]) by mx.sberdevices.ru (Postfix) with ESMTP; Fri, 9 Jun 2023 14:00:11 +0300 (MSK) Message-ID: <03b86107-e03f-b41e-09e8-c8509c307005@sberdevices.ru> Date: Fri, 9 Jun 2023 13:55:07 +0300 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.7.1 Subject: Re: [PATCH v2] mtd: rawnand: meson: check buffer length Content-Language: en-US To: Liang Yang , Miquel Raynal CC: Richard Weinberger , Vignesh Raghavendra , Neil Armstrong , Kevin Hilman , Jerome Brunet , Martin Blumenstingl , , , , , , References: <20230606101644.3297859-1-AVKrasnov@sberdevices.ru> <9adef6da-5930-dcaa-f148-e4a398d39f2d@sberdevices.ru> <3a9470ed-d7ad-6cae-0d58-732399590272@sberdevices.ru> <7903580d-685c-14e6-5572-81a4cb31cced@amlogic.com> <20230608085458.449a24c0@xps-13> <4e6cd8a8-f618-4bc3-5fa9-eab2b501dd89@amlogic.com> <20230608152114.3a1d82ac@xps-13> <3cc9765c-f32a-fe8a-f7af-fb884ee63b48@amlogic.com> From: Arseniy Krasnov In-Reply-To: <3cc9765c-f32a-fe8a-f7af-fb884ee63b48@amlogic.com> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit X-Originating-IP: [172.16.1.6] X-ClientProxiedBy: S-MS-EXCH02.sberdevices.ru (172.16.1.5) To S-MS-EXCH01.sberdevices.ru (172.16.1.4) X-KSMG-Rule-ID: 4 X-KSMG-Message-Action: clean X-KSMG-AntiSpam-Status: not scanned, disabled by settings X-KSMG-AntiSpam-Interceptor-Info: not scanned X-KSMG-AntiPhishing: not scanned, disabled by settings X-KSMG-AntiVirus: Kaspersky Secure Mail Gateway, version 1.1.2.30, bases: 2023/06/09 07:08:00 #21465535 X-KSMG-AntiVirus-Status: Clean, skipped X-Spam-Status: No, score=-2.2 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,NICE_REPLY_A,SPF_HELO_NONE, SPF_NONE,T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED autolearn=ham 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 09.06.2023 10:59, Liang Yang wrote: > Hi Miquel, > > On 2023/6/8 21:21, Miquel Raynal wrote: >> [ EXTERNAL EMAIL ] >> >> Hi Liang, >> >> liang.yang@amlogic.com wrote on Thu, 8 Jun 2023 20:37:14 +0800: >> >>> Hi Arseniy and Miquel, >>> >>> On 2023/6/8 15:12, Liang Yang wrote: >>>> Hi Miquel, >>>> >>>> On 2023/6/8 14:54, Miquel Raynal wrote: >>>>> [ EXTERNAL EMAIL ] >>>>> >>>>> Hi Liang, >>>>> >>>>> liang.yang@amlogic.com wrote on Thu, 8 Jun 2023 14:42:53 +0800: >>>>> >>>>>> Hi Arseniy, >>>>>> >>>>>> On 2023/6/8 5:17, Arseniy Krasnov wrote: >>>>>>> [ EXTERNAL EMAIL ] >>>>>>> >>>>>>> Hi again Miquel, Liang! >>>>>>> >>>>>>> What do You think about this patch? >>>>>>> >>>>>>> Thanks, Arseniy >>>>>>> >>>>>>> On 06.06.2023 19:29, Arseniy Krasnov wrote: >>>>>>>> Sorry, here is changelog: >>>>>>>> v1 -> v2: >>>>>>>> * Move checks from 'switch/case' which executes commands in >>>>> 'meson_nfc_exec_op()' to a special >>>>>>>>      separated function 'meson_nfc_check_op()' which is called >>>>> before commands processing. >>>>>>>> >>>>>>>> On 06.06.2023 13:16, Arseniy Krasnov wrote: >>>>>>>>> Meson NAND controller has limited buffer length, so check it before >>>>>>>>> command execution to avoid length trim. Also check MTD write size on >>>>>>>>> chip attach. >>>>>>>>> >>>>>>>>> Signed-off-by: Arseniy Krasnov >>>>>>>>> --- >>>>>>>>>     drivers/mtd/nand/raw/meson_nand.c | 47 >>>>>> +++++++++++++++++++++++++++---- >>>>>>>>>     1 file changed, 42 insertions(+), 5 deletions(-) >>>>>>>>> >>>>>>>>> diff --git a/drivers/mtd/nand/raw/meson_nand.c >>>>>> b/drivers/mtd/nand/raw/meson_nand.c >>>>>>>>> index 23a73268421b..db6b18753071 100644 >>>>>>>>> --- a/drivers/mtd/nand/raw/meson_nand.c >>>>>>>>> +++ b/drivers/mtd/nand/raw/meson_nand.c >>>>>>>>> @@ -111,6 +111,8 @@ >>>>>>>>> >>>>>>>>>     #define PER_INFO_BYTE               8 >>>>>>>>> >>>>>>>>> +#define NFC_CMD_RAW_LEN     GENMASK(13, 0) >>>>>>>>> + >>>>>>>>>     struct meson_nfc_nand_chip { >>>>>>>>>         struct list_head node; >>>>>>>>>         struct nand_chip nand; >>>>>>>>> @@ -284,7 +286,7 @@ static void meson_nfc_cmd_access(struct >>>>>> nand_chip *nand, int raw, bool dir, >>>>>>>>> >>>>>>>>>         if (raw) { >>>>>>>>>                 len = mtd->writesize + mtd->oobsize; >>>>>>>>> -            cmd = (len & GENMASK(13, 0)) | scrambler | DMA_DIR(dir); >>>>>>>>> +            cmd = len | scrambler | DMA_DIR(dir); >>>>>>>>>                 writel(cmd, nfc->reg_base + NFC_REG_CMD); >>>>>> >>>>>> I think we could keep "& GENMASK(13, 0)". it is better here to >>> indicate how many bits of length in this command and don't destory >>> the command once we don't check the "len" outside of this function. >>> or the code "if (len >  NFC_CMD_RAW_LEN)" is better to put inside >>> this function nearly. Thanks. >>>>> >>>>> It depends who calls this helper. If only used inside >> exec_op,write_page_raw() and read_page_raw() also call >> meson_nfc_cmd_access(), > but i don't find where constrain the "len". >>> >>> Is the helper "meson_nfc_check_op()" needed by exec_op() after the constraint in attach_chip()? the length passed in exec_op() seems smaller than "mtd->writesize + mtd->oobsize" now. >> >> exec_op() is primarily dedicated to performing side commands than page >> accesses, typically the parameter page is X bytes, you might want to >> read it 3 times, depending on the capabilities of the controller, you >> might need to split the operation or not, so the core checks what are >> the controller capabilities before doing the operation. So yes, the >> check_op() thing is necessary. > > ok, i get it. thanks > > @Arseniy I have no other questions about this patch. Got it! Thanks, Arseniy >> >>> >>> @Arseniy if it does need, I think the same constraint is needed by >>> "meson_nfc_cmd_access()" >>> >>>> >>>>> it's not useful. If used outside, then if you want to clarify >>>>> things you may want to use: >>>>> >>>>> #define NFC_CMD_OP_LEN(cmd) FIELD_PREP(GENMASK(13, 0), (cmd)) >>>>> >>>>> This is by far my favorite construction. Could apply to many other >>>>> fields, like DMA_DIR, scrambler, etc. >>> >>> @Miquel, FIELD_PREP() is better, but i have no idea whether we should add FIELD_PREP() in this patch, or keep the previous code. >>> >>>>> >>>>>>>>>                 return; >>>>>>>>>         } >>>>>>>>> @@ -573,7 +575,7 @@ static int meson_nfc_read_buf(struct nand_chip >>>>>> *nand, u8 *buf, int len) >>>>>>>>>         if (ret) >>>>>>>>>                 goto out; >>>>>>>>> >>>>>>>>> -    cmd = NFC_CMD_N2M | (len & GENMASK(13, 0)); >>>>>>>>> +    cmd = NFC_CMD_N2M | len; >>>>>>>>>         writel(cmd, nfc->reg_base + NFC_REG_CMD); >>>>>>>>> >>>>>>>>>         meson_nfc_drain_cmd(nfc); >>>>>>>>> @@ -597,7 +599,7 @@ static int meson_nfc_write_buf(struct >>>>>> nand_chip *nand, u8 *buf, int len) >>>>>>>>>         if (ret) >>>>>>>>>                 return ret; >>>>>>>>> >>>>>>>>> -    cmd = NFC_CMD_M2N | (len & GENMASK(13, 0)); >>>>>>>>> +    cmd = NFC_CMD_M2N | len; >>>>>>>>>         writel(cmd, nfc->reg_base + NFC_REG_CMD); >>>>>>>>> >>>>>>>>>         meson_nfc_drain_cmd(nfc); >>>>>>>>> @@ -1007,6 +1009,31 @@ meson_nand_op_put_dma_safe_output_buf(const >>>>>> struct nand_op_instr *instr, >>>>>>>>>                 kfree(buf); >>>>>>>>>     } >>>>>>>>> >>>>>>>>> +static int meson_nfc_check_op(struct nand_chip *chip, >>>>>>>>> +                          const struct nand_operation *op) >>>>>>>>> +{ >>>>>>>>> +    int op_id; >>>>>>>>> + >>>>>>>>> +    for (op_id = 0; op_id < op->ninstrs; op_id++) { >>>>>>>>> +            const struct nand_op_instr *instr; >>>>>>>>> + >>>>>>>>> +            instr = &op->instrs[op_id]; >>>>>>>>> + >>>>>>>>> +            switch (instr->type) { >>>>>>>>> +            case NAND_OP_DATA_IN_INSTR: >>>>>>>>> +            case NAND_OP_DATA_OUT_INSTR: >>>>>>>>> +                    if (instr->ctx.data.len > NFC_CMD_RAW_LEN) >>>>>>>>> +                            return -ENOTSUPP; >>>>>>>>> + >>>>>>>>> +                    break; >>>>>>>>> +            default: >>>>>>>>> +                    break; >>>>>>>>> +            } >>>>>>>>> +    } >>>>>>>>> + >>>>>>>>> +    return 0; >>>>>>>>> +} >>>>>>>>> + >>>>>>>>>     static int meson_nfc_exec_op(struct nand_chip *nand, >>>>>>>>>                              const struct nand_operation *op, bool >>>>>> check_only) >>>>>>>>>     { >>>>>>>>> @@ -1015,10 +1042,12 @@ static int meson_nfc_exec_op(struct >>>>>> nand_chip *nand, >>>>>>>>>         const struct nand_op_instr *instr = NULL; >>>>>>>>>         void *buf; >>>>>>>>>         u32 op_id, delay_idle, cmd; >>>>>>>>> +    int err; >>>>>>>>>         int i; >>>>>>>>> >>>>>>>>> -    if (check_only) >>>>>>>>> -            return 0; >>>>>>>>> +    err = meson_nfc_check_op(nand, op); >>>>>>>>> +    if (err || check_only) >>>>>>>>> +            return err; >>>>>>>>> >>>>>>>>>         meson_nfc_select_chip(nand, op->cs); >>>>>>>>>         for (op_id = 0; op_id < op->ninstrs; op_id++) { >>>>>>>>> @@ -1293,6 +1322,7 @@ static int meson_nand_attach_chip(struct >>>>>> nand_chip *nand) >>>>>>>>>         struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand); >>>>>>>>>         struct mtd_info *mtd = nand_to_mtd(nand); >>>>>>>>>         int nsectors = mtd->writesize / 1024; >>>>>>>>> +    int raw_writesize; >>>>>>>>>         int ret; >>>>>>>>> >>>>>>>>>         if (!mtd->name) { >>>>>>>>> @@ -1304,6 +1334,13 @@ static int meson_nand_attach_chip(struct >>>>>> nand_chip *nand) >>>>>>>>>                         return -ENOMEM; >>>>>>>>>         } >>>>>>>>> >>>>>>>>> +    raw_writesize = mtd->writesize + mtd->oobsize; >>>>>>>>> +    if (raw_writesize > NFC_CMD_RAW_LEN) { >>>>>>>>> +            dev_err(nfc->dev, "too big write size in raw mode: %d >>>>>> > %ld\n", >>>>>>>>> +                    raw_writesize, NFC_CMD_RAW_LEN); >>>>>>>>> +            return -EINVAL; >>>>>>>>> +    } >>>>>>>>> + >>>>>>>>>         if (nand->bbt_options & NAND_BBT_USE_FLASH) >>>>>>>>>                 nand->bbt_options |= NAND_BBT_NO_OOB; >>>>>>>>> >>>>> >>>>> >>>>> Thanks, >>>>> Miquèl >> >> >> Thanks, >> Miquèl