Module Name:    src
Committed By:   riastradh
Date:           Sun Dec 19 11:38:27 UTC 2021

Modified Files:
        src/sys/external/bsd/drm2/dist/drm/i915/display: intel_display_types.h
            intel_dp.c intel_dpll_mgr.c intel_dsb.c intel_hdcp.c
        src/sys/external/bsd/drm2/i915drm: files.i915drmkms
        src/sys/external/bsd/drm2/include/linux: hdmi.h

Log Message:
i915: more passes


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 \
    src/sys/external/bsd/drm2/dist/drm/i915/display/intel_display_types.h \
    src/sys/external/bsd/drm2/dist/drm/i915/display/intel_dp.c
cvs rdiff -u -r1.2 -r1.3 \
    src/sys/external/bsd/drm2/dist/drm/i915/display/intel_dpll_mgr.c \
    src/sys/external/bsd/drm2/dist/drm/i915/display/intel_dsb.c \
    src/sys/external/bsd/drm2/dist/drm/i915/display/intel_hdcp.c
cvs rdiff -u -r1.74 -r1.75 src/sys/external/bsd/drm2/i915drm/files.i915drmkms
cvs rdiff -u -r1.10 -r1.11 src/sys/external/bsd/drm2/include/linux/hdmi.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/external/bsd/drm2/dist/drm/i915/display/intel_display_types.h
diff -u src/sys/external/bsd/drm2/dist/drm/i915/display/intel_display_types.h:1.3 src/sys/external/bsd/drm2/dist/drm/i915/display/intel_display_types.h:1.4
--- src/sys/external/bsd/drm2/dist/drm/i915/display/intel_display_types.h:1.3	Sun Dec 19 11:11:11 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/display/intel_display_types.h	Sun Dec 19 11:38:26 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: intel_display_types.h,v 1.3 2021/12/19 11:11:11 riastradh Exp $	*/
+/*	$NetBSD: intel_display_types.h,v 1.4 2021/12/19 11:38:26 riastradh Exp $	*/
 
 /*
  * Copyright (c) 2006 Dave Airlie <airl...@linux.ie>
@@ -387,11 +387,8 @@ struct intel_hdcp {
 	 * Work queue to signal the CP_IRQ. Used for the waiters to read the
 	 * available information from HDCP DP sink.
 	 */
-#ifdef __linux__
-	wait_queue_head_t cp_irq_queue;
-#else
+	spinlock_t cp_irq_lock;
 	drm_waitqueue_t cp_irq_queue;
-#endif
 	atomic_t cp_irq_count;
 	int cp_irq_count_cached;
 
Index: src/sys/external/bsd/drm2/dist/drm/i915/display/intel_dp.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/display/intel_dp.c:1.3 src/sys/external/bsd/drm2/dist/drm/i915/display/intel_dp.c:1.4
--- src/sys/external/bsd/drm2/dist/drm/i915/display/intel_dp.c:1.3	Sun Dec 19 11:38:03 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/display/intel_dp.c	Sun Dec 19 11:38:26 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: intel_dp.c,v 1.3 2021/12/19 11:38:03 riastradh Exp $	*/
+/*	$NetBSD: intel_dp.c,v 1.4 2021/12/19 11:38:26 riastradh Exp $	*/
 
 /*
  * Copyright © 2008 Intel Corporation
@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intel_dp.c,v 1.3 2021/12/19 11:38:03 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intel_dp.c,v 1.4 2021/12/19 11:38:26 riastradh Exp $");
 
 #include <linux/export.h>
 #include <linux/i2c.h>
@@ -4776,7 +4776,7 @@ intel_dp_setup_hdr_metadata_infoframe_sd
 	 * Packet Type 80h + Non-audio INFOFRAME Type value
 	 * HDMI_INFOFRAME_TYPE_DRM: 0x87,
 	 */
-	infoframe_sdp.sdp_header.HB1 = drm_infoframe.type;
+	infoframe_sdp.sdp_header.HB1 = drm_infoframe.header.type;
 	/*
 	 * Least Significant Eight Bits of (Data Byte Count – 1)
 	 * infoframe_size - 1,
@@ -4785,9 +4785,9 @@ intel_dp_setup_hdr_metadata_infoframe_sd
 	/* INFOFRAME SDP Version Number */
 	infoframe_sdp.sdp_header.HB3 = (0x13 << 2);
 	/* CTA Header Byte 2 (INFOFRAME Version Number) */
-	infoframe_sdp.db[0] = drm_infoframe.version;
+	infoframe_sdp.db[0] = drm_infoframe.header.version;
 	/* CTA Header Byte 3 (Length of INFOFRAME): HDMI_DRM_INFOFRAME_SIZE */
