mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-23 13:23:56 +08:00
drm/nouveau/imem: separate suspend/resume backup handling into their own functions
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
parent
71370e620a
commit
d52ddc953e
@ -28,6 +28,36 @@
|
||||
/******************************************************************************
|
||||
* instmem object base implementation
|
||||
*****************************************************************************/
|
||||
static void
|
||||
nvkm_instobj_load(struct nvkm_instobj *iobj)
|
||||
{
|
||||
struct nvkm_memory *memory = &iobj->memory;
|
||||
const u64 size = nvkm_memory_size(memory);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < size; i += 4)
|
||||
nvkm_wo32(memory, i, iobj->suspend[i / 4]);
|
||||
vfree(iobj->suspend);
|
||||
iobj->suspend = NULL;
|
||||
}
|
||||
|
||||
static int
|
||||
nvkm_instobj_save(struct nvkm_instobj *iobj)
|
||||
{
|
||||
struct nvkm_memory *memory = &iobj->memory;
|
||||
const u64 size = nvkm_memory_size(memory);
|
||||
int i;
|
||||
|
||||
iobj->suspend = vmalloc(size);
|
||||
if (!iobj->suspend)
|
||||
return -ENOMEM;
|
||||
|
||||
for (i = 0; i < size; i += 4)
|
||||
iobj->suspend[i / 4] = nvkm_ro32(memory, i);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
nvkm_instobj_dtor(struct nvkm_instmem *imem, struct nvkm_instobj *iobj)
|
||||
{
|
||||
@ -104,23 +134,30 @@ nvkm_instmem_fini(struct nvkm_subdev *subdev, bool suspend)
|
||||
{
|
||||
struct nvkm_instmem *imem = nvkm_instmem(subdev);
|
||||
struct nvkm_instobj *iobj;
|
||||
int i;
|
||||
|
||||
if (suspend) {
|
||||
list_for_each_entry(iobj, &imem->list, head) {
|
||||
int ret = nvkm_instobj_save(iobj);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
if (imem->func->fini)
|
||||
imem->func->fini(imem);
|
||||
|
||||
if (suspend) {
|
||||
list_for_each_entry(iobj, &imem->list, head) {
|
||||
struct nvkm_memory *memory = &iobj->memory;
|
||||
u64 size = nvkm_memory_size(memory);
|
||||
return 0;
|
||||
}
|
||||
|
||||
iobj->suspend = vmalloc(size);
|
||||
if (!iobj->suspend)
|
||||
return -ENOMEM;
|
||||
static int
|
||||
nvkm_instmem_init(struct nvkm_subdev *subdev)
|
||||
{
|
||||
struct nvkm_instmem *imem = nvkm_instmem(subdev);
|
||||
struct nvkm_instobj *iobj;
|
||||
|
||||
for (i = 0; i < size; i += 4)
|
||||
iobj->suspend[i / 4] = nvkm_ro32(memory, i);
|
||||
}
|
||||
list_for_each_entry(iobj, &imem->list, head) {
|
||||
if (iobj->suspend)
|
||||
nvkm_instobj_load(iobj);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -135,27 +172,6 @@ nvkm_instmem_oneinit(struct nvkm_subdev *subdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
nvkm_instmem_init(struct nvkm_subdev *subdev)
|
||||
{
|
||||
struct nvkm_instmem *imem = nvkm_instmem(subdev);
|
||||
struct nvkm_instobj *iobj;
|
||||
int i;
|
||||
|
||||
list_for_each_entry(iobj, &imem->list, head) {
|
||||
if (iobj->suspend) {
|
||||
struct nvkm_memory *memory = &iobj->memory;
|
||||
u64 size = nvkm_memory_size(memory);
|
||||
for (i = 0; i < size; i += 4)
|
||||
nvkm_wo32(memory, i, iobj->suspend[i / 4]);
|
||||
vfree(iobj->suspend);
|
||||
iobj->suspend = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void *
|
||||
nvkm_instmem_dtor(struct nvkm_subdev *subdev)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user