|
@@ -33,40 +33,6 @@
|
|
|
#include <nvif/cl5070.h>
|
|
|
#include <nvif/unpack.h>
|
|
|
|
|
|
-int
|
|
|
-nv50_disp_root_scanoutpos(NV50_DISP_MTHD_V0)
|
|
|
-{
|
|
|
- struct nvkm_device *device = disp->base.engine.subdev.device;
|
|
|
- const u32 blanke = nvkm_rd32(device, 0x610aec + (head * 0x540));
|
|
|
- const u32 blanks = nvkm_rd32(device, 0x610af4 + (head * 0x540));
|
|
|
- const u32 total = nvkm_rd32(device, 0x610afc + (head * 0x540));
|
|
|
- union {
|
|
|
- struct nv50_disp_scanoutpos_v0 v0;
|
|
|
- } *args = data;
|
|
|
- int ret = -ENOSYS;
|
|
|
-
|
|
|
- nvif_ioctl(object, "disp scanoutpos size %d\n", size);
|
|
|
- if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, false))) {
|
|
|
- nvif_ioctl(object, "disp scanoutpos vers %d\n",
|
|
|
- args->v0.version);
|
|
|
- args->v0.vblanke = (blanke & 0xffff0000) >> 16;
|
|
|
- args->v0.hblanke = (blanke & 0x0000ffff);
|
|
|
- args->v0.vblanks = (blanks & 0xffff0000) >> 16;
|
|
|
- args->v0.hblanks = (blanks & 0x0000ffff);
|
|
|
- args->v0.vtotal = ( total & 0xffff0000) >> 16;
|
|
|
- args->v0.htotal = ( total & 0x0000ffff);
|
|
|
- args->v0.time[0] = ktime_to_ns(ktime_get());
|
|
|
- args->v0.vline = /* vline read locks hline */
|
|
|
- nvkm_rd32(device, 0x616340 + (head * 0x800)) & 0xffff;
|
|
|
- args->v0.time[1] = ktime_to_ns(ktime_get());
|
|
|
- args->v0.hline =
|
|
|
- nvkm_rd32(device, 0x616344 + (head * 0x800)) & 0xffff;
|
|
|
- } else
|
|
|
- return ret;
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
static int
|
|
|
nv50_disp_root_mthd_(struct nvkm_object *object, u32 mthd, void *data, u32 size)
|
|
|
{
|
|
@@ -78,8 +44,9 @@ nv50_disp_root_mthd_(struct nvkm_object *object, u32 mthd, void *data, u32 size)
|
|
|
struct nv50_disp *disp = root->disp;
|
|
|
const struct nv50_disp_func *func = disp->func;
|
|
|
struct nvkm_outp *temp, *outp = NULL;
|
|
|
+ struct nvkm_head *head;
|
|
|
u16 type, mask = 0;
|
|
|
- int head, ret = -ENOSYS;
|
|
|
+ int hidx, ret = -ENOSYS;
|
|
|
|
|
|
if (mthd != NV50_DISP_MTHD)
|
|
|
return -EINVAL;
|
|
@@ -89,7 +56,7 @@ nv50_disp_root_mthd_(struct nvkm_object *object, u32 mthd, void *data, u32 size)
|
|
|
nvif_ioctl(object, "disp mthd vers %d mthd %02x head %d\n",
|
|
|
args->v0.version, args->v0.method, args->v0.head);
|
|
|
mthd = args->v0.method;
|
|
|
- head = args->v0.head;
|
|
|
+ hidx = args->v0.head;
|
|
|
} else
|
|
|
if (!(ret = nvif_unpack(ret, &data, &size, args->v1, 1, 1, true))) {
|
|
|
nvif_ioctl(object, "disp mthd vers %d mthd %02x "
|
|
@@ -99,11 +66,11 @@ nv50_disp_root_mthd_(struct nvkm_object *object, u32 mthd, void *data, u32 size)
|
|
|
mthd = args->v1.method;
|
|
|
type = args->v1.hasht;
|
|
|
mask = args->v1.hashm;
|
|
|
- head = ffs((mask >> 8) & 0x0f) - 1;
|
|
|
+ hidx = ffs((mask >> 8) & 0x0f) - 1;
|
|
|
} else
|
|
|
return ret;
|
|
|
|
|
|
- if (!nvkm_head_find(&disp->base, head))
|
|
|
+ if (!(head = nvkm_head_find(&disp->base, hidx)))
|
|
|
return -ENXIO;
|
|
|
|
|
|
if (mask) {
|
|
@@ -119,27 +86,28 @@ nv50_disp_root_mthd_(struct nvkm_object *object, u32 mthd, void *data, u32 size)
|
|
|
}
|
|
|
|
|
|
switch (mthd) {
|
|
|
- case NV50_DISP_SCANOUTPOS:
|
|
|
- return func->head.scanoutpos(object, disp, data, size, head);
|
|
|
+ case NV50_DISP_SCANOUTPOS: {
|
|
|
+ return nvkm_head_mthd_scanoutpos(object, head, data, size);
|
|
|
+ }
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
switch (mthd * !!outp) {
|
|
|
case NV50_DISP_MTHD_V1_DAC_PWR:
|
|
|
- return func->dac.power(object, disp, data, size, head, outp);
|
|
|
+ return func->dac.power(object, disp, data, size, hidx, outp);
|
|
|
case NV50_DISP_MTHD_V1_DAC_LOAD:
|
|
|
- return func->dac.sense(object, disp, data, size, head, outp);
|
|
|
+ return func->dac.sense(object, disp, data, size, hidx, outp);
|
|
|
case NV50_DISP_MTHD_V1_SOR_PWR:
|
|
|
- return func->sor.power(object, disp, data, size, head, outp);
|
|
|
+ return func->sor.power(object, disp, data, size, hidx, outp);
|
|
|
case NV50_DISP_MTHD_V1_SOR_HDA_ELD:
|
|
|
if (!func->sor.hda_eld)
|
|
|
return -ENODEV;
|
|
|
- return func->sor.hda_eld(object, disp, data, size, head, outp);
|
|
|
+ return func->sor.hda_eld(object, disp, data, size, hidx, outp);
|
|
|
case NV50_DISP_MTHD_V1_SOR_HDMI_PWR:
|
|
|
if (!func->sor.hdmi)
|
|
|
return -ENODEV;
|
|
|
- return func->sor.hdmi(object, disp, data, size, head, outp);
|
|
|
+ return func->sor.hdmi(object, disp, data, size, hidx, outp);
|
|
|
case NV50_DISP_MTHD_V1_SOR_LVDS_SCRIPT: {
|
|
|
union {
|
|
|
struct nv50_disp_sor_lvds_script_v0 v0;
|
|
@@ -215,7 +183,7 @@ nv50_disp_root_mthd_(struct nvkm_object *object, u32 mthd, void *data, u32 size)
|
|
|
args->v0.aligned_pbn);
|
|
|
if (!outpdp->func->vcpi)
|
|
|
return -ENODEV;
|
|
|
- outpdp->func->vcpi(outpdp, head, args->v0.start_slot,
|
|
|
+ outpdp->func->vcpi(outpdp, hidx, args->v0.start_slot,
|
|
|
args->v0.num_slots, args->v0.pbn,
|
|
|
args->v0.aligned_pbn);
|
|
|
return 0;
|
|
@@ -226,7 +194,7 @@ nv50_disp_root_mthd_(struct nvkm_object *object, u32 mthd, void *data, u32 size)
|
|
|
case NV50_DISP_MTHD_V1_PIOR_PWR:
|
|
|
if (!func->pior.power)
|
|
|
return -ENODEV;
|
|
|
- return func->pior.power(object, disp, data, size, head, outp);
|
|
|
+ return func->pior.power(object, disp, data, size, hidx, outp);
|
|
|
default:
|
|
|
break;
|
|
|
}
|