Lines Matching refs:ptdev
80 static void panthor_gpu_init_info(struct panthor_device *ptdev) in panthor_gpu_init_info() argument
87 ptdev->gpu_info.gpu_id = gpu_read(ptdev, GPU_ID); in panthor_gpu_init_info()
88 ptdev->gpu_info.csf_id = gpu_read(ptdev, GPU_CSF_ID); in panthor_gpu_init_info()
89 ptdev->gpu_info.gpu_rev = gpu_read(ptdev, GPU_REVID); in panthor_gpu_init_info()
90 ptdev->gpu_info.core_features = gpu_read(ptdev, GPU_CORE_FEATURES); in panthor_gpu_init_info()
91 ptdev->gpu_info.l2_features = gpu_read(ptdev, GPU_L2_FEATURES); in panthor_gpu_init_info()
92 ptdev->gpu_info.tiler_features = gpu_read(ptdev, GPU_TILER_FEATURES); in panthor_gpu_init_info()
93 ptdev->gpu_info.mem_features = gpu_read(ptdev, GPU_MEM_FEATURES); in panthor_gpu_init_info()
94 ptdev->gpu_info.mmu_features = gpu_read(ptdev, GPU_MMU_FEATURES); in panthor_gpu_init_info()
95 ptdev->gpu_info.thread_features = gpu_read(ptdev, GPU_THREAD_FEATURES); in panthor_gpu_init_info()
96 ptdev->gpu_info.max_threads = gpu_read(ptdev, GPU_THREAD_MAX_THREADS); in panthor_gpu_init_info()
97 ptdev->gpu_info.thread_max_workgroup_size = gpu_read(ptdev, GPU_THREAD_MAX_WORKGROUP_SIZE); in panthor_gpu_init_info()
98 ptdev->gpu_info.thread_max_barrier_size = gpu_read(ptdev, GPU_THREAD_MAX_BARRIER_SIZE); in panthor_gpu_init_info()
99 ptdev->gpu_info.coherency_features = gpu_read(ptdev, GPU_COHERENCY_FEATURES); in panthor_gpu_init_info()
101 ptdev->gpu_info.texture_features[i] = gpu_read(ptdev, GPU_TEXTURE_FEATURES(i)); in panthor_gpu_init_info()
103 ptdev->gpu_info.as_present = gpu_read(ptdev, GPU_AS_PRESENT); in panthor_gpu_init_info()
105 ptdev->gpu_info.shader_present = gpu_read(ptdev, GPU_SHADER_PRESENT_LO); in panthor_gpu_init_info()
106 ptdev->gpu_info.shader_present |= (u64)gpu_read(ptdev, GPU_SHADER_PRESENT_HI) << 32; in panthor_gpu_init_info()
108 ptdev->gpu_info.tiler_present = gpu_read(ptdev, GPU_TILER_PRESENT_LO); in panthor_gpu_init_info()
109 ptdev->gpu_info.tiler_present |= (u64)gpu_read(ptdev, GPU_TILER_PRESENT_HI) << 32; in panthor_gpu_init_info()
111 ptdev->gpu_info.l2_present = gpu_read(ptdev, GPU_L2_PRESENT_LO); in panthor_gpu_init_info()
112 ptdev->gpu_info.l2_present |= (u64)gpu_read(ptdev, GPU_L2_PRESENT_HI) << 32; in panthor_gpu_init_info()
114 arch_major = GPU_ARCH_MAJOR(ptdev->gpu_info.gpu_id); in panthor_gpu_init_info()
115 product_major = GPU_PROD_MAJOR(ptdev->gpu_info.gpu_id); in panthor_gpu_init_info()
116 major = GPU_VER_MAJOR(ptdev->gpu_info.gpu_id); in panthor_gpu_init_info()
117 minor = GPU_VER_MINOR(ptdev->gpu_info.gpu_id); in panthor_gpu_init_info()
118 status = GPU_VER_STATUS(ptdev->gpu_info.gpu_id); in panthor_gpu_init_info()
126 drm_info(&ptdev->base, in panthor_gpu_init_info()
128 model->name ?: "unknown", ptdev->gpu_info.gpu_id >> 16, in panthor_gpu_init_info()
131 drm_info(&ptdev->base, in panthor_gpu_init_info()
133 ptdev->gpu_info.l2_features, in panthor_gpu_init_info()
134 ptdev->gpu_info.tiler_features, in panthor_gpu_init_info()
135 ptdev->gpu_info.mem_features, in panthor_gpu_init_info()
136 ptdev->gpu_info.mmu_features, in panthor_gpu_init_info()
137 ptdev->gpu_info.as_present); in panthor_gpu_init_info()
139 drm_info(&ptdev->base, in panthor_gpu_init_info()
141 ptdev->gpu_info.shader_present, ptdev->gpu_info.l2_present, in panthor_gpu_init_info()
142 ptdev->gpu_info.tiler_present); in panthor_gpu_init_info()
145 static void panthor_gpu_irq_handler(struct panthor_device *ptdev, u32 status) in panthor_gpu_irq_handler() argument
148 u32 fault_status = gpu_read(ptdev, GPU_FAULT_STATUS); in panthor_gpu_irq_handler()
149 u64 address = ((u64)gpu_read(ptdev, GPU_FAULT_ADDR_HI) << 32) | in panthor_gpu_irq_handler()
150 gpu_read(ptdev, GPU_FAULT_ADDR_LO); in panthor_gpu_irq_handler()
152 drm_warn(&ptdev->base, "GPU Fault 0x%08x (%s) at 0x%016llx\n", in panthor_gpu_irq_handler()
153 fault_status, panthor_exception_name(ptdev, fault_status & 0xFF), in panthor_gpu_irq_handler()
157 drm_warn(&ptdev->base, "GPU Fault in protected mode\n"); in panthor_gpu_irq_handler()
159 spin_lock(&ptdev->gpu->reqs_lock); in panthor_gpu_irq_handler()
160 if (status & ptdev->gpu->pending_reqs) { in panthor_gpu_irq_handler()
161 ptdev->gpu->pending_reqs &= ~status; in panthor_gpu_irq_handler()
162 wake_up_all(&ptdev->gpu->reqs_acked); in panthor_gpu_irq_handler()
164 spin_unlock(&ptdev->gpu->reqs_lock); in panthor_gpu_irq_handler()
172 void panthor_gpu_unplug(struct panthor_device *ptdev) in panthor_gpu_unplug() argument
177 panthor_gpu_irq_suspend(&ptdev->gpu->irq); in panthor_gpu_unplug()
180 spin_lock_irqsave(&ptdev->gpu->reqs_lock, flags); in panthor_gpu_unplug()
181 ptdev->gpu->pending_reqs = 0; in panthor_gpu_unplug()
182 wake_up_all(&ptdev->gpu->reqs_acked); in panthor_gpu_unplug()
183 spin_unlock_irqrestore(&ptdev->gpu->reqs_lock, flags); in panthor_gpu_unplug()
192 int panthor_gpu_init(struct panthor_device *ptdev) in panthor_gpu_init() argument
198 gpu = drmm_kzalloc(&ptdev->base, sizeof(*gpu), GFP_KERNEL); in panthor_gpu_init()
204 ptdev->gpu = gpu; in panthor_gpu_init()
205 panthor_gpu_init_info(ptdev); in panthor_gpu_init()
207 dma_set_max_seg_size(ptdev->base.dev, UINT_MAX); in panthor_gpu_init()
208 pa_bits = GPU_MMU_FEATURES_PA_BITS(ptdev->gpu_info.mmu_features); in panthor_gpu_init()
209 ret = dma_set_mask_and_coherent(ptdev->base.dev, DMA_BIT_MASK(pa_bits)); in panthor_gpu_init()
213 irq = platform_get_irq_byname(to_platform_device(ptdev->base.dev), "gpu"); in panthor_gpu_init()
217 ret = panthor_request_gpu_irq(ptdev, &ptdev->gpu->irq, irq, GPU_INTERRUPTS_MASK); in panthor_gpu_init()
235 int panthor_gpu_block_power_off(struct panthor_device *ptdev, in panthor_gpu_block_power_off() argument
249 ret = readl_relaxed_poll_timeout(ptdev->iomem + pwrtrans_reg + (i * 4), in panthor_gpu_block_power_off()
253 drm_err(&ptdev->base, "timeout waiting on %s:%llx power transition", in panthor_gpu_block_power_off()
260 gpu_write(ptdev, pwroff_reg, mask); in panthor_gpu_block_power_off()
263 gpu_write(ptdev, pwroff_reg + 4, mask >> 32); in panthor_gpu_block_power_off()
271 ret = readl_relaxed_poll_timeout(ptdev->iomem + pwrtrans_reg + (i * 4), in panthor_gpu_block_power_off()
275 drm_err(&ptdev->base, "timeout waiting on %s:%llx power transition", in panthor_gpu_block_power_off()
296 int panthor_gpu_block_power_on(struct panthor_device *ptdev, in panthor_gpu_block_power_on() argument
310 ret = readl_relaxed_poll_timeout(ptdev->iomem + pwrtrans_reg + (i * 4), in panthor_gpu_block_power_on()
314 drm_err(&ptdev->base, "timeout waiting on %s:%llx power transition", in panthor_gpu_block_power_on()
321 gpu_write(ptdev, pwron_reg, mask); in panthor_gpu_block_power_on()
324 gpu_write(ptdev, pwron_reg + 4, mask >> 32); in panthor_gpu_block_power_on()
332 ret = readl_relaxed_poll_timeout(ptdev->iomem + rdy_reg + (i * 4), in panthor_gpu_block_power_on()
336 drm_err(&ptdev->base, "timeout waiting on %s:%llx readiness", in panthor_gpu_block_power_on()
351 int panthor_gpu_l2_power_on(struct panthor_device *ptdev) in panthor_gpu_l2_power_on() argument
353 if (ptdev->gpu_info.l2_present != 1) { in panthor_gpu_l2_power_on()
361 u64 core_mask = ~(ptdev->gpu_info.l2_present - 1) & in panthor_gpu_l2_power_on()
362 (ptdev->gpu_info.l2_present - 2); in panthor_gpu_l2_power_on()
363 drm_info_once(&ptdev->base, "using only 1st core group (%lu cores from %lu)\n", in panthor_gpu_l2_power_on()
365 hweight64(ptdev->gpu_info.shader_present)); in panthor_gpu_l2_power_on()
368 return panthor_gpu_power_on(ptdev, L2, 1, 20000); in panthor_gpu_l2_power_on()
380 int panthor_gpu_flush_caches(struct panthor_device *ptdev, in panthor_gpu_flush_caches() argument
386 spin_lock_irqsave(&ptdev->gpu->reqs_lock, flags); in panthor_gpu_flush_caches()
387 if (!drm_WARN_ON(&ptdev->base, in panthor_gpu_flush_caches()
388 ptdev->gpu->pending_reqs & GPU_IRQ_CLEAN_CACHES_COMPLETED)) { in panthor_gpu_flush_caches()
389 ptdev->gpu->pending_reqs |= GPU_IRQ_CLEAN_CACHES_COMPLETED; in panthor_gpu_flush_caches()
390 gpu_write(ptdev, GPU_CMD, GPU_FLUSH_CACHES(l2, lsc, other)); in panthor_gpu_flush_caches()
392 spin_unlock_irqrestore(&ptdev->gpu->reqs_lock, flags); in panthor_gpu_flush_caches()
394 if (!wait_event_timeout(ptdev->gpu->reqs_acked, in panthor_gpu_flush_caches()
395 !(ptdev->gpu->pending_reqs & GPU_IRQ_CLEAN_CACHES_COMPLETED), in panthor_gpu_flush_caches()
397 spin_lock_irqsave(&ptdev->gpu->reqs_lock, flags); in panthor_gpu_flush_caches()
398 if ((ptdev->gpu->pending_reqs & GPU_IRQ_CLEAN_CACHES_COMPLETED) != 0 && in panthor_gpu_flush_caches()
399 !(gpu_read(ptdev, GPU_INT_RAWSTAT) & GPU_IRQ_CLEAN_CACHES_COMPLETED)) in panthor_gpu_flush_caches()
402 ptdev->gpu->pending_reqs &= ~GPU_IRQ_CLEAN_CACHES_COMPLETED; in panthor_gpu_flush_caches()
403 spin_unlock_irqrestore(&ptdev->gpu->reqs_lock, flags); in panthor_gpu_flush_caches()
407 drm_err(&ptdev->base, "Flush caches timeout"); in panthor_gpu_flush_caches()
420 int panthor_gpu_soft_reset(struct panthor_device *ptdev) in panthor_gpu_soft_reset() argument
425 spin_lock_irqsave(&ptdev->gpu->reqs_lock, flags); in panthor_gpu_soft_reset()
426 if (!drm_WARN_ON(&ptdev->base, in panthor_gpu_soft_reset()
427 ptdev->gpu->pending_reqs & GPU_IRQ_RESET_COMPLETED)) { in panthor_gpu_soft_reset()
428 ptdev->gpu->pending_reqs |= GPU_IRQ_RESET_COMPLETED; in panthor_gpu_soft_reset()
429 gpu_write(ptdev, GPU_INT_CLEAR, GPU_IRQ_RESET_COMPLETED); in panthor_gpu_soft_reset()
430 gpu_write(ptdev, GPU_CMD, GPU_SOFT_RESET); in panthor_gpu_soft_reset()
432 spin_unlock_irqrestore(&ptdev->gpu->reqs_lock, flags); in panthor_gpu_soft_reset()
434 if (!wait_event_timeout(ptdev->gpu->reqs_acked, in panthor_gpu_soft_reset()
435 !(ptdev->gpu->pending_reqs & GPU_IRQ_RESET_COMPLETED), in panthor_gpu_soft_reset()
437 spin_lock_irqsave(&ptdev->gpu->reqs_lock, flags); in panthor_gpu_soft_reset()
438 if ((ptdev->gpu->pending_reqs & GPU_IRQ_RESET_COMPLETED) != 0 && in panthor_gpu_soft_reset()
439 !(gpu_read(ptdev, GPU_INT_RAWSTAT) & GPU_IRQ_RESET_COMPLETED)) in panthor_gpu_soft_reset()
442 ptdev->gpu->pending_reqs &= ~GPU_IRQ_RESET_COMPLETED; in panthor_gpu_soft_reset()
443 spin_unlock_irqrestore(&ptdev->gpu->reqs_lock, flags); in panthor_gpu_soft_reset()
447 drm_err(&ptdev->base, "Soft reset timeout"); in panthor_gpu_soft_reset()
461 void panthor_gpu_suspend(struct panthor_device *ptdev) in panthor_gpu_suspend() argument
467 panthor_gpu_soft_reset(ptdev); in panthor_gpu_suspend()
468 panthor_gpu_irq_suspend(&ptdev->gpu->irq); in panthor_gpu_suspend()
478 void panthor_gpu_resume(struct panthor_device *ptdev) in panthor_gpu_resume() argument
480 panthor_gpu_irq_resume(&ptdev->gpu->irq, GPU_INTERRUPTS_MASK); in panthor_gpu_resume()
481 panthor_gpu_l2_power_on(ptdev); in panthor_gpu_resume()