* Re: [linux-sunxi] Re: [PATCH v3 04/11] drm/sun4i: abstract the layer type [not found] <20170405052325.98B958A2E94@relay.mailchannels.net> @ 2017-04-05 8:09 ` Maxime Ripard 0 siblings, 0 replies; 3+ messages in thread From: Maxime Ripard @ 2017-04-05 8:09 UTC (permalink / raw) To: Icenowy Zheng Cc: Chen-Yu Tsai, linux-arm-kernel, Sean Paul, linux-sunxi, Rob Herring, linux-kernel, devicetree, Jernej Skrabec, linux-clk, dri-devel [-- Attachment #1: Type: text/plain, Size: 6913 bytes --] On Wed, Apr 05, 2017 at 01:23:15PM +0800, Icenowy Zheng wrote: > > 2017年4月5日 10:27于 Chen-Yu Tsai <wens@csie.org>写道: > > > > On Wed, Apr 5, 2017 at 3:53 AM, Icenowy Zheng <icenowy@aosc.io> wrote: > > > > > > > > > 在 2017年04月05日 03:28, Sean Paul 写道: > > >> > > >> On Thu, Mar 30, 2017 at 03:46:06AM +0800, Icenowy Zheng wrote: > > >>> > > >>> As we are going to add support for the Allwinner DE2 Mixer in sun4i-drm > > >>> driver, we will finally have two types of layer. > > >>> > > >>> Abstract the layer type to void * and a ops struct, which contains the > > >>> only function used by crtc -- get the drm_plane struct of the layer. > > >>> > > >>> Signed-off-by: Icenowy Zheng <icenowy@aosc.io> > > >>> --- > > >>> Refactored patch in v3. > > >>> > > >>> drivers/gpu/drm/sun4i/sun4i_crtc.c | 19 +++++++++++-------- > > >>> drivers/gpu/drm/sun4i/sun4i_crtc.h | 3 ++- > > >>> drivers/gpu/drm/sun4i/sun4i_layer.c | 19 ++++++++++++++++++- > > >>> drivers/gpu/drm/sun4i/sun4i_layer.h | 2 +- > > >>> drivers/gpu/drm/sun4i/sunxi_layer.h | 17 +++++++++++++++++ > > >>> 5 files changed, 49 insertions(+), 11 deletions(-) > > >>> create mode 100644 drivers/gpu/drm/sun4i/sunxi_layer.h > > >>> > > >>> diff --git a/drivers/gpu/drm/sun4i/sun4i_crtc.c > > >>> b/drivers/gpu/drm/sun4i/sun4i_crtc.c > > >>> index 3c876c3a356a..33854ee7f636 100644 > > >>> --- a/drivers/gpu/drm/sun4i/sun4i_crtc.c > > >>> +++ b/drivers/gpu/drm/sun4i/sun4i_crtc.c > > >>> @@ -29,6 +29,7 @@ > > >>> #include "sun4i_crtc.h" > > >>> #include "sun4i_drv.h" > > >>> #include "sun4i_layer.h" > > >>> +#include "sunxi_layer.h" > > >>> #include "sun4i_tcon.h" > > >>> > > >>> static void sun4i_crtc_atomic_begin(struct drm_crtc *crtc, > > >>> @@ -149,7 +150,7 @@ struct sun4i_crtc *sun4i_crtc_init(struct drm_device > > >>> *drm, > > >>> scrtc->tcon = tcon; > > >>> > > >>> /* Create our layers */ > > >>> - scrtc->layers = sun4i_layers_init(drm, scrtc->backend); > > >>> + scrtc->layers = (void **)sun4i_layers_init(drm, scrtc); > > >>> if (IS_ERR(scrtc->layers)) { > > >>> dev_err(drm->dev, "Couldn't create the planes\n"); > > >>> return NULL; > > >>> @@ -157,14 +158,15 @@ struct sun4i_crtc *sun4i_crtc_init(struct > > >>> drm_device *drm, > > >>> > > >>> /* find primary and cursor planes for drm_crtc_init_with_planes > > >>> */ > > >>> for (i = 0; scrtc->layers[i]; i++) { > > >>> - struct sun4i_layer *layer = scrtc->layers[i]; > > >>> + void *layer = scrtc->layers[i]; > > >>> + struct drm_plane *plane = > > >>> scrtc->layer_ops->get_plane(layer); > > >>> > > >>> - switch (layer->plane.type) { > > >>> + switch (plane->type) { > > >>> case DRM_PLANE_TYPE_PRIMARY: > > >>> - primary = &layer->plane; > > >>> + primary = plane; > > >>> break; > > >>> case DRM_PLANE_TYPE_CURSOR: > > >>> - cursor = &layer->plane; > > >>> + cursor = plane; > > >>> break; > > >>> default: > > >>> break; > > >>> @@ -190,10 +192,11 @@ struct sun4i_crtc *sun4i_crtc_init(struct > > >>> drm_device *drm, > > >>> /* Set possible_crtcs to this crtc for overlay planes */ > > >>> for (i = 0; scrtc->layers[i]; i++) { > > >>> uint32_t possible_crtcs = > > >>> BIT(drm_crtc_index(&scrtc->crtc)); > > >>> - struct sun4i_layer *layer = scrtc->layers[i]; > > >>> + void *layer = scrtc->layers[i]; > > >>> + struct drm_plane *plane = > > >>> scrtc->layer_ops->get_plane(layer); > > >>> > > >>> - if (layer->plane.type == DRM_PLANE_TYPE_OVERLAY) > > >>> - layer->plane.possible_crtcs = possible_crtcs; > > >>> + if (plane->type == DRM_PLANE_TYPE_OVERLAY) > > >>> + plane->possible_crtcs = possible_crtcs; > > >>> } > > >>> > > >>> return scrtc; > > >>> diff --git a/drivers/gpu/drm/sun4i/sun4i_crtc.h > > >>> b/drivers/gpu/drm/sun4i/sun4i_crtc.h > > >>> index 230cb8f0d601..a4036ee44cf8 100644 > > >>> --- a/drivers/gpu/drm/sun4i/sun4i_crtc.h > > >>> +++ b/drivers/gpu/drm/sun4i/sun4i_crtc.h > > >>> @@ -19,7 +19,8 @@ struct sun4i_crtc { > > >>> > > >>> struct sun4i_backend *backend; > > >>> struct sun4i_tcon *tcon; > > >>> - struct sun4i_layer **layers; > > >>> + void **layers; > > >>> + const struct sunxi_layer_ops *layer_ops; > > >> > > >> > > >> I think you should probably take a different approach to abstract the > > >> layer > > >> type. How about creating > > >> > > >> struct sunxi_layer { > > >> struct drm_plane plane; > > >> } > > >> > > >> base and then subclassing that for sun4i and sun8i? By doing this you can > > >> avoid > > >> the nasty casting and you can also get rid of the get_plane() hook and > > >> layer_ops. > > > > > > > > > For the situation that using ** things are easily to get weird. > > > > That code could be reworked, by initializing the layers directly within > > the crtc init code. If you look at rockchip's drm driver, you'll see > > they do this. There is a good reason to do it this way, as you need > > to first create the primary and cursor layers, pass them in when you > > create the crtc, then initialize any additional layers with the > > possible_crtcs bitmap. > > But furthurly maybe more layers will be created for DE2 mixer, and > may even depends on mixer type (On A83T/H3/A64/H5 mixer1 has fewer > channel than mixer0). You'll always have one primary and one cursor plane, no matter how much planes you support. Maxime -- Maxime Ripard, Free Electrons Embedded Linux and Kernel engineering http://free-electrons.com [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 801 bytes --] ^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH v3 00/11] Initial Allwinner Display Engine 2.0 Support @ 2017-03-29 19:46 Icenowy Zheng 2017-03-29 19:46 ` [PATCH v3 04/11] drm/sun4i: abstract the layer type Icenowy Zheng 0 siblings, 1 reply; 3+ messages in thread From: Icenowy Zheng @ 2017-03-29 19:46 UTC (permalink / raw) To: Rob Herring, Maxime Ripard, Chen-Yu Tsai, Jernej Skrabec Cc: linux-clk, devicetree, linux-arm-kernel, linux-kernel, dri-devel, linux-sunxi, Icenowy Zheng This patchset is the initial patchset for Allwinner DE2 support. It contains the support of clocks in DE2 and the mixers in DE2. The SoC used to develop this patchset is V3s, as V3s is the simplest one of the SoCs that have DE2. (Allwinner V3s features only one mixer, although its clock control unit contains support for second mixer's clock; and its only video output is RGB LCD, which is already supported in our TCON driver) The last patch is only a testing patch, it shouldn't be merged; and for the patch to be really usable, the RFC fix of the TCON driver [1] is needed. No HDMI, TV encoder or other internal bridges' support is included in this patchset, which makes it currently not usable on H3. Thanks to Jean-Francois Moine and Jernej Skrabec for their efforts to discover the internal of DE2! [1] https://lists.freedesktop.org/archives/dri-devel/2016-December/126264.html Icenowy Zheng (11): dt-bindings: add binding for the Allwinner DE2 CCU clk: sunxi-ng: add support for DE2 CCU dt-bindings: add bindings for DE2 on V3s SoC drm/sun4i: abstruct the layer type drm/sun4i: abstract a mixer type drm/sun4i: add support for Allwinner DE2 mixers drm/sun4i: Add compatible string for V3s display engine drm/sun4i: tcon: add support for V3s TCON ARM: dts: sun8i: add DE2 nodes for V3s SoC ARM: dts: sun8i: add pinmux for LCD pins of V3s SoC [DO NOT MERGE] ARM: dts: sun8i: enable LCD panel of Lichee Pi Zero .../devicetree/bindings/clock/sun8i-de2.txt | 31 ++ .../bindings/display/sunxi/sun4i-drm.txt | 37 +- arch/arm/boot/dts/sun8i-v3s-licheepi-zero.dts | 36 ++ arch/arm/boot/dts/sun8i-v3s.dtsi | 96 +++++ drivers/clk/sunxi-ng/Kconfig | 5 + drivers/clk/sunxi-ng/Makefile | 1 + drivers/clk/sunxi-ng/ccu-sun8i-de2.c | 204 +++++++++++ drivers/clk/sunxi-ng/ccu-sun8i-de2.h | 28 ++ drivers/gpu/drm/sun4i/Kconfig | 20 ++ drivers/gpu/drm/sun4i/Makefile | 10 +- drivers/gpu/drm/sun4i/sun4i_backend.c | 26 +- drivers/gpu/drm/sun4i/sun4i_backend.h | 5 - drivers/gpu/drm/sun4i/sun4i_crtc.c | 31 +- drivers/gpu/drm/sun4i/sun4i_crtc.h | 10 +- drivers/gpu/drm/sun4i/sun4i_drv.c | 4 +- drivers/gpu/drm/sun4i/sun4i_drv.h | 3 +- drivers/gpu/drm/sun4i/sun4i_layer.c | 22 +- drivers/gpu/drm/sun4i/sun4i_layer.h | 6 +- drivers/gpu/drm/sun4i/sun4i_tcon.c | 7 +- drivers/gpu/drm/sun4i/sun4i_tv.c | 8 +- drivers/gpu/drm/sun4i/sun8i_layer.c | 156 +++++++++ drivers/gpu/drm/sun4i/sun8i_layer.h | 35 ++ drivers/gpu/drm/sun4i/sun8i_mixer.c | 386 +++++++++++++++++++++ drivers/gpu/drm/sun4i/sun8i_mixer.h | 131 +++++++ drivers/gpu/drm/sun4i/sunxi_layer.h | 17 + drivers/gpu/drm/sun4i/sunxi_mixer.h | 22 ++ include/dt-bindings/clock/sun8i-de2.h | 54 +++ include/dt-bindings/reset/sun8i-de2.h | 50 +++ 28 files changed, 1391 insertions(+), 50 deletions(-) create mode 100644 Documentation/devicetree/bindings/clock/sun8i-de2.txt create mode 100644 drivers/clk/sunxi-ng/ccu-sun8i-de2.c create mode 100644 drivers/clk/sunxi-ng/ccu-sun8i-de2.h create mode 100644 drivers/gpu/drm/sun4i/sun8i_layer.c create mode 100644 drivers/gpu/drm/sun4i/sun8i_layer.h create mode 100644 drivers/gpu/drm/sun4i/sun8i_mixer.c create mode 100644 drivers/gpu/drm/sun4i/sun8i_mixer.h create mode 100644 drivers/gpu/drm/sun4i/sunxi_layer.h create mode 100644 drivers/gpu/drm/sun4i/sunxi_mixer.h create mode 100644 include/dt-bindings/clock/sun8i-de2.h create mode 100644 include/dt-bindings/reset/sun8i-de2.h -- 2.12.0 ^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH v3 04/11] drm/sun4i: abstract the layer type 2017-03-29 19:46 [PATCH v3 00/11] Initial Allwinner Display Engine 2.0 Support Icenowy Zheng @ 2017-03-29 19:46 ` Icenowy Zheng 2017-04-04 19:28 ` Sean Paul 0 siblings, 1 reply; 3+ messages in thread From: Icenowy Zheng @ 2017-03-29 19:46 UTC (permalink / raw) To: Rob Herring, Maxime Ripard, Chen-Yu Tsai, Jernej Skrabec Cc: devicetree, linux-kernel, dri-devel, linux-sunxi, linux-clk, linux-arm-kernel, Icenowy Zheng As we are going to add support for the Allwinner DE2 Mixer in sun4i-drm driver, we will finally have two types of layer. Abstract the layer type to void * and a ops struct, which contains the only function used by crtc -- get the drm_plane struct of the layer. Signed-off-by: Icenowy Zheng <icenowy@aosc.io> --- Refactored patch in v3. drivers/gpu/drm/sun4i/sun4i_crtc.c | 19 +++++++++++-------- drivers/gpu/drm/sun4i/sun4i_crtc.h | 3 ++- drivers/gpu/drm/sun4i/sun4i_layer.c | 19 ++++++++++++++++++- drivers/gpu/drm/sun4i/sun4i_layer.h | 2 +- drivers/gpu/drm/sun4i/sunxi_layer.h | 17 +++++++++++++++++ 5 files changed, 49 insertions(+), 11 deletions(-) create mode 100644 drivers/gpu/drm/sun4i/sunxi_layer.h diff --git a/drivers/gpu/drm/sun4i/sun4i_crtc.c b/drivers/gpu/drm/sun4i/sun4i_crtc.c index 3c876c3a356a..33854ee7f636 100644 --- a/drivers/gpu/drm/sun4i/sun4i_crtc.c +++ b/drivers/gpu/drm/sun4i/sun4i_crtc.c @@ -29,6 +29,7 @@ #include "sun4i_crtc.h" #include "sun4i_drv.h" #include "sun4i_layer.h" +#include "sunxi_layer.h" #include "sun4i_tcon.h" static void sun4i_crtc_atomic_begin(struct drm_crtc *crtc, @@ -149,7 +150,7 @@ struct sun4i_crtc *sun4i_crtc_init(struct drm_device *drm, scrtc->tcon = tcon; /* Create our layers */ - scrtc->layers = sun4i_layers_init(drm, scrtc->backend); + scrtc->layers = (void **)sun4i_layers_init(drm, scrtc); if (IS_ERR(scrtc->layers)) { dev_err(drm->dev, "Couldn't create the planes\n"); return NULL; @@ -157,14 +158,15 @@ struct sun4i_crtc *sun4i_crtc_init(struct drm_device *drm, /* find primary and cursor planes for drm_crtc_init_with_planes */ for (i = 0; scrtc->layers[i]; i++) { - struct sun4i_layer *layer = scrtc->layers[i]; + void *layer = scrtc->layers[i]; + struct drm_plane *plane = scrtc->layer_ops->get_plane(layer); - switch (layer->plane.type) { + switch (plane->type) { case DRM_PLANE_TYPE_PRIMARY: - primary = &layer->plane; + primary = plane; break; case DRM_PLANE_TYPE_CURSOR: - cursor = &layer->plane; + cursor = plane; break; default: break; @@ -190,10 +192,11 @@ struct sun4i_crtc *sun4i_crtc_init(struct drm_device *drm, /* Set possible_crtcs to this crtc for overlay planes */ for (i = 0; scrtc->layers[i]; i++) { uint32_t possible_crtcs = BIT(drm_crtc_index(&scrtc->crtc)); - struct sun4i_layer *layer = scrtc->layers[i]; + void *layer = scrtc->layers[i]; + struct drm_plane *plane = scrtc->layer_ops->get_plane(layer); - if (layer->plane.type == DRM_PLANE_TYPE_OVERLAY) - layer->plane.possible_crtcs = possible_crtcs; + if (plane->type == DRM_PLANE_TYPE_OVERLAY) + plane->possible_crtcs = possible_crtcs; } return scrtc; diff --git a/drivers/gpu/drm/sun4i/sun4i_crtc.h b/drivers/gpu/drm/sun4i/sun4i_crtc.h index 230cb8f0d601..a4036ee44cf8 100644 --- a/drivers/gpu/drm/sun4i/sun4i_crtc.h +++ b/drivers/gpu/drm/sun4i/sun4i_crtc.h @@ -19,7 +19,8 @@ struct sun4i_crtc { struct sun4i_backend *backend; struct sun4i_tcon *tcon; - struct sun4i_layer **layers; + void **layers; + const struct sunxi_layer_ops *layer_ops; }; static inline struct sun4i_crtc *drm_crtc_to_sun4i_crtc(struct drm_crtc *crtc) diff --git a/drivers/gpu/drm/sun4i/sun4i_layer.c b/drivers/gpu/drm/sun4i/sun4i_layer.c index f26bde5b9117..bc4a70d6968b 100644 --- a/drivers/gpu/drm/sun4i/sun4i_layer.c +++ b/drivers/gpu/drm/sun4i/sun4i_layer.c @@ -16,7 +16,9 @@ #include <drm/drmP.h> #include "sun4i_backend.h" +#include "sun4i_crtc.h" #include "sun4i_layer.h" +#include "sunxi_layer.h" struct sun4i_plane_desc { enum drm_plane_type type; @@ -100,6 +102,17 @@ static const struct sun4i_plane_desc sun4i_backend_planes[] = { }, }; +static struct drm_plane *sun4i_layer_get_plane(void *layer) +{ + struct sun4i_layer *sun4i_layer = layer; + + return &sun4i_layer->plane; +} + +static const struct sunxi_layer_ops layer_ops = { + .get_plane = sun4i_layer_get_plane, +}; + static struct sun4i_layer *sun4i_layer_init_one(struct drm_device *drm, struct sun4i_backend *backend, const struct sun4i_plane_desc *plane) @@ -129,9 +142,10 @@ static struct sun4i_layer *sun4i_layer_init_one(struct drm_device *drm, } struct sun4i_layer **sun4i_layers_init(struct drm_device *drm, - struct sun4i_backend *backend) + struct sun4i_crtc *crtc) { struct sun4i_layer **layers; + struct sun4i_backend *backend = crtc->backend; int i; layers = devm_kcalloc(drm->dev, ARRAY_SIZE(sun4i_backend_planes) + 1, @@ -181,5 +195,8 @@ struct sun4i_layer **sun4i_layers_init(struct drm_device *drm, layers[i] = layer; }; + /* Assign layer ops to the CRTC */ + crtc->layer_ops = &layer_ops; + return layers; } diff --git a/drivers/gpu/drm/sun4i/sun4i_layer.h b/drivers/gpu/drm/sun4i/sun4i_layer.h index 4be1f0919df2..425eea7b9e3b 100644 --- a/drivers/gpu/drm/sun4i/sun4i_layer.h +++ b/drivers/gpu/drm/sun4i/sun4i_layer.h @@ -27,6 +27,6 @@ plane_to_sun4i_layer(struct drm_plane *plane) } struct sun4i_layer **sun4i_layers_init(struct drm_device *drm, - struct sun4i_backend *backend); + struct sun4i_crtc *crtc); #endif /* _SUN4I_LAYER_H_ */ diff --git a/drivers/gpu/drm/sun4i/sunxi_layer.h b/drivers/gpu/drm/sun4i/sunxi_layer.h new file mode 100644 index 000000000000..d8838ec39299 --- /dev/null +++ b/drivers/gpu/drm/sun4i/sunxi_layer.h @@ -0,0 +1,17 @@ +/* + * Copyright (C) 2017 Icenowy Zheng <icenowy@aosc.xyz> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + */ + +#ifndef _SUNXI_LAYER_H_ +#define _SUNXI_LAYER_H_ + +struct sunxi_layer_ops { + struct drm_plane *(*get_plane)(void *layer); +}; + +#endif /* _SUNXI_LAYER_H_ */ -- 2.12.0 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH v3 04/11] drm/sun4i: abstract the layer type 2017-03-29 19:46 ` [PATCH v3 04/11] drm/sun4i: abstract the layer type Icenowy Zheng @ 2017-04-04 19:28 ` Sean Paul 2017-04-04 19:53 ` Icenowy Zheng 0 siblings, 1 reply; 3+ messages in thread From: Sean Paul @ 2017-04-04 19:28 UTC (permalink / raw) To: Icenowy Zheng Cc: Rob Herring, Maxime Ripard, Chen-Yu Tsai, Jernej Skrabec, devicetree, linux-kernel, dri-devel, linux-sunxi, linux-clk, linux-arm-kernel On Thu, Mar 30, 2017 at 03:46:06AM +0800, Icenowy Zheng wrote: > As we are going to add support for the Allwinner DE2 Mixer in sun4i-drm > driver, we will finally have two types of layer. > > Abstract the layer type to void * and a ops struct, which contains the > only function used by crtc -- get the drm_plane struct of the layer. > > Signed-off-by: Icenowy Zheng <icenowy@aosc.io> > --- > Refactored patch in v3. > > drivers/gpu/drm/sun4i/sun4i_crtc.c | 19 +++++++++++-------- > drivers/gpu/drm/sun4i/sun4i_crtc.h | 3 ++- > drivers/gpu/drm/sun4i/sun4i_layer.c | 19 ++++++++++++++++++- > drivers/gpu/drm/sun4i/sun4i_layer.h | 2 +- > drivers/gpu/drm/sun4i/sunxi_layer.h | 17 +++++++++++++++++ > 5 files changed, 49 insertions(+), 11 deletions(-) > create mode 100644 drivers/gpu/drm/sun4i/sunxi_layer.h > > diff --git a/drivers/gpu/drm/sun4i/sun4i_crtc.c b/drivers/gpu/drm/sun4i/sun4i_crtc.c > index 3c876c3a356a..33854ee7f636 100644 > --- a/drivers/gpu/drm/sun4i/sun4i_crtc.c > +++ b/drivers/gpu/drm/sun4i/sun4i_crtc.c > @@ -29,6 +29,7 @@ > #include "sun4i_crtc.h" > #include "sun4i_drv.h" > #include "sun4i_layer.h" > +#include "sunxi_layer.h" > #include "sun4i_tcon.h" > > static void sun4i_crtc_atomic_begin(struct drm_crtc *crtc, > @@ -149,7 +150,7 @@ struct sun4i_crtc *sun4i_crtc_init(struct drm_device *drm, > scrtc->tcon = tcon; > > /* Create our layers */ > - scrtc->layers = sun4i_layers_init(drm, scrtc->backend); > + scrtc->layers = (void **)sun4i_layers_init(drm, scrtc); > if (IS_ERR(scrtc->layers)) { > dev_err(drm->dev, "Couldn't create the planes\n"); > return NULL; > @@ -157,14 +158,15 @@ struct sun4i_crtc *sun4i_crtc_init(struct drm_device *drm, > > /* find primary and cursor planes for drm_crtc_init_with_planes */ > for (i = 0; scrtc->layers[i]; i++) { > - struct sun4i_layer *layer = scrtc->layers[i]; > + void *layer = scrtc->layers[i]; > + struct drm_plane *plane = scrtc->layer_ops->get_plane(layer); > > - switch (layer->plane.type) { > + switch (plane->type) { > case DRM_PLANE_TYPE_PRIMARY: > - primary = &layer->plane; > + primary = plane; > break; > case DRM_PLANE_TYPE_CURSOR: > - cursor = &layer->plane; > + cursor = plane; > break; > default: > break; > @@ -190,10 +192,11 @@ struct sun4i_crtc *sun4i_crtc_init(struct drm_device *drm, > /* Set possible_crtcs to this crtc for overlay planes */ > for (i = 0; scrtc->layers[i]; i++) { > uint32_t possible_crtcs = BIT(drm_crtc_index(&scrtc->crtc)); > - struct sun4i_layer *layer = scrtc->layers[i]; > + void *layer = scrtc->layers[i]; > + struct drm_plane *plane = scrtc->layer_ops->get_plane(layer); > > - if (layer->plane.type == DRM_PLANE_TYPE_OVERLAY) > - layer->plane.possible_crtcs = possible_crtcs; > + if (plane->type == DRM_PLANE_TYPE_OVERLAY) > + plane->possible_crtcs = possible_crtcs; > } > > return scrtc; > diff --git a/drivers/gpu/drm/sun4i/sun4i_crtc.h b/drivers/gpu/drm/sun4i/sun4i_crtc.h > index 230cb8f0d601..a4036ee44cf8 100644 > --- a/drivers/gpu/drm/sun4i/sun4i_crtc.h > +++ b/drivers/gpu/drm/sun4i/sun4i_crtc.h > @@ -19,7 +19,8 @@ struct sun4i_crtc { > > struct sun4i_backend *backend; > struct sun4i_tcon *tcon; > - struct sun4i_layer **layers; > + void **layers; > + const struct sunxi_layer_ops *layer_ops; I think you should probably take a different approach to abstract the layer type. How about creating struct sunxi_layer { struct drm_plane plane; } base and then subclassing that for sun4i and sun8i? By doing this you can avoid the nasty casting and you can also get rid of the get_plane() hook and layer_ops. Sean > }; > > static inline struct sun4i_crtc *drm_crtc_to_sun4i_crtc(struct drm_crtc *crtc) > diff --git a/drivers/gpu/drm/sun4i/sun4i_layer.c b/drivers/gpu/drm/sun4i/sun4i_layer.c > index f26bde5b9117..bc4a70d6968b 100644 > --- a/drivers/gpu/drm/sun4i/sun4i_layer.c > +++ b/drivers/gpu/drm/sun4i/sun4i_layer.c > @@ -16,7 +16,9 @@ > #include <drm/drmP.h> > > #include "sun4i_backend.h" > +#include "sun4i_crtc.h" > #include "sun4i_layer.h" > +#include "sunxi_layer.h" > > struct sun4i_plane_desc { > enum drm_plane_type type; > @@ -100,6 +102,17 @@ static const struct sun4i_plane_desc sun4i_backend_planes[] = { > }, > }; > > +static struct drm_plane *sun4i_layer_get_plane(void *layer) > +{ > + struct sun4i_layer *sun4i_layer = layer; > + > + return &sun4i_layer->plane; > +} > + > +static const struct sunxi_layer_ops layer_ops = { > + .get_plane = sun4i_layer_get_plane, > +}; > + > static struct sun4i_layer *sun4i_layer_init_one(struct drm_device *drm, > struct sun4i_backend *backend, > const struct sun4i_plane_desc *plane) > @@ -129,9 +142,10 @@ static struct sun4i_layer *sun4i_layer_init_one(struct drm_device *drm, > } > > struct sun4i_layer **sun4i_layers_init(struct drm_device *drm, > - struct sun4i_backend *backend) > + struct sun4i_crtc *crtc) > { > struct sun4i_layer **layers; > + struct sun4i_backend *backend = crtc->backend; > int i; > > layers = devm_kcalloc(drm->dev, ARRAY_SIZE(sun4i_backend_planes) + 1, > @@ -181,5 +195,8 @@ struct sun4i_layer **sun4i_layers_init(struct drm_device *drm, > layers[i] = layer; > }; > > + /* Assign layer ops to the CRTC */ > + crtc->layer_ops = &layer_ops; > + > return layers; > } > diff --git a/drivers/gpu/drm/sun4i/sun4i_layer.h b/drivers/gpu/drm/sun4i/sun4i_layer.h > index 4be1f0919df2..425eea7b9e3b 100644 > --- a/drivers/gpu/drm/sun4i/sun4i_layer.h > +++ b/drivers/gpu/drm/sun4i/sun4i_layer.h > @@ -27,6 +27,6 @@ plane_to_sun4i_layer(struct drm_plane *plane) > } > > struct sun4i_layer **sun4i_layers_init(struct drm_device *drm, > - struct sun4i_backend *backend); > + struct sun4i_crtc *crtc); > > #endif /* _SUN4I_LAYER_H_ */ > diff --git a/drivers/gpu/drm/sun4i/sunxi_layer.h b/drivers/gpu/drm/sun4i/sunxi_layer.h > new file mode 100644 > index 000000000000..d8838ec39299 > --- /dev/null > +++ b/drivers/gpu/drm/sun4i/sunxi_layer.h > @@ -0,0 +1,17 @@ > +/* > + * Copyright (C) 2017 Icenowy Zheng <icenowy@aosc.xyz> > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License as > + * published by the Free Software Foundation; either version 2 of > + * the License, or (at your option) any later version. > + */ > + > +#ifndef _SUNXI_LAYER_H_ > +#define _SUNXI_LAYER_H_ > + > +struct sunxi_layer_ops { > + struct drm_plane *(*get_plane)(void *layer); > +}; > + > +#endif /* _SUNXI_LAYER_H_ */ > -- > 2.12.0 > > > _______________________________________________ > linux-arm-kernel mailing list > linux-arm-kernel@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel -- Sean Paul, Software Engineer, Google / Chromium OS ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH v3 04/11] drm/sun4i: abstract the layer type 2017-04-04 19:28 ` Sean Paul @ 2017-04-04 19:53 ` Icenowy Zheng 2017-04-05 2:27 ` [linux-sunxi] " Chen-Yu Tsai 0 siblings, 1 reply; 3+ messages in thread From: Icenowy Zheng @ 2017-04-04 19:53 UTC (permalink / raw) To: Sean Paul Cc: devicetree, Jernej Skrabec, linux-sunxi, linux-kernel, dri-devel, Chen-Yu Tsai, Rob Herring, Maxime Ripard, linux-clk, linux-arm-kernel CgrlnKggMjAxN+W5tDA05pyIMDXml6UgMDM6MjgsIFNlYW4gUGF1bCDlhpnpgZM6Cj4gT24gVGh1 LCBNYXIgMzAsIDIwMTcgYXQgMDM6NDY6MDZBTSArMDgwMCwgSWNlbm93eSBaaGVuZyB3cm90ZToK Pj4gQXMgd2UgYXJlIGdvaW5nIHRvIGFkZCBzdXBwb3J0IGZvciB0aGUgQWxsd2lubmVyIERFMiBN aXhlciBpbiBzdW40aS1kcm0KPj4gZHJpdmVyLCB3ZSB3aWxsIGZpbmFsbHkgaGF2ZSB0d28gdHlw ZXMgb2YgbGF5ZXIuCj4+Cj4+IEFic3RyYWN0IHRoZSBsYXllciB0eXBlIHRvIHZvaWQgKiBhbmQg YSBvcHMgc3RydWN0LCB3aGljaCBjb250YWlucyB0aGUKPj4gb25seSBmdW5jdGlvbiB1c2VkIGJ5 IGNydGMgLS0gZ2V0IHRoZSBkcm1fcGxhbmUgc3RydWN0IG9mIHRoZSBsYXllci4KPj4KPj4gU2ln bmVkLW9mZi1ieTogSWNlbm93eSBaaGVuZyA8aWNlbm93eUBhb3NjLmlvPgo+PiAtLS0KPj4gUmVm YWN0b3JlZCBwYXRjaCBpbiB2My4KPj4KPj4gIGRyaXZlcnMvZ3B1L2RybS9zdW40aS9zdW40aV9j cnRjLmMgIHwgMTkgKysrKysrKysrKystLS0tLS0tLQo+PiAgZHJpdmVycy9ncHUvZHJtL3N1bjRp L3N1bjRpX2NydGMuaCAgfCAgMyArKy0KPj4gIGRyaXZlcnMvZ3B1L2RybS9zdW40aS9zdW40aV9s YXllci5jIHwgMTkgKysrKysrKysrKysrKysrKysrLQo+PiAgZHJpdmVycy9ncHUvZHJtL3N1bjRp L3N1bjRpX2xheWVyLmggfCAgMiArLQo+PiAgZHJpdmVycy9ncHUvZHJtL3N1bjRpL3N1bnhpX2xh eWVyLmggfCAxNyArKysrKysrKysrKysrKysrKwo+PiAgNSBmaWxlcyBjaGFuZ2VkLCA0OSBpbnNl cnRpb25zKCspLCAxMSBkZWxldGlvbnMoLSkKPj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJz L2dwdS9kcm0vc3VuNGkvc3VueGlfbGF5ZXIuaAo+Pgo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9n cHUvZHJtL3N1bjRpL3N1bjRpX2NydGMuYyBiL2RyaXZlcnMvZ3B1L2RybS9zdW40aS9zdW40aV9j cnRjLmMKPj4gaW5kZXggM2M4NzZjM2EzNTZhLi4zMzg1NGVlN2Y2MzYgMTAwNjQ0Cj4+IC0tLSBh L2RyaXZlcnMvZ3B1L2RybS9zdW40aS9zdW40aV9jcnRjLmMKPj4gKysrIGIvZHJpdmVycy9ncHUv ZHJtL3N1bjRpL3N1bjRpX2NydGMuYwo+PiBAQCAtMjksNiArMjksNyBAQAo+PiAgI2luY2x1ZGUg InN1bjRpX2NydGMuaCIKPj4gICNpbmNsdWRlICJzdW40aV9kcnYuaCIKPj4gICNpbmNsdWRlICJz dW40aV9sYXllci5oIgo+PiArI2luY2x1ZGUgInN1bnhpX2xheWVyLmgiCj4+ICAjaW5jbHVkZSAi c3VuNGlfdGNvbi5oIgo+Pgo+PiAgc3RhdGljIHZvaWQgc3VuNGlfY3J0Y19hdG9taWNfYmVnaW4o c3RydWN0IGRybV9jcnRjICpjcnRjLAo+PiBAQCAtMTQ5LDcgKzE1MCw3IEBAIHN0cnVjdCBzdW40 aV9jcnRjICpzdW40aV9jcnRjX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRybSwKPj4gIAlzY3J0 Yy0+dGNvbiA9IHRjb247Cj4+Cj4+ICAJLyogQ3JlYXRlIG91ciBsYXllcnMgKi8KPj4gLQlzY3J0 Yy0+bGF5ZXJzID0gc3VuNGlfbGF5ZXJzX2luaXQoZHJtLCBzY3J0Yy0+YmFja2VuZCk7Cj4+ICsJ c2NydGMtPmxheWVycyA9ICh2b2lkICoqKXN1bjRpX2xheWVyc19pbml0KGRybSwgc2NydGMpOwo+ PiAgCWlmIChJU19FUlIoc2NydGMtPmxheWVycykpIHsKPj4gIAkJZGV2X2Vycihkcm0tPmRldiwg IkNvdWxkbid0IGNyZWF0ZSB0aGUgcGxhbmVzXG4iKTsKPj4gIAkJcmV0dXJuIE5VTEw7Cj4+IEBA IC0xNTcsMTQgKzE1OCwxNSBAQCBzdHJ1Y3Qgc3VuNGlfY3J0YyAqc3VuNGlfY3J0Y19pbml0KHN0 cnVjdCBkcm1fZGV2aWNlICpkcm0sCj4+Cj4+ICAJLyogZmluZCBwcmltYXJ5IGFuZCBjdXJzb3Ig cGxhbmVzIGZvciBkcm1fY3J0Y19pbml0X3dpdGhfcGxhbmVzICovCj4+ICAJZm9yIChpID0gMDsg c2NydGMtPmxheWVyc1tpXTsgaSsrKSB7Cj4+IC0JCXN0cnVjdCBzdW40aV9sYXllciAqbGF5ZXIg PSBzY3J0Yy0+bGF5ZXJzW2ldOwo+PiArCQl2b2lkICpsYXllciA9IHNjcnRjLT5sYXllcnNbaV07 Cj4+ICsJCXN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lID0gc2NydGMtPmxheWVyX29wcy0+Z2V0X3Bs YW5lKGxheWVyKTsKPj4KPj4gLQkJc3dpdGNoIChsYXllci0+cGxhbmUudHlwZSkgewo+PiArCQlz d2l0Y2ggKHBsYW5lLT50eXBlKSB7Cj4+ICAJCWNhc2UgRFJNX1BMQU5FX1RZUEVfUFJJTUFSWToK Pj4gLQkJCXByaW1hcnkgPSAmbGF5ZXItPnBsYW5lOwo+PiArCQkJcHJpbWFyeSA9IHBsYW5lOwo+ PiAgCQkJYnJlYWs7Cj4+ICAJCWNhc2UgRFJNX1BMQU5FX1RZUEVfQ1VSU09SOgo+PiAtCQkJY3Vy c29yID0gJmxheWVyLT5wbGFuZTsKPj4gKwkJCWN1cnNvciA9IHBsYW5lOwo+PiAgCQkJYnJlYWs7 Cj4+ICAJCWRlZmF1bHQ6Cj4+ICAJCQlicmVhazsKPj4gQEAgLTE5MCwxMCArMTkyLDExIEBAIHN0 cnVjdCBzdW40aV9jcnRjICpzdW40aV9jcnRjX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRybSwK Pj4gIAkvKiBTZXQgcG9zc2libGVfY3J0Y3MgdG8gdGhpcyBjcnRjIGZvciBvdmVybGF5IHBsYW5l cyAqLwo+PiAgCWZvciAoaSA9IDA7IHNjcnRjLT5sYXllcnNbaV07IGkrKykgewo+PiAgCQl1aW50 MzJfdCBwb3NzaWJsZV9jcnRjcyA9IEJJVChkcm1fY3J0Y19pbmRleCgmc2NydGMtPmNydGMpKTsK Pj4gLQkJc3RydWN0IHN1bjRpX2xheWVyICpsYXllciA9IHNjcnRjLT5sYXllcnNbaV07Cj4+ICsJ CXZvaWQgKmxheWVyID0gc2NydGMtPmxheWVyc1tpXTsKPj4gKwkJc3RydWN0IGRybV9wbGFuZSAq cGxhbmUgPSBzY3J0Yy0+bGF5ZXJfb3BzLT5nZXRfcGxhbmUobGF5ZXIpOwo+Pgo+PiAtCQlpZiAo bGF5ZXItPnBsYW5lLnR5cGUgPT0gRFJNX1BMQU5FX1RZUEVfT1ZFUkxBWSkKPj4gLQkJCWxheWVy LT5wbGFuZS5wb3NzaWJsZV9jcnRjcyA9IHBvc3NpYmxlX2NydGNzOwo+PiArCQlpZiAocGxhbmUt PnR5cGUgPT0gRFJNX1BMQU5FX1RZUEVfT1ZFUkxBWSkKPj4gKwkJCXBsYW5lLT5wb3NzaWJsZV9j cnRjcyA9IHBvc3NpYmxlX2NydGNzOwo+PiAgCX0KPj4KPj4gIAlyZXR1cm4gc2NydGM7Cj4+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vc3VuNGkvc3VuNGlfY3J0Yy5oIGIvZHJpdmVycy9n cHUvZHJtL3N1bjRpL3N1bjRpX2NydGMuaAo+PiBpbmRleCAyMzBjYjhmMGQ2MDEuLmE0MDM2ZWU0 NGNmOCAxMDA2NDQKPj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL3N1bjRpL3N1bjRpX2NydGMuaAo+ PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vc3VuNGkvc3VuNGlfY3J0Yy5oCj4+IEBAIC0xOSw3ICsx OSw4IEBAIHN0cnVjdCBzdW40aV9jcnRjIHsKPj4KPj4gIAlzdHJ1Y3Qgc3VuNGlfYmFja2VuZAkJ KmJhY2tlbmQ7Cj4+ICAJc3RydWN0IHN1bjRpX3Rjb24JCSp0Y29uOwo+PiAtCXN0cnVjdCBzdW40 aV9sYXllcgkJKipsYXllcnM7Cj4+ICsJdm9pZAkJCQkqKmxheWVyczsKPj4gKwljb25zdCBzdHJ1 Y3Qgc3VueGlfbGF5ZXJfb3BzCSpsYXllcl9vcHM7Cj4KPiBJIHRoaW5rIHlvdSBzaG91bGQgcHJv YmFibHkgdGFrZSBhIGRpZmZlcmVudCBhcHByb2FjaCB0byBhYnN0cmFjdCB0aGUgbGF5ZXIKPiB0 eXBlLiBIb3cgYWJvdXQgY3JlYXRpbmcKPgo+IHN0cnVjdCBzdW54aV9sYXllciB7Cj4gICAgICAg ICBzdHJ1Y3QgZHJtX3BsYW5lIHBsYW5lOwo+IH0KPgo+IGJhc2UgYW5kIHRoZW4gc3ViY2xhc3Np bmcgdGhhdCBmb3Igc3VuNGkgYW5kIHN1bjhpPyBCeSBkb2luZyB0aGlzIHlvdSBjYW4gYXZvaWQK PiB0aGUgbmFzdHkgY2FzdGluZyBhbmQgeW91IGNhbiBhbHNvIGdldCByaWQgb2YgdGhlIGdldF9w bGFuZSgpIGhvb2sgYW5kCj4gbGF5ZXJfb3BzLgoKRm9yIHRoZSBzaXR1YXRpb24gdGhhdCB1c2lu ZyAqKiB0aGluZ3MgYXJlIGVhc2lseSB0byBnZXQgd2VpcmQuCgo+Cj4gU2Vhbgo+Cj4KPgo+PiAg fTsKPj4KPj4gIHN0YXRpYyBpbmxpbmUgc3RydWN0IHN1bjRpX2NydGMgKmRybV9jcnRjX3RvX3N1 bjRpX2NydGMoc3RydWN0IGRybV9jcnRjICpjcnRjKQo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9n cHUvZHJtL3N1bjRpL3N1bjRpX2xheWVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vc3VuNGkvc3VuNGlf bGF5ZXIuYwo+PiBpbmRleCBmMjZiZGU1YjkxMTcuLmJjNGE3MGQ2OTY4YiAxMDA2NDQKPj4gLS0t IGEvZHJpdmVycy9ncHUvZHJtL3N1bjRpL3N1bjRpX2xheWVyLmMKPj4gKysrIGIvZHJpdmVycy9n cHUvZHJtL3N1bjRpL3N1bjRpX2xheWVyLmMKPj4gQEAgLTE2LDcgKzE2LDkgQEAKPj4gICNpbmNs dWRlIDxkcm0vZHJtUC5oPgo+Pgo+PiAgI2luY2x1ZGUgInN1bjRpX2JhY2tlbmQuaCIKPj4gKyNp bmNsdWRlICJzdW40aV9jcnRjLmgiCj4+ICAjaW5jbHVkZSAic3VuNGlfbGF5ZXIuaCIKPj4gKyNp bmNsdWRlICJzdW54aV9sYXllci5oIgo+Pgo+PiAgc3RydWN0IHN1bjRpX3BsYW5lX2Rlc2Mgewo+ PiAgCSAgICAgICBlbnVtIGRybV9wbGFuZV90eXBlICAgICB0eXBlOwo+PiBAQCAtMTAwLDYgKzEw MiwxNyBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IHN1bjRpX3BsYW5lX2Rlc2Mgc3VuNGlfYmFja2Vu ZF9wbGFuZXNbXSA9IHsKPj4gIAl9LAo+PiAgfTsKPj4KPj4gK3N0YXRpYyBzdHJ1Y3QgZHJtX3Bs YW5lICpzdW40aV9sYXllcl9nZXRfcGxhbmUodm9pZCAqbGF5ZXIpCj4+ICt7Cj4+ICsJc3RydWN0 IHN1bjRpX2xheWVyICpzdW40aV9sYXllciA9IGxheWVyOwo+PiArCj4+ICsJcmV0dXJuICZzdW40 aV9sYXllci0+cGxhbmU7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VueGlf bGF5ZXJfb3BzIGxheWVyX29wcyA9IHsKPj4gKwkuZ2V0X3BsYW5lID0gc3VuNGlfbGF5ZXJfZ2V0 X3BsYW5lLAo+PiArfTsKPj4gKwo+PiAgc3RhdGljIHN0cnVjdCBzdW40aV9sYXllciAqc3VuNGlf bGF5ZXJfaW5pdF9vbmUoc3RydWN0IGRybV9kZXZpY2UgKmRybSwKPj4gIAkJCQkJCXN0cnVjdCBz dW40aV9iYWNrZW5kICpiYWNrZW5kLAo+PiAgCQkJCQkJY29uc3Qgc3RydWN0IHN1bjRpX3BsYW5l X2Rlc2MgKnBsYW5lKQo+PiBAQCAtMTI5LDkgKzE0MiwxMCBAQCBzdGF0aWMgc3RydWN0IHN1bjRp X2xheWVyICpzdW40aV9sYXllcl9pbml0X29uZShzdHJ1Y3QgZHJtX2RldmljZSAqZHJtLAo+PiAg fQo+Pgo+PiAgc3RydWN0IHN1bjRpX2xheWVyICoqc3VuNGlfbGF5ZXJzX2luaXQoc3RydWN0IGRy bV9kZXZpY2UgKmRybSwKPj4gLQkJCQkgICAgICAgc3RydWN0IHN1bjRpX2JhY2tlbmQgKmJhY2tl bmQpCj4+ICsJCQkJICAgICAgIHN0cnVjdCBzdW40aV9jcnRjICpjcnRjKQo+PiAgewo+PiAgCXN0 cnVjdCBzdW40aV9sYXllciAqKmxheWVyczsKPj4gKwlzdHJ1Y3Qgc3VuNGlfYmFja2VuZCAqYmFj a2VuZCA9IGNydGMtPmJhY2tlbmQ7Cj4+ICAJaW50IGk7Cj4+Cj4+ICAJbGF5ZXJzID0gZGV2bV9r Y2FsbG9jKGRybS0+ZGV2LCBBUlJBWV9TSVpFKHN1bjRpX2JhY2tlbmRfcGxhbmVzKSArIDEsCj4+ IEBAIC0xODEsNSArMTk1LDggQEAgc3RydWN0IHN1bjRpX2xheWVyICoqc3VuNGlfbGF5ZXJzX2lu aXQoc3RydWN0IGRybV9kZXZpY2UgKmRybSwKPj4gIAkJbGF5ZXJzW2ldID0gbGF5ZXI7Cj4+ICAJ fTsKPj4KPj4gKwkvKiBBc3NpZ24gbGF5ZXIgb3BzIHRvIHRoZSBDUlRDICovCj4+ICsJY3J0Yy0+ bGF5ZXJfb3BzID0gJmxheWVyX29wczsKPj4gKwo+PiAgCXJldHVybiBsYXllcnM7Cj4+ICB9Cj4+ IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vc3VuNGkvc3VuNGlfbGF5ZXIuaCBiL2RyaXZl cnMvZ3B1L2RybS9zdW40aS9zdW40aV9sYXllci5oCj4+IGluZGV4IDRiZTFmMDkxOWRmMi4uNDI1 ZWVhN2I5ZTNiIDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vc3VuNGkvc3VuNGlfbGF5 ZXIuaAo+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vc3VuNGkvc3VuNGlfbGF5ZXIuaAo+PiBAQCAt MjcsNiArMjcsNiBAQCBwbGFuZV90b19zdW40aV9sYXllcihzdHJ1Y3QgZHJtX3BsYW5lICpwbGFu ZSkKPj4gIH0KPj4KPj4gIHN0cnVjdCBzdW40aV9sYXllciAqKnN1bjRpX2xheWVyc19pbml0KHN0 cnVjdCBkcm1fZGV2aWNlICpkcm0sCj4+IC0JCQkJICAgICAgIHN0cnVjdCBzdW40aV9iYWNrZW5k ICpiYWNrZW5kKTsKPj4gKwkJCQkgICAgICAgc3RydWN0IHN1bjRpX2NydGMgKmNydGMpOwo+Pgo+ PiAgI2VuZGlmIC8qIF9TVU40SV9MQVlFUl9IXyAqLwo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9n cHUvZHJtL3N1bjRpL3N1bnhpX2xheWVyLmggYi9kcml2ZXJzL2dwdS9kcm0vc3VuNGkvc3VueGlf bGF5ZXIuaAo+PiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+PiBpbmRleCAwMDAwMDAwMDAwMDAuLmQ4 ODM4ZWMzOTI5OQo+PiAtLS0gL2Rldi9udWxsCj4+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9zdW40 aS9zdW54aV9sYXllci5oCj4+IEBAIC0wLDAgKzEsMTcgQEAKPj4gKy8qCj4+ICsgKiBDb3B5cmln aHQgKEMpIDIwMTcgSWNlbm93eSBaaGVuZyA8aWNlbm93eUBhb3NjLnh5ej4KPj4gKyAqCj4+ICsg KiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQg YW5kL29yCj4+ICsgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSBhcwo+PiArICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJl IEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKPj4gKyAqIHRoZSBMaWNlbnNlLCBvciAo YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgo+PiArICovCj4+ICsKPj4gKyNpZm5k ZWYgX1NVTlhJX0xBWUVSX0hfCj4+ICsjZGVmaW5lIF9TVU5YSV9MQVlFUl9IXwo+PiArCj4+ICtz dHJ1Y3Qgc3VueGlfbGF5ZXJfb3BzIHsKPj4gKwlzdHJ1Y3QgZHJtX3BsYW5lICooKmdldF9wbGFu ZSkodm9pZCAqbGF5ZXIpOwo+PiArfTsKPj4gKwo+PiArI2VuZGlmIC8qIF9TVU5YSV9MQVlFUl9I XyAqLwo+PiAtLQo+PiAyLjEyLjAKPj4KPj4KPj4gX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX18KPj4gbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKPj4g bGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCj4+IGh0dHA6Ly9saXN0cy5pbmZy YWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo+CgpfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1h aWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xp c3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg== ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [linux-sunxi] Re: [PATCH v3 04/11] drm/sun4i: abstract the layer type 2017-04-04 19:53 ` Icenowy Zheng @ 2017-04-05 2:27 ` Chen-Yu Tsai 2017-04-05 17:14 ` icenowy 0 siblings, 1 reply; 3+ messages in thread From: Chen-Yu Tsai @ 2017-04-05 2:27 UTC (permalink / raw) To: Icenowy Zheng Cc: Sean Paul, Rob Herring, Maxime Ripard, Chen-Yu Tsai, Jernej Skrabec, devicetree, linux-kernel, dri-devel, linux-sunxi, linux-clk, linux-arm-kernel On Wed, Apr 5, 2017 at 3:53 AM, Icenowy Zheng <icenowy@aosc.io> wrote: > > > 在 2017年04月05日 03:28, Sean Paul 写道: >> >> On Thu, Mar 30, 2017 at 03:46:06AM +0800, Icenowy Zheng wrote: >>> >>> As we are going to add support for the Allwinner DE2 Mixer in sun4i-drm >>> driver, we will finally have two types of layer. >>> >>> Abstract the layer type to void * and a ops struct, which contains the >>> only function used by crtc -- get the drm_plane struct of the layer. >>> >>> Signed-off-by: Icenowy Zheng <icenowy@aosc.io> >>> --- >>> Refactored patch in v3. >>> >>> drivers/gpu/drm/sun4i/sun4i_crtc.c | 19 +++++++++++-------- >>> drivers/gpu/drm/sun4i/sun4i_crtc.h | 3 ++- >>> drivers/gpu/drm/sun4i/sun4i_layer.c | 19 ++++++++++++++++++- >>> drivers/gpu/drm/sun4i/sun4i_layer.h | 2 +- >>> drivers/gpu/drm/sun4i/sunxi_layer.h | 17 +++++++++++++++++ >>> 5 files changed, 49 insertions(+), 11 deletions(-) >>> create mode 100644 drivers/gpu/drm/sun4i/sunxi_layer.h >>> >>> diff --git a/drivers/gpu/drm/sun4i/sun4i_crtc.c >>> b/drivers/gpu/drm/sun4i/sun4i_crtc.c >>> index 3c876c3a356a..33854ee7f636 100644 >>> --- a/drivers/gpu/drm/sun4i/sun4i_crtc.c >>> +++ b/drivers/gpu/drm/sun4i/sun4i_crtc.c >>> @@ -29,6 +29,7 @@ >>> #include "sun4i_crtc.h" >>> #include "sun4i_drv.h" >>> #include "sun4i_layer.h" >>> +#include "sunxi_layer.h" >>> #include "sun4i_tcon.h" >>> >>> static void sun4i_crtc_atomic_begin(struct drm_crtc *crtc, >>> @@ -149,7 +150,7 @@ struct sun4i_crtc *sun4i_crtc_init(struct drm_device >>> *drm, >>> scrtc->tcon = tcon; >>> >>> /* Create our layers */ >>> - scrtc->layers = sun4i_layers_init(drm, scrtc->backend); >>> + scrtc->layers = (void **)sun4i_layers_init(drm, scrtc); >>> if (IS_ERR(scrtc->layers)) { >>> dev_err(drm->dev, "Couldn't create the planes\n"); >>> return NULL; >>> @@ -157,14 +158,15 @@ struct sun4i_crtc *sun4i_crtc_init(struct >>> drm_device *drm, >>> >>> /* find primary and cursor planes for drm_crtc_init_with_planes >>> */ >>> for (i = 0; scrtc->layers[i]; i++) { >>> - struct sun4i_layer *layer = scrtc->layers[i]; >>> + void *layer = scrtc->layers[i]; >>> + struct drm_plane *plane = >>> scrtc->layer_ops->get_plane(layer); >>> >>> - switch (layer->plane.type) { >>> + switch (plane->type) { >>> case DRM_PLANE_TYPE_PRIMARY: >>> - primary = &layer->plane; >>> + primary = plane; >>> break; >>> case DRM_PLANE_TYPE_CURSOR: >>> - cursor = &layer->plane; >>> + cursor = plane; >>> break; >>> default: >>> break; >>> @@ -190,10 +192,11 @@ struct sun4i_crtc *sun4i_crtc_init(struct >>> drm_device *drm, >>> /* Set possible_crtcs to this crtc for overlay planes */ >>> for (i = 0; scrtc->layers[i]; i++) { >>> uint32_t possible_crtcs = >>> BIT(drm_crtc_index(&scrtc->crtc)); >>> - struct sun4i_layer *layer = scrtc->layers[i]; >>> + void *layer = scrtc->layers[i]; >>> + struct drm_plane *plane = >>> scrtc->layer_ops->get_plane(layer); >>> >>> - if (layer->plane.type == DRM_PLANE_TYPE_OVERLAY) >>> - layer->plane.possible_crtcs = possible_crtcs; >>> + if (plane->type == DRM_PLANE_TYPE_OVERLAY) >>> + plane->possible_crtcs = possible_crtcs; >>> } >>> >>> return scrtc; >>> diff --git a/drivers/gpu/drm/sun4i/sun4i_crtc.h >>> b/drivers/gpu/drm/sun4i/sun4i_crtc.h >>> index 230cb8f0d601..a4036ee44cf8 100644 >>> --- a/drivers/gpu/drm/sun4i/sun4i_crtc.h >>> +++ b/drivers/gpu/drm/sun4i/sun4i_crtc.h >>> @@ -19,7 +19,8 @@ struct sun4i_crtc { >>> >>> struct sun4i_backend *backend; >>> struct sun4i_tcon *tcon; >>> - struct sun4i_layer **layers; >>> + void **layers; >>> + const struct sunxi_layer_ops *layer_ops; >> >> >> I think you should probably take a different approach to abstract the >> layer >> type. How about creating >> >> struct sunxi_layer { >> struct drm_plane plane; >> } >> >> base and then subclassing that for sun4i and sun8i? By doing this you can >> avoid >> the nasty casting and you can also get rid of the get_plane() hook and >> layer_ops. > > > For the situation that using ** things are easily to get weird. That code could be reworked, by initializing the layers directly within the crtc init code. If you look at rockchip's drm driver, you'll see they do this. There is a good reason to do it this way, as you need to first create the primary and cursor layers, pass them in when you create the crtc, then initialize any additional layers with the possible_crtcs bitmap. In our driver we are currently initializing all layers, then going back and filling in possible_crtcs for the extra layers. And as Maxime and I mentioned in the other thread, we don't really need to keep a reference to **layers. Regards ChenYu > >> >> Sean >> >> >> >>> }; >>> >>> static inline struct sun4i_crtc *drm_crtc_to_sun4i_crtc(struct drm_crtc >>> *crtc) >>> diff --git a/drivers/gpu/drm/sun4i/sun4i_layer.c >>> b/drivers/gpu/drm/sun4i/sun4i_layer.c >>> index f26bde5b9117..bc4a70d6968b 100644 >>> --- a/drivers/gpu/drm/sun4i/sun4i_layer.c >>> +++ b/drivers/gpu/drm/sun4i/sun4i_layer.c >>> @@ -16,7 +16,9 @@ >>> #include <drm/drmP.h> >>> >>> #include "sun4i_backend.h" >>> +#include "sun4i_crtc.h" >>> #include "sun4i_layer.h" >>> +#include "sunxi_layer.h" >>> >>> struct sun4i_plane_desc { >>> enum drm_plane_type type; >>> @@ -100,6 +102,17 @@ static const struct sun4i_plane_desc >>> sun4i_backend_planes[] = { >>> }, >>> }; >>> >>> +static struct drm_plane *sun4i_layer_get_plane(void *layer) >>> +{ >>> + struct sun4i_layer *sun4i_layer = layer; >>> + >>> + return &sun4i_layer->plane; >>> +} >>> + >>> +static const struct sunxi_layer_ops layer_ops = { >>> + .get_plane = sun4i_layer_get_plane, >>> +}; >>> + >>> static struct sun4i_layer *sun4i_layer_init_one(struct drm_device *drm, >>> struct sun4i_backend >>> *backend, >>> const struct >>> sun4i_plane_desc *plane) >>> @@ -129,9 +142,10 @@ static struct sun4i_layer >>> *sun4i_layer_init_one(struct drm_device *drm, >>> } >>> >>> struct sun4i_layer **sun4i_layers_init(struct drm_device *drm, >>> - struct sun4i_backend *backend) >>> + struct sun4i_crtc *crtc) >>> { >>> struct sun4i_layer **layers; >>> + struct sun4i_backend *backend = crtc->backend; >>> int i; >>> >>> layers = devm_kcalloc(drm->dev, ARRAY_SIZE(sun4i_backend_planes) >>> + 1, >>> @@ -181,5 +195,8 @@ struct sun4i_layer **sun4i_layers_init(struct >>> drm_device *drm, >>> layers[i] = layer; >>> }; >>> >>> + /* Assign layer ops to the CRTC */ >>> + crtc->layer_ops = &layer_ops; >>> + >>> return layers; >>> } >>> diff --git a/drivers/gpu/drm/sun4i/sun4i_layer.h >>> b/drivers/gpu/drm/sun4i/sun4i_layer.h >>> index 4be1f0919df2..425eea7b9e3b 100644 >>> --- a/drivers/gpu/drm/sun4i/sun4i_layer.h >>> +++ b/drivers/gpu/drm/sun4i/sun4i_layer.h >>> @@ -27,6 +27,6 @@ plane_to_sun4i_layer(struct drm_plane *plane) >>> } >>> >>> struct sun4i_layer **sun4i_layers_init(struct drm_device *drm, >>> - struct sun4i_backend *backend); >>> + struct sun4i_crtc *crtc); >>> >>> #endif /* _SUN4I_LAYER_H_ */ >>> diff --git a/drivers/gpu/drm/sun4i/sunxi_layer.h >>> b/drivers/gpu/drm/sun4i/sunxi_layer.h >>> new file mode 100644 >>> index 000000000000..d8838ec39299 >>> --- /dev/null >>> +++ b/drivers/gpu/drm/sun4i/sunxi_layer.h >>> @@ -0,0 +1,17 @@ >>> +/* >>> + * Copyright (C) 2017 Icenowy Zheng <icenowy@aosc.xyz> >>> + * >>> + * This program is free software; you can redistribute it and/or >>> + * modify it under the terms of the GNU General Public License as >>> + * published by the Free Software Foundation; either version 2 of >>> + * the License, or (at your option) any later version. >>> + */ >>> + >>> +#ifndef _SUNXI_LAYER_H_ >>> +#define _SUNXI_LAYER_H_ >>> + >>> +struct sunxi_layer_ops { >>> + struct drm_plane *(*get_plane)(void *layer); >>> +}; >>> + >>> +#endif /* _SUNXI_LAYER_H_ */ >>> -- >>> 2.12.0 >>> >>> >>> _______________________________________________ >>> linux-arm-kernel mailing list >>> linux-arm-kernel@lists.infradead.org >>> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel >> >> > > -- > You received this message because you are subscribed to the Google Groups > "linux-sunxi" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to linux-sunxi+unsubscribe@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [linux-sunxi] Re: [PATCH v3 04/11] drm/sun4i: abstract the layer type 2017-04-05 2:27 ` [linux-sunxi] " Chen-Yu Tsai @ 2017-04-05 17:14 ` icenowy 0 siblings, 0 replies; 3+ messages in thread From: icenowy @ 2017-04-05 17:14 UTC (permalink / raw) To: Chen-Yu Tsai Cc: devicetree, Jernej Skrabec, linux-kernel, dri-devel, linux-sunxi, Rob Herring, Sean Paul, Maxime Ripard, linux-clk, linux-arm-kernel 5ZyoIDIwMTctMDQtMDUgMTA6MjfvvIxDaGVuLVl1IFRzYWkg5YaZ6YGT77yaCj4gT24gV2VkLCBB cHIgNSwgMjAxNyBhdCAzOjUzIEFNLCBJY2Vub3d5IFpoZW5nIDxpY2Vub3d5QGFvc2MuaW8+IHdy b3RlOgo+PiAKPj4gCj4+IOWcqCAyMDE35bm0MDTmnIgwNeaXpSAwMzoyOCwgU2VhbiBQYXVsIOWG memBkzoKPj4+IAo+Pj4gT24gVGh1LCBNYXIgMzAsIDIwMTcgYXQgMDM6NDY6MDZBTSArMDgwMCwg SWNlbm93eSBaaGVuZyB3cm90ZToKPj4+PiAKPj4+PiBBcyB3ZSBhcmUgZ29pbmcgdG8gYWRkIHN1 cHBvcnQgZm9yIHRoZSBBbGx3aW5uZXIgREUyIE1peGVyIGluIAo+Pj4+IHN1bjRpLWRybQo+Pj4+ IGRyaXZlciwgd2Ugd2lsbCBmaW5hbGx5IGhhdmUgdHdvIHR5cGVzIG9mIGxheWVyLgo+Pj4+IAo+ Pj4+IEFic3RyYWN0IHRoZSBsYXllciB0eXBlIHRvIHZvaWQgKiBhbmQgYSBvcHMgc3RydWN0LCB3 aGljaCBjb250YWlucyAKPj4+PiB0aGUKPj4+PiBvbmx5IGZ1bmN0aW9uIHVzZWQgYnkgY3J0YyAt LSBnZXQgdGhlIGRybV9wbGFuZSBzdHJ1Y3Qgb2YgdGhlIGxheWVyLgo+Pj4+IAo+Pj4+IFNpZ25l ZC1vZmYtYnk6IEljZW5vd3kgWmhlbmcgPGljZW5vd3lAYW9zYy5pbz4KPj4+PiAtLS0KPj4+PiBS ZWZhY3RvcmVkIHBhdGNoIGluIHYzLgo+Pj4+IAo+Pj4+ICBkcml2ZXJzL2dwdS9kcm0vc3VuNGkv c3VuNGlfY3J0Yy5jICB8IDE5ICsrKysrKysrKysrLS0tLS0tLS0KPj4+PiAgZHJpdmVycy9ncHUv ZHJtL3N1bjRpL3N1bjRpX2NydGMuaCAgfCAgMyArKy0KPj4+PiAgZHJpdmVycy9ncHUvZHJtL3N1 bjRpL3N1bjRpX2xheWVyLmMgfCAxOSArKysrKysrKysrKysrKysrKystCj4+Pj4gIGRyaXZlcnMv Z3B1L2RybS9zdW40aS9zdW40aV9sYXllci5oIHwgIDIgKy0KPj4+PiAgZHJpdmVycy9ncHUvZHJt L3N1bjRpL3N1bnhpX2xheWVyLmggfCAxNyArKysrKysrKysrKysrKysrKwo+Pj4+ICA1IGZpbGVz IGNoYW5nZWQsIDQ5IGluc2VydGlvbnMoKyksIDExIGRlbGV0aW9ucygtKQo+Pj4+ICBjcmVhdGUg bW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL3N1bjRpL3N1bnhpX2xheWVyLmgKPj4+PiAKPj4+ PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3N1bjRpL3N1bjRpX2NydGMuYwo+Pj4+IGIv ZHJpdmVycy9ncHUvZHJtL3N1bjRpL3N1bjRpX2NydGMuYwo+Pj4+IGluZGV4IDNjODc2YzNhMzU2 YS4uMzM4NTRlZTdmNjM2IDEwMDY0NAo+Pj4+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9zdW40aS9z dW40aV9jcnRjLmMKPj4+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vc3VuNGkvc3VuNGlfY3J0Yy5j Cj4+Pj4gQEAgLTI5LDYgKzI5LDcgQEAKPj4+PiAgI2luY2x1ZGUgInN1bjRpX2NydGMuaCIKPj4+ PiAgI2luY2x1ZGUgInN1bjRpX2Rydi5oIgo+Pj4+ICAjaW5jbHVkZSAic3VuNGlfbGF5ZXIuaCIK Pj4+PiArI2luY2x1ZGUgInN1bnhpX2xheWVyLmgiCj4+Pj4gICNpbmNsdWRlICJzdW40aV90Y29u LmgiCj4+Pj4gCj4+Pj4gIHN0YXRpYyB2b2lkIHN1bjRpX2NydGNfYXRvbWljX2JlZ2luKHN0cnVj dCBkcm1fY3J0YyAqY3J0YywKPj4+PiBAQCAtMTQ5LDcgKzE1MCw3IEBAIHN0cnVjdCBzdW40aV9j cnRjICpzdW40aV9jcnRjX2luaXQoc3RydWN0IAo+Pj4+IGRybV9kZXZpY2UKPj4+PiAqZHJtLAo+ Pj4+ICAgICAgICAgc2NydGMtPnRjb24gPSB0Y29uOwo+Pj4+IAo+Pj4+ICAgICAgICAgLyogQ3Jl YXRlIG91ciBsYXllcnMgKi8KPj4+PiAtICAgICAgIHNjcnRjLT5sYXllcnMgPSBzdW40aV9sYXll cnNfaW5pdChkcm0sIHNjcnRjLT5iYWNrZW5kKTsKPj4+PiArICAgICAgIHNjcnRjLT5sYXllcnMg PSAodm9pZCAqKilzdW40aV9sYXllcnNfaW5pdChkcm0sIHNjcnRjKTsKPj4+PiAgICAgICAgIGlm IChJU19FUlIoc2NydGMtPmxheWVycykpIHsKPj4+PiAgICAgICAgICAgICAgICAgZGV2X2Vycihk cm0tPmRldiwgIkNvdWxkbid0IGNyZWF0ZSB0aGUgcGxhbmVzXG4iKTsKPj4+PiAgICAgICAgICAg ICAgICAgcmV0dXJuIE5VTEw7Cj4+Pj4gQEAgLTE1NywxNCArMTU4LDE1IEBAIHN0cnVjdCBzdW40 aV9jcnRjICpzdW40aV9jcnRjX2luaXQoc3RydWN0Cj4+Pj4gZHJtX2RldmljZSAqZHJtLAo+Pj4+ IAo+Pj4+ICAgICAgICAgLyogZmluZCBwcmltYXJ5IGFuZCBjdXJzb3IgcGxhbmVzIGZvciAKPj4+ PiBkcm1fY3J0Y19pbml0X3dpdGhfcGxhbmVzCj4+Pj4gKi8KPj4+PiAgICAgICAgIGZvciAoaSA9 IDA7IHNjcnRjLT5sYXllcnNbaV07IGkrKykgewo+Pj4+IC0gICAgICAgICAgICAgICBzdHJ1Y3Qg c3VuNGlfbGF5ZXIgKmxheWVyID0gc2NydGMtPmxheWVyc1tpXTsKPj4+PiArICAgICAgICAgICAg ICAgdm9pZCAqbGF5ZXIgPSBzY3J0Yy0+bGF5ZXJzW2ldOwo+Pj4+ICsgICAgICAgICAgICAgICBz dHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSA9Cj4+Pj4gc2NydGMtPmxheWVyX29wcy0+Z2V0X3BsYW5l KGxheWVyKTsKPj4+PiAKPj4+PiAtICAgICAgICAgICAgICAgc3dpdGNoIChsYXllci0+cGxhbmUu dHlwZSkgewo+Pj4+ICsgICAgICAgICAgICAgICBzd2l0Y2ggKHBsYW5lLT50eXBlKSB7Cj4+Pj4g ICAgICAgICAgICAgICAgIGNhc2UgRFJNX1BMQU5FX1RZUEVfUFJJTUFSWToKPj4+PiAtICAgICAg ICAgICAgICAgICAgICAgICBwcmltYXJ5ID0gJmxheWVyLT5wbGFuZTsKPj4+PiArICAgICAgICAg ICAgICAgICAgICAgICBwcmltYXJ5ID0gcGxhbmU7Cj4+Pj4gICAgICAgICAgICAgICAgICAgICAg ICAgYnJlYWs7Cj4+Pj4gICAgICAgICAgICAgICAgIGNhc2UgRFJNX1BMQU5FX1RZUEVfQ1VSU09S Ogo+Pj4+IC0gICAgICAgICAgICAgICAgICAgICAgIGN1cnNvciA9ICZsYXllci0+cGxhbmU7Cj4+ Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yID0gcGxhbmU7Cj4+Pj4gICAgICAgICAg ICAgICAgICAgICAgICAgYnJlYWs7Cj4+Pj4gICAgICAgICAgICAgICAgIGRlZmF1bHQ6Cj4+Pj4g ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cj4+Pj4gQEAgLTE5MCwxMCArMTkyLDExIEBA IHN0cnVjdCBzdW40aV9jcnRjICpzdW40aV9jcnRjX2luaXQoc3RydWN0Cj4+Pj4gZHJtX2Rldmlj ZSAqZHJtLAo+Pj4+ICAgICAgICAgLyogU2V0IHBvc3NpYmxlX2NydGNzIHRvIHRoaXMgY3J0YyBm b3Igb3ZlcmxheSBwbGFuZXMgKi8KPj4+PiAgICAgICAgIGZvciAoaSA9IDA7IHNjcnRjLT5sYXll cnNbaV07IGkrKykgewo+Pj4+ICAgICAgICAgICAgICAgICB1aW50MzJfdCBwb3NzaWJsZV9jcnRj cyA9Cj4+Pj4gQklUKGRybV9jcnRjX2luZGV4KCZzY3J0Yy0+Y3J0YykpOwo+Pj4+IC0gICAgICAg ICAgICAgICBzdHJ1Y3Qgc3VuNGlfbGF5ZXIgKmxheWVyID0gc2NydGMtPmxheWVyc1tpXTsKPj4+ PiArICAgICAgICAgICAgICAgdm9pZCAqbGF5ZXIgPSBzY3J0Yy0+bGF5ZXJzW2ldOwo+Pj4+ICsg ICAgICAgICAgICAgICBzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSA9Cj4+Pj4gc2NydGMtPmxheWVy X29wcy0+Z2V0X3BsYW5lKGxheWVyKTsKPj4+PiAKPj4+PiAtICAgICAgICAgICAgICAgaWYgKGxh eWVyLT5wbGFuZS50eXBlID09IERSTV9QTEFORV9UWVBFX09WRVJMQVkpCj4+Pj4gLSAgICAgICAg ICAgICAgICAgICAgICAgbGF5ZXItPnBsYW5lLnBvc3NpYmxlX2NydGNzID0gCj4+Pj4gcG9zc2li bGVfY3J0Y3M7Cj4+Pj4gKyAgICAgICAgICAgICAgIGlmIChwbGFuZS0+dHlwZSA9PSBEUk1fUExB TkVfVFlQRV9PVkVSTEFZKQo+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lLT5wb3Nz aWJsZV9jcnRjcyA9IHBvc3NpYmxlX2NydGNzOwo+Pj4+ICAgICAgICAgfQo+Pj4+IAo+Pj4+ICAg ICAgICAgcmV0dXJuIHNjcnRjOwo+Pj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vc3Vu NGkvc3VuNGlfY3J0Yy5oCj4+Pj4gYi9kcml2ZXJzL2dwdS9kcm0vc3VuNGkvc3VuNGlfY3J0Yy5o Cj4+Pj4gaW5kZXggMjMwY2I4ZjBkNjAxLi5hNDAzNmVlNDRjZjggMTAwNjQ0Cj4+Pj4gLS0tIGEv ZHJpdmVycy9ncHUvZHJtL3N1bjRpL3N1bjRpX2NydGMuaAo+Pj4+ICsrKyBiL2RyaXZlcnMvZ3B1 L2RybS9zdW40aS9zdW40aV9jcnRjLmgKPj4+PiBAQCAtMTksNyArMTksOCBAQCBzdHJ1Y3Qgc3Vu NGlfY3J0YyB7Cj4+Pj4gCj4+Pj4gICAgICAgICBzdHJ1Y3Qgc3VuNGlfYmFja2VuZCAgICAgICAg ICAgICpiYWNrZW5kOwo+Pj4+ICAgICAgICAgc3RydWN0IHN1bjRpX3Rjb24gICAgICAgICAgICAg ICAqdGNvbjsKPj4+PiAtICAgICAgIHN0cnVjdCBzdW40aV9sYXllciAgICAgICAgICAgICAgKips YXllcnM7Cj4+Pj4gKyAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqbGF5 ZXJzOwo+Pj4+ICsgICAgICAgY29uc3Qgc3RydWN0IHN1bnhpX2xheWVyX29wcyAgICAqbGF5ZXJf b3BzOwo+Pj4gCj4+PiAKPj4+IEkgdGhpbmsgeW91IHNob3VsZCBwcm9iYWJseSB0YWtlIGEgZGlm ZmVyZW50IGFwcHJvYWNoIHRvIGFic3RyYWN0IHRoZQo+Pj4gbGF5ZXIKPj4+IHR5cGUuIEhvdyBh Ym91dCBjcmVhdGluZwo+Pj4gCj4+PiBzdHJ1Y3Qgc3VueGlfbGF5ZXIgewo+Pj4gICAgICAgICBz dHJ1Y3QgZHJtX3BsYW5lIHBsYW5lOwo+Pj4gfQo+Pj4gCj4+PiBiYXNlIGFuZCB0aGVuIHN1YmNs YXNzaW5nIHRoYXQgZm9yIHN1bjRpIGFuZCBzdW44aT8gQnkgZG9pbmcgdGhpcyB5b3UgCj4+PiBj YW4KPj4+IGF2b2lkCj4+PiB0aGUgbmFzdHkgY2FzdGluZyBhbmQgeW91IGNhbiBhbHNvIGdldCBy aWQgb2YgdGhlIGdldF9wbGFuZSgpIGhvb2sgCj4+PiBhbmQKPj4+IGxheWVyX29wcy4KPj4gCj4+ IAo+PiBGb3IgdGhlIHNpdHVhdGlvbiB0aGF0IHVzaW5nICoqIHRoaW5ncyBhcmUgZWFzaWx5IHRv IGdldCB3ZWlyZC4KPiAKPiBUaGF0IGNvZGUgY291bGQgYmUgcmV3b3JrZWQsIGJ5IGluaXRpYWxp emluZyB0aGUgbGF5ZXJzIGRpcmVjdGx5IHdpdGhpbgo+IHRoZSBjcnRjIGluaXQgY29kZS4gSWYg eW91IGxvb2sgYXQgcm9ja2NoaXAncyBkcm0gZHJpdmVyLCB5b3UnbGwgc2VlCj4gdGhleSBkbyB0 aGlzLiBUaGVyZSBpcyBhIGdvb2QgcmVhc29uIHRvIGRvIGl0IHRoaXMgd2F5LCBhcyB5b3UgbmVl ZAo+IHRvIGZpcnN0IGNyZWF0ZSB0aGUgcHJpbWFyeSBhbmQgY3Vyc29yIGxheWVycywgcGFzcyB0 aGVtIGluIHdoZW4geW91Cj4gY3JlYXRlIHRoZSBjcnRjLCB0aGVuIGluaXRpYWxpemUgYW55IGFk ZGl0aW9uYWwgbGF5ZXJzIHdpdGggdGhlCj4gcG9zc2libGVfY3J0Y3MgYml0bWFwLgoKSSBmZWVs IHRoYXQgaXQncyBzdGlsbCBtb3JlIHByb3BlciB0byBvZmZsb2FkIHBsYW5lIGNyZWF0aW9uIGNv ZGUKdG8gKl9sYXllcnNfaW5pdCBmdW5jdGlvbiwgYXM6CgoxLiBXZSBjYW5ub3QgYXNzdW1lIHRo ZSBjdXJzb3IgbGF5ZXIncwpleGlzdGFuY2UuIEluIGZhY3QgY3VycmVudGx5IG5vIGNvZGUgaW4g c3VuNGktZHJtIChpbmNsdWRpbmcgdGhpcwpwYXRjaHNldCkgY3JlYXRlIGEgY3Vyc29yIGxheWVy LgoKMi4gVGhlIGZvcm1hdCBvZiBwbGFuZXMgaGVhdmlseSBkZXBlbmQgb24gdGhlIGVuZ2luZSB0 eXBlICgKc3VuNGktYmFja2VuZCBvciBzdW44aS1taXhlcikuCgozLiBXZSBzaG91bGQgY3JlYXRl IHBsYW5lcyBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgb2YgZW5naW5lLgpDdXJyZW50bHkgdGhlICpf bGF5ZXJzX2luaXQgZnVuY3Rpb24gaXMgcGFydCBvZiBlbmdpbmUgY29kZSAoU2VlIG15Ck1ha2Vm aWxlIGNoYW5nZSkuCgo0LiBJZiB3ZSBkbyBzbyB3ZSB3aWxsIGhhdmUgdHdvIGNvZGVzIGZvciBw bGFuZSBjcmVhdGluZyAtLSBvbmUgZm9yCnByaW1hcnkgaW4gc3VuNGlfY3J0Y19pbml0LCBhbm90 aGVyIGZvciBvdmVybGF5cyBpbiAqX2xheWVyc19pbml0LgoKPiAKPiBJbiBvdXIgZHJpdmVyIHdl IGFyZSBjdXJyZW50bHkgaW5pdGlhbGl6aW5nIGFsbCBsYXllcnMsIHRoZW4gZ29pbmcKPiBiYWNr IGFuZCBmaWxsaW5nIGluIHBvc3NpYmxlX2NydGNzIGZvciB0aGUgZXh0cmEgbGF5ZXJzLgo+IAo+ IEFuZCBhcyBNYXhpbWUgYW5kIEkgbWVudGlvbmVkIGluIHRoZSBvdGhlciB0aHJlYWQsIHdlIGRv bid0IHJlYWxseQo+IG5lZWQgdG8ga2VlcCBhIHJlZmVyZW5jZSB0byAqKmxheWVycy4KCkl0J3Mg Y29ycmVjdCwgbGF5ZXJzIGRvZXNuJ3QgbmVlZCB0byBiZSBrZXB0LgoKQW5kIHRoZSBzdHJ1Y3Qg c3VueGlfbGF5ZXIgcmVmYWN0b3IgYWxzbyBtYWtlcyBzZW5zZS4KCj4gCj4gUmVnYXJkcwo+IENo ZW5ZdQo+IAo+PiAKPj4+IAo+Pj4gU2Vhbgo+Pj4gCj4+PiAKPj4+IAo+Pj4+ICB9Owo+Pj4+IAo+ Pj4+ICBzdGF0aWMgaW5saW5lIHN0cnVjdCBzdW40aV9jcnRjICpkcm1fY3J0Y190b19zdW40aV9j cnRjKHN0cnVjdCAKPj4+PiBkcm1fY3J0Ywo+Pj4+ICpjcnRjKQo+Pj4+IGRpZmYgLS1naXQgYS9k cml2ZXJzL2dwdS9kcm0vc3VuNGkvc3VuNGlfbGF5ZXIuYwo+Pj4+IGIvZHJpdmVycy9ncHUvZHJt L3N1bjRpL3N1bjRpX2xheWVyLmMKPj4+PiBpbmRleCBmMjZiZGU1YjkxMTcuLmJjNGE3MGQ2OTY4 YiAxMDA2NDQKPj4+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vc3VuNGkvc3VuNGlfbGF5ZXIuYwo+ Pj4+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9zdW40aS9zdW40aV9sYXllci5jCj4+Pj4gQEAgLTE2 LDcgKzE2LDkgQEAKPj4+PiAgI2luY2x1ZGUgPGRybS9kcm1QLmg+Cj4+Pj4gCj4+Pj4gICNpbmNs dWRlICJzdW40aV9iYWNrZW5kLmgiCj4+Pj4gKyNpbmNsdWRlICJzdW40aV9jcnRjLmgiCj4+Pj4g ICNpbmNsdWRlICJzdW40aV9sYXllci5oIgo+Pj4+ICsjaW5jbHVkZSAic3VueGlfbGF5ZXIuaCIK Pj4+PiAKPj4+PiAgc3RydWN0IHN1bjRpX3BsYW5lX2Rlc2Mgewo+Pj4+ICAgICAgICAgICAgICAg IGVudW0gZHJtX3BsYW5lX3R5cGUgICAgIHR5cGU7Cj4+Pj4gQEAgLTEwMCw2ICsxMDIsMTcgQEAg c3RhdGljIGNvbnN0IHN0cnVjdCBzdW40aV9wbGFuZV9kZXNjCj4+Pj4gc3VuNGlfYmFja2VuZF9w bGFuZXNbXSA9IHsKPj4+PiAgICAgICAgIH0sCj4+Pj4gIH07Cj4+Pj4gCj4+Pj4gK3N0YXRpYyBz dHJ1Y3QgZHJtX3BsYW5lICpzdW40aV9sYXllcl9nZXRfcGxhbmUodm9pZCAqbGF5ZXIpCj4+Pj4g K3sKPj4+PiArICAgICAgIHN0cnVjdCBzdW40aV9sYXllciAqc3VuNGlfbGF5ZXIgPSBsYXllcjsK Pj4+PiArCj4+Pj4gKyAgICAgICByZXR1cm4gJnN1bjRpX2xheWVyLT5wbGFuZTsKPj4+PiArfQo+ Pj4+ICsKPj4+PiArc3RhdGljIGNvbnN0IHN0cnVjdCBzdW54aV9sYXllcl9vcHMgbGF5ZXJfb3Bz ID0gewo+Pj4+ICsgICAgICAgLmdldF9wbGFuZSA9IHN1bjRpX2xheWVyX2dldF9wbGFuZSwKPj4+ PiArfTsKPj4+PiArCj4+Pj4gIHN0YXRpYyBzdHJ1Y3Qgc3VuNGlfbGF5ZXIgKnN1bjRpX2xheWVy X2luaXRfb25lKHN0cnVjdCBkcm1fZGV2aWNlIAo+Pj4+ICpkcm0sCj4+Pj4gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN1bjRpX2JhY2tlbmQK Pj4+PiAqYmFja2VuZCwKPj4+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBjb25zdCBzdHJ1Y3QKPj4+PiBzdW40aV9wbGFuZV9kZXNjICpwbGFuZSkKPj4+ PiBAQCAtMTI5LDkgKzE0MiwxMCBAQCBzdGF0aWMgc3RydWN0IHN1bjRpX2xheWVyCj4+Pj4gKnN1 bjRpX2xheWVyX2luaXRfb25lKHN0cnVjdCBkcm1fZGV2aWNlICpkcm0sCj4+Pj4gIH0KPj4+PiAK Pj4+PiAgc3RydWN0IHN1bjRpX2xheWVyICoqc3VuNGlfbGF5ZXJzX2luaXQoc3RydWN0IGRybV9k ZXZpY2UgKmRybSwKPj4+PiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz dHJ1Y3Qgc3VuNGlfYmFja2VuZCAKPj4+PiAqYmFja2VuZCkKPj4+PiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3VuNGlfY3J0YyAqY3J0YykKPj4+PiAgewo+ Pj4+ICAgICAgICAgc3RydWN0IHN1bjRpX2xheWVyICoqbGF5ZXJzOwo+Pj4+ICsgICAgICAgc3Ry dWN0IHN1bjRpX2JhY2tlbmQgKmJhY2tlbmQgPSBjcnRjLT5iYWNrZW5kOwo+Pj4+ICAgICAgICAg aW50IGk7Cj4+Pj4gCj4+Pj4gICAgICAgICBsYXllcnMgPSBkZXZtX2tjYWxsb2MoZHJtLT5kZXYs IAo+Pj4+IEFSUkFZX1NJWkUoc3VuNGlfYmFja2VuZF9wbGFuZXMpCj4+Pj4gKyAxLAo+Pj4+IEBA IC0xODEsNSArMTk1LDggQEAgc3RydWN0IHN1bjRpX2xheWVyICoqc3VuNGlfbGF5ZXJzX2luaXQo c3RydWN0Cj4+Pj4gZHJtX2RldmljZSAqZHJtLAo+Pj4+ICAgICAgICAgICAgICAgICBsYXllcnNb aV0gPSBsYXllcjsKPj4+PiAgICAgICAgIH07Cj4+Pj4gCj4+Pj4gKyAgICAgICAvKiBBc3NpZ24g bGF5ZXIgb3BzIHRvIHRoZSBDUlRDICovCj4+Pj4gKyAgICAgICBjcnRjLT5sYXllcl9vcHMgPSAm bGF5ZXJfb3BzOwo+Pj4+ICsKPj4+PiAgICAgICAgIHJldHVybiBsYXllcnM7Cj4+Pj4gIH0KPj4+ PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3N1bjRpL3N1bjRpX2xheWVyLmgKPj4+PiBi L2RyaXZlcnMvZ3B1L2RybS9zdW40aS9zdW40aV9sYXllci5oCj4+Pj4gaW5kZXggNGJlMWYwOTE5 ZGYyLi40MjVlZWE3YjllM2IgMTAwNjQ0Cj4+Pj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL3N1bjRp L3N1bjRpX2xheWVyLmgKPj4+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vc3VuNGkvc3VuNGlfbGF5 ZXIuaAo+Pj4+IEBAIC0yNyw2ICsyNyw2IEBAIHBsYW5lX3RvX3N1bjRpX2xheWVyKHN0cnVjdCBk cm1fcGxhbmUgKnBsYW5lKQo+Pj4+ICB9Cj4+Pj4gCj4+Pj4gIHN0cnVjdCBzdW40aV9sYXllciAq KnN1bjRpX2xheWVyc19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkcm0sCj4+Pj4gLSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN1bjRpX2JhY2tlbmQgCj4+Pj4g KmJhY2tlbmQpOwo+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0 cnVjdCBzdW40aV9jcnRjICpjcnRjKTsKPj4+PiAKPj4+PiAgI2VuZGlmIC8qIF9TVU40SV9MQVlF Ul9IXyAqLwo+Pj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vc3VuNGkvc3VueGlfbGF5 ZXIuaAo+Pj4+IGIvZHJpdmVycy9ncHUvZHJtL3N1bjRpL3N1bnhpX2xheWVyLmgKPj4+PiBuZXcg ZmlsZSBtb2RlIDEwMDY0NAo+Pj4+IGluZGV4IDAwMDAwMDAwMDAwMC4uZDg4MzhlYzM5Mjk5Cj4+ Pj4gLS0tIC9kZXYvbnVsbAo+Pj4+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9zdW40aS9zdW54aV9s YXllci5oCj4+Pj4gQEAgLTAsMCArMSwxNyBAQAo+Pj4+ICsvKgo+Pj4+ICsgKiBDb3B5cmlnaHQg KEMpIDIwMTcgSWNlbm93eSBaaGVuZyA8aWNlbm93eUBhb3NjLnh5ej4KPj4+PiArICoKPj4+PiAr ICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0 IGFuZC9vcgo+Pj4+ICsgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZSBhcwo+Pj4+ICsgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29m dHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgo+Pj4+ICsgKiB0aGUgTGljZW5z ZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KPj4+PiArICovCj4+Pj4g Kwo+Pj4+ICsjaWZuZGVmIF9TVU5YSV9MQVlFUl9IXwo+Pj4+ICsjZGVmaW5lIF9TVU5YSV9MQVlF Ul9IXwo+Pj4+ICsKPj4+PiArc3RydWN0IHN1bnhpX2xheWVyX29wcyB7Cj4+Pj4gKyAgICAgICBz dHJ1Y3QgZHJtX3BsYW5lICooKmdldF9wbGFuZSkodm9pZCAqbGF5ZXIpOwo+Pj4+ICt9Owo+Pj4+ ICsKPj4+PiArI2VuZGlmIC8qIF9TVU5YSV9MQVlFUl9IXyAqLwo+Pj4+IC0tCj4+Pj4gMi4xMi4w Cj4+Pj4gCj4+Pj4gCj4+Pj4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18KPj4+PiBsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdAo+Pj4+IGxpbnV4LWFy bS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwo+Pj4+IGh0dHA6Ly9saXN0cy5pbmZyYWRlYWQu b3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo+Pj4gCj4+PiAKPj4gCj4+IC0t Cj4+IFlvdSByZWNlaXZlZCB0aGlzIG1lc3NhZ2UgYmVjYXVzZSB5b3UgYXJlIHN1YnNjcmliZWQg dG8gdGhlIEdvb2dsZSAKPj4gR3JvdXBzCj4+ICJsaW51eC1zdW54aSIgZ3JvdXAuCj4+IFRvIHVu c3Vic2NyaWJlIGZyb20gdGhpcyBncm91cCBhbmQgc3RvcCByZWNlaXZpbmcgZW1haWxzIGZyb20g aXQsIHNlbmQgCj4+IGFuCj4+IGVtYWlsIHRvIGxpbnV4LXN1bnhpK3Vuc3Vic2NyaWJlQGdvb2ds ZWdyb3Vwcy5jb20uCj4+IEZvciBtb3JlIG9wdGlvbnMsIHZpc2l0IGh0dHBzOi8vZ3JvdXBzLmdv b2dsZS5jb20vZC9vcHRvdXQuCj4gCj4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX18KPiBsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdAo+IGxpbnV4LWFy bS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwo+IGh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3Jn L21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAoKX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QK bGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRl YWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo= ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2017-04-05 17:14 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20170405052325.98B958A2E94@relay.mailchannels.net>
2017-04-05 8:09 ` [linux-sunxi] Re: [PATCH v3 04/11] drm/sun4i: abstract the layer type Maxime Ripard
2017-03-29 19:46 [PATCH v3 00/11] Initial Allwinner Display Engine 2.0 Support Icenowy Zheng
2017-03-29 19:46 ` [PATCH v3 04/11] drm/sun4i: abstract the layer type Icenowy Zheng
2017-04-04 19:28 ` Sean Paul
2017-04-04 19:53 ` Icenowy Zheng
2017-04-05 2:27 ` [linux-sunxi] " Chen-Yu Tsai
2017-04-05 17:14 ` icenowy
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox