cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

gmc_v11_0.c (25365B)


      1/*
      2 * Copyright 2021 Advanced Micro Devices, Inc.
      3 *
      4 * Permission is hereby granted, free of charge, to any person obtaining a
      5 * copy of this software and associated documentation files (the "Software"),
      6 * to deal in the Software without restriction, including without limitation
      7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      8 * and/or sell copies of the Software, and to permit persons to whom the
      9 * Software is furnished to do so, subject to the following conditions:
     10 *
     11 * The above copyright notice and this permission notice shall be included in
     12 * all copies or substantial portions of the Software.
     13 *
     14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
     18 * 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 OR
     20 * OTHER DEALINGS IN THE SOFTWARE.
     21 *
     22 */
     23#include <linux/firmware.h>
     24#include <linux/pci.h>
     25#include "amdgpu.h"
     26#include "amdgpu_atomfirmware.h"
     27#include "gmc_v11_0.h"
     28#include "umc_v8_7.h"
     29#include "athub/athub_3_0_0_sh_mask.h"
     30#include "athub/athub_3_0_0_offset.h"
     31#include "oss/osssys_6_0_0_offset.h"
     32#include "ivsrcid/vmc/irqsrcs_vmc_1_0.h"
     33#include "navi10_enum.h"
     34#include "soc15.h"
     35#include "soc15d.h"
     36#include "soc15_common.h"
     37#include "nbio_v4_3.h"
     38#include "gfxhub_v3_0.h"
     39#include "mmhub_v3_0.h"
     40#include "mmhub_v3_0_2.h"
     41#include "athub_v3_0.h"
     42
     43
     44static int gmc_v11_0_ecc_interrupt_state(struct amdgpu_device *adev,
     45					 struct amdgpu_irq_src *src,
     46					 unsigned type,
     47					 enum amdgpu_interrupt_state state)
     48{
     49	return 0;
     50}
     51
     52static int
     53gmc_v11_0_vm_fault_interrupt_state(struct amdgpu_device *adev,
     54				   struct amdgpu_irq_src *src, unsigned type,
     55				   enum amdgpu_interrupt_state state)
     56{
     57	switch (state) {
     58	case AMDGPU_IRQ_STATE_DISABLE:
     59		/* MM HUB */
     60		amdgpu_gmc_set_vm_fault_masks(adev, AMDGPU_MMHUB_0, false);
     61		/* GFX HUB */
     62		amdgpu_gmc_set_vm_fault_masks(adev, AMDGPU_GFXHUB_0, false);
     63		break;
     64	case AMDGPU_IRQ_STATE_ENABLE:
     65		/* MM HUB */
     66		amdgpu_gmc_set_vm_fault_masks(adev, AMDGPU_MMHUB_0, true);
     67		/* GFX HUB */
     68		amdgpu_gmc_set_vm_fault_masks(adev, AMDGPU_GFXHUB_0, true);
     69		break;
     70	default:
     71		break;
     72	}
     73
     74	return 0;
     75}
     76
     77static int gmc_v11_0_process_interrupt(struct amdgpu_device *adev,
     78				       struct amdgpu_irq_src *source,
     79				       struct amdgpu_iv_entry *entry)
     80{
     81	struct amdgpu_vmhub *hub = &adev->vmhub[entry->vmid_src];
     82	uint32_t status = 0;
     83	u64 addr;
     84
     85	addr = (u64)entry->src_data[0] << 12;
     86	addr |= ((u64)entry->src_data[1] & 0xf) << 44;
     87
     88	if (!amdgpu_sriov_vf(adev)) {
     89		/*
     90		 * Issue a dummy read to wait for the status register to
     91		 * be updated to avoid reading an incorrect value due to
     92		 * the new fast GRBM interface.
     93		 */
     94		if (entry->vmid_src == AMDGPU_GFXHUB_0)
     95			RREG32(hub->vm_l2_pro_fault_status);
     96
     97		status = RREG32(hub->vm_l2_pro_fault_status);
     98		WREG32_P(hub->vm_l2_pro_fault_cntl, 1, ~1);
     99	}
    100
    101	if (printk_ratelimit()) {
    102		struct amdgpu_task_info task_info;
    103
    104		memset(&task_info, 0, sizeof(struct amdgpu_task_info));
    105		amdgpu_vm_get_task_info(adev, entry->pasid, &task_info);
    106
    107		dev_err(adev->dev,
    108			"[%s] page fault (src_id:%u ring:%u vmid:%u pasid:%u, "
    109			"for process %s pid %d thread %s pid %d)\n",
    110			entry->vmid_src ? "mmhub" : "gfxhub",
    111			entry->src_id, entry->ring_id, entry->vmid,
    112			entry->pasid, task_info.process_name, task_info.tgid,
    113			task_info.task_name, task_info.pid);
    114		dev_err(adev->dev, "  in page starting at address 0x%016llx from client %d\n",
    115			addr, entry->client_id);
    116		if (!amdgpu_sriov_vf(adev))
    117			hub->vmhub_funcs->print_l2_protection_fault_status(adev, status);
    118	}
    119
    120	return 0;
    121}
    122
    123static const struct amdgpu_irq_src_funcs gmc_v11_0_irq_funcs = {
    124	.set = gmc_v11_0_vm_fault_interrupt_state,
    125	.process = gmc_v11_0_process_interrupt,
    126};
    127
    128static const struct amdgpu_irq_src_funcs gmc_v11_0_ecc_funcs = {
    129	.set = gmc_v11_0_ecc_interrupt_state,
    130	.process = amdgpu_umc_process_ecc_irq,
    131};
    132
    133static void gmc_v11_0_set_irq_funcs(struct amdgpu_device *adev)
    134{
    135	adev->gmc.vm_fault.num_types = 1;
    136	adev->gmc.vm_fault.funcs = &gmc_v11_0_irq_funcs;
    137
    138	if (!amdgpu_sriov_vf(adev)) {
    139		adev->gmc.ecc_irq.num_types = 1;
    140		adev->gmc.ecc_irq.funcs = &gmc_v11_0_ecc_funcs;
    141	}
    142}
    143
    144/**
    145 * gmc_v11_0_use_invalidate_semaphore - judge whether to use semaphore
    146 *
    147 * @adev: amdgpu_device pointer
    148 * @vmhub: vmhub type
    149 *
    150 */
    151static bool gmc_v11_0_use_invalidate_semaphore(struct amdgpu_device *adev,
    152				       uint32_t vmhub)
    153{
    154	return ((vmhub == AMDGPU_MMHUB_0) &&
    155		(!amdgpu_sriov_vf(adev)));
    156}
    157
    158static bool gmc_v11_0_get_vmid_pasid_mapping_info(
    159					struct amdgpu_device *adev,
    160					uint8_t vmid, uint16_t *p_pasid)
    161{
    162	*p_pasid = RREG32(SOC15_REG_OFFSET(OSSSYS, 0, regIH_VMID_0_LUT) + vmid) & 0xffff;
    163
    164	return !!(*p_pasid);
    165}
    166
    167/*
    168 * GART
    169 * VMID 0 is the physical GPU addresses as used by the kernel.
    170 * VMIDs 1-15 are used for userspace clients and are handled
    171 * by the amdgpu vm/hsa code.
    172 */
    173
    174static void gmc_v11_0_flush_vm_hub(struct amdgpu_device *adev, uint32_t vmid,
    175				   unsigned int vmhub, uint32_t flush_type)
    176{
    177	bool use_semaphore = gmc_v11_0_use_invalidate_semaphore(adev, vmhub);
    178	struct amdgpu_vmhub *hub = &adev->vmhub[vmhub];
    179	u32 inv_req = hub->vmhub_funcs->get_invalidate_req(vmid, flush_type);
    180	u32 tmp;
    181	/* Use register 17 for GART */
    182	const unsigned eng = 17;
    183	unsigned int i;
    184
    185	spin_lock(&adev->gmc.invalidate_lock);
    186	/*
    187	 * It may lose gpuvm invalidate acknowldege state across power-gating
    188	 * off cycle, add semaphore acquire before invalidation and semaphore
    189	 * release after invalidation to avoid entering power gated state
    190	 * to WA the Issue
    191	 */
    192
    193	/* TODO: It needs to continue working on debugging with semaphore for GFXHUB as well. */
    194	if (use_semaphore) {
    195		for (i = 0; i < adev->usec_timeout; i++) {
    196			/* a read return value of 1 means semaphore acuqire */
    197			tmp = RREG32_NO_KIQ(hub->vm_inv_eng0_sem +
    198					    hub->eng_distance * eng);
    199			if (tmp & 0x1)
    200				break;
    201			udelay(1);
    202		}
    203
    204		if (i >= adev->usec_timeout)
    205			DRM_ERROR("Timeout waiting for sem acquire in VM flush!\n");
    206	}
    207
    208	WREG32_NO_KIQ(hub->vm_inv_eng0_req + hub->eng_distance * eng, inv_req);
    209
    210	/* Wait for ACK with a delay.*/
    211	for (i = 0; i < adev->usec_timeout; i++) {
    212		tmp = RREG32_NO_KIQ(hub->vm_inv_eng0_ack +
    213				    hub->eng_distance * eng);
    214		tmp &= 1 << vmid;
    215		if (tmp)
    216			break;
    217
    218		udelay(1);
    219	}
    220
    221	/* TODO: It needs to continue working on debugging with semaphore for GFXHUB as well. */
    222	if (use_semaphore)
    223		/*
    224		 * add semaphore release after invalidation,
    225		 * write with 0 means semaphore release
    226		 */
    227		WREG32_NO_KIQ(hub->vm_inv_eng0_sem +
    228			      hub->eng_distance * eng, 0);
    229
    230	/* Issue additional private vm invalidation to MMHUB */
    231	if ((vmhub != AMDGPU_GFXHUB_0) &&
    232	    (hub->vm_l2_bank_select_reserved_cid2)) {
    233		inv_req = RREG32_NO_KIQ(hub->vm_l2_bank_select_reserved_cid2);
    234		/* bit 25: RSERVED_CACHE_PRIVATE_INVALIDATION */
    235		inv_req |= (1 << 25);
    236		/* Issue private invalidation */
    237		WREG32_NO_KIQ(hub->vm_l2_bank_select_reserved_cid2, inv_req);
    238		/* Read back to ensure invalidation is done*/
    239		RREG32_NO_KIQ(hub->vm_l2_bank_select_reserved_cid2);
    240	}
    241
    242	spin_unlock(&adev->gmc.invalidate_lock);
    243
    244	if (i < adev->usec_timeout)
    245		return;
    246
    247	DRM_ERROR("Timeout waiting for VM flush ACK!\n");
    248}
    249
    250/**
    251 * gmc_v11_0_flush_gpu_tlb - gart tlb flush callback
    252 *
    253 * @adev: amdgpu_device pointer
    254 * @vmid: vm instance to flush
    255 *
    256 * Flush the TLB for the requested page table.
    257 */
    258static void gmc_v11_0_flush_gpu_tlb(struct amdgpu_device *adev, uint32_t vmid,
    259					uint32_t vmhub, uint32_t flush_type)
    260{
    261	if ((vmhub == AMDGPU_GFXHUB_0) && !adev->gfx.is_poweron)
    262		return;
    263
    264	/* flush hdp cache */
    265	adev->hdp.funcs->flush_hdp(adev, NULL);
    266
    267	/* For SRIOV run time, driver shouldn't access the register through MMIO
    268	 * Directly use kiq to do the vm invalidation instead
    269	 */
    270	if (adev->gfx.kiq.ring.sched.ready && !adev->enable_mes &&
    271	    (amdgpu_sriov_runtime(adev) || !amdgpu_sriov_vf(adev))) {
    272		struct amdgpu_vmhub *hub = &adev->vmhub[vmhub];
    273		const unsigned eng = 17;
    274		u32 inv_req = hub->vmhub_funcs->get_invalidate_req(vmid, flush_type);
    275		u32 req = hub->vm_inv_eng0_req + hub->eng_distance * eng;
    276		u32 ack = hub->vm_inv_eng0_ack + hub->eng_distance * eng;
    277
    278		amdgpu_virt_kiq_reg_write_reg_wait(adev, req, ack, inv_req,
    279				1 << vmid);
    280		return;
    281	}
    282
    283	mutex_lock(&adev->mman.gtt_window_lock);
    284	gmc_v11_0_flush_vm_hub(adev, vmid, vmhub, 0);
    285	mutex_unlock(&adev->mman.gtt_window_lock);
    286	return;
    287}
    288
    289/**
    290 * gmc_v11_0_flush_gpu_tlb_pasid - tlb flush via pasid
    291 *
    292 * @adev: amdgpu_device pointer
    293 * @pasid: pasid to be flush
    294 *
    295 * Flush the TLB for the requested pasid.
    296 */
    297static int gmc_v11_0_flush_gpu_tlb_pasid(struct amdgpu_device *adev,
    298					uint16_t pasid, uint32_t flush_type,
    299					bool all_hub)
    300{
    301	int vmid, i;
    302	signed long r;
    303	uint32_t seq;
    304	uint16_t queried_pasid;
    305	bool ret;
    306	struct amdgpu_ring *ring = &adev->gfx.kiq.ring;
    307	struct amdgpu_kiq *kiq = &adev->gfx.kiq;
    308
    309	if (amdgpu_emu_mode == 0 && ring->sched.ready) {
    310		spin_lock(&adev->gfx.kiq.ring_lock);
    311		/* 2 dwords flush + 8 dwords fence */
    312		amdgpu_ring_alloc(ring, kiq->pmf->invalidate_tlbs_size + 8);
    313		kiq->pmf->kiq_invalidate_tlbs(ring,
    314					pasid, flush_type, all_hub);
    315		r = amdgpu_fence_emit_polling(ring, &seq, MAX_KIQ_REG_WAIT);
    316		if (r) {
    317			amdgpu_ring_undo(ring);
    318			spin_unlock(&adev->gfx.kiq.ring_lock);
    319			return -ETIME;
    320		}
    321
    322		amdgpu_ring_commit(ring);
    323		spin_unlock(&adev->gfx.kiq.ring_lock);
    324		r = amdgpu_fence_wait_polling(ring, seq, adev->usec_timeout);
    325		if (r < 1) {
    326			dev_err(adev->dev, "wait for kiq fence error: %ld.\n", r);
    327			return -ETIME;
    328		}
    329
    330		return 0;
    331	}
    332
    333	for (vmid = 1; vmid < 16; vmid++) {
    334
    335		ret = gmc_v11_0_get_vmid_pasid_mapping_info(adev, vmid,
    336				&queried_pasid);
    337		if (ret	&& queried_pasid == pasid) {
    338			if (all_hub) {
    339				for (i = 0; i < adev->num_vmhubs; i++)
    340					gmc_v11_0_flush_gpu_tlb(adev, vmid,
    341							i, flush_type);
    342			} else {
    343				gmc_v11_0_flush_gpu_tlb(adev, vmid,
    344						AMDGPU_GFXHUB_0, flush_type);
    345			}
    346			break;
    347		}
    348	}
    349
    350	return 0;
    351}
    352
    353static uint64_t gmc_v11_0_emit_flush_gpu_tlb(struct amdgpu_ring *ring,
    354					     unsigned vmid, uint64_t pd_addr)
    355{
    356	bool use_semaphore = gmc_v11_0_use_invalidate_semaphore(ring->adev, ring->funcs->vmhub);
    357	struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->funcs->vmhub];
    358	uint32_t req = hub->vmhub_funcs->get_invalidate_req(vmid, 0);
    359	unsigned eng = ring->vm_inv_eng;
    360
    361	/*
    362	 * It may lose gpuvm invalidate acknowldege state across power-gating
    363	 * off cycle, add semaphore acquire before invalidation and semaphore
    364	 * release after invalidation to avoid entering power gated state
    365	 * to WA the Issue
    366	 */
    367
    368	/* TODO: It needs to continue working on debugging with semaphore for GFXHUB as well. */
    369	if (use_semaphore)
    370		/* a read return value of 1 means semaphore acuqire */
    371		amdgpu_ring_emit_reg_wait(ring,
    372					  hub->vm_inv_eng0_sem +
    373					  hub->eng_distance * eng, 0x1, 0x1);
    374
    375	amdgpu_ring_emit_wreg(ring, hub->ctx0_ptb_addr_lo32 +
    376			      (hub->ctx_addr_distance * vmid),
    377			      lower_32_bits(pd_addr));
    378
    379	amdgpu_ring_emit_wreg(ring, hub->ctx0_ptb_addr_hi32 +
    380			      (hub->ctx_addr_distance * vmid),
    381			      upper_32_bits(pd_addr));
    382
    383	amdgpu_ring_emit_reg_write_reg_wait(ring, hub->vm_inv_eng0_req +
    384					    hub->eng_distance * eng,
    385					    hub->vm_inv_eng0_ack +
    386					    hub->eng_distance * eng,
    387					    req, 1 << vmid);
    388
    389	/* TODO: It needs to continue working on debugging with semaphore for GFXHUB as well. */
    390	if (use_semaphore)
    391		/*
    392		 * add semaphore release after invalidation,
    393		 * write with 0 means semaphore release
    394		 */
    395		amdgpu_ring_emit_wreg(ring, hub->vm_inv_eng0_sem +
    396				      hub->eng_distance * eng, 0);
    397
    398	return pd_addr;
    399}
    400
    401static void gmc_v11_0_emit_pasid_mapping(struct amdgpu_ring *ring, unsigned vmid,
    402					 unsigned pasid)
    403{
    404	struct amdgpu_device *adev = ring->adev;
    405	uint32_t reg;
    406
    407	/* MES fw manages IH_VMID_x_LUT updating */
    408	if (ring->is_mes_queue)
    409		return;
    410
    411	if (ring->funcs->vmhub == AMDGPU_GFXHUB_0)
    412		reg = SOC15_REG_OFFSET(OSSSYS, 0, regIH_VMID_0_LUT) + vmid;
    413	else
    414		reg = SOC15_REG_OFFSET(OSSSYS, 0, regIH_VMID_0_LUT_MM) + vmid;
    415
    416	amdgpu_ring_emit_wreg(ring, reg, pasid);
    417}
    418
    419/*
    420 * PTE format:
    421 * 63:59 reserved
    422 * 58:57 reserved
    423 * 56 F
    424 * 55 L
    425 * 54 reserved
    426 * 53:52 SW
    427 * 51 T
    428 * 50:48 mtype
    429 * 47:12 4k physical page base address
    430 * 11:7 fragment
    431 * 6 write
    432 * 5 read
    433 * 4 exe
    434 * 3 Z
    435 * 2 snooped
    436 * 1 system
    437 * 0 valid
    438 *
    439 * PDE format:
    440 * 63:59 block fragment size
    441 * 58:55 reserved
    442 * 54 P
    443 * 53:48 reserved
    444 * 47:6 physical base address of PD or PTE
    445 * 5:3 reserved
    446 * 2 C
    447 * 1 system
    448 * 0 valid
    449 */
    450
    451static uint64_t gmc_v11_0_map_mtype(struct amdgpu_device *adev, uint32_t flags)
    452{
    453	switch (flags) {
    454	case AMDGPU_VM_MTYPE_DEFAULT:
    455		return AMDGPU_PTE_MTYPE_NV10(MTYPE_NC);
    456	case AMDGPU_VM_MTYPE_NC:
    457		return AMDGPU_PTE_MTYPE_NV10(MTYPE_NC);
    458	case AMDGPU_VM_MTYPE_WC:
    459		return AMDGPU_PTE_MTYPE_NV10(MTYPE_WC);
    460	case AMDGPU_VM_MTYPE_CC:
    461		return AMDGPU_PTE_MTYPE_NV10(MTYPE_CC);
    462	case AMDGPU_VM_MTYPE_UC:
    463		return AMDGPU_PTE_MTYPE_NV10(MTYPE_UC);
    464	default:
    465		return AMDGPU_PTE_MTYPE_NV10(MTYPE_NC);
    466	}
    467}
    468
    469static void gmc_v11_0_get_vm_pde(struct amdgpu_device *adev, int level,
    470				 uint64_t *addr, uint64_t *flags)
    471{
    472	if (!(*flags & AMDGPU_PDE_PTE) && !(*flags & AMDGPU_PTE_SYSTEM))
    473		*addr = adev->vm_manager.vram_base_offset + *addr -
    474			adev->gmc.vram_start;
    475	BUG_ON(*addr & 0xFFFF00000000003FULL);
    476
    477	if (!adev->gmc.translate_further)
    478		return;
    479
    480	if (level == AMDGPU_VM_PDB1) {
    481		/* Set the block fragment size */
    482		if (!(*flags & AMDGPU_PDE_PTE))
    483			*flags |= AMDGPU_PDE_BFS(0x9);
    484
    485	} else if (level == AMDGPU_VM_PDB0) {
    486		if (*flags & AMDGPU_PDE_PTE)
    487			*flags &= ~AMDGPU_PDE_PTE;
    488		else
    489			*flags |= AMDGPU_PTE_TF;
    490	}
    491}
    492
    493static void gmc_v11_0_get_vm_pte(struct amdgpu_device *adev,
    494				 struct amdgpu_bo_va_mapping *mapping,
    495				 uint64_t *flags)
    496{
    497	*flags &= ~AMDGPU_PTE_EXECUTABLE;
    498	*flags |= mapping->flags & AMDGPU_PTE_EXECUTABLE;
    499
    500	*flags &= ~AMDGPU_PTE_MTYPE_NV10_MASK;
    501	*flags |= (mapping->flags & AMDGPU_PTE_MTYPE_NV10_MASK);
    502
    503	*flags &= ~AMDGPU_PTE_NOALLOC;
    504	*flags |= (mapping->flags & AMDGPU_PTE_NOALLOC);
    505
    506	if (mapping->flags & AMDGPU_PTE_PRT) {
    507		*flags |= AMDGPU_PTE_PRT;
    508		*flags |= AMDGPU_PTE_SNOOPED;
    509		*flags |= AMDGPU_PTE_LOG;
    510		*flags |= AMDGPU_PTE_SYSTEM;
    511		*flags &= ~AMDGPU_PTE_VALID;
    512	}
    513}
    514
    515static unsigned gmc_v11_0_get_vbios_fb_size(struct amdgpu_device *adev)
    516{
    517	return 0;
    518}
    519
    520static const struct amdgpu_gmc_funcs gmc_v11_0_gmc_funcs = {
    521	.flush_gpu_tlb = gmc_v11_0_flush_gpu_tlb,
    522	.flush_gpu_tlb_pasid = gmc_v11_0_flush_gpu_tlb_pasid,
    523	.emit_flush_gpu_tlb = gmc_v11_0_emit_flush_gpu_tlb,
    524	.emit_pasid_mapping = gmc_v11_0_emit_pasid_mapping,
    525	.map_mtype = gmc_v11_0_map_mtype,
    526	.get_vm_pde = gmc_v11_0_get_vm_pde,
    527	.get_vm_pte = gmc_v11_0_get_vm_pte,
    528	.get_vbios_fb_size = gmc_v11_0_get_vbios_fb_size,
    529};
    530
    531static void gmc_v11_0_set_gmc_funcs(struct amdgpu_device *adev)
    532{
    533	adev->gmc.gmc_funcs = &gmc_v11_0_gmc_funcs;
    534}
    535
    536static void gmc_v11_0_set_umc_funcs(struct amdgpu_device *adev)
    537{
    538	switch (adev->ip_versions[UMC_HWIP][0]) {
    539	case IP_VERSION(8, 10, 0):
    540	case IP_VERSION(8, 11, 0):
    541		break;
    542	default:
    543		break;
    544	}
    545}
    546
    547
    548static void gmc_v11_0_set_mmhub_funcs(struct amdgpu_device *adev)
    549{
    550	switch (adev->ip_versions[MMHUB_HWIP][0]) {
    551	case IP_VERSION(3, 0, 2):
    552		adev->mmhub.funcs = &mmhub_v3_0_2_funcs;
    553		break;
    554	default:
    555		adev->mmhub.funcs = &mmhub_v3_0_funcs;
    556		break;
    557	}
    558}
    559
    560static void gmc_v11_0_set_gfxhub_funcs(struct amdgpu_device *adev)
    561{
    562	adev->gfxhub.funcs = &gfxhub_v3_0_funcs;
    563}
    564
    565static int gmc_v11_0_early_init(void *handle)
    566{
    567	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
    568
    569	gmc_v11_0_set_gfxhub_funcs(adev);
    570	gmc_v11_0_set_mmhub_funcs(adev);
    571	gmc_v11_0_set_gmc_funcs(adev);
    572	gmc_v11_0_set_irq_funcs(adev);
    573	gmc_v11_0_set_umc_funcs(adev);
    574
    575	adev->gmc.shared_aperture_start = 0x2000000000000000ULL;
    576	adev->gmc.shared_aperture_end =
    577		adev->gmc.shared_aperture_start + (4ULL << 30) - 1;
    578	adev->gmc.private_aperture_start = 0x1000000000000000ULL;
    579	adev->gmc.private_aperture_end =
    580		adev->gmc.private_aperture_start + (4ULL << 30) - 1;
    581
    582	return 0;
    583}
    584
    585static int gmc_v11_0_late_init(void *handle)
    586{
    587	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
    588	int r;
    589
    590	r = amdgpu_gmc_allocate_vm_inv_eng(adev);
    591	if (r)
    592		return r;
    593
    594	r = amdgpu_gmc_ras_late_init(adev);
    595	if (r)
    596		return r;
    597
    598	return amdgpu_irq_get(adev, &adev->gmc.vm_fault, 0);
    599}
    600
    601static void gmc_v11_0_vram_gtt_location(struct amdgpu_device *adev,
    602					struct amdgpu_gmc *mc)
    603{
    604	u64 base = 0;
    605
    606	base = adev->mmhub.funcs->get_fb_location(adev);
    607
    608	amdgpu_gmc_vram_location(adev, &adev->gmc, base);
    609	amdgpu_gmc_gart_location(adev, mc);
    610
    611	/* base offset of vram pages */
    612	adev->vm_manager.vram_base_offset = adev->mmhub.funcs->get_mc_fb_offset(adev);
    613}
    614
    615/**
    616 * gmc_v11_0_mc_init - initialize the memory controller driver params
    617 *
    618 * @adev: amdgpu_device pointer
    619 *
    620 * Look up the amount of vram, vram width, and decide how to place
    621 * vram and gart within the GPU's physical address space.
    622 * Returns 0 for success.
    623 */
    624static int gmc_v11_0_mc_init(struct amdgpu_device *adev)
    625{
    626	int r;
    627
    628	/* size in MB on si */
    629	adev->gmc.mc_vram_size =
    630		adev->nbio.funcs->get_memsize(adev) * 1024ULL * 1024ULL;
    631	adev->gmc.real_vram_size = adev->gmc.mc_vram_size;
    632
    633	if (!(adev->flags & AMD_IS_APU)) {
    634		r = amdgpu_device_resize_fb_bar(adev);
    635		if (r)
    636			return r;
    637	}
    638	adev->gmc.aper_base = pci_resource_start(adev->pdev, 0);
    639	adev->gmc.aper_size = pci_resource_len(adev->pdev, 0);
    640
    641#ifdef CONFIG_X86_64
    642	if ((adev->flags & AMD_IS_APU) && !amdgpu_passthrough(adev)) {
    643		adev->gmc.aper_base = adev->mmhub.funcs->get_mc_fb_offset(adev);
    644		adev->gmc.aper_size = adev->gmc.real_vram_size;
    645	}
    646#endif
    647	/* In case the PCI BAR is larger than the actual amount of vram */
    648	adev->gmc.visible_vram_size = adev->gmc.aper_size;
    649	if (adev->gmc.visible_vram_size > adev->gmc.real_vram_size)
    650		adev->gmc.visible_vram_size = adev->gmc.real_vram_size;
    651
    652	/* set the gart size */
    653	if (amdgpu_gart_size == -1) {
    654		adev->gmc.gart_size = 512ULL << 20;
    655	} else
    656		adev->gmc.gart_size = (u64)amdgpu_gart_size << 20;
    657
    658	gmc_v11_0_vram_gtt_location(adev, &adev->gmc);
    659
    660	return 0;
    661}
    662
    663static int gmc_v11_0_gart_init(struct amdgpu_device *adev)
    664{
    665	int r;
    666
    667	if (adev->gart.bo) {
    668		WARN(1, "PCIE GART already initialized\n");
    669		return 0;
    670	}
    671
    672	/* Initialize common gart structure */
    673	r = amdgpu_gart_init(adev);
    674	if (r)
    675		return r;
    676
    677	adev->gart.table_size = adev->gart.num_gpu_pages * 8;
    678	adev->gart.gart_pte_flags = AMDGPU_PTE_MTYPE_NV10(MTYPE_UC) |
    679				 AMDGPU_PTE_EXECUTABLE;
    680
    681	return amdgpu_gart_table_vram_alloc(adev);
    682}
    683
    684static int gmc_v11_0_sw_init(void *handle)
    685{
    686	int r, vram_width = 0, vram_type = 0, vram_vendor = 0;
    687	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
    688
    689	adev->mmhub.funcs->init(adev);
    690
    691	spin_lock_init(&adev->gmc.invalidate_lock);
    692
    693	r = amdgpu_atomfirmware_get_vram_info(adev,
    694					      &vram_width, &vram_type, &vram_vendor);
    695	adev->gmc.vram_width = vram_width;
    696
    697	adev->gmc.vram_type = vram_type;
    698	adev->gmc.vram_vendor = vram_vendor;
    699
    700	switch (adev->ip_versions[GC_HWIP][0]) {
    701	case IP_VERSION(11, 0, 0):
    702	case IP_VERSION(11, 0, 1):
    703	case IP_VERSION(11, 0, 2):
    704		adev->num_vmhubs = 2;
    705		/*
    706		 * To fulfill 4-level page support,
    707		 * vm size is 256TB (48bit), maximum size,
    708		 * block size 512 (9bit)
    709		 */
    710		amdgpu_vm_adjust_size(adev, 256 * 1024, 9, 3, 48);
    711		break;
    712	default:
    713		break;
    714	}
    715
    716	/* This interrupt is VMC page fault.*/
    717	r = amdgpu_irq_add_id(adev, SOC21_IH_CLIENTID_VMC,
    718			      VMC_1_0__SRCID__VM_FAULT,
    719			      &adev->gmc.vm_fault);
    720
    721	if (r)
    722		return r;
    723
    724	r = amdgpu_irq_add_id(adev, SOC21_IH_CLIENTID_GFX,
    725			      UTCL2_1_0__SRCID__FAULT,
    726			      &adev->gmc.vm_fault);
    727	if (r)
    728		return r;
    729
    730	if (!amdgpu_sriov_vf(adev)) {
    731		/* interrupt sent to DF. */
    732		r = amdgpu_irq_add_id(adev, SOC21_IH_CLIENTID_DF, 0,
    733				      &adev->gmc.ecc_irq);
    734		if (r)
    735			return r;
    736	}
    737
    738	/*
    739	 * Set the internal MC address mask This is the max address of the GPU's
    740	 * internal address space.
    741	 */
    742	adev->gmc.mc_mask = 0xffffffffffffULL; /* 48 bit MC */
    743
    744	r = dma_set_mask_and_coherent(adev->dev, DMA_BIT_MASK(44));
    745	if (r) {
    746		printk(KERN_WARNING "amdgpu: No suitable DMA available.\n");
    747		return r;
    748	}
    749
    750	r = gmc_v11_0_mc_init(adev);
    751	if (r)
    752		return r;
    753
    754	amdgpu_gmc_get_vbios_allocations(adev);
    755
    756	/* Memory manager */
    757	r = amdgpu_bo_init(adev);
    758	if (r)
    759		return r;
    760
    761	r = gmc_v11_0_gart_init(adev);
    762	if (r)
    763		return r;
    764
    765	/*
    766	 * number of VMs
    767	 * VMID 0 is reserved for System
    768	 * amdgpu graphics/compute will use VMIDs 1-7
    769	 * amdkfd will use VMIDs 8-15
    770	 */
    771	adev->vm_manager.first_kfd_vmid = 8;
    772
    773	amdgpu_vm_manager_init(adev);
    774
    775	return 0;
    776}
    777
    778/**
    779 * gmc_v11_0_gart_fini - vm fini callback
    780 *
    781 * @adev: amdgpu_device pointer
    782 *
    783 * Tears down the driver GART/VM setup (CIK).
    784 */
    785static void gmc_v11_0_gart_fini(struct amdgpu_device *adev)
    786{
    787	amdgpu_gart_table_vram_free(adev);
    788}
    789
    790static int gmc_v11_0_sw_fini(void *handle)
    791{
    792	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
    793
    794	amdgpu_vm_manager_fini(adev);
    795	gmc_v11_0_gart_fini(adev);
    796	amdgpu_gem_force_release(adev);
    797	amdgpu_bo_fini(adev);
    798
    799	return 0;
    800}
    801
    802static void gmc_v11_0_init_golden_registers(struct amdgpu_device *adev)
    803{
    804}
    805
    806/**
    807 * gmc_v11_0_gart_enable - gart enable
    808 *
    809 * @adev: amdgpu_device pointer
    810 */
    811static int gmc_v11_0_gart_enable(struct amdgpu_device *adev)
    812{
    813	int r;
    814	bool value;
    815
    816	if (adev->gart.bo == NULL) {
    817		dev_err(adev->dev, "No VRAM object for PCIE GART.\n");
    818		return -EINVAL;
    819	}
    820
    821	amdgpu_gtt_mgr_recover(&adev->mman.gtt_mgr);
    822
    823	r = adev->mmhub.funcs->gart_enable(adev);
    824	if (r)
    825		return r;
    826
    827	/* Flush HDP after it is initialized */
    828	adev->hdp.funcs->flush_hdp(adev, NULL);
    829
    830	value = (amdgpu_vm_fault_stop == AMDGPU_VM_FAULT_STOP_ALWAYS) ?
    831		false : true;
    832
    833	adev->mmhub.funcs->set_fault_enable_default(adev, value);
    834	gmc_v11_0_flush_gpu_tlb(adev, 0, AMDGPU_MMHUB_0, 0);
    835
    836	DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
    837		 (unsigned)(adev->gmc.gart_size >> 20),
    838		 (unsigned long long)amdgpu_bo_gpu_offset(adev->gart.bo));
    839
    840	return 0;
    841}
    842
    843static int gmc_v11_0_hw_init(void *handle)
    844{
    845	int r;
    846	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
    847
    848	/* The sequence of these two function calls matters.*/
    849	gmc_v11_0_init_golden_registers(adev);
    850
    851	r = gmc_v11_0_gart_enable(adev);
    852	if (r)
    853		return r;
    854
    855	if (adev->umc.funcs && adev->umc.funcs->init_registers)
    856		adev->umc.funcs->init_registers(adev);
    857
    858	return 0;
    859}
    860
    861/**
    862 * gmc_v11_0_gart_disable - gart disable
    863 *
    864 * @adev: amdgpu_device pointer
    865 *
    866 * This disables all VM page table.
    867 */
    868static void gmc_v11_0_gart_disable(struct amdgpu_device *adev)
    869{
    870	adev->mmhub.funcs->gart_disable(adev);
    871}
    872
    873static int gmc_v11_0_hw_fini(void *handle)
    874{
    875	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
    876
    877	if (amdgpu_sriov_vf(adev)) {
    878		/* full access mode, so don't touch any GMC register */
    879		DRM_DEBUG("For SRIOV client, shouldn't do anything.\n");
    880		return 0;
    881	}
    882
    883	amdgpu_irq_put(adev, &adev->gmc.ecc_irq, 0);
    884	amdgpu_irq_put(adev, &adev->gmc.vm_fault, 0);
    885	gmc_v11_0_gart_disable(adev);
    886
    887	return 0;
    888}
    889
    890static int gmc_v11_0_suspend(void *handle)
    891{
    892	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
    893
    894	gmc_v11_0_hw_fini(adev);
    895
    896	return 0;
    897}
    898
    899static int gmc_v11_0_resume(void *handle)
    900{
    901	int r;
    902	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
    903
    904	r = gmc_v11_0_hw_init(adev);
    905	if (r)
    906		return r;
    907
    908	amdgpu_vmid_reset_all(adev);
    909
    910	return 0;
    911}
    912
    913static bool gmc_v11_0_is_idle(void *handle)
    914{
    915	/* MC is always ready in GMC v11.*/
    916	return true;
    917}
    918
    919static int gmc_v11_0_wait_for_idle(void *handle)
    920{
    921	/* There is no need to wait for MC idle in GMC v11.*/
    922	return 0;
    923}
    924
    925static int gmc_v11_0_soft_reset(void *handle)
    926{
    927	return 0;
    928}
    929
    930static int gmc_v11_0_set_clockgating_state(void *handle,
    931					   enum amd_clockgating_state state)
    932{
    933	int r;
    934	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
    935
    936	r = adev->mmhub.funcs->set_clockgating(adev, state);
    937	if (r)
    938		return r;
    939
    940	return athub_v3_0_set_clockgating(adev, state);
    941}
    942
    943static void gmc_v11_0_get_clockgating_state(void *handle, u64 *flags)
    944{
    945	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
    946
    947	adev->mmhub.funcs->get_clockgating(adev, flags);
    948
    949	athub_v3_0_get_clockgating(adev, flags);
    950}
    951
    952static int gmc_v11_0_set_powergating_state(void *handle,
    953					   enum amd_powergating_state state)
    954{
    955	return 0;
    956}
    957
    958const struct amd_ip_funcs gmc_v11_0_ip_funcs = {
    959	.name = "gmc_v11_0",
    960	.early_init = gmc_v11_0_early_init,
    961	.sw_init = gmc_v11_0_sw_init,
    962	.hw_init = gmc_v11_0_hw_init,
    963	.late_init = gmc_v11_0_late_init,
    964	.sw_fini = gmc_v11_0_sw_fini,
    965	.hw_fini = gmc_v11_0_hw_fini,
    966	.suspend = gmc_v11_0_suspend,
    967	.resume = gmc_v11_0_resume,
    968	.is_idle = gmc_v11_0_is_idle,
    969	.wait_for_idle = gmc_v11_0_wait_for_idle,
    970	.soft_reset = gmc_v11_0_soft_reset,
    971	.set_clockgating_state = gmc_v11_0_set_clockgating_state,
    972	.set_powergating_state = gmc_v11_0_set_powergating_state,
    973	.get_clockgating_state = gmc_v11_0_get_clockgating_state,
    974};
    975
    976const struct amdgpu_ip_block_version gmc_v11_0_ip_block = {
    977	.type = AMD_IP_BLOCK_TYPE_GMC,
    978	.major = 11,
    979	.minor = 0,
    980	.rev = 0,
    981	.funcs = &gmc_v11_0_ip_funcs,
    982};