Path: blob/master/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
26517 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)253kgd2kfd_suspend(adev->kfd.dev, suspend_proc);254}255256int amdgpu_amdkfd_resume(struct amdgpu_device *adev, bool resume_proc)257{258int r = 0;259260if (adev->kfd.dev)261r = kgd2kfd_resume(adev->kfd.dev, resume_proc);262263return r;264}265266void amdgpu_amdkfd_suspend_process(struct amdgpu_device *adev)267{268if (adev->kfd.dev)269kgd2kfd_suspend_process(adev->kfd.dev);270}271272int amdgpu_amdkfd_resume_process(struct amdgpu_device *adev)273{274int r = 0;275276if (adev->kfd.dev)277r = kgd2kfd_resume_process(adev->kfd.dev);278279return r;280}281282int amdgpu_amdkfd_pre_reset(struct amdgpu_device *adev,283struct amdgpu_reset_context *reset_context)284{285int r = 0;286287if (adev->kfd.dev)288r = kgd2kfd_pre_reset(adev->kfd.dev, reset_context);289290return r;291}292293int amdgpu_amdkfd_post_reset(struct amdgpu_device *adev)294{295int r = 0;296297if (adev->kfd.dev)298r = kgd2kfd_post_reset(adev->kfd.dev);299300return r;301}302303void amdgpu_amdkfd_gpu_reset(struct amdgpu_device *adev)304{305if (amdgpu_device_should_recover_gpu(adev))306amdgpu_reset_domain_schedule(adev->reset_domain,307&adev->kfd.reset_work);308}309310int amdgpu_amdkfd_alloc_gtt_mem(struct amdgpu_device *adev, size_t size,311void **mem_obj, uint64_t *gpu_addr,312void **cpu_ptr, bool cp_mqd_gfx9)313{314struct amdgpu_bo *bo = NULL;315struct amdgpu_bo_param bp;316int r;317void *cpu_ptr_tmp = NULL;318319memset(&bp, 0, sizeof(bp));320bp.size = size;321bp.byte_align = PAGE_SIZE;322bp.domain = AMDGPU_GEM_DOMAIN_GTT;323bp.flags = AMDGPU_GEM_CREATE_CPU_GTT_USWC;324bp.type = ttm_bo_type_kernel;325bp.resv = NULL;326bp.bo_ptr_size = sizeof(struct amdgpu_bo);327328if (cp_mqd_gfx9)329bp.flags |= AMDGPU_GEM_CREATE_CP_MQD_GFX9;330331r = amdgpu_bo_create(adev, &bp, &bo);332if (r) {333dev_err(adev->dev,334"failed to allocate BO for amdkfd (%d)\n", r);335return r;336}337338/* map the buffer */339r = amdgpu_bo_reserve(bo, true);340if (r) {341dev_err(adev->dev, "(%d) failed to reserve bo for amdkfd\n", r);342goto allocate_mem_reserve_bo_failed;343}344345r = amdgpu_bo_pin(bo, AMDGPU_GEM_DOMAIN_GTT);346if (r) {347dev_err(adev->dev, "(%d) failed to pin bo for amdkfd\n", r);348goto allocate_mem_pin_bo_failed;349}350351r = amdgpu_ttm_alloc_gart(&bo->tbo);352if (r) {353dev_err(adev->dev, "%p bind failed\n", bo);354goto allocate_mem_kmap_bo_failed;355}356357r = amdgpu_bo_kmap(bo, &cpu_ptr_tmp);358if (r) {359dev_err(adev->dev,360"(%d) failed to map bo to kernel for amdkfd\n", r);361goto allocate_mem_kmap_bo_failed;362}363364*mem_obj = bo;365*gpu_addr = amdgpu_bo_gpu_offset(bo);366*cpu_ptr = cpu_ptr_tmp;367368amdgpu_bo_unreserve(bo);369370return 0;371372allocate_mem_kmap_bo_failed:373amdgpu_bo_unpin(bo);374allocate_mem_pin_bo_failed:375amdgpu_bo_unreserve(bo);376allocate_mem_reserve_bo_failed:377amdgpu_bo_unref(&bo);378379return r;380}381382void amdgpu_amdkfd_free_gtt_mem(struct amdgpu_device *adev, void **mem_obj)383{384struct amdgpu_bo **bo = (struct amdgpu_bo **) mem_obj;385386if (!bo || !*bo)387return;388389(void)amdgpu_bo_reserve(*bo, true);390amdgpu_bo_kunmap(*bo);391amdgpu_bo_unpin(*bo);392amdgpu_bo_unreserve(*bo);393amdgpu_bo_unref(bo);394}395396int amdgpu_amdkfd_alloc_gws(struct amdgpu_device *adev, size_t size,397void **mem_obj)398{399struct amdgpu_bo *bo = NULL;400struct amdgpu_bo_user *ubo;401struct amdgpu_bo_param bp;402int r;403404memset(&bp, 0, sizeof(bp));405bp.size = size;406bp.byte_align = 1;407bp.domain = AMDGPU_GEM_DOMAIN_GWS;408bp.flags = AMDGPU_GEM_CREATE_NO_CPU_ACCESS;409bp.type = ttm_bo_type_device;410bp.resv = NULL;411bp.bo_ptr_size = sizeof(struct amdgpu_bo);412413r = amdgpu_bo_create_user(adev, &bp, &ubo);414if (r) {415dev_err(adev->dev,416"failed to allocate gws BO for amdkfd (%d)\n", r);417return r;418}419420bo = &ubo->bo;421*mem_obj = bo;422return 0;423}424425void amdgpu_amdkfd_free_gws(struct amdgpu_device *adev, void *mem_obj)426{427struct amdgpu_bo *bo = (struct amdgpu_bo *)mem_obj;428429amdgpu_bo_unref(&bo);430}431432uint32_t amdgpu_amdkfd_get_fw_version(struct amdgpu_device *adev,433enum kgd_engine_type type)434{435switch (type) {436case KGD_ENGINE_PFP:437return adev->gfx.pfp_fw_version;438439case KGD_ENGINE_ME:440return adev->gfx.me_fw_version;441442case KGD_ENGINE_CE:443return adev->gfx.ce_fw_version;444445case KGD_ENGINE_MEC1:446return adev->gfx.mec_fw_version;447448case KGD_ENGINE_MEC2:449return adev->gfx.mec2_fw_version;450451case KGD_ENGINE_RLC:452return adev->gfx.rlc_fw_version;453454case KGD_ENGINE_SDMA1:455return adev->sdma.instance[0].fw_version;456457case KGD_ENGINE_SDMA2:458return adev->sdma.instance[1].fw_version;459460default:461return 0;462}463464return 0;465}466467void amdgpu_amdkfd_get_local_mem_info(struct amdgpu_device *adev,468struct kfd_local_mem_info *mem_info,469struct amdgpu_xcp *xcp)470{471memset(mem_info, 0, sizeof(*mem_info));472473if (xcp) {474if (adev->gmc.real_vram_size == adev->gmc.visible_vram_size)475mem_info->local_mem_size_public =476KFD_XCP_MEMORY_SIZE(adev, xcp->id);477else478mem_info->local_mem_size_private =479KFD_XCP_MEMORY_SIZE(adev, xcp->id);480} else if (adev->apu_prefer_gtt) {481mem_info->local_mem_size_public = (ttm_tt_pages_limit() << PAGE_SHIFT);482mem_info->local_mem_size_private = 0;483} else {484mem_info->local_mem_size_public = adev->gmc.visible_vram_size;485mem_info->local_mem_size_private = adev->gmc.real_vram_size -486adev->gmc.visible_vram_size;487}488mem_info->vram_width = adev->gmc.vram_width;489490pr_debug("Address base: %pap public 0x%llx private 0x%llx\n",491&adev->gmc.aper_base,492mem_info->local_mem_size_public,493mem_info->local_mem_size_private);494495if (adev->pm.dpm_enabled) {496if (amdgpu_emu_mode == 1)497mem_info->mem_clk_max = 0;498else499mem_info->mem_clk_max = amdgpu_dpm_get_mclk(adev, false) / 100;500} else501mem_info->mem_clk_max = 100;502}503504uint64_t amdgpu_amdkfd_get_gpu_clock_counter(struct amdgpu_device *adev)505{506if (adev->gfx.funcs->get_gpu_clock_counter)507return adev->gfx.funcs->get_gpu_clock_counter(adev);508return 0;509}510511uint32_t amdgpu_amdkfd_get_max_engine_clock_in_mhz(struct amdgpu_device *adev)512{513/* the sclk is in quantas of 10kHz */514if (adev->pm.dpm_enabled)515return amdgpu_dpm_get_sclk(adev, false) / 100;516else517return 100;518}519520int amdgpu_amdkfd_get_dmabuf_info(struct amdgpu_device *adev, int dma_buf_fd,521struct amdgpu_device **dmabuf_adev,522uint64_t *bo_size, void *metadata_buffer,523size_t buffer_size, uint32_t *metadata_size,524uint32_t *flags, int8_t *xcp_id)525{526struct dma_buf *dma_buf;527struct drm_gem_object *obj;528struct amdgpu_bo *bo;529uint64_t metadata_flags;530int r = -EINVAL;531532dma_buf = dma_buf_get(dma_buf_fd);533if (IS_ERR(dma_buf))534return PTR_ERR(dma_buf);535536if (dma_buf->ops != &amdgpu_dmabuf_ops)537/* Can't handle non-graphics buffers */538goto out_put;539540obj = dma_buf->priv;541if (obj->dev->driver != adev_to_drm(adev)->driver)542/* Can't handle buffers from different drivers */543goto out_put;544545adev = drm_to_adev(obj->dev);546bo = gem_to_amdgpu_bo(obj);547if (!(bo->preferred_domains & (AMDGPU_GEM_DOMAIN_VRAM |548AMDGPU_GEM_DOMAIN_GTT)))549/* Only VRAM and GTT BOs are supported */550goto out_put;551552r = 0;553if (dmabuf_adev)554*dmabuf_adev = adev;555if (bo_size)556*bo_size = amdgpu_bo_size(bo);557if (metadata_buffer)558r = amdgpu_bo_get_metadata(bo, metadata_buffer, buffer_size,559metadata_size, &metadata_flags);560if (flags) {561*flags = (bo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM) ?562KFD_IOC_ALLOC_MEM_FLAGS_VRAM563: KFD_IOC_ALLOC_MEM_FLAGS_GTT;564565if (bo->flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED)566*flags |= KFD_IOC_ALLOC_MEM_FLAGS_PUBLIC;567}568if (xcp_id)569*xcp_id = bo->xcp_id;570571out_put:572dma_buf_put(dma_buf);573return r;574}575576int amdgpu_amdkfd_get_pcie_bandwidth_mbytes(struct amdgpu_device *adev, bool is_min)577{578int num_lanes_shift = (is_min ? ffs(adev->pm.pcie_mlw_mask) :579fls(adev->pm.pcie_mlw_mask)) - 1;580int gen_speed_shift = (is_min ? ffs(adev->pm.pcie_gen_mask &581CAIL_PCIE_LINK_SPEED_SUPPORT_MASK) :582fls(adev->pm.pcie_gen_mask &583CAIL_PCIE_LINK_SPEED_SUPPORT_MASK)) - 1;584uint32_t num_lanes_mask = 1 << num_lanes_shift;585uint32_t gen_speed_mask = 1 << gen_speed_shift;586int num_lanes_factor = 0, gen_speed_mbits_factor = 0;587588switch (num_lanes_mask) {589case CAIL_PCIE_LINK_WIDTH_SUPPORT_X1:590num_lanes_factor = 1;591break;592case CAIL_PCIE_LINK_WIDTH_SUPPORT_X2:593num_lanes_factor = 2;594break;595case CAIL_PCIE_LINK_WIDTH_SUPPORT_X4:596num_lanes_factor = 4;597break;598case CAIL_PCIE_LINK_WIDTH_SUPPORT_X8:599num_lanes_factor = 8;600break;601case CAIL_PCIE_LINK_WIDTH_SUPPORT_X12:602num_lanes_factor = 12;603break;604case CAIL_PCIE_LINK_WIDTH_SUPPORT_X16:605num_lanes_factor = 16;606break;607case CAIL_PCIE_LINK_WIDTH_SUPPORT_X32:608num_lanes_factor = 32;609break;610}611612switch (gen_speed_mask) {613case CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1:614gen_speed_mbits_factor = 2500;615break;616case CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2:617gen_speed_mbits_factor = 5000;618break;619case CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3:620gen_speed_mbits_factor = 8000;621break;622case CAIL_PCIE_LINK_SPEED_SUPPORT_GEN4:623gen_speed_mbits_factor = 16000;624break;625case CAIL_PCIE_LINK_SPEED_SUPPORT_GEN5:626gen_speed_mbits_factor = 32000;627break;628}629630return (num_lanes_factor * gen_speed_mbits_factor)/BITS_PER_BYTE;631}632633int amdgpu_amdkfd_submit_ib(struct amdgpu_device *adev,634enum kgd_engine_type engine,635uint32_t vmid, uint64_t gpu_addr,636uint32_t *ib_cmd, uint32_t ib_len)637{638struct amdgpu_job *job;639struct amdgpu_ib *ib;640struct amdgpu_ring *ring;641struct dma_fence *f = NULL;642int ret;643644switch (engine) {645case KGD_ENGINE_MEC1:646ring = &adev->gfx.compute_ring[0];647break;648case KGD_ENGINE_SDMA1:649ring = &adev->sdma.instance[0].ring;650break;651case KGD_ENGINE_SDMA2:652ring = &adev->sdma.instance[1].ring;653break;654default:655pr_err("Invalid engine in IB submission: %d\n", engine);656ret = -EINVAL;657goto err;658}659660ret = amdgpu_job_alloc(adev, NULL, NULL, NULL, 1, &job, 0);661if (ret)662goto err;663664ib = &job->ibs[0];665memset(ib, 0, sizeof(struct amdgpu_ib));666667ib->gpu_addr = gpu_addr;668ib->ptr = ib_cmd;669ib->length_dw = ib_len;670/* This works for NO_HWS. TODO: need to handle without knowing VMID */671job->vmid = vmid;672job->num_ibs = 1;673674ret = amdgpu_ib_schedule(ring, 1, ib, job, &f);675676if (ret) {677DRM_ERROR("amdgpu: failed to schedule IB.\n");678goto err_ib_sched;679}680681/* Drop the initial kref_init count (see drm_sched_main as example) */682dma_fence_put(f);683ret = dma_fence_wait(f, false);684685err_ib_sched:686amdgpu_job_free(job);687err:688return ret;689}690691void amdgpu_amdkfd_set_compute_idle(struct amdgpu_device *adev, bool idle)692{693enum amd_powergating_state state = idle ? AMD_PG_STATE_GATE : AMD_PG_STATE_UNGATE;694if ((IP_VERSION_MAJ(amdgpu_ip_version(adev, GC_HWIP, 0)) == 11 &&695((adev->mes.kiq_version & AMDGPU_MES_VERSION_MASK) <= 64)) ||696(IP_VERSION_MAJ(amdgpu_ip_version(adev, GC_HWIP, 0)) == 12)) {697pr_debug("GFXOFF is %s\n", idle ? "enabled" : "disabled");698amdgpu_gfx_off_ctrl(adev, idle);699} else if ((IP_VERSION_MAJ(amdgpu_ip_version(adev, GC_HWIP, 0)) == 9) &&700(adev->flags & AMD_IS_APU)) {701/* Disable GFXOFF and PG. Temporary workaround702* to fix some compute applications issue on GFX9.703*/704struct amdgpu_ip_block *gfx_block = amdgpu_device_ip_get_ip_block(adev, AMD_IP_BLOCK_TYPE_GFX);705if (gfx_block != NULL)706gfx_block->version->funcs->set_powergating_state((void *)gfx_block, state);707}708amdgpu_dpm_switch_power_profile(adev,709PP_SMC_POWER_PROFILE_COMPUTE,710!idle);711}712713bool amdgpu_amdkfd_is_kfd_vmid(struct amdgpu_device *adev, u32 vmid)714{715if (adev->kfd.dev)716return vmid >= adev->vm_manager.first_kfd_vmid;717718return false;719}720721bool amdgpu_amdkfd_have_atomics_support(struct amdgpu_device *adev)722{723return adev->have_atomics_support;724}725726void amdgpu_amdkfd_debug_mem_fence(struct amdgpu_device *adev)727{728amdgpu_device_flush_hdp(adev, NULL);729}730731bool amdgpu_amdkfd_is_fed(struct amdgpu_device *adev)732{733return amdgpu_ras_get_fed_status(adev);734}735736void amdgpu_amdkfd_ras_pasid_poison_consumption_handler(struct amdgpu_device *adev,737enum amdgpu_ras_block block, uint16_t pasid,738pasid_notify pasid_fn, void *data, uint32_t reset)739{740amdgpu_umc_pasid_poison_handler(adev, block, pasid, pasid_fn, data, reset);741}742743void amdgpu_amdkfd_ras_poison_consumption_handler(struct amdgpu_device *adev,744enum amdgpu_ras_block block, uint32_t reset)745{746amdgpu_umc_pasid_poison_handler(adev, block, 0, NULL, NULL, reset);747}748749int amdgpu_amdkfd_send_close_event_drain_irq(struct amdgpu_device *adev,750uint32_t *payload)751{752int ret;753754/* Device or IH ring is not ready so bail. */755ret = amdgpu_ih_wait_on_checkpoint_process_ts(adev, &adev->irq.ih);756if (ret)757return ret;758759/* Send payload to fence KFD interrupts */760amdgpu_amdkfd_interrupt(adev, payload);761762return 0;763}764765int amdgpu_amdkfd_check_and_lock_kfd(struct amdgpu_device *adev)766{767return kgd2kfd_check_and_lock_kfd(adev->kfd.dev);768}769770void amdgpu_amdkfd_unlock_kfd(struct amdgpu_device *adev)771{772kgd2kfd_unlock_kfd(adev->kfd.dev);773}774775776u64 amdgpu_amdkfd_xcp_memory_size(struct amdgpu_device *adev, int xcp_id)777{778s8 mem_id = KFD_XCP_MEM_ID(adev, xcp_id);779u64 tmp;780781if (adev->gmc.num_mem_partitions && xcp_id >= 0 && mem_id >= 0) {782if (adev->gmc.is_app_apu && adev->gmc.num_mem_partitions == 1) {783/* In NPS1 mode, we should restrict the vram reporting784* tied to the ttm_pages_limit which is 1/2 of the system785* memory. For other partition modes, the HBM is uniformly786* divided already per numa node reported. If user wants to787* go beyond the default ttm limit and maximize the ROCm788* allocations, they can go up to max ttm and sysmem limits.789*/790791tmp = (ttm_tt_pages_limit() << PAGE_SHIFT) / num_online_nodes();792} else {793tmp = adev->gmc.mem_partitions[mem_id].size;794}795do_div(tmp, adev->xcp_mgr->num_xcp_per_mem_partition);796return ALIGN_DOWN(tmp, PAGE_SIZE);797} else if (adev->apu_prefer_gtt) {798return (ttm_tt_pages_limit() << PAGE_SHIFT);799} else {800return adev->gmc.real_vram_size;801}802}803804int amdgpu_amdkfd_unmap_hiq(struct amdgpu_device *adev, u32 doorbell_off,805u32 inst)806{807struct amdgpu_kiq *kiq = &adev->gfx.kiq[inst];808struct amdgpu_ring *kiq_ring = &kiq->ring;809struct amdgpu_ring_funcs *ring_funcs;810struct amdgpu_ring *ring;811int r = 0;812813if (!kiq->pmf || !kiq->pmf->kiq_unmap_queues)814return -EINVAL;815816if (!kiq_ring->sched.ready || amdgpu_in_reset(adev))817return 0;818819ring_funcs = kzalloc(sizeof(*ring_funcs), GFP_KERNEL);820if (!ring_funcs)821return -ENOMEM;822823ring = kzalloc(sizeof(*ring), GFP_KERNEL);824if (!ring) {825r = -ENOMEM;826goto free_ring_funcs;827}828829ring_funcs->type = AMDGPU_RING_TYPE_COMPUTE;830ring->doorbell_index = doorbell_off;831ring->funcs = ring_funcs;832833spin_lock(&kiq->ring_lock);834835if (amdgpu_ring_alloc(kiq_ring, kiq->pmf->unmap_queues_size)) {836spin_unlock(&kiq->ring_lock);837r = -ENOMEM;838goto free_ring;839}840841kiq->pmf->kiq_unmap_queues(kiq_ring, ring, RESET_QUEUES, 0, 0);842843/* Submit unmap queue packet */844amdgpu_ring_commit(kiq_ring);845/*846* Ring test will do a basic scratch register change check. Just run847* this to ensure that unmap queues that is submitted before got848* processed successfully before returning.849*/850r = amdgpu_ring_test_helper(kiq_ring);851852spin_unlock(&kiq->ring_lock);853854free_ring:855kfree(ring);856857free_ring_funcs:858kfree(ring_funcs);859860return r;861}862863/* Stop scheduling on KFD */864int amdgpu_amdkfd_stop_sched(struct amdgpu_device *adev, uint32_t node_id)865{866if (!adev->kfd.init_complete)867return 0;868869return kgd2kfd_stop_sched(adev->kfd.dev, node_id);870}871872/* Start scheduling on KFD */873int amdgpu_amdkfd_start_sched(struct amdgpu_device *adev, uint32_t node_id)874{875if (!adev->kfd.init_complete)876return 0;877878return kgd2kfd_start_sched(adev->kfd.dev, node_id);879}880881/* check if there are KFD queues active */882bool amdgpu_amdkfd_compute_active(struct amdgpu_device *adev, uint32_t node_id)883{884if (!adev->kfd.init_complete)885return false;886887return kgd2kfd_compute_active(adev->kfd.dev, node_id);888}889890/* Config CGTT_SQ_CLK_CTRL */891int amdgpu_amdkfd_config_sq_perfmon(struct amdgpu_device *adev, uint32_t xcp_id,892bool core_override_enable, bool reg_override_enable, bool perfmon_override_enable)893{894int r;895896if (!adev->kfd.init_complete)897return 0;898899r = psp_config_sq_perfmon(&adev->psp, xcp_id, core_override_enable,900reg_override_enable, perfmon_override_enable);901902return r;903}904905906