Lines Matching +full:soft +full:- +full:ip
1 // SPDX-License-Identifier: GPL-2.0 OR MIT
2 /* Copyright 2017-2019 Qiang Yu <yuq825@gmail.com> */
17 #define gp_write(reg, data) writel(data, ip->iomem + reg)
18 #define gp_read(reg) readl(ip->iomem + reg)
22 struct lima_ip *ip = data; in lima_gp_irq_handler() local
23 struct lima_device *dev = ip->dev; in lima_gp_irq_handler()
24 struct lima_sched_pipe *pipe = dev->pipe + lima_pipe_gp; in lima_gp_irq_handler()
25 struct lima_sched_task *task = pipe->current_task; in lima_gp_irq_handler()
37 dev_dbg(dev->dev, "%s out of heap irq status=%x\n", in lima_gp_irq_handler()
38 lima_ip_name(ip), status); in lima_gp_irq_handler()
40 dev_err(dev->dev, "%s error irq state=%x status=%x\n", in lima_gp_irq_handler()
41 lima_ip_name(ip), state, status); in lima_gp_irq_handler()
43 task->recoverable = false; in lima_gp_irq_handler()
49 pipe->error = true; in lima_gp_irq_handler()
57 pipe->error = false; in lima_gp_irq_handler()
68 static void lima_gp_soft_reset_async(struct lima_ip *ip) in lima_gp_soft_reset_async() argument
70 if (ip->data.async_reset) in lima_gp_soft_reset_async()
76 ip->data.async_reset = true; in lima_gp_soft_reset_async()
79 static int lima_gp_soft_reset_async_wait(struct lima_ip *ip) in lima_gp_soft_reset_async_wait() argument
81 struct lima_device *dev = ip->dev; in lima_gp_soft_reset_async_wait()
85 if (!ip->data.async_reset) in lima_gp_soft_reset_async_wait()
88 err = readl_poll_timeout(ip->iomem + LIMA_GP_INT_RAWSTAT, v, in lima_gp_soft_reset_async_wait()
92 dev_err(dev->dev, "%s soft reset time out\n", in lima_gp_soft_reset_async_wait()
93 lima_ip_name(ip)); in lima_gp_soft_reset_async_wait()
100 ip->data.async_reset = false; in lima_gp_soft_reset_async_wait()
107 struct drm_lima_gp_frame *frame = task->frame; in lima_gp_task_validate()
108 u32 *f = frame->frame; in lima_gp_task_validate()
117 return -EINVAL; in lima_gp_task_validate()
123 return -EINVAL; in lima_gp_task_validate()
131 struct lima_ip *ip = pipe->processor[0]; in lima_gp_task_run() local
132 struct drm_lima_gp_frame *frame = task->frame; in lima_gp_task_run()
133 u32 *f = frame->frame; in lima_gp_task_run()
138 for (i = 0; i < task->num_bos; i++) { in lima_gp_task_run()
139 struct lima_bo *bo = task->bos[i]; in lima_gp_task_run()
141 if (bo->heap_size && in lima_gp_task_run()
142 lima_vm_get_va(task->vm, bo) == in lima_gp_task_run()
146 bo->heap_size; in lima_gp_task_run()
147 task->recoverable = true; in lima_gp_task_run()
148 task->heap = bo; in lima_gp_task_run()
160 /* before any hw ops, wait last success task async soft reset */ in lima_gp_task_run()
161 lima_gp_soft_reset_async_wait(ip); in lima_gp_task_run()
164 writel(f[i], ip->iomem + LIMA_GP_VSCL_START_ADDR + i * 4); in lima_gp_task_run()
170 static int lima_gp_bus_stop_poll(struct lima_ip *ip) in lima_gp_bus_stop_poll() argument
175 static int lima_gp_hard_reset_poll(struct lima_ip *ip) in lima_gp_hard_reset_poll() argument
181 static int lima_gp_hard_reset(struct lima_ip *ip) in lima_gp_hard_reset() argument
183 struct lima_device *dev = ip->dev; in lima_gp_hard_reset()
190 ret = lima_poll_timeout(ip, lima_gp_bus_stop_poll, 10, 100); in lima_gp_hard_reset()
192 dev_err(dev->dev, "%s bus stop timeout\n", lima_ip_name(ip)); in lima_gp_hard_reset()
196 ret = lima_poll_timeout(ip, lima_gp_hard_reset_poll, 10, 100); in lima_gp_hard_reset()
198 dev_err(dev->dev, "%s hard reset timeout\n", lima_ip_name(ip)); in lima_gp_hard_reset()
207 * if there was an async soft reset queued, in lima_gp_hard_reset()
210 ip->data.async_reset = false; in lima_gp_hard_reset()
217 lima_gp_soft_reset_async(pipe->processor[0]); in lima_gp_task_fini()
222 struct lima_ip *ip = pipe->processor[0]; in lima_gp_task_error() local
224 dev_err(ip->dev->dev, "%s task error int_state=%x status=%x\n", in lima_gp_task_error()
225 lima_ip_name(ip), gp_read(LIMA_GP_INT_STAT), in lima_gp_task_error()
228 lima_gp_hard_reset(ip); in lima_gp_task_error()
238 struct lima_ip *ip = pipe->processor[0]; in lima_gp_task_mask_irq() local
245 struct lima_ip *ip = pipe->processor[0]; in lima_gp_task_recover() local
246 struct lima_sched_task *task = pipe->current_task; in lima_gp_task_recover()
247 struct drm_lima_gp_frame *frame = task->frame; in lima_gp_task_recover()
248 u32 *f = frame->frame; in lima_gp_task_recover()
250 f[LIMA_GP_PLBU_ALLOC_END_ADDR >> 2] - in lima_gp_task_recover()
253 if (fail_size == task->heap->heap_size) { in lima_gp_task_recover()
256 ret = lima_heap_alloc(task->heap, task->vm); in lima_gp_task_recover()
266 f[LIMA_GP_PLBU_ALLOC_START_ADDR >> 2] + task->heap->heap_size; in lima_gp_task_recover()
273 static void lima_gp_print_version(struct lima_ip *ip) in lima_gp_print_version() argument
298 dev_info(ip->dev->dev, "%s - %s version major %d minor %d\n", in lima_gp_print_version()
299 lima_ip_name(ip), name, major, minor); in lima_gp_print_version()
305 static int lima_gp_hw_init(struct lima_ip *ip) in lima_gp_hw_init() argument
307 ip->data.async_reset = false; in lima_gp_hw_init()
308 lima_gp_soft_reset_async(ip); in lima_gp_hw_init()
309 return lima_gp_soft_reset_async_wait(ip); in lima_gp_hw_init()
312 int lima_gp_resume(struct lima_ip *ip) in lima_gp_resume() argument
314 return lima_gp_hw_init(ip); in lima_gp_resume()
317 void lima_gp_suspend(struct lima_ip *ip) in lima_gp_suspend() argument
322 int lima_gp_init(struct lima_ip *ip) in lima_gp_init() argument
324 struct lima_device *dev = ip->dev; in lima_gp_init()
327 lima_gp_print_version(ip); in lima_gp_init()
329 err = lima_gp_hw_init(ip); in lima_gp_init()
333 err = devm_request_irq(dev->dev, ip->irq, lima_gp_irq_handler, in lima_gp_init()
334 IRQF_SHARED, lima_ip_name(ip), ip); in lima_gp_init()
336 dev_err(dev->dev, "%s fail to request irq\n", in lima_gp_init()
337 lima_ip_name(ip)); in lima_gp_init()
341 dev->gp_version = gp_read(LIMA_GP_VERSION); in lima_gp_init()
346 void lima_gp_fini(struct lima_ip *ip) in lima_gp_fini() argument
348 struct lima_device *dev = ip->dev; in lima_gp_fini()
350 devm_free_irq(dev->dev, ip->irq, ip); in lima_gp_fini()
356 struct lima_sched_pipe *pipe = dev->pipe + lima_pipe_gp; in lima_gp_pipe_init()
364 return -ENOMEM; in lima_gp_pipe_init()
368 pipe->frame_size = frame_size; in lima_gp_pipe_init()
369 pipe->task_slab = lima_gp_task_slab; in lima_gp_pipe_init()
371 pipe->task_validate = lima_gp_task_validate; in lima_gp_pipe_init()
372 pipe->task_run = lima_gp_task_run; in lima_gp_pipe_init()
373 pipe->task_fini = lima_gp_task_fini; in lima_gp_pipe_init()
374 pipe->task_error = lima_gp_task_error; in lima_gp_pipe_init()
375 pipe->task_mmu_error = lima_gp_task_mmu_error; in lima_gp_pipe_init()
376 pipe->task_recover = lima_gp_task_recover; in lima_gp_pipe_init()
377 pipe->task_mask_irq = lima_gp_task_mask_irq; in lima_gp_pipe_init()
384 if (!--lima_gp_task_slab_refcnt) { in lima_gp_pipe_fini()