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