Commit 1f0c9eaf authored by Ben Skeggs's avatar Ben Skeggs

drm/nouveau/disp/nv50-: implement a common supervisor 2.1

This makes use of all the additional routing and state added in previous
commits, making it possible to deal with GM20x macro link routing, while
also sharing code between the NV50 and GF119 implementations.
Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent d52e948c
...@@ -138,17 +138,6 @@ exec_clkcmp(struct nv50_disp *disp, int head, int id, u32 pclk, u32 *conf) ...@@ -138,17 +138,6 @@ exec_clkcmp(struct nv50_disp *disp, int head, int id, u32 pclk, u32 *conf)
return outp; return outp;
} }
static void
gf119_disp_intr_unk2_1(struct nv50_disp *disp, int head)
{
struct nvkm_device *device = disp->base.engine.subdev.device;
struct nvkm_devinit *devinit = device->devinit;
u32 pclk = nvkm_rd32(device, 0x660450 + (head * 0x300)) / 1000;
if (pclk)
nvkm_devinit_pll_set(devinit, PLL_VPLL0 + head, pclk);
nvkm_wr32(device, 0x612200 + (head * 0x800), 0x00000000);
}
static void static void
gf119_disp_intr_unk2_2_tu(struct nv50_disp *disp, int head, gf119_disp_intr_unk2_2_tu(struct nv50_disp *disp, int head,
struct dcb_output *outp) struct dcb_output *outp)
...@@ -260,6 +249,7 @@ gf119_disp_intr_unk2_2(struct nv50_disp *disp, int head) ...@@ -260,6 +249,7 @@ gf119_disp_intr_unk2_2(struct nv50_disp *disp, int head)
} }
nvkm_mask(device, addr, 0x00000707, data); nvkm_mask(device, addr, 0x00000707, data);
nvkm_wr32(device, 0x612200 + (head * 0x800), 0x00000000);
} }
static void static void
...@@ -307,8 +297,7 @@ gf119_disp_super(struct work_struct *work) ...@@ -307,8 +297,7 @@ gf119_disp_super(struct work_struct *work)
list_for_each_entry(head, &disp->base.head, head) { list_for_each_entry(head, &disp->base.head, head) {
if (!(mask[head->id] & 0x00010000)) if (!(mask[head->id] & 0x00010000))
continue; continue;
nvkm_debug(subdev, "supervisor 2.1 - head %d\n", head->id); nv50_disp_super_2_1(disp, head);
gf119_disp_intr_unk2_1(disp, head->id);
} }
list_for_each_entry(head, &disp->base.head, head) { list_for_each_entry(head, &disp->base.head, head) {
if (!(mask[head->id] & 0x00001000)) if (!(mask[head->id] & 0x00001000))
......
...@@ -532,14 +532,14 @@ nv50_disp_intr_unk20_2(struct nv50_disp *disp, int head) ...@@ -532,14 +532,14 @@ nv50_disp_intr_unk20_2(struct nv50_disp *disp, int head)
nv50_disp_dptmds_war_2(disp, &outp->info); nv50_disp_dptmds_war_2(disp, &outp->info);
} }
static void void
nv50_disp_intr_unk20_1(struct nv50_disp *disp, int head) nv50_disp_super_2_1(struct nv50_disp *disp, struct nvkm_head *head)
{ {
struct nvkm_device *device = disp->base.engine.subdev.device; struct nvkm_devinit *devinit = disp->base.engine.subdev.device->devinit;
struct nvkm_devinit *devinit = device->devinit; u32 khz = head->asy.hz / 1000;
u32 pclk = nvkm_rd32(device, 0x610ad0 + (head * 0x540)) & 0x3fffff; HEAD_DBG(head, "supervisor 2.1 - %d khz", khz);
if (pclk) if (khz)
nvkm_devinit_pll_set(devinit, PLL_VPLL0 + head, pclk); nvkm_devinit_pll_set(devinit, PLL_VPLL0 + head->id, khz);
} }
void void
...@@ -631,7 +631,7 @@ nv50_disp_super(struct work_struct *work) ...@@ -631,7 +631,7 @@ nv50_disp_super(struct work_struct *work)
list_for_each_entry(head, &disp->base.head, head) { list_for_each_entry(head, &disp->base.head, head) {
if (!(super & (0x00000200 << head->id))) if (!(super & (0x00000200 << head->id)))
continue; continue;
nv50_disp_intr_unk20_1(disp, head->id); nv50_disp_super_2_1(disp, head);
} }
list_for_each_entry(head, &disp->base.head, head) { list_for_each_entry(head, &disp->base.head, head) {
if (!(super & (0x00000080 << head->id))) if (!(super & (0x00000080 << head->id)))
......
...@@ -29,6 +29,7 @@ struct nv50_disp { ...@@ -29,6 +29,7 @@ struct nv50_disp {
void nv50_disp_super_1(struct nv50_disp *); void nv50_disp_super_1(struct nv50_disp *);
void nv50_disp_super_1_0(struct nv50_disp *, struct nvkm_head *); void nv50_disp_super_1_0(struct nv50_disp *, struct nvkm_head *);
void nv50_disp_super_2_0(struct nv50_disp *, struct nvkm_head *); void nv50_disp_super_2_0(struct nv50_disp *, struct nvkm_head *);
void nv50_disp_super_2_1(struct nv50_disp *, struct nvkm_head *);
int nv50_disp_new_(const struct nv50_disp_func *, struct nvkm_device *, int nv50_disp_new_(const struct nv50_disp_func *, struct nvkm_device *,
int index, int heads, struct nvkm_disp **); int index, int heads, struct nvkm_disp **);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment