提交 2bfa7482 编写于 作者: B Ben Skeggs

drm/nv40/pm: fix issues on igp chipsets, which don't have memory

Signed-off-by: NBen Skeggs <bskeggs@redhat.com>
上级 ef5ced4b
...@@ -57,12 +57,14 @@ read_pll_2(struct drm_device *dev, u32 reg) ...@@ -57,12 +57,14 @@ read_pll_2(struct drm_device *dev, u32 reg)
int P = (ctrl & 0x00070000) >> 16; int P = (ctrl & 0x00070000) >> 16;
u32 ref = 27000, clk = 0; u32 ref = 27000, clk = 0;
if (ctrl & 0x80000000) if ((ctrl & 0x80000000) && M1) {
clk = ref * N1 / M1; clk = ref * N1 / M1;
if ((ctrl & 0x40000100) == 0x40000000) {
if (!(ctrl & 0x00000100)) { if (M2)
if (ctrl & 0x40000000)
clk = clk * N2 / M2; clk = clk * N2 / M2;
else
clk = 0;
}
} }
return clk >> P; return clk >> P;
...@@ -177,6 +179,11 @@ nv40_pm_clocks_pre(struct drm_device *dev, struct nouveau_pm_level *perflvl) ...@@ -177,6 +179,11 @@ nv40_pm_clocks_pre(struct drm_device *dev, struct nouveau_pm_level *perflvl)
} }
/* memory clock */ /* memory clock */
if (!perflvl->memory) {
info->mpll_ctrl = 0x00000000;
goto out;
}
ret = nv40_calc_pll(dev, 0x004020, &pll, perflvl->memory, ret = nv40_calc_pll(dev, 0x004020, &pll, perflvl->memory,
&N1, &M1, &N2, &M2, &log2P); &N1, &M1, &N2, &M2, &log2P);
if (ret < 0) if (ret < 0)
...@@ -264,6 +271,9 @@ nv40_pm_clocks_set(struct drm_device *dev, void *pre_state) ...@@ -264,6 +271,9 @@ nv40_pm_clocks_set(struct drm_device *dev, void *pre_state)
mdelay(5); mdelay(5);
nv_mask(dev, 0x00c040, 0x00000333, info->ctrl); nv_mask(dev, 0x00c040, 0x00000333, info->ctrl);
if (!info->mpll_ctrl)
goto resume;
/* wait for vblank start on active crtcs, disable memory access */ /* wait for vblank start on active crtcs, disable memory access */
for (i = 0; i < 2; i++) { for (i = 0; i < 2; i++) {
if (!(crtc_mask & (1 << i))) if (!(crtc_mask & (1 << i)))
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册