From: Daniel Vetter <daniel@ffwll.ch>
To: Eric Anholt <eric@anholt.net>
Cc: devicetree@vger.kernel.org,
Stephen Warren <swarren@wwwdotorg.org>,
Lee Jones <lee@kernel.org>,
linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
linux-rpi-kernel@lists.infradead.org,
linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH 3/7] drm/vc4: Add KMS support for Raspberry Pi.
Date: Thu, 13 Aug 2015 23:17:55 +0200 [thread overview]
Message-ID: <20150813211755.GE17734@phenom.ffwll.local> (raw)
In-Reply-To: <87d1yqq5po.fsf@eliezer.anholt.net>
On Thu, Aug 13, 2015 at 01:44:03PM -0700, Eric Anholt wrote:
> Daniel Vetter <daniel@ffwll.ch> writes:
>
> > On Wed, Aug 12, 2015 at 05:56:16PM -0700, Eric Anholt wrote:
> >> This is the start of a full VC4 driver. Right now this just supports
> >> configuring the display using a pre-existing video mode (because
> >> changing the pixel clock isn't available yet, and doesn't work when it
> >> is). However, this is enough for fbcon and bringing up X using
> >> xf86-video-modesetting.
> >>
> >> Signed-off-by: Eric Anholt <eric@anholt.net>
> >> ---
> >> drivers/gpu/drm/Kconfig | 2 +
> >> drivers/gpu/drm/Makefile | 1 +
> >> drivers/gpu/drm/vc4/Kconfig | 14 +
> >> drivers/gpu/drm/vc4/Makefile | 18 ++
> >> drivers/gpu/drm/vc4/vc4_bo.c | 54 ++++
> >> drivers/gpu/drm/vc4/vc4_crtc.c | 583 ++++++++++++++++++++++++++++++++++
> >> drivers/gpu/drm/vc4/vc4_debugfs.c | 38 +++
> >> drivers/gpu/drm/vc4/vc4_drv.c | 249 +++++++++++++++
> >> drivers/gpu/drm/vc4/vc4_drv.h | 123 +++++++
> >> drivers/gpu/drm/vc4/vc4_hdmi.c | 651 ++++++++++++++++++++++++++++++++++++++
> >> drivers/gpu/drm/vc4/vc4_hvs.c | 172 ++++++++++
> >> drivers/gpu/drm/vc4/vc4_kms.c | 84 +++++
> >> drivers/gpu/drm/vc4/vc4_plane.c | 320 +++++++++++++++++++
> >> drivers/gpu/drm/vc4/vc4_regs.h | 562 ++++++++++++++++++++++++++++++++
> >> 14 files changed, 2871 insertions(+)
> >> create mode 100644 drivers/gpu/drm/vc4/Kconfig
> >> create mode 100644 drivers/gpu/drm/vc4/Makefile
> >> create mode 100644 drivers/gpu/drm/vc4/vc4_bo.c
> >> create mode 100644 drivers/gpu/drm/vc4/vc4_crtc.c
> >> create mode 100644 drivers/gpu/drm/vc4/vc4_debugfs.c
> >> create mode 100644 drivers/gpu/drm/vc4/vc4_drv.c
> >> create mode 100644 drivers/gpu/drm/vc4/vc4_drv.h
> >> create mode 100644 drivers/gpu/drm/vc4/vc4_hdmi.c
> >> create mode 100644 drivers/gpu/drm/vc4/vc4_hvs.c
> >> create mode 100644 drivers/gpu/drm/vc4/vc4_kms.c
> >> create mode 100644 drivers/gpu/drm/vc4/vc4_plane.c
> >> create mode 100644 drivers/gpu/drm/vc4/vc4_regs.h
> >
> > Made a quick pass and found a few things to update to latest drm
> > developments. Of course didn't look at the hardware details since no clue,
> > but looks really nice overall.
>
> If you have anything about the hardware that you were curious about, I'd
> be interested in trying to explain them in the comments to the extent
> that I can. It's unfortunate that we haven't shipped docs for the
> display side of things, but had to do a lot of reading of the verilog
> just to get this far, anyway.
The only thing I spotted is that you right now only register a primary and
cursor plane. I guess the plan we once discussed about exposing piles of
planes for -modesetting accel isn't there yet?
But otherwise I really didn't go into the hardware details.
> >> diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
> >> index c46ca31..1730a76 100644
> >> --- a/drivers/gpu/drm/Kconfig
> >> +++ b/drivers/gpu/drm/Kconfig
> >> @@ -240,3 +240,5 @@ source "drivers/gpu/drm/sti/Kconfig"
> >> source "drivers/gpu/drm/amd/amdkfd/Kconfig"
> >>
> >> source "drivers/gpu/drm/imx/Kconfig"
> >> +
> >> +source "drivers/gpu/drm/vc4/Kconfig"
> >> diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
> >> index 5713d05..b991ac5 100644
> >> --- a/drivers/gpu/drm/Makefile
> >> +++ b/drivers/gpu/drm/Makefile
> >> @@ -42,6 +42,7 @@ obj-$(CONFIG_DRM_MGA) += mga/
> >> obj-$(CONFIG_DRM_I810) += i810/
> >> obj-$(CONFIG_DRM_I915) += i915/
> >> obj-$(CONFIG_DRM_MGAG200) += mgag200/
> >> +obj-$(CONFIG_DRM_VC4) += vc4/
> >> obj-$(CONFIG_DRM_CIRRUS_QEMU) += cirrus/
> >> obj-$(CONFIG_DRM_SIS) += sis/
> >> obj-$(CONFIG_DRM_SAVAGE)+= savage/
> >> diff --git a/drivers/gpu/drm/vc4/Kconfig b/drivers/gpu/drm/vc4/Kconfig
> >> new file mode 100644
> >> index 0000000..130cc94
> >> --- /dev/null
> >> +++ b/drivers/gpu/drm/vc4/Kconfig
> >> @@ -0,0 +1,14 @@
> >> +config DRM_VC4
> >> + tristate "Broadcom VC4 Graphics"
> >> + depends on ARCH_BCM2835
> >> + depends on DRM
> >> + select DRM_KMS_HELPER
> >> + select DRM_KMS_FB_HELPER
> >> + select DRM_KMS_CMA_HELPER
> >
> > drm-misc/linux-next already has Archit's patches to enable/disable fbdev
> > in the core code, so you don't need to bother about these selects here any
> > more, it'll no-op out if drm fbdev emulation isn't enabled. Since you're
> > reusing cma fbdev helpers I don't think there's any need for other changes
> > because of this.
>
> It sounds like I should rebase on that, then?
Yeah probably simplest. I made a pull request for drm-misc and a tag and
cc'ed you on it so you have a baseline.
> >> + help
> >> + Choose this option if you have a system that has a Broadcom
> >> + VC4 GPU, such as the Raspberry Pi or other BCM2708/BCM2835.
> >> +
> >> + This driver requires that "avoid_warnings=2" be present in
> >> + the config.txt for the firmware, to keep it from smashing
> >> + our display setup.
> >> diff --git a/drivers/gpu/drm/vc4/Makefile b/drivers/gpu/drm/vc4/Makefile
> >> new file mode 100644
> >> index 0000000..4aa07ca
> >> --- /dev/null
> >> +++ b/drivers/gpu/drm/vc4/Makefile
> >> @@ -0,0 +1,18 @@
> >> +ccflags-y := -Iinclude/drm
> >> +
> >> +# Please keep these build lists sorted!
> >> +
> >> +# core driver code
> >> +vc4-y := \
> >> + vc4_bo.o \
> >> + vc4_crtc.o \
> >> + vc4_drv.o \
> >> + vc4_kms.o \
> >> + vc4_hdmi.o \
> >> + vc4_hvs.o \
> >> + vc4_plane.o \
> >> + $()
> >> +
> >> +vc4-$(CONFIG_DEBUG_FS) += vc4_debugfs.o
> >> +
> >> +obj-$(CONFIG_DRM_VC4) += vc4.o
> >> diff --git a/drivers/gpu/drm/vc4/vc4_bo.c b/drivers/gpu/drm/vc4/vc4_bo.c
> >> new file mode 100644
> >> index 0000000..fee8cac
> >> --- /dev/null
> >> +++ b/drivers/gpu/drm/vc4/vc4_bo.c
> >> @@ -0,0 +1,54 @@
> >> +/*
> >> + * Copyright © 2015 Broadcom
> >> + *
> >> + * This program is free software; you can redistribute it and/or modify
> >> + * it under the terms of the GNU General Public License version 2 as
> >> + * published by the Free Software Foundation.
> >> + */
> >> +
> >> +/* DOC: VC4 GEM BO management support.
> >> + *
> >> + * The VC4 GPU architecture (both scanout and rendering) has direct
> >> + * access to system memory with no MMU in between. To support it, we
> >> + * use the GEM CMA helper functions to allocate contiguous ranges of
> >> + * physical memory for our BOs.
> >> + */
> >
> > Since you're doing kerneldoc considered pulling it all into a new vc4
> > section in the drm docbook template?
>
> I hadn't found the docbook template. Interesting. I'll try to cook up
> some general vc4 docs for that. I think that could be a separate
> commit, though?
Sure. Really just for yourself and other people hacking on this. btw
there's some work intel sponsors from collabora to improve kerneldoc
comments with automated hyperlinking, markdown and a few other things. But
unfortunately not yet merged.
> >> +
> >> +#include "vc4_drv.h"
> >> +
> >> +struct vc4_bo *vc4_bo_create(struct drm_device *dev, size_t size)
> >> +{
> >> + struct drm_gem_cma_object *cma_obj;
> >> +
> >> + cma_obj = drm_gem_cma_create(dev, size);
> >> + if (IS_ERR(cma_obj))
> >> + return NULL;
> >> + else
> >> + return to_vc4_bo(&cma_obj->base);
> >> +}
> >> +
> >> +int vc4_dumb_create(struct drm_file *file_priv,
> >> + struct drm_device *dev,
> >> + struct drm_mode_create_dumb *args)
> >> +{
> >> + int min_pitch = DIV_ROUND_UP(args->width * args->bpp, 8);
> >> + struct vc4_bo *bo = NULL;
> >> + int ret;
> >> +
> >> + if (args->pitch < min_pitch)
> >> + args->pitch = min_pitch;
> >> +
> >> + if (args->size < args->pitch * args->height)
> >> + args->size = args->pitch * args->height;
> >> +
> >> + mutex_lock(&dev->struct_mutex);
> >> + bo = vc4_bo_create(dev, roundup(args->size, PAGE_SIZE));
> >> + mutex_unlock(&dev->struct_mutex);
> >
> > I'm on a struct_mutex crusade (trying to get rid of it in core and allow
> > drivers to live without it). On a quick look there doesn't seem to be
> > anything that needs struct_mutex here, so please just remove it. If there
> > is indeed something vc4-internal you want to protect, please use your own
> > driver-internal mutex (e.g. for drm_mm or command submission or whatever).
> >
> > btw the last bit in the drm core for modern drivers that needs
> > struct_mutex is mmap_offset gem object lookup. I plan to replace that with
> > kref_get_unless_zero trickery, which would make the core and a lot of
> > drivers struct_mutex free and so relegate it mostly to a legacy role (and
> > can be forgotten).
>
> Struct mutex is here because this code is from the V3D series, with the
> in-kernel BO cache ripped out (it turns out that the CMA allocator is
> slow, and you can't just userspace cache since we have to do allocations
> within the kernel to the tune of a couple per draw and that's too much).
>
> I'll pull the mutex calls out for now until the cache stuff is
> submitted.
Yeah I suspected that's for later. If feasible it'd be great if you could
rearchtect it to use a driver-private lock, just to not grow another place
using it.
> >> +static bool vc4_crtc_mode_fixup(struct drm_crtc *crtc,
> >> + const struct drm_display_mode *mode,
> >> + struct drm_display_mode *adjusted_mode)
> >> +{
> >> + return true;
> >> +}
> >
> > mode_fixup on crtcs is optional since 840bfe953384a and I just merged a
> > patch to make it optional for encoders too (when using atomic helpers
> > which you do). You can remove them both.
>
> Great! It felt like there was a *lot* of boilerplate when I was first
> writing this stuff, and things are way better than they used to be.
Just noticed that crtc->atomic_begin is optional too. btw if you spot
boilerplate somewhere else please raise it on irc, there's still a lot of
room for improvement for atomic helpers.
-Daniel
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
next prev parent reply other threads:[~2015-08-13 21:18 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-08-13 0:56 Raspberry Pi KMS-only driver Eric Anholt
2015-08-13 0:56 ` [PATCH 1/7] drm/vc4: Add devicetree bindings for VC4 Eric Anholt
2015-08-15 4:38 ` Stephen Warren
2015-08-17 18:30 ` Eric Anholt
[not found] ` <874mjxwyx5.fsf-omZaPlIz5HhaEpDpdNBo/KxOck334EZe@public.gmane.org>
2015-08-24 13:47 ` Rob Herring
2015-08-25 20:42 ` Rob Clark
2015-08-25 23:22 ` Rob Herring
2015-08-26 11:52 ` Daniel Vetter
2015-08-26 12:09 ` Thierry Reding
[not found] ` <20150826120934.GC320-AwZRO8vwLAwmlAP/+Wk3EA@public.gmane.org>
2015-08-26 14:30 ` Rob Herring
2015-08-26 20:59 ` Dave Airlie
[not found] ` <CAPM=9tw=3yGQE3_G+=ian-+iV-OCRatbFc-stoMczmXeM2Ko+Q-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-08-27 0:35 ` Rob Herring
2015-08-26 11:51 ` Thierry Reding
2015-08-24 13:56 ` Rob Herring
2015-08-13 0:56 ` [PATCH 2/7] MAINTAINERS: Add myself for the new VC4 (RPi GPU) graphics driver Eric Anholt
[not found] ` <1439427380-2436-3-git-send-email-eric-WhKQ6XTQaPysTnJN9+BGXg@public.gmane.org>
2015-08-15 4:39 ` Stephen Warren
[not found] ` <55CEC29C.806-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2015-08-17 18:47 ` Eric Anholt
2015-08-13 0:56 ` [PATCH 3/7] drm/vc4: Add KMS support for Raspberry Pi Eric Anholt
2015-08-13 7:51 ` Daniel Vetter
2015-08-13 20:44 ` Eric Anholt
2015-08-13 21:17 ` Daniel Vetter [this message]
2015-08-18 20:56 ` Eric Anholt
2015-08-13 21:29 ` Russell King - ARM Linux
2015-08-13 23:03 ` Eric Anholt
[not found] ` <1439427380-2436-4-git-send-email-eric-WhKQ6XTQaPysTnJN9+BGXg@public.gmane.org>
2015-08-13 11:45 ` Emil Velikov
2015-08-15 4:45 ` Stephen Warren
2015-08-17 17:56 ` Eric Anholt
2015-08-13 0:56 ` [PATCH 4/7] drm/vc4: Use the fbdev_cma helpers Eric Anholt
2015-08-13 0:56 ` [PATCH 5/7] drm/vc4: Allow vblank to be disabled Eric Anholt
2015-08-13 0:56 ` [PATCH 6/7] ARM: bcm2835: Add the DDC I2C controller to the device tree Eric Anholt
[not found] ` <1439427380-2436-7-git-send-email-eric-WhKQ6XTQaPysTnJN9+BGXg@public.gmane.org>
2015-08-15 4:51 ` Stephen Warren
2015-08-17 18:35 ` Eric Anholt
2015-08-13 0:56 ` [PATCH 7/7] ARM: bcm2835: Add VC4 " Eric Anholt
[not found] ` <1439427380-2436-8-git-send-email-eric-WhKQ6XTQaPysTnJN9+BGXg@public.gmane.org>
2015-08-15 4:54 ` Stephen Warren
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=20150813211755.GE17734@phenom.ffwll.local \
--to=daniel@ffwll.ch \
--cc=devicetree@vger.kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=eric@anholt.net \
--cc=lee@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rpi-kernel@lists.infradead.org \
--cc=swarren@wwwdotorg.org \
/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