diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.c b/drivers/gpu/nvgpu/gk20a/gk20a.c index bed728cf4..77d708dd7 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/gk20a.c @@ -1084,6 +1084,9 @@ int gk20a_pm_finalize_poweron(struct device *dev) if (g->ops.xve.available_speeds) { u32 speed; + if (platform->disable_aspm && g->ops.xve.disable_aspm) + g->ops.xve.disable_aspm(g); + g->ops.xve.sw_init(dev); g->ops.xve.available_speeds(g, &speed); diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.h b/drivers/gpu/nvgpu/gk20a/gk20a.h index dc130e339..9e0dd64a6 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/gk20a.h @@ -744,6 +744,7 @@ struct gpu_ops { void (*available_speeds)(struct gk20a *g, u32 *speed_mask); u32 (*xve_readl)(struct gk20a *g, u32 reg); void (*xve_writel)(struct gk20a *g, u32 reg, u32 val); + void (*disable_aspm)(struct gk20a *g); } xve; }; diff --git a/drivers/gpu/nvgpu/gk20a/platform_gk20a.h b/drivers/gpu/nvgpu/gk20a/platform_gk20a.h index 2b17d32a6..c2aec6e3f 100644 --- a/drivers/gpu/nvgpu/gk20a/platform_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/platform_gk20a.h @@ -61,6 +61,9 @@ struct gk20a_platform { /* flag to set sync destroy aggressiveness */ bool aggressive_sync_destroy; + /* set if ASPM should be disabled on boot; only makes sense for PCI */ + bool disable_aspm; + /* Should be populated by probe. */ struct dentry *debugfs; struct dentry *debugfs_alias;