diff options
Diffstat (limited to 'runlist.c')
| -rw-r--r-- | runlist.c | 25 |
1 files changed, 25 insertions, 0 deletions
| @@ -109,3 +109,28 @@ int get_runlist_iter(struct runlist_iter *rl_iter) { | |||
| 109 | printk(KERN_INFO "[nvdebug] tsg_length: %d\n", head.tsg_length); | 109 | printk(KERN_INFO "[nvdebug] tsg_length: %d\n", head.tsg_length); |
| 110 | printk(KERN_INFO "[nvdebug] tsgid: %d\n", head.tsgid); */ | 110 | printk(KERN_INFO "[nvdebug] tsgid: %d\n", head.tsgid); */ |
| 111 | } | 111 | } |
| 112 | |||
| 113 | int preempt_tsg(uint32_t tsg_id) { | ||
| 114 | struct gk20a *g = get_live_gk20a(); | ||
| 115 | runlist_info_t rl_info; | ||
| 116 | pfifo_preempt_t pfifo_preempt; | ||
| 117 | runlist_disable_t rl_disable; | ||
| 118 | if (!g) | ||
| 119 | return -EIO; | ||
| 120 | rl_info.raw = nvdebug_readl(g, NV_PFIFO_RUNLIST); | ||
| 121 | pfifo_preempt.id = tsg_id; | ||
| 122 | pfifo_preempt.is_pending = 0; | ||
| 123 | pfifo_preempt.type = PREEMPT_TYPE_TSG; | ||
| 124 | // There may be a bug (?) that requires us to disable scheduling before preempting | ||
| 125 | rl_disable.raw = nvdebug_readl(g, NV_PFIFO_SCHED_DISABLE); | ||
| 126 | rl_disable.raw |= BIT(rl_info.id); // Disable runlist rl_info.id | ||
| 127 | nvdebug_writel(g, NV_PFIFO_SCHED_DISABLE, rl_disable.raw); | ||
| 128 | // Actually trigger the preemption | ||
| 129 | nvdebug_writel(g, NV_PFIFO_PREEMPT, pfifo_preempt.raw); | ||
| 130 | // Renable scheduling | ||
| 131 | rl_disable.raw &= ~BIT(rl_info.id); // Enable runlist rl_info.id | ||
| 132 | nvdebug_writel(g, NV_PFIFO_SCHED_DISABLE, rl_disable.raw); | ||
| 133 | |||
| 134 | printk(KERN_INFO "[nvdebug] TSG %d preempted (runlist %d)\n", tsg_id, rl_info.id); | ||
| 135 | return 0; | ||
| 136 | } | ||
