These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / gpu / drm / nouveau / nvkm / engine / disp / dacnv50.c
index 0f7d1ec..9bfa9e7 100644 (file)
@@ -33,6 +33,7 @@
 int
 nv50_dac_power(NV50_DISP_MTHD_V1)
 {
+       struct nvkm_device *device = disp->base.engine.subdev.device;
        const u32 doff = outp->or * 0x800;
        union {
                struct nv50_disp_dac_pwr_v0 v0;
@@ -40,12 +41,12 @@ nv50_dac_power(NV50_DISP_MTHD_V1)
        u32 stat;
        int ret;
 
-       nv_ioctl(object, "disp dac pwr size %d\n", size);
+       nvif_ioctl(object, "disp dac pwr size %d\n", size);
        if (nvif_unpack(args->v0, 0, 0, false)) {
-               nv_ioctl(object, "disp dac pwr vers %d state %d data %d "
-                                "vsync %d hsync %d\n",
-                        args->v0.version, args->v0.state, args->v0.data,
-                        args->v0.vsync, args->v0.hsync);
+               nvif_ioctl(object, "disp dac pwr vers %d state %d data %d "
+                                  "vsync %d hsync %d\n",
+                          args->v0.version, args->v0.state, args->v0.data,
+                          args->v0.vsync, args->v0.hsync);
                stat  = 0x00000040 * !args->v0.state;
                stat |= 0x00000010 * !args->v0.data;
                stat |= 0x00000004 * !args->v0.vsync;
@@ -53,15 +54,23 @@ nv50_dac_power(NV50_DISP_MTHD_V1)
        } else
                return ret;
 
-       nv_wait(priv, 0x61a004 + doff, 0x80000000, 0x00000000);
-       nv_mask(priv, 0x61a004 + doff, 0xc000007f, 0x80000000 | stat);
-       nv_wait(priv, 0x61a004 + doff, 0x80000000, 0x00000000);
+       nvkm_msec(device, 2000,
+               if (!(nvkm_rd32(device, 0x61a004 + doff) & 0x80000000))
+                       break;
+       );
+       nvkm_mask(device, 0x61a004 + doff, 0xc000007f, 0x80000000 | stat);
+       nvkm_msec(device, 2000,
+               if (!(nvkm_rd32(device, 0x61a004 + doff) & 0x80000000))
+                       break;
+       );
        return 0;
 }
 
 int
 nv50_dac_sense(NV50_DISP_MTHD_V1)
 {
+       struct nvkm_subdev *subdev = &disp->base.engine.subdev;
+       struct nvkm_device *device = subdev->device;
        union {
                struct nv50_disp_dac_load_v0 v0;
        } *args = data;
@@ -69,31 +78,49 @@ nv50_dac_sense(NV50_DISP_MTHD_V1)
        u32 loadval;
        int ret;
 
-       nv_ioctl(object, "disp dac load size %d\n", size);
+       nvif_ioctl(object, "disp dac load size %d\n", size);
        if (nvif_unpack(args->v0, 0, 0, false)) {
-               nv_ioctl(object, "disp dac load vers %d data %08x\n",
-                        args->v0.version, args->v0.data);
+               nvif_ioctl(object, "disp dac load vers %d data %08x\n",
+                          args->v0.version, args->v0.data);
                if (args->v0.data & 0xfff00000)
                        return -EINVAL;
                loadval = args->v0.data;
        } else
                return ret;
 
-       nv_mask(priv, 0x61a004 + doff, 0x807f0000, 0x80150000);
-       nv_wait(priv, 0x61a004 + doff, 0x80000000, 0x00000000);
+       nvkm_mask(device, 0x61a004 + doff, 0x807f0000, 0x80150000);
+       nvkm_msec(device, 2000,
+               if (!(nvkm_rd32(device, 0x61a004 + doff) & 0x80000000))
+                       break;
+       );
 
-       nv_wr32(priv, 0x61a00c + doff, 0x00100000 | loadval);
+       nvkm_wr32(device, 0x61a00c + doff, 0x00100000 | loadval);
        mdelay(9);
        udelay(500);
-       loadval = nv_mask(priv, 0x61a00c + doff, 0xffffffff, 0x00000000);
+       loadval = nvkm_mask(device, 0x61a00c + doff, 0xffffffff, 0x00000000);
 
-       nv_mask(priv, 0x61a004 + doff, 0x807f0000, 0x80550000);
-       nv_wait(priv, 0x61a004 + doff, 0x80000000, 0x00000000);
+       nvkm_mask(device, 0x61a004 + doff, 0x807f0000, 0x80550000);
+       nvkm_msec(device, 2000,
+               if (!(nvkm_rd32(device, 0x61a004 + doff) & 0x80000000))
+                       break;
+       );
 
-       nv_debug(priv, "DAC%d sense: 0x%08x\n", outp->or, loadval);
+       nvkm_debug(subdev, "DAC%d sense: %08x\n", outp->or, loadval);
        if (!(loadval & 0x80000000))
                return -ETIMEDOUT;
 
        args->v0.load = (loadval & 0x38000000) >> 27;
        return 0;
 }
+
+static const struct nvkm_output_func
+nv50_dac_output_func = {
+};
+
+int
+nv50_dac_output_new(struct nvkm_disp *disp, int index,
+                   struct dcb_output *dcbE, struct nvkm_output **poutp)
+{
+       return nvkm_output_new_(&nv50_dac_output_func, disp,
+                               index, dcbE, poutp);
+}