Commit e444de56 authored by Alexandre Courbot's avatar Alexandre Courbot Committed by Ben Skeggs

drm/nouveau/falcon: protect against concurrent DMEM accesses

The falcon library may be used concurrently, especially after the
introduction of the msgqueue interface. Make it safe to use it that way.
Signed-off-by: default avatarAlexandre Courbot <acourbot@nvidia.com>
Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 6bd4b523
...@@ -19,6 +19,7 @@ struct nvkm_falcon { ...@@ -19,6 +19,7 @@ struct nvkm_falcon {
u32 addr; u32 addr;
struct mutex mutex; struct mutex mutex;
struct mutex dmem_mutex;
const struct nvkm_subdev *user; const struct nvkm_subdev *user;
u8 version; u8 version;
......
...@@ -41,14 +41,22 @@ void ...@@ -41,14 +41,22 @@ void
nvkm_falcon_load_dmem(struct nvkm_falcon *falcon, void *data, u32 start, nvkm_falcon_load_dmem(struct nvkm_falcon *falcon, void *data, u32 start,
u32 size, u8 port) u32 size, u8 port)
{ {
mutex_lock(&falcon->dmem_mutex);
falcon->func->load_dmem(falcon, data, start, size, port); falcon->func->load_dmem(falcon, data, start, size, port);
mutex_unlock(&falcon->dmem_mutex);
} }
void void
nvkm_falcon_read_dmem(struct nvkm_falcon *falcon, u32 start, u32 size, u8 port, nvkm_falcon_read_dmem(struct nvkm_falcon *falcon, u32 start, u32 size, u8 port,
void *data) void *data)
{ {
mutex_lock(&falcon->dmem_mutex);
falcon->func->read_dmem(falcon, start, size, port, data); falcon->func->read_dmem(falcon, start, size, port, data);
mutex_unlock(&falcon->dmem_mutex);
} }
void void
...@@ -166,6 +174,7 @@ nvkm_falcon_ctor(const struct nvkm_falcon_func *func, ...@@ -166,6 +174,7 @@ nvkm_falcon_ctor(const struct nvkm_falcon_func *func,
falcon->name = name; falcon->name = name;
falcon->addr = addr; falcon->addr = addr;
mutex_init(&falcon->mutex); mutex_init(&falcon->mutex);
mutex_init(&falcon->dmem_mutex);
reg = nvkm_falcon_rd32(falcon, 0x12c); reg = nvkm_falcon_rd32(falcon, 0x12c);
falcon->version = reg & 0xf; falcon->version = reg & 0xf;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment