Commit 25c53c10 authored by Ben Skeggs's avatar Ben Skeggs

drm/nouveau/pm: extend profile interface for destroy/init/fini

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
Signed-off-by: default avatarMartin Peres <martin.peres@labri.fr>
parent 8d7bb400
...@@ -487,6 +487,9 @@ struct nouveau_pm_tbl_entry { ...@@ -487,6 +487,9 @@ struct nouveau_pm_tbl_entry {
struct nouveau_pm_profile; struct nouveau_pm_profile;
struct nouveau_pm_profile_func { struct nouveau_pm_profile_func {
void (*destroy)(struct nouveau_pm_profile *);
void (*init)(struct nouveau_pm_profile *);
void (*fini)(struct nouveau_pm_profile *);
struct nouveau_pm_level *(*select)(struct nouveau_pm_profile *); struct nouveau_pm_level *(*select)(struct nouveau_pm_profile *);
}; };
...@@ -556,6 +559,7 @@ struct nouveau_pm_engine { ...@@ -556,6 +559,7 @@ struct nouveau_pm_engine {
struct nouveau_pm_profile *profile_ac; struct nouveau_pm_profile *profile_ac;
struct nouveau_pm_profile *profile_dc; struct nouveau_pm_profile *profile_dc;
struct nouveau_pm_profile *profile;
struct list_head profiles; struct list_head profiles;
struct nouveau_pm_level boot; struct nouveau_pm_level boot;
......
...@@ -183,6 +183,12 @@ nouveau_pm_trigger(struct drm_device *dev) ...@@ -183,6 +183,12 @@ nouveau_pm_trigger(struct drm_device *dev)
else else
profile = pm->profile_dc; profile = pm->profile_dc;
if (profile != pm->profile) {
pm->profile->func->fini(pm->profile);
pm->profile = profile;
pm->profile->func->init(pm->profile);
}
/* select performance level based on profile */ /* select performance level based on profile */
perflvl = profile->func->select(profile); perflvl = profile->func->select(profile);
...@@ -251,6 +257,11 @@ nouveau_pm_profile_set(struct drm_device *dev, const char *profile) ...@@ -251,6 +257,11 @@ nouveau_pm_profile_set(struct drm_device *dev, const char *profile)
return 0; return 0;
} }
static void
nouveau_pm_static_dummy(struct nouveau_pm_profile *profile)
{
}
static struct nouveau_pm_level * static struct nouveau_pm_level *
nouveau_pm_static_select(struct nouveau_pm_profile *profile) nouveau_pm_static_select(struct nouveau_pm_profile *profile)
{ {
...@@ -258,6 +269,9 @@ nouveau_pm_static_select(struct nouveau_pm_profile *profile) ...@@ -258,6 +269,9 @@ nouveau_pm_static_select(struct nouveau_pm_profile *profile)
} }
const struct nouveau_pm_profile_func nouveau_pm_static_profile_func = { const struct nouveau_pm_profile_func nouveau_pm_static_profile_func = {
.destroy = nouveau_pm_static_dummy,
.init = nouveau_pm_static_dummy,
.fini = nouveau_pm_static_dummy,
.select = nouveau_pm_static_select, .select = nouveau_pm_static_select,
}; };
...@@ -856,6 +870,7 @@ nouveau_pm_init(struct drm_device *dev) ...@@ -856,6 +870,7 @@ nouveau_pm_init(struct drm_device *dev)
pm->profile_ac = &pm->boot.profile; pm->profile_ac = &pm->boot.profile;
pm->profile_dc = &pm->boot.profile; pm->profile_dc = &pm->boot.profile;
pm->profile = &pm->boot.profile;
pm->cur = &pm->boot; pm->cur = &pm->boot;
/* add performance levels from vbios */ /* add performance levels from vbios */
...@@ -893,6 +908,12 @@ nouveau_pm_fini(struct drm_device *dev) ...@@ -893,6 +908,12 @@ nouveau_pm_fini(struct drm_device *dev)
{ {
struct drm_nouveau_private *dev_priv = dev->dev_private; struct drm_nouveau_private *dev_priv = dev->dev_private;
struct nouveau_pm_engine *pm = &dev_priv->engine.pm; struct nouveau_pm_engine *pm = &dev_priv->engine.pm;
struct nouveau_pm_profile *profile, *tmp;
list_for_each_entry_safe(profile, tmp, &pm->profiles, head) {
list_del(&profile->head);
profile->func->destroy(profile);
}
if (pm->cur != &pm->boot) if (pm->cur != &pm->boot)
nouveau_pm_perflvl_set(dev, &pm->boot); nouveau_pm_perflvl_set(dev, &pm->boot);
......
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