[PATCH v1 1/2] uapi: drm: Add fourcc codes needed by Xilinx Video IP

David Lechner david at lechnology.com
Mon Aug 7 21:17:12 UTC 2017


On 08/07/2017 10:13 AM, Philipp Zabel wrote:
> Hi Jeffrey,
> 
> On Fri, 2017-08-04 at 11:49 -0700, Jeffrey Mouroux wrote:
>> The Xilinx Video Mixer andn Xilinx Video Framebuffer DMA IP
>> support video memory formats that are not represented in the
>> current DRM fourcc library.  This patch adds those missing
>> fourcc codes.
>>
>> Signed-off-by: Jeffrey Mouroux <jmouroux at xilinx.com>
>> ---
>>   include/uapi/drm/drm_fourcc.h | 9 +++++++++
>>   1 file changed, 9 insertions(+)
>>
>> diff --git a/include/uapi/drm/drm_fourcc.h b/include/uapi/drm/drm_fourcc.h
>> index ef20abb..3e80130 100644
>> --- a/include/uapi/drm/drm_fourcc.h
>> +++ b/include/uapi/drm/drm_fourcc.h
>> @@ -112,6 +112,14 @@
>>   #define DRM_FORMAT_VYUY		fourcc_code('V', 'Y', 'U', 'Y') /* [31:0] Y1:Cb0:Y0:Cr0 8:8:8:8 little endian */
>>   
>>   #define DRM_FORMAT_AYUV		fourcc_code('A', 'Y', 'U', 'V') /* [31:0] A:Y:Cb:Cr 8:8:8:8 little endian */
>> +#define DRM_FORMAT_AVUY		fourcc_code('A', 'V', 'U', 'Y') /* [31:0] A:Cr:Cb:Y 8:8:8:8 little endian */
>> +#define DRM_FORMAT_VUY888	fourcc_code('V', 'U', '2', '4') /* [23:0] Cr:Cb:Y little endian */
>> +#define DRM_FORMAT_XVUY8888	fourcc_code('X', 'V', '2', '4') /* [31:0] x:Cr:Cb:Y 8:8:8:8 little endian */
>> +#define DRM_FORMAT_XVUY2101010	fourcc_code('X', 'V', '3', '0') /* [31:0] x:Cr:Cb:Y 2:10:10:10 little endian */
>> +
>> +/* Grey scale */
>> +#define DRM_FORMAT_Y8		fourcc_code('G', 'R', 'E', 'Y') /* 8  Greyscale	*/
> 
> That would be useful for me as well.

I'm also interested in 8-bit grayscale. I applied these patches then 
naively tried to add support for DRM_FORMAT_Y8 to a driver I am working on.

diff --git a/drivers/gpu/drm/tinydrm/st7586.c 
b/drivers/gpu/drm/tinydrm/st7586.c
index 1b39d3f..f6db7be 100644
--- a/drivers/gpu/drm/tinydrm/st7586.c
+++ b/drivers/gpu/drm/tinydrm/st7586.c
@@ -56,6 +56,34 @@

  static const u8 st7586_lookup[] = { 0x7, 0x4, 0x2, 0x0 };

+static void st7586_gray8_to_gray332(u8 *dst, void *vaddr,
+                                   struct drm_framebuffer *fb,
+                                   struct drm_clip_rect *clip)
+{
...
+}
+
  static void st7586_xrgb8888_to_gray332(u8 *dst, void *vaddr,
                                        struct drm_framebuffer *fb,
                                        struct drm_clip_rect *clip)
@@ -98,7 +126,14 @@ static int st7586_buf_copy(void *dst, struct 
drm_framebuffer *fb,
                         return ret;
         }

-       st7586_xrgb8888_to_gray332(dst, src, fb, clip);
+       switch(fb->format->format) {
+       case DRM_FORMAT_Y8:
+               st7586_gray8_to_gray332(dst, src, fb, clip);
+               break;
+       case DRM_FORMAT_XRGB8888:
+               st7586_xrgb8888_to_gray332(dst, src, fb, clip);
+               break;
+       }

         if (import_attach)
                 ret = dma_buf_end_cpu_access(import_attach->dmabuf,
@@ -260,6 +295,7 @@ static void st7586_pipe_disable(struct 
drm_simple_display_pipe *pipe)
  }

  static const u32 st7586_formats[] = {
+       DRM_FORMAT_Y8,
         DRM_FORMAT_XRGB8888,
  };

