From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 28BBDC433EF for ; Sat, 9 Apr 2022 19:05:34 +0000 (UTC) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 27D0783639; Sat, 9 Apr 2022 21:05:32 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=fail (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.b="Sr2rrdV7"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 217A38394D; Sat, 9 Apr 2022 21:05:29 +0200 (CEST) Received: from mout.gmx.net (mout.gmx.net [212.227.17.21]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 0D1B7831CA for ; Sat, 9 Apr 2022 21:05:26 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=xypron.glpk@gmx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1649531109; bh=2t62PzHMXF/qJ5fPgBa8WFOweax4TDSrGZgUl39DyTY=; h=X-UI-Sender-Class:Date:Subject:To:Cc:References:From:In-Reply-To; b=Sr2rrdV7Jca3H+QqYgIX4s0yQGrue5fVjFq8W00sC/XCLdZGL5ed0MzTEUGwPYEfM K8RHJTc4gaeN+WAHTbnFBUqi19IsxLxmLAhEKf46GQlrEPLIiTHR2Dx3+tRyFypcAw W9bUxXbbKjXesx01c/VRj/zObU6yomFikoYfUhXo= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from [192.168.123.94] ([88.152.144.107]) by mail.gmx.net (mrgmx105 [212.227.17.168]) with ESMTPSA (Nemesis) id 1Mq2nK-1oHIAg3CyI-00n7as; Sat, 09 Apr 2022 21:05:08 +0200 Message-ID: Date: Sat, 9 Apr 2022 21:05:07 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.8.0 Subject: Re: [PATCH v3 11/19] dm: disk: add UCLASS_PARTITION Content-Language: en-US To: AKASHI Takahiro , sjg@chromium.org Cc: masami.hiramatsu@linaro.org, u-boot@lists.denx.de, lukma@denx.de, peng.fan@nxp.com, jh80.chung@samsung.com, bmeng.cn@gmail.com, sr@denx.de, ilias.apalodimas@linaro.org References: <20220308113657.221101-1-takahiro.akashi@linaro.org> <20220308113657.221101-12-takahiro.akashi@linaro.org> From: Heinrich Schuchardt In-Reply-To: <20220308113657.221101-12-takahiro.akashi@linaro.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:CGHGKLKtK8vy55p8P1F+U81kj5w2rofq9dPLGrq6Jh0xv6AwaoO 944TSpGm6VFeUvWPY0330ZAcG1fi3CAqe7HRppRXf0Mj8WrQ9SS7FhrqzI29c8GQ8qe+qhk t2/m04ppo2GJF/3wPl9CHQ14g+DJp3k817zpPwLsdc86cP2wWkaJ/3OV/eeEUQGkqpNiaXv 8iC0fbNkcODt6+irnZ/cQ== X-UI-Out-Filterresults: notjunk:1;V03:K0:nRkFqF1K2AU=:fkyIf8bhl4eHmkI3gP2ZzL 3vFWggiaiFwt5ihl65yO+OXuDvefBz2r79OnDK4UHFdrzEvTvq9Tko7m/GIOoEiX1CDbAWncc Zd7BY6yHBhRLBKIULdMVvCdPlBX1yt645bmYmfPjSo538Hc95yqNxv9O2egz/r0PbYKB+AxQY nKzJrRc5UxAeo/Hte8tISCuwIxTKYnw+CpdHp1gHq+aKh+Lt4KsiA7GOZ67oiG6FDkwGSNvGD 4vcAEXMaTJWRnYn5VJeFEsC3IStt3WzQLJM38gVZ9KzqIjTZvBZXRSJACqh7C5flsxvpnt3Y1 GjPwJRG/j+7/9XIf5slpu2WF76HDmw57oy4S9sN3J5RCQDdUFHAh18Qt3d32iBk7cxxVt2v2j 3bIQ7cQWO4U2odw1KD/ZQuf6kPnR7uZU/YinH8WXjy43B99meLaN+BpZo+DvV0nznzW47Cwaf jd2Mmi3uluSVRX5xsj5veBRWEDesrXvD+UWBtzRfG8vAzRrMBFvYwRmDVHDjO4pYbWPNjnmBe tsRttaJaKFrQZLHiV1dAPog4A2VwKBIx6j2Hx9qaEcenTRN84xvDh0+A73+3DX1YdjxxlhQpl j3LPIt2jyFny5Er6/gOSx2S9rjmJ3f2z/83kh9NXnmC20tuSS18jJpTghEywHEFnQDfNyVrln J+bJukDWuLX+JRBDnBu71NlXwm24c5FAMzhLy8tRbbUbNqE7VvhAL9/hIs8UevR7XD6wZjndL xcnqwUXZqQQLyC0tAz8+zl/X6C2QkRd9RYKroP/1AN0IN2KrdhTn8wFd7HnzawEgWcvoqIhkx iGKIoznUyvVx4I4uX8FgYkhobP1U6GTfQdpqIHtvEGd1AKY2UGkjHw60getw0AjXCZ4ovKPuB +RgzJn4I/P4ubZIuwQFlqjyz2z5nVsyowaYW6rgtSwGHOLUWOhjTOxfNkeZPkH8OcbK9EtNf+ 6VAPLAnNYc7EqEomOhtOBl9Tnez/Oh4aXrjt4Ce/9F4YHi9Xl79AdcXUNorW3QJwYdvR1Cy4l 3q7f+cm8s19ixhXLZ0V0IhBy2IMqbAi0Z+0DuWnleaT7mvlJjvMOENJhwDWIPurnl+esKLgIt PIqhEjExmR+0Tk= X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.39 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.5 at phobos.denx.de X-Virus-Status: Clean On 3/8/22 12:36, AKASHI Takahiro wrote: > With this new function, UCLASS_PARTITION devices will be created as > child nodes of UCLASS_BLK device. > > Signed-off-by: AKASHI Takahiro > --- > disk/Makefile | 3 + > disk/disk-uclass.c | 153 +++++++++++++++++++++++++++++++++++++++++ > include/dm/uclass-id.h | 1 + > include/part.h | 11 +++ > 4 files changed, 168 insertions(+) > create mode 100644 disk/disk-uclass.c > > diff --git a/disk/Makefile b/disk/Makefile > index 6ce5a687b36c..ec37b74f5f40 100644 > --- a/disk/Makefile > +++ b/disk/Makefile > @@ -6,6 +6,9 @@ > #ccflags-y +=3D -DET_DEBUG -DDEBUG > > obj-$(CONFIG_PARTITIONS) +=3D part.o > +ifdef CONFIG_$(SPL_)BLK > +obj-$(CONFIG_PARTITIONS) +=3D disk-uclass.o phycore-rk3288_defconfig has CONFIG_SPL_LIBDISK_SUPPORT=3Dn ("Support disk partitions"). But spl/disk/disk-uclass is built. This leads to an unnecessary size increase of the SPL image. With this size increase building fails. Best regards Heinrich > +endif > obj-$(CONFIG_$(SPL_)MAC_PARTITION) +=3D part_mac.o > obj-$(CONFIG_$(SPL_)DOS_PARTITION) +=3D part_dos.o > obj-$(CONFIG_$(SPL_)ISO_PARTITION) +=3D part_iso.o > diff --git a/disk/disk-uclass.c b/disk/disk-uclass.c > new file mode 100644 > index 000000000000..4918a2f72d1e > --- /dev/null > +++ b/disk/disk-uclass.c > @@ -0,0 +1,153 @@ > +// SPDX-License-Identifier: GPL-2.0+ > +/* > + * Software partition device (UCLASS_PARTITION) > + * > + * Copyright (c) 2021 Linaro Limited > + * Author: AKASHI Takahiro > + */ > + > +#define LOG_CATEGORY UCLASS_PARTITION > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +int part_create_block_devices(struct udevice *blk_dev) > +{ > + int part, count; > + struct blk_desc *desc =3D dev_get_uclass_plat(blk_dev); > + struct disk_partition info; > + struct disk_part *part_data; > + char devname[32]; > + struct udevice *dev; > + int ret; > + > + if (!CONFIG_IS_ENABLED(PARTITIONS) || > + !CONFIG_IS_ENABLED(HAVE_BLOCK_DEVICE)) > + return 0; > + > + if (device_get_uclass_id(blk_dev) !=3D UCLASS_BLK) > + return 0; > + > + /* Add devices for each partition */ > + for (count =3D 0, part =3D 1; part <=3D MAX_SEARCH_PARTITIONS; part++)= { > + if (part_get_info(desc, part, &info)) > + continue; > + snprintf(devname, sizeof(devname), "%s:%d", blk_dev->name, > + part); > + > + ret =3D device_bind_driver(blk_dev, "blk_partition", > + strdup(devname), &dev); > + if (ret) > + return ret; > + > + part_data =3D dev_get_uclass_plat(dev); > + part_data->partnum =3D part; > + part_data->gpt_part_info =3D info; > + count++; > + > + ret =3D device_probe(dev); > + if (ret) { > + debug("Can't probe\n"); > + count--; > + device_unbind(dev); > + > + continue; > + } > + } > + debug("%s: %d partitions found in %s\n", __func__, count, > + blk_dev->name); > + > + return 0; > +} > + > +static ulong blk_part_read(struct udevice *dev, lbaint_t start, > + lbaint_t blkcnt, void *buffer) > +{ > + struct udevice *parent; > + struct disk_part *part; > + const struct blk_ops *ops; > + > + parent =3D dev_get_parent(dev); > + ops =3D blk_get_ops(parent); > + if (!ops->read) > + return -ENOSYS; > + > + part =3D dev_get_uclass_plat(dev); > + if (start >=3D part->gpt_part_info.size) > + return 0; > + > + if ((start + blkcnt) > part->gpt_part_info.size) > + blkcnt =3D part->gpt_part_info.size - start; > + start +=3D part->gpt_part_info.start; > + > + return ops->read(parent, start, blkcnt, buffer); > +} > + > +static ulong blk_part_write(struct udevice *dev, lbaint_t start, > + lbaint_t blkcnt, const void *buffer) > +{ > + struct udevice *parent; > + struct disk_part *part; > + const struct blk_ops *ops; > + > + parent =3D dev_get_parent(dev); > + ops =3D blk_get_ops(parent); > + if (!ops->write) > + return -ENOSYS; > + > + part =3D dev_get_uclass_plat(dev); > + if (start >=3D part->gpt_part_info.size) > + return 0; > + > + if ((start + blkcnt) > part->gpt_part_info.size) > + blkcnt =3D part->gpt_part_info.size - start; > + start +=3D part->gpt_part_info.start; > + > + return ops->write(parent, start, blkcnt, buffer); > +} > + > +static ulong blk_part_erase(struct udevice *dev, lbaint_t start, > + lbaint_t blkcnt) > +{ > + struct udevice *parent; > + struct disk_part *part; > + const struct blk_ops *ops; > + > + parent =3D dev_get_parent(dev); > + ops =3D blk_get_ops(parent); > + if (!ops->erase) > + return -ENOSYS; > + > + part =3D dev_get_uclass_plat(dev); > + if (start >=3D part->gpt_part_info.size) > + return 0; > + > + if ((start + blkcnt) > part->gpt_part_info.size) > + blkcnt =3D part->gpt_part_info.size - start; > + start +=3D part->gpt_part_info.start; > + > + return ops->erase(parent, start, blkcnt); > +} > + > +static const struct blk_ops blk_part_ops =3D { > + .read =3D blk_part_read, > + .write =3D blk_part_write, > + .erase =3D blk_part_erase, > +}; > + > +U_BOOT_DRIVER(blk_partition) =3D { > + .name =3D "blk_partition", > + .id =3D UCLASS_PARTITION, > + .ops =3D &blk_part_ops, > +}; > + > +UCLASS_DRIVER(partition) =3D { > + .id =3D UCLASS_PARTITION, > + .per_device_plat_auto =3D sizeof(struct disk_part), > + .name =3D "partition", > +}; > diff --git a/include/dm/uclass-id.h b/include/dm/uclass-id.h > index 0e26e1d13824..230b1ea528cf 100644 > --- a/include/dm/uclass-id.h > +++ b/include/dm/uclass-id.h > @@ -83,6 +83,7 @@ enum uclass_id { > UCLASS_P2SB, /* (x86) Primary-to-Sideband Bus */ > UCLASS_PANEL, /* Display panel, such as an LCD */ > UCLASS_PANEL_BACKLIGHT, /* Backlight controller for panel */ > + UCLASS_PARTITION, /* Logical disk partition device */ > UCLASS_PCH, /* x86 platform controller hub */ > UCLASS_PCI, /* PCI bus */ > UCLASS_PCI_EP, /* PCI endpoint device */ > diff --git a/include/part.h b/include/part.h > index 53cfbdd87671..95e30e60af10 100644 > --- a/include/part.h > +++ b/include/part.h > @@ -253,6 +253,17 @@ void part_set_generic_name(const struct blk_desc *d= ev_desc, > int part_num, char *name); > > extern const struct block_drvr block_drvr[]; > + > +struct udevice; > +/** > + * part_create_block_devices - Create block devices for disk partitions > + * > + * Create UCLASS_PARTITION udevices for each of disk partitions in @par= ent > + * > + * @blk_dev: Whole disk device > + */ > +int part_create_block_devices(struct udevice *blk_dev); > + > #else > static inline struct blk_desc *blk_get_dev(const char *ifname, int dev= ) > { return NULL; }