linux/drivers/gpu/drm
Shashank Sharma 832d4f2f41 drm/edid: parse YCBCR420 videomodes from EDID
HDMI 2.0 spec adds support for YCBCR420 sub-sampled output.
CEA-861-F adds two new blocks in EDID's CEA extension blocks,
to provide information about sink's YCBCR420 output capabilities.

These blocks are:

- YCBCR420vdb(YCBCR 420 video data block):
This block contains VICs of video modes, which can be sopported only
in YCBCR420 output mode (Not in RGB/YCBCR444/422. Its like a normal
SVD block, valid for YCBCR420 modes only.

- YCBCR420cmdb(YCBCR 420 capability map data block):
This block gives information about video modes which can support
YCBCR420 output mode also (along with RGB,YCBCR444/422 etc) This
block contains a bitmap index of normal svd videomodes, which can
support YCBCR420 output too.
So if bit 0 from first vcb byte is set, first video mode in the svd
list can support YCBCR420 output too. Bit 1 means second video mode
from svd list can support YCBCR420 output too, and so on.

This patch adds two bitmaps in display's hdmi_info structure, one each
for VCB and VDB modes. If the source is HDMI 2.0 capable, this patch
adds:
- VDB modes (YCBCR 420 only modes) in connector's mode list, also makes
  an entry in the vdb_bitmap per vic.
- VCB modes (YCBCR 420 also modes) only entry in the vcb_bitmap.

Cc: Ville Syrjala <ville.syrjala@linux.intel.com>
Cc: Jose Abreu <joabreu@synopsys.com>
Cc: Emil Velikov <emil.l.velikov@gmail.com>

V2: Addressed
    Review comments from Emil:
    - Use 1ULL<<i instead of 1<<i to make sure the output is 64bit.
    - Use the suggested method for updating dbmap.
    - Add documentation for YCBCR420_vcb_map to fix kbuild warning.

    Review comments from Ville:
    - Do not expose the YCBCR420 flags in uabi layer, keep it internal.
    - Save a map of YCBCR420 modes for future reference.
    - Check db length before trying to parse extended tag.
    - Add a warning if there are > 64 modes in capability map block.
    - Use y420cmdb in function names and macros while dealing with vcb
      to be aligned with spec.
    - Move the display information parsing block ahead of mode parsing
      blocks.

V3: Addressed design/review comments from Ville
    - Do not add flags in video modes, else we have to expose them to user
    - There should not be a UABI change, and kernel should detect the
      choice of the output based on type of mode, and the bitmaps.
    - Use standard bitops from kernel bitmap header, instead of calculating
      bit positions manually.

V4: Addressed review comments from Ville:
    - s/ycbcr_420_vdb/y420vdb
    - s/ycbcr_420_vcb/y420cmdb
    - Be less verbose on description of do_y420vdb_modes
    - Move newmode variable in the loop scope.
    - Use svd_to_vic() to get a VIC, instead of 0x7f
    - Remove bitmap description for CMDB modes & VDB modes
    - Dont add connector->ycbcr_420_allowed check for cmdb modes
    - Remove 'len' variable, in is_y420cmdb function, which is used
      only once
    - Add length check in is_y420vdb function
    - Remove unnecessary if (!db) check in function parse_y420cmdb_bitmap
    - Do not add print about YCBCR 420 modes
    - Fix indentation in few places
    - Move ycbcr420_dc_modes in next patch, where its used
    - Add a separate patch for movement of drm_add_display_info()

V5: Addressed review comments from Ville:
    - Add the patch which cleans up the current EXTENDED_TAG usage
    - Make y420_cmdb_map u64
    - Do not block ycbcr420 modes while parsing the EDID, rather
      add a separate helper function to prune ycbcr420-only modes from
      connector's probed modes.

V6: Rebase
V7: Move this patch after the 420_only validation patch (Ville)
V8: Addressed review comments from Ville
    - use cea_vic_valid check before adding cmdb/vdb modes
    - add check for i < 64 while adding cmdb modes
    - use 1ULL while checking bitmap

Signed-off-by: Shashank Sharma <shashank.sharma@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1500028426-14883-1-git-send-email-shashank.sharma@intel.com
[vsyrjala: Fix checkpatch complaints and indentation]
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
2017-07-14 21:23:54 +03:00
..
amd drm: handle HDMI 2.0 VICs in AVI info-frames 2017-07-14 21:23:54 +03:00
arc drm: Convert atomic drivers from CRTC .disable() to .atomic_disable() 2017-06-30 14:53:15 +02:00
arm drm/mali: Use new atomic iterator macros 2017-07-13 09:54:12 +02:00
armada drm: armada: Constify drm_prop_enum_list structures. 2017-07-03 10:07:43 +02:00
ast drm/pci: Deprecate drm_pci_init/exit completely 2017-06-20 10:41:03 +02:00
atmel-hlcdc drm/atmel-hlcdec: Use for_each_new_connector_in_state 2017-07-13 09:52:09 +02:00
bochs drm/bochs: switch fb_ops over to use drm_fb_helper_cfb helpers 2017-07-03 10:31:14 +02:00
bridge drm: handle HDMI 2.0 VICs in AVI info-frames 2017-07-14 21:23:54 +03:00
cirrus drm/pci: Deprecate drm_pci_init/exit completely 2017-06-20 10:41:03 +02:00
etnaviv
exynos drm: handle HDMI 2.0 VICs in AVI info-frames 2017-07-14 21:23:54 +03:00
fsl-dcu drm: Add old state pointer to CRTC .enable() helper function 2017-06-30 14:53:14 +02:00
gma500 drm/gma500: remove an unneeded NULL check 2017-06-28 19:17:38 +02:00
hisilicon drm: Convert atomic drivers from CRTC .disable() to .atomic_disable() 2017-06-30 14:53:15 +02:00
i2c drm: handle HDMI 2.0 VICs in AVI info-frames 2017-07-14 21:23:54 +03:00
i810 drm/pci: Deprecate drm_pci_init/exit completely 2017-06-20 10:41:03 +02:00
i915 drm: handle HDMI 2.0 VICs in AVI info-frames 2017-07-14 21:23:54 +03:00
imx drm/imx: Use atomic iterator macros 2017-07-13 09:54:48 +02:00
lib
mediatek drm: handle HDMI 2.0 VICs in AVI info-frames 2017-07-14 21:23:54 +03:00
meson drm: Convert atomic drivers from CRTC .disable() to .atomic_disable() 2017-06-30 14:53:15 +02:00
mga drm/pci: Deprecate drm_pci_init/exit completely 2017-06-20 10:41:03 +02:00
mgag200 Merge remote-tracking branch 'airlied/drm-next' into drm-misc-next 2017-06-27 09:18:17 -04:00
msm drm: handle HDMI 2.0 VICs in AVI info-frames 2017-07-14 21:23:54 +03:00
mxsfb drm/mxsfb: Drop drm_vblank_cleanup 2017-06-23 11:08:44 +02:00
nouveau drm: handle HDMI 2.0 VICs in AVI info-frames 2017-07-14 21:23:54 +03:00
omapdrm drm: handle HDMI 2.0 VICs in AVI info-frames 2017-07-14 21:23:54 +03:00
panel drm/panel: s6e3ha2: Add support for s6e3hf2 panel on TM2e board 2017-06-14 20:18:22 +02:00
pl111 drm/pl111: Fix offset calculation for the primary plane. 2017-06-07 11:50:00 -07:00
qxl drm: qxl: constify ttm_place structures. 2017-07-03 10:31:14 +02:00
r128 drm/pci: Deprecate drm_pci_init/exit completely 2017-06-20 10:41:03 +02:00
radeon drm: handle HDMI 2.0 VICs in AVI info-frames 2017-07-14 21:23:54 +03:00
rcar-du drm: Convert atomic drivers from CRTC .disable() to .atomic_disable() 2017-06-30 14:53:15 +02:00
rockchip drm: handle HDMI 2.0 VICs in AVI info-frames 2017-07-14 21:23:54 +03:00
savage drm/pci: Deprecate drm_pci_init/exit completely 2017-06-20 10:41:03 +02:00
selftests
shmobile drm/shmob: Drop drm_vblank_cleanup 2017-06-22 08:41:15 +02:00
sis drm/pci: Deprecate drm_pci_init/exit completely 2017-06-20 10:41:03 +02:00
sti drm: handle HDMI 2.0 VICs in AVI info-frames 2017-07-14 21:23:54 +03:00
stm drm: Convert atomic drivers from CRTC .disable() to .atomic_disable() 2017-06-30 14:53:15 +02:00
sun4i drm: handle HDMI 2.0 VICs in AVI info-frames 2017-07-14 21:23:54 +03:00
tdfx drm/pci: Deprecate drm_pci_init/exit completely 2017-06-20 10:41:03 +02:00
tegra drm: handle HDMI 2.0 VICs in AVI info-frames 2017-07-14 21:23:54 +03:00
tilcdc drm: Convert atomic drivers from CRTC .disable() to .atomic_disable() 2017-06-30 14:53:15 +02:00
tinydrm drm/tinydrm: Add RePaper e-ink driver 2017-07-14 19:30:08 +02:00
ttm
udl drm/udl: dma-buf: Constify dma_buf_ops structures. 2017-07-03 10:07:47 +02:00
vc4 drm: handle HDMI 2.0 VICs in AVI info-frames 2017-07-14 21:23:54 +03:00
vgem drm/vgem: Pin our pages for dmabuf exports 2017-06-23 13:04:22 +02:00
via drm/pci: Deprecate drm_pci_init/exit completely 2017-06-20 10:41:03 +02:00
virtio drm: ttm: virtio-gpu: dma-buf: Constify ttm_place structures. 2017-07-03 10:31:14 +02:00
vmwgfx drm/vmwgfx: Make check_modeset() use the new atomic iterator macros. 2017-07-13 09:50:39 +02:00
zte drm: handle HDMI 2.0 VICs in AVI info-frames 2017-07-14 21:23:54 +03:00
ati_pcigart.c
drm_agpsupport.c
drm_atomic_helper.c drm/atomic-helper: update lut props directly in ..._legacy_gamma_set 2017-07-14 15:53:06 +02:00
drm_atomic.c drm: rename, adjust and export drm_atomic_replace_property_blob 2017-07-14 15:53:06 +02:00
drm_auth.c
drm_blend.c
drm_bridge.c
drm_bufs.c
drm_cache.c
drm_color_mgmt.c drm: More links for gamma support helpers 2017-06-20 12:13:11 +02:00
drm_connector.c Linux 4.12-rc7 2017-06-27 08:28:30 +10:00
drm_context.c
drm_crtc_helper_internal.h
drm_crtc_helper.c
drm_crtc_internal.h
drm_crtc.c
drm_debugfs_crc.c
drm_debugfs.c
drm_dma.c
drm_dp_aux_dev.c
drm_dp_dual_mode_helper.c
drm_dp_helper.c
drm_dp_mst_topology.c drm/dp/mst: Use memchr_inv() instead of memcmp() against a zeroed array 2017-07-13 19:28:43 +03:00
drm_drv.c drm: inhibit drm drivers register to uninitialized drm core 2017-07-11 12:03:11 +02:00
drm_dumb_buffers.c
drm_edid_load.c
drm_edid.c drm/edid: parse YCBCR420 videomodes from EDID 2017-07-14 21:23:54 +03:00
drm_encoder_slave.c
drm_encoder.c
drm_fb_cma_helper.c drm: Convert CMA fbdev console suspend helpers to use bool 2017-06-20 16:23:40 +02:00
drm_fb_helper.c drm/fb-helper: separate the fb_setcmap helper into atomic and legacy paths 2017-07-14 15:53:06 +02:00
drm_file.c Merge remote-tracking branch 'airlied/drm-next' into drm-misc-next 2017-06-27 09:18:17 -04:00
drm_flip_work.c
drm_fourcc.c
drm_framebuffer.c drm/atomic: Use the correct iterator macro in atomic_remove_fb 2017-07-13 09:44:58 +02:00
drm_gem_cma_helper.c
drm_gem.c
drm_global.c
drm_hashtab.c
drm_info.c
drm_internal.h drm/vblank: Unexport drm_vblank_cleanup 2017-06-28 12:51:13 +02:00
drm_ioc32.c
drm_ioctl.c Merge remote-tracking branch 'airlied/drm-next' into drm-misc-next 2017-06-27 09:18:17 -04:00
drm_irq.c drm/doc: Polish irq helper documentation 2017-06-01 08:02:14 +02:00
drm_kms_helper_common.c
drm_legacy.h
drm_lock.c
drm_memory.c
drm_mipi_dsi.c
drm_mm.c
drm_mode_config.c
drm_mode_object.c
drm_modes.c drm: add helper to validate YCBCR420 modes 2017-07-14 21:23:54 +03:00
drm_modeset_helper.c
drm_modeset_lock.c
drm_of.c
drm_panel.c
drm_pci.c drm/pci: Deprecate drm_pci_init/exit completely 2017-06-20 10:41:03 +02:00
drm_plane_helper.c
drm_plane.c
drm_prime.c
drm_print.c
drm_probe_helper.c drm: add helper to validate YCBCR420 modes 2017-07-14 21:23:54 +03:00
drm_property.c drm: rename, adjust and export drm_atomic_replace_property_blob 2017-07-14 15:53:06 +02:00
drm_rect.c
drm_scatter.c
drm_scdc_helper.c
drm_simple_kms_helper.c drm/simple-kms-helper: Fix the check for the mismatch between plane and CRTC enabled. 2017-07-13 09:44:51 +02:00
drm_syncobj.c drm/syncobj: add sync_file interaction. (v1.2) 2017-06-14 12:11:04 +10:00
drm_sysfs.c
drm_trace_points.c
drm_trace.h
drm_vblank.c drm/fb-helper: Stop using mode_config.mutex for internals 2017-07-06 10:02:01 +02:00
drm_vm.c
drm_vma_manager.c
Kconfig
Makefile Merge tag 'drm-misc-next-2017-06-15' of git://anongit.freedesktop.org/git/drm-misc into drm-next 2017-06-16 09:33:43 +10:00