Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0df18246 authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/disp/nv50-: port OR manual sink detection to nvkm_ior



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 9c5753bc
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ static const struct nvkm_ior_func
gf119_dac = {
	.state = gf119_dac_state,
	.power = nv50_dac_power,
	.sense = nv50_dac_sense,
};

int
+8 −39
Original line number Diff line number Diff line
@@ -22,15 +22,10 @@
 * Authors: Ben Skeggs
 */
#include "ior.h"
#include "nv50.h"
#include "outp.h"

#include <core/client.h>
#include <subdev/timer.h>

#include <nvif/cl5070.h>
#include <nvif/unpack.h>

static const struct nvkm_output_func
nv50_dac_output_func = {
};
@@ -44,50 +39,23 @@ nv50_dac_output_new(struct nvkm_disp *disp, int index,
}

int
nv50_dac_sense(NV50_DISP_MTHD_V1)
nv50_dac_sense(struct nvkm_ior *dac, u32 loadval)
{
	struct nvkm_subdev *subdev = &disp->base.engine.subdev;
	struct nvkm_device *device = subdev->device;
	union {
		struct nv50_disp_dac_load_v0 v0;
	} *args = data;
	const u32 doff = outp->or * 0x800;
	u32 loadval;
	int ret = -ENOSYS;

	nvif_ioctl(object, "disp dac load size %d\n", size);
	if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, false))) {
		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;

	nvkm_mask(device, 0x61a004 + doff, 0x807f0000, 0x80150000);
	nvkm_msec(device, 2000,
		if (!(nvkm_rd32(device, 0x61a004 + doff) & 0x80000000))
			break;
	);
	struct nvkm_device *device = dac->disp->engine.subdev.device;
	const u32 doff = nv50_ior_base(dac);

	dac->func->power(dac, false, true, false, false, false);

	nvkm_wr32(device, 0x61a00c + doff, 0x00100000 | loadval);
	mdelay(9);
	udelay(500);
	loadval = nvkm_mask(device, 0x61a00c + doff, 0xffffffff, 0x00000000);

	nvkm_mask(device, 0x61a004 + doff, 0x807f0000, 0x80550000);
	nvkm_msec(device, 2000,
		if (!(nvkm_rd32(device, 0x61a004 + doff) & 0x80000000))
			break;
	);

	nvkm_debug(subdev, "DAC%d sense: %08x\n", outp->or, loadval);
	dac->func->power(dac, false, false, false, false, false);
	if (!(loadval & 0x80000000))
		return -ETIMEDOUT;

	args->v0.load = (loadval & 0x38000000) >> 27;
	return 0;
	return (loadval & 0x38000000) >> 27;
}

static void
@@ -139,6 +107,7 @@ static const struct nvkm_ior_func
nv50_dac = {
	.state = nv50_dac_state,
	.power = nv50_dac_power,
	.sense = nv50_dac_sense,
};

int
+1 −3
Original line number Diff line number Diff line
@@ -38,9 +38,7 @@ g84_disp = {
	.outp.internal.lvds = nv50_sor_output_new,
	.outp.external.tmds = nv50_pior_output_new,
	.outp.external.dp = nv50_pior_dp_new,
	.dac.nr = 3,
	.dac.new = nv50_dac_new,
	.dac.sense = nv50_dac_sense,
	.dac = { .nr = 3, .new = nv50_dac_new },
	.sor.nr = 2,
	.sor.new = g84_sor_new,
	.sor.hdmi = g84_hdmi_ctrl,
+1 −3
Original line number Diff line number Diff line
@@ -39,9 +39,7 @@ g94_disp = {
	.outp.internal.dp = g94_sor_dp_new,
	.outp.external.tmds = nv50_pior_output_new,
	.outp.external.dp = nv50_pior_dp_new,
	.dac.nr = 3,
	.dac.new = nv50_dac_new,
	.dac.sense = nv50_dac_sense,
	.dac = { .nr = 3, .new = nv50_dac_new },
	.sor.nr = 4,
	.sor.new = g94_sor_new,
	.sor.hdmi = g84_hdmi_ctrl,
+1 −3
Original line number Diff line number Diff line
@@ -506,9 +506,7 @@ gf119_disp = {
	.outp.internal.tmds = nv50_sor_output_new,
	.outp.internal.lvds = nv50_sor_output_new,
	.outp.internal.dp = gf119_sor_dp_new,
	.dac.nr = 3,
	.dac.new = gf119_dac_new,
	.dac.sense = nv50_dac_sense,
	.dac = { .nr = 3, .new = gf119_dac_new },
	.sor.nr = 4,
	.sor.new = gf119_sor_new,
	.sor.hda_eld = gf119_hda_eld,
Loading