Path: blob/master/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
29285 views
// SPDX-License-Identifier: MIT1/*2* Copyright 2014 Advanced Micro Devices, Inc.3*4* Permission is hereby granted, free of charge, to any person obtaining a5* copy of this software and associated documentation files (the "Software"),6* to deal in the Software without restriction, including without limitation7* the rights to use, copy, modify, merge, publish, distribute, sublicense,8* and/or sell copies of the Software, and to permit persons to whom the9* Software is furnished to do so, subject to the following conditions:10*11* The above copyright notice and this permission notice shall be included in12* all copies or substantial portions of the Software.13*14* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR15* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,16* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL17* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR18* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,19* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR20* OTHER DEALINGS IN THE SOFTWARE.21*/2223#include "amdgpu_amdkfd.h"24#include "amd_pcie.h"25#include "amd_shared.h"2627#include "amdgpu.h"28#include "amdgpu_gfx.h"29#include "amdgpu_dma_buf.h"30#include <drm/ttm/ttm_tt.h>31#include <linux/module.h>32#include <linux/dma-buf.h>33#include "amdgpu_xgmi.h"34#include <uapi/linux/kfd_ioctl.h>35#include "amdgpu_ras.h"36#include "amdgpu_umc.h"37#include "amdgpu_reset.h"3839/* Total memory size in system memory and all GPU VRAM. Used to40* estimate worst case amount of memory to reserve for page tables41*/42uint64_t amdgpu_amdkfd_total_mem_size;4344static bool kfd_initialized;4546int amdgpu_amdkfd_init(void)47{48struct sysinfo si;49int ret;5051si_meminfo(&si);52amdgpu_amdkfd_total_mem_size = si.freeram - si.freehigh;53amdgpu_amdkfd_total_mem_size *= si.mem_unit;5455ret = kgd2kfd_init();56kfd_initialized = !ret;5758return ret;59}6061void amdgpu_amdkfd_fini(void)62{63if (kfd_initialized) {64kgd2kfd_exit();65kfd_initialized = false;66}67}6869void amdgpu_amdkfd_device_probe(struct amdgpu_device *adev)70{71bool vf = amdgpu_sriov_vf(adev);7273if (!kfd_initialized)74return;7576adev->kfd.dev = kgd2kfd_probe(adev, vf);77}7879/**80* amdgpu_doorbell_get_kfd_info - Report doorbell configuration required to81* setup amdkfd82*83* @adev: amdgpu_device pointer84* @aperture_base: output returning doorbell aperture base physical address85* @aperture_size: output returning doorbell aperture size in bytes86* @start_offset: output returning # of doorbell bytes reserved for amdgpu.87*88* amdgpu and amdkfd share the doorbell aperture. amdgpu sets it up,89* takes doorbells required for its own rings and reports the setup to amdkfd.90* amdgpu reserved doorbells are at the start of the doorbell aperture.91*/92static void amdgpu_doorbell_get_kfd_info(struct amdgpu_device *adev,93phys_addr_t *aperture_base,94size_t *aperture_size,95size_t *start_offset)96{97/*98* The first num_kernel_doorbells are used by amdgpu.99* amdkfd takes whatever's left in the aperture.100*/101if (adev->enable_mes) {102/*103* With MES enabled, we only need to initialize104* the base address. The size and offset are105* not initialized as AMDGPU manages the whole106* doorbell space.107*/108*aperture_base = adev->doorbell.base;109*aperture_size = 0;110*start_offset = 0;111} else if (adev->doorbell.size > adev->doorbell.num_kernel_doorbells *112sizeof(u32)) {113*aperture_base = adev->doorbell.base;114*aperture_size = adev->doorbell.size;115*start_offset = adev->doorbell.num_kernel_doorbells * sizeof(u32);116} else {117*aperture_base = 0;118*aperture_size = 0;119*start_offset = 0;120}121}122123124static void amdgpu_amdkfd_reset_work(struct work_struct *work)125{126struct amdgpu_device *adev = container_of(work, struct amdgpu_device,127kfd.reset_work);128129struct amdgpu_reset_context reset_context;130131memset(&reset_context, 0, sizeof(reset_context));132133reset_context.method = AMD_RESET_METHOD_NONE;134reset_context.reset_req_dev = adev;135reset_context.src = adev->enable_mes ?136AMDGPU_RESET_SRC_MES :137AMDGPU_RESET_SRC_HWS;138clear_bit(AMDGPU_NEED_FULL_RESET, &reset_context.flags);139140amdgpu_device_gpu_recover(adev, NULL, &reset_context);141}142143static const struct drm_client_funcs kfd_client_funcs = {144.unregister = drm_client_release,145};146147int amdgpu_amdkfd_drm_client_create(struct amdgpu_device *adev)148{149int ret;150151if (!adev->kfd.init_complete || adev->kfd.client.dev)152return 0;153154ret = drm_client_init(&adev->ddev, &adev->kfd.client, "kfd",155&kfd_client_funcs);156if (ret) {157dev_err(adev->dev, "Failed to init DRM client: %d\n",158ret);159return ret;160}161162drm_client_register(&adev->kfd.client);163164return 0;165}166167void amdgpu_amdkfd_device_init(struct amdgpu_device *adev)168{169int i;170int last_valid_bit;171172amdgpu_amdkfd_gpuvm_init_mem_limits();173174if (adev->kfd.dev) {175struct kgd2kfd_shared_resources gpu_resources = {176.compute_vmid_bitmap =177((1 << AMDGPU_NUM_VMID) - 1) -178((1 << adev->vm_manager.first_kfd_vmid) - 1),179.num_pipe_per_mec = adev->gfx.mec.num_pipe_per_mec,180.num_queue_per_pipe = adev->gfx.mec.num_queue_per_pipe,181.gpuvm_size = min(adev->vm_manager.max_pfn182<< AMDGPU_GPU_PAGE_SHIFT,183AMDGPU_GMC_HOLE_START),184.drm_render_minor = adev_to_drm(adev)->render->index,185.sdma_doorbell_idx = adev->doorbell_index.sdma_engine,186.enable_mes = adev->enable_mes,187};188189/* this is going to have a few of the MSBs set that we need to190* clear191*/192bitmap_complement(gpu_resources.cp_queue_bitmap,193adev->gfx.mec_bitmap[0].queue_bitmap,194AMDGPU_MAX_QUEUES);195196/* According to linux/bitmap.h we shouldn't use bitmap_clear if197* nbits is not compile time constant198*/199last_valid_bit = 1 /* only first MEC can have compute queues */200* adev->gfx.mec.num_pipe_per_mec201* adev->gfx.mec.num_queue_per_pipe;202for (i = last_valid_bit; i < AMDGPU_MAX_QUEUES; ++i)203clear_bit(i, gpu_resources.cp_queue_bitmap);204205amdgpu_doorbell_get_kfd_info(adev,206&gpu_resources.doorbell_physical_address,207&gpu_resources.doorbell_aperture_size,208&gpu_resources.doorbell_start_offset);209210/* Since SOC15, BIF starts to statically use the211* lower 12 bits of doorbell addresses for routing212* based on settings in registers like213* SDMA0_DOORBELL_RANGE etc..214* In order to route a doorbell to CP engine, the lower215* 12 bits of its address has to be outside the range216* set for SDMA, VCN, and IH blocks.217*/218if (adev->asic_type >= CHIP_VEGA10) {219gpu_resources.non_cp_doorbells_start =220adev->doorbell_index.first_non_cp;221gpu_resources.non_cp_doorbells_end =222adev->doorbell_index.last_non_cp;223}224225adev->kfd.init_complete = kgd2kfd_device_init(adev->kfd.dev,226&gpu_resources);227228amdgpu_amdkfd_total_mem_size += adev->gmc.real_vram_size;229230INIT_WORK(&adev->kfd.reset_work, amdgpu_amdkfd_reset_work);231}232}233234void amdgpu_amdkfd_device_fini_sw(struct amdgpu_device *adev)235{236if (adev->kfd.dev) {237kgd2kfd_device_exit(adev->kfd.dev);238adev->kfd.dev = NULL;239amdgpu_amdkfd_total_mem_size -= adev->gmc.real_vram_size;240}241}242243void amdgpu_amdkfd_interrupt(struct amdgpu_device *adev,244const void *ih_ring_entry)245{246if (adev->kfd.dev)247kgd2kfd_interrupt(adev->kfd.dev, ih_ring_entry);248}249250void amdgpu_amdkfd_suspend(struct amdgpu_device *adev, bool suspend_proc)251{252if (adev->kfd.dev) {253if (adev->in_s0ix)254kgd2kfd_stop_sched_all_nodes(adev->kfd.dev);255else256kgd2kfd_suspend(adev->kfd.dev, suspend_proc);257}258}259260int amdgpu_amdkfd_resume(struct amdgpu_device *adev, bool resume_proc)261{262int r = 0;263264if (adev->kfd.dev) {265if (adev->in_s0ix)266r = kgd2kfd_start_sched_all_nodes(adev->kfd.dev);267else268r = kgd2kfd_resume(adev->kfd.dev, resume_proc);269}270271return r;272}273274void amdgpu_amdkfd_suspend_process(struct amdgpu_device *adev)275{276if (adev->kfd.dev)277kgd2kfd_suspend_process(adev->kfd.dev);278}279280int amdgpu_amdkfd_resume_process(struct amdgpu_device *adev)281{282int r = 0;283284if (adev->kfd.dev)285r = kgd2kfd_resume_process(adev->kfd.dev);286287return r;288}289290int amdgpu_amdkfd_pre_reset(struct amdgpu_device *adev,291struct amdgpu_reset_context *reset_context)292{293int r = 0;294295if (adev->kfd.dev)296r = kgd2kfd_pre_reset(adev->kfd.dev, reset_context);297298return r;299}300301int amdgpu_amdkfd_post_reset(struct amdgpu_device *adev)302{303int r = 0;304305if (adev->kfd.dev)306r = kgd2kfd_post_reset(adev->kfd.dev);307308return r;309}310311void amdgpu_amdkfd_gpu_reset(struct amdgpu_device *adev)312{313if (amdgpu_device_should_recover_gpu(adev))314amdgpu_reset_domain_schedule(adev->reset_domain,315&adev->kfd.reset_work);316}317318int amdgpu_amdkfd_alloc_gtt_mem(struct amdgpu_device *adev, size_t size,319void **mem_obj, uint64_t *gpu_addr,320void **cpu_ptr, bool cp_mqd_gfx9)321{322struct amdgpu_bo *bo = NULL;323struct amdgpu_bo_param bp;324int r;325void *cpu_ptr_tmp = NULL;326327memset(&bp, 0, sizeof(bp));328bp.size = size;329bp.byte_align = PAGE_SIZE;330bp.domain = AMDGPU_GEM_DOMAIN_GTT;331bp.flags = AMDGPU_GEM_CREATE_CPU_GTT_USWC;332bp.type = ttm_bo_type_kernel;333bp.resv = NULL;334bp.bo_ptr_size = sizeof(struct amdgpu_bo);335336if (cp_mqd_gfx9)337bp.flags |= AMDGPU_GEM_CREATE_CP_MQD_GFX9;338339r = amdgpu_bo_create(adev, &bp, &bo);340if (r) {341dev_err(adev->dev,342"failed to allocate BO for amdkfd (%d)\n", r);343return r;344}345346/* map the buffer */347r = amdgpu_bo_reserve(bo, true);348if (r) {349dev_err(adev->dev, "(%d) failed to reserve bo for amdkfd\n", r);350goto allocate_mem_reserve_bo_failed;351}352353r = amdgpu_bo_pin(bo, AMDGPU_GEM_DOMAIN_GTT);354if (r) {355dev_err(adev->dev, "(%d) failed to pin bo for amdkfd\n", r);356goto allocate_mem_pin_bo_failed;357}358359r = amdgpu_ttm_alloc_gart(&bo->tbo);360if (r) {361dev_err(adev->dev, "%p bind failed\n", bo);362goto allocate_mem_kmap_bo_failed;363}364365r = amdgpu_bo_kmap(bo, &cpu_ptr_tmp);366if (r) {367dev_err(adev->dev,368"(%d) failed to map bo to kernel for amdkfd\n", r);369goto allocate_mem_kmap_bo_failed;370}371372*mem_obj = bo;373*gpu_addr = amdgpu_bo_gpu_offset(bo);374*cpu_ptr = cpu_ptr_tmp;375376amdgpu_bo_unreserve(bo);377378return 0;379380allocate_mem_kmap_bo_failed:381amdgpu_bo_unpin(bo);382allocate_mem_pin_bo_failed:383amdgpu_bo_unreserve(bo);384allocate_mem_reserve_bo_failed:385amdgpu_bo_unref(&bo);386387return r;388}389390void amdgpu_amdkfd_free_gtt_mem(struct amdgpu_device *adev, void **mem_obj)391{392struct amdgpu_bo **bo = (struct amdgpu_bo **) mem_obj;393394if (!bo || !*bo)395return;396397(void)amdgpu_bo_reserve(*bo, true);398amdgpu_bo_kunmap(*bo);399amdgpu_bo_unpin(*bo);400amdgpu_bo_unreserve(*bo);401amdgpu_bo_unref(bo);402}403404int amdgpu_amdkfd_alloc_gws(struct amdgpu_device *adev, size_t size,405void **mem_obj)406{407struct amdgpu_bo *bo = NULL;408struct amdgpu_bo_user *ubo;409struct amdgpu_bo_param bp;410int r;411412memset(&bp, 0, sizeof(bp));413bp.size = size;414bp.byte_align = 1;415bp.domain = AMDGPU_GEM_DOMAIN_GWS;416bp.flags = AMDGPU_GEM_CREATE_NO_CPU_ACCESS;417bp.type = ttm_bo_type_device;418bp.resv = NULL;419bp.bo_ptr_size = sizeof(struct amdgpu_bo);420421r = amdgpu_bo_create_user(adev, &bp, &ubo);422if (r) {423dev_err(adev->dev,424"failed to allocate gws BO for amdkfd (%d)\n", r);425return r;426}427428bo = &ubo->bo;429*mem_obj = bo;430return 0;431}432433void amdgpu_amdkfd_free_gws(struct amdgpu_device *adev, void *mem_obj)434{435struct amdgpu_bo *bo = (struct amdgpu_bo *)mem_obj;436437amdgpu_bo_unref(&bo);438}439440uint32_t amdgpu_amdkfd_get_fw_version(struct amdgpu_device *adev,441enum kgd_engine_type type)442{443switch (type) {444case KGD_ENGINE_PFP:445return adev->gfx.pfp_fw_version;446447case KGD_ENGINE_ME:448return adev->gfx.me_fw_version;449450case KGD_ENGINE_CE:451return adev->gfx.ce_fw_version;452453case KGD_ENGINE_MEC1:454return adev->gfx.mec_fw_version;455456case KGD_ENGINE_MEC2:457return adev->gfx.mec2_fw_version;458459case KGD_ENGINE_RLC:460return adev->gfx.rlc_fw_version;461462case KGD_ENGINE_SDMA1:463return adev->sdma.instance[0].fw_version;464465case KGD_ENGINE_SDMA2:466return adev->sdma.instance[1].fw_version;467468default:469return 0;470}471472return 0;473}474475void amdgpu_amdkfd_get_local_mem_info(struct amdgpu_device *adev,476struct kfd_local_mem_info *mem_info,477struct amdgpu_xcp *xcp)478{479memset(mem_info, 0, sizeof(*mem_info));480481if (xcp) {482if (adev->gmc.real_vram_size == adev->gmc.visible_vram_size)483mem_info->local_mem_size_public =484KFD_XCP_MEMORY_SIZE(adev, xcp->id);485else486mem_info->local_mem_size_private =487KFD_XCP_MEMORY_SIZE(adev, xcp->id);488} else if (adev->apu_prefer_gtt) {489mem_info->local_mem_size_public = (ttm_tt_pages_limit() << PAGE_SHIFT);490mem_info->local_mem_size_private = 0;491} else {492mem_info->local_mem_size_public = adev->gmc.visible_vram_size;493mem_info->local_mem_size_private = adev->gmc.real_vram_size -494adev->gmc.visible_vram_size;495}496mem_info->vram_width = adev->gmc.vram_width;497498pr_debug("Address base: %pap public 0x%llx private 0x%llx\n",499&adev->gmc.aper_base,500mem_info->local_mem_size_public,501mem_info->local_mem_size_private);502503if (adev->pm.dpm_enabled) {504if (amdgpu_emu_mode == 1)505mem_info->mem_clk_max = 0;506else507mem_info->mem_clk_max = amdgpu_dpm_get_mclk(adev, false) / 100;508} else509mem_info->mem_clk_max = 100;510}511512uint64_t amdgpu_amdkfd_get_gpu_clock_counter(struct amdgpu_device *adev)513{514if (adev->gfx.funcs->get_gpu_clock_counter)515return adev->gfx.funcs->get_gpu_clock_counter(adev);516return 0;517}518519uint32_t amdgpu_amdkfd_get_max_engine_clock_in_mhz(struct amdgpu_device *adev)520{521/* the sclk is in quantas of 10kHz */522if (adev->pm.dpm_enabled)523return amdgpu_dpm_get_sclk(adev, false) / 100;524else525return 100;526}527528int amdgpu_amdkfd_get_dmabuf_info(struct amdgpu_device *adev, int dma_buf_fd,529struct amdgpu_device **dmabuf_adev,530uint64_t *bo_size, void *metadata_buffer,531size_t buffer_size, uint32_t *metadata_size,532uint32_t *flags, int8_t *xcp_id)533{534struct dma_buf *dma_buf;535struct drm_gem_object *obj;536struct amdgpu_bo *bo;537uint64_t metadata_flags;538int r = -EINVAL;539540dma_buf = dma_buf_get(dma_buf_fd);541if (IS_ERR(dma_buf))542return PTR_ERR(dma_buf);543544if (dma_buf->ops != &amdgpu_dmabuf_ops)545/* Can't handle non-graphics buffers */546goto out_put;547548obj = dma_buf->priv;549if (obj->dev->driver != adev_to_drm(adev)->driver)550/* Can't handle buffers from different drivers */551goto out_put;552553adev = drm_to_adev(obj->dev);554bo = gem_to_amdgpu_bo(obj);555if (!(bo->preferred_domains & (AMDGPU_GEM_DOMAIN_VRAM |556AMDGPU_GEM_DOMAIN_GTT)))557/* Only VRAM and GTT BOs are supported */558goto out_put;559560r = 0;561if (dmabuf_adev)562*dmabuf_adev = adev;563if (bo_size)564*bo_size = amdgpu_bo_size(bo);565if (metadata_buffer)566r = amdgpu_bo_get_metadata(bo, metadata_buffer, buffer_size,567metadata_size, &metadata_flags);568if (flags) {569*flags = (bo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM) ?570KFD_IOC_ALLOC_MEM_FLAGS_VRAM571: KFD_IOC_ALLOC_MEM_FLAGS_GTT;572573if (bo->flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED)574*flags |= KFD_IOC_ALLOC_MEM_FLAGS_PUBLIC;575}576if (xcp_id)577*xcp_id = bo->xcp_id;578579out_put:580dma_buf_put(dma_buf);581return r;582}583584int amdgpu_amdkfd_get_pcie_bandwidth_mbytes(struct amdgpu_device *adev, bool is_min)585{586int num_lanes_shift = (is_min ? ffs(adev->pm.pcie_mlw_mask) :587fls(adev->pm.pcie_mlw_mask)) - 1;588int gen_speed_shift = (is_min ? ffs(adev->pm.pcie_gen_mask &589CAIL_PCIE_LINK_SPEED_SUPPORT_MASK) :590fls(adev->pm.pcie_gen_mask &591CAIL_PCIE_LINK_SPEED_SUPPORT_MASK)) - 1;592uint32_t num_lanes_mask = 1 << num_lanes_shift;593uint32_t gen_speed_mask = 1 << gen_speed_shift;594int num_lanes_factor = 0, gen_speed_mbits_factor = 0;595596switch (num_lanes_mask) {597case CAIL_PCIE_LINK_WIDTH_SUPPORT_X1:598num_lanes_factor = 1;599break;600case CAIL_PCIE_LINK_WIDTH_SUPPORT_X2:601num_lanes_factor = 2;602break;603case CAIL_PCIE_LINK_WIDTH_SUPPORT_X4:604num_lanes_factor = 4;605break;606case CAIL_PCIE_LINK_WIDTH_SUPPORT_X8:607num_lanes_factor = 8;608break;609case CAIL_PCIE_LINK_WIDTH_SUPPORT_X12:610num_lanes_factor = 12;611break;612case CAIL_PCIE_LINK_WIDTH_SUPPORT_X16:613num_lanes_factor = 16;614break;615case CAIL_PCIE_LINK_WIDTH_SUPPORT_X32:616num_lanes_factor = 32;617break;618}619620switch (gen_speed_mask) {621case CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1:622gen_speed_mbits_factor = 2500;623break;624case CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2:625gen_speed_mbits_factor = 5000;626break;627case CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3:628gen_speed_mbits_factor = 8000;629break;630case CAIL_PCIE_LINK_SPEED_SUPPORT_GEN4:631gen_speed_mbits_factor = 16000;632break;633case CAIL_PCIE_LINK_SPEED_SUPPORT_GEN5:634gen_speed_mbits_factor = 32000;635break;636}637638return (num_lanes_factor * gen_speed_mbits_factor)/BITS_PER_BYTE;639}640641int amdgpu_amdkfd_submit_ib(struct amdgpu_device *adev,642enum kgd_engine_type engine,643uint32_t vmid, uint64_t gpu_addr,644uint32_t *ib_cmd, uint32_t ib_len)645{646struct amdgpu_job *job;647struct amdgpu_ib *ib;648struct amdgpu_ring *ring;649struct dma_fence *f = NULL;650int ret;651652switch (engine) {653case KGD_ENGINE_MEC1:654ring = &adev->gfx.compute_ring[0];655break;656case KGD_ENGINE_SDMA1:657ring = &adev->sdma.instance[0].ring;658break;659case KGD_ENGINE_SDMA2:660ring = &adev->sdma.instance[1].ring;661break;662default:663pr_err("Invalid engine in IB submission: %d\n", engine);664ret = -EINVAL;665goto err;666}667668ret = amdgpu_job_alloc(adev, NULL, NULL, NULL, 1, &job, 0);669if (ret)670goto err;671672ib = &job->ibs[0];673memset(ib, 0, sizeof(struct amdgpu_ib));674675ib->gpu_addr = gpu_addr;676ib->ptr = ib_cmd;677ib->length_dw = ib_len;678/* This works for NO_HWS. TODO: need to handle without knowing VMID */679job->vmid = vmid;680job->num_ibs = 1;681682ret = amdgpu_ib_schedule(ring, 1, ib, job, &f);683684if (ret) {685DRM_ERROR("amdgpu: failed to schedule IB.\n");686goto err_ib_sched;687}688689/* Drop the initial kref_init count (see drm_sched_main as example) */690dma_fence_put(f);691ret = dma_fence_wait(f, false);692693err_ib_sched:694amdgpu_job_free(job);695err:696return ret;697}698699void amdgpu_amdkfd_set_compute_idle(struct amdgpu_device *adev, bool idle)700{701enum amd_powergating_state state = idle ? AMD_PG_STATE_GATE : AMD_PG_STATE_UNGATE;702if ((IP_VERSION_MAJ(amdgpu_ip_version(adev, GC_HWIP, 0)) == 11 &&703((adev->mes.kiq_version & AMDGPU_MES_VERSION_MASK) <= 64)) ||704(IP_VERSION_MAJ(amdgpu_ip_version(adev, GC_HWIP, 0)) == 12)) {705pr_debug("GFXOFF is %s\n", idle ? "enabled" : "disabled");706amdgpu_gfx_off_ctrl(adev, idle);707} else if ((IP_VERSION_MAJ(amdgpu_ip_version(adev, GC_HWIP, 0)) == 9) &&708(adev->flags & AMD_IS_APU)) {709/* Disable GFXOFF and PG. Temporary workaround710* to fix some compute applications issue on GFX9.711*/712struct amdgpu_ip_block *gfx_block = amdgpu_device_ip_get_ip_block(adev, AMD_IP_BLOCK_TYPE_GFX);713if (gfx_block != NULL)714gfx_block->version->funcs->set_powergating_state((void *)gfx_block, state);715}716amdgpu_dpm_switch_power_profile(adev,717PP_SMC_POWER_PROFILE_COMPUTE,718!idle);719}720721bool amdgpu_amdkfd_is_kfd_vmid(struct amdgpu_device *adev, u32 vmid)722{723if (adev->kfd.dev)724return vmid >= adev->vm_manager.first_kfd_vmid;725726return false;727}728729bool amdgpu_amdkfd_have_atomics_support(struct amdgpu_device *adev)730{731return adev->have_atomics_support;732}733734void amdgpu_amdkfd_debug_mem_fence(struct amdgpu_device *adev)735{736amdgpu_device_flush_hdp(adev, NULL);737}738739bool amdgpu_amdkfd_is_fed(struct amdgpu_device *adev)740{741return amdgpu_ras_get_fed_status(adev);742}743744void amdgpu_amdkfd_ras_pasid_poison_consumption_handler(struct amdgpu_device *adev,745enum amdgpu_ras_block block, uint16_t pasid,746pasid_notify pasid_fn, void *data, uint32_t reset)747{748amdgpu_umc_pasid_poison_handler(adev, block, pasid, pasid_fn, data, reset);749}750751void amdgpu_amdkfd_ras_poison_consumption_handler(struct amdgpu_device *adev,752enum amdgpu_ras_block block, uint32_t reset)753{754amdgpu_umc_pasid_poison_handler(adev, block, 0, NULL, NULL, reset);755}756757int amdgpu_amdkfd_send_close_event_drain_irq(struct amdgpu_device *adev,758uint32_t *payload)759{760int ret;761762/* Device or IH ring is not ready so bail. */763ret = amdgpu_ih_wait_on_checkpoint_process_ts(adev, &adev->irq.ih);764if (ret)765return ret;766767/* Send payload to fence KFD interrupts */768amdgpu_amdkfd_interrupt(adev, payload);769770return 0;771}772773int amdgpu_amdkfd_check_and_lock_kfd(struct amdgpu_device *adev)774{775return kgd2kfd_check_and_lock_kfd(adev->kfd.dev);776}777778void amdgpu_amdkfd_unlock_kfd(struct amdgpu_device *adev)779{780kgd2kfd_unlock_kfd(adev->kfd.dev);781}782783784u64 amdgpu_amdkfd_xcp_memory_size(struct amdgpu_device *adev, int xcp_id)785{786s8 mem_id = KFD_XCP_MEM_ID(adev, xcp_id);787u64 tmp;788789if (adev->gmc.num_mem_partitions && xcp_id >= 0 && mem_id >= 0) {790if (adev->gmc.is_app_apu && adev->gmc.num_mem_partitions == 1) {791/* In NPS1 mode, we should restrict the vram reporting792* tied to the ttm_pages_limit which is 1/2 of the system793* memory. For other partition modes, the HBM is uniformly794* divided already per numa node reported. If user wants to795* go beyond the default ttm limit and maximize the ROCm796* allocations, they can go up to max ttm and sysmem limits.797*/798799tmp = (ttm_tt_pages_limit() << PAGE_SHIFT) / num_online_nodes();800} else {801tmp = adev->gmc.mem_partitions[mem_id].size;802}803do_div(tmp, adev->xcp_mgr->num_xcp_per_mem_partition);804return ALIGN_DOWN(tmp, PAGE_SIZE);805} else if (adev->apu_prefer_gtt) {806return (ttm_tt_pages_limit() << PAGE_SHIFT);807} else {808return adev->gmc.real_vram_size;809}810}811812int amdgpu_amdkfd_unmap_hiq(struct amdgpu_device *adev, u32 doorbell_off,813u32 inst)814{815struct amdgpu_kiq *kiq = &adev->gfx.kiq[inst];816struct amdgpu_ring *kiq_ring = &kiq->ring;817struct amdgpu_ring_funcs *ring_funcs;818struct amdgpu_ring *ring;819int r = 0;820821if (!kiq->pmf || !kiq->pmf->kiq_unmap_queues)822return -EINVAL;823824if (!kiq_ring->sched.ready || amdgpu_in_reset(adev))825return 0;826827ring_funcs = kzalloc(sizeof(*ring_funcs), GFP_KERNEL);828if (!ring_funcs)829return -ENOMEM;830831ring = kzalloc(sizeof(*ring), GFP_KERNEL);832if (!ring) {833r = -ENOMEM;834goto free_ring_funcs;835}836837ring_funcs->type = AMDGPU_RING_TYPE_COMPUTE;838ring->doorbell_index = doorbell_off;839ring->funcs = ring_funcs;840841spin_lock(&kiq->ring_lock);842843if (amdgpu_ring_alloc(kiq_ring, kiq->pmf->unmap_queues_size)) {844spin_unlock(&kiq->ring_lock);845r = -ENOMEM;846goto free_ring;847}848849kiq->pmf->kiq_unmap_queues(kiq_ring, ring, RESET_QUEUES, 0, 0);850851/* Submit unmap queue packet */852amdgpu_ring_commit(kiq_ring);853/*854* Ring test will do a basic scratch register change check. Just run855* this to ensure that unmap queues that is submitted before got856* processed successfully before returning.857*/858r = amdgpu_ring_test_helper(kiq_ring);859860spin_unlock(&kiq->ring_lock);861862free_ring:863kfree(ring);864865free_ring_funcs:866kfree(ring_funcs);867868return r;869}870871/* Stop scheduling on KFD */872int amdgpu_amdkfd_stop_sched(struct amdgpu_device *adev, uint32_t node_id)873{874if (!adev->kfd.init_complete)875return 0;876877return kgd2kfd_stop_sched(adev->kfd.dev, node_id);878}879880/* Start scheduling on KFD */881int amdgpu_amdkfd_start_sched(struct amdgpu_device *adev, uint32_t node_id)882{883if (!adev->kfd.init_complete)884return 0;885886return kgd2kfd_start_sched(adev->kfd.dev, node_id);887}888889/* check if there are KFD queues active */890bool amdgpu_amdkfd_compute_active(struct amdgpu_device *adev, uint32_t node_id)891{892if (!adev->kfd.init_complete)893return false;894895return kgd2kfd_compute_active(adev->kfd.dev, node_id);896}897898/* Config CGTT_SQ_CLK_CTRL */899int amdgpu_amdkfd_config_sq_perfmon(struct amdgpu_device *adev, uint32_t xcp_id,900bool core_override_enable, bool reg_override_enable, bool perfmon_override_enable)901{902int r;903904if (!adev->kfd.init_complete)905return 0;906907r = psp_config_sq_perfmon(&adev->psp, xcp_id, core_override_enable,908reg_override_enable, perfmon_override_enable);909910return r;911}912913914