Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
0833428e
R
raspberrypi-kernel
项目概览
openeuler
/
raspberrypi-kernel
通知
13
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
raspberrypi-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
0833428e
编写于
1月 15, 2013
作者:
B
Ben Skeggs
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
drm/nouveau/bios: parsing for various tables required for power management
Signed-off-by:
N
Ben Skeggs
<
bskeggs@redhat.com
>
上级
aa4d7a4d
变更
16
隐藏空白更改
内联
并排
Showing
16 changed file
with
969 addition
and
8 deletion
+969
-8
drivers/gpu/drm/nouveau/Makefile
drivers/gpu/drm/nouveau/Makefile
+6
-0
drivers/gpu/drm/nouveau/core/include/subdev/bios/boost.h
drivers/gpu/drm/nouveau/core/include/subdev/bios/boost.h
+29
-0
drivers/gpu/drm/nouveau/core/include/subdev/bios/cstep.h
drivers/gpu/drm/nouveau/core/include/subdev/bios/cstep.h
+28
-0
drivers/gpu/drm/nouveau/core/include/subdev/bios/gpio.h
drivers/gpu/drm/nouveau/core/include/subdev/bios/gpio.h
+9
-1
drivers/gpu/drm/nouveau/core/include/subdev/bios/perf.h
drivers/gpu/drm/nouveau/core/include/subdev/bios/perf.h
+33
-0
drivers/gpu/drm/nouveau/core/include/subdev/bios/rammap.h
drivers/gpu/drm/nouveau/core/include/subdev/bios/rammap.h
+11
-0
drivers/gpu/drm/nouveau/core/include/subdev/bios/timing.h
drivers/gpu/drm/nouveau/core/include/subdev/bios/timing.h
+8
-0
drivers/gpu/drm/nouveau/core/include/subdev/bios/vmap.h
drivers/gpu/drm/nouveau/core/include/subdev/bios/vmap.h
+25
-0
drivers/gpu/drm/nouveau/core/include/subdev/bios/volt.h
drivers/gpu/drm/nouveau/core/include/subdev/bios/volt.h
+27
-0
drivers/gpu/drm/nouveau/core/subdev/bios/boost.c
drivers/gpu/drm/nouveau/core/subdev/bios/boost.c
+127
-0
drivers/gpu/drm/nouveau/core/subdev/bios/cstep.c
drivers/gpu/drm/nouveau/core/subdev/bios/cstep.c
+123
-0
drivers/gpu/drm/nouveau/core/subdev/bios/perf.c
drivers/gpu/drm/nouveau/core/subdev/bios/perf.c
+133
-7
drivers/gpu/drm/nouveau/core/subdev/bios/rammap.c
drivers/gpu/drm/nouveau/core/subdev/bios/rammap.c
+88
-0
drivers/gpu/drm/nouveau/core/subdev/bios/timing.c
drivers/gpu/drm/nouveau/core/subdev/bios/timing.c
+73
-0
drivers/gpu/drm/nouveau/core/subdev/bios/vmap.c
drivers/gpu/drm/nouveau/core/subdev/bios/vmap.c
+112
-0
drivers/gpu/drm/nouveau/core/subdev/bios/volt.c
drivers/gpu/drm/nouveau/core/subdev/bios/volt.c
+137
-0
未找到文件。
drivers/gpu/drm/nouveau/Makefile
浏览文件 @
0833428e
...
...
@@ -28,7 +28,9 @@ nouveau-y += core/subdev/bar/nv50.o
nouveau-y
+=
core/subdev/bar/nvc0.o
nouveau-y
+=
core/subdev/bios/base.o
nouveau-y
+=
core/subdev/bios/bit.o
nouveau-y
+=
core/subdev/bios/boost.o
nouveau-y
+=
core/subdev/bios/conn.o
nouveau-y
+=
core/subdev/bios/cstep.o
nouveau-y
+=
core/subdev/bios/dcb.o
nouveau-y
+=
core/subdev/bios/disp.o
nouveau-y
+=
core/subdev/bios/dp.o
...
...
@@ -39,7 +41,11 @@ nouveau-y += core/subdev/bios/init.o
nouveau-y
+=
core/subdev/bios/mxm.o
nouveau-y
+=
core/subdev/bios/perf.o
nouveau-y
+=
core/subdev/bios/pll.o
nouveau-y
+=
core/subdev/bios/rammap.o
nouveau-y
+=
core/subdev/bios/timing.o
nouveau-y
+=
core/subdev/bios/therm.o
nouveau-y
+=
core/subdev/bios/vmap.o
nouveau-y
+=
core/subdev/bios/volt.o
nouveau-y
+=
core/subdev/bios/xpio.o
nouveau-y
+=
core/subdev/bus/nv04.o
nouveau-y
+=
core/subdev/bus/nv31.o
...
...
drivers/gpu/drm/nouveau/core/include/subdev/bios/boost.h
0 → 100644
浏览文件 @
0833428e
#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
drivers/gpu/drm/nouveau/core/include/subdev/bios/cstep.h
0 → 100644
浏览文件 @
0833428e
#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
drivers/gpu/drm/nouveau/core/include/subdev/bios/gpio.h
浏览文件 @
0833428e
...
...
@@ -7,7 +7,15 @@ enum dcb_gpio_func_name {
DCB_GPIO_TVDAC1
=
0x2d
,
DCB_GPIO_FAN
=
0x09
,
DCB_GPIO_FAN_SENSE
=
0x3d
,
DCB_GPIO_UNUSED
=
0xff
DCB_GPIO_UNUSED
=
0xff
,
DCB_GPIO_VID0
=
0x04
,
DCB_GPIO_VID1
=
0x05
,
DCB_GPIO_VID2
=
0x06
,
DCB_GPIO_VID3
=
0x1a
,
DCB_GPIO_VID4
=
0x73
,
DCB_GPIO_VID5
=
0x74
,
DCB_GPIO_VID6
=
0x75
,
DCB_GPIO_VID7
=
0x76
,
};
#define DCB_GPIO_LOG_DIR 0x02
...
...
drivers/gpu/drm/nouveau/core/include/subdev/bios/perf.h
浏览文件 @
0833428e
...
...
@@ -3,6 +3,39 @@
struct
nouveau_bios
;
u16
nvbios_perf_table
(
struct
nouveau_bios
*
,
u8
*
ver
,
u8
*
hdr
,
u8
*
cnt
,
u8
*
len
,
u8
*
snr
,
u8
*
ssz
);
struct
nvbios_perfE
{
u8
pstate
;
u8
fanspeed
;
u8
voltage
;
u32
core
;
u32
shader
;
u32
memory
;
u32
vdec
;
u32
disp
;
u32
script
;
};
u16
nvbios_perf_entry
(
struct
nouveau_bios
*
,
int
idx
,
u8
*
ver
,
u8
*
hdr
,
u8
*
cnt
,
u8
*
len
);
u16
nvbios_perfEp
(
struct
nouveau_bios
*
,
int
idx
,
u8
*
ver
,
u8
*
hdr
,
u8
*
cnt
,
u8
*
len
,
struct
nvbios_perfE
*
);
struct
nvbios_perfS
{
union
{
struct
{
u32
freq
;
}
v40
;
};
};
u32
nvbios_perfSe
(
struct
nouveau_bios
*
,
u32
data
,
int
idx
,
u8
*
ver
,
u8
*
hdr
,
u8
cnt
,
u8
len
);
u32
nvbios_perfSp
(
struct
nouveau_bios
*
,
u32
data
,
int
idx
,
u8
*
ver
,
u8
*
hdr
,
u8
cnt
,
u8
len
,
struct
nvbios_perfS
*
);
struct
nvbios_perf_fan
{
u32
pwm_divisor
;
};
...
...
drivers/gpu/drm/nouveau/core/include/subdev/bios/rammap.h
0 → 100644
浏览文件 @
0833428e
#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
drivers/gpu/drm/nouveau/core/include/subdev/bios/timing.h
0 → 100644
浏览文件 @
0833428e
#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
drivers/gpu/drm/nouveau/core/include/subdev/bios/vmap.h
0 → 100644
浏览文件 @
0833428e
#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
drivers/gpu/drm/nouveau/core/include/subdev/bios/volt.h
0 → 100644
浏览文件 @
0833428e
#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
drivers/gpu/drm/nouveau/core/subdev/bios/boost.c
0 → 100644
浏览文件 @
0833428e
/*
* 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
;
}
drivers/gpu/drm/nouveau/core/subdev/bios/cstep.c
0 → 100644
浏览文件 @
0833428e
/*
* 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/cstep.h>
u16
nvbios_cstepTe
(
struct
nouveau_bios
*
bios
,
u8
*
ver
,
u8
*
hdr
,
u8
*
cnt
,
u8
*
len
,
u8
*
xnr
,
u8
*
xsz
)
{
struct
bit_entry
bit_P
;
u16
cstep
=
0x0000
;
if
(
!
bit_entry
(
bios
,
'P'
,
&
bit_P
))
{
if
(
bit_P
.
version
==
2
)
cstep
=
nv_ro16
(
bios
,
bit_P
.
offset
+
0x34
);
if
(
cstep
)
{
*
ver
=
nv_ro08
(
bios
,
cstep
+
0
);
switch
(
*
ver
)
{
case
0x10
:
*
hdr
=
nv_ro08
(
bios
,
cstep
+
1
);
*
cnt
=
nv_ro08
(
bios
,
cstep
+
3
);
*
len
=
nv_ro08
(
bios
,
cstep
+
2
);
*
xnr
=
nv_ro08
(
bios
,
cstep
+
5
);
*
xsz
=
nv_ro08
(
bios
,
cstep
+
4
);
return
cstep
;
default:
break
;
}
}
}
return
0x0000
;
}
u16
nvbios_cstepEe
(
struct
nouveau_bios
*
bios
,
int
idx
,
u8
*
ver
,
u8
*
hdr
)
{
u8
cnt
,
len
,
xnr
,
xsz
;
u16
data
=
nvbios_cstepTe
(
bios
,
ver
,
hdr
,
&
cnt
,
&
len
,
&
xnr
,
&
xsz
);
if
(
data
&&
idx
<
cnt
)
{
data
=
data
+
*
hdr
+
(
idx
*
len
);
*
hdr
=
len
;
return
data
;
}
return
0x0000
;
}
u16
nvbios_cstepEp
(
struct
nouveau_bios
*
bios
,
int
idx
,
u8
*
ver
,
u8
*
hdr
,
struct
nvbios_cstepE
*
info
)
{
u16
data
=
nvbios_cstepEe
(
bios
,
idx
,
ver
,
hdr
);
memset
(
info
,
0x00
,
sizeof
(
*
info
));
if
(
data
)
{
info
->
pstate
=
(
nv_ro16
(
bios
,
data
+
0x00
)
&
0x01e0
)
>>
5
;
info
->
index
=
nv_ro08
(
bios
,
data
+
0x03
);
}
return
data
;
}
u16
nvbios_cstepEm
(
struct
nouveau_bios
*
bios
,
u8
pstate
,
u8
*
ver
,
u8
*
hdr
,
struct
nvbios_cstepE
*
info
)
{
u32
data
,
idx
=
0
;
while
((
data
=
nvbios_cstepEp
(
bios
,
idx
++
,
ver
,
hdr
,
info
)))
{
if
(
info
->
pstate
==
pstate
)
break
;
}
return
data
;
}
u16
nvbios_cstepXe
(
struct
nouveau_bios
*
bios
,
int
idx
,
u8
*
ver
,
u8
*
hdr
)
{
u8
cnt
,
len
,
xnr
,
xsz
;
u16
data
=
nvbios_cstepTe
(
bios
,
ver
,
hdr
,
&
cnt
,
&
len
,
&
xnr
,
&
xsz
);
if
(
data
&&
idx
<
xnr
)
{
data
=
data
+
*
hdr
+
(
cnt
*
len
)
+
(
idx
*
xsz
);
*
hdr
=
xsz
;
return
data
;
}
return
0x0000
;
}
u16
nvbios_cstepXp
(
struct
nouveau_bios
*
bios
,
int
idx
,
u8
*
ver
,
u8
*
hdr
,
struct
nvbios_cstepX
*
info
)
{
u16
data
=
nvbios_cstepXe
(
bios
,
idx
,
ver
,
hdr
);
memset
(
info
,
0x00
,
sizeof
(
*
info
));
if
(
data
)
{
info
->
freq
=
nv_ro16
(
bios
,
data
+
0x00
)
*
1000
;
info
->
unkn
[
0
]
=
nv_ro08
(
bios
,
data
+
0x02
);
info
->
unkn
[
1
]
=
nv_ro08
(
bios
,
data
+
0x03
);
info
->
voltage
=
nv_ro08
(
bios
,
data
+
0x04
);
}
return
data
;
}
drivers/gpu/drm/nouveau/core/subdev/bios/perf.c
浏览文件 @
0833428e
...
...
@@ -26,8 +26,9 @@
#include <subdev/bios/bit.h>
#include <subdev/bios/perf.h>
static
u16
perf_table
(
struct
nouveau_bios
*
bios
,
u8
*
ver
,
u8
*
hdr
,
u8
*
cnt
,
u8
*
len
)
u16
nvbios_perf_table
(
struct
nouveau_bios
*
bios
,
u8
*
ver
,
u8
*
hdr
,
u8
*
cnt
,
u8
*
len
,
u8
*
snr
,
u8
*
ssz
)
{
struct
bit_entry
bit_P
;
u16
perf
=
0x0000
;
...
...
@@ -38,10 +39,22 @@ perf_table(struct nouveau_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len)
if
(
perf
)
{
*
ver
=
nv_ro08
(
bios
,
perf
+
0
);
*
hdr
=
nv_ro08
(
bios
,
perf
+
1
);
if
(
*
ver
>=
0x40
&&
*
ver
<
0x41
)
{
*
cnt
=
nv_ro08
(
bios
,
perf
+
5
);
*
len
=
nv_ro08
(
bios
,
perf
+
2
);
*
snr
=
nv_ro08
(
bios
,
perf
+
4
);
*
ssz
=
nv_ro08
(
bios
,
perf
+
3
);
return
perf
;
}
else
if
(
*
ver
>=
0x20
&&
*
ver
<
0x40
)
{
*
cnt
=
nv_ro08
(
bios
,
perf
+
2
);
*
len
=
nv_ro08
(
bios
,
perf
+
3
);
*
snr
=
nv_ro08
(
bios
,
perf
+
4
);
*
ssz
=
nv_ro08
(
bios
,
perf
+
5
);
return
perf
;
}
}
}
else
nv_error
(
bios
,
"unknown offset for perf in BIT P %d
\n
"
,
bit_P
.
version
);
}
}
if
(
bios
->
bmp_offset
)
{
...
...
@@ -50,19 +63,132 @@ perf_table(struct nouveau_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len)
if
(
perf
)
{
*
hdr
=
nv_ro08
(
bios
,
perf
+
0
);
*
ver
=
nv_ro08
(
bios
,
perf
+
1
);
*
cnt
=
nv_ro08
(
bios
,
perf
+
2
);
*
len
=
nv_ro08
(
bios
,
perf
+
3
);
*
snr
=
0
;
*
ssz
=
0
;
return
perf
;
}
}
}
return
0x0000
;
}
u16
nvbios_perf_entry
(
struct
nouveau_bios
*
bios
,
int
idx
,
u8
*
ver
,
u8
*
hdr
,
u8
*
cnt
,
u8
*
len
)
{
u8
snr
,
ssz
;
u16
perf
=
nvbios_perf_table
(
bios
,
ver
,
hdr
,
cnt
,
len
,
&
snr
,
&
ssz
);
if
(
perf
&&
idx
<
*
cnt
)
{
perf
=
perf
+
*
hdr
+
(
idx
*
(
*
len
+
(
snr
*
ssz
)));
*
hdr
=
*
len
;
*
cnt
=
snr
;
*
len
=
ssz
;
return
perf
;
}
return
0x0000
;
}
u16
nvbios_perfEp
(
struct
nouveau_bios
*
bios
,
int
idx
,
u8
*
ver
,
u8
*
hdr
,
u8
*
cnt
,
u8
*
len
,
struct
nvbios_perfE
*
info
)
{
u16
perf
=
nvbios_perf_entry
(
bios
,
idx
,
ver
,
hdr
,
cnt
,
len
);
memset
(
info
,
0x00
,
sizeof
(
*
info
));
info
->
pstate
=
nv_ro08
(
bios
,
perf
+
0x00
);
switch
(
!!
perf
*
*
ver
)
{
case
0x12
:
case
0x13
:
case
0x14
:
info
->
core
=
nv_ro32
(
bios
,
perf
+
0x01
)
*
10
;
info
->
memory
=
nv_ro32
(
bios
,
perf
+
0x05
)
*
20
;
info
->
fanspeed
=
nv_ro08
(
bios
,
perf
+
0x37
);
if
(
*
hdr
>
0x38
)
info
->
voltage
=
nv_ro08
(
bios
,
perf
+
0x38
);
break
;
case
0x21
:
case
0x23
:
case
0x24
:
info
->
fanspeed
=
nv_ro08
(
bios
,
perf
+
0x04
);
info
->
voltage
=
nv_ro08
(
bios
,
perf
+
0x05
);
info
->
shader
=
nv_ro16
(
bios
,
perf
+
0x06
)
*
1000
;
info
->
core
=
info
->
shader
+
(
signed
char
)
nv_ro08
(
bios
,
perf
+
0x08
)
*
1000
;
switch
(
nv_device
(
bios
)
->
chipset
)
{
case
0x49
:
case
0x4b
:
info
->
memory
=
nv_ro16
(
bios
,
perf
+
0x0b
)
*
1000
;
break
;
default:
info
->
memory
=
nv_ro16
(
bios
,
perf
+
0x0b
)
*
2000
;
break
;
}
break
;
case
0x25
:
info
->
fanspeed
=
nv_ro08
(
bios
,
perf
+
0x04
);
info
->
voltage
=
nv_ro08
(
bios
,
perf
+
0x05
);
info
->
core
=
nv_ro16
(
bios
,
perf
+
0x06
)
*
1000
;
info
->
shader
=
nv_ro16
(
bios
,
perf
+
0x0a
)
*
1000
;
info
->
memory
=
nv_ro16
(
bios
,
perf
+
0x0c
)
*
1000
;
break
;
case
0x30
:
info
->
script
=
nv_ro16
(
bios
,
perf
+
0x02
);
case
0x35
:
info
->
fanspeed
=
nv_ro08
(
bios
,
perf
+
0x06
);
info
->
voltage
=
nv_ro08
(
bios
,
perf
+
0x07
);
info
->
core
=
nv_ro16
(
bios
,
perf
+
0x08
)
*
1000
;
info
->
shader
=
nv_ro16
(
bios
,
perf
+
0x0a
)
*
1000
;
info
->
memory
=
nv_ro16
(
bios
,
perf
+
0x0c
)
*
1000
;
info
->
vdec
=
nv_ro16
(
bios
,
perf
+
0x10
)
*
1000
;
info
->
disp
=
nv_ro16
(
bios
,
perf
+
0x14
)
*
1000
;
break
;
case
0x40
:
info
->
voltage
=
nv_ro08
(
bios
,
perf
+
0x02
);
break
;
default:
return
0x0000
;
}
return
perf
;
}
u32
nvbios_perfSe
(
struct
nouveau_bios
*
bios
,
u32
perfE
,
int
idx
,
u8
*
ver
,
u8
*
hdr
,
u8
cnt
,
u8
len
)
{
u32
data
=
0x00000000
;
if
(
idx
<
cnt
)
{
data
=
perfE
+
*
hdr
+
(
idx
*
len
);
*
hdr
=
len
;
}
return
data
;
}
u32
nvbios_perfSp
(
struct
nouveau_bios
*
bios
,
u32
perfE
,
int
idx
,
u8
*
ver
,
u8
*
hdr
,
u8
cnt
,
u8
len
,
struct
nvbios_perfS
*
info
)
{
u32
data
=
nvbios_perfSe
(
bios
,
perfE
,
idx
,
ver
,
hdr
,
cnt
,
len
);
memset
(
info
,
0x00
,
sizeof
(
*
info
));
switch
(
!!
data
*
*
ver
)
{
case
0x40
:
info
->
v40
.
freq
=
(
nv_ro16
(
bios
,
data
+
0x00
)
&
0x3fff
)
*
1000
;
break
;
default:
break
;
}
return
data
;
}
int
nvbios_perf_fan_parse
(
struct
nouveau_bios
*
bios
,
struct
nvbios_perf_fan
*
fan
)
{
u8
ver
=
0
,
hdr
=
0
,
cnt
=
0
,
len
=
0
;
u16
perf
=
perf_table
(
bios
,
&
ver
,
&
hdr
,
&
cnt
,
&
len
);
u8
ver
,
hdr
,
cnt
,
len
,
snr
,
ssz
;
u16
perf
=
nvbios_perf_table
(
bios
,
&
ver
,
&
hdr
,
&
cnt
,
&
len
,
&
snr
,
&
ssz
);
if
(
!
perf
)
return
-
ENODEV
;
...
...
drivers/gpu/drm/nouveau/core/subdev/bios/rammap.c
0 → 100644
浏览文件 @
0833428e
/*
* 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/rammap.h>
u16
nvbios_rammap_table
(
struct
nouveau_bios
*
bios
,
u8
*
ver
,
u8
*
hdr
,
u8
*
cnt
,
u8
*
len
,
u8
*
snr
,
u8
*
ssz
)
{
struct
bit_entry
bit_P
;
u16
rammap
=
0x0000
;
if
(
!
bit_entry
(
bios
,
'P'
,
&
bit_P
))
{
if
(
bit_P
.
version
==
2
)
rammap
=
nv_ro16
(
bios
,
bit_P
.
offset
+
4
);
if
(
rammap
)
{
*
ver
=
nv_ro08
(
bios
,
rammap
+
0
);
switch
(
*
ver
)
{
case
0x10
:
case
0x11
:
*
hdr
=
nv_ro08
(
bios
,
rammap
+
1
);
*
cnt
=
nv_ro08
(
bios
,
rammap
+
5
);
*
len
=
nv_ro08
(
bios
,
rammap
+
2
);
*
snr
=
nv_ro08
(
bios
,
rammap
+
4
);
*
ssz
=
nv_ro08
(
bios
,
rammap
+
3
);
return
rammap
;
default:
break
;
}
}
}
return
0x0000
;
}
u16
nvbios_rammap_entry
(
struct
nouveau_bios
*
bios
,
int
idx
,
u8
*
ver
,
u8
*
hdr
,
u8
*
cnt
,
u8
*
len
)
{
u8
snr
,
ssz
;
u16
rammap
=
nvbios_rammap_table
(
bios
,
ver
,
hdr
,
cnt
,
len
,
&
snr
,
&
ssz
);
if
(
rammap
&&
idx
<
*
cnt
)
{
rammap
=
rammap
+
*
hdr
+
(
idx
*
(
*
len
+
(
snr
*
ssz
)));
*
hdr
=
*
len
;
*
cnt
=
snr
;
*
len
=
ssz
;
return
rammap
;
}
return
0x0000
;
}
u16
nvbios_rammap_match
(
struct
nouveau_bios
*
bios
,
u16
khz
,
u8
*
ver
,
u8
*
hdr
,
u8
*
cnt
,
u8
*
len
)
{
int
idx
=
0
;
u32
data
;
while
((
data
=
nvbios_rammap_entry
(
bios
,
idx
++
,
ver
,
hdr
,
cnt
,
len
)))
{
if
(
khz
>=
nv_ro16
(
bios
,
data
+
0x00
)
&&
khz
<=
nv_ro16
(
bios
,
data
+
0x02
))
break
;
}
return
data
;
}
drivers/gpu/drm/nouveau/core/subdev/bios/timing.c
0 → 100644
浏览文件 @
0833428e
/*
* 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/timing.h>
u16
nvbios_timing_table
(
struct
nouveau_bios
*
bios
,
u8
*
ver
,
u8
*
hdr
,
u8
*
cnt
,
u8
*
len
)
{
struct
bit_entry
bit_P
;
u16
timing
=
0x0000
;
if
(
!
bit_entry
(
bios
,
'P'
,
&
bit_P
))
{
if
(
bit_P
.
version
==
1
)
timing
=
nv_ro16
(
bios
,
bit_P
.
offset
+
4
);
else
if
(
bit_P
.
version
==
2
)
timing
=
nv_ro16
(
bios
,
bit_P
.
offset
+
8
);
if
(
timing
)
{
*
ver
=
nv_ro08
(
bios
,
timing
+
0
);
switch
(
*
ver
)
{
case
0x10
:
*
hdr
=
nv_ro08
(
bios
,
timing
+
1
);
*
cnt
=
nv_ro08
(
bios
,
timing
+
2
);
*
len
=
nv_ro08
(
bios
,
timing
+
3
);
return
timing
;
case
0x20
:
*
hdr
=
nv_ro08
(
bios
,
timing
+
1
);
*
cnt
=
nv_ro08
(
bios
,
timing
+
3
);
*
len
=
nv_ro08
(
bios
,
timing
+
2
);
return
timing
;
default:
break
;
}
}
}
return
0x0000
;
}
u16
nvbios_timing_entry
(
struct
nouveau_bios
*
bios
,
int
idx
,
u8
*
ver
,
u8
*
len
)
{
u8
hdr
,
cnt
;
u16
timing
=
nvbios_timing_table
(
bios
,
ver
,
&
hdr
,
&
cnt
,
len
);
if
(
timing
&&
idx
<
cnt
)
return
timing
+
hdr
+
(
idx
*
*
len
);
return
0x0000
;
}
drivers/gpu/drm/nouveau/core/subdev/bios/vmap.c
0 → 100644
浏览文件 @
0833428e
/*
* Copyright 2012 Nouveau Community
*
* 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: Martin Peres
*/
#include <subdev/bios.h>
#include <subdev/bios/bit.h>
#include <subdev/bios/vmap.h>
u16
nvbios_vmap_table
(
struct
nouveau_bios
*
bios
,
u8
*
ver
,
u8
*
hdr
,
u8
*
cnt
,
u8
*
len
)
{
struct
bit_entry
bit_P
;
u16
vmap
=
0x0000
;
if
(
!
bit_entry
(
bios
,
'P'
,
&
bit_P
))
{
if
(
bit_P
.
version
==
2
)
{
vmap
=
nv_ro16
(
bios
,
bit_P
.
offset
+
0x20
);
if
(
vmap
)
{
*
ver
=
nv_ro08
(
bios
,
vmap
+
0
);
switch
(
*
ver
)
{
case
0x10
:
case
0x20
:
*
hdr
=
nv_ro08
(
bios
,
vmap
+
1
);
*
cnt
=
nv_ro08
(
bios
,
vmap
+
3
);
*
len
=
nv_ro08
(
bios
,
vmap
+
2
);
return
vmap
;
default:
break
;
}
}
}
}
return
0x0000
;
}
u16
nvbios_vmap_parse
(
struct
nouveau_bios
*
bios
,
u8
*
ver
,
u8
*
hdr
,
u8
*
cnt
,
u8
*
len
,
struct
nvbios_vmap
*
info
)
{
u16
vmap
=
nvbios_vmap_table
(
bios
,
ver
,
hdr
,
cnt
,
len
);
memset
(
info
,
0x00
,
sizeof
(
*
info
));
switch
(
!!
vmap
*
*
ver
)
{
case
0x10
:
case
0x20
:
break
;
}
return
vmap
;
}
u16
nvbios_vmap_entry
(
struct
nouveau_bios
*
bios
,
int
idx
,
u8
*
ver
,
u8
*
len
)
{
u8
hdr
,
cnt
;
u16
vmap
=
nvbios_vmap_table
(
bios
,
ver
,
&
hdr
,
&
cnt
,
len
);
if
(
vmap
&&
idx
<
cnt
)
{
vmap
=
vmap
+
hdr
+
(
idx
*
*
len
);
return
vmap
;
}
return
0x0000
;
}
u16
nvbios_vmap_entry_parse
(
struct
nouveau_bios
*
bios
,
int
idx
,
u8
*
ver
,
u8
*
len
,
struct
nvbios_vmap_entry
*
info
)
{
u16
vmap
=
nvbios_vmap_entry
(
bios
,
idx
,
ver
,
len
);
memset
(
info
,
0x00
,
sizeof
(
*
info
));
switch
(
!!
vmap
*
*
ver
)
{
case
0x10
:
info
->
link
=
0xff
;
info
->
min
=
nv_ro32
(
bios
,
vmap
+
0x00
);
info
->
max
=
nv_ro32
(
bios
,
vmap
+
0x04
);
info
->
arg
[
0
]
=
nv_ro32
(
bios
,
vmap
+
0x08
);
info
->
arg
[
1
]
=
nv_ro32
(
bios
,
vmap
+
0x0c
);
info
->
arg
[
2
]
=
nv_ro32
(
bios
,
vmap
+
0x10
);
break
;
case
0x20
:
info
->
unk0
=
nv_ro08
(
bios
,
vmap
+
0x00
);
info
->
link
=
nv_ro08
(
bios
,
vmap
+
0x01
);
info
->
min
=
nv_ro32
(
bios
,
vmap
+
0x02
);
info
->
max
=
nv_ro32
(
bios
,
vmap
+
0x06
);
info
->
arg
[
0
]
=
nv_ro32
(
bios
,
vmap
+
0x0a
);
info
->
arg
[
1
]
=
nv_ro32
(
bios
,
vmap
+
0x0e
);
info
->
arg
[
2
]
=
nv_ro32
(
bios
,
vmap
+
0x12
);
info
->
arg
[
3
]
=
nv_ro32
(
bios
,
vmap
+
0x16
);
info
->
arg
[
4
]
=
nv_ro32
(
bios
,
vmap
+
0x1a
);
info
->
arg
[
5
]
=
nv_ro32
(
bios
,
vmap
+
0x1e
);
break
;
}
return
vmap
;
}
drivers/gpu/drm/nouveau/core/subdev/bios/volt.c
0 → 100644
浏览文件 @
0833428e
/*
* Copyright 2012 Nouveau Community
*
* 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: Martin Peres
*/
#include <subdev/bios.h>
#include <subdev/bios/bit.h>
#include <subdev/bios/volt.h>
u16
nvbios_volt_table
(
struct
nouveau_bios
*
bios
,
u8
*
ver
,
u8
*
hdr
,
u8
*
cnt
,
u8
*
len
)
{
struct
bit_entry
bit_P
;
u16
volt
=
0x0000
;
if
(
!
bit_entry
(
bios
,
'P'
,
&
bit_P
))
{
if
(
bit_P
.
version
==
2
)
volt
=
nv_ro16
(
bios
,
bit_P
.
offset
+
0x0c
);
else
if
(
bit_P
.
version
==
1
)
volt
=
nv_ro16
(
bios
,
bit_P
.
offset
+
0x10
);
if
(
volt
)
{
*
ver
=
nv_ro08
(
bios
,
volt
+
0
);
switch
(
*
ver
)
{
case
0x12
:
*
hdr
=
5
;
*
cnt
=
nv_ro08
(
bios
,
volt
+
2
);
*
len
=
nv_ro08
(
bios
,
volt
+
1
);
return
volt
;
case
0x20
:
*
hdr
=
nv_ro08
(
bios
,
volt
+
1
);
*
cnt
=
nv_ro08
(
bios
,
volt
+
2
);
*
len
=
nv_ro08
(
bios
,
volt
+
3
);
return
volt
;
case
0x30
:
case
0x40
:
case
0x50
:
*
hdr
=
nv_ro08
(
bios
,
volt
+
1
);
*
cnt
=
nv_ro08
(
bios
,
volt
+
3
);
*
len
=
nv_ro08
(
bios
,
volt
+
2
);
return
volt
;
}
}
}
return
0x0000
;
}
u16
nvbios_volt_parse
(
struct
nouveau_bios
*
bios
,
u8
*
ver
,
u8
*
hdr
,
u8
*
cnt
,
u8
*
len
,
struct
nvbios_volt
*
info
)
{
u16
volt
=
nvbios_volt_table
(
bios
,
ver
,
hdr
,
cnt
,
len
);
memset
(
info
,
0x00
,
sizeof
(
*
info
));
switch
(
!!
volt
*
*
ver
)
{
case
0x12
:
info
->
vidmask
=
nv_ro08
(
bios
,
volt
+
0x04
);
break
;
case
0x20
:
info
->
vidmask
=
nv_ro08
(
bios
,
volt
+
0x05
);
break
;
case
0x30
:
info
->
vidmask
=
nv_ro08
(
bios
,
volt
+
0x04
);
break
;
case
0x40
:
info
->
base
=
nv_ro32
(
bios
,
volt
+
0x04
);
info
->
step
=
nv_ro16
(
bios
,
volt
+
0x08
);
info
->
vidmask
=
nv_ro08
(
bios
,
volt
+
0x0b
);
/*XXX*/
info
->
min
=
0
;
info
->
max
=
info
->
base
;
break
;
case
0x50
:
info
->
vidmask
=
nv_ro08
(
bios
,
volt
+
0x06
);
info
->
min
=
nv_ro32
(
bios
,
volt
+
0x0a
);
info
->
max
=
nv_ro32
(
bios
,
volt
+
0x0e
);
info
->
base
=
nv_ro32
(
bios
,
volt
+
0x12
)
&
0x00ffffff
;
info
->
step
=
nv_ro16
(
bios
,
volt
+
0x16
);
break
;
}
return
volt
;
}
u16
nvbios_volt_entry
(
struct
nouveau_bios
*
bios
,
int
idx
,
u8
*
ver
,
u8
*
len
)
{
u8
hdr
,
cnt
;
u16
volt
=
nvbios_volt_table
(
bios
,
ver
,
&
hdr
,
&
cnt
,
len
);
if
(
volt
&&
idx
<
cnt
)
{
volt
=
volt
+
hdr
+
(
idx
*
*
len
);
return
volt
;
}
return
0x0000
;
}
u16
nvbios_volt_entry_parse
(
struct
nouveau_bios
*
bios
,
int
idx
,
u8
*
ver
,
u8
*
len
,
struct
nvbios_volt_entry
*
info
)
{
u16
volt
=
nvbios_volt_entry
(
bios
,
idx
,
ver
,
len
);
memset
(
info
,
0x00
,
sizeof
(
*
info
));
switch
(
!!
volt
*
*
ver
)
{
case
0x12
:
case
0x20
:
info
->
voltage
=
nv_ro08
(
bios
,
volt
+
0x00
)
*
10000
;
info
->
vid
=
nv_ro08
(
bios
,
volt
+
0x01
);
break
;
case
0x30
:
info
->
voltage
=
nv_ro08
(
bios
,
volt
+
0x00
)
*
10000
;
info
->
vid
=
nv_ro08
(
bios
,
volt
+
0x01
)
>>
2
;
break
;
case
0x40
:
case
0x50
:
break
;
}
return
volt
;
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录