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)