Commit eec3f6df authored by Ben Skeggs's avatar Ben Skeggs

drm/nouveau/top: parse device topology right after devinit

We're going to want this information available earlier than it is now.
Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
Reviewed-by: default avatarLyude Paul <lyude@redhat.com>
parent ab4f75eb
...@@ -21,6 +21,7 @@ struct nvkm_top_device { ...@@ -21,6 +21,7 @@ struct nvkm_top_device {
struct list_head head; struct list_head head;
}; };
int nvkm_top_parse(struct nvkm_device *);
u32 nvkm_top_addr(struct nvkm_device *, enum nvkm_subdev_type, int); u32 nvkm_top_addr(struct nvkm_device *, enum nvkm_subdev_type, int);
u32 nvkm_top_reset(struct nvkm_device *, enum nvkm_subdev_type, int); u32 nvkm_top_reset(struct nvkm_device *, enum nvkm_subdev_type, int);
u32 nvkm_top_intr_mask(struct nvkm_device *, enum nvkm_subdev_type, int); u32 nvkm_top_intr_mask(struct nvkm_device *, enum nvkm_subdev_type, int);
......
...@@ -2775,6 +2775,10 @@ nvkm_device_preinit(struct nvkm_device *device) ...@@ -2775,6 +2775,10 @@ nvkm_device_preinit(struct nvkm_device *device)
if (ret) if (ret)
goto fail; goto fail;
ret = nvkm_top_parse(device);
if (ret)
goto fail;
time = ktime_to_us(ktime_get()) - time; time = ktime_to_us(ktime_get()) - time;
nvdev_trace(device, "preinit completed in %lldus\n", time); nvdev_trace(device, "preinit completed in %lldus\n", time);
return 0; return 0;
......
...@@ -117,11 +117,15 @@ nvkm_top_fault(struct nvkm_device *device, int fault) ...@@ -117,11 +117,15 @@ nvkm_top_fault(struct nvkm_device *device, int fault)
return NULL; return NULL;
} }
static int int
nvkm_top_oneinit(struct nvkm_subdev *subdev) nvkm_top_parse(struct nvkm_device *device)
{ {
struct nvkm_top *top = nvkm_top(subdev); struct nvkm_top *top = device->top;
return top->func->oneinit(top);
if (!top || !list_empty(&top->device))
return 0;
return top->func->parse(top);
} }
static void * static void *
...@@ -141,7 +145,6 @@ nvkm_top_dtor(struct nvkm_subdev *subdev) ...@@ -141,7 +145,6 @@ nvkm_top_dtor(struct nvkm_subdev *subdev)
static const struct nvkm_subdev_func static const struct nvkm_subdev_func
nvkm_top = { nvkm_top = {
.dtor = nvkm_top_dtor, .dtor = nvkm_top_dtor,
.oneinit = nvkm_top_oneinit,
}; };
int int
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
#include "priv.h" #include "priv.h"
static int static int
ga100_top_oneinit(struct nvkm_top *top) ga100_top_parse(struct nvkm_top *top)
{ {
struct nvkm_subdev *subdev = &top->subdev; struct nvkm_subdev *subdev = &top->subdev;
struct nvkm_device *device = subdev->device; struct nvkm_device *device = subdev->device;
...@@ -97,7 +97,7 @@ ga100_top_oneinit(struct nvkm_top *top) ...@@ -97,7 +97,7 @@ ga100_top_oneinit(struct nvkm_top *top)
static const struct nvkm_top_func static const struct nvkm_top_func
ga100_top = { ga100_top = {
.oneinit = ga100_top_oneinit, .parse = ga100_top_parse,
}; };
int int
......
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
#include "priv.h" #include "priv.h"
static int static int
gk104_top_oneinit(struct nvkm_top *top) gk104_top_parse(struct nvkm_top *top)
{ {
struct nvkm_subdev *subdev = &top->subdev; struct nvkm_subdev *subdev = &top->subdev;
struct nvkm_device *device = subdev->device; struct nvkm_device *device = subdev->device;
...@@ -108,7 +108,7 @@ gk104_top_oneinit(struct nvkm_top *top) ...@@ -108,7 +108,7 @@ gk104_top_oneinit(struct nvkm_top *top)
static const struct nvkm_top_func static const struct nvkm_top_func
gk104_top = { gk104_top = {
.oneinit = gk104_top_oneinit, .parse = gk104_top_parse,
}; };
int int
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
#include <subdev/top.h> #include <subdev/top.h>
struct nvkm_top_func { struct nvkm_top_func {
int (*oneinit)(struct nvkm_top *); int (*parse)(struct nvkm_top *);
}; };
int nvkm_top_new_(const struct nvkm_top_func *, struct nvkm_device *, enum nvkm_subdev_type, int, int nvkm_top_new_(const struct nvkm_top_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
......
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