Martin Peres
2013-Aug-31 00:06 UTC
[Nouveau] [PATCH] drm/nouveau/therm: ack any pending IRQ at init v2
From: Martin Peres <martin.peres at labri.fr>
This is safe because ptherm hasn't been configured yet and will be a
little further down the initialization path. Ptherm should be safe
regarding to runtime reconfiguration.
v2:
- do not limit this patch to nv84-a3 and make it nv84+
Signed-off-by: Martin Peres <martin.peres at labri.fr>
---
drivers/gpu/drm/nouveau/core/subdev/therm/nv84.c | 19 ++++++++++++++++++-
drivers/gpu/drm/nouveau/core/subdev/therm/nva3.c | 4 ++++
drivers/gpu/drm/nouveau/core/subdev/therm/nvd0.c | 4 ++++
3 files changed, 26 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/nouveau/core/subdev/therm/nv84.c
b/drivers/gpu/drm/nouveau/core/subdev/therm/nv84.c
index 42ba633..8615d62 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/therm/nv84.c
+++ b/drivers/gpu/drm/nouveau/core/subdev/therm/nv84.c
@@ -209,13 +209,30 @@ nv84_therm_ctor(struct nouveau_object *parent,
return nouveau_therm_preinit(&priv->base.base);
}
+static int
+nv84_therm_init(struct nouveau_object *object)
+{
+ struct nv84_therm_priv *priv = (void *)object;
+ int ret;
+
+ ret = nouveau_therm_init(&priv->base.base);
+ if (ret)
+ return ret;
+
+ /* ACK ptherm IRQs */
+ nv_wr32(object, 0x20100, 0xffffffff);
+ nv_wr32(object, 0x1100, 0x10000); /* PBUS */
+
+ return 0;
+}
+
struct nouveau_oclass
nv84_therm_oclass = {
.handle = NV_SUBDEV(THERM, 0x84),
.ofuncs = &(struct nouveau_ofuncs) {
.ctor = nv84_therm_ctor,
.dtor = _nouveau_therm_dtor,
- .init = _nouveau_therm_init,
+ .init = nv84_therm_init,
.fini = _nouveau_therm_fini,
},
};
diff --git a/drivers/gpu/drm/nouveau/core/subdev/therm/nva3.c
b/drivers/gpu/drm/nouveau/core/subdev/therm/nva3.c
index d11a7c4..f740eeb 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/therm/nva3.c
+++ b/drivers/gpu/drm/nouveau/core/subdev/therm/nva3.c
@@ -60,6 +60,10 @@ nva3_therm_init(struct nouveau_object *object)
}
nv_mask(priv, 0x00e720, 0x00000002, 0x00000000);
+ /* ACK ptherm IRQs */
+ nv_wr32(object, 0x20100, 0xffffffff);
+ nv_wr32(object, 0x1100, 0x10000); /* PBUS */
+
return 0;
}
diff --git a/drivers/gpu/drm/nouveau/core/subdev/therm/nvd0.c
b/drivers/gpu/drm/nouveau/core/subdev/therm/nvd0.c
index 54c28bd..d9b5103 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/therm/nvd0.c
+++ b/drivers/gpu/drm/nouveau/core/subdev/therm/nvd0.c
@@ -114,6 +114,10 @@ nvd0_therm_init(struct nouveau_object *object)
}
nv_mask(priv, 0x00e720, 0x00000002, 0x00000000);
+ /* ACK ptherm IRQs */
+ nv_wr32(object, 0x20100, 0xffffffff);
+ nv_wr32(object, 0x1100, 0x10000); /* PBUS */
+
return 0;
}
--
1.8.4
Ben Skeggs
2013-Sep-04 01:52 UTC
[Nouveau] [PATCH] drm/nouveau/therm: ack any pending IRQ at init v2
On Sat, Aug 31, 2013 at 10:06 AM, Martin Peres <martin.peres at free.fr> wrote:> From: Martin Peres <martin.peres at labri.fr> > > This is safe because ptherm hasn't been configured yet and will be a > little further down the initialization path. Ptherm should be safe > regarding to runtime reconfiguration.Any objections to instead sticking the ACK in a single fini() hook (along with additional code to disable all therm interrupts), and having the IRQ handle silently ignore any non-requested IRQs (see what the copy engine irq handler does, for example)? Ben.> > v2: > - do not limit this patch to nv84-a3 and make it nv84+ > > Signed-off-by: Martin Peres <martin.peres at labri.fr> > --- > drivers/gpu/drm/nouveau/core/subdev/therm/nv84.c | 19 ++++++++++++++++++- > drivers/gpu/drm/nouveau/core/subdev/therm/nva3.c | 4 ++++ > drivers/gpu/drm/nouveau/core/subdev/therm/nvd0.c | 4 ++++ > 3 files changed, 26 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/nouveau/core/subdev/therm/nv84.c b/drivers/gpu/drm/nouveau/core/subdev/therm/nv84.c > index 42ba633..8615d62 100644 > --- a/drivers/gpu/drm/nouveau/core/subdev/therm/nv84.c > +++ b/drivers/gpu/drm/nouveau/core/subdev/therm/nv84.c > @@ -209,13 +209,30 @@ nv84_therm_ctor(struct nouveau_object *parent, > return nouveau_therm_preinit(&priv->base.base); > } > > +static int > +nv84_therm_init(struct nouveau_object *object) > +{ > + struct nv84_therm_priv *priv = (void *)object; > + int ret; > + > + ret = nouveau_therm_init(&priv->base.base); > + if (ret) > + return ret; > + > + /* ACK ptherm IRQs */ > + nv_wr32(object, 0x20100, 0xffffffff); > + nv_wr32(object, 0x1100, 0x10000); /* PBUS */ > + > + return 0; > +} > + > struct nouveau_oclass > nv84_therm_oclass = { > .handle = NV_SUBDEV(THERM, 0x84), > .ofuncs = &(struct nouveau_ofuncs) { > .ctor = nv84_therm_ctor, > .dtor = _nouveau_therm_dtor, > - .init = _nouveau_therm_init, > + .init = nv84_therm_init, > .fini = _nouveau_therm_fini, > }, > }; > diff --git a/drivers/gpu/drm/nouveau/core/subdev/therm/nva3.c b/drivers/gpu/drm/nouveau/core/subdev/therm/nva3.c > index d11a7c4..f740eeb 100644 > --- a/drivers/gpu/drm/nouveau/core/subdev/therm/nva3.c > +++ b/drivers/gpu/drm/nouveau/core/subdev/therm/nva3.c > @@ -60,6 +60,10 @@ nva3_therm_init(struct nouveau_object *object) > } > nv_mask(priv, 0x00e720, 0x00000002, 0x00000000); > > + /* ACK ptherm IRQs */ > + nv_wr32(object, 0x20100, 0xffffffff); > + nv_wr32(object, 0x1100, 0x10000); /* PBUS */ > + > return 0; > } > > diff --git a/drivers/gpu/drm/nouveau/core/subdev/therm/nvd0.c b/drivers/gpu/drm/nouveau/core/subdev/therm/nvd0.c > index 54c28bd..d9b5103 100644 > --- a/drivers/gpu/drm/nouveau/core/subdev/therm/nvd0.c > +++ b/drivers/gpu/drm/nouveau/core/subdev/therm/nvd0.c > @@ -114,6 +114,10 @@ nvd0_therm_init(struct nouveau_object *object) > } > nv_mask(priv, 0x00e720, 0x00000002, 0x00000000); > > + /* ACK ptherm IRQs */ > + nv_wr32(object, 0x20100, 0xffffffff); > + nv_wr32(object, 0x1100, 0x10000); /* PBUS */ > + > return 0; > } > > -- > 1.8.4 > > _______________________________________________ > Nouveau mailing list > Nouveau at lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/nouveau
Martin Peres
2013-Sep-08 22:44 UTC
[Nouveau] [PATCH] drm/nouveau/therm: ack any pending IRQ at init v2
On 04/09/2013 03:52, Ben Skeggs wrote:> On Sat, Aug 31, 2013 at 10:06 AM, Martin Peres <martin.peres at free.fr> wrote: >> From: Martin Peres <martin.peres at labri.fr> >> >> This is safe because ptherm hasn't been configured yet and will be a >> little further down the initialization path. Ptherm should be safe >> regarding to runtime reconfiguration. > Any objections to instead sticking the ACK in a single fini() hook > (along with additional code to disable all therm interrupts), and > having the IRQ handle silently ignore any non-requested IRQs (see what > the copy engine irq handler does, for example)? > > Ben.Hi Ben, Sorry for the late answer. This all perfectly make sense. Please have a look at the patches I've just sent.
Reasonably Related Threads
- [PATCH] drm/nouveau/therm: ack any pending IRQ at init v2
- [PATCH 1/2] drm/nouveau/therm: ack any pending IRQ at init
- [PATCH 2/2] drm/nv84/therm: ack any pending IRQ at init
- [PATCH 1/2] drm/nouveau/bios/therm: handle vbioses with duplicate entries (mostly nva5)
- [PATCH 3/3] gm107/therm: add PWM fan support