@@ -290,7 +326,7 @@ static int st7586_init(struct device *dev, struct 
mipi_dbi *mipi,
         if (ret)
                 return ret;

-       tdev->drm->mode_config.preferred_depth = 32;
+       tdev->drm->mode_config.preferred_depth = 8;
         mipi->rotation = rotation;

         drm_mode_config_reset(tdev->drm);


But it just caused a crash. (Note: had to set fb.lockless_register_fb=1 
in the kernel command line to get stack trace.)


Console: switching to colour frame buffer device 22x16
Unable to handle kernel paging request at virtual address c4bd4158
pgd = c2e0c000
[c4bd4158] *pgd=c2dfd811, *pte=00000000, *ppte=00000000
Internal error: Oops: 7 [#1] PREEMPT ARM
Modules linked in: st7586(+) mipi_dbi tinydrm drm_kms_helper syscopyarea 
sysfill
rect sysimgblt fb_sys_fops ofpart drm backlight m25p80 spi_nor 
ti_ads7950 indust
rialio_triggered_buffer mtd da8xx kfifo_buf phy_generic pwm_beeper 
ohci_da8xx mu
sb_hdrc ohci_hcd usbcore pwm_tiehrpwm davinci_wdt phy_da8xx_usb 
pinctrl_da850_pu
pd rtc_omap leds_gpio led_class lego_ev3_battery industrialio tun 
libcomposite c
onfigfs udc_core usb_common autofs4
CPU: 0 PID: 126 Comm: systemd-udevd Tainted: G        W 
4.13.0-rc2-dlech-e
v3+ #486
Hardware name: Generic DA850/OMAP-L138/AM18x
task: c3afd4a0 task.stack: c2d36000
PC is at sys_imageblit+0x278/0x4c8 [sysimgblt]
LR is at 0xc4bd3f40
pc : [<bf1ca278>]    lr : [<c4bd3f40>]    psr: 20000013
sp : c2d37810  ip : 00000000  fp : c2d37864
r10: 00000008  r9 : 00000018  r8 : c4bd3f40
r7 : c2d26a42  r6 : 00000000  r5 : 00000007  r4 : 00000008
r3 : 00000010  r2 : c4bd4158  r1 : 000000b0  r0 : 00000000
Flags: nzCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment none
Control: 0005317f  Table: c2e0c000  DAC: 00000051
Process systemd-udevd (pid: 126, stack limit = 0xc2d36190)
Stack: (0xc2d37810 to 0xc2d38000)
7800:                                     000002c8 000000b2 c4bd4158 
00000016
7820: 00000000 c2d26a42 c2d378e8 00000010 00000010 c4bd4158 bf1e6154 
c2d378e8
7840: c1882000 c1882e94 00000016 00000001 000000ff c3808000 c2d37884 
c2d37868
...
7fe0: bec338a8 bec33898 b6ec8610 b6da04d0 60000010 00000017 00000000 
00000000
Backtrace:
[<bf1ca000>] (sys_imageblit [sysimgblt]) from [<bf1e62bc>] 
(drm_fb_helper_sys_imageblit+0x1c/0x34 [drm_kms_helper])
  r10:c3808000 r9:000000ff r8:00000001 r7:00000016 r6:c1882e94 r5:c1882000
  r4:c2d378e8
[<bf1e62a0>] (drm_fb_helper_sys_imageblit [drm_kms_helper]) from 
[<c026697c>] (bit_putcs+0x26c/0x410)
  r5:c2d269be r4:00000000
[<c0266710>] (bit_putcs) from [<c0260464>] (fbcon_putcs+0xf4/0x12c)
  r10:00000007 r9:c0266710 r8:0000000e r7:00000016 r6:c1882e68 r5:c3808000
  r4:c1882000
[<c0260370>] (fbcon_putcs) from [<c0297f50>] (do_update_region+0x174/0x1bc)
  r10:00000016 r9:0000000e r8:c3808000 r7:c1882e68 r6:00000016 r5:c0260370
  r4:c1882e94
[<c0297ddc>] (do_update_region) from [<c0299490>] 
(redraw_screen+0x1dc/0x24c)
  r10:0000003f r9:00000000 r8:c0517e0c r7:00000001 r6:00000001 r5:00000000
  r4:c3808000
[<c02992b4>] (redraw_screen) from [<c029a0cc>] 
(do_bind_con_driver+0x2ac/0x3d4)
  r8:c0517e0c r7:00000001 r6:c06019c8 r5:00000000 r4:00000014
[<c0299e20>] (do_bind_con_driver) from [<c029a5bc>] 
(do_take_over_console+0x144/0x1c4)
  r10:00000001 r9:0000003e r8:00000000 r7:c06019e4 r6:00000000 r5:00000000
  r4:c048f8b4
[<c029a478>] (do_take_over_console) from [<c0263c44>] 
(do_fbcon_takeover+0x70/0xd8)
  r10:c188221c r9:c0601568 r8:c1882000 r7:00000000 r6:c2d37b80 r5:c0601568
  r4:c05d2c00
[<c0263bd4>] (do_fbcon_takeover) from [<c0264a20>] 
(fbcon_event_notify+0x8c4/0x920)
  r5:ffffffff r4:c05d2c00
[<c026415c>] (fbcon_event_notify) from [<c003a23c>] 
(notifier_call_chain+0x4c/0x8c)
  r10:c188221c r9:c05d2c80 r8:00000000 r7:00000005 r6:c2d37b80 r5:ffffffff
  r4:00000000
[<c003a1f0>] (notifier_call_chain) from [<c003a680>] 
(__blocking_notifier_call_chain+0x50/0x68)
  r9:c05d2c80 r8:c188200c r7:ffffffff r6:c2d37b80 r5:c05d2c70 r4:00000005
[<c003a630>] (__blocking_notifier_call_chain) from [<c003a6b8>] 
(blocking_notifier_call_chain+0x20/0x28)
  r7:c059d370 r6:00000000 r5:c1882000 r4:c059d370
[<c003a698>] (blocking_notifier_call_chain) from [<c0266edc>] 
(fb_notifier_call_chain+0x1c/0x24)
[<c0266ec0>] (fb_notifier_call_chain) from [<c0268dd0>] 
(register_framebuffer+0x18c/0x2a8)
[<c0268c44>] (register_framebuffer) from [<bf1e7ae4>] 
(__drm_fb_helper_initial_config_and_unlock+0x20c/0x3ac [drm_kms_helper])
  r10:00000001 r9:c18ffbe8 r8:c1882000 r7:00000000 r6:bf1ed66c r5:00000000
  r4:c2d9db40
[<bf1e78d8>] (__drm_fb_helper_initial_config_and_unlock 
[drm_kms_helper]) from [<bf1e81ec>] 
(drm_fb_helper_initial_config+0x38/0x40 [drm_kms_helper])
  r10:3e70d91c r9:00000019 r8:00000008 r7:bf2169f8 r6:c1879400 r5:00000008
  r4:c2d9db40
[<bf1e81b4>] (drm_fb_helper_initial_config [drm_kms_helper]) from 
[<bf1e8aa8>] (drm_fbdev_cma_init_with_funcs+0x7c/0x100 [drm_kms_helper])
  r5:00000000 r4:c2d9db40
[<bf1e8a2c>] (drm_fbdev_cma_init_with_funcs [drm_kms_helper]) from 
[<bf207180>] (devm_tinydrm_register+0x4c/0xb4 [tinydrm])
  r9:00000019 r8:c3acf400 r7:00000008 r6:c3b96010 r5:00000000 r4:c1879400
[<bf207134>] (devm_tinydrm_register [tinydrm]) from [<bf216904>] 
(st7586_probe+0x164/0x238 [st7586])
  r9:00000019 r8:bf216f98 r7:00000000 r6:c3b96010 r5:c3acf400 r4:00000000
[<bf2167a0>] (st7586_probe [st7586]) from [<c02d5624>] 
(spi_drv_probe+0x74/0xa0)
  r6:00000000 r5:bf216f88 r4:c3acf400
[<c02d55b0>] (spi_drv_probe) from [<c02b2c3c>] 
(driver_probe_device+0x23c/0x300)
  r5:c0602a4c r4:c3acf400
[<c02b2a00>] (driver_probe_device) from [<c02b2dc0>] 
(__driver_attach+0xc0/0xc4)
  r9:bf216fe0 r8:00000001 r7:00000000 r6:c3acf434 r5:bf216f98 r4:c3acf400
[<c02b2d00>] (__driver_attach) from [<c02b0ec0>] 
(bus_for_each_dev+0x74/0xa4)
  r7:00000000 r6:c02b2d00 r5:bf216f98 r4:00000000
[<c02b0e4c>] (bus_for_each_dev) from [<c02b25cc>] (driver_attach+0x20/0x28)
  r6:c05d80d8 r5:c2f47720 r4:bf216f98
[<c02b25ac>] (driver_attach) from [<c02b2190>] (bus_add_driver+0x190/0x218)
[<c02b2000>] (bus_add_driver) from [<c02b3784>] (driver_register+0x80/0x100)
  r7:00000000 r6:bf219000 r5:00000001 r4:bf216f98
[<c02b3704>] (driver_register) from [<c02d5560>] 
(__spi_register_driver+0x50/0x64)
  r5:00000001 r4:ffffe000
[<c02d5510>] (__spi_register_driver) from [<bf219018>] 
(st7586_spi_driver_init+0x18/0x24 [st7586])
[<bf219000>] (st7586_spi_driver_init [st7586]) from [<c00096cc>] 
(do_one_initcall+0x44/0x180)
[<c0009688>] (do_one_initcall) from [<c0082308>] (do_init_module+0x60/0x1b4)
  r9:bf216fe0 r8:00000001 r7:c18f2700 r6:c2d33060 r5:00000001 r4:bf216fe0
[<c00822a8>] (do_init_module) from [<c0081378>] (load_module+0x1d10/0x2168)
  r6:c18f2708 r5:00000001 r4:c2d37f40
[<c007f668>] (load_module) from [<c00819e0>] (SyS_finit_module+0xac/0xc0)
  r10:00000080 r9:c2d36000 r8:c000a5e4 r7:0000017b r6:b6ed13a0 r5:00000017
  r4:00000000
[<c0081934>] (SyS_finit_module) from [<c000a5bc>] 
(__sys_trace_return+0x0/0x10)
  r6:00000000 r5:004665a0 r4:a7d0f000
Code: e3530000 e5921008 151b2030 051b0034 (15920000)
systemd-journald[74]: /dev/kmsg buffer overrun, some messages lost.
---[ end trace dff175813c02c6bb ]---


Looking at the code, drm_fb_helper* looks like it assumes that 8bpp 
means the memory is an indexed color table format. So, there will be 
some work needed to make drm_fb_helper* grayscale aware.



> 
>> +#define DRM_FORMAT_Y10		fourcc_code('Y', '1', '0', ' ') /* 10 Greyscale	*/
> 
> It is not clear to me from the description, how this should be laid out
> in memory. Is it padded to 16 bits? Packed?
> 
>>   /*
>>    * 2 plane YCbCr
>> @@ -126,6 +134,7 @@
>>   #define DRM_FORMAT_NV61		fourcc_code('N', 'V', '6', '1') /* 2x1 subsampled Cb:Cr plane */
>>   #define DRM_FORMAT_NV24		fourcc_code('N', 'V', '2', '4') /* non-subsampled Cr:Cb plane */
>>   #define DRM_FORMAT_NV42		fourcc_code('N', 'V', '4', '2') /* non-subsampled Cb:Cr plane */
>> +#define DRM_FORMAT_XV15		fourcc_code('X', 'V', '2', '0') /* 2x2 subsampled Cb:Cr plane 2:10:10:10 */
> 
> Same here.
> 
> regards
> Philipp
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
> 



More information about the dri-devel mailing list