Lines Matching refs:ptdev
80 static void panthor_gpu_coherency_set(struct panthor_device *ptdev) in panthor_gpu_coherency_set() argument
82 gpu_write(ptdev, GPU_COHERENCY_PROTOCOL, in panthor_gpu_coherency_set()
83 ptdev->coherent ? GPU_COHERENCY_PROT_BIT(ACE_LITE) : GPU_COHERENCY_NONE); in panthor_gpu_coherency_set()
86 static void panthor_gpu_init_info(struct panthor_device *ptdev) in panthor_gpu_init_info() argument
93 ptdev->gpu_info.gpu_id = gpu_read(ptdev, GPU_ID); in panthor_gpu_init_info()
94 ptdev->gpu_info.csf_id = gpu_read(ptdev, GPU_CSF_ID); in panthor_gpu_init_info()
95 ptdev->gpu_info.gpu_rev = gpu_read(ptdev, GPU_REVID); in panthor_gpu_init_info()
96 ptdev->gpu_info.core_features = gpu_read(ptdev, GPU_CORE_FEATURES); in panthor_gpu_init_info()
97 ptdev->gpu_info.l2_features = gpu_read(ptdev, GPU_L2_FEATURES); in panthor_gpu_init_info()
98 ptdev->gpu_info.tiler_features = gpu_read(ptdev, GPU_TILER_FEATURES); in panthor_gpu_init_info()
99 ptdev->gpu_info.mem_features = gpu_read(ptdev, GPU_MEM_FEATURES); in panthor_gpu_init_info()
100 ptdev->gpu_info.mmu_features = gpu_read(ptdev, GPU_MMU_FEATURES); in panthor_gpu_init_info()
101 ptdev->gpu_info.thread_features = gpu_read(ptdev, GPU_THREAD_FEATURES); in panthor_gpu_init_info()
102 ptdev->gpu_info.max_threads = gpu_read(ptdev, GPU_THREAD_MAX_THREADS); in panthor_gpu_init_info()
103 ptdev->gpu_info.thread_max_workgroup_size = gpu_read(ptdev, GPU_THREAD_MAX_WORKGROUP_SIZE); in panthor_gpu_init_info()
104 ptdev->gpu_info.thread_max_barrier_size = gpu_read(ptdev, GPU_THREAD_MAX_BARRIER_SIZE); in panthor_gpu_init_info()
105 ptdev->gpu_info.coherency_features = gpu_read(ptdev, GPU_COHERENCY_FEATURES); in panthor_gpu_init_info()
107 ptdev->gpu_info.texture_features[i] = gpu_read(ptdev, GPU_TEXTURE_FEATURES(i)); in panthor_gpu_init_info()
109 ptdev->gpu_info.as_present = gpu_read(ptdev, GPU_AS_PRESENT); in panthor_gpu_init_info()
111 ptdev->gpu_info.shader_present = gpu_read64(ptdev, GPU_SHADER_PRESENT); in panthor_gpu_init_info()
112 ptdev->gpu_info.tiler_present = gpu_read64(ptdev, GPU_TILER_PRESENT); in panthor_gpu_init_info()
113 ptdev->gpu_info.l2_present = gpu_read64(ptdev, GPU_L2_PRESENT); in panthor_gpu_init_info()
115 arch_major = GPU_ARCH_MAJOR(ptdev->gpu_info.gpu_id); in panthor_gpu_init_info()
116 product_major = GPU_PROD_MAJOR(ptdev->gpu_info.gpu_id); in panthor_gpu_init_info()
117 major = GPU_VER_MAJOR(ptdev->gpu_info.gpu_id); in panthor_gpu_init_info()
118 minor = GPU_VER_MINOR(ptdev->gpu_info.gpu_id); in panthor_gpu_init_info()
119 status = GPU_VER_STATUS(ptdev->gpu_info.gpu_id); in panthor_gpu_init_info()
127 drm_info(&ptdev->base, in panthor_gpu_init_info()
129 model->name ?: "unknown", ptdev->gpu_info.gpu_id >> 16, in panthor_gpu_init_info()
132 drm_info(&ptdev->base, in panthor_gpu_init_info()
134 ptdev->gpu_info.l2_features, in panthor_gpu_init_info()
135 ptdev->gpu_info.tiler_features, in panthor_gpu_init_info()
136 ptdev->gpu_info.mem_features, in panthor_gpu_init_info()
137 ptdev->gpu_info.mmu_features, in panthor_gpu_init_info()
138 ptdev->gpu_info.as_present); in panthor_gpu_init_info()
140 drm_info(&ptdev->base, in panthor_gpu_init_info()
142 ptdev->gpu_info.shader_present, ptdev->gpu_info.l2_present, in panthor_gpu_init_info()
143 ptdev->gpu_info.tiler_present); in panthor_gpu_init_info()
146 static void panthor_gpu_irq_handler(struct panthor_device *ptdev, u32 status) in panthor_gpu_irq_handler() argument
148 gpu_write(ptdev, GPU_INT_CLEAR, status); in panthor_gpu_irq_handler()
151 u32 fault_status = gpu_read(ptdev, GPU_FAULT_STATUS); in panthor_gpu_irq_handler()
152 u64 address = gpu_read64(ptdev, GPU_FAULT_ADDR); in panthor_gpu_irq_handler()
154 drm_warn(&ptdev->base, "GPU Fault 0x%08x (%s) at 0x%016llx\n", in panthor_gpu_irq_handler()
155 fault_status, panthor_exception_name(ptdev, fault_status & 0xFF), in panthor_gpu_irq_handler()
159 drm_warn(&ptdev->base, "GPU Fault in protected mode\n"); in panthor_gpu_irq_handler()
161 spin_lock(&ptdev->gpu->reqs_lock); in panthor_gpu_irq_handler()
162 if (status & ptdev->gpu->pending_reqs) { in panthor_gpu_irq_handler()
163 ptdev->gpu->pending_reqs &= ~status; in panthor_gpu_irq_handler()
164 wake_up_all(&ptdev->gpu->reqs_acked); in panthor_gpu_irq_handler()
166 spin_unlock(&ptdev->gpu->reqs_lock); in panthor_gpu_irq_handler()
174 void panthor_gpu_unplug(struct panthor_device *ptdev) in panthor_gpu_unplug() argument
179 if (!IS_ENABLED(CONFIG_PM) || pm_runtime_active(ptdev->base.dev)) in panthor_gpu_unplug()
180 panthor_gpu_irq_suspend(&ptdev->gpu->irq); in panthor_gpu_unplug()
183 spin_lock_irqsave(&ptdev->gpu->reqs_lock, flags); in panthor_gpu_unplug()
184 ptdev->gpu->pending_reqs = 0; in panthor_gpu_unplug()
185 wake_up_all(&ptdev->gpu->reqs_acked); in panthor_gpu_unplug()
186 spin_unlock_irqrestore(&ptdev->gpu->reqs_lock, flags); in panthor_gpu_unplug()
195 int panthor_gpu_init(struct panthor_device *ptdev) in panthor_gpu_init() argument
201 gpu = drmm_kzalloc(&ptdev->base, sizeof(*gpu), GFP_KERNEL); in panthor_gpu_init()
207 ptdev->gpu = gpu; in panthor_gpu_init()
208 panthor_gpu_init_info(ptdev); in panthor_gpu_init()
210 dma_set_max_seg_size(ptdev->base.dev, UINT_MAX); in panthor_gpu_init()
211 pa_bits = GPU_MMU_FEATURES_PA_BITS(ptdev->gpu_info.mmu_features); in panthor_gpu_init()
212 ret = dma_set_mask_and_coherent(ptdev->base.dev, DMA_BIT_MASK(pa_bits)); in panthor_gpu_init()
216 irq = platform_get_irq_byname(to_platform_device(ptdev->base.dev), "gpu"); in panthor_gpu_init()
220 ret = panthor_request_gpu_irq(ptdev, &ptdev->gpu->irq, irq, GPU_INTERRUPTS_MASK); in panthor_gpu_init()
238 int panthor_gpu_block_power_off(struct panthor_device *ptdev, in panthor_gpu_block_power_off() argument
246 ret = gpu_read64_relaxed_poll_timeout(ptdev, pwrtrans_reg, val, in panthor_gpu_block_power_off()
249 drm_err(&ptdev->base, in panthor_gpu_block_power_off()
255 gpu_write64(ptdev, pwroff_reg, mask); in panthor_gpu_block_power_off()
257 ret = gpu_read64_relaxed_poll_timeout(ptdev, pwrtrans_reg, val, in panthor_gpu_block_power_off()
260 drm_err(&ptdev->base, in panthor_gpu_block_power_off()
281 int panthor_gpu_block_power_on(struct panthor_device *ptdev, in panthor_gpu_block_power_on() argument
289 ret = gpu_read64_relaxed_poll_timeout(ptdev, pwrtrans_reg, val, in panthor_gpu_block_power_on()
292 drm_err(&ptdev->base, in panthor_gpu_block_power_on()
298 gpu_write64(ptdev, pwron_reg, mask); in panthor_gpu_block_power_on()
300 ret = gpu_read64_relaxed_poll_timeout(ptdev, rdy_reg, val, in panthor_gpu_block_power_on()
304 drm_err(&ptdev->base, "timeout waiting on %s:%llx readiness", in panthor_gpu_block_power_on()
318 int panthor_gpu_l2_power_on(struct panthor_device *ptdev) in panthor_gpu_l2_power_on() argument
320 if (ptdev->gpu_info.l2_present != 1) { in panthor_gpu_l2_power_on()
328 u64 core_mask = ~(ptdev->gpu_info.l2_present - 1) & in panthor_gpu_l2_power_on()
329 (ptdev->gpu_info.l2_present - 2); in panthor_gpu_l2_power_on()
330 drm_info_once(&ptdev->base, "using only 1st core group (%lu cores from %lu)\n", in panthor_gpu_l2_power_on()
332 hweight64(ptdev->gpu_info.shader_present)); in panthor_gpu_l2_power_on()
336 panthor_gpu_coherency_set(ptdev); in panthor_gpu_l2_power_on()
338 return panthor_gpu_power_on(ptdev, L2, 1, 20000); in panthor_gpu_l2_power_on()
350 int panthor_gpu_flush_caches(struct panthor_device *ptdev, in panthor_gpu_flush_caches() argument
356 spin_lock_irqsave(&ptdev->gpu->reqs_lock, flags); in panthor_gpu_flush_caches()
357 if (!drm_WARN_ON(&ptdev->base, in panthor_gpu_flush_caches()
358 ptdev->gpu->pending_reqs & GPU_IRQ_CLEAN_CACHES_COMPLETED)) { in panthor_gpu_flush_caches()
359 ptdev->gpu->pending_reqs |= GPU_IRQ_CLEAN_CACHES_COMPLETED; in panthor_gpu_flush_caches()
360 gpu_write(ptdev, GPU_CMD, GPU_FLUSH_CACHES(l2, lsc, other)); in panthor_gpu_flush_caches()
362 spin_unlock_irqrestore(&ptdev->gpu->reqs_lock, flags); in panthor_gpu_flush_caches()
364 if (!wait_event_timeout(ptdev->gpu->reqs_acked, in panthor_gpu_flush_caches()
365 !(ptdev->gpu->pending_reqs & GPU_IRQ_CLEAN_CACHES_COMPLETED), in panthor_gpu_flush_caches()
367 spin_lock_irqsave(&ptdev->gpu->reqs_lock, flags); in panthor_gpu_flush_caches()
368 if ((ptdev->gpu->pending_reqs & GPU_IRQ_CLEAN_CACHES_COMPLETED) != 0 && in panthor_gpu_flush_caches()
369 !(gpu_read(ptdev, GPU_INT_RAWSTAT) & GPU_IRQ_CLEAN_CACHES_COMPLETED)) in panthor_gpu_flush_caches()
372 ptdev->gpu->pending_reqs &= ~GPU_IRQ_CLEAN_CACHES_COMPLETED; in panthor_gpu_flush_caches()
373 spin_unlock_irqrestore(&ptdev->gpu->reqs_lock, flags); in panthor_gpu_flush_caches()
377 drm_err(&ptdev->base, "Flush caches timeout"); in panthor_gpu_flush_caches()
390 int panthor_gpu_soft_reset(struct panthor_device *ptdev) in panthor_gpu_soft_reset() argument
395 spin_lock_irqsave(&ptdev->gpu->reqs_lock, flags); in panthor_gpu_soft_reset()
396 if (!drm_WARN_ON(&ptdev->base, in panthor_gpu_soft_reset()
397 ptdev->gpu->pending_reqs & GPU_IRQ_RESET_COMPLETED)) { in panthor_gpu_soft_reset()
398 ptdev->gpu->pending_reqs |= GPU_IRQ_RESET_COMPLETED; in panthor_gpu_soft_reset()
399 gpu_write(ptdev, GPU_INT_CLEAR, GPU_IRQ_RESET_COMPLETED); in panthor_gpu_soft_reset()
400 gpu_write(ptdev, GPU_CMD, GPU_SOFT_RESET); in panthor_gpu_soft_reset()
402 spin_unlock_irqrestore(&ptdev->gpu->reqs_lock, flags); in panthor_gpu_soft_reset()
404 if (!wait_event_timeout(ptdev->gpu->reqs_acked, in panthor_gpu_soft_reset()
405 !(ptdev->gpu->pending_reqs & GPU_IRQ_RESET_COMPLETED), in panthor_gpu_soft_reset()
407 spin_lock_irqsave(&ptdev->gpu->reqs_lock, flags); in panthor_gpu_soft_reset()
408 if ((ptdev->gpu->pending_reqs & GPU_IRQ_RESET_COMPLETED) != 0 && in panthor_gpu_soft_reset()
409 !(gpu_read(ptdev, GPU_INT_RAWSTAT) & GPU_IRQ_RESET_COMPLETED)) in panthor_gpu_soft_reset()
412 ptdev->gpu->pending_reqs &= ~GPU_IRQ_RESET_COMPLETED; in panthor_gpu_soft_reset()
413 spin_unlock_irqrestore(&ptdev->gpu->reqs_lock, flags); in panthor_gpu_soft_reset()
417 drm_err(&ptdev->base, "Soft reset timeout"); in panthor_gpu_soft_reset()
431 void panthor_gpu_suspend(struct panthor_device *ptdev) in panthor_gpu_suspend() argument
434 if (!ptdev->reset.fast) in panthor_gpu_suspend()
435 panthor_gpu_soft_reset(ptdev); in panthor_gpu_suspend()
437 panthor_gpu_power_off(ptdev, L2, 1, 20000); in panthor_gpu_suspend()
439 panthor_gpu_irq_suspend(&ptdev->gpu->irq); in panthor_gpu_suspend()
449 void panthor_gpu_resume(struct panthor_device *ptdev) in panthor_gpu_resume() argument
451 panthor_gpu_irq_resume(&ptdev->gpu->irq, GPU_INTERRUPTS_MASK); in panthor_gpu_resume()
452 panthor_gpu_l2_power_on(ptdev); in panthor_gpu_resume()