Hi, Binbin,
On Mon, Jul 6, 2026 at 10:19 AM Binbin Zhou <[email protected]> wrote:
>
> Use pointers annotated with the __iomem marker for all iomem map calls,
> and creates a local copy of the mapped IO memory for future access in
> the code. memcpy_fromio() and memcpy_toio() are used to read/write data
> from/to mapped IO memory
>
> Cc: [email protected] # v6.18+
> Fixes: 0d64f6d1ffe9 ("mfd: ls2kbmc: Introduce Loongson-2K BMC core driver")
> Reported-by: kernel test robot <[email protected]>
> Closes:
> https://lore.kernel.org/oe-kbuild-all/[email protected]/
> Closes:
> https://lore.kernel.org/oe-kbuild-all/[email protected]/
> Reviewed-by: Huacai Chen <[email protected]>
> Signed-off-by: Binbin Zhou <[email protected]>
> ---
> V3:
> - Reduce the range of `ioremap` from `SZ_16M` to `SZ_64`;
> - Define a new variable `pos` to iterate through the string;
> - Add failure handling for `strncmp()`.
>
> Link to V2:
> https://lore.kernel.org/all/[email protected]/
>
> V2:
> - Add the missing memcpy_fromio();
> - Drop the unnecessary `buf` variable.
>
> Link to V1:
> https://lore.kernel.org/all/[email protected]/
>
> drivers/mfd/ls2k-bmc-core.c | 29 ++++++++++++++++++++++-------
> 1 file changed, 22 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/mfd/ls2k-bmc-core.c b/drivers/mfd/ls2k-bmc-core.c
> index 408056bfb2fe..a2aee2131529 100644
> --- a/drivers/mfd/ls2k-bmc-core.c
> +++ b/drivers/mfd/ls2k-bmc-core.c
> @@ -66,6 +66,9 @@
> /* Maximum time to wait for U-Boot and DDR to be ready with ms. */
> #define LS2K_BMC_RESET_WAIT_TIME 10000
>
> +/* The length of the LS2K BMC display resolution string stored in PCI BAR0 */
> +#define LS2K_RESOLUTION_STR_LEN SZ_64
> +
> /* It's an experience value */
> #define LS7A_BAR0_CHECK_MAX_TIMES 2000
>
> @@ -427,27 +430,39 @@ static int ls2k_bmc_init(struct ls2k_bmc_ddata *ddata)
> */
> static int ls2k_bmc_parse_mode(struct pci_dev *pdev, struct
> simplefb_platform_data *pd)
> {
> - char *mode;
> + char *mode __free(kfree) = NULL;
> + void __iomem *base;
> + char *pos = NULL;
Don't need to initialize, and you can define it in the same line as mode.
> int depth, ret;
>
> /* The last 16M of PCI BAR0 is used to store the resolution string. */
> - mode = devm_ioremap(&pdev->dev, pci_resource_start(pdev, 0) + SZ_16M,
> SZ_16M);
> + base = devm_ioremap(&pdev->dev, pci_resource_start(pdev, 0) + SZ_16M,
> + LS2K_RESOLUTION_STR_LEN);
IOREMAP is page based, so just use PAGE_SIZE rather than
LS2K_RESOLUTION_STR_LEN.
Huacai
> + if (!base)
> + return -ENOMEM;
> +
> + mode = kmalloc(LS2K_RESOLUTION_STR_LEN, GFP_KERNEL);
> if (!mode)
> return -ENOMEM;
>
> + memcpy_fromio(mode, base, LS2K_RESOLUTION_STR_LEN);
> +
> /* The resolution field starts with the flag "video=". */
> - if (!strncmp(mode, "video=", 6))
> - mode = mode + 6;
> + if (strncmp(mode, "video=", 6)) {
> + dev_err(&pdev->dev, "Simpledrm resolution missing or
> corrupt!\n");
> + return -EINVAL;
> + }
>
> - ret = kstrtoint(strsep(&mode, "x"), 10, &pd->width);
> + pos = mode + 6;
> + ret = kstrtoint(strsep(&pos, "x"), 10, &pd->width);
> if (ret)
> return ret;
>
> - ret = kstrtoint(strsep(&mode, "-"), 10, &pd->height);
> + ret = kstrtoint(strsep(&pos, "-"), 10, &pd->height);
> if (ret)
> return ret;
>
> - ret = kstrtoint(strsep(&mode, "@"), 10, &depth);
> + ret = kstrtoint(strsep(&pos, "@"), 10, &depth);
> if (ret)
> return ret;
>
>
> base-commit: d5d2d7a8d8be18681a0864f58e3875f1c639e11c
> --
> 2.52.0
>
_______________________________________________
Openipmi-developer mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openipmi-developer