-	infoframe_sdp.db[1] = drm_infoframe.length;
+	infoframe_sdp.db[1] = drm_infoframe.header.length;
 	/*
 	 * Copy HDMI_DRM_INFOFRAME_SIZE size from a buffer after
 	 * HDMI_INFOFRAME_HEADER_SIZE
@@ -5924,11 +5924,15 @@ static void intel_dp_hdcp_wait_for_cp_ir
 	long ret;
 
 #define C (hdcp->cp_irq_count_cached != atomic_read(&hdcp->cp_irq_count))
-	ret = wait_event_interruptible_timeout(hdcp->cp_irq_queue, C,
-					       msecs_to_jiffies(timeout));
-
+	unsigned long irqflags;
+	spin_lock_irqsave(&hdcp->cp_irq_lock, irqflags);
+	DRM_SPIN_TIMED_WAIT_UNTIL(ret, &hdcp->cp_irq_queue,
+	    &hdcp->cp_irq_lock,
+	    msecs_to_jiffies(timeout),
+	    C);
 	if (!ret)
 		DRM_DEBUG_KMS("Timedout at waiting for CP_IRQ\n");
+	spin_unlock_irqrestore(&hdcp->cp_irq_lock, irqflags);
 }
 
 static

Index: src/sys/external/bsd/drm2/dist/drm/i915/display/intel_dpll_mgr.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/display/intel_dpll_mgr.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/display/intel_dpll_mgr.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/display/intel_dpll_mgr.c:1.2	Sat Dec 18 23:45:30 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/display/intel_dpll_mgr.c	Sun Dec 19 11:38:26 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: intel_dpll_mgr.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $	*/
+/*	$NetBSD: intel_dpll_mgr.c,v 1.3 2021/12/19 11:38:26 riastradh Exp $	*/
 
 /*
  * Copyright © 2006-2016 Intel Corporation
@@ -24,12 +24,14 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intel_dpll_mgr.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intel_dpll_mgr.c,v 1.3 2021/12/19 11:38:26 riastradh Exp $");
 
 #include "intel_display_types.h"
 #include "intel_dpio_phy.h"
 #include "intel_dpll_mgr.h"
 
+#include <linux/nbsd-namespace.h>
+
 /**
  * DOC: Display PLLs
  *
Index: src/sys/external/bsd/drm2/dist/drm/i915/display/intel_dsb.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/display/intel_dsb.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/display/intel_dsb.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/display/intel_dsb.c:1.2	Sat Dec 18 23:45:30 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/display/intel_dsb.c	Sun Dec 19 11:38:26 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: intel_dsb.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $	*/
+/*	$NetBSD: intel_dsb.c,v 1.3 2021/12/19 11:38:26 riastradh Exp $	*/
 
 // SPDX-License-Identifier: MIT
 /*
@@ -7,11 +7,13 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intel_dsb.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intel_dsb.c,v 1.3 2021/12/19 11:38:26 riastradh Exp $");
 
 #include "i915_drv.h"
 #include "intel_display_types.h"
 
+#include <linux/nbsd-namespace.h>
+
 #define DSB_BUF_SIZE    (2 * PAGE_SIZE)
 
 /**
Index: src/sys/external/bsd/drm2/dist/drm/i915/display/intel_hdcp.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/display/intel_hdcp.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/display/intel_hdcp.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/display/intel_hdcp.c:1.2	Sat Dec 18 23:45:30 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/display/intel_hdcp.c	Sun Dec 19 11:38:26 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: intel_hdcp.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $	*/
+/*	$NetBSD: intel_hdcp.c,v 1.3 2021/12/19 11:38:26 riastradh Exp $	*/
 
 /* SPDX-License-Identifier: MIT */
 /*
@@ -11,7 +11,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intel_hdcp.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intel_hdcp.c,v 1.3 2021/12/19 11:38:26 riastradh Exp $");
 
 #include <linux/component.h>
 #include <linux/i2c.h>
@@ -1939,10 +1939,11 @@ int intel_hdcp_init(struct intel_connect
 	}
 
 	hdcp->shim = shim;
+	/* XXX destroy */
 	mutex_init(&hdcp->mutex);
 	INIT_DELAYED_WORK(&hdcp->check_work, intel_hdcp_check_work);
 	INIT_WORK(&hdcp->prop_work, intel_hdcp_prop_work);
-	init_waitqueue_head(&hdcp->cp_irq_queue);
+	DRM_INIT_WAITQUEUE(&hdcp->cp_irq_queue, "hdcpirq");
 
 	return 0;
 }
