Karol Herbst
2018-Jul-17 10:17 UTC
[Nouveau] [PATCH 4/5] drm/nouveau: Grab RPM ref when i2c bus is in use
mhh, we shouldn't call to Linux APIs from within of nvkm. Rather gaurd the Linux glue code to the i2c stuff instead, but this is all done from inside of nvkm. I think we should move it out into drm/nouveau/nouveau_i2c.c and do the handling there. On Tue, Jul 17, 2018 at 1:59 AM, Lyude Paul <lyude at redhat.com> wrote:> The i2c bus can be both accessed by DRM itself, along with any of it's > devnodes (/sys/class/i2c). So, we need to make sure that all codepaths > using the i2c bus keep the GPU resumed. > > Signed-off-by: Lyude Paul <lyude at redhat.com> > Cc: Karol Herbst <karolherbst at gmail.com> > Cc: stable at vger.kernel.org > --- > drivers/gpu/drm/nouveau/nvkm/subdev/i2c/bus.c | 12 +++++++++++- > 1 file changed, 11 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/bus.c b/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/bus.c > index 807a2b67bd64..1de48c990b80 100644 > --- a/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/bus.c > +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/bus.c > @@ -119,18 +119,28 @@ nvkm_i2c_bus_release(struct nvkm_i2c_bus *bus) > BUS_TRACE(bus, "release"); > nvkm_i2c_pad_release(pad); > mutex_unlock(&bus->mutex); > + pm_runtime_put_autosuspend(pad->i2c->subdev.device->dev); > } > > int > nvkm_i2c_bus_acquire(struct nvkm_i2c_bus *bus) > { > struct nvkm_i2c_pad *pad = bus->pad; > + struct device *dev = pad->i2c->subdev.device->dev; > int ret; > + > BUS_TRACE(bus, "acquire"); > + > + ret = pm_runtime_get_sync(dev); > + if (ret < 0 && ret != -EACCES) > + return ret; > + > mutex_lock(&bus->mutex); > ret = nvkm_i2c_pad_acquire(pad, NVKM_I2C_PAD_I2C); > - if (ret) > + if (ret) { > mutex_unlock(&bus->mutex); > + pm_runtime_put_autosuspend(dev); > + } > return ret; > } > > -- > 2.17.1 > > _______________________________________________ > Nouveau mailing list > Nouveau at lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/nouveau
Ben Skeggs
2018-Jul-17 11:54 UTC
[Nouveau] [PATCH 4/5] drm/nouveau: Grab RPM ref when i2c bus is in use
On Tue, 17 Jul 2018 at 20:18, Karol Herbst <kherbst at redhat.com> wrote:> > mhh, we shouldn't call to Linux APIs from within of nvkm. Rather gaurd > the Linux glue code to the i2c stuff instead, but this is all done > from inside of nvkm. I think we should move it out into > drm/nouveau/nouveau_i2c.c and do the handling there.Huh? No, this is completely fine.> > On Tue, Jul 17, 2018 at 1:59 AM, Lyude Paul <lyude at redhat.com> wrote: > > The i2c bus can be both accessed by DRM itself, along with any of it's > > devnodes (/sys/class/i2c). So, we need to make sure that all codepaths > > using the i2c bus keep the GPU resumed. > > > > Signed-off-by: Lyude Paul <lyude at redhat.com> > > Cc: Karol Herbst <karolherbst at gmail.com> > > Cc: stable at vger.kernel.org > > --- > > drivers/gpu/drm/nouveau/nvkm/subdev/i2c/bus.c | 12 +++++++++++- > > 1 file changed, 11 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/bus.c b/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/bus.c > > index 807a2b67bd64..1de48c990b80 100644 > > --- a/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/bus.c > > +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/bus.c > > @@ -119,18 +119,28 @@ nvkm_i2c_bus_release(struct nvkm_i2c_bus *bus) > > BUS_TRACE(bus, "release"); > > nvkm_i2c_pad_release(pad); > > mutex_unlock(&bus->mutex); > > + pm_runtime_put_autosuspend(pad->i2c->subdev.device->dev); > > } > > > > int > > nvkm_i2c_bus_acquire(struct nvkm_i2c_bus *bus) > > { > > struct nvkm_i2c_pad *pad = bus->pad; > > + struct device *dev = pad->i2c->subdev.device->dev; > > int ret; > > + > > BUS_TRACE(bus, "acquire"); > > + > > + ret = pm_runtime_get_sync(dev); > > + if (ret < 0 && ret != -EACCES) > > + return ret; > > + > > mutex_lock(&bus->mutex); > > ret = nvkm_i2c_pad_acquire(pad, NVKM_I2C_PAD_I2C); > > - if (ret) > > + if (ret) { > > mutex_unlock(&bus->mutex); > > + pm_runtime_put_autosuspend(dev); > > + } > > return ret; > > } > > > > -- > > 2.17.1 > > > > _______________________________________________ > > Nouveau mailing list > > Nouveau at lists.freedesktop.org > > https://lists.freedesktop.org/mailman/listinfo/nouveau > _______________________________________________ > Nouveau mailing list > Nouveau at lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/nouveau
Karol Herbst
2018-Jul-17 12:10 UTC
[Nouveau] [PATCH 4/5] drm/nouveau: Grab RPM ref when i2c bus is in use
On Tue, Jul 17, 2018 at 1:54 PM, Ben Skeggs <skeggsb at gmail.com> wrote:> On Tue, 17 Jul 2018 at 20:18, Karol Herbst <kherbst at redhat.com> wrote: >> >> mhh, we shouldn't call to Linux APIs from within of nvkm. Rather gaurd >> the Linux glue code to the i2c stuff instead, but this is all done >> from inside of nvkm. I think we should move it out into >> drm/nouveau/nouveau_i2c.c and do the handling there. > Huh? No, this is completely fine. >okay, then the the two patches adding that guard code is reviewed-by me>> >> On Tue, Jul 17, 2018 at 1:59 AM, Lyude Paul <lyude at redhat.com> wrote: >> > The i2c bus can be both accessed by DRM itself, along with any of it's >> > devnodes (/sys/class/i2c). So, we need to make sure that all codepaths >> > using the i2c bus keep the GPU resumed. >> > >> > Signed-off-by: Lyude Paul <lyude at redhat.com> >> > Cc: Karol Herbst <karolherbst at gmail.com> >> > Cc: stable at vger.kernel.org >> > --- >> > drivers/gpu/drm/nouveau/nvkm/subdev/i2c/bus.c | 12 +++++++++++- >> > 1 file changed, 11 insertions(+), 1 deletion(-) >> > >> > diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/bus.c b/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/bus.c >> > index 807a2b67bd64..1de48c990b80 100644 >> > --- a/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/bus.c >> > +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/bus.c >> > @@ -119,18 +119,28 @@ nvkm_i2c_bus_release(struct nvkm_i2c_bus *bus) >> > BUS_TRACE(bus, "release"); >> > nvkm_i2c_pad_release(pad); >> > mutex_unlock(&bus->mutex); >> > + pm_runtime_put_autosuspend(pad->i2c->subdev.device->dev); >> > } >> > >> > int >> > nvkm_i2c_bus_acquire(struct nvkm_i2c_bus *bus) >> > { >> > struct nvkm_i2c_pad *pad = bus->pad; >> > + struct device *dev = pad->i2c->subdev.device->dev; >> > int ret; >> > + >> > BUS_TRACE(bus, "acquire"); >> > + >> > + ret = pm_runtime_get_sync(dev); >> > + if (ret < 0 && ret != -EACCES) >> > + return ret; >> > + >> > mutex_lock(&bus->mutex); >> > ret = nvkm_i2c_pad_acquire(pad, NVKM_I2C_PAD_I2C); >> > - if (ret) >> > + if (ret) { >> > mutex_unlock(&bus->mutex); >> > + pm_runtime_put_autosuspend(dev); >> > + } >> > return ret; >> > } >> > >> > -- >> > 2.17.1 >> > >> > _______________________________________________ >> > Nouveau mailing list >> > Nouveau at lists.freedesktop.org >> > https://lists.freedesktop.org/mailman/listinfo/nouveau >> _______________________________________________ >> Nouveau mailing list >> Nouveau at lists.freedesktop.org >> https://lists.freedesktop.org/mailman/listinfo/nouveau
Reasonably Related Threads
- [PATCH 4/5] drm/nouveau: Grab RPM ref when i2c bus is in use
- [PATCH 4/5] drm/nouveau: Grab RPM ref when i2c bus is in use
- [PATCH v2] drm/nouveau/i2c: Disable i2c bus access after ->fini()
- [PATCH] drm/nouveau/i2c: Disable i2c bus access after ->fini()
- [PATCH v2] drm/nouveau/i2c: Disable i2c bus access after ->fini()