1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24#include "nv50.h"
25#include "outp.h"
26
27#include <core/client.h>
28
29#include <nvif/class.h>
30#include <nvif/unpack.h>
31
32int
33gt215_hdmi_ctrl(NV50_DISP_MTHD_V1)
34{
35 const u32 soff = outp->or * 0x800;
36 union {
37 struct nv50_disp_sor_hdmi_pwr_v0 v0;
38 } *args = data;
39 u32 ctrl;
40 int ret;
41
42 nv_ioctl(object, "disp sor hdmi ctrl size %d\n", size);
43 if (nvif_unpack(args->v0, 0, 0, false)) {
44 nv_ioctl(object, "disp sor hdmi ctrl vers %d state %d "
45 "max_ac_packet %d rekey %d\n",
46 args->v0.version, args->v0.state,
47 args->v0.max_ac_packet, args->v0.rekey);
48 if (args->v0.max_ac_packet > 0x1f || args->v0.rekey > 0x7f)
49 return -EINVAL;
50 ctrl = 0x40000000 * !!args->v0.state;
51 ctrl |= args->v0.max_ac_packet << 16;
52 ctrl |= args->v0.rekey;
53 ctrl |= 0x1f000000;
54 } else
55 return ret;
56
57 if (!(ctrl & 0x40000000)) {
58 nv_mask(priv, 0x61c5a4 + soff, 0x40000000, 0x00000000);
59 nv_mask(priv, 0x61c520 + soff, 0x00000001, 0x00000000);
60 nv_mask(priv, 0x61c500 + soff, 0x00000001, 0x00000000);
61 return 0;
62 }
63
64
65 nv_mask(priv, 0x61c520 + soff, 0x00000001, 0x00000000);
66 nv_wr32(priv, 0x61c528 + soff, 0x000d0282);
67 nv_wr32(priv, 0x61c52c + soff, 0x0000006f);
68 nv_wr32(priv, 0x61c530 + soff, 0x00000000);
69 nv_wr32(priv, 0x61c534 + soff, 0x00000000);
70 nv_wr32(priv, 0x61c538 + soff, 0x00000000);
71 nv_mask(priv, 0x61c520 + soff, 0x00000001, 0x00000001);
72
73
74 nv_mask(priv, 0x61c500 + soff, 0x00000001, 0x00000000);
75 nv_wr32(priv, 0x61c508 + soff, 0x000a0184);
76 nv_wr32(priv, 0x61c50c + soff, 0x00000071);
77 nv_wr32(priv, 0x61c510 + soff, 0x00000000);
78 nv_mask(priv, 0x61c500 + soff, 0x00000001, 0x00000001);
79
80 nv_mask(priv, 0x61c5d0 + soff, 0x00070001, 0x00010001);
81 nv_mask(priv, 0x61c568 + soff, 0x00010101, 0x00000000);
82 nv_mask(priv, 0x61c578 + soff, 0x80000000, 0x80000000);
83
84
85 nv_mask(priv, 0x61733c, 0x00100000, 0x00100000);
86 nv_mask(priv, 0x61733c, 0x10000000, 0x10000000);
87 nv_mask(priv, 0x61733c, 0x00100000, 0x00000000);
88
89
90 nv_mask(priv, 0x61c5a4 + soff, 0x5f1f007f, ctrl);
91 return 0;
92}
93