From: Thierry Reding <thierry.reding@gmail.com>
To: Thomas Zimmermann <tzimmermann@suse.de>, Rob Herring <robh@kernel.org>
Cc: David Airlie <airlied@redhat.com>,
Daniel Vetter <daniel@ffwll.ch>,
linux-tegra@vger.kernel.org, devicetree@vger.kernel.org,
Robin Murphy <robin.murphy@arm.com>,
dri-devel@lists.freedesktop.org,
Jon Hunter <jonathanh@nvidia.com>
Subject: Re: [PATCH v3 5/8] drm/simpledrm: Add support for system memory framebuffers
Date: Fri, 18 Nov 2022 16:38:21 +0100 [thread overview]
Message-ID: <Y3em7dwyJgQI1vZw@orome> (raw)
In-Reply-To: <053fbbc2-824d-648b-fdac-6f6c7c64181d@suse.de>
[-- Attachment #1: Type: text/plain, Size: 8004 bytes --]
On Fri, Nov 18, 2022 at 03:21:14PM +0100, Thomas Zimmermann wrote:
> Hi
>
> Am 17.11.22 um 19:40 schrieb Thierry Reding:
> > From: Thierry Reding <treding@nvidia.com>
> >
> > 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.
> >
> > Signed-off-by: Thierry Reding <treding@nvidia.com>
> > ---
> > Changes in v3:
> > - simplify memory code and move back to simpledrm_device_create()
> > - extract screen_base iosys_map fix into separate patch
> >
> > Changes in v2:
> > - make screen base a struct iosys_map to avoid sparse warnings
> >
> > drivers/gpu/drm/tiny/simpledrm.c | 99 ++++++++++++++++++++++++--------
> > 1 file changed, 75 insertions(+), 24 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/tiny/simpledrm.c b/drivers/gpu/drm/tiny/simpledrm.c
> > index 3673a42e4bf4..7f39bc58da52 100644
> > --- a/drivers/gpu/drm/tiny/simpledrm.c
> > +++ b/drivers/gpu/drm/tiny/simpledrm.c
> > @@ -3,6 +3,7 @@
> > #include <linux/clk.h>
> > #include <linux/of_clk.h>
> > #include <linux/minmax.h>
> > +#include <linux/of_address.h>
> > #include <linux/platform_data/simplefb.h>
> > #include <linux/platform_device.h>
> > #include <linux/regulator/consumer.h>
> > @@ -184,6 +185,31 @@ simplefb_get_format_of(struct drm_device *dev, struct device_node *of_node)
> > return simplefb_get_validated_format(dev, format);
> > }
> > +static struct resource *
> > +simplefb_get_memory_of(struct drm_device *dev, struct device_node *of_node)
> > +{
> > + struct device_node *np;
> > + struct resource *res;
> > + int err;
> > +
> > + np = of_parse_phandle(of_node, "memory-region", 0);
> > + if (!np)
> > + return NULL;
> > +
> > + res = devm_kzalloc(dev->dev, sizeof(*res), GFP_KERNEL);
> > + if (!res)
> > + return ERR_PTR(-ENOMEM);
> > +
> > + err = of_address_to_resource(np, 0, res);
> > + if (err)
> > + return ERR_PTR(err);
> > +
> > + if (of_get_property(of_node, "reg", NULL))
> > + drm_warn(dev, "preferring \"memory-region\" over \"reg\" property\n");
>
> The reg property is converted to a device resource when we create the device
> at [1].
>
> I have another question, which I was discussing with Javier recently. Is it
> possible to handle memory-region there automatically? If, for exmaple, it
> would create a resource with IORESOURCE_CACHEABLE, simpledrm would handle it
> as memory region. Without the CACHEABLE flag, it would be a regular resource
> as before.
memory-region properties are not typically converted into a standard
resource automatically. One reason may be that they can have additional
properties associated with them and so something like a CACHEABLE type
may not apply.
It's also standard to convert "reg" properties into struct resource and
that's what many drivers will expect. I don't know if all drivers will
gracefully handle being passed a struct resource that was created in
this way from a memory-region property. If at all I think this would
need to be special-cased for simple-framebuffer, in which case I'm not
convinced that putting the special case into the core OF code is any
better than putting it into the simpledrm driver.
Also, even if we did so, what would it really change? We may be able to
avoid the explicit DT lookup, but the bulk of the memory-region code is
actually mapping it, etc. That part we won't be able to automatically
handle, I think.
Ultimately this is up to Rob, not sure if he'll want to extend the
simple-framebuffer node creation code any further.
Thierry
>
> Best regards
> Thomas
>
> [1]
> https://elixir.bootlin.com/linux/v6.0.9/source/drivers/of/platform.c#L586
>
> > +
> > + return res;
> > +}
> > +
> > /*
> > * Simple Framebuffer device
> > */
> > @@ -623,8 +649,7 @@ static struct simpledrm_device *simpledrm_device_create(struct drm_driver *drv,
> > struct drm_device *dev;
> > int width, height, stride;
> > const struct drm_format_info *format;
> > - struct resource *res, *mem;
> > - void __iomem *screen_base;
> > + struct resource *res, *mem = NULL;
> > struct drm_plane *primary_plane;
> > struct drm_crtc *crtc;
> > struct drm_encoder *encoder;
> > @@ -676,6 +701,9 @@ static struct simpledrm_device *simpledrm_device_create(struct drm_driver *drv,
> > format = simplefb_get_format_of(dev, of_node);
> > if (IS_ERR(format))
> > return ERR_CAST(format);
> > + mem = simplefb_get_memory_of(dev, of_node);
> > + if (IS_ERR(mem))
> > + return ERR_CAST(mem);
> > } else {
> > drm_err(dev, "no simplefb configuration found\n");
> > return ERR_PTR(-ENODEV);
> > @@ -698,32 +726,55 @@ static struct simpledrm_device *simpledrm_device_create(struct drm_driver *drv,
> > * Memory management
> > */
> > - res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> > - if (!res)
> > - return ERR_PTR(-EINVAL);
> > + if (mem) {
> > + void *screen_base;
> > - ret = devm_aperture_acquire_from_firmware(dev, res->start, resource_size(res));
> > - if (ret) {
> > - drm_err(dev, "could not acquire memory range %pr: error %d\n", res, ret);
> > - return ERR_PTR(ret);
> > - }
> > + ret = devm_aperture_acquire_from_firmware(dev, mem->start, resource_size(mem));
> > + if (ret) {
> > + drm_err(dev, "could not acquire memory range %pr: %d\n", mem, ret);
> > + return ERR_PTR(ret);
> > + }
> > - mem = devm_request_mem_region(&pdev->dev, res->start, resource_size(res), drv->name);
> > - if (!mem) {
> > - /*
> > - * We cannot make this fatal. Sometimes this comes from magic
> > - * spaces our resource handlers simply don't know about. Use
> > - * the I/O-memory resource as-is and try to map that instead.
> > - */
> > - drm_warn(dev, "could not acquire memory region %pr\n", res);
> > - mem = res;
> > - }
> > + drm_info(dev, "using system memory framebuffer at %pr\n", mem);
> > - screen_base = devm_ioremap_wc(&pdev->dev, mem->start, resource_size(mem));
> > - if (!screen_base)
> > - return ERR_PTR(-ENOMEM);
> > + screen_base = devm_memremap(dev->dev, mem->start, resource_size(mem), MEMREMAP_WB);
> > + if (!screen_base)
> > + return ERR_PTR(-ENOMEM);
> > +
> > + iosys_map_set_vaddr(&sdev->screen_base, screen_base);
> > + } else {
> > + void __iomem *screen_base;
> > +
> > + res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> > + if (!res)
> > + return ERR_PTR(-EINVAL);
> > - iosys_map_set_vaddr_iomem(&sdev->screen_base, screen_base);
> > + ret = devm_aperture_acquire_from_firmware(dev, res->start, resource_size(res));
> > + if (ret) {
> > + drm_err(dev, "could not acquire memory range %pr: %d\n", &res, ret);
> > + return ERR_PTR(ret);
> > + }
> > +
> > + drm_info(dev, "using I/O memory framebuffer at %pr\n", res);
> > +
> > + mem = devm_request_mem_region(&pdev->dev, res->start, resource_size(res),
> > + drv->name);
> > + if (!mem) {
> > + /*
> > + * We cannot make this fatal. Sometimes this comes from magic
> > + * spaces our resource handlers simply don't know about. Use
> > + * the I/O-memory resource as-is and try to map that instead.
> > + */
> > + drm_warn(dev, "could not acquire memory region %pr\n", res);
> > + mem = res;
> > + }
> > +
> > + screen_base = devm_ioremap_wc(&pdev->dev, mem->start, resource_size(mem));
> > + if (!screen_base)
> > + return ERR_PTR(-ENOMEM);
> > +
> > + iosys_map_set_vaddr_iomem(&sdev->screen_base, screen_base);
> > + }
> > /*
> > * Modesetting
>
> --
> Thomas Zimmermann
> Graphics Driver Developer
> SUSE Software Solutions Germany GmbH
> Maxfeldstr. 5, 90409 Nürnberg, Germany
> (HRB 36809, AG Nürnberg)
> Geschäftsführer: Ivo Totev
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
next prev parent reply other threads:[~2022-11-18 15:38 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-17 18:40 [PATCH v3 0/8] drm/simpledrm: Support system memory framebuffers Thierry Reding
2022-11-17 18:40 ` [PATCH v3 1/8] dt-bindings: display: simple-framebuffer: " Thierry Reding
2022-11-17 18:40 ` [PATCH v3 2/8] dt-bindings: display: simple-framebuffer: Document 32-bit BGR format Thierry Reding
2022-11-17 18:40 ` [PATCH v3 3/8] dt-bindings: reserved-memory: Support framebuffer reserved memory Thierry Reding
2022-11-17 18:40 ` [PATCH v3 4/8] drm/simpledrm: Use struct iosys_map consistently Thierry Reding
2022-11-18 13:56 ` Thomas Zimmermann
2022-11-17 18:40 ` [PATCH v3 5/8] drm/simpledrm: Add support for system memory framebuffers Thierry Reding
2022-11-18 14:11 ` Thomas Zimmermann
2022-11-18 14:21 ` Thomas Zimmermann
2022-11-18 15:38 ` Thierry Reding [this message]
2022-11-18 15:54 ` Thomas Zimmermann
2022-11-18 16:28 ` Thierry Reding
2022-11-17 18:40 ` [PATCH v3 6/8] drm/format-helper: Support the XB24 format Thierry Reding
2022-11-18 15:00 ` Thomas Zimmermann
2022-11-17 18:40 ` [PATCH v3 7/8] drm/simpledrm: Support the XB24/AB24 format Thierry Reding
2022-11-18 15:08 ` Thomas Zimmermann
2022-11-18 15:44 ` Thierry Reding
2022-11-18 16:10 ` Thomas Zimmermann
2022-11-18 16:34 ` Thierry Reding
2022-11-17 18:40 ` [PATCH v3 8/8] arm64: tegra: Add simple framebuffer on Jetson Xavier NX Thierry Reding
2023-01-17 14:55 ` Thomas Zimmermann
2023-01-19 15:10 ` Thierry Reding
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Y3em7dwyJgQI1vZw@orome \
--to=thierry.reding@gmail.com \
--cc=airlied@redhat.com \
--cc=daniel@ffwll.ch \
--cc=devicetree@vger.kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=jonathanh@nvidia.com \
--cc=linux-tegra@vger.kernel.org \
--cc=robh@kernel.org \
--cc=robin.murphy@arm.com \
--cc=tzimmermann@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).