@@ -2087,8 +2088,12 @@ void intel_hdcp_handle_cp_irq(struct int
 	if (!hdcp->shim)
 		return;
 
+	unsigned long irqflags;
+	spin_lock_irqsave(&connector->hdcp.cp_irq_lock, irqflags);
 	atomic_inc(&connector->hdcp.cp_irq_count);
-	wake_up_all(&connector->hdcp.cp_irq_queue);
+	DRM_SPIN_WAKEUP_ALL(&connector->hdcp.cp_irq_queue,
+	    &connector->hdcp.cp_irq_lock);
+	spin_unlock_irqrestore(&connector->hdcp.cp_irq_lock, irqflags);
 
 	schedule_delayed_work(&hdcp->check_work, 0);
 }

Index: src/sys/external/bsd/drm2/i915drm/files.i915drmkms
diff -u src/sys/external/bsd/drm2/i915drm/files.i915drmkms:1.74 src/sys/external/bsd/drm2/i915drm/files.i915drmkms:1.75
--- src/sys/external/bsd/drm2/i915drm/files.i915drmkms:1.74	Sun Dec 19 11:38:04 2021
+++ src/sys/external/bsd/drm2/i915drm/files.i915drmkms	Sun Dec 19 11:38:26 2021
@@ -1,4 +1,4 @@
-#	$NetBSD: files.i915drmkms,v 1.74 2021/12/19 11:38:04 riastradh Exp $
+#	$NetBSD: files.i915drmkms,v 1.75 2021/12/19 11:38:26 riastradh Exp $
 
 version	20180827
 
@@ -88,7 +88,7 @@ file	external/bsd/drm2/dist/drm/i915/dis
 file	external/bsd/drm2/dist/drm/i915/display/intel_dpio_phy.c	i915drmkms
 file	external/bsd/drm2/dist/drm/i915/display/intel_dpll_mgr.c	i915drmkms
 file	external/bsd/drm2/dist/drm/i915/display/intel_dsb.c	i915drmkms
-file	external/bsd/drm2/dist/drm/i915/display/intel_dsi.c	i915drmkms
+#file	external/bsd/drm2/dist/drm/i915/display/intel_dsi.c	i915drmkms
 file	external/bsd/drm2/dist/drm/i915/display/intel_dsi_dcs_backlight.c	i915drmkms
 file	external/bsd/drm2/dist/drm/i915/display/intel_dsi_vbt.c	i915drmkms
 file	external/bsd/drm2/dist/drm/i915/display/intel_dvo.c	i915drmkms

Index: src/sys/external/bsd/drm2/include/linux/hdmi.h
diff -u src/sys/external/bsd/drm2/include/linux/hdmi.h:1.10 src/sys/external/bsd/drm2/include/linux/hdmi.h:1.11
--- src/sys/external/bsd/drm2/include/linux/hdmi.h:1.10	Sun Dec 19 11:38:04 2021
+++ src/sys/external/bsd/drm2/include/linux/hdmi.h	Sun Dec 19 11:38:27 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: hdmi.h,v 1.10 2021/12/19 11:38:04 riastradh Exp $	*/
+/*	$NetBSD: hdmi.h,v 1.11 2021/12/19 11:38:27 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -199,6 +199,18 @@ enum hdmi_metadata_type {
 	HDMI_STATIC_METADATA_TYPE1 = 1,
 };
 
+struct hdmi_type1 {
+	enum hdmi_eotf			eotf;
+	enum hdmi_metadata_type		metadata_type;
+	uint16_t			min_cll;
+	uint16_t			max_cll;
+	uint16_t			max_fall;
+};
+
+struct hdr_sink_metadata {
+	struct hdmi_type1		hdmi_type1;
+};
+
 #define	HDMI_INFOFRAME_SIZE(TYPE)					      \
 	(HDMI_INFOFRAME_HEADER_SIZE + HDMI_##TYPE##_INFOFRAME_SIZE)
 
@@ -210,33 +222,6 @@ struct hdmi_infoframe_header {
 	/* checksum */
 };
 
-struct hdmi_type1 {
-	enum hdmi_eotf eotf;
-	enum hdmi_metadata_type metadata_type;
-	uint16_t min_cll;
-	uint16_t max_cll;
-	uint16_t max_fall;
-};
-
-struct hdr_sink_metadata {
-	struct hdmi_type1 hdmi_type1;
-};
-
-struct hdmi_drm_infoframe {
-	enum hdmi_eotf eotf;
-	enum hdmi_metadata_type metadata_type;
-	struct {
-		uint16_t x, y;
-	} display_primaries[3];
-	struct {
-		uint16_t x, y;
-	} white_point;
-	uint16_t max_display_mastering_luminance;
-	uint16_t min_display_mastering_luminance;
-	uint16_t max_cll;
-	uint16_t max_fall;
-};
-
 static inline void
 hdmi_infoframe_header_init(struct hdmi_infoframe_header *header,
     enum hdmi_infoframe_type type, uint8_t vers, uint8_t length)
