On Tue, Oct 18, 2022 at 5:47 AM Thierry Reding <thierry.reding@xxxxxxxxx> wrote: > > On Mon, Oct 17, 2022 at 01:15:59PM -0500, Rob Herring wrote: > > On Mon, Oct 17, 2022 at 9:54 AM Thierry Reding <thierry.reding@xxxxxxxxx> wrote: > > > > > > On Mon, Oct 10, 2022 at 10:12:34AM +0200, Thomas Zimmermann wrote: > > > > Hi > > > > > > > > Am 07.10.22 um 14:49 schrieb Thierry Reding: > > > > > From: Thierry Reding <treding@xxxxxxxxxx> > > > > > > > > > > Simple framebuffers can be set up in system memory, which cannot be > > > > > requested and/or I/O remapped using the I/O resource helpers. Add a > > > > > separate code path that obtains system memory framebuffers from the > > > > > reserved memory region referenced in the memory-region property. > > > > > > > > > > v2: make screen base a struct iosys_map to avoid sparse warnings > > > > [...] > > > > > > > +static int simple_framebuffer_init(struct reserved_mem *rmem) > > > > > +{ > > > > > + pr_info("framebuffer memory at %pa, size %lu bytes\n", &rmem->base, > > > > > + (unsigned long)rmem->size); > > > > > + > > > > > + rmem->ops = &simple_framebuffer_ops; > > > > > + > > > > > + return 0; > > > > > +} > > > > > +RESERVEDMEM_OF_DECLARE(simple_framebuffer, "framebuffer", simple_framebuffer_init); > > > > > > > > What's the prupose of these code at all? I looked through the kernel, but > > > > there aren't many other examples of it. > > > > > > This is a fairly standard construct to deal with early memory > > > reservations. What happens is roughly this: during early kernel boot, > > > the reserved-memory core code will iterate over all children of the top- > > > level reserved-memory node and see if they have a compatible string that > > > matches one of the entries in the table created by these > > > RESERVEDMEM_OF_DECLARE entries. It will then call the init function for > > > a matched entry and register a struct reserved_mem for these. The init > > > function in this case just dumps an informational message to the boot > > > log to provide some information about the framebuffer region that was > > > reserved (which can be used for example for troubleshooting purposes) > > > and sets the device init/release operations (which will be called when a > > > device is associated with the reserved memory region, i.e. when the > > > of_reserved_mem_device_init_by_idx() function is called). > > > > > > The reason why there aren't many examples of this is because these are > > > special memory regions that (at least upstream) kernels seldom support. > > > Perhaps the most common use-cases are the shared DMA pools (such as > > > CMA). > > > > Also, not all regions need to be handled 'early' before slab allocator > > or drivers are probed. Do you need early handling here? I can't see > > why other than if fbcon is up early. > > No, I don't think this needs early handling. Obviously we want this to > be available as soon as possible, but since the framebuffer driver is > built on top of DRM and that all becomes available fairly late, I don't > think this could ever run *that* early. > > So are you saying that in general if we don't need early handling we > should avoid RESERVEDMEM_OF_DECLARE and instead manually resolve the > memory regions and inspect them? In other words, RESERVEDMEM_OF_DECLARE > should only ever be used when this early handling is needed? Right. Like all the other *_OF_DECLARE() macros, they are only for when needed before driver probe time. Lots of shared memory mailbox drivers use reserved-memory regions if you need examples. Rob