/** * amdgpu_enable_vblank_kms - enable vblank interrupt * * @dev: drm dev pointer * @pipe: crtc to enable vblank interrupt for * * Enable the interrupt on the requested crtc (all asics). * Returns 0 on success, -EINVAL on failure. */ int amdgpu_enable_vblank_kms(struct drm_device *dev, unsigned int pipe) { struct amdgpu_device *adev = dev->dev_private; int idx = amdgpu_crtc_idx_to_irq_type(adev, pipe); return amdgpu_irq_get(adev, &adev->crtc_irq, idx); }
/** * amdgpu_fence_driver_start_ring - make the fence driver * ready for use on the requested ring. * * @ring: ring to start the fence driver on * @irq_src: interrupt source to use for this ring * @irq_type: interrupt type to use for this ring * * Make the fence driver ready for processing (all asics). * Not all asics have all rings, so each asic will only * start the fence driver on the rings it has. * Returns 0 for success, errors for failure. */ int amdgpu_fence_driver_start_ring(struct amdgpu_ring *ring, struct amdgpu_irq_src *irq_src, unsigned irq_type) { struct amdgpu_device *adev = ring->adev; uint64_t index; if (ring != &adev->uvd.ring) { ring->fence_drv.cpu_addr = &adev->wb.wb[ring->fence_offs]; ring->fence_drv.gpu_addr = adev->wb.gpu_addr + (ring->fence_offs * 4); } else { /* put fence directly behind firmware */ index = ALIGN(adev->uvd.fw->size, 8); ring->fence_drv.cpu_addr = adev->uvd.cpu_addr + index; ring->fence_drv.gpu_addr = adev->uvd.gpu_addr + index; } amdgpu_fence_write(ring, atomic_read(&ring->fence_drv.last_seq)); amdgpu_irq_get(adev, irq_src, irq_type); ring->fence_drv.irq_src = irq_src; ring->fence_drv.irq_type = irq_type; ring->fence_drv.initialized = true; dev_info(adev->dev, "fence driver on ring %d use gpu addr 0x%016llx, " "cpu addr 0x%p\n", ring->idx, ring->fence_drv.gpu_addr, ring->fence_drv.cpu_addr); return 0; }
int xgpu_ai_mailbox_get_irq(struct amdgpu_device *adev) { int r; r = amdgpu_irq_get(adev, &adev->virt.rcv_irq, 0); if (r) return r; r = amdgpu_irq_get(adev, &adev->virt.ack_irq, 0); if (r) { amdgpu_irq_put(adev, &adev->virt.rcv_irq, 0); return r; } INIT_WORK(&adev->virt.flr_work, xgpu_ai_mailbox_flr_work); return 0; }
/** * amdgpu_fence_driver_resume - resume the fence driver * for all possible rings. * * @adev: amdgpu device pointer * * Resume the fence driver for all possible rings (all asics). * Not all asics have all rings, so each asic will only * start the fence driver on the rings it has using * amdgpu_fence_driver_start_ring(). * Returns 0 for success. */ void amdgpu_fence_driver_resume(struct amdgpu_device *adev) { int i; for (i = 0; i < AMDGPU_MAX_RINGS; i++) { struct amdgpu_ring *ring = adev->rings[i]; if (!ring || !ring->fence_drv.initialized) continue; /* enable the interrupt */ amdgpu_irq_get(adev, ring->fence_drv.irq_src, ring->fence_drv.irq_type); } }
static int gmc_v9_0_late_init(void *handle) { struct amdgpu_device *adev = (struct amdgpu_device *)handle; /* * The latest engine allocation on gfx9 is: * Engine 0, 1: idle * Engine 2, 3: firmware * Engine 4~13: amdgpu ring, subject to change when ring number changes * Engine 14~15: idle * Engine 16: kfd tlb invalidation * Engine 17: Gart flushes */ unsigned vm_inv_eng[AMDGPU_MAX_VMHUBS] = { 4, 4 }; unsigned i; int r; /* * TODO - Uncomment once GART corruption issue is fixed. */ /* amdgpu_bo_late_init(adev); */ for(i = 0; i < adev->num_rings; ++i) { struct amdgpu_ring *ring = adev->rings[i]; unsigned vmhub = ring->funcs->vmhub; ring->vm_inv_eng = vm_inv_eng[vmhub]++; dev_info(adev->dev, "ring %u(%s) uses VM inv eng %u on hub %u\n", ring->idx, ring->name, ring->vm_inv_eng, ring->funcs->vmhub); } /* Engine 16 is used for KFD and 17 for GART flushes */ for(i = 0; i < AMDGPU_MAX_VMHUBS; ++i) BUG_ON(vm_inv_eng[i] > 16); if (adev->asic_type == CHIP_VEGA10 && !amdgpu_sriov_vf(adev)) { r = gmc_v9_0_ecc_available(adev); if (r == 1) { DRM_INFO("ECC is active.\n"); } else if (r == 0) { DRM_INFO("ECC is not present.\n"); adev->df_funcs->enable_ecc_force_par_wr_rmw(adev, false); } else { DRM_ERROR("gmc_v9_0_ecc_available() failed. r: %d\n", r); return r; } } return amdgpu_irq_get(adev, &adev->gmc.vm_fault, 0); }