@@ -499,6 +484,7 @@ hdmi_spd_infoframe_pack(struct hdmi_spd_
 	(void)memcpy(&p[0], frame->vendor, 8);
 	(void)memcpy(&p[8], frame->product, 16);
 	p[24] = frame->sdi;
+	CTASSERT(HDMI_SPD_INFOFRAME_SIZE == 25);
 
 	hdmi_infoframe_checksum(buf, length);
 
@@ -583,9 +569,80 @@ hdmi_vendor_infoframe_pack(const struct 
 	return length;
 }
 
+#define	HDMI_DRM_INFOFRAME_SIZE		26
+struct hdmi_drm_infoframe {
+	struct hdmi_infoframe_header	header;
+	enum hdmi_eotf			eotf;
+	enum hdmi_metadata_type		metadata_type;
+	struct {
+		uint16_t	x, y;
+	}				display_primaries[3];
+	struct {
+		uint16_t	x, y;
+	}				white_point;
+	uint16_t			max_display_mastering_luminance;
+	uint16_t			min_display_mastering_luminance;
+	uint16_t			max_cll;
+	uint16_t			max_fall;
+};
+
+static inline int
+hdmi_drm_infoframe_init(struct hdmi_drm_infoframe *frame)
+{
+	static const struct hdmi_drm_infoframe zero_frame;
+
+	*frame = zero_frame;
+
+	hdmi_infoframe_header_init(&frame->header, HDMI_INFOFRAME_TYPE_DRM,
+	    1, HDMI_DRM_INFOFRAME_SIZE);
+
+	return 0;
+}
+
+#define	hdmi_drm_infoframe_pack_only	hdmi_drm_infoframe_pack /* XXX */
+
+static inline int
+hdmi_drm_infoframe_pack(const struct hdmi_drm_infoframe *frame,
+    void *buf, size_t size)
+{
+	const size_t length = HDMI_INFOFRAME_HEADER_SIZE +
+	    HDMI_DRM_INFOFRAME_SIZE;
+	uint8_t *p = buf;
+	unsigned i;
+	int ret;
+
+	KASSERT(frame->header.length == HDMI_DRM_INFOFRAME_SIZE);
+
+	ret = hdmi_infoframe_header_pack(&frame->header, length, p, size);
+	if (ret < 0)
+		return ret;
+	KASSERT(ret == HDMI_INFOFRAME_HEADER_SIZE);
+	p += HDMI_INFOFRAME_HEADER_SIZE;
+	size -= HDMI_INFOFRAME_HEADER_SIZE;
+
+	p[0] = frame->eotf;
+	p[1] = frame->metadata_type;
+	for (i = 0; i < __arraycount(frame->display_primaries); i++) {
+		le16enc(&p[2 + 4*i], frame->display_primaries[i].x);
+		le16enc(&p[2 + 4*i + 1], frame->display_primaries[i].y);
+	}
+	le16enc(&p[14], frame->white_point.x);
+	le16enc(&p[16], frame->white_point.y);
+	le16enc(&p[18], frame->min_display_mastering_luminance);
+	le16enc(&p[20], frame->max_display_mastering_luminance);
+	le16enc(&p[22], frame->max_cll);
+	le16enc(&p[24], frame->max_fall);
+	CTASSERT(HDMI_DRM_INFOFRAME_SIZE == 26);
+
+	hdmi_infoframe_checksum(buf, length);
+
+	return length;
+}
+
 union hdmi_infoframe {
 	struct hdmi_infoframe_header	any;
 	struct hdmi_avi_infoframe	avi;
+	struct hdmi_drm_infoframe	drm;
 	struct hdmi_spd_infoframe	spd;
 	union hdmi_vendor_any_infoframe	vendor;
 };
@@ -597,6 +654,8 @@ hdmi_infoframe_pack(union hdmi_infoframe
 	switch (frame->any.type) {
 	case HDMI_INFOFRAME_TYPE_AVI:
 		return hdmi_avi_infoframe_pack(&frame->avi, buf, size);
+	case HDMI_INFOFRAME_TYPE_DRM:
+		return hdmi_drm_infoframe_pack(&frame->drm, buf, size);
 	case HDMI_INFOFRAME_TYPE_SPD:
 		return hdmi_spd_infoframe_pack(&frame->spd, buf, size);
 	case HDMI_INFOFRAME_TYPE_VENDOR:
@@ -607,13 +666,6 @@ hdmi_infoframe_pack(union hdmi_infoframe
 	}
 }
 
-static inline int
-hdmi_drm_infoframe_init(struct hdmi_drm_infoframe *frame)
-{
-	panic("TODO");
-	return 0;
-}
-
 static inline void
 hdmi_infoframe_log(const char *level, struct device *device,
     const union hdmi_infoframe *frame)

Reply via email to