1/*	$NetBSD: nouveau_nvkm_engine_disp_hdmi.c,v 1.2 2021/12/18 23:45:35 riastradh Exp $	*/
2
3// SPDX-License-Identifier: MIT
4#include <sys/cdefs.h>
5__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_engine_disp_hdmi.c,v 1.2 2021/12/18 23:45:35 riastradh Exp $");
6
7#include "hdmi.h"
8
9void pack_hdmi_infoframe(struct packed_hdmi_infoframe *packed_frame,
10			 u8 *raw_frame, ssize_t len)
11{
12	u32 header = 0;
13	u32 subpack0_low = 0;
14	u32 subpack0_high = 0;
15	u32 subpack1_low = 0;
16	u32 subpack1_high = 0;
17
18	switch (len) {
19		/*
20		 * "When in doubt, use brute force."
21		 *     -- Ken Thompson.
22		 */
23	default:
24		/*
25		 * We presume that no valid frame is longer than 17
26		 * octets, including header...  And truncate to that
27		 * if it's longer.
28		 */
29	case 17:
30		subpack1_high = (raw_frame[16] << 16);
31		/* fall through */
32	case 16:
33		subpack1_high |= (raw_frame[15] << 8);
34		/* fall through */
35	case 15:
36		subpack1_high |= raw_frame[14];
37		/* fall through */
38	case 14:
39		subpack1_low = (raw_frame[13] << 24);
40		/* fall through */
41	case 13:
42		subpack1_low |= (raw_frame[12] << 16);
43		/* fall through */
44	case 12:
45		subpack1_low |= (raw_frame[11] << 8);
46		/* fall through */
47	case 11:
48		subpack1_low |= raw_frame[10];
49		/* fall through */
50	case 10:
51		subpack0_high = (raw_frame[9] << 16);
52		/* fall through */
53	case 9:
54		subpack0_high |= (raw_frame[8] << 8);
55		/* fall through */
56	case 8:
57		subpack0_high |= raw_frame[7];
58		/* fall through */
59	case 7:
60		subpack0_low = (raw_frame[6] << 24);
61		/* fall through */
62	case 6:
63		subpack0_low |= (raw_frame[5] << 16);
64		/* fall through */
65	case 5:
66		subpack0_low |= (raw_frame[4] << 8);
67		/* fall through */
68	case 4:
69		subpack0_low |= raw_frame[3];
70		/* fall through */
71	case 3:
72		header = (raw_frame[2] << 16);
73		/* fall through */
74	case 2:
75		header |= (raw_frame[1] << 8);
76		/* fall through */
77	case 1:
78		header |= raw_frame[0];
79		/* fall through */
80	case 0:
81		break;
82	}
83
84	packed_frame->header = header;
85	packed_frame->subpack0_low = subpack0_low;
86	packed_frame->subpack0_high = subpack0_high;
87	packed_frame->subpack1_low = subpack1_low;
88	packed_frame->subpack1_high = subpack1_high;
89}
90