-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
drm/nouveau/bios: parsing for various tables required for power manag…
…ement Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
- Loading branch information
Ben Skeggs
committed
Nov 8, 2013
1 parent
aa4d7a4
commit 0833428
Showing
16 changed files
with
969 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
#ifndef __NVBIOS_BOOST_H__ | ||
#define __NVBIOS_BOOST_H__ | ||
|
||
u16 nvbios_boostTe(struct nouveau_bios *, u8 *, u8 *, u8 *, u8 *, u8 *, u8 *); | ||
|
||
struct nvbios_boostE { | ||
u8 pstate; | ||
u32 min; | ||
u32 max; | ||
}; | ||
|
||
u16 nvbios_boostEe(struct nouveau_bios *, int idx, u8 *, u8 *, u8 *, u8 *); | ||
u16 nvbios_boostEp(struct nouveau_bios *, int idx, u8 *, u8 *, u8 *, u8 *, | ||
struct nvbios_boostE *); | ||
u16 nvbios_boostEm(struct nouveau_bios *, u8, u8 *, u8 *, u8 *, u8 *, | ||
struct nvbios_boostE *); | ||
|
||
struct nvbios_boostS { | ||
u8 domain; | ||
u8 percent; | ||
u32 min; | ||
u32 max; | ||
}; | ||
|
||
u16 nvbios_boostSe(struct nouveau_bios *, int, u16, u8 *, u8 *, u8, u8); | ||
u16 nvbios_boostSp(struct nouveau_bios *, int, u16, u8 *, u8 *, u8, u8, | ||
struct nvbios_boostS *); | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
#ifndef __NVBIOS_CSTEP_H__ | ||
#define __NVBIOS_CSTEP_H__ | ||
|
||
u16 nvbios_cstepTe(struct nouveau_bios *, | ||
u8 *ver, u8 *hdr, u8 *cnt, u8 *len, u8 *xnr, u8 *xsz); | ||
|
||
struct nvbios_cstepE { | ||
u8 pstate; | ||
u8 index; | ||
}; | ||
|
||
u16 nvbios_cstepEe(struct nouveau_bios *, int idx, u8 *ver, u8 *hdr); | ||
u16 nvbios_cstepEp(struct nouveau_bios *, int idx, u8 *ver, u8 *hdr, | ||
struct nvbios_cstepE *); | ||
u16 nvbios_cstepEm(struct nouveau_bios *, u8 pstate, u8 *ver, u8 *hdr, | ||
struct nvbios_cstepE *); | ||
|
||
struct nvbios_cstepX { | ||
u32 freq; | ||
u8 unkn[2]; | ||
u8 voltage; | ||
}; | ||
|
||
u16 nvbios_cstepXe(struct nouveau_bios *, int idx, u8 *ver, u8 *hdr); | ||
u16 nvbios_cstepXp(struct nouveau_bios *, int idx, u8 *ver, u8 *hdr, | ||
struct nvbios_cstepX *); | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
#ifndef __NVBIOS_RAMMAP_H__ | ||
#define __NVBIOS_RAMMAP_H__ | ||
|
||
u16 nvbios_rammap_table(struct nouveau_bios *, u8 *ver, u8 *hdr, | ||
u8 *cnt, u8 *len, u8 *snr, u8 *ssz); | ||
u16 nvbios_rammap_entry(struct nouveau_bios *, int idx, | ||
u8 *ver, u8 *hdr, u8 *cnt, u8 *len); | ||
u16 nvbios_rammap_match(struct nouveau_bios *, u16 khz, | ||
u8 *ver, u8 *hdr, u8 *cnt, u8 *len); | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
#ifndef __NVBIOS_TIMING_H__ | ||
#define __NVBIOS_TIMING_H__ | ||
|
||
u16 nvbios_timing_table(struct nouveau_bios *, | ||
u8 *ver, u8 *hdr, u8 *cnt, u8 *len); | ||
u16 nvbios_timing_entry(struct nouveau_bios *, int idx, u8 *ver, u8 *hdr); | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
#ifndef __NVBIOS_VMAP_H__ | ||
#define __NVBIOS_VMAP_H__ | ||
|
||
struct nouveau_bios; | ||
|
||
struct nvbios_vmap { | ||
}; | ||
|
||
u16 nvbios_vmap_table(struct nouveau_bios *, u8 *ver, u8 *hdr, u8 *cnt, u8 *len); | ||
u16 nvbios_vmap_parse(struct nouveau_bios *, u8 *ver, u8 *hdr, u8 *cnt, u8 *len, | ||
struct nvbios_vmap *); | ||
|
||
struct nvbios_vmap_entry { | ||
u8 unk0; | ||
u8 link; | ||
u32 min; | ||
u32 max; | ||
s32 arg[6]; | ||
}; | ||
|
||
u16 nvbios_vmap_entry(struct nouveau_bios *, int idx, u8 *ver, u8 *len); | ||
u16 nvbios_vmap_entry_parse(struct nouveau_bios *, int idx, u8 *ver, u8 *len, | ||
struct nvbios_vmap_entry *); | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
#ifndef __NVBIOS_VOLT_H__ | ||
#define __NVBIOS_VOLT_H__ | ||
|
||
struct nouveau_bios; | ||
|
||
struct nvbios_volt { | ||
u8 vidmask; | ||
u32 min; | ||
u32 max; | ||
u32 base; | ||
s16 step; | ||
}; | ||
|
||
u16 nvbios_volt_table(struct nouveau_bios *, u8 *ver, u8 *hdr, u8 *cnt, u8 *len); | ||
u16 nvbios_volt_parse(struct nouveau_bios *, u8 *ver, u8 *hdr, u8 *cnt, u8 *len, | ||
struct nvbios_volt *); | ||
|
||
struct nvbios_volt_entry { | ||
u32 voltage; | ||
u8 vid; | ||
}; | ||
|
||
u16 nvbios_volt_entry(struct nouveau_bios *, int idx, u8 *ver, u8 *len); | ||
u16 nvbios_volt_entry_parse(struct nouveau_bios *, int idx, u8 *ver, u8 *len, | ||
struct nvbios_volt_entry *); | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,127 @@ | ||
/* | ||
* Copyright 2013 Red Hat Inc. | ||
* | ||
* Permission is hereby granted, free of charge, to any person obtaining a | ||
* copy of this software and associated documentation files (the "Software"), | ||
* to deal in the Software without restriction, including without limitation | ||
* the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
* and/or sell copies of the Software, and to permit persons to whom the | ||
* Software is furnished to do so, subject to the following conditions: | ||
* | ||
* The above copyright notice and this permission notice shall be included in | ||
* all copies or substantial portions of the Software. | ||
* | ||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
* OTHER DEALINGS IN THE SOFTWARE. | ||
* | ||
* Authors: Ben Skeggs | ||
*/ | ||
|
||
#include <subdev/bios.h> | ||
#include <subdev/bios/bit.h> | ||
#include <subdev/bios/boost.h> | ||
|
||
u16 | ||
nvbios_boostTe(struct nouveau_bios *bios, | ||
u8 *ver, u8 *hdr, u8 *cnt, u8 *len, u8 *snr, u8 *ssz) | ||
{ | ||
struct bit_entry bit_P; | ||
u16 boost = 0x0000; | ||
|
||
if (!bit_entry(bios, 'P', &bit_P)) { | ||
if (bit_P.version == 2) | ||
boost = nv_ro16(bios, bit_P.offset + 0x30); | ||
|
||
if (boost) { | ||
*ver = nv_ro08(bios, boost + 0); | ||
switch (*ver) { | ||
case 0x11: | ||
*hdr = nv_ro08(bios, boost + 1); | ||
*cnt = nv_ro08(bios, boost + 5); | ||
*len = nv_ro08(bios, boost + 2); | ||
*snr = nv_ro08(bios, boost + 4); | ||
*ssz = nv_ro08(bios, boost + 3); | ||
return boost; | ||
default: | ||
break; | ||
} | ||
} | ||
} | ||
|
||
return 0x0000; | ||
} | ||
|
||
u16 | ||
nvbios_boostEe(struct nouveau_bios *bios, int idx, | ||
u8 *ver, u8 *hdr, u8 *cnt, u8 *len) | ||
{ | ||
u8 snr, ssz; | ||
u16 data = nvbios_boostTe(bios, ver, hdr, cnt, len, &snr, &ssz); | ||
if (data && idx < *cnt) { | ||
data = data + *hdr + (idx * (*len + (snr * ssz))); | ||
*hdr = *len; | ||
*cnt = snr; | ||
*len = ssz; | ||
return data; | ||
} | ||
return 0x0000; | ||
} | ||
|
||
u16 | ||
nvbios_boostEp(struct nouveau_bios *bios, int idx, | ||
u8 *ver, u8 *hdr, u8 *cnt, u8 *len, struct nvbios_boostE *info) | ||
{ | ||
u16 data = nvbios_boostEe(bios, idx, ver, hdr, cnt, len); | ||
memset(info, 0x00, sizeof(*info)); | ||
if (data) { | ||
info->pstate = (nv_ro16(bios, data + 0x00) & 0x01e0) >> 5; | ||
info->min = nv_ro16(bios, data + 0x02) * 1000; | ||
info->max = nv_ro16(bios, data + 0x04) * 1000; | ||
} | ||
return data; | ||
} | ||
|
||
u16 | ||
nvbios_boostEm(struct nouveau_bios *bios, u8 pstate, | ||
u8 *ver, u8 *hdr, u8 *cnt, u8 *len, struct nvbios_boostE *info) | ||
{ | ||
u32 data, idx = 0; | ||
while ((data = nvbios_boostEp(bios, idx++, ver, hdr, cnt, len, info))) { | ||
if (info->pstate == pstate) | ||
break; | ||
} | ||
return data; | ||
} | ||
|
||
u16 | ||
nvbios_boostSe(struct nouveau_bios *bios, int idx, | ||
u16 data, u8 *ver, u8 *hdr, u8 cnt, u8 len) | ||
{ | ||
if (data && idx < cnt) { | ||
data = data + *hdr + (idx * len); | ||
*hdr = len; | ||
return data; | ||
} | ||
return 0x0000; | ||
} | ||
|
||
u16 | ||
nvbios_boostSp(struct nouveau_bios *bios, int idx, | ||
u16 data, u8 *ver, u8 *hdr, u8 cnt, u8 len, | ||
struct nvbios_boostS *info) | ||
{ | ||
data = nvbios_boostSe(bios, idx, data, ver, hdr, cnt, len); | ||
memset(info, 0x00, sizeof(*info)); | ||
if (data) { | ||
info->domain = nv_ro08(bios, data + 0x00); | ||
info->percent = nv_ro08(bios, data + 0x01); | ||
info->min = nv_ro16(bios, data + 0x02) * 1000; | ||
info->max = nv_ro16(bios, data + 0x04) * 1000; | ||
} | ||
return data; | ||
} |
Oops, something went wrong.