Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
0833428e
Commit
0833428e
authored
Jan 15, 2013
by
Ben Skeggs
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
drm/nouveau/bios: parsing for various tables required for power management
Signed-off-by:
Ben Skeggs
<
bskeggs@redhat.com
>
parent
aa4d7a4d
Changes
16
Show whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
969 additions
and
8 deletions
+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
No files found.
drivers/gpu/drm/nouveau/Makefile
View file @
0833428e
...
@@ -28,7 +28,9 @@ nouveau-y += core/subdev/bar/nv50.o
...
@@ -28,7 +28,9 @@ nouveau-y += core/subdev/bar/nv50.o
nouveau-y
+=
core/subdev/bar/nvc0.o
nouveau-y
+=
core/subdev/bar/nvc0.o
nouveau-y
+=
core/subdev/bios/base.o
nouveau-y
+=
core/subdev/bios/base.o
nouveau-y
+=
core/subdev/bios/bit.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/conn.o
nouveau-y
+=
core/subdev/bios/cstep.o
nouveau-y
+=
core/subdev/bios/dcb.o
nouveau-y
+=
core/subdev/bios/dcb.o
nouveau-y
+=
core/subdev/bios/disp.o
nouveau-y
+=
core/subdev/bios/disp.o
nouveau-y
+=
core/subdev/bios/dp.o
nouveau-y
+=
core/subdev/bios/dp.o
...
@@ -39,7 +41,11 @@ nouveau-y += core/subdev/bios/init.o
...
@@ -39,7 +41,11 @@ nouveau-y += core/subdev/bios/init.o
nouveau-y
+=
core/subdev/bios/mxm.o
nouveau-y
+=
core/subdev/bios/mxm.o
nouveau-y
+=
core/subdev/bios/perf.o
nouveau-y
+=
core/subdev/bios/perf.o
nouveau-y
+=
core/subdev/bios/pll.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/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/bios/xpio.o
nouveau-y
+=
core/subdev/bus/nv04.o
nouveau-y
+=
core/subdev/bus/nv04.o
nouveau-y
+=
core/subdev/bus/nv31.o
nouveau-y
+=
core/subdev/bus/nv31.o
...
...
drivers/gpu/drm/nouveau/core/include/subdev/bios/boost.h
0 → 100644
View file @
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
View file @
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
View file @
0833428e
...
@@ -7,7 +7,15 @@ enum dcb_gpio_func_name {
...
@@ -7,7 +7,15 @@ enum dcb_gpio_func_name {
DCB_GPIO_TVDAC1
=
0x2d
,
DCB_GPIO_TVDAC1
=
0x2d
,
DCB_GPIO_FAN
=
0x09
,
DCB_GPIO_FAN
=
0x09
,
DCB_GPIO_FAN_SENSE
=
0x3d
,
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
#define DCB_GPIO_LOG_DIR 0x02
...
...
drivers/gpu/drm/nouveau/core/include/subdev/bios/perf.h
View file @
0833428e
...
@@ -3,6 +3,39 @@
...
@@ -3,6 +3,39 @@
struct
nouveau_bios
;
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
{
struct
nvbios_perf_fan
{
u32
pwm_divisor
;
u32
pwm_divisor
;
};
};
...
...
drivers/gpu/drm/nouveau/core/include/subdev/bios/rammap.h
0 → 100644
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
0833428e
...
@@ -26,8 +26,9 @@
...
@@ -26,8 +26,9 @@
#include <subdev/bios/bit.h>
#include <subdev/bios/bit.h>
#include <subdev/bios/perf.h>
#include <subdev/bios/perf.h>
static
u16
u16
perf_table
(
struct
nouveau_bios
*
bios
,
u8
*
ver
,
u8
*
hdr
,
u8
*
cnt
,
u8
*
len
)
nvbios_perf_table
(
struct
nouveau_bios
*
bios
,
u8
*
ver
,
u8
*
hdr
,
u8
*
cnt
,
u8
*
len
,
u8
*
snr
,
u8
*
ssz
)
{
{
struct
bit_entry
bit_P
;
struct
bit_entry
bit_P
;
u16
perf
=
0x0000
;
u16
perf
=
0x0000
;
...
@@ -38,10 +39,22 @@ perf_table(struct nouveau_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len)
...
@@ -38,10 +39,22 @@ perf_table(struct nouveau_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len)
if
(
perf
)
{
if
(
perf
)
{
*
ver
=
nv_ro08
(
bios
,
perf
+
0
);
*
ver
=
nv_ro08
(
bios
,
perf
+
0
);
*
hdr
=
nv_ro08
(
bios
,
perf
+
1
);
*
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
}
else
nv_error
(
bios
,
"unknown offset for perf in BIT P %d
\n
"
,
if
(
*
ver
>=
0x20
&&
*
ver
<
0x40
)
{
bit_P
.
version
);
*
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
;
}
}
}
}
}
if
(
bios
->
bmp_offset
)
{
if
(
bios
->
bmp_offset
)
{
...
@@ -50,19 +63,132 @@ perf_table(struct nouveau_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len)
...
@@ -50,19 +63,132 @@ perf_table(struct nouveau_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len)
if
(
perf
)
{
if
(
perf
)
{
*
hdr
=
nv_ro08
(
bios
,
perf
+
0
);
*
hdr
=
nv_ro08
(
bios
,
perf
+
0
);
*
ver
=
nv_ro08
(
bios
,
perf
+
1
);
*
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
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
int
nvbios_perf_fan_parse
(
struct
nouveau_bios
*
bios
,
nvbios_perf_fan_parse
(
struct
nouveau_bios
*
bios
,
struct
nvbios_perf_fan
*
fan
)
struct
nvbios_perf_fan
*
fan
)
{
{
u8
ver
=
0
,
hdr
=
0
,
cnt
=
0
,
len
=
0
;
u8
ver
,
hdr
,
cnt
,
len
,
snr
,
ssz
;
u16
perf
=
perf_table
(
bios
,
&
ver
,
&
hdr
,
&
cnt
,
&
len
);
u16
perf
=
nvbios_perf_table
(
bios
,
&
ver
,
&
hdr
,
&
cnt
,
&
len
,
&
snr
,
&
ssz
);
if
(
!
perf
)
if
(
!
perf
)
return
-
ENODEV
;
return
-
ENODEV
;
...
...
drivers/gpu/drm/nouveau/core/subdev/bios/rammap.c
0 → 100644
View file @
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
View file @
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
View file @
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
View file @
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
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment