edid: add edid_get_timing_validate() variant to filter out edid modes
[oweals/u-boot.git] / include / edid.h
index 18ec1d5ab0cfb38345905b681e760daba60df112..2562733061c0a4e2103ad0557c80047882ce16cf 100644 (file)
@@ -1,11 +1,10 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
 /*
  * Copyright (c) 2012 The Chromium OS Authors.
  *
  * (C) Copyright 2010
  * Petr Stetiar <ynezz@true.cz>
  *
- * SPDX-License-Identifier:    GPL-2.0+
- *
  * Contains stolen code from ddcprobe project which is:
  * Copyright (C) Nalin Dahyabhai <bigfun@pobox.com>
  */
 
 #include <linux/types.h>
 
+/* Size of the EDID data */
+#define EDID_SIZE      128
+#define EDID_EXT_SIZE  256
+
+/* OUI of HDMI vendor specific data block */
+#define HDMI_IEEE_OUI 0x000c03
+
 #define GET_BIT(_x, _pos) \
        (((_x) >> (_pos)) & 1)
 #define GET_BITS(_x, _pos_msb, _pos_lsb) \
@@ -230,6 +236,13 @@ struct edid1_info {
        unsigned char checksum;
 } __attribute__ ((__packed__));
 
+enum edid_cea861_db_types {
+       EDID_CEA861_DB_AUDIO = 0x01,
+       EDID_CEA861_DB_VIDEO = 0x02,
+       EDID_CEA861_DB_VENDOR = 0x03,
+       EDID_CEA861_DB_SPEAKER = 0x04,
+};
+
 struct edid_cea861_info {
        unsigned char extension_tag;
 #define EDID_CEA861_EXTENSION_TAG      0x02
@@ -247,6 +260,10 @@ struct edid_cea861_info {
 #define EDID_CEA861_DTD_COUNT(_x) \
        GET_BITS(((_x).dtd_count), 3, 0)
        unsigned char data[124];
+#define EDID_CEA861_DB_TYPE(_x, offset) \
+       GET_BITS((_x).data[offset], 7, 5)
+#define EDID_CEA861_DB_LEN(_x, offset) \
+       GET_BITS((_x).data[offset], 4, 0)
 } __attribute__ ((__packed__));
 
 /**
@@ -287,4 +304,42 @@ int edid_get_ranges(struct edid1_info *edid, unsigned int *hmin,
                    unsigned int *hmax, unsigned int *vmin,
                    unsigned int *vmax);
 
+struct display_timing;
+
+/**
+ * edid_get_timing_validate() - Get basic digital display parameters with
+ * mode selection callback
+ *
+ * @param buf          Buffer containing EDID data
+ * @param buf_size     Size of buffer in bytes
+ * @param timing       Place to put preferring timing information
+ * @param panel_bits_per_colourp       Place to put the number of bits per
+ *                     colour supported by the panel. This will be set to
+ *                     -1 if not available
+ * @param mode_valid   Callback validating mode, returning true is mode is
+ *                     supported, false otherwise.
+ * @parem valid_priv   Pointer to private data for mode_valid callback
+ * @return 0 if timings are OK, -ve on error
+ */
+int edid_get_timing_validate(u8 *buf, int buf_size,
+                            struct display_timing *timing,
+                            int *panel_bits_per_colourp,
+                            bool (*mode_valid)(void *priv,
+                                       const struct display_timing *timing),
+                            void *mode_valid_priv);
+
+/**
+ * edid_get_timing() - Get basic digital display parameters
+ *
+ * @param buf          Buffer containing EDID data
+ * @param buf_size     Size of buffer in bytes
+ * @param timing       Place to put preferring timing information
+ * @param panel_bits_per_colourp       Place to put the number of bits per
+ *                     colour supported by the panel. This will be set to
+ *                     -1 if not available
+ * @return 0 if timings are OK, -ve on error
+ */
+int edid_get_timing(u8 *buf, int buf_size, struct display_timing *timing,
+                   int *panel_bits_per_colourp);
+
 #endif /* __EDID_H_ */