|
@@ -22,14 +22,14 @@
|
|
|
* Authors: Ben Skeggs
|
|
|
*/
|
|
|
|
|
|
-#include <subdev/clock.h>
|
|
|
+#include <subdev/clk.h>
|
|
|
#include <subdev/timer.h>
|
|
|
#include <subdev/bios.h>
|
|
|
#include <subdev/bios/pll.h>
|
|
|
|
|
|
#include "pll.h"
|
|
|
|
|
|
-struct nve0_clock_info {
|
|
|
+struct nve0_clk_info {
|
|
|
u32 freq;
|
|
|
u32 ssel;
|
|
|
u32 mdiv;
|
|
@@ -38,16 +38,16 @@ struct nve0_clock_info {
|
|
|
u32 coef;
|
|
|
};
|
|
|
|
|
|
-struct nve0_clock_priv {
|
|
|
- struct nouveau_clock base;
|
|
|
- struct nve0_clock_info eng[16];
|
|
|
+struct nve0_clk_priv {
|
|
|
+ struct nouveau_clk base;
|
|
|
+ struct nve0_clk_info eng[16];
|
|
|
};
|
|
|
|
|
|
-static u32 read_div(struct nve0_clock_priv *, int, u32, u32);
|
|
|
-static u32 read_pll(struct nve0_clock_priv *, u32);
|
|
|
+static u32 read_div(struct nve0_clk_priv *, int, u32, u32);
|
|
|
+static u32 read_pll(struct nve0_clk_priv *, u32);
|
|
|
|
|
|
static u32
|
|
|
-read_vco(struct nve0_clock_priv *priv, u32 dsrc)
|
|
|
+read_vco(struct nve0_clk_priv *priv, u32 dsrc)
|
|
|
{
|
|
|
u32 ssrc = nv_rd32(priv, dsrc);
|
|
|
if (!(ssrc & 0x00000100))
|
|
@@ -56,7 +56,7 @@ read_vco(struct nve0_clock_priv *priv, u32 dsrc)
|
|
|
}
|
|
|
|
|
|
static u32
|
|
|
-read_pll(struct nve0_clock_priv *priv, u32 pll)
|
|
|
+read_pll(struct nve0_clk_priv *priv, u32 pll)
|
|
|
{
|
|
|
u32 ctrl = nv_rd32(priv, pll + 0x00);
|
|
|
u32 coef = nv_rd32(priv, pll + 0x04);
|
|
@@ -101,7 +101,7 @@ read_pll(struct nve0_clock_priv *priv, u32 pll)
|
|
|
}
|
|
|
|
|
|
static u32
|
|
|
-read_div(struct nve0_clock_priv *priv, int doff, u32 dsrc, u32 dctl)
|
|
|
+read_div(struct nve0_clk_priv *priv, int doff, u32 dsrc, u32 dctl)
|
|
|
{
|
|
|
u32 ssrc = nv_rd32(priv, dsrc + (doff * 4));
|
|
|
u32 sctl = nv_rd32(priv, dctl + (doff * 4));
|
|
@@ -127,7 +127,7 @@ read_div(struct nve0_clock_priv *priv, int doff, u32 dsrc, u32 dctl)
|
|
|
}
|
|
|
|
|
|
static u32
|
|
|
-read_mem(struct nve0_clock_priv *priv)
|
|
|
+read_mem(struct nve0_clk_priv *priv)
|
|
|
{
|
|
|
switch (nv_rd32(priv, 0x1373f4) & 0x0000000f) {
|
|
|
case 1: return read_pll(priv, 0x132020);
|
|
@@ -138,7 +138,7 @@ read_mem(struct nve0_clock_priv *priv)
|
|
|
}
|
|
|
|
|
|
static u32
|
|
|
-read_clk(struct nve0_clock_priv *priv, int clk)
|
|
|
+read_clk(struct nve0_clk_priv *priv, int clk)
|
|
|
{
|
|
|
u32 sctl = nv_rd32(priv, 0x137250 + (clk * 4));
|
|
|
u32 sclk, sdiv;
|
|
@@ -181,10 +181,10 @@ read_clk(struct nve0_clock_priv *priv, int clk)
|
|
|
}
|
|
|
|
|
|
static int
|
|
|
-nve0_clock_read(struct nouveau_clock *clk, enum nv_clk_src src)
|
|
|
+nve0_clk_read(struct nouveau_clk *clk, enum nv_clk_src src)
|
|
|
{
|
|
|
struct nouveau_device *device = nv_device(clk);
|
|
|
- struct nve0_clock_priv *priv = (void *)clk;
|
|
|
+ struct nve0_clk_priv *priv = (void *)clk;
|
|
|
|
|
|
switch (src) {
|
|
|
case nv_clk_src_crystal:
|
|
@@ -214,7 +214,7 @@ nve0_clock_read(struct nouveau_clock *clk, enum nv_clk_src src)
|
|
|
}
|
|
|
|
|
|
static u32
|
|
|
-calc_div(struct nve0_clock_priv *priv, int clk, u32 ref, u32 freq, u32 *ddiv)
|
|
|
+calc_div(struct nve0_clk_priv *priv, int clk, u32 ref, u32 freq, u32 *ddiv)
|
|
|
{
|
|
|
u32 div = min((ref * 2) / freq, (u32)65);
|
|
|
if (div < 2)
|
|
@@ -225,7 +225,7 @@ calc_div(struct nve0_clock_priv *priv, int clk, u32 ref, u32 freq, u32 *ddiv)
|
|
|
}
|
|
|
|
|
|
static u32
|
|
|
-calc_src(struct nve0_clock_priv *priv, int clk, u32 freq, u32 *dsrc, u32 *ddiv)
|
|
|
+calc_src(struct nve0_clk_priv *priv, int clk, u32 freq, u32 *dsrc, u32 *ddiv)
|
|
|
{
|
|
|
u32 sclk;
|
|
|
|
|
@@ -254,7 +254,7 @@ calc_src(struct nve0_clock_priv *priv, int clk, u32 freq, u32 *dsrc, u32 *ddiv)
|
|
|
}
|
|
|
|
|
|
static u32
|
|
|
-calc_pll(struct nve0_clock_priv *priv, int clk, u32 freq, u32 *coef)
|
|
|
+calc_pll(struct nve0_clk_priv *priv, int clk, u32 freq, u32 *coef)
|
|
|
{
|
|
|
struct nouveau_bios *bios = nouveau_bios(priv);
|
|
|
struct nvbios_pll limits;
|
|
@@ -277,10 +277,10 @@ calc_pll(struct nve0_clock_priv *priv, int clk, u32 freq, u32 *coef)
|
|
|
}
|
|
|
|
|
|
static int
|
|
|
-calc_clk(struct nve0_clock_priv *priv,
|
|
|
+calc_clk(struct nve0_clk_priv *priv,
|
|
|
struct nouveau_cstate *cstate, int clk, int dom)
|
|
|
{
|
|
|
- struct nve0_clock_info *info = &priv->eng[clk];
|
|
|
+ struct nve0_clk_info *info = &priv->eng[clk];
|
|
|
u32 freq = cstate->domain[dom];
|
|
|
u32 src0, div0, div1D, div1P = 0;
|
|
|
u32 clk0, clk1 = 0;
|
|
@@ -329,9 +329,9 @@ calc_clk(struct nve0_clock_priv *priv,
|
|
|
}
|
|
|
|
|
|
static int
|
|
|
-nve0_clock_calc(struct nouveau_clock *clk, struct nouveau_cstate *cstate)
|
|
|
+nve0_clk_calc(struct nouveau_clk *clk, struct nouveau_cstate *cstate)
|
|
|
{
|
|
|
- struct nve0_clock_priv *priv = (void *)clk;
|
|
|
+ struct nve0_clk_priv *priv = (void *)clk;
|
|
|
int ret;
|
|
|
|
|
|
if ((ret = calc_clk(priv, cstate, 0x00, nv_clk_src_gpc)) ||
|
|
@@ -347,9 +347,9 @@ nve0_clock_calc(struct nouveau_clock *clk, struct nouveau_cstate *cstate)
|
|
|
}
|
|
|
|
|
|
static void
|
|
|
-nve0_clock_prog_0(struct nve0_clock_priv *priv, int clk)
|
|
|
+nve0_clk_prog_0(struct nve0_clk_priv *priv, int clk)
|
|
|
{
|
|
|
- struct nve0_clock_info *info = &priv->eng[clk];
|
|
|
+ struct nve0_clk_info *info = &priv->eng[clk];
|
|
|
if (!info->ssel) {
|
|
|
nv_mask(priv, 0x1371d0 + (clk * 0x04), 0x8000003f, info->ddiv);
|
|
|
nv_wr32(priv, 0x137160 + (clk * 0x04), info->dsrc);
|
|
@@ -357,22 +357,22 @@ nve0_clock_prog_0(struct nve0_clock_priv *priv, int clk)
|
|
|
}
|
|
|
|
|
|
static void
|
|
|
-nve0_clock_prog_1_0(struct nve0_clock_priv *priv, int clk)
|
|
|
+nve0_clk_prog_1_0(struct nve0_clk_priv *priv, int clk)
|
|
|
{
|
|
|
nv_mask(priv, 0x137100, (1 << clk), 0x00000000);
|
|
|
nv_wait(priv, 0x137100, (1 << clk), 0x00000000);
|
|
|
}
|
|
|
|
|
|
static void
|
|
|
-nve0_clock_prog_1_1(struct nve0_clock_priv *priv, int clk)
|
|
|
+nve0_clk_prog_1_1(struct nve0_clk_priv *priv, int clk)
|
|
|
{
|
|
|
nv_mask(priv, 0x137160 + (clk * 0x04), 0x00000100, 0x00000000);
|
|
|
}
|
|
|
|
|
|
static void
|
|
|
-nve0_clock_prog_2(struct nve0_clock_priv *priv, int clk)
|
|
|
+nve0_clk_prog_2(struct nve0_clk_priv *priv, int clk)
|
|
|
{
|
|
|
- struct nve0_clock_info *info = &priv->eng[clk];
|
|
|
+ struct nve0_clk_info *info = &priv->eng[clk];
|
|
|
const u32 addr = 0x137000 + (clk * 0x20);
|
|
|
nv_mask(priv, addr + 0x00, 0x00000004, 0x00000000);
|
|
|
nv_mask(priv, addr + 0x00, 0x00000001, 0x00000000);
|
|
@@ -385,9 +385,9 @@ nve0_clock_prog_2(struct nve0_clock_priv *priv, int clk)
|
|
|
}
|
|
|
|
|
|
static void
|
|
|
-nve0_clock_prog_3(struct nve0_clock_priv *priv, int clk)
|
|
|
+nve0_clk_prog_3(struct nve0_clk_priv *priv, int clk)
|
|
|
{
|
|
|
- struct nve0_clock_info *info = &priv->eng[clk];
|
|
|
+ struct nve0_clk_info *info = &priv->eng[clk];
|
|
|
if (info->ssel)
|
|
|
nv_mask(priv, 0x137250 + (clk * 0x04), 0x00003f00, info->mdiv);
|
|
|
else
|
|
@@ -395,9 +395,9 @@ nve0_clock_prog_3(struct nve0_clock_priv *priv, int clk)
|
|
|
}
|
|
|
|
|
|
static void
|
|
|
-nve0_clock_prog_4_0(struct nve0_clock_priv *priv, int clk)
|
|
|
+nve0_clk_prog_4_0(struct nve0_clk_priv *priv, int clk)
|
|
|
{
|
|
|
- struct nve0_clock_info *info = &priv->eng[clk];
|
|
|
+ struct nve0_clk_info *info = &priv->eng[clk];
|
|
|
if (info->ssel) {
|
|
|
nv_mask(priv, 0x137100, (1 << clk), info->ssel);
|
|
|
nv_wait(priv, 0x137100, (1 << clk), info->ssel);
|
|
@@ -405,9 +405,9 @@ nve0_clock_prog_4_0(struct nve0_clock_priv *priv, int clk)
|
|
|
}
|
|
|
|
|
|
static void
|
|
|
-nve0_clock_prog_4_1(struct nve0_clock_priv *priv, int clk)
|
|
|
+nve0_clk_prog_4_1(struct nve0_clk_priv *priv, int clk)
|
|
|
{
|
|
|
- struct nve0_clock_info *info = &priv->eng[clk];
|
|
|
+ struct nve0_clk_info *info = &priv->eng[clk];
|
|
|
if (info->ssel) {
|
|
|
nv_mask(priv, 0x137160 + (clk * 0x04), 0x40000000, 0x40000000);
|
|
|
nv_mask(priv, 0x137160 + (clk * 0x04), 0x00000100, 0x00000100);
|
|
@@ -415,20 +415,20 @@ nve0_clock_prog_4_1(struct nve0_clock_priv *priv, int clk)
|
|
|
}
|
|
|
|
|
|
static int
|
|
|
-nve0_clock_prog(struct nouveau_clock *clk)
|
|
|
+nve0_clk_prog(struct nouveau_clk *clk)
|
|
|
{
|
|
|
- struct nve0_clock_priv *priv = (void *)clk;
|
|
|
+ struct nve0_clk_priv *priv = (void *)clk;
|
|
|
struct {
|
|
|
u32 mask;
|
|
|
- void (*exec)(struct nve0_clock_priv *, int);
|
|
|
+ void (*exec)(struct nve0_clk_priv *, int);
|
|
|
} stage[] = {
|
|
|
- { 0x007f, nve0_clock_prog_0 }, /* div programming */
|
|
|
- { 0x007f, nve0_clock_prog_1_0 }, /* select div mode */
|
|
|
- { 0xff80, nve0_clock_prog_1_1 },
|
|
|
- { 0x00ff, nve0_clock_prog_2 }, /* (maybe) program pll */
|
|
|
- { 0xff80, nve0_clock_prog_3 }, /* final divider */
|
|
|
- { 0x007f, nve0_clock_prog_4_0 }, /* (maybe) select pll mode */
|
|
|
- { 0xff80, nve0_clock_prog_4_1 },
|
|
|
+ { 0x007f, nve0_clk_prog_0 }, /* div programming */
|
|
|
+ { 0x007f, nve0_clk_prog_1_0 }, /* select div mode */
|
|
|
+ { 0xff80, nve0_clk_prog_1_1 },
|
|
|
+ { 0x00ff, nve0_clk_prog_2 }, /* (maybe) program pll */
|
|
|
+ { 0xff80, nve0_clk_prog_3 }, /* final divider */
|
|
|
+ { 0x007f, nve0_clk_prog_4_0 }, /* (maybe) select pll mode */
|
|
|
+ { 0xff80, nve0_clk_prog_4_1 },
|
|
|
};
|
|
|
int i, j;
|
|
|
|
|
@@ -446,13 +446,13 @@ nve0_clock_prog(struct nouveau_clock *clk)
|
|
|
}
|
|
|
|
|
|
static void
|
|
|
-nve0_clock_tidy(struct nouveau_clock *clk)
|
|
|
+nve0_clk_tidy(struct nouveau_clk *clk)
|
|
|
{
|
|
|
- struct nve0_clock_priv *priv = (void *)clk;
|
|
|
+ struct nve0_clk_priv *priv = (void *)clk;
|
|
|
memset(priv->eng, 0x00, sizeof(priv->eng));
|
|
|
}
|
|
|
|
|
|
-static struct nouveau_clocks
|
|
|
+static struct nouveau_domain
|
|
|
nve0_domain[] = {
|
|
|
{ nv_clk_src_crystal, 0xff },
|
|
|
{ nv_clk_src_href , 0xff },
|
|
@@ -468,33 +468,33 @@ nve0_domain[] = {
|
|
|
};
|
|
|
|
|
|
static int
|
|
|
-nve0_clock_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
|
|
|
+nve0_clk_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
|
|
|
struct nouveau_oclass *oclass, void *data, u32 size,
|
|
|
struct nouveau_object **pobject)
|
|
|
{
|
|
|
- struct nve0_clock_priv *priv;
|
|
|
+ struct nve0_clk_priv *priv;
|
|
|
int ret;
|
|
|
|
|
|
- ret = nouveau_clock_create(parent, engine, oclass, nve0_domain, NULL, 0,
|
|
|
+ ret = nouveau_clk_create(parent, engine, oclass, nve0_domain, NULL, 0,
|
|
|
true, &priv);
|
|
|
*pobject = nv_object(priv);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
- priv->base.read = nve0_clock_read;
|
|
|
- priv->base.calc = nve0_clock_calc;
|
|
|
- priv->base.prog = nve0_clock_prog;
|
|
|
- priv->base.tidy = nve0_clock_tidy;
|
|
|
+ priv->base.read = nve0_clk_read;
|
|
|
+ priv->base.calc = nve0_clk_calc;
|
|
|
+ priv->base.prog = nve0_clk_prog;
|
|
|
+ priv->base.tidy = nve0_clk_tidy;
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
struct nouveau_oclass
|
|
|
-nve0_clock_oclass = {
|
|
|
- .handle = NV_SUBDEV(CLOCK, 0xe0),
|
|
|
+nve0_clk_oclass = {
|
|
|
+ .handle = NV_SUBDEV(CLK, 0xe0),
|
|
|
.ofuncs = &(struct nouveau_ofuncs) {
|
|
|
- .ctor = nve0_clock_ctor,
|
|
|
- .dtor = _nouveau_clock_dtor,
|
|
|
- .init = _nouveau_clock_init,
|
|
|
- .fini = _nouveau_clock_fini,
|
|
|
+ .ctor = nve0_clk_ctor,
|
|
|
+ .dtor = _nouveau_clk_dtor,
|
|
|
+ .init = _nouveau_clk_init,
|
|
|
+ .fini = _nouveau_clk_fini,
|
|
|
},
|
|
|
};
|