linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] drm/tegra: add tiling FB modifiers
@ 2016-11-08  7:50 Alexandre Courbot
  2016-11-08  9:07 ` Erik Faye-Lund
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Alexandre Courbot @ 2016-11-08  7:50 UTC (permalink / raw)
  To: Thierry Reding, David Airlie, dri-devel, linux-tegra, linux-kernel
  Cc: gnurou, Alexandre Courbot

Add FB modifiers to allow user-space to specify that a surface is in one
of the two tiling formats supported by Tegra chips, and add support in
the tegradrm driver to handle them properly. This is necessary for the
display controller to directly display buffers generated by the GPU.

This feature is intended to replace the dedicated IOCTL enabled
by TEGRA_STAGING and to provide a non-staging alternative to that
solution.

Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
---
 drivers/gpu/drm/tegra/drm.c   |  2 ++
 drivers/gpu/drm/tegra/fb.c    | 23 +++++++++++++++++++---
 include/uapi/drm/drm_fourcc.h | 45 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 67 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c
index a9630c2d6cb3..36b4b30a5164 100644
--- a/drivers/gpu/drm/tegra/drm.c
+++ b/drivers/gpu/drm/tegra/drm.c
@@ -161,6 +161,8 @@ static int tegra_drm_load(struct drm_device *drm, unsigned long flags)
 	drm->mode_config.max_width = 4096;
 	drm->mode_config.max_height = 4096;
 
+	drm->mode_config.allow_fb_modifiers = true;
+
 	drm->mode_config.funcs = &tegra_drm_mode_funcs;
 
 	err = tegra_drm_fb_prepare(drm);
diff --git a/drivers/gpu/drm/tegra/fb.c b/drivers/gpu/drm/tegra/fb.c
index e6d71fa4028e..2fded58b2ca5 100644
--- a/drivers/gpu/drm/tegra/fb.c
+++ b/drivers/gpu/drm/tegra/fb.c
@@ -52,9 +52,26 @@ int tegra_fb_get_tiling(struct drm_framebuffer *framebuffer,
 			struct tegra_bo_tiling *tiling)
 {
 	struct tegra_fb *fb = to_tegra_fb(framebuffer);
-
-	/* TODO: handle YUV formats? */
-	*tiling = fb->planes[0]->tiling;
+	uint64_t modifier = fb->base.modifier[0];
+
+	switch (fourcc_mod_tegra_mod(modifier)) {
+	case NV_FORMAT_MOD_TEGRA_TILED:
+		tiling->mode = TEGRA_BO_TILING_MODE_TILED;
+		tiling->value = 0;
+		break;
+
+	case NV_FORMAT_MOD_TEGRA_16BX2_BLOCK(0):
+		tiling->mode = TEGRA_BO_TILING_MODE_BLOCK;
+		tiling->value = fourcc_mod_tegra_param(modifier);
+		if (tiling->value > 5)
+			return -EINVAL;
+		break;
+
+	default:
+		/* TODO: handle YUV formats? */
+		*tiling = fb->planes[0]->tiling;
+		break;
+	}
 
 	return 0;
 }
diff --git a/include/uapi/drm/drm_fourcc.h b/include/uapi/drm/drm_fourcc.h
index a5890bf44c0a..967dfab16881 100644
--- a/include/uapi/drm/drm_fourcc.h
+++ b/include/uapi/drm/drm_fourcc.h
@@ -233,6 +233,51 @@ extern "C" {
  */
 #define DRM_FORMAT_MOD_SAMSUNG_64_32_TILE	fourcc_mod_code(SAMSUNG, 1)
 
+
+/* NVIDIA Tegra frame buffer modifiers */
+
+/*
+ * Some modifiers take parameters, for example the number of vertical GOBs in
+ * a block. Reserve the lower 32 bits for parameters
+ */
+#define __fourcc_mod_tegra_mode_shift 32
+#define fourcc_mod_tegra_code(val, params) \
+	fourcc_mod_code(NV, ((((__u64)val) << __fourcc_mod_tegra_mode_shift) | params))
+#define fourcc_mod_tegra_mod(m) \
+	(m & ~((1ULL << __fourcc_mod_tegra_mode_shift) - 1))
+#define fourcc_mod_tegra_param(m) \
+	(m & ((1ULL << __fourcc_mod_tegra_mode_shift) - 1))
+
+/*
+ * Tegra Tiled Layout, used by Tegra 2, 3 and 4.
+ *
+ * Pixels are arranged in simple tiles of 16 x 16 bytes.
+ */
+#define NV_FORMAT_MOD_TEGRA_TILED fourcc_mod_tegra_code(1, 0)
+
+/*
+ * Tegra 16Bx2 Block Linear layout, used by TK1/TX1
+ *
+ * Pixels are arranged in 64x8 Groups Of Bytes (GOBs). GOBs are then stacked
+ * vertically by a power of 2 (1 to 32 GOBs) to form a block.
+ *
+ * Within a GOB, data is ordered as 16B x 2 lines sectors laid in Z-shape.
+ *
+ * Parameter 'v' is the log2 encoding of the number of GOBs stacked vertically.
+ * Valid values are:
+ *
+ * 0 == ONE_GOB
+ * 1 == TWO_GOBS
+ * 2 == FOUR_GOBS
+ * 3 == EIGHT_GOBS
+ * 4 == SIXTEEN_GOBS
+ * 5 == THIRTYTWO_GOBS
+ *
+ * Chapter 20 "Pixel Memory Formats" of the Tegra X1 TRM describes this format
+ * in full detail.
+ */
+#define NV_FORMAT_MOD_TEGRA_16BX2_BLOCK(v) fourcc_mod_tegra_code(2, v)
+
 #if defined(__cplusplus)
 }
 #endif
-- 
2.10.2

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH] drm/tegra: add tiling FB modifiers
  2016-11-08  7:50 [PATCH] drm/tegra: add tiling FB modifiers Alexandre Courbot
@ 2016-11-08  9:07 ` Erik Faye-Lund
  2016-11-08  9:19   ` Alexandre Courbot
  2016-11-08 10:34 ` Daniel Vetter
  2017-03-20 17:26 ` Thierry Reding
  2 siblings, 1 reply; 6+ messages in thread
From: Erik Faye-Lund @ 2016-11-08  9:07 UTC (permalink / raw)
  To: Alexandre Courbot
  Cc: Thierry Reding, David Airlie, dri-devel, linux-tegra,
	linux-kernel, Alexandre Courbot

On Tue, Nov 8, 2016 at 8:50 AM, Alexandre Courbot <acourbot@nvidia.com> wrote:
> Add FB modifiers to allow user-space to specify that a surface is in one
> of the two tiling formats supported by Tegra chips, and add support in
> the tegradrm driver to handle them properly. This is necessary for the
> display controller to directly display buffers generated by the GPU.
>
> This feature is intended to replace the dedicated IOCTL enabled
> by TEGRA_STAGING and to provide a non-staging alternative to that
> solution.
>
> Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
> ---
>  drivers/gpu/drm/tegra/drm.c   |  2 ++
>  drivers/gpu/drm/tegra/fb.c    | 23 +++++++++++++++++++---
>  include/uapi/drm/drm_fourcc.h | 45 +++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 67 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c
> index a9630c2d6cb3..36b4b30a5164 100644
> --- a/drivers/gpu/drm/tegra/drm.c
> +++ b/drivers/gpu/drm/tegra/drm.c
> @@ -161,6 +161,8 @@ static int tegra_drm_load(struct drm_device *drm, unsigned long flags)
>         drm->mode_config.max_width = 4096;
>         drm->mode_config.max_height = 4096;
>
> +       drm->mode_config.allow_fb_modifiers = true;
> +
>         drm->mode_config.funcs = &tegra_drm_mode_funcs;
>
>         err = tegra_drm_fb_prepare(drm);
> diff --git a/drivers/gpu/drm/tegra/fb.c b/drivers/gpu/drm/tegra/fb.c
> index e6d71fa4028e..2fded58b2ca5 100644
> --- a/drivers/gpu/drm/tegra/fb.c
> +++ b/drivers/gpu/drm/tegra/fb.c
> @@ -52,9 +52,26 @@ int tegra_fb_get_tiling(struct drm_framebuffer *framebuffer,
>                         struct tegra_bo_tiling *tiling)
>  {
>         struct tegra_fb *fb = to_tegra_fb(framebuffer);
> -
> -       /* TODO: handle YUV formats? */
> -       *tiling = fb->planes[0]->tiling;
> +       uint64_t modifier = fb->base.modifier[0];
> +
> +       switch (fourcc_mod_tegra_mod(modifier)) {
> +       case NV_FORMAT_MOD_TEGRA_TILED:
> +               tiling->mode = TEGRA_BO_TILING_MODE_TILED;
> +               tiling->value = 0;
> +               break;
> +
> +       case NV_FORMAT_MOD_TEGRA_16BX2_BLOCK(0):
> +               tiling->mode = TEGRA_BO_TILING_MODE_BLOCK;
> +               tiling->value = fourcc_mod_tegra_param(modifier);
> +               if (tiling->value > 5)
> +                       return -EINVAL;

Shouldn't this contain some hardware-check for the support? AFAIK, not
all Tegras support all block-heights (if even this mode at all?)...

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] drm/tegra: add tiling FB modifiers
  2016-11-08  9:07 ` Erik Faye-Lund
