Lines Matching +full:powervr +full:- +full:gpu

1 // SPDX-License-Identifier: GPL-2.0-only OR MIT
21 #include <linux/dma-mapping.h>
37 * pvr_device_reg_init() - Initialize kernel access to a PowerVR device's
39 * @pvr_dev: Target PowerVR device.
41 * Sets struct pvr_device->regs.
55 struct platform_device *plat_dev = to_platform_device(drm_dev->dev); in pvr_device_reg_init()
59 pvr_dev->regs_resource = NULL; in pvr_device_reg_init()
60 pvr_dev->regs = NULL; in pvr_device_reg_init()
64 return dev_err_probe(drm_dev->dev, PTR_ERR(regs), in pvr_device_reg_init()
65 "failed to ioremap gpu registers\n"); in pvr_device_reg_init()
67 pvr_dev->regs = regs; in pvr_device_reg_init()
68 pvr_dev->regs_resource = regs_resource; in pvr_device_reg_init()
74 * pvr_device_clk_init() - Initialize clocks required by a PowerVR device
75 * @pvr_dev: Target PowerVR device.
77 * Sets struct pvr_device->core_clk, struct pvr_device->sys_clk and
78 * struct pvr_device->mem_clk.
80 * Three clocks are required by the PowerVR device: core, sys and mem. On
101 core_clk = devm_clk_get(drm_dev->dev, "core"); in pvr_device_clk_init()
103 return dev_err_probe(drm_dev->dev, PTR_ERR(core_clk), in pvr_device_clk_init()
106 sys_clk = devm_clk_get_optional(drm_dev->dev, "sys"); in pvr_device_clk_init()
108 return dev_err_probe(drm_dev->dev, PTR_ERR(sys_clk), in pvr_device_clk_init()
111 mem_clk = devm_clk_get_optional(drm_dev->dev, "mem"); in pvr_device_clk_init()
113 return dev_err_probe(drm_dev->dev, PTR_ERR(mem_clk), in pvr_device_clk_init()
116 pvr_dev->core_clk = core_clk; in pvr_device_clk_init()
117 pvr_dev->sys_clk = sys_clk; in pvr_device_clk_init()
118 pvr_dev->mem_clk = mem_clk; in pvr_device_clk_init()
124 * pvr_device_process_active_queues() - Process all queue related events.
125 * @pvr_dev: PowerVR device to check
135 mutex_lock(&pvr_dev->queues.lock); in pvr_device_process_active_queues()
138 * active after we're done processing them are re-inserted to in pvr_device_process_active_queues()
141 list_splice_init(&pvr_dev->queues.active, &active_queues); in pvr_device_process_active_queues()
146 mutex_unlock(&pvr_dev->queues.lock); in pvr_device_process_active_queues()
156 * when the GPU is receiving a massive amount of short jobs. in pvr_device_irq_thread_handler()
161 if (pvr_dev->fw_dev.booted) { in pvr_device_irq_thread_handler()
167 pm_runtime_mark_last_busy(from_pvr_device(pvr_dev)->dev); in pvr_device_irq_thread_handler()
182 return IRQ_NONE; /* Spurious IRQ - ignore. */ in pvr_device_irq_handler()
192 * pvr_device_irq_init() - Initialise IRQ required by a PowerVR device
193 * @pvr_dev: Target PowerVR device.
204 struct platform_device *plat_dev = to_platform_device(drm_dev->dev); in pvr_device_irq_init()
206 init_waitqueue_head(&pvr_dev->kccb.rtn_q); in pvr_device_irq_init()
208 pvr_dev->irq = platform_get_irq(plat_dev, 0); in pvr_device_irq_init()
209 if (pvr_dev->irq < 0) in pvr_device_irq_init()
210 return pvr_dev->irq; in pvr_device_irq_init()
216 return request_threaded_irq(pvr_dev->irq, pvr_device_irq_handler, in pvr_device_irq_init()
218 IRQF_SHARED, "gpu", pvr_dev); in pvr_device_irq_init()
222 * pvr_device_irq_fini() - Deinitialise IRQ required by a PowerVR device
223 * @pvr_dev: Target PowerVR device.
228 free_irq(pvr_dev->irq, pvr_dev); in pvr_device_irq_fini()
232 * pvr_build_firmware_filename() - Construct a PowerVR firmware filename
233 * @pvr_dev: Target PowerVR device.
237 * A PowerVR firmware filename consists of three parts separated by underscores
241 * a 'v' prefix, e.g. powervr/rogue_4.40.2.51_v1.fw.
254 struct pvr_gpu_id *gpu_id = &pvr_dev->gpu_id; in pvr_build_firmware_filename()
256 return kasprintf(GFP_KERNEL, "%s_%d.%d.%d.%d_v%d.fw", base, gpu_id->b, in pvr_build_firmware_filename()
257 gpu_id->v, gpu_id->n, gpu_id->c, major); in pvr_build_firmware_filename()
265 release_firmware(pvr_dev->fw_dev.firmware); in pvr_release_firmware()
269 * pvr_request_firmware() - Load firmware for a PowerVR device
270 * @pvr_dev: Target PowerVR device.
282 struct drm_device *drm_dev = &pvr_dev->base; in pvr_request_firmware()
287 filename = pvr_build_firmware_filename(pvr_dev, "powervr/rogue", in pvr_request_firmware()
290 return -ENOMEM; in pvr_request_firmware()
296 err = request_firmware(&fw, filename, pvr_dev->base.dev); in pvr_request_firmware()
306 pvr_dev->fw_dev.firmware = fw; in pvr_request_firmware()
308 return devm_add_action_or_reset(drm_dev->dev, pvr_release_firmware, pvr_dev); in pvr_request_firmware()
317 * pvr_load_gpu_id() - Load a PowerVR device's GPU ID (BVNC) from control registers.
321 * @pvr_dev: Target PowerVR device.
326 struct pvr_gpu_id *gpu_id = &pvr_dev->gpu_id; in pvr_load_gpu_id()
335 gpu_id->b = PVR_CR_FIELD_GET(bvnc, CORE_ID__PBVNC__BRANCH_ID); in pvr_load_gpu_id()
336 if (gpu_id->b != 0) { in pvr_load_gpu_id()
337 gpu_id->v = PVR_CR_FIELD_GET(bvnc, CORE_ID__PBVNC__VERSION_ID); in pvr_load_gpu_id()
338 gpu_id->n = PVR_CR_FIELD_GET(bvnc, CORE_ID__PBVNC__NUMBER_OF_SCALABLE_UNITS); in pvr_load_gpu_id()
339 gpu_id->c = PVR_CR_FIELD_GET(bvnc, CORE_ID__PBVNC__CONFIG_ID); in pvr_load_gpu_id()
345 gpu_id->b = PVR_CR_FIELD_GET(core_rev, CORE_REVISION_MAJOR); in pvr_load_gpu_id()
346 gpu_id->v = PVR_CR_FIELD_GET(core_rev, CORE_REVISION_MINOR); in pvr_load_gpu_id()
347 gpu_id->n = FIELD_GET(0xFF00, core_id_config); in pvr_load_gpu_id()
348 gpu_id->c = FIELD_GET(0x00FF, core_id_config); in pvr_load_gpu_id()
353 * pvr_set_dma_info() - Set PowerVR device DMA information
354 * @pvr_dev: Target PowerVR device.
356 * Sets the DMA mask and max segment size for the PowerVR device.
377 err = dma_set_mask(drm_dev->dev, DMA_BIT_MASK(phys_bus_width)); in pvr_set_dma_info()
383 dma_set_max_seg_size(drm_dev->dev, UINT_MAX); in pvr_set_dma_info()
389 * pvr_device_gpu_init() - GPU-specific initialization for a PowerVR device
390 * @pvr_dev: Target PowerVR device.
397 * 4. Setup the device-scoped memory context, and
402 * * -%ENODEV if the GPU is not supported,
423 pvr_dev->fw_dev.processor_type = PVR_FW_PROCESSOR_TYPE_META; in pvr_device_gpu_init()
425 pvr_dev->fw_dev.processor_type = PVR_FW_PROCESSOR_TYPE_MIPS; in pvr_device_gpu_init()
427 pvr_dev->fw_dev.processor_type = PVR_FW_PROCESSOR_TYPE_RISCV; in pvr_device_gpu_init()
429 return -EINVAL; in pvr_device_gpu_init()
437 if (pvr_dev->fw_dev.processor_type != PVR_FW_PROCESSOR_TYPE_MIPS) { in pvr_device_gpu_init()
438 pvr_dev->kernel_vm_ctx = pvr_vm_create_context(pvr_dev, false); in pvr_device_gpu_init()
439 if (IS_ERR(pvr_dev->kernel_vm_ctx)) in pvr_device_gpu_init()
440 return PTR_ERR(pvr_dev->kernel_vm_ctx); in pvr_device_gpu_init()
450 if (pvr_dev->fw_dev.processor_type != PVR_FW_PROCESSOR_TYPE_MIPS) { in pvr_device_gpu_init()
451 pvr_vm_context_put(pvr_dev->kernel_vm_ctx); in pvr_device_gpu_init()
452 pvr_dev->kernel_vm_ctx = NULL; in pvr_device_gpu_init()
459 * pvr_device_gpu_fini() - GPU-specific deinitialization for a PowerVR device
460 * @pvr_dev: Target PowerVR device.
467 if (pvr_dev->fw_dev.processor_type != PVR_FW_PROCESSOR_TYPE_MIPS) { in pvr_device_gpu_fini()
468 WARN_ON(!pvr_vm_context_put(pvr_dev->kernel_vm_ctx)); in pvr_device_gpu_fini()
469 pvr_dev->kernel_vm_ctx = NULL; in pvr_device_gpu_fini()
474 * pvr_device_init() - Initialize a PowerVR device
475 * @pvr_dev: Target PowerVR device.
479 * occurs will be de-initialized before returning.
496 struct device *dev = drm_dev->dev; in pvr_device_init()
503 err = pvr_device_params_init(&pvr_dev->params); in pvr_device_init()
512 /* Explicitly power the GPU so we can access control registers before the FW is booted. */ in pvr_device_init()
522 /* Perform GPU-specific initialization steps. */ in pvr_device_init()
545 * pvr_device_fini() - Deinitialize a PowerVR device
546 * @pvr_dev: Target PowerVR device.
592 * pvr_device_has_feature() - Look up device feature based on feature definition