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 <jmour...@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@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to