@ 2016-11-08  9:19   ` Alexandre Courbot
  2017-03-20 17:26     ` Thierry Reding
  0 siblings, 1 reply; 6+ messages in thread
From: Alexandre Courbot @ 2016-11-08  9:19 UTC (permalink / raw)
  To: kusmabite
  Cc: Thierry Reding, David Airlie, dri-devel, linux-tegra,
	linux-kernel, Alexandre Courbot

On 11/08/2016 06:07 PM, Erik Faye-Lund wrote:
> On Tue, Nov 8, 2016 at 8:50 AM, Alexandre Courbot <acourbot@nvidia.com> wrote:
>> Add FB modifiers to allow user-space to specify that a surface is in one
>> of the two tiling formats supported by Tegra chips, and add support in
>> the tegradrm driver to handle them properly. This is necessary for the
>> display controller to directly display buffers generated by the GPU.
>>
>> This feature is intended to replace the dedicated IOCTL enabled
>> by TEGRA_STAGING and to provide a non-staging alternative to that
>> solution.
>>
>> Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
>> ---
>>  drivers/gpu/drm/tegra/drm.c   |  2 ++
>>  drivers/gpu/drm/tegra/fb.c    | 23 +++++++++++++++++++---
>>  include/uapi/drm/drm_fourcc.h | 45 +++++++++++++++++++++++++++++++++++++++++++
>>  3 files changed, 67 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c
>> index a9630c2d6cb3..36b4b30a5164 100644
>> --- a/drivers/gpu/drm/tegra/drm.c
>> +++ b/drivers/gpu/drm/tegra/drm.c
>> @@ -161,6 +161,8 @@ static int tegra_drm_load(struct drm_device *drm, unsigned long flags)
>>         drm->mode_config.max_width = 4096;
>>         drm->mode_config.max_height = 4096;
>>
>> +       drm->mode_config.allow_fb_modifiers = true;
>> +
>>         drm->mode_config.funcs = &tegra_drm_mode_funcs;
>>
>>         err = tegra_drm_fb_prepare(drm);
>> diff --git a/drivers/gpu/drm/tegra/fb.c b/drivers/gpu/drm/tegra/fb.c
>> index e6d71fa4028e..2fded58b2ca5 100644
>> --- a/drivers/gpu/drm/tegra/fb.c
>> +++ b/drivers/gpu/drm/tegra/fb.c
>> @@ -52,9 +52,26 @@ int tegra_fb_get_tiling(struct drm_framebuffer *framebuffer,
>>                         struct tegra_bo_tiling *tiling)
>>  {
>>         struct tegra_fb *fb = to_tegra_fb(framebuffer);
>> -
>> -       /* TODO: handle YUV formats? */
>> -       *tiling = fb->planes[0]->tiling;
>> +       uint64_t modifier = fb->base.modifier[0];
>> +
>> +       switch (fourcc_mod_tegra_mod(modifier)) {
>> +       case NV_FORMAT_MOD_TEGRA_TILED:
>> +               tiling->mode = TEGRA_BO_TILING_MODE_TILED;
>> +               tiling->value = 0;
>> +               break;
>> +
>> +       case NV_FORMAT_MOD_TEGRA_16BX2_BLOCK(0):
>> +               tiling->mode = TEGRA_BO_TILING_MODE_BLOCK;
>> +               tiling->value = fourcc_mod_tegra_param(modifier);
>> +               if (tiling->value > 5)
>> +                       return -EINVAL;
> 
> Shouldn't this contain some hardware-check for the support? AFAIK, not
> all Tegras support all block-heights (if even this mode at all?)...

tegra_dc_setup_window does that check later (check the test on
dc->soc->supports_block_linear). At the moment no error message is
displayed though (and it seems like we are writing a stale value in
DC_WIN_BUFFER_ADDR_MODE if the SoC doesn't support block linear and the
tiling mode is TEGRA_BO_TILING_MODE_BLOCK?)

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] drm/tegra: add tiling FB modifiers
  2016-11-08  7:50 [PATCH] drm/tegra: add tiling FB modifiers Alexandre Courbot
  2016-11-08  9:07 ` Erik Faye-Lund
@ 2016-11-08 10:34 ` Daniel Vetter
  2017-03-20 17:26 ` Thierry Reding
  2 siblings, 0 replies; 6+ messages in thread
From: Daniel Vetter @ 2016-11-08 10:34 UTC (permalink / raw)
  To: Alexandre Courbot
  Cc: Thierry Reding, David Airlie, dri-devel, linux-tegra,
	linux-kernel, gnurou

On Tue, Nov 08, 2016 at 04:50:42PM +0900, Alexandre Courbot wrote:
> Add FB modifiers to allow user-space to specify that a surface is in one
> of the two tiling formats supported by Tegra chips, and add support in
> the tegradrm driver to handle them properly. This is necessary for the
> display controller to directly display buffers generated by the GPU.
> 
> This feature is intended to replace the dedicated IOCTL enabled
> by TEGRA_STAGING and to provide a non-staging alternative to that
> solution.
> 
> Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>

Ack on the drm_fourcc.h part, I think that's the amount of detail in
comments that's reasonable. Feel free to merge through tegra trees.
-Daniel

> ---
>  drivers/gpu/drm/tegra/drm.c   |  2 ++
>  drivers/gpu/drm/tegra/fb.c    | 23 +++++++++++++++++++---
>  include/uapi/drm/drm_fourcc.h | 45 +++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 67 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c
> index a9630c2d6cb3..36b4b30a5164 100644
> --- a/drivers/gpu/drm/tegra/drm.c
> +++ b/drivers/gpu/drm/tegra/drm.c
> @@ -161,6 +161,8 @@ static int tegra_drm_load(struct drm_device *drm, unsigned long flags)
>  	drm->mode_config.max_width = 4096;
>  	drm->mode_config.max_height = 4096;
>  
> +	drm->mode_config.allow_fb_modifiers = true;
> +
>  	drm->mode_config.funcs = &tegra_drm_mode_funcs;
>  
>  	err = tegra_drm_fb_prepare(drm);
> diff --git a/drivers/gpu/drm/tegra/fb.c b/drivers/gpu/drm/tegra/fb.c
> index e6d71fa4028e..2fded58b2ca5 100644
> --- a/drivers/gpu/drm/tegra/fb.c
> +++ b/drivers/gpu/drm/tegra/fb.c
> @@ -52,9 +52,26 @@ int tegra_fb_get_tiling(struct drm_framebuffer *framebuffer,
>  			struct tegra_bo_tiling *tiling)
>  {
>  	struct tegra_fb *fb = to_tegra_fb(framebuffer);
> -
> -	/* TODO: handle YUV formats? */
> -	*tiling = fb->planes[0]->tiling;
> +	uint64_t modifier = fb->base.modifier[0];
> +
> +	switch (fourcc_mod_tegra_mod(modifier)) {
> +	case NV_FORMAT_MOD_TEGRA_TILED:
> +		tiling->mode = TEGRA_BO_TILING_MODE_TILED;
> +		tiling->value = 0;
> +		break;
> +
> +	case NV_FORMAT_MOD_TEGRA_16BX2_BLOCK(0):
> +		tiling->mode = TEGRA_BO_TILING_MODE_BLOCK;
> +		tiling->value = fourcc_mod_tegra_param(modifier);
> +		if (tiling->value > 5)
> +			return -EINVAL;
> +		break;
> +
> +	default:
> +		/* TODO: handle YUV formats? */
> +		*tiling = fb->planes[0]->tiling;
> +		break;
> +	}
>  
>  	return 0;
>  }
> diff --git a/include/uapi/drm/drm_fourcc.h b/include/uapi/drm/drm_fourcc.h
> index a5890bf44c0a..967dfab16881 100644
> --- a/include/uapi/drm/drm_fourcc.h
> +++ b/include/uapi/drm/drm_fourcc.h
> @@ -233,6 +233,51 @@ extern "C" {
>   */
>  #define DRM_FORMAT_MOD_SAMSUNG_64_32_TILE	fourcc_mod_code(SAMSUNG, 1)
>  
> +
> +/* NVIDIA Tegra frame buffer modifiers */
> +
> +/*
> + * Some modifiers take parameters, for example the number of vertical GOBs in
> + * a block. Reserve the lower 32 bits for parameters
> + */
> +#define __fourcc_mod_tegra_mode_shift 32
> +#define fourcc_mod_tegra_code(val, params) \
> +	fourcc_mod_code(NV, ((((__u64)val) << __fourcc_mod_tegra_mode_shift) | params))
> +#define fourcc_mod_tegra_mod(m) \
> +	(m & ~((1ULL << __fourcc_mod_tegra_mode_shift) - 1))
> +#define fourcc_mod_tegra_param(m) \
> +	(m & ((1ULL << __fourcc_mod_tegra_mode_shift) - 1))
> +
> +/*
> + * Tegra Tiled Layout, used by Tegra 2, 3 and 4.
> + *
> + * Pixels are arranged in simple tiles of 16 x 16 bytes.
> + */
> +#define NV_FORMAT_MOD_TEGRA_TILED fourcc_mod_tegra_code(1, 0)
> +
> +/*
> + * Tegra 16Bx2 Block Linear layout, used by TK1/TX1
> + *
> + * Pixels are arranged in 64x8 Groups Of Bytes (GOBs). GOBs are then stacked
> + * vertically by a power of 2 (1 to 32 GOBs) to form a block.
> + *
> + * Within a GOB, data is ordered as 16B x 2 lines sectors laid in Z-shape.
> + *
> + * Parameter 'v' is the log2 encoding of the number of GOBs stacked vertically.
> + * Valid values are:
> + *
> + * 0 == ONE_GOB
> + * 1 == TWO_GOBS
> + * 2 == FOUR_GOBS
> + * 3 == EIGHT_GOBS
> + * 4 == SIXTEEN_GOBS
> + * 5 == THIRTYTWO_GOBS
> + *
> + * Chapter 20 "Pixel Memory Formats" of the Tegra X1 TRM describes this format
> + * in full detail.
> + */
> +#define NV_FORMAT_MOD_TEGRA_16BX2_BLOCK(v) fourcc_mod_tegra_code(2, v)
> +
>  #if defined(__cplusplus)
>  }
>  #endif
> -- 
> 2.10.2
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] drm/tegra: add tiling FB modifiers
  2016-11-08  9:19   ` Alexandre Courbot
@ 2017-03-20 17:26     ` Thierry Reding
  0 siblings, 0 replies; 6+ messages in thread
From: Thierry Reding @ 2017-03-20 17:26 UTC (permalink / raw)
  To: Alexandre Courbot
  Cc: kusmabite, David Airlie, dri-devel, linux-tegra, linux-kernel,
	Alexandre Courbot

[-- Attachment #1: Type: text/plain, Size: 3480 bytes --]

On Tue, Nov 08, 2016 at 06:19:01PM +0900, Alexandre Courbot wrote:
> On 11/08/2016 06:07 PM, Erik Faye-Lund wrote:
> > On Tue, Nov 8, 2016 at 8:50 AM, Alexandre Courbot <acourbot@nvidia.com> wrote:
> >> Add FB modifiers to allow user-space to specify that a surface is in one
> >> of the two tiling formats supported by Tegra chips, and add support in
> >> the tegradrm driver to handle them properly. This is necessary for the
> >> display controller to directly display buffers generated by the GPU.
> >>
> >> This feature is intended to replace the dedicated IOCTL enabled
> >> by TEGRA_STAGING and to provide a non-staging alternative to that
> >> solution.
> >>
> >> Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
> >> ---
> >>  drivers/gpu/drm/tegra/drm.c   |  2 ++
> >>  drivers/gpu/drm/tegra/fb.c    | 23 +++++++++++++++++++---
> >>  include/uapi/drm/drm_fourcc.h | 45 +++++++++++++++++++++++++++++++++++++++++++
> >>  3 files changed, 67 insertions(+), 3 deletions(-)
> >>
> >> diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c
> >> index a9630c2d6cb3..36b4b30a5164 100644
> >> --- a/drivers/gpu/drm/tegra/drm.c
> >> +++ b/drivers/gpu/drm/tegra/drm.c
> >> @@ -161,6 +161,8 @@ static int tegra_drm_load(struct drm_device *drm, unsigned long flags)
> >>         drm->mode_config.max_width = 4096;
> >>         drm->mode_config.max_height = 4096;
> >>
> >> +       drm->mode_config.allow_fb_modifiers = true;
> >> +
> >>         drm->mode_config.funcs = &tegra_drm_mode_funcs;
> >>
> >>         err = tegra_drm_fb_prepare(drm);
> >> diff --git a/drivers/gpu/drm/tegra/fb.c b/drivers/gpu/drm/tegra/fb.c
> >> index e6d71fa4028e..2fded58b2ca5 100644
> >> --- a/drivers/gpu/drm/tegra/fb.c
> >> +++ b/drivers/gpu/drm/tegra/fb.c
> >> @@ -52,9 +52,26 @@ int tegra_fb_get_tiling(struct drm_framebuffer *framebuffer,
> >>                         struct tegra_bo_tiling *tiling)
> >>  {
> >>         struct tegra_fb *fb = to_tegra_fb(framebuffer);
> >> -
> >> -       /* TODO: handle YUV formats? */
> >> -       *tiling = fb->planes[0]->tiling;
> >> +       uint64_t modifier = fb->base.modifier[0];
> >> +
> >> +       switch (fourcc_mod_tegra_mod(modifier)) {
> >> +       case NV_FORMAT_MOD_TEGRA_TILED:
> >> +               tiling->mode = TEGRA_BO_TILING_MODE_TILED;
> >> +               tiling->value = 0;
> >> +               break;
> >> +
> >> +       case NV_FORMAT_MOD_TEGRA_16BX2_BLOCK(0):
> >> +               tiling->mode = TEGRA_BO_TILING_MODE_BLOCK;
> >> +               tiling->value = fourcc_mod_tegra_param(modifier);
> >> +               if (tiling->value > 5)
> >> +                       return -EINVAL;
> > 
> > Shouldn't this contain some hardware-check for the support? AFAIK, not
> > all Tegras support all block-heights (if even this mode at all?)...
> 
> tegra_dc_setup_window does that check later (check the test on
> dc->soc->supports_block_linear). At the moment no error message is
> displayed though (and it seems like we are writing a stale value in
> DC_WIN_BUFFER_ADDR_MODE if the SoC doesn't support block linear and the
> tiling mode is TEGRA_BO_TILING_MODE_BLOCK?)

tegra_plane_atomic_check() has a check for this, as well as an error
message. ->atomic_check() will always run before actually setting the
mode, or applying the plane state, so it effectively guards against a
user specifying a format that the hardware doesn't support.

Thierry

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] drm/tegra: add tiling FB modifiers
  2016-11-08  7:50 [PATCH] drm/tegra: add tiling FB modifiers Alexandre Courbot
  2016-11-08  9:07 ` Erik Faye-Lund
  2016-11-08 10:34 ` Daniel Vetter
@ 2017-03-20 17:26 ` Thierry Reding
  2 siblings, 0 replies; 6+ messages in thread
From: Thierry Reding @ 2017-03-20 17:26 UTC (permalink / raw)
  To: Alexandre Courbot
  Cc: David Airlie, dri-devel, linux-tegra, linux-kernel, gnurou

[-- Attachment #1: Type: text/plain, Size: 858 bytes --]

On Tue, Nov 08, 2016 at 04:50:42PM +0900, Alexandre Courbot wrote:
> Add FB modifiers to allow user-space to specify that a surface is in one
> of the two tiling formats supported by Tegra chips, and add support in
> the tegradrm driver to handle them properly. This is necessary for the
> display controller to directly display buffers generated by the GPU.
> 
> This feature is intended to replace the dedicated IOCTL enabled
> by TEGRA_STAGING and to provide a non-staging alternative to that
> solution.
> 
> Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
> ---
>  drivers/gpu/drm/tegra/drm.c   |  2 ++
>  drivers/gpu/drm/tegra/fb.c    | 23 +++++++++++++++++++---
>  include/uapi/drm/drm_fourcc.h | 45 +++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 67 insertions(+), 3 deletions(-)

Applied, thanks.

Thierry

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2017-03-20 17:27 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-11-08  7:50 [PATCH] drm/tegra: add tiling FB modifiers Alexandre Courbot
2016-11-08  9:07 ` Erik Faye-Lund
2016-11-08  9:19   ` Alexandre Courbot
2017-03-20 17:26     ` Thierry Reding
2016-11-08 10:34 ` Daniel Vetter
2017-03-20 17:26 ` Thierry Reding

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).