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 <subdev/bios.h>
25#include <subdev/bios/bit.h>
26#include <subdev/bios/boost.h>
27
28u32
29nvbios_boostTe(struct nvkm_bios *bios,
30 u8 *ver, u8 *hdr, u8 *cnt, u8 *len, u8 *snr, u8 *ssz)
31{
32 struct bit_entry bit_P;
33 u32 boost = 0;
34
35 if (!bit_entry(bios, 'P', &bit_P)) {
36 if (bit_P.version == 2 && bit_P.length >= 0x34)
37 boost = nvbios_rd32(bios, bit_P.offset + 0x30);
38
39 if (boost) {
40 *ver = nvbios_rd08(bios, boost + 0);
41 switch (*ver) {
42 case 0x11:
43 *hdr = nvbios_rd08(bios, boost + 1);
44 *cnt = nvbios_rd08(bios, boost + 5);
45 *len = nvbios_rd08(bios, boost + 2);
46 *snr = nvbios_rd08(bios, boost + 4);
47 *ssz = nvbios_rd08(bios, boost + 3);
48 return boost;
49 default:
50 break;
51 }
52 }
53 }
54
55 return 0;
56}
57
58u32
59nvbios_boostEe(struct nvkm_bios *bios, int idx,
60 u8 *ver, u8 *hdr, u8 *cnt, u8 *len)
61{
62 u8 snr, ssz;
63 u32 data = nvbios_boostTe(bios, ver, hdr, cnt, len, &snr, &ssz);
64 if (data && idx < *cnt) {
65 data = data + *hdr + (idx * (*len + (snr * ssz)));
66 *hdr = *len;
67 *cnt = snr;
68 *len = ssz;
69 return data;
70 }
71 return 0;
72}
73
74u32
75nvbios_boostEp(struct nvkm_bios *bios, int idx,
76 u8 *ver, u8 *hdr, u8 *cnt, u8 *len, struct nvbios_boostE *info)
77{
78 u32 data = nvbios_boostEe(bios, idx, ver, hdr, cnt, len);
79 memset(info, 0x00, sizeof(*info));
80 if (data) {
81 info->pstate = (nvbios_rd16(bios, data + 0x00) & 0x01e0) >> 5;
82 info->min = nvbios_rd16(bios, data + 0x02) * 1000;
83 info->max = nvbios_rd16(bios, data + 0x04) * 1000;
84 }
85 return data;
86}
87
88u32
89nvbios_boostEm(struct nvkm_bios *bios, u8 pstate,
90 u8 *ver, u8 *hdr, u8 *cnt, u8 *len, struct nvbios_boostE *info)
91{
92 u32 data, idx = 0;
93 while ((data = nvbios_boostEp(bios, idx++, ver, hdr, cnt, len, info))) {
94 if (info->pstate == pstate)
95 break;
96 }
97 return data;
98}
99
100u32
101nvbios_boostSe(struct nvkm_bios *bios, int idx,
102 u32 data, u8 *ver, u8 *hdr, u8 cnt, u8 len)
103{
104 if (data && idx < cnt) {
105 data = data + *hdr + (idx * len);
106 *hdr = len;
107 return data;
108 }
109 return 0;
110}
111
112u32
113nvbios_boostSp(struct nvkm_bios *bios, int idx,
114 u32 data, u8 *ver, u8 *hdr, u8 cnt, u8 len,
115 struct nvbios_boostS *info)
116{
117 data = nvbios_boostSe(bios, idx, data, ver, hdr, cnt, len);
118 memset(info, 0x00, sizeof(*info));
119 if (data) {
120 info->domain = nvbios_rd08(bios, data + 0x00);
121 info->percent = nvbios_rd08(bios, data + 0x01);
122 info->min = nvbios_rd16(bios, data + 0x02) * 1000;
123 info->max = nvbios_rd16(bios, data + 0x04) * 1000;
124 }
125 return data;
126}
127