Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost
[cris-mirror.git] / drivers / gpu / drm / nouveau / nvkm / engine / disp / hdmi.c
blobd131cca999dd2c7f6361b9c784c4aef26c292ed7
1 // SPDX-License-Identifier: GPL-2.0
2 #include "hdmi.h"
4 void pack_hdmi_infoframe(struct packed_hdmi_infoframe *packed_frame,
5 u8 *raw_frame, ssize_t len)
7 u32 header = 0;
8 u32 subpack0_low = 0;
9 u32 subpack0_high = 0;
10 u32 subpack1_low = 0;
11 u32 subpack1_high = 0;
13 switch (len) {
15 * "When in doubt, use brute force."
16 * -- Ken Thompson.
18 default:
20 * We presume that no valid frame is longer than 17
21 * octets, including header... And truncate to that
22 * if it's longer.
24 case 17:
25 subpack1_high = (raw_frame[16] << 16);
26 case 16:
27 subpack1_high |= (raw_frame[15] << 8);
28 case 15:
29 subpack1_high |= raw_frame[14];
30 case 14:
31 subpack1_low = (raw_frame[13] << 24);
32 case 13:
33 subpack1_low |= (raw_frame[12] << 16);
34 case 12:
35 subpack1_low |= (raw_frame[11] << 8);
36 case 11:
37 subpack1_low |= raw_frame[10];
38 case 10:
39 subpack0_high = (raw_frame[9] << 16);
40 case 9:
41 subpack0_high |= (raw_frame[8] << 8);
42 case 8:
43 subpack0_high |= raw_frame[7];
44 case 7:
45 subpack0_low = (raw_frame[6] << 24);
46 case 6:
47 subpack0_low |= (raw_frame[5] << 16);
48 case 5:
49 subpack0_low |= (raw_frame[4] << 8);
50 case 4:
51 subpack0_low |= raw_frame[3];
52 case 3:
53 header = (raw_frame[2] << 16);
54 case 2:
55 header |= (raw_frame[1] << 8);
56 case 1:
57 header |= raw_frame[0];
58 case 0:
59 break;
62 packed_frame->header = header;
63 packed_frame->subpack0_low = subpack0_low;
64 packed_frame->subpack0_high = subpack0_high;
65 packed_frame->subpack1_low = subpack1_low;
66 packed_frame->subpack1_high = subpack1_high;