From c8ffe0fdecfa110a9f9beb1b7e0298d3c3c64cc2 Mon Sep 17 00:00:00 2001 From: Thomas Fleury Date: Tue, 10 May 2016 09:05:45 -0700 Subject: gpu: nvgpu: add sched control API Added a dedicated device node to allow an app manager to control TSG scheduling parameters: - Get list of TSGs - Get list of recent TSGs - Get list of TSGs per pid - Get TSG current scheduling parameters - Set TSG timeslice - Set TSG runlist interleave Jira VFND-1586 Change-Id: I014c9d1534bce0eaea6c25ad114cf0cff317af79 Signed-off-by: Thomas Fleury Reviewed-on: http://git-master/r/1160384 (cherry picked from commit 75ca739517cc7f7f76714b5f6a1a57c39b8cb38e) Reviewed-on: http://git-master/r/1167021 Reviewed-by: Richard Zhao GVS: Gerrit_Virtual_Submit Reviewed-by: Alex Waterman Reviewed-by: Vijayakumar Subbu --- drivers/gpu/nvgpu/gk20a/gk20a.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'drivers/gpu/nvgpu/gk20a/gk20a.c') diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.c b/drivers/gpu/nvgpu/gk20a/gk20a.c index 9255c847..822cd3ff 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/gk20a.c @@ -246,6 +246,18 @@ static const struct file_operations gk20a_ctxsw_ops = { .mmap = gk20a_ctxsw_dev_mmap, }; +static const struct file_operations gk20a_sched_ops = { + .owner = THIS_MODULE, + .release = gk20a_sched_dev_release, + .open = gk20a_sched_dev_open, +#ifdef CONFIG_COMPAT + .compat_ioctl = gk20a_sched_dev_ioctl, +#endif + .unlocked_ioctl = gk20a_sched_dev_ioctl, + .poll = gk20a_sched_dev_poll, + .read = gk20a_sched_dev_read, +}; + static inline void sim_writel(struct gk20a *g, u32 r, u32 v) { writel(v, g->sim.regs+r); @@ -965,6 +977,12 @@ int gk20a_pm_finalize_poweron(struct device *dev) if (err) gk20a_warn(dev, "could not initialize ctxsw tracing"); + err = gk20a_sched_ctrl_init(g); + if (err) { + gk20a_err(dev, "failed to init sched control"); + goto done; + } + /* Restore the debug setting */ g->ops.mm.set_debug_mode(g, g->mmu_debug_ctrl); @@ -1101,6 +1119,11 @@ void gk20a_user_deinit(struct device *dev, struct class *class) cdev_del(&g->ctxsw.cdev); } + if (g->sched.node) { + device_destroy(&nvgpu_class, g->sched.cdev.dev); + cdev_del(&g->sched.cdev); + } + if (g->cdev_region) unregister_chrdev_region(g->cdev_region, GK20A_NUM_CDEVS); } @@ -1170,6 +1193,12 @@ int gk20a_user_init(struct device *dev, const char *interface_name, goto fail; #endif + err = gk20a_create_device(dev, devno++, interface_name, "-sched", + &g->sched.cdev, &g->sched.node, + &gk20a_sched_ops, + class); + if (err) + goto fail; return 0; fail: @@ -1632,6 +1661,7 @@ static int gk20a_probe(struct platform_device *dev) gk20a_alloc_debugfs_init(dev); gk20a_mm_debugfs_init(&dev->dev); gk20a_fifo_debugfs_init(&dev->dev); + gk20a_sched_debugfs_init(&dev->dev); #endif gk20a_init_gr(gk20a); @@ -1655,6 +1685,8 @@ static int __exit gk20a_remove(struct platform_device *pdev) gk20a_ctxsw_trace_cleanup(g); + gk20a_sched_ctrl_cleanup(g); + if (IS_ENABLED(CONFIG_GK20A_DEVFREQ)) gk20a_scale_exit(dev); -- cgit v1.2.2