[RFC 13/16] drm/nouveau/ibus: add GK20A support (original) (raw)

Ilia Mirkin imirkin at alum.mit.edu
Sat Feb 1 22:35:22 PST 2014


Some very trivial comments below:

On Fri, Jan 31, 2014 at 10:16 PM, Alexandre Courbot <acourbot at nvidia.com> wrote:

Add support for initializing the priv ring of GK20A. This is done by the BIOS on desktop GPUs, but needs to be done by hand on Tegra.

Signed-off-by: Alexandre Courbot <acourbot at nvidia.com> --- drivers/gpu/drm/nouveau/Makefile | 1 + drivers/gpu/drm/nouveau/core/include/subdev/ibus.h | 1 + drivers/gpu/drm/nouveau/core/subdev/ibus/nvea.c | 108 +++++++++++++++++++++ 3 files changed, 110 insertions(+) create mode 100644 drivers/gpu/drm/nouveau/core/subdev/ibus/nvea.c diff --git a/drivers/gpu/drm/nouveau/Makefile b/drivers/gpu/drm/nouveau/Makefile index 6c4b76d..3548fcd 100644 --- a/drivers/gpu/drm/nouveau/Makefile +++ b/drivers/gpu/drm/nouveau/Makefile @@ -132,6 +132,7 @@ nouveau-y += core/subdev/i2c/nv94.o nouveau-y += core/subdev/i2c/nvd0.o nouveau-y += core/subdev/ibus/nvc0.o nouveau-y += core/subdev/ibus/nve0.o +nouveau-y += core/subdev/ibus/nvea.o nouveau-y += core/subdev/instmem/base.o nouveau-y += core/subdev/instmem/nv04.o nouveau-y += core/subdev/instmem/nv40.o diff --git a/drivers/gpu/drm/nouveau/core/include/subdev/ibus.h b/drivers/gpu/drm/nouveau/core/include/subdev/ibus.h index 88814f1..056a42f 100644 --- a/drivers/gpu/drm/nouveau/core/include/subdev/ibus.h +++ b/drivers/gpu/drm/nouveau/core/include/subdev/ibus.h @@ -30,5 +30,6 @@ nouveauibus(void *obj) extern struct nouveauoclass nvc0ibusoclass; extern struct nouveauoclass nve0ibusoclass; +extern struct nouveauoclass nveaibusoclass; #endif diff --git a/drivers/gpu/drm/nouveau/core/subdev/ibus/nvea.c b/drivers/gpu/drm/nouveau/core/subdev/ibus/nvea.c new file mode 100644 index 0000000..0bcd281 --- /dev/null +++ b/drivers/gpu/drm/nouveau/core/subdev/ibus/nvea.c @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2014, NVIDIA Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + */ + +#include <subdev/ibus.h> + +struct nveaibuspriv { + struct nouveauibus base; +}; + +static void +nveaibusinitprivring(struct nveaibuspriv *priv) +{ + u32 data; + + data = nvrd32(priv, 0x137250); + data &= (~0x3f); + nvwr32(priv, 0x137250, data);

nv_mask(priv, 0x137250, 0x3f, 0) should do this, right?

+ + nvmask(priv, 0x000200, 0x20, 0); + udelay(20); + nvmask(priv, 0x000200, 0x20, 0x20); + + nvwr32(priv, 0x12004c, 0x4); + nvwr32(priv, 0x122204, 0x2); + nvrd32(priv, 0x122204); +} + +static void +nveaibusintr(struct nouveausubdev *subdev) +{ + struct nveaibuspriv *priv = (void *)subdev; + u32 status0 = nvrd32(priv, 0x120058); + s32 retry = 100; + u32 command; + + if (status0 & 0x7) { + nvdebug(priv, "resetting priv ring\n"); + nveaibusinitprivring(priv); + } + + /* Acknowledge interrupt */ + command = nvrd32(priv, 0x0012004c); + command |= 0x2; + nvwr32(priv, 0x0012004c, command);

nv_mask(priv, 0x12004c, 0x2, 0x2)

+ + while (--retry >= 0) { + command = nvrd32(priv, 0x12004c) & 0x3f; + if (command == 0) + break; + } + + if (retry < 0) + nvdebug(priv, "timeout waiting for ringmaster ack\n");

this sounds kinda bad, no? perhaps a nv_warn?

+} + +static int +nveaibusinit(struct nouveauobject *object) +{ + struct nveaibuspriv *priv = (void *)object; + int ret; + + ret = nouveauibusinit(object); + if (ret) + return ret; + + nveaibusinitprivring(priv); + + return 0; +} + +static int +nveaibusctor(struct nouveauobject *parent, struct nouveauobject *engine, + struct nouveauoclass *oclass, void *data, u32 size, + struct nouveauobject **pobject) +{ + struct nveaibuspriv *priv; + int ret; + + ret = nouveauibuscreate(parent, engine, oclass, &priv); + *pobject = nvobject(priv); + if (ret) + return ret; + + nvsubdev(priv)->intr = nveaibusintr; + return 0; +} + +struct nouveauoclass +nveaibusoclass = { + .handle = NVSUBDEV(IBUS, 0xea), + .ofuncs = &(struct nouveauofuncs) { + .ctor = nveaibusctor, + .dtor = nouveauibusdtor, + .init = nveaibusinit, + .fini = nouveauibusfini, + }, +}; -- 1.8.5.3

-- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo at vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/



More information about the dri-devel mailing list