Commit 6f8dbcf1 authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/disp: provide hint to OR allocation about HDA requirements



Will be used by a subsequent commit to influence SOR allocation policy.

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 0ad679d1
Loading
Loading
Loading
Loading
+12 −5
Original line number Diff line number Diff line
@@ -277,7 +277,7 @@ nv50_outp_release(struct nouveau_encoder *nv_encoder)
}

static int
nv50_outp_acquire(struct nouveau_encoder *nv_encoder)
nv50_outp_acquire(struct nouveau_encoder *nv_encoder, bool hda)
{
	struct nouveau_drm *drm = nouveau_drm(nv_encoder->base.base.dev);
	struct nv50_disp *disp = nv50_disp(drm->dev);
@@ -289,6 +289,7 @@ nv50_outp_acquire(struct nouveau_encoder *nv_encoder)
		.base.method = NV50_DISP_MTHD_V1_ACQUIRE,
		.base.hasht  = nv_encoder->dcb->hasht,
		.base.hashm  = nv_encoder->dcb->hashm,
		.info.hda = hda,
	};
	int ret;

@@ -393,7 +394,7 @@ nv50_dac_enable(struct drm_encoder *encoder)
	struct nv50_head_atom *asyh = nv50_head_atom(nv_crtc->base.state);
	struct nv50_core *core = nv50_disp(encoder->dev)->core;

	nv50_outp_acquire(nv_encoder);
	nv50_outp_acquire(nv_encoder, false);

	core->func->dac->ctrl(core, nv_encoder->or, 1 << nv_crtc->index, asyh);
	asyh->or.depth = 0;
@@ -968,7 +969,7 @@ nv50_msto_enable(struct drm_encoder *encoder)
		DRM_DEBUG_KMS("Failed to allocate VCPI\n");

	if (!mstm->links++)
		nv50_outp_acquire(mstm->outp);
		nv50_outp_acquire(mstm->outp, false /*XXX: MST audio.*/);

	if (mstm->outp->link & 1)
		proto = 0x8;
@@ -1562,12 +1563,18 @@ nv50_sor_enable(struct drm_encoder *encoder)
	struct nouveau_drm *drm = nouveau_drm(dev);
	struct nouveau_connector *nv_connector;
	struct nvbios *bios = &drm->vbios;
	bool hda = false;
	u8 proto = 0xf;
	u8 depth = 0x0;

	nv_connector = nouveau_encoder_connector_get(nv_encoder);
	nv_encoder->crtc = encoder->crtc;
	nv50_outp_acquire(nv_encoder);

	if ((disp->disp->object.oclass == GT214_DISP ||
	     disp->disp->object.oclass >= GF110_DISP) &&
	    drm_detect_monitor_audio(nv_connector->edid))
		hda = true;
	nv50_outp_acquire(nv_encoder, hda);

	switch (nv_encoder->dcb->type) {
	case DCB_OUTPUT_TMDS:
@@ -1777,7 +1784,7 @@ nv50_pior_enable(struct drm_encoder *encoder)
	u8 owner = 1 << nv_crtc->index;
	u8 proto;

	nv50_outp_acquire(nv_encoder);
	nv50_outp_acquire(nv_encoder, false);

	switch (asyh->or.bpc) {
	case 10: asyh->or.depth = 0x6; break;
+2 −1
Original line number Diff line number Diff line
@@ -46,7 +46,8 @@ struct nv50_disp_acquire_v0 {
	__u8  version;
	__u8  or;
	__u8  link;
	__u8  pad03[5];
	__u8  hda;
	__u8  pad04[4];
};

struct nv50_disp_dac_load_v0 {
+1 −1
Original line number Diff line number Diff line
@@ -112,7 +112,7 @@ nvkm_outp_acquire_ior(struct nvkm_outp *outp, u8 user, struct nvkm_ior *ior)
}

int
nvkm_outp_acquire(struct nvkm_outp *outp, u8 user)
nvkm_outp_acquire(struct nvkm_outp *outp, u8 user, bool hda)
{
	struct nvkm_ior *ior = outp->ior;
	enum nvkm_ior_proto proto;
+1 −1
Original line number Diff line number Diff line
@@ -32,7 +32,7 @@ int nvkm_outp_new(struct nvkm_disp *, int index, struct dcb_output *,
void nvkm_outp_del(struct nvkm_outp **);
void nvkm_outp_init(struct nvkm_outp *);
void nvkm_outp_fini(struct nvkm_outp *);
int nvkm_outp_acquire(struct nvkm_outp *, u8 user);
int nvkm_outp_acquire(struct nvkm_outp *, u8 user, bool hda);
void nvkm_outp_release(struct nvkm_outp *, u8 user);
void nvkm_outp_route(struct nvkm_disp *);

+2 −2
Original line number Diff line number Diff line
@@ -99,7 +99,7 @@ nv50_disp_root_mthd_(struct nvkm_object *object, u32 mthd, void *data, u32 size)
		} *args = data;
		int ret = -ENOSYS;
		if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, false))) {
			ret = nvkm_outp_acquire(outp, NVKM_OUTP_USER);
			ret = nvkm_outp_acquire(outp, NVKM_OUTP_USER, args->v0.hda);
			if (ret == 0) {
				args->v0.or = outp->ior->id;
				args->v0.link = outp->ior->asy.link;
@@ -119,7 +119,7 @@ nv50_disp_root_mthd_(struct nvkm_object *object, u32 mthd, void *data, u32 size)
		if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, false))) {
			if (args->v0.data & 0xfff00000)
				return -EINVAL;
			ret = nvkm_outp_acquire(outp, NVKM_OUTP_PRIV);
			ret = nvkm_outp_acquire(outp, NVKM_OUTP_PRIV, false);
			if (ret)
				return ret;
			ret = outp->ior->func->sense(outp->ior, args->v0.data);