brintos

brintos / linux-shallow public Read only

0
0
Text · 85.5 KiB · 4bd61c1 Raw
2964 lines · c
1/*2 * Copyright 2018 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 *22 */23 24#include <linux/firmware.h>25 26#include "amdgpu.h"27#include "amdgpu_discovery.h"28#include "soc15_hw_ip.h"29#include "discovery.h"30#include "amdgpu_ras.h"31 32#include "soc15.h"33#include "gfx_v9_0.h"34#include "gfx_v9_4_3.h"35#include "gmc_v9_0.h"36#include "df_v1_7.h"37#include "df_v3_6.h"38#include "df_v4_3.h"39#include "df_v4_6_2.h"40#include "df_v4_15.h"41#include "nbio_v6_1.h"42#include "nbio_v7_0.h"43#include "nbio_v7_4.h"44#include "nbio_v7_9.h"45#include "nbio_v7_11.h"46#include "hdp_v4_0.h"47#include "vega10_ih.h"48#include "vega20_ih.h"49#include "sdma_v4_0.h"50#include "sdma_v4_4_2.h"51#include "uvd_v7_0.h"52#include "vce_v4_0.h"53#include "vcn_v1_0.h"54#include "vcn_v2_5.h"55#include "jpeg_v2_5.h"56#include "smuio_v9_0.h"57#include "gmc_v10_0.h"58#include "gmc_v11_0.h"59#include "gmc_v12_0.h"60#include "gfxhub_v2_0.h"61#include "mmhub_v2_0.h"62#include "nbio_v2_3.h"63#include "nbio_v4_3.h"64#include "nbio_v7_2.h"65#include "nbio_v7_7.h"66#include "nbif_v6_3_1.h"67#include "hdp_v5_0.h"68#include "hdp_v5_2.h"69#include "hdp_v6_0.h"70#include "hdp_v7_0.h"71#include "nv.h"72#include "soc21.h"73#include "soc24.h"74#include "navi10_ih.h"75#include "ih_v6_0.h"76#include "ih_v6_1.h"77#include "ih_v7_0.h"78#include "gfx_v10_0.h"79#include "gfx_v11_0.h"80#include "gfx_v12_0.h"81#include "sdma_v5_0.h"82#include "sdma_v5_2.h"83#include "sdma_v6_0.h"84#include "sdma_v7_0.h"85#include "lsdma_v6_0.h"86#include "lsdma_v7_0.h"87#include "vcn_v2_0.h"88#include "jpeg_v2_0.h"89#include "vcn_v3_0.h"90#include "jpeg_v3_0.h"91#include "vcn_v4_0.h"92#include "jpeg_v4_0.h"93#include "vcn_v4_0_3.h"94#include "jpeg_v4_0_3.h"95#include "vcn_v4_0_5.h"96#include "jpeg_v4_0_5.h"97#include "amdgpu_vkms.h"98#include "mes_v11_0.h"99#include "mes_v12_0.h"100#include "smuio_v11_0.h"101#include "smuio_v11_0_6.h"102#include "smuio_v13_0.h"103#include "smuio_v13_0_3.h"104#include "smuio_v13_0_6.h"105#include "smuio_v14_0_2.h"106#include "vcn_v5_0_0.h"107#include "jpeg_v5_0_0.h"108 109#include "amdgpu_vpe.h"110#if defined(CONFIG_DRM_AMD_ISP)111#include "amdgpu_isp.h"112#endif113 114#define FIRMWARE_IP_DISCOVERY "amdgpu/ip_discovery.bin"115MODULE_FIRMWARE(FIRMWARE_IP_DISCOVERY);116 117#define mmIP_DISCOVERY_VERSION  0x16A00118#define mmRCC_CONFIG_MEMSIZE	0xde3119#define mmMP0_SMN_C2PMSG_33	0x16061120#define mmMM_INDEX		0x0121#define mmMM_INDEX_HI		0x6122#define mmMM_DATA		0x1123 124static const char *hw_id_names[HW_ID_MAX] = {125	[MP1_HWID]		= "MP1",126	[MP2_HWID]		= "MP2",127	[THM_HWID]		= "THM",128	[SMUIO_HWID]		= "SMUIO",129	[FUSE_HWID]		= "FUSE",130	[CLKA_HWID]		= "CLKA",131	[PWR_HWID]		= "PWR",132	[GC_HWID]		= "GC",133	[UVD_HWID]		= "UVD",134	[AUDIO_AZ_HWID]		= "AUDIO_AZ",135	[ACP_HWID]		= "ACP",136	[DCI_HWID]		= "DCI",137	[DMU_HWID]		= "DMU",138	[DCO_HWID]		= "DCO",139	[DIO_HWID]		= "DIO",140	[XDMA_HWID]		= "XDMA",141	[DCEAZ_HWID]		= "DCEAZ",142	[DAZ_HWID]		= "DAZ",143	[SDPMUX_HWID]		= "SDPMUX",144	[NTB_HWID]		= "NTB",145	[IOHC_HWID]		= "IOHC",146	[L2IMU_HWID]		= "L2IMU",147	[VCE_HWID]		= "VCE",148	[MMHUB_HWID]		= "MMHUB",149	[ATHUB_HWID]		= "ATHUB",150	[DBGU_NBIO_HWID]	= "DBGU_NBIO",151	[DFX_HWID]		= "DFX",152	[DBGU0_HWID]		= "DBGU0",153	[DBGU1_HWID]		= "DBGU1",154	[OSSSYS_HWID]		= "OSSSYS",155	[HDP_HWID]		= "HDP",156	[SDMA0_HWID]		= "SDMA0",157	[SDMA1_HWID]		= "SDMA1",158	[SDMA2_HWID]		= "SDMA2",159	[SDMA3_HWID]		= "SDMA3",160	[LSDMA_HWID]		= "LSDMA",161	[ISP_HWID]		= "ISP",162	[DBGU_IO_HWID]		= "DBGU_IO",163	[DF_HWID]		= "DF",164	[CLKB_HWID]		= "CLKB",165	[FCH_HWID]		= "FCH",166	[DFX_DAP_HWID]		= "DFX_DAP",167	[L1IMU_PCIE_HWID]	= "L1IMU_PCIE",168	[L1IMU_NBIF_HWID]	= "L1IMU_NBIF",169	[L1IMU_IOAGR_HWID]	= "L1IMU_IOAGR",170	[L1IMU3_HWID]		= "L1IMU3",171	[L1IMU4_HWID]		= "L1IMU4",172	[L1IMU5_HWID]		= "L1IMU5",173	[L1IMU6_HWID]		= "L1IMU6",174	[L1IMU7_HWID]		= "L1IMU7",175	[L1IMU8_HWID]		= "L1IMU8",176	[L1IMU9_HWID]		= "L1IMU9",177	[L1IMU10_HWID]		= "L1IMU10",178	[L1IMU11_HWID]		= "L1IMU11",179	[L1IMU12_HWID]		= "L1IMU12",180	[L1IMU13_HWID]		= "L1IMU13",181	[L1IMU14_HWID]		= "L1IMU14",182	[L1IMU15_HWID]		= "L1IMU15",183	[WAFLC_HWID]		= "WAFLC",184	[FCH_USB_PD_HWID]	= "FCH_USB_PD",185	[PCIE_HWID]		= "PCIE",186	[PCS_HWID]		= "PCS",187	[DDCL_HWID]		= "DDCL",188	[SST_HWID]		= "SST",189	[IOAGR_HWID]		= "IOAGR",190	[NBIF_HWID]		= "NBIF",191	[IOAPIC_HWID]		= "IOAPIC",192	[SYSTEMHUB_HWID]	= "SYSTEMHUB",193	[NTBCCP_HWID]		= "NTBCCP",194	[UMC_HWID]		= "UMC",195	[SATA_HWID]		= "SATA",196	[USB_HWID]		= "USB",197	[CCXSEC_HWID]		= "CCXSEC",198	[XGMI_HWID]		= "XGMI",199	[XGBE_HWID]		= "XGBE",200	[MP0_HWID]		= "MP0",201	[VPE_HWID]		= "VPE",202};203 204static int hw_id_map[MAX_HWIP] = {205	[GC_HWIP]	= GC_HWID,206	[HDP_HWIP]	= HDP_HWID,207	[SDMA0_HWIP]	= SDMA0_HWID,208	[SDMA1_HWIP]	= SDMA1_HWID,209	[SDMA2_HWIP]    = SDMA2_HWID,210	[SDMA3_HWIP]    = SDMA3_HWID,211	[LSDMA_HWIP]    = LSDMA_HWID,212	[MMHUB_HWIP]	= MMHUB_HWID,213	[ATHUB_HWIP]	= ATHUB_HWID,214	[NBIO_HWIP]	= NBIF_HWID,215	[MP0_HWIP]	= MP0_HWID,216	[MP1_HWIP]	= MP1_HWID,217	[UVD_HWIP]	= UVD_HWID,218	[VCE_HWIP]	= VCE_HWID,219	[DF_HWIP]	= DF_HWID,220	[DCE_HWIP]	= DMU_HWID,221	[OSSSYS_HWIP]	= OSSSYS_HWID,222	[SMUIO_HWIP]	= SMUIO_HWID,223	[PWR_HWIP]	= PWR_HWID,224	[NBIF_HWIP]	= NBIF_HWID,225	[THM_HWIP]	= THM_HWID,226	[CLK_HWIP]	= CLKA_HWID,227	[UMC_HWIP]	= UMC_HWID,228	[XGMI_HWIP]	= XGMI_HWID,229	[DCI_HWIP]	= DCI_HWID,230	[PCIE_HWIP]	= PCIE_HWID,231	[VPE_HWIP]	= VPE_HWID,232	[ISP_HWIP]	= ISP_HWID,233};234 235static int amdgpu_discovery_read_binary_from_sysmem(struct amdgpu_device *adev, uint8_t *binary)236{237	u64 tmr_offset, tmr_size, pos;238	void *discv_regn;239	int ret;240 241	ret = amdgpu_acpi_get_tmr_info(adev, &tmr_offset, &tmr_size);242	if (ret)243		return ret;244 245	pos = tmr_offset + tmr_size - DISCOVERY_TMR_OFFSET;246 247	/* This region is read-only and reserved from system use */248	discv_regn = memremap(pos, adev->mman.discovery_tmr_size, MEMREMAP_WC);249	if (discv_regn) {250		memcpy(binary, discv_regn, adev->mman.discovery_tmr_size);251		memunmap(discv_regn);252		return 0;253	}254 255	return -ENOENT;256}257 258#define IP_DISCOVERY_V2		2259#define IP_DISCOVERY_V4		4260 261static int amdgpu_discovery_read_binary_from_mem(struct amdgpu_device *adev,262						 uint8_t *binary)263{264	uint64_t vram_size;265	u32 msg;266	int i, ret = 0;267 268	if (!amdgpu_sriov_vf(adev)) {269		/* It can take up to a second for IFWI init to complete on some dGPUs,270		 * but generally it should be in the 60-100ms range.  Normally this starts271		 * as soon as the device gets power so by the time the OS loads this has long272		 * completed.  However, when a card is hotplugged via e.g., USB4, we need to273		 * wait for this to complete.  Once the C2PMSG is updated, we can274		 * continue.275		 */276 277		for (i = 0; i < 1000; i++) {278			msg = RREG32(mmMP0_SMN_C2PMSG_33);279			if (msg & 0x80000000)280				break;281			msleep(1);282		}283	}284 285	vram_size = (uint64_t)RREG32(mmRCC_CONFIG_MEMSIZE) << 20;286 287	if (vram_size) {288		uint64_t pos = vram_size - DISCOVERY_TMR_OFFSET;289		amdgpu_device_vram_access(adev, pos, (uint32_t *)binary,290					  adev->mman.discovery_tmr_size, false);291	} else {292		ret = amdgpu_discovery_read_binary_from_sysmem(adev, binary);293	}294 295	return ret;296}297 298static int amdgpu_discovery_read_binary_from_file(struct amdgpu_device *adev, uint8_t *binary)299{300	const struct firmware *fw;301	const char *fw_name;302	int r;303 304	switch (amdgpu_discovery) {305	case 2:306		fw_name = FIRMWARE_IP_DISCOVERY;307		break;308	default:309		dev_warn(adev->dev, "amdgpu_discovery is not set properly\n");310		return -EINVAL;311	}312 313	r = request_firmware(&fw, fw_name, adev->dev);314	if (r) {315		dev_err(adev->dev, "can't load firmware \"%s\"\n",316			fw_name);317		return r;318	}319 320	memcpy((u8 *)binary, (u8 *)fw->data, fw->size);321	release_firmware(fw);322 323	return 0;324}325 326static uint16_t amdgpu_discovery_calculate_checksum(uint8_t *data, uint32_t size)327{328	uint16_t checksum = 0;329	int i;330 331	for (i = 0; i < size; i++)332		checksum += data[i];333 334	return checksum;335}336 337static inline bool amdgpu_discovery_verify_checksum(uint8_t *data, uint32_t size,338						    uint16_t expected)339{340	return !!(amdgpu_discovery_calculate_checksum(data, size) == expected);341}342 343static inline bool amdgpu_discovery_verify_binary_signature(uint8_t *binary)344{345	struct binary_header *bhdr;346	bhdr = (struct binary_header *)binary;347 348	return (le32_to_cpu(bhdr->binary_signature) == BINARY_SIGNATURE);349}350 351static void amdgpu_discovery_harvest_config_quirk(struct amdgpu_device *adev)352{353	/*354	 * So far, apply this quirk only on those Navy Flounder boards which355	 * have a bad harvest table of VCN config.356	 */357	if ((amdgpu_ip_version(adev, UVD_HWIP, 1) == IP_VERSION(3, 0, 1)) &&358	    (amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(10, 3, 2))) {359		switch (adev->pdev->revision) {360		case 0xC1:361		case 0xC2:362		case 0xC3:363		case 0xC5:364		case 0xC7:365		case 0xCF:366		case 0xDF:367			adev->vcn.harvest_config |= AMDGPU_VCN_HARVEST_VCN1;368			adev->vcn.inst_mask &= ~AMDGPU_VCN_HARVEST_VCN1;369			break;370		default:371			break;372		}373	}374}375 376static int amdgpu_discovery_verify_npsinfo(struct amdgpu_device *adev,377					   struct binary_header *bhdr)378{379	struct table_info *info;380	uint16_t checksum;381	uint16_t offset;382 383	info = &bhdr->table_list[NPS_INFO];384	offset = le16_to_cpu(info->offset);385	checksum = le16_to_cpu(info->checksum);386 387	struct nps_info_header *nhdr =388		(struct nps_info_header *)(adev->mman.discovery_bin + offset);389 390	if (le32_to_cpu(nhdr->table_id) != NPS_INFO_TABLE_ID) {391		dev_dbg(adev->dev, "invalid ip discovery nps info table id\n");392		return -EINVAL;393	}394 395	if (!amdgpu_discovery_verify_checksum(adev->mman.discovery_bin + offset,396					      le32_to_cpu(nhdr->size_bytes),397					      checksum)) {398		dev_dbg(adev->dev, "invalid nps info data table checksum\n");399		return -EINVAL;400	}401 402	return 0;403}404 405static int amdgpu_discovery_init(struct amdgpu_device *adev)406{407	struct table_info *info;408	struct binary_header *bhdr;409	uint16_t offset;410	uint16_t size;411	uint16_t checksum;412	int r;413 414	adev->mman.discovery_tmr_size = DISCOVERY_TMR_SIZE;415	adev->mman.discovery_bin = kzalloc(adev->mman.discovery_tmr_size, GFP_KERNEL);416	if (!adev->mman.discovery_bin)417		return -ENOMEM;418 419	/* Read from file if it is the preferred option */420	if (amdgpu_discovery == 2) {421		dev_info(adev->dev, "use ip discovery information from file");422		r = amdgpu_discovery_read_binary_from_file(adev, adev->mman.discovery_bin);423 424		if (r) {425			dev_err(adev->dev, "failed to read ip discovery binary from file\n");426			r = -EINVAL;427			goto out;428		}429 430	} else {431		r = amdgpu_discovery_read_binary_from_mem(432			adev, adev->mman.discovery_bin);433		if (r)434			goto out;435	}436 437	/* check the ip discovery binary signature */438	if (!amdgpu_discovery_verify_binary_signature(adev->mman.discovery_bin)) {439		dev_err(adev->dev,440			"get invalid ip discovery binary signature\n");441		r = -EINVAL;442		goto out;443	}444 445	bhdr = (struct binary_header *)adev->mman.discovery_bin;446 447	offset = offsetof(struct binary_header, binary_checksum) +448		sizeof(bhdr->binary_checksum);449	size = le16_to_cpu(bhdr->binary_size) - offset;450	checksum = le16_to_cpu(bhdr->binary_checksum);451 452	if (!amdgpu_discovery_verify_checksum(adev->mman.discovery_bin + offset,453					      size, checksum)) {454		dev_err(adev->dev, "invalid ip discovery binary checksum\n");455		r = -EINVAL;456		goto out;457	}458 459	info = &bhdr->table_list[IP_DISCOVERY];460	offset = le16_to_cpu(info->offset);461	checksum = le16_to_cpu(info->checksum);462 463	if (offset) {464		struct ip_discovery_header *ihdr =465			(struct ip_discovery_header *)(adev->mman.discovery_bin + offset);466		if (le32_to_cpu(ihdr->signature) != DISCOVERY_TABLE_SIGNATURE) {467			dev_err(adev->dev, "invalid ip discovery data table signature\n");468			r = -EINVAL;469			goto out;470		}471 472		if (!amdgpu_discovery_verify_checksum(adev->mman.discovery_bin + offset,473						      le16_to_cpu(ihdr->size), checksum)) {474			dev_err(adev->dev, "invalid ip discovery data table checksum\n");475			r = -EINVAL;476			goto out;477		}478	}479 480	info = &bhdr->table_list[GC];481	offset = le16_to_cpu(info->offset);482	checksum = le16_to_cpu(info->checksum);483 484	if (offset) {485		struct gpu_info_header *ghdr =486			(struct gpu_info_header *)(adev->mman.discovery_bin + offset);487 488		if (le32_to_cpu(ghdr->table_id) != GC_TABLE_ID) {489			dev_err(adev->dev, "invalid ip discovery gc table id\n");490			r = -EINVAL;491			goto out;492		}493 494		if (!amdgpu_discovery_verify_checksum(adev->mman.discovery_bin + offset,495						      le32_to_cpu(ghdr->size), checksum)) {496			dev_err(adev->dev, "invalid gc data table checksum\n");497			r = -EINVAL;498			goto out;499		}500	}501 502	info = &bhdr->table_list[HARVEST_INFO];503	offset = le16_to_cpu(info->offset);504	checksum = le16_to_cpu(info->checksum);505 506	if (offset) {507		struct harvest_info_header *hhdr =508			(struct harvest_info_header *)(adev->mman.discovery_bin + offset);509 510		if (le32_to_cpu(hhdr->signature) != HARVEST_TABLE_SIGNATURE) {511			dev_err(adev->dev, "invalid ip discovery harvest table signature\n");512			r = -EINVAL;513			goto out;514		}515 516		if (!amdgpu_discovery_verify_checksum(adev->mman.discovery_bin + offset,517						      sizeof(struct harvest_table), checksum)) {518			dev_err(adev->dev, "invalid harvest data table checksum\n");519			r = -EINVAL;520			goto out;521		}522	}523 524	info = &bhdr->table_list[VCN_INFO];525	offset = le16_to_cpu(info->offset);526	checksum = le16_to_cpu(info->checksum);527 528	if (offset) {529		struct vcn_info_header *vhdr =530			(struct vcn_info_header *)(adev->mman.discovery_bin + offset);531 532		if (le32_to_cpu(vhdr->table_id) != VCN_INFO_TABLE_ID) {533			dev_err(adev->dev, "invalid ip discovery vcn table id\n");534			r = -EINVAL;535			goto out;536		}537 538		if (!amdgpu_discovery_verify_checksum(adev->mman.discovery_bin + offset,539						      le32_to_cpu(vhdr->size_bytes), checksum)) {540			dev_err(adev->dev, "invalid vcn data table checksum\n");541			r = -EINVAL;542			goto out;543		}544	}545 546	info = &bhdr->table_list[MALL_INFO];547	offset = le16_to_cpu(info->offset);548	checksum = le16_to_cpu(info->checksum);549 550	if (0 && offset) {551		struct mall_info_header *mhdr =552			(struct mall_info_header *)(adev->mman.discovery_bin + offset);553 554		if (le32_to_cpu(mhdr->table_id) != MALL_INFO_TABLE_ID) {555			dev_err(adev->dev, "invalid ip discovery mall table id\n");556			r = -EINVAL;557			goto out;558		}559 560		if (!amdgpu_discovery_verify_checksum(adev->mman.discovery_bin + offset,561						      le32_to_cpu(mhdr->size_bytes), checksum)) {562			dev_err(adev->dev, "invalid mall data table checksum\n");563			r = -EINVAL;564			goto out;565		}566	}567 568	return 0;569 570out:571	kfree(adev->mman.discovery_bin);572	adev->mman.discovery_bin = NULL;573	if ((amdgpu_discovery != 2) &&574	    (RREG32(mmIP_DISCOVERY_VERSION) == 4))575		amdgpu_ras_query_boot_status(adev, 4);576	return r;577}578 579static void amdgpu_discovery_sysfs_fini(struct amdgpu_device *adev);580 581void amdgpu_discovery_fini(struct amdgpu_device *adev)582{583	amdgpu_discovery_sysfs_fini(adev);584	kfree(adev->mman.discovery_bin);585	adev->mman.discovery_bin = NULL;586}587 588static int amdgpu_discovery_validate_ip(const struct ip_v4 *ip)589{590	if (ip->instance_number >= HWIP_MAX_INSTANCE) {591		DRM_ERROR("Unexpected instance_number (%d) from ip discovery blob\n",592			  ip->instance_number);593		return -EINVAL;594	}595	if (le16_to_cpu(ip->hw_id) >= HW_ID_MAX) {596		DRM_ERROR("Unexpected hw_id (%d) from ip discovery blob\n",597			  le16_to_cpu(ip->hw_id));598		return -EINVAL;599	}600 601	return 0;602}603 604static void amdgpu_discovery_read_harvest_bit_per_ip(struct amdgpu_device *adev,605						uint32_t *vcn_harvest_count)606{607	struct binary_header *bhdr;608	struct ip_discovery_header *ihdr;609	struct die_header *dhdr;610	struct ip_v4 *ip;611	uint16_t die_offset, ip_offset, num_dies, num_ips;612	int i, j;613 614	bhdr = (struct binary_header *)adev->mman.discovery_bin;615	ihdr = (struct ip_discovery_header *)(adev->mman.discovery_bin +616			le16_to_cpu(bhdr->table_list[IP_DISCOVERY].offset));617	num_dies = le16_to_cpu(ihdr->num_dies);618 619	/* scan harvest bit of all IP data structures */620	for (i = 0; i < num_dies; i++) {621		die_offset = le16_to_cpu(ihdr->die_info[i].die_offset);622		dhdr = (struct die_header *)(adev->mman.discovery_bin + die_offset);623		num_ips = le16_to_cpu(dhdr->num_ips);624		ip_offset = die_offset + sizeof(*dhdr);625 626		for (j = 0; j < num_ips; j++) {627			ip = (struct ip_v4 *)(adev->mman.discovery_bin + ip_offset);628 629			if (amdgpu_discovery_validate_ip(ip))630				goto next_ip;631 632			if (le16_to_cpu(ip->variant) == 1) {633				switch (le16_to_cpu(ip->hw_id)) {634				case VCN_HWID:635					(*vcn_harvest_count)++;636					if (ip->instance_number == 0) {637						adev->vcn.harvest_config |= AMDGPU_VCN_HARVEST_VCN0;638						adev->vcn.inst_mask &=639							~AMDGPU_VCN_HARVEST_VCN0;640						adev->jpeg.inst_mask &=641							~AMDGPU_VCN_HARVEST_VCN0;642					} else {643						adev->vcn.harvest_config |= AMDGPU_VCN_HARVEST_VCN1;644						adev->vcn.inst_mask &=645							~AMDGPU_VCN_HARVEST_VCN1;646						adev->jpeg.inst_mask &=647							~AMDGPU_VCN_HARVEST_VCN1;648					}649					break;650				case DMU_HWID:651					adev->harvest_ip_mask |= AMD_HARVEST_IP_DMU_MASK;652					break;653				default:654					break;655				}656			}657next_ip:658			if (ihdr->base_addr_64_bit)659				ip_offset += struct_size(ip, base_address_64, ip->num_base_address);660			else661				ip_offset += struct_size(ip, base_address, ip->num_base_address);662		}663	}664}665 666static void amdgpu_discovery_read_from_harvest_table(struct amdgpu_device *adev,667						     uint32_t *vcn_harvest_count,668						     uint32_t *umc_harvest_count)669{670	struct binary_header *bhdr;671	struct harvest_table *harvest_info;672	u16 offset;673	int i;674	uint32_t umc_harvest_config = 0;675 676	bhdr = (struct binary_header *)adev->mman.discovery_bin;677	offset = le16_to_cpu(bhdr->table_list[HARVEST_INFO].offset);678 679	if (!offset) {680		dev_err(adev->dev, "invalid harvest table offset\n");681		return;682	}683 684	harvest_info = (struct harvest_table *)(adev->mman.discovery_bin + offset);685 686	for (i = 0; i < 32; i++) {687		if (le16_to_cpu(harvest_info->list[i].hw_id) == 0)688			break;689 690		switch (le16_to_cpu(harvest_info->list[i].hw_id)) {691		case VCN_HWID:692			(*vcn_harvest_count)++;693			adev->vcn.harvest_config |=694				(1 << harvest_info->list[i].number_instance);695			adev->jpeg.harvest_config |=696				(1 << harvest_info->list[i].number_instance);697 698			adev->vcn.inst_mask &=699				~(1U << harvest_info->list[i].number_instance);700			adev->jpeg.inst_mask &=701				~(1U << harvest_info->list[i].number_instance);702			break;703		case DMU_HWID:704			adev->harvest_ip_mask |= AMD_HARVEST_IP_DMU_MASK;705			break;706		case UMC_HWID:707			umc_harvest_config |=708				1 << (le16_to_cpu(harvest_info->list[i].number_instance));709			(*umc_harvest_count)++;710			break;711		case GC_HWID:712			adev->gfx.xcc_mask &=713				~(1U << harvest_info->list[i].number_instance);714			break;715		case SDMA0_HWID:716			adev->sdma.sdma_mask &=717				~(1U << harvest_info->list[i].number_instance);718			break;719#if defined(CONFIG_DRM_AMD_ISP)720		case ISP_HWID:721			adev->isp.harvest_config |=722				~(1U << harvest_info->list[i].number_instance);723			break;724#endif725		default:726			break;727		}728	}729 730	adev->umc.active_mask = ((1 << adev->umc.node_inst_num) - 1) &731				~umc_harvest_config;732}733 734/* ================================================== */735 736struct ip_hw_instance {737	struct kobject kobj; /* ip_discovery/die/#die/#hw_id/#instance/<attrs...> */738 739	int hw_id;740	u8  num_instance;741	u8  major, minor, revision;742	u8  harvest;743 744	int num_base_addresses;745	u32 base_addr[] __counted_by(num_base_addresses);746};747 748struct ip_hw_id {749	struct kset hw_id_kset;  /* ip_discovery/die/#die/#hw_id/, contains ip_hw_instance */750	int hw_id;751};752 753struct ip_die_entry {754	struct kset ip_kset;     /* ip_discovery/die/#die/, contains ip_hw_id  */755	u16 num_ips;756};757 758/* -------------------------------------------------- */759 760struct ip_hw_instance_attr {761	struct attribute attr;762	ssize_t (*show)(struct ip_hw_instance *ip_hw_instance, char *buf);763};764 765static ssize_t hw_id_show(struct ip_hw_instance *ip_hw_instance, char *buf)766{767	return sysfs_emit(buf, "%d\n", ip_hw_instance->hw_id);768}769 770static ssize_t num_instance_show(struct ip_hw_instance *ip_hw_instance, char *buf)771{772	return sysfs_emit(buf, "%d\n", ip_hw_instance->num_instance);773}774 775static ssize_t major_show(struct ip_hw_instance *ip_hw_instance, char *buf)776{777	return sysfs_emit(buf, "%d\n", ip_hw_instance->major);778}779 780static ssize_t minor_show(struct ip_hw_instance *ip_hw_instance, char *buf)781{782	return sysfs_emit(buf, "%d\n", ip_hw_instance->minor);783}784 785static ssize_t revision_show(struct ip_hw_instance *ip_hw_instance, char *buf)786{787	return sysfs_emit(buf, "%d\n", ip_hw_instance->revision);788}789 790static ssize_t harvest_show(struct ip_hw_instance *ip_hw_instance, char *buf)791{792	return sysfs_emit(buf, "0x%01X\n", ip_hw_instance->harvest);793}794 795static ssize_t num_base_addresses_show(struct ip_hw_instance *ip_hw_instance, char *buf)796{797	return sysfs_emit(buf, "%d\n", ip_hw_instance->num_base_addresses);798}799 800static ssize_t base_addr_show(struct ip_hw_instance *ip_hw_instance, char *buf)801{802	ssize_t res, at;803	int ii;804 805	for (res = at = ii = 0; ii < ip_hw_instance->num_base_addresses; ii++) {806		/* Here we satisfy the condition that, at + size <= PAGE_SIZE.807		 */808		if (at + 12 > PAGE_SIZE)809			break;810		res = sysfs_emit_at(buf, at, "0x%08X\n",811				    ip_hw_instance->base_addr[ii]);812		if (res <= 0)813			break;814		at += res;815	}816 817	return res < 0 ? res : at;818}819 820static struct ip_hw_instance_attr ip_hw_attr[] = {821	__ATTR_RO(hw_id),822	__ATTR_RO(num_instance),823	__ATTR_RO(major),824	__ATTR_RO(minor),825	__ATTR_RO(revision),826	__ATTR_RO(harvest),827	__ATTR_RO(num_base_addresses),828	__ATTR_RO(base_addr),829};830 831static struct attribute *ip_hw_instance_attrs[ARRAY_SIZE(ip_hw_attr) + 1];832ATTRIBUTE_GROUPS(ip_hw_instance);833 834#define to_ip_hw_instance(x) container_of(x, struct ip_hw_instance, kobj)835#define to_ip_hw_instance_attr(x) container_of(x, struct ip_hw_instance_attr, attr)836 837static ssize_t ip_hw_instance_attr_show(struct kobject *kobj,838					struct attribute *attr,839					char *buf)840{841	struct ip_hw_instance *ip_hw_instance = to_ip_hw_instance(kobj);842	struct ip_hw_instance_attr *ip_hw_attr = to_ip_hw_instance_attr(attr);843 844	if (!ip_hw_attr->show)845		return -EIO;846 847	return ip_hw_attr->show(ip_hw_instance, buf);848}849 850static const struct sysfs_ops ip_hw_instance_sysfs_ops = {851	.show = ip_hw_instance_attr_show,852};853 854static void ip_hw_instance_release(struct kobject *kobj)855{856	struct ip_hw_instance *ip_hw_instance = to_ip_hw_instance(kobj);857 858	kfree(ip_hw_instance);859}860 861static const struct kobj_type ip_hw_instance_ktype = {862	.release = ip_hw_instance_release,863	.sysfs_ops = &ip_hw_instance_sysfs_ops,864	.default_groups = ip_hw_instance_groups,865};866 867/* -------------------------------------------------- */868 869#define to_ip_hw_id(x)  container_of(to_kset(x), struct ip_hw_id, hw_id_kset)870 871static void ip_hw_id_release(struct kobject *kobj)872{873	struct ip_hw_id *ip_hw_id = to_ip_hw_id(kobj);874 875	if (!list_empty(&ip_hw_id->hw_id_kset.list))876		DRM_ERROR("ip_hw_id->hw_id_kset is not empty");877	kfree(ip_hw_id);878}879 880static const struct kobj_type ip_hw_id_ktype = {881	.release = ip_hw_id_release,882	.sysfs_ops = &kobj_sysfs_ops,883};884 885/* -------------------------------------------------- */886 887static void die_kobj_release(struct kobject *kobj);888static void ip_disc_release(struct kobject *kobj);889 890struct ip_die_entry_attribute {891	struct attribute attr;892	ssize_t (*show)(struct ip_die_entry *ip_die_entry, char *buf);893};894 895#define to_ip_die_entry_attr(x)  container_of(x, struct ip_die_entry_attribute, attr)896 897static ssize_t num_ips_show(struct ip_die_entry *ip_die_entry, char *buf)898{899	return sysfs_emit(buf, "%d\n", ip_die_entry->num_ips);900}901 902/* If there are more ip_die_entry attrs, other than the number of IPs,903 * we can make this intro an array of attrs, and then initialize904 * ip_die_entry_attrs in a loop.905 */906static struct ip_die_entry_attribute num_ips_attr =907	__ATTR_RO(num_ips);908 909static struct attribute *ip_die_entry_attrs[] = {910	&num_ips_attr.attr,911	NULL,912};913ATTRIBUTE_GROUPS(ip_die_entry); /* ip_die_entry_groups */914 915#define to_ip_die_entry(x) container_of(to_kset(x), struct ip_die_entry, ip_kset)916 917static ssize_t ip_die_entry_attr_show(struct kobject *kobj,918				      struct attribute *attr,919				      char *buf)920{921	struct ip_die_entry_attribute *ip_die_entry_attr = to_ip_die_entry_attr(attr);922	struct ip_die_entry *ip_die_entry = to_ip_die_entry(kobj);923 924	if (!ip_die_entry_attr->show)925		return -EIO;926 927	return ip_die_entry_attr->show(ip_die_entry, buf);928}929 930static void ip_die_entry_release(struct kobject *kobj)931{932	struct ip_die_entry *ip_die_entry = to_ip_die_entry(kobj);933 934	if (!list_empty(&ip_die_entry->ip_kset.list))935		DRM_ERROR("ip_die_entry->ip_kset is not empty");936	kfree(ip_die_entry);937}938 939static const struct sysfs_ops ip_die_entry_sysfs_ops = {940	.show = ip_die_entry_attr_show,941};942 943static const struct kobj_type ip_die_entry_ktype = {944	.release = ip_die_entry_release,945	.sysfs_ops = &ip_die_entry_sysfs_ops,946	.default_groups = ip_die_entry_groups,947};948 949static const struct kobj_type die_kobj_ktype = {950	.release = die_kobj_release,951	.sysfs_ops = &kobj_sysfs_ops,952};953 954static const struct kobj_type ip_discovery_ktype = {955	.release = ip_disc_release,956	.sysfs_ops = &kobj_sysfs_ops,957};958 959struct ip_discovery_top {960	struct kobject kobj;    /* ip_discovery/ */961	struct kset die_kset;   /* ip_discovery/die/, contains ip_die_entry */962	struct amdgpu_device *adev;963};964 965static void die_kobj_release(struct kobject *kobj)966{967	struct ip_discovery_top *ip_top = container_of(to_kset(kobj),968						       struct ip_discovery_top,969						       die_kset);970	if (!list_empty(&ip_top->die_kset.list))971		DRM_ERROR("ip_top->die_kset is not empty");972}973 974static void ip_disc_release(struct kobject *kobj)975{976	struct ip_discovery_top *ip_top = container_of(kobj, struct ip_discovery_top,977						       kobj);978	struct amdgpu_device *adev = ip_top->adev;979 980	adev->ip_top = NULL;981	kfree(ip_top);982}983 984static uint8_t amdgpu_discovery_get_harvest_info(struct amdgpu_device *adev,985						 uint16_t hw_id, uint8_t inst)986{987	uint8_t harvest = 0;988 989	/* Until a uniform way is figured, get mask based on hwid */990	switch (hw_id) {991	case VCN_HWID:992		harvest = ((1 << inst) & adev->vcn.inst_mask) == 0;993		break;994	case DMU_HWID:995		if (adev->harvest_ip_mask & AMD_HARVEST_IP_DMU_MASK)996			harvest = 0x1;997		break;998	case UMC_HWID:999		/* TODO: It needs another parsing; for now, ignore.*/1000		break;1001	case GC_HWID:1002		harvest = ((1 << inst) & adev->gfx.xcc_mask) == 0;1003		break;1004	case SDMA0_HWID:1005		harvest = ((1 << inst) & adev->sdma.sdma_mask) == 0;1006		break;1007	default:1008		break;1009	}1010 1011	return harvest;1012}1013 1014static int amdgpu_discovery_sysfs_ips(struct amdgpu_device *adev,1015				      struct ip_die_entry *ip_die_entry,1016				      const size_t _ip_offset, const int num_ips,1017				      bool reg_base_64)1018{1019	int ii, jj, kk, res;1020 1021	DRM_DEBUG("num_ips:%d", num_ips);1022 1023	/* Find all IPs of a given HW ID, and add their instance to1024	 * #die/#hw_id/#instance/<attributes>1025	 */1026	for (ii = 0; ii < HW_ID_MAX; ii++) {1027		struct ip_hw_id *ip_hw_id = NULL;1028		size_t ip_offset = _ip_offset;1029 1030		for (jj = 0; jj < num_ips; jj++) {1031			struct ip_v4 *ip;1032			struct ip_hw_instance *ip_hw_instance;1033 1034			ip = (struct ip_v4 *)(adev->mman.discovery_bin + ip_offset);1035			if (amdgpu_discovery_validate_ip(ip) ||1036			    le16_to_cpu(ip->hw_id) != ii)1037				goto next_ip;1038 1039			DRM_DEBUG("match:%d @ ip_offset:%zu", ii, ip_offset);1040 1041			/* We have a hw_id match; register the hw1042			 * block if not yet registered.1043			 */1044			if (!ip_hw_id) {1045				ip_hw_id = kzalloc(sizeof(*ip_hw_id), GFP_KERNEL);1046				if (!ip_hw_id)1047					return -ENOMEM;1048				ip_hw_id->hw_id = ii;1049 1050				kobject_set_name(&ip_hw_id->hw_id_kset.kobj, "%d", ii);1051				ip_hw_id->hw_id_kset.kobj.kset = &ip_die_entry->ip_kset;1052				ip_hw_id->hw_id_kset.kobj.ktype = &ip_hw_id_ktype;1053				res = kset_register(&ip_hw_id->hw_id_kset);1054				if (res) {1055					DRM_ERROR("Couldn't register ip_hw_id kset");1056					kfree(ip_hw_id);1057					return res;1058				}1059				if (hw_id_names[ii]) {1060					res = sysfs_create_link(&ip_die_entry->ip_kset.kobj,1061								&ip_hw_id->hw_id_kset.kobj,1062								hw_id_names[ii]);1063					if (res) {1064						DRM_ERROR("Couldn't create IP link %s in IP Die:%s\n",1065							  hw_id_names[ii],1066							  kobject_name(&ip_die_entry->ip_kset.kobj));1067					}1068				}1069			}1070 1071			/* Now register its instance.1072			 */1073			ip_hw_instance = kzalloc(struct_size(ip_hw_instance,1074							     base_addr,1075							     ip->num_base_address),1076						 GFP_KERNEL);1077			if (!ip_hw_instance) {1078				DRM_ERROR("no memory for ip_hw_instance");1079				return -ENOMEM;1080			}1081			ip_hw_instance->hw_id = le16_to_cpu(ip->hw_id); /* == ii */1082			ip_hw_instance->num_instance = ip->instance_number;1083			ip_hw_instance->major = ip->major;1084			ip_hw_instance->minor = ip->minor;1085			ip_hw_instance->revision = ip->revision;1086			ip_hw_instance->harvest =1087				amdgpu_discovery_get_harvest_info(1088					adev, ip_hw_instance->hw_id,1089					ip_hw_instance->num_instance);1090			ip_hw_instance->num_base_addresses = ip->num_base_address;1091 1092			for (kk = 0; kk < ip_hw_instance->num_base_addresses; kk++) {1093				if (reg_base_64)1094					ip_hw_instance->base_addr[kk] =1095						lower_32_bits(le64_to_cpu(ip->base_address_64[kk])) & 0x3FFFFFFF;1096				else1097					ip_hw_instance->base_addr[kk] = ip->base_address[kk];1098			}1099 1100			kobject_init(&ip_hw_instance->kobj, &ip_hw_instance_ktype);1101			ip_hw_instance->kobj.kset = &ip_hw_id->hw_id_kset;1102			res = kobject_add(&ip_hw_instance->kobj, NULL,1103					  "%d", ip_hw_instance->num_instance);1104next_ip:1105			if (reg_base_64)1106				ip_offset += struct_size(ip, base_address_64,1107							 ip->num_base_address);1108			else1109				ip_offset += struct_size(ip, base_address,1110							 ip->num_base_address);1111		}1112	}1113 1114	return 0;1115}1116 1117static int amdgpu_discovery_sysfs_recurse(struct amdgpu_device *adev)1118{1119	struct binary_header *bhdr;1120	struct ip_discovery_header *ihdr;1121	struct die_header *dhdr;1122	struct kset *die_kset = &adev->ip_top->die_kset;1123	u16 num_dies, die_offset, num_ips;1124	size_t ip_offset;1125	int ii, res;1126 1127	bhdr = (struct binary_header *)adev->mman.discovery_bin;1128	ihdr = (struct ip_discovery_header *)(adev->mman.discovery_bin +1129					      le16_to_cpu(bhdr->table_list[IP_DISCOVERY].offset));1130	num_dies = le16_to_cpu(ihdr->num_dies);1131 1132	DRM_DEBUG("number of dies: %d\n", num_dies);1133 1134	for (ii = 0; ii < num_dies; ii++) {1135		struct ip_die_entry *ip_die_entry;1136 1137		die_offset = le16_to_cpu(ihdr->die_info[ii].die_offset);1138		dhdr = (struct die_header *)(adev->mman.discovery_bin + die_offset);1139		num_ips = le16_to_cpu(dhdr->num_ips);1140		ip_offset = die_offset + sizeof(*dhdr);1141 1142		/* Add the die to the kset.1143		 *1144		 * dhdr->die_id == ii, which was checked in1145		 * amdgpu_discovery_reg_base_init().1146		 */1147 1148		ip_die_entry = kzalloc(sizeof(*ip_die_entry), GFP_KERNEL);1149		if (!ip_die_entry)1150			return -ENOMEM;1151 1152		ip_die_entry->num_ips = num_ips;1153 1154		kobject_set_name(&ip_die_entry->ip_kset.kobj, "%d", le16_to_cpu(dhdr->die_id));1155		ip_die_entry->ip_kset.kobj.kset = die_kset;1156		ip_die_entry->ip_kset.kobj.ktype = &ip_die_entry_ktype;1157		res = kset_register(&ip_die_entry->ip_kset);1158		if (res) {1159			DRM_ERROR("Couldn't register ip_die_entry kset");1160			kfree(ip_die_entry);1161			return res;1162		}1163 1164		amdgpu_discovery_sysfs_ips(adev, ip_die_entry, ip_offset, num_ips, !!ihdr->base_addr_64_bit);1165	}1166 1167	return 0;1168}1169 1170static int amdgpu_discovery_sysfs_init(struct amdgpu_device *adev)1171{1172	struct kset *die_kset;1173	int res, ii;1174 1175	if (!adev->mman.discovery_bin)1176		return -EINVAL;1177 1178	adev->ip_top = kzalloc(sizeof(*adev->ip_top), GFP_KERNEL);1179	if (!adev->ip_top)1180		return -ENOMEM;1181 1182	adev->ip_top->adev = adev;1183 1184	res = kobject_init_and_add(&adev->ip_top->kobj, &ip_discovery_ktype,1185				   &adev->dev->kobj, "ip_discovery");1186	if (res) {1187		DRM_ERROR("Couldn't init and add ip_discovery/");1188		goto Err;1189	}1190 1191	die_kset = &adev->ip_top->die_kset;1192	kobject_set_name(&die_kset->kobj, "%s", "die");1193	die_kset->kobj.parent = &adev->ip_top->kobj;1194	die_kset->kobj.ktype = &die_kobj_ktype;1195	res = kset_register(&adev->ip_top->die_kset);1196	if (res) {1197		DRM_ERROR("Couldn't register die_kset");1198		goto Err;1199	}1200 1201	for (ii = 0; ii < ARRAY_SIZE(ip_hw_attr); ii++)1202		ip_hw_instance_attrs[ii] = &ip_hw_attr[ii].attr;1203	ip_hw_instance_attrs[ii] = NULL;1204 1205	res = amdgpu_discovery_sysfs_recurse(adev);1206 1207	return res;1208Err:1209	kobject_put(&adev->ip_top->kobj);1210	return res;1211}1212 1213/* -------------------------------------------------- */1214 1215#define list_to_kobj(el) container_of(el, struct kobject, entry)1216 1217static void amdgpu_discovery_sysfs_ip_hw_free(struct ip_hw_id *ip_hw_id)1218{1219	struct list_head *el, *tmp;1220	struct kset *hw_id_kset;1221 1222	hw_id_kset = &ip_hw_id->hw_id_kset;1223	spin_lock(&hw_id_kset->list_lock);1224	list_for_each_prev_safe(el, tmp, &hw_id_kset->list) {1225		list_del_init(el);1226		spin_unlock(&hw_id_kset->list_lock);1227		/* kobject is embedded in ip_hw_instance */1228		kobject_put(list_to_kobj(el));1229		spin_lock(&hw_id_kset->list_lock);1230	}1231	spin_unlock(&hw_id_kset->list_lock);1232	kobject_put(&ip_hw_id->hw_id_kset.kobj);1233}1234 1235static void amdgpu_discovery_sysfs_die_free(struct ip_die_entry *ip_die_entry)1236{1237	struct list_head *el, *tmp;1238	struct kset *ip_kset;1239 1240	ip_kset = &ip_die_entry->ip_kset;1241	spin_lock(&ip_kset->list_lock);1242	list_for_each_prev_safe(el, tmp, &ip_kset->list) {1243		list_del_init(el);1244		spin_unlock(&ip_kset->list_lock);1245		amdgpu_discovery_sysfs_ip_hw_free(to_ip_hw_id(list_to_kobj(el)));1246		spin_lock(&ip_kset->list_lock);1247	}1248	spin_unlock(&ip_kset->list_lock);1249	kobject_put(&ip_die_entry->ip_kset.kobj);1250}1251 1252static void amdgpu_discovery_sysfs_fini(struct amdgpu_device *adev)1253{1254	struct list_head *el, *tmp;1255	struct kset *die_kset;1256 1257	die_kset = &adev->ip_top->die_kset;1258	spin_lock(&die_kset->list_lock);1259	list_for_each_prev_safe(el, tmp, &die_kset->list) {1260		list_del_init(el);1261		spin_unlock(&die_kset->list_lock);1262		amdgpu_discovery_sysfs_die_free(to_ip_die_entry(list_to_kobj(el)));1263		spin_lock(&die_kset->list_lock);1264	}1265	spin_unlock(&die_kset->list_lock);1266	kobject_put(&adev->ip_top->die_kset.kobj);1267	kobject_put(&adev->ip_top->kobj);1268}1269 1270/* ================================================== */1271 1272static int amdgpu_discovery_reg_base_init(struct amdgpu_device *adev)1273{1274	uint8_t num_base_address, subrev, variant;1275	struct binary_header *bhdr;1276	struct ip_discovery_header *ihdr;1277	struct die_header *dhdr;1278	struct ip_v4 *ip;1279	uint16_t die_offset;1280	uint16_t ip_offset;1281	uint16_t num_dies;1282	uint16_t num_ips;1283	int hw_ip;1284	int i, j, k;1285	int r;1286 1287	r = amdgpu_discovery_init(adev);1288	if (r) {1289		DRM_ERROR("amdgpu_discovery_init failed\n");1290		return r;1291	}1292 1293	adev->gfx.xcc_mask = 0;1294	adev->sdma.sdma_mask = 0;1295	adev->vcn.inst_mask = 0;1296	adev->jpeg.inst_mask = 0;1297	bhdr = (struct binary_header *)adev->mman.discovery_bin;1298	ihdr = (struct ip_discovery_header *)(adev->mman.discovery_bin +1299			le16_to_cpu(bhdr->table_list[IP_DISCOVERY].offset));1300	num_dies = le16_to_cpu(ihdr->num_dies);1301 1302	DRM_DEBUG("number of dies: %d\n", num_dies);1303 1304	for (i = 0; i < num_dies; i++) {1305		die_offset = le16_to_cpu(ihdr->die_info[i].die_offset);1306		dhdr = (struct die_header *)(adev->mman.discovery_bin + die_offset);1307		num_ips = le16_to_cpu(dhdr->num_ips);1308		ip_offset = die_offset + sizeof(*dhdr);1309 1310		if (le16_to_cpu(dhdr->die_id) != i) {1311			DRM_ERROR("invalid die id %d, expected %d\n",1312					le16_to_cpu(dhdr->die_id), i);1313			return -EINVAL;1314		}1315 1316		DRM_DEBUG("number of hardware IPs on die%d: %d\n",1317				le16_to_cpu(dhdr->die_id), num_ips);1318 1319		for (j = 0; j < num_ips; j++) {1320			ip = (struct ip_v4 *)(adev->mman.discovery_bin + ip_offset);1321 1322			if (amdgpu_discovery_validate_ip(ip))1323				goto next_ip;1324 1325			num_base_address = ip->num_base_address;1326 1327			DRM_DEBUG("%s(%d) #%d v%d.%d.%d:\n",1328				  hw_id_names[le16_to_cpu(ip->hw_id)],1329				  le16_to_cpu(ip->hw_id),1330				  ip->instance_number,1331				  ip->major, ip->minor,1332				  ip->revision);1333 1334			if (le16_to_cpu(ip->hw_id) == VCN_HWID) {1335				/* Bit [5:0]: original revision value1336				 * Bit [7:6]: en/decode capability:1337				 *     0b00 : VCN function normally1338				 *     0b10 : encode is disabled1339				 *     0b01 : decode is disabled1340				 */1341				if (adev->vcn.num_vcn_inst <1342				    AMDGPU_MAX_VCN_INSTANCES) {1343					adev->vcn.vcn_config[adev->vcn.num_vcn_inst] =1344						ip->revision & 0xc0;1345					adev->vcn.num_vcn_inst++;1346					adev->vcn.inst_mask |=1347						(1U << ip->instance_number);1348					adev->jpeg.inst_mask |=1349						(1U << ip->instance_number);1350				} else {1351					dev_err(adev->dev, "Too many VCN instances: %d vs %d\n",1352						adev->vcn.num_vcn_inst + 1,1353						AMDGPU_MAX_VCN_INSTANCES);1354				}1355				ip->revision &= ~0xc0;1356			}1357			if (le16_to_cpu(ip->hw_id) == SDMA0_HWID ||1358			    le16_to_cpu(ip->hw_id) == SDMA1_HWID ||1359			    le16_to_cpu(ip->hw_id) == SDMA2_HWID ||1360			    le16_to_cpu(ip->hw_id) == SDMA3_HWID) {1361				if (adev->sdma.num_instances <1362				    AMDGPU_MAX_SDMA_INSTANCES) {1363					adev->sdma.num_instances++;1364					adev->sdma.sdma_mask |=1365						(1U << ip->instance_number);1366				} else {1367					dev_err(adev->dev, "Too many SDMA instances: %d vs %d\n",1368						adev->sdma.num_instances + 1,1369						AMDGPU_MAX_SDMA_INSTANCES);1370				}1371			}1372 1373			if (le16_to_cpu(ip->hw_id) == VPE_HWID) {1374				if (adev->vpe.num_instances < AMDGPU_MAX_VPE_INSTANCES)1375					adev->vpe.num_instances++;1376				else1377					dev_err(adev->dev, "Too many VPE instances: %d vs %d\n",1378						adev->vpe.num_instances + 1,1379						AMDGPU_MAX_VPE_INSTANCES);1380			}1381 1382			if (le16_to_cpu(ip->hw_id) == UMC_HWID) {1383				adev->gmc.num_umc++;1384				adev->umc.node_inst_num++;1385			}1386 1387			if (le16_to_cpu(ip->hw_id) == GC_HWID)1388				adev->gfx.xcc_mask |=1389					(1U << ip->instance_number);1390 1391			for (k = 0; k < num_base_address; k++) {1392				/*1393				 * convert the endianness of base addresses in place,1394				 * so that we don't need to convert them when accessing adev->reg_offset.1395				 */1396				if (ihdr->base_addr_64_bit)1397					/* Truncate the 64bit base address from ip discovery1398					 * and only store lower 32bit ip base in reg_offset[].1399					 * Bits > 32 follows ASIC specific format, thus just1400					 * discard them and handle it within specific ASIC.1401					 * By this way reg_offset[] and related helpers can1402					 * stay unchanged.1403					 * The base address is in dwords, thus clear the1404					 * highest 2 bits to store.1405					 */1406					ip->base_address[k] =1407						lower_32_bits(le64_to_cpu(ip->base_address_64[k])) & 0x3FFFFFFF;1408				else1409					ip->base_address[k] = le32_to_cpu(ip->base_address[k]);1410				DRM_DEBUG("\t0x%08x\n", ip->base_address[k]);1411			}1412 1413			for (hw_ip = 0; hw_ip < MAX_HWIP; hw_ip++) {1414				if (hw_id_map[hw_ip] == le16_to_cpu(ip->hw_id) &&1415				    hw_id_map[hw_ip] != 0) {1416					DRM_DEBUG("set register base offset for %s\n",1417							hw_id_names[le16_to_cpu(ip->hw_id)]);1418					adev->reg_offset[hw_ip][ip->instance_number] =1419						ip->base_address;1420					/* Instance support is somewhat inconsistent.1421					 * SDMA is a good example.  Sienna cichlid has 4 total1422					 * SDMA instances, each enumerated separately (HWIDs1423					 * 42, 43, 68, 69).  Arcturus has 8 total SDMA instances,1424					 * but they are enumerated as multiple instances of the1425					 * same HWIDs (4x HWID 42, 4x HWID 43).  UMC is another1426					 * example.  On most chips there are multiple instances1427					 * with the same HWID.1428					 */1429 1430					if (ihdr->version < 3) {1431						subrev = 0;1432						variant = 0;1433					} else {1434						subrev = ip->sub_revision;1435						variant = ip->variant;1436					}1437 1438					adev->ip_versions[hw_ip]1439							 [ip->instance_number] =1440						IP_VERSION_FULL(ip->major,1441								ip->minor,1442								ip->revision,1443								variant,1444								subrev);1445				}1446			}1447 1448next_ip:1449			if (ihdr->base_addr_64_bit)1450				ip_offset += struct_size(ip, base_address_64, ip->num_base_address);1451			else1452				ip_offset += struct_size(ip, base_address, ip->num_base_address);1453		}1454	}1455 1456	return 0;1457}1458 1459static void amdgpu_discovery_harvest_ip(struct amdgpu_device *adev)1460{1461	int vcn_harvest_count = 0;1462	int umc_harvest_count = 0;1463 1464	/*1465	 * Harvest table does not fit Navi1x and legacy GPUs,1466	 * so read harvest bit per IP data structure to set1467	 * harvest configuration.1468	 */1469	if (amdgpu_ip_version(adev, GC_HWIP, 0) < IP_VERSION(10, 2, 0) &&1470	    amdgpu_ip_version(adev, GC_HWIP, 0) != IP_VERSION(9, 4, 3) &&1471	    amdgpu_ip_version(adev, GC_HWIP, 0) != IP_VERSION(9, 4, 4)) {1472		if ((adev->pdev->device == 0x731E &&1473			(adev->pdev->revision == 0xC6 ||1474			 adev->pdev->revision == 0xC7)) ||1475			(adev->pdev->device == 0x7340 &&1476			 adev->pdev->revision == 0xC9) ||1477			(adev->pdev->device == 0x7360 &&1478			 adev->pdev->revision == 0xC7))1479			amdgpu_discovery_read_harvest_bit_per_ip(adev,1480				&vcn_harvest_count);1481	} else {1482		amdgpu_discovery_read_from_harvest_table(adev,1483							 &vcn_harvest_count,1484							 &umc_harvest_count);1485	}1486 1487	amdgpu_discovery_harvest_config_quirk(adev);1488 1489	if (vcn_harvest_count == adev->vcn.num_vcn_inst) {1490		adev->harvest_ip_mask |= AMD_HARVEST_IP_VCN_MASK;1491		adev->harvest_ip_mask |= AMD_HARVEST_IP_JPEG_MASK;1492	}1493 1494	if (umc_harvest_count < adev->gmc.num_umc) {1495		adev->gmc.num_umc -= umc_harvest_count;1496	}1497}1498 1499union gc_info {1500	struct gc_info_v1_0 v1;1501	struct gc_info_v1_1 v1_1;1502	struct gc_info_v1_2 v1_2;1503	struct gc_info_v1_3 v1_3;1504	struct gc_info_v2_0 v2;1505	struct gc_info_v2_1 v2_1;1506};1507 1508static int amdgpu_discovery_get_gfx_info(struct amdgpu_device *adev)1509{1510	struct binary_header *bhdr;1511	union gc_info *gc_info;1512	u16 offset;1513 1514	if (!adev->mman.discovery_bin) {1515		DRM_ERROR("ip discovery uninitialized\n");1516		return -EINVAL;1517	}1518 1519	bhdr = (struct binary_header *)adev->mman.discovery_bin;1520	offset = le16_to_cpu(bhdr->table_list[GC].offset);1521 1522	if (!offset)1523		return 0;1524 1525	gc_info = (union gc_info *)(adev->mman.discovery_bin + offset);1526 1527	switch (le16_to_cpu(gc_info->v1.header.version_major)) {1528	case 1:1529		adev->gfx.config.max_shader_engines = le32_to_cpu(gc_info->v1.gc_num_se);1530		adev->gfx.config.max_cu_per_sh = 2 * (le32_to_cpu(gc_info->v1.gc_num_wgp0_per_sa) +1531						      le32_to_cpu(gc_info->v1.gc_num_wgp1_per_sa));1532		adev->gfx.config.max_sh_per_se = le32_to_cpu(gc_info->v1.gc_num_sa_per_se);1533		adev->gfx.config.max_backends_per_se = le32_to_cpu(gc_info->v1.gc_num_rb_per_se);1534		adev->gfx.config.max_texture_channel_caches = le32_to_cpu(gc_info->v1.gc_num_gl2c);1535		adev->gfx.config.max_gprs = le32_to_cpu(gc_info->v1.gc_num_gprs);1536		adev->gfx.config.max_gs_threads = le32_to_cpu(gc_info->v1.gc_num_max_gs_thds);1537		adev->gfx.config.gs_vgt_table_depth = le32_to_cpu(gc_info->v1.gc_gs_table_depth);1538		adev->gfx.config.gs_prim_buffer_depth = le32_to_cpu(gc_info->v1.gc_gsprim_buff_depth);1539		adev->gfx.config.double_offchip_lds_buf = le32_to_cpu(gc_info->v1.gc_double_offchip_lds_buffer);1540		adev->gfx.cu_info.wave_front_size = le32_to_cpu(gc_info->v1.gc_wave_size);1541		adev->gfx.cu_info.max_waves_per_simd = le32_to_cpu(gc_info->v1.gc_max_waves_per_simd);1542		adev->gfx.cu_info.max_scratch_slots_per_cu = le32_to_cpu(gc_info->v1.gc_max_scratch_slots_per_cu);1543		adev->gfx.cu_info.lds_size = le32_to_cpu(gc_info->v1.gc_lds_size);1544		adev->gfx.config.num_sc_per_sh = le32_to_cpu(gc_info->v1.gc_num_sc_per_se) /1545			le32_to_cpu(gc_info->v1.gc_num_sa_per_se);1546		adev->gfx.config.num_packer_per_sc = le32_to_cpu(gc_info->v1.gc_num_packer_per_sc);1547		if (le16_to_cpu(gc_info->v1.header.version_minor) >= 1) {1548			adev->gfx.config.gc_num_tcp_per_sa = le32_to_cpu(gc_info->v1_1.gc_num_tcp_per_sa);1549			adev->gfx.config.gc_num_sdp_interface = le32_to_cpu(gc_info->v1_1.gc_num_sdp_interface);1550			adev->gfx.config.gc_num_tcps = le32_to_cpu(gc_info->v1_1.gc_num_tcps);1551		}1552		if (le16_to_cpu(gc_info->v1.header.version_minor) >= 2) {1553			adev->gfx.config.gc_num_tcp_per_wpg = le32_to_cpu(gc_info->v1_2.gc_num_tcp_per_wpg);1554			adev->gfx.config.gc_tcp_l1_size = le32_to_cpu(gc_info->v1_2.gc_tcp_l1_size);1555			adev->gfx.config.gc_num_sqc_per_wgp = le32_to_cpu(gc_info->v1_2.gc_num_sqc_per_wgp);1556			adev->gfx.config.gc_l1_instruction_cache_size_per_sqc = le32_to_cpu(gc_info->v1_2.gc_l1_instruction_cache_size_per_sqc);1557			adev->gfx.config.gc_l1_data_cache_size_per_sqc = le32_to_cpu(gc_info->v1_2.gc_l1_data_cache_size_per_sqc);1558			adev->gfx.config.gc_gl1c_per_sa = le32_to_cpu(gc_info->v1_2.gc_gl1c_per_sa);1559			adev->gfx.config.gc_gl1c_size_per_instance = le32_to_cpu(gc_info->v1_2.gc_gl1c_size_per_instance);1560			adev->gfx.config.gc_gl2c_per_gpu = le32_to_cpu(gc_info->v1_2.gc_gl2c_per_gpu);1561		}1562		if (le16_to_cpu(gc_info->v1.header.version_minor) >= 3) {1563			adev->gfx.config.gc_tcp_size_per_cu = le32_to_cpu(gc_info->v1_3.gc_tcp_size_per_cu);1564			adev->gfx.config.gc_tcp_cache_line_size = le32_to_cpu(gc_info->v1_3.gc_tcp_cache_line_size);1565			adev->gfx.config.gc_instruction_cache_size_per_sqc = le32_to_cpu(gc_info->v1_3.gc_instruction_cache_size_per_sqc);1566			adev->gfx.config.gc_instruction_cache_line_size = le32_to_cpu(gc_info->v1_3.gc_instruction_cache_line_size);1567			adev->gfx.config.gc_scalar_data_cache_size_per_sqc = le32_to_cpu(gc_info->v1_3.gc_scalar_data_cache_size_per_sqc);1568			adev->gfx.config.gc_scalar_data_cache_line_size = le32_to_cpu(gc_info->v1_3.gc_scalar_data_cache_line_size);1569			adev->gfx.config.gc_tcc_size = le32_to_cpu(gc_info->v1_3.gc_tcc_size);1570			adev->gfx.config.gc_tcc_cache_line_size = le32_to_cpu(gc_info->v1_3.gc_tcc_cache_line_size);1571		}1572		break;1573	case 2:1574		adev->gfx.config.max_shader_engines = le32_to_cpu(gc_info->v2.gc_num_se);1575		adev->gfx.config.max_cu_per_sh = le32_to_cpu(gc_info->v2.gc_num_cu_per_sh);1576		adev->gfx.config.max_sh_per_se = le32_to_cpu(gc_info->v2.gc_num_sh_per_se);1577		adev->gfx.config.max_backends_per_se = le32_to_cpu(gc_info->v2.gc_num_rb_per_se);1578		adev->gfx.config.max_texture_channel_caches = le32_to_cpu(gc_info->v2.gc_num_tccs);1579		adev->gfx.config.max_gprs = le32_to_cpu(gc_info->v2.gc_num_gprs);1580		adev->gfx.config.max_gs_threads = le32_to_cpu(gc_info->v2.gc_num_max_gs_thds);1581		adev->gfx.config.gs_vgt_table_depth = le32_to_cpu(gc_info->v2.gc_gs_table_depth);1582		adev->gfx.config.gs_prim_buffer_depth = le32_to_cpu(gc_info->v2.gc_gsprim_buff_depth);1583		adev->gfx.config.double_offchip_lds_buf = le32_to_cpu(gc_info->v2.gc_double_offchip_lds_buffer);1584		adev->gfx.cu_info.wave_front_size = le32_to_cpu(gc_info->v2.gc_wave_size);1585		adev->gfx.cu_info.max_waves_per_simd = le32_to_cpu(gc_info->v2.gc_max_waves_per_simd);1586		adev->gfx.cu_info.max_scratch_slots_per_cu = le32_to_cpu(gc_info->v2.gc_max_scratch_slots_per_cu);1587		adev->gfx.cu_info.lds_size = le32_to_cpu(gc_info->v2.gc_lds_size);1588		adev->gfx.config.num_sc_per_sh = le32_to_cpu(gc_info->v2.gc_num_sc_per_se) /1589			le32_to_cpu(gc_info->v2.gc_num_sh_per_se);1590		adev->gfx.config.num_packer_per_sc = le32_to_cpu(gc_info->v2.gc_num_packer_per_sc);1591		if (le16_to_cpu(gc_info->v2.header.version_minor) == 1) {1592			adev->gfx.config.gc_num_tcp_per_sa = le32_to_cpu(gc_info->v2_1.gc_num_tcp_per_sh);1593			adev->gfx.config.gc_tcp_size_per_cu = le32_to_cpu(gc_info->v2_1.gc_tcp_size_per_cu);1594			adev->gfx.config.gc_num_sdp_interface = le32_to_cpu(gc_info->v2_1.gc_num_sdp_interface); /* per XCD */1595			adev->gfx.config.gc_num_cu_per_sqc = le32_to_cpu(gc_info->v2_1.gc_num_cu_per_sqc);1596			adev->gfx.config.gc_l1_instruction_cache_size_per_sqc = le32_to_cpu(gc_info->v2_1.gc_instruction_cache_size_per_sqc);1597			adev->gfx.config.gc_l1_data_cache_size_per_sqc = le32_to_cpu(gc_info->v2_1.gc_scalar_data_cache_size_per_sqc);1598			adev->gfx.config.gc_tcc_size = le32_to_cpu(gc_info->v2_1.gc_tcc_size); /* per XCD */1599		}1600		break;1601	default:1602		dev_err(adev->dev,1603			"Unhandled GC info table %d.%d\n",1604			le16_to_cpu(gc_info->v1.header.version_major),1605			le16_to_cpu(gc_info->v1.header.version_minor));1606		return -EINVAL;1607	}1608	return 0;1609}1610 1611union mall_info {1612	struct mall_info_v1_0 v1;1613	struct mall_info_v2_0 v2;1614};1615 1616static int amdgpu_discovery_get_mall_info(struct amdgpu_device *adev)1617{1618	struct binary_header *bhdr;1619	union mall_info *mall_info;1620	u32 u, mall_size_per_umc, m_s_present, half_use;1621	u64 mall_size;1622	u16 offset;1623 1624	if (!adev->mman.discovery_bin) {1625		DRM_ERROR("ip discovery uninitialized\n");1626		return -EINVAL;1627	}1628 1629	bhdr = (struct binary_header *)adev->mman.discovery_bin;1630	offset = le16_to_cpu(bhdr->table_list[MALL_INFO].offset);1631 1632	if (!offset)1633		return 0;1634 1635	mall_info = (union mall_info *)(adev->mman.discovery_bin + offset);1636 1637	switch (le16_to_cpu(mall_info->v1.header.version_major)) {1638	case 1:1639		mall_size = 0;1640		mall_size_per_umc = le32_to_cpu(mall_info->v1.mall_size_per_m);1641		m_s_present = le32_to_cpu(mall_info->v1.m_s_present);1642		half_use = le32_to_cpu(mall_info->v1.m_half_use);1643		for (u = 0; u < adev->gmc.num_umc; u++) {1644			if (m_s_present & (1 << u))1645				mall_size += mall_size_per_umc * 2;1646			else if (half_use & (1 << u))1647				mall_size += mall_size_per_umc / 2;1648			else1649				mall_size += mall_size_per_umc;1650		}1651		adev->gmc.mall_size = mall_size;1652		adev->gmc.m_half_use = half_use;1653		break;1654	case 2:1655		mall_size_per_umc = le32_to_cpu(mall_info->v2.mall_size_per_umc);1656		adev->gmc.mall_size = (uint64_t)mall_size_per_umc * adev->gmc.num_umc;1657		break;1658	default:1659		dev_err(adev->dev,1660			"Unhandled MALL info table %d.%d\n",1661			le16_to_cpu(mall_info->v1.header.version_major),1662			le16_to_cpu(mall_info->v1.header.version_minor));1663		return -EINVAL;1664	}1665	return 0;1666}1667 1668union vcn_info {1669	struct vcn_info_v1_0 v1;1670};1671 1672static int amdgpu_discovery_get_vcn_info(struct amdgpu_device *adev)1673{1674	struct binary_header *bhdr;1675	union vcn_info *vcn_info;1676	u16 offset;1677	int v;1678 1679	if (!adev->mman.discovery_bin) {1680		DRM_ERROR("ip discovery uninitialized\n");1681		return -EINVAL;1682	}1683 1684	/* num_vcn_inst is currently limited to AMDGPU_MAX_VCN_INSTANCES1685	 * which is smaller than VCN_INFO_TABLE_MAX_NUM_INSTANCES1686	 * but that may change in the future with new GPUs so keep this1687	 * check for defensive purposes.1688	 */1689	if (adev->vcn.num_vcn_inst > VCN_INFO_TABLE_MAX_NUM_INSTANCES) {1690		dev_err(adev->dev, "invalid vcn instances\n");1691		return -EINVAL;1692	}1693 1694	bhdr = (struct binary_header *)adev->mman.discovery_bin;1695	offset = le16_to_cpu(bhdr->table_list[VCN_INFO].offset);1696 1697	if (!offset)1698		return 0;1699 1700	vcn_info = (union vcn_info *)(adev->mman.discovery_bin + offset);1701 1702	switch (le16_to_cpu(vcn_info->v1.header.version_major)) {1703	case 1:1704		/* num_vcn_inst is currently limited to AMDGPU_MAX_VCN_INSTANCES1705		 * so this won't overflow.1706		 */1707		for (v = 0; v < adev->vcn.num_vcn_inst; v++) {1708			adev->vcn.vcn_codec_disable_mask[v] =1709				le32_to_cpu(vcn_info->v1.instance_info[v].fuse_data.all_bits);1710		}1711		break;1712	default:1713		dev_err(adev->dev,1714			"Unhandled VCN info table %d.%d\n",1715			le16_to_cpu(vcn_info->v1.header.version_major),1716			le16_to_cpu(vcn_info->v1.header.version_minor));1717		return -EINVAL;1718	}1719	return 0;1720}1721 1722union nps_info {1723	struct nps_info_v1_0 v1;1724};1725 1726int amdgpu_discovery_get_nps_info(struct amdgpu_device *adev,1727				  uint32_t *nps_type,1728				  struct amdgpu_gmc_memrange **ranges,1729				  int *range_cnt)1730{1731	struct amdgpu_gmc_memrange *mem_ranges;1732	struct binary_header *bhdr;1733	union nps_info *nps_info;1734	u16 offset;1735	int i;1736 1737	if (!nps_type || !range_cnt || !ranges)1738		return -EINVAL;1739 1740	if (!adev->mman.discovery_bin) {1741		dev_err(adev->dev,1742			"fetch mem range failed, ip discovery uninitialized\n");1743		return -EINVAL;1744	}1745 1746	bhdr = (struct binary_header *)adev->mman.discovery_bin;1747	offset = le16_to_cpu(bhdr->table_list[NPS_INFO].offset);1748 1749	if (!offset)1750		return -ENOENT;1751 1752	/* If verification fails, return as if NPS table doesn't exist */1753	if (amdgpu_discovery_verify_npsinfo(adev, bhdr))1754		return -ENOENT;1755 1756	nps_info = (union nps_info *)(adev->mman.discovery_bin + offset);1757 1758	switch (le16_to_cpu(nps_info->v1.header.version_major)) {1759	case 1:1760		*nps_type = nps_info->v1.nps_type;1761		*range_cnt = nps_info->v1.count;1762		mem_ranges = kvzalloc(1763			*range_cnt * sizeof(struct amdgpu_gmc_memrange),1764			GFP_KERNEL);1765		for (i = 0; i < *range_cnt; i++) {1766			mem_ranges[i].base_address =1767				nps_info->v1.instance_info[i].base_address;1768			mem_ranges[i].limit_address =1769				nps_info->v1.instance_info[i].limit_address;1770			mem_ranges[i].nid_mask = -1;1771			mem_ranges[i].flags = 0;1772		}1773		*ranges = mem_ranges;1774		break;1775	default:1776		dev_err(adev->dev, "Unhandled NPS info table %d.%d\n",1777			le16_to_cpu(nps_info->v1.header.version_major),1778			le16_to_cpu(nps_info->v1.header.version_minor));1779		return -EINVAL;1780	}1781 1782	return 0;1783}1784 1785static int amdgpu_discovery_set_common_ip_blocks(struct amdgpu_device *adev)1786{1787	/* what IP to use for this? */1788	switch (amdgpu_ip_version(adev, GC_HWIP, 0)) {1789	case IP_VERSION(9, 0, 1):1790	case IP_VERSION(9, 1, 0):1791	case IP_VERSION(9, 2, 1):1792	case IP_VERSION(9, 2, 2):1793	case IP_VERSION(9, 3, 0):1794	case IP_VERSION(9, 4, 0):1795	case IP_VERSION(9, 4, 1):1796	case IP_VERSION(9, 4, 2):1797	case IP_VERSION(9, 4, 3):1798	case IP_VERSION(9, 4, 4):1799		amdgpu_device_ip_block_add(adev, &vega10_common_ip_block);1800		break;1801	case IP_VERSION(10, 1, 10):1802	case IP_VERSION(10, 1, 1):1803	case IP_VERSION(10, 1, 2):1804	case IP_VERSION(10, 1, 3):1805	case IP_VERSION(10, 1, 4):1806	case IP_VERSION(10, 3, 0):1807	case IP_VERSION(10, 3, 1):1808	case IP_VERSION(10, 3, 2):1809	case IP_VERSION(10, 3, 3):1810	case IP_VERSION(10, 3, 4):1811	case IP_VERSION(10, 3, 5):1812	case IP_VERSION(10, 3, 6):1813	case IP_VERSION(10, 3, 7):1814		amdgpu_device_ip_block_add(adev, &nv_common_ip_block);1815		break;1816	case IP_VERSION(11, 0, 0):1817	case IP_VERSION(11, 0, 1):1818	case IP_VERSION(11, 0, 2):1819	case IP_VERSION(11, 0, 3):1820	case IP_VERSION(11, 0, 4):1821	case IP_VERSION(11, 5, 0):1822	case IP_VERSION(11, 5, 1):1823	case IP_VERSION(11, 5, 2):1824		amdgpu_device_ip_block_add(adev, &soc21_common_ip_block);1825		break;1826	case IP_VERSION(12, 0, 0):1827	case IP_VERSION(12, 0, 1):1828		amdgpu_device_ip_block_add(adev, &soc24_common_ip_block);1829		break;1830	default:1831		dev_err(adev->dev,1832			"Failed to add common ip block(GC_HWIP:0x%x)\n",1833			amdgpu_ip_version(adev, GC_HWIP, 0));1834		return -EINVAL;1835	}1836	return 0;1837}1838 1839static int amdgpu_discovery_set_gmc_ip_blocks(struct amdgpu_device *adev)1840{1841	/* use GC or MMHUB IP version */1842	switch (amdgpu_ip_version(adev, GC_HWIP, 0)) {1843	case IP_VERSION(9, 0, 1):1844	case IP_VERSION(9, 1, 0):1845	case IP_VERSION(9, 2, 1):1846	case IP_VERSION(9, 2, 2):1847	case IP_VERSION(9, 3, 0):1848	case IP_VERSION(9, 4, 0):1849	case IP_VERSION(9, 4, 1):1850	case IP_VERSION(9, 4, 2):1851	case IP_VERSION(9, 4, 3):1852	case IP_VERSION(9, 4, 4):1853		amdgpu_device_ip_block_add(adev, &gmc_v9_0_ip_block);1854		break;1855	case IP_VERSION(10, 1, 10):1856	case IP_VERSION(10, 1, 1):1857	case IP_VERSION(10, 1, 2):1858	case IP_VERSION(10, 1, 3):1859	case IP_VERSION(10, 1, 4):1860	case IP_VERSION(10, 3, 0):1861	case IP_VERSION(10, 3, 1):1862	case IP_VERSION(10, 3, 2):1863	case IP_VERSION(10, 3, 3):1864	case IP_VERSION(10, 3, 4):1865	case IP_VERSION(10, 3, 5):1866	case IP_VERSION(10, 3, 6):1867	case IP_VERSION(10, 3, 7):1868		amdgpu_device_ip_block_add(adev, &gmc_v10_0_ip_block);1869		break;1870	case IP_VERSION(11, 0, 0):1871	case IP_VERSION(11, 0, 1):1872	case IP_VERSION(11, 0, 2):1873	case IP_VERSION(11, 0, 3):1874	case IP_VERSION(11, 0, 4):1875	case IP_VERSION(11, 5, 0):1876	case IP_VERSION(11, 5, 1):1877	case IP_VERSION(11, 5, 2):1878		amdgpu_device_ip_block_add(adev, &gmc_v11_0_ip_block);1879		break;1880	case IP_VERSION(12, 0, 0):1881	case IP_VERSION(12, 0, 1):1882		amdgpu_device_ip_block_add(adev, &gmc_v12_0_ip_block);1883		break;1884	default:1885		dev_err(adev->dev, "Failed to add gmc ip block(GC_HWIP:0x%x)\n",1886			amdgpu_ip_version(adev, GC_HWIP, 0));1887		return -EINVAL;1888	}1889	return 0;1890}1891 1892static int amdgpu_discovery_set_ih_ip_blocks(struct amdgpu_device *adev)1893{1894	switch (amdgpu_ip_version(adev, OSSSYS_HWIP, 0)) {1895	case IP_VERSION(4, 0, 0):1896	case IP_VERSION(4, 0, 1):1897	case IP_VERSION(4, 1, 0):1898	case IP_VERSION(4, 1, 1):1899	case IP_VERSION(4, 3, 0):1900		amdgpu_device_ip_block_add(adev, &vega10_ih_ip_block);1901		break;1902	case IP_VERSION(4, 2, 0):1903	case IP_VERSION(4, 2, 1):1904	case IP_VERSION(4, 4, 0):1905	case IP_VERSION(4, 4, 2):1906	case IP_VERSION(4, 4, 5):1907		amdgpu_device_ip_block_add(adev, &vega20_ih_ip_block);1908		break;1909	case IP_VERSION(5, 0, 0):1910	case IP_VERSION(5, 0, 1):1911	case IP_VERSION(5, 0, 2):1912	case IP_VERSION(5, 0, 3):1913	case IP_VERSION(5, 2, 0):1914	case IP_VERSION(5, 2, 1):1915		amdgpu_device_ip_block_add(adev, &navi10_ih_ip_block);1916		break;1917	case IP_VERSION(6, 0, 0):1918	case IP_VERSION(6, 0, 1):1919	case IP_VERSION(6, 0, 2):1920		amdgpu_device_ip_block_add(adev, &ih_v6_0_ip_block);1921		break;1922	case IP_VERSION(6, 1, 0):1923		amdgpu_device_ip_block_add(adev, &ih_v6_1_ip_block);1924		break;1925	case IP_VERSION(7, 0, 0):1926		amdgpu_device_ip_block_add(adev, &ih_v7_0_ip_block);1927		break;1928	default:1929		dev_err(adev->dev,1930			"Failed to add ih ip block(OSSSYS_HWIP:0x%x)\n",1931			amdgpu_ip_version(adev, OSSSYS_HWIP, 0));1932		return -EINVAL;1933	}1934	return 0;1935}1936 1937static int amdgpu_discovery_set_psp_ip_blocks(struct amdgpu_device *adev)1938{1939	switch (amdgpu_ip_version(adev, MP0_HWIP, 0)) {1940	case IP_VERSION(9, 0, 0):1941		amdgpu_device_ip_block_add(adev, &psp_v3_1_ip_block);1942		break;1943	case IP_VERSION(10, 0, 0):1944	case IP_VERSION(10, 0, 1):1945		amdgpu_device_ip_block_add(adev, &psp_v10_0_ip_block);1946		break;1947	case IP_VERSION(11, 0, 0):1948	case IP_VERSION(11, 0, 2):1949	case IP_VERSION(11, 0, 4):1950	case IP_VERSION(11, 0, 5):1951	case IP_VERSION(11, 0, 9):1952	case IP_VERSION(11, 0, 7):1953	case IP_VERSION(11, 0, 11):1954	case IP_VERSION(11, 0, 12):1955	case IP_VERSION(11, 0, 13):1956	case IP_VERSION(11, 5, 0):1957		amdgpu_device_ip_block_add(adev, &psp_v11_0_ip_block);1958		break;1959	case IP_VERSION(11, 0, 8):1960		amdgpu_device_ip_block_add(adev, &psp_v11_0_8_ip_block);1961		break;1962	case IP_VERSION(11, 0, 3):1963	case IP_VERSION(12, 0, 1):1964		amdgpu_device_ip_block_add(adev, &psp_v12_0_ip_block);1965		break;1966	case IP_VERSION(13, 0, 0):1967	case IP_VERSION(13, 0, 1):1968	case IP_VERSION(13, 0, 2):1969	case IP_VERSION(13, 0, 3):1970	case IP_VERSION(13, 0, 5):1971	case IP_VERSION(13, 0, 6):1972	case IP_VERSION(13, 0, 7):1973	case IP_VERSION(13, 0, 8):1974	case IP_VERSION(13, 0, 10):1975	case IP_VERSION(13, 0, 11):1976	case IP_VERSION(13, 0, 14):1977	case IP_VERSION(14, 0, 0):1978	case IP_VERSION(14, 0, 1):1979	case IP_VERSION(14, 0, 4):1980		amdgpu_device_ip_block_add(adev, &psp_v13_0_ip_block);1981		break;1982	case IP_VERSION(13, 0, 4):1983		amdgpu_device_ip_block_add(adev, &psp_v13_0_4_ip_block);1984		break;1985	case IP_VERSION(14, 0, 2):1986	case IP_VERSION(14, 0, 3):1987		amdgpu_device_ip_block_add(adev, &psp_v14_0_ip_block);1988		break;1989	default:1990		dev_err(adev->dev,1991			"Failed to add psp ip block(MP0_HWIP:0x%x)\n",1992			amdgpu_ip_version(adev, MP0_HWIP, 0));1993		return -EINVAL;1994	}1995	return 0;1996}1997 1998static int amdgpu_discovery_set_smu_ip_blocks(struct amdgpu_device *adev)1999{2000	switch (amdgpu_ip_version(adev, MP1_HWIP, 0)) {2001	case IP_VERSION(9, 0, 0):2002	case IP_VERSION(10, 0, 0):2003	case IP_VERSION(10, 0, 1):2004	case IP_VERSION(11, 0, 2):2005		if (adev->asic_type == CHIP_ARCTURUS)2006			amdgpu_device_ip_block_add(adev, &smu_v11_0_ip_block);2007		else2008			amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);2009		break;2010	case IP_VERSION(11, 0, 0):2011	case IP_VERSION(11, 0, 5):2012	case IP_VERSION(11, 0, 9):2013	case IP_VERSION(11, 0, 7):2014	case IP_VERSION(11, 0, 8):2015	case IP_VERSION(11, 0, 11):2016	case IP_VERSION(11, 0, 12):2017	case IP_VERSION(11, 0, 13):2018	case IP_VERSION(11, 5, 0):2019		amdgpu_device_ip_block_add(adev, &smu_v11_0_ip_block);2020		break;2021	case IP_VERSION(12, 0, 0):2022	case IP_VERSION(12, 0, 1):2023		amdgpu_device_ip_block_add(adev, &smu_v12_0_ip_block);2024		break;2025	case IP_VERSION(13, 0, 0):2026	case IP_VERSION(13, 0, 1):2027	case IP_VERSION(13, 0, 2):2028	case IP_VERSION(13, 0, 3):2029	case IP_VERSION(13, 0, 4):2030	case IP_VERSION(13, 0, 5):2031	case IP_VERSION(13, 0, 6):2032	case IP_VERSION(13, 0, 7):2033	case IP_VERSION(13, 0, 8):2034	case IP_VERSION(13, 0, 10):2035	case IP_VERSION(13, 0, 11):2036	case IP_VERSION(13, 0, 14):2037		amdgpu_device_ip_block_add(adev, &smu_v13_0_ip_block);2038		break;2039	case IP_VERSION(14, 0, 0):2040	case IP_VERSION(14, 0, 1):2041	case IP_VERSION(14, 0, 2):2042	case IP_VERSION(14, 0, 3):2043	case IP_VERSION(14, 0, 4):2044		amdgpu_device_ip_block_add(adev, &smu_v14_0_ip_block);2045		break;2046	default:2047		dev_err(adev->dev,2048			"Failed to add smu ip block(MP1_HWIP:0x%x)\n",2049			amdgpu_ip_version(adev, MP1_HWIP, 0));2050		return -EINVAL;2051	}2052	return 0;2053}2054 2055#if defined(CONFIG_DRM_AMD_DC)2056static void amdgpu_discovery_set_sriov_display(struct amdgpu_device *adev)2057{2058	amdgpu_device_set_sriov_virtual_display(adev);2059	amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);2060}2061#endif2062 2063static int amdgpu_discovery_set_display_ip_blocks(struct amdgpu_device *adev)2064{2065	if (adev->enable_virtual_display) {2066		amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);2067		return 0;2068	}2069 2070	if (!amdgpu_device_has_dc_support(adev))2071		return 0;2072 2073#if defined(CONFIG_DRM_AMD_DC)2074	if (amdgpu_ip_version(adev, DCE_HWIP, 0)) {2075		switch (amdgpu_ip_version(adev, DCE_HWIP, 0)) {2076		case IP_VERSION(1, 0, 0):2077		case IP_VERSION(1, 0, 1):2078		case IP_VERSION(2, 0, 2):2079		case IP_VERSION(2, 0, 0):2080		case IP_VERSION(2, 0, 3):2081		case IP_VERSION(2, 1, 0):2082		case IP_VERSION(3, 0, 0):2083		case IP_VERSION(3, 0, 2):2084		case IP_VERSION(3, 0, 3):2085		case IP_VERSION(3, 0, 1):2086		case IP_VERSION(3, 1, 2):2087		case IP_VERSION(3, 1, 3):2088		case IP_VERSION(3, 1, 4):2089		case IP_VERSION(3, 1, 5):2090		case IP_VERSION(3, 1, 6):2091		case IP_VERSION(3, 2, 0):2092		case IP_VERSION(3, 2, 1):2093		case IP_VERSION(3, 5, 0):2094		case IP_VERSION(3, 5, 1):2095		case IP_VERSION(4, 1, 0):2096			/* TODO: Fix IP version. DC code expects version 4.0.1 */2097			if (adev->ip_versions[DCE_HWIP][0] == IP_VERSION(4, 1, 0))2098				adev->ip_versions[DCE_HWIP][0] = IP_VERSION(4, 0, 1);2099 2100			if (amdgpu_sriov_vf(adev))2101				amdgpu_discovery_set_sriov_display(adev);2102			else2103				amdgpu_device_ip_block_add(adev, &dm_ip_block);2104			break;2105		default:2106			dev_err(adev->dev,2107				"Failed to add dm ip block(DCE_HWIP:0x%x)\n",2108				amdgpu_ip_version(adev, DCE_HWIP, 0));2109			return -EINVAL;2110		}2111	} else if (amdgpu_ip_version(adev, DCI_HWIP, 0)) {2112		switch (amdgpu_ip_version(adev, DCI_HWIP, 0)) {2113		case IP_VERSION(12, 0, 0):2114		case IP_VERSION(12, 0, 1):2115		case IP_VERSION(12, 1, 0):2116			if (amdgpu_sriov_vf(adev))2117				amdgpu_discovery_set_sriov_display(adev);2118			else2119				amdgpu_device_ip_block_add(adev, &dm_ip_block);2120			break;2121		default:2122			dev_err(adev->dev,2123				"Failed to add dm ip block(DCI_HWIP:0x%x)\n",2124				amdgpu_ip_version(adev, DCI_HWIP, 0));2125			return -EINVAL;2126		}2127	}2128#endif2129	return 0;2130}2131 2132static int amdgpu_discovery_set_gc_ip_blocks(struct amdgpu_device *adev)2133{2134	switch (amdgpu_ip_version(adev, GC_HWIP, 0)) {2135	case IP_VERSION(9, 0, 1):2136	case IP_VERSION(9, 1, 0):2137	case IP_VERSION(9, 2, 1):2138	case IP_VERSION(9, 2, 2):2139	case IP_VERSION(9, 3, 0):2140	case IP_VERSION(9, 4, 0):2141	case IP_VERSION(9, 4, 1):2142	case IP_VERSION(9, 4, 2):2143		amdgpu_device_ip_block_add(adev, &gfx_v9_0_ip_block);2144		break;2145	case IP_VERSION(9, 4, 3):2146	case IP_VERSION(9, 4, 4):2147		amdgpu_device_ip_block_add(adev, &gfx_v9_4_3_ip_block);2148		break;2149	case IP_VERSION(10, 1, 10):2150	case IP_VERSION(10, 1, 2):2151	case IP_VERSION(10, 1, 1):2152	case IP_VERSION(10, 1, 3):2153	case IP_VERSION(10, 1, 4):2154	case IP_VERSION(10, 3, 0):2155	case IP_VERSION(10, 3, 2):2156	case IP_VERSION(10, 3, 1):2157	case IP_VERSION(10, 3, 4):2158	case IP_VERSION(10, 3, 5):2159	case IP_VERSION(10, 3, 6):2160	case IP_VERSION(10, 3, 3):2161	case IP_VERSION(10, 3, 7):2162		amdgpu_device_ip_block_add(adev, &gfx_v10_0_ip_block);2163		break;2164	case IP_VERSION(11, 0, 0):2165	case IP_VERSION(11, 0, 1):2166	case IP_VERSION(11, 0, 2):2167	case IP_VERSION(11, 0, 3):2168	case IP_VERSION(11, 0, 4):2169	case IP_VERSION(11, 5, 0):2170	case IP_VERSION(11, 5, 1):2171	case IP_VERSION(11, 5, 2):2172		amdgpu_device_ip_block_add(adev, &gfx_v11_0_ip_block);2173		break;2174	case IP_VERSION(12, 0, 0):2175	case IP_VERSION(12, 0, 1):2176		amdgpu_device_ip_block_add(adev, &gfx_v12_0_ip_block);2177		break;2178	default:2179		dev_err(adev->dev, "Failed to add gfx ip block(GC_HWIP:0x%x)\n",2180			amdgpu_ip_version(adev, GC_HWIP, 0));2181		return -EINVAL;2182	}2183	return 0;2184}2185 2186static int amdgpu_discovery_set_sdma_ip_blocks(struct amdgpu_device *adev)2187{2188	switch (amdgpu_ip_version(adev, SDMA0_HWIP, 0)) {2189	case IP_VERSION(4, 0, 0):2190	case IP_VERSION(4, 0, 1):2191	case IP_VERSION(4, 1, 0):2192	case IP_VERSION(4, 1, 1):2193	case IP_VERSION(4, 1, 2):2194	case IP_VERSION(4, 2, 0):2195	case IP_VERSION(4, 2, 2):2196	case IP_VERSION(4, 4, 0):2197		amdgpu_device_ip_block_add(adev, &sdma_v4_0_ip_block);2198		break;2199	case IP_VERSION(4, 4, 2):2200	case IP_VERSION(4, 4, 5):2201		amdgpu_device_ip_block_add(adev, &sdma_v4_4_2_ip_block);2202		break;2203	case IP_VERSION(5, 0, 0):2204	case IP_VERSION(5, 0, 1):2205	case IP_VERSION(5, 0, 2):2206	case IP_VERSION(5, 0, 5):2207		amdgpu_device_ip_block_add(adev, &sdma_v5_0_ip_block);2208		break;2209	case IP_VERSION(5, 2, 0):2210	case IP_VERSION(5, 2, 2):2211	case IP_VERSION(5, 2, 4):2212	case IP_VERSION(5, 2, 5):2213	case IP_VERSION(5, 2, 6):2214	case IP_VERSION(5, 2, 3):2215	case IP_VERSION(5, 2, 1):2216	case IP_VERSION(5, 2, 7):2217		amdgpu_device_ip_block_add(adev, &sdma_v5_2_ip_block);2218		break;2219	case IP_VERSION(6, 0, 0):2220	case IP_VERSION(6, 0, 1):2221	case IP_VERSION(6, 0, 2):2222	case IP_VERSION(6, 0, 3):2223	case IP_VERSION(6, 1, 0):2224	case IP_VERSION(6, 1, 1):2225	case IP_VERSION(6, 1, 2):2226		amdgpu_device_ip_block_add(adev, &sdma_v6_0_ip_block);2227		break;2228	case IP_VERSION(7, 0, 0):2229	case IP_VERSION(7, 0, 1):2230		amdgpu_device_ip_block_add(adev, &sdma_v7_0_ip_block);2231		break;2232	default:2233		dev_err(adev->dev,2234			"Failed to add sdma ip block(SDMA0_HWIP:0x%x)\n",2235			amdgpu_ip_version(adev, SDMA0_HWIP, 0));2236		return -EINVAL;2237	}2238	return 0;2239}2240 2241static int amdgpu_discovery_set_mm_ip_blocks(struct amdgpu_device *adev)2242{2243	if (amdgpu_ip_version(adev, VCE_HWIP, 0)) {2244		switch (amdgpu_ip_version(adev, UVD_HWIP, 0)) {2245		case IP_VERSION(7, 0, 0):2246		case IP_VERSION(7, 2, 0):2247			/* UVD is not supported on vega20 SR-IOV */2248			if (!(adev->asic_type == CHIP_VEGA20 && amdgpu_sriov_vf(adev)))2249				amdgpu_device_ip_block_add(adev, &uvd_v7_0_ip_block);2250			break;2251		default:2252			dev_err(adev->dev,2253				"Failed to add uvd v7 ip block(UVD_HWIP:0x%x)\n",2254				amdgpu_ip_version(adev, UVD_HWIP, 0));2255			return -EINVAL;2256		}2257		switch (amdgpu_ip_version(adev, VCE_HWIP, 0)) {2258		case IP_VERSION(4, 0, 0):2259		case IP_VERSION(4, 1, 0):2260			/* VCE is not supported on vega20 SR-IOV */2261			if (!(adev->asic_type == CHIP_VEGA20 && amdgpu_sriov_vf(adev)))2262				amdgpu_device_ip_block_add(adev, &vce_v4_0_ip_block);2263			break;2264		default:2265			dev_err(adev->dev,2266				"Failed to add VCE v4 ip block(VCE_HWIP:0x%x)\n",2267				amdgpu_ip_version(adev, VCE_HWIP, 0));2268			return -EINVAL;2269		}2270	} else {2271		switch (amdgpu_ip_version(adev, UVD_HWIP, 0)) {2272		case IP_VERSION(1, 0, 0):2273		case IP_VERSION(1, 0, 1):2274			amdgpu_device_ip_block_add(adev, &vcn_v1_0_ip_block);2275			break;2276		case IP_VERSION(2, 0, 0):2277		case IP_VERSION(2, 0, 2):2278		case IP_VERSION(2, 2, 0):2279			amdgpu_device_ip_block_add(adev, &vcn_v2_0_ip_block);2280			if (!amdgpu_sriov_vf(adev))2281				amdgpu_device_ip_block_add(adev, &jpeg_v2_0_ip_block);2282			break;2283		case IP_VERSION(2, 0, 3):2284			break;2285		case IP_VERSION(2, 5, 0):2286			amdgpu_device_ip_block_add(adev, &vcn_v2_5_ip_block);2287			amdgpu_device_ip_block_add(adev, &jpeg_v2_5_ip_block);2288			break;2289		case IP_VERSION(2, 6, 0):2290			amdgpu_device_ip_block_add(adev, &vcn_v2_6_ip_block);2291			amdgpu_device_ip_block_add(adev, &jpeg_v2_6_ip_block);2292			break;2293		case IP_VERSION(3, 0, 0):2294		case IP_VERSION(3, 0, 16):2295		case IP_VERSION(3, 1, 1):2296		case IP_VERSION(3, 1, 2):2297		case IP_VERSION(3, 0, 2):2298			amdgpu_device_ip_block_add(adev, &vcn_v3_0_ip_block);2299			if (!amdgpu_sriov_vf(adev))2300				amdgpu_device_ip_block_add(adev, &jpeg_v3_0_ip_block);2301			break;2302		case IP_VERSION(3, 0, 33):2303			amdgpu_device_ip_block_add(adev, &vcn_v3_0_ip_block);2304			break;2305		case IP_VERSION(4, 0, 0):2306		case IP_VERSION(4, 0, 2):2307		case IP_VERSION(4, 0, 4):2308			amdgpu_device_ip_block_add(adev, &vcn_v4_0_ip_block);2309			amdgpu_device_ip_block_add(adev, &jpeg_v4_0_ip_block);2310			break;2311		case IP_VERSION(4, 0, 3):2312			amdgpu_device_ip_block_add(adev, &vcn_v4_0_3_ip_block);2313			amdgpu_device_ip_block_add(adev, &jpeg_v4_0_3_ip_block);2314			break;2315		case IP_VERSION(4, 0, 5):2316		case IP_VERSION(4, 0, 6):2317			amdgpu_device_ip_block_add(adev, &vcn_v4_0_5_ip_block);2318			amdgpu_device_ip_block_add(adev, &jpeg_v4_0_5_ip_block);2319			break;2320		case IP_VERSION(5, 0, 0):2321			amdgpu_device_ip_block_add(adev, &vcn_v5_0_0_ip_block);2322			amdgpu_device_ip_block_add(adev, &jpeg_v5_0_0_ip_block);2323			break;2324		default:2325			dev_err(adev->dev,2326				"Failed to add vcn/jpeg ip block(UVD_HWIP:0x%x)\n",2327				amdgpu_ip_version(adev, UVD_HWIP, 0));2328			return -EINVAL;2329		}2330	}2331	return 0;2332}2333 2334static int amdgpu_discovery_set_mes_ip_blocks(struct amdgpu_device *adev)2335{2336	switch (amdgpu_ip_version(adev, GC_HWIP, 0)) {2337	case IP_VERSION(11, 0, 0):2338	case IP_VERSION(11, 0, 1):2339	case IP_VERSION(11, 0, 2):2340	case IP_VERSION(11, 0, 3):2341	case IP_VERSION(11, 0, 4):2342	case IP_VERSION(11, 5, 0):2343	case IP_VERSION(11, 5, 1):2344	case IP_VERSION(11, 5, 2):2345		amdgpu_device_ip_block_add(adev, &mes_v11_0_ip_block);2346		adev->enable_mes = true;2347		adev->enable_mes_kiq = true;2348		break;2349	case IP_VERSION(12, 0, 0):2350	case IP_VERSION(12, 0, 1):2351		amdgpu_device_ip_block_add(adev, &mes_v12_0_ip_block);2352		adev->enable_mes = true;2353		adev->enable_mes_kiq = true;2354		if (amdgpu_uni_mes)2355			adev->enable_uni_mes = true;2356		break;2357	default:2358		break;2359	}2360	return 0;2361}2362 2363static void amdgpu_discovery_init_soc_config(struct amdgpu_device *adev)2364{2365	switch (amdgpu_ip_version(adev, GC_HWIP, 0)) {2366	case IP_VERSION(9, 4, 3):2367	case IP_VERSION(9, 4, 4):2368		aqua_vanjaram_init_soc_config(adev);2369		break;2370	default:2371		break;2372	}2373}2374 2375static int amdgpu_discovery_set_vpe_ip_blocks(struct amdgpu_device *adev)2376{2377	switch (amdgpu_ip_version(adev, VPE_HWIP, 0)) {2378	case IP_VERSION(6, 1, 0):2379	case IP_VERSION(6, 1, 1):2380	case IP_VERSION(6, 1, 3):2381		amdgpu_device_ip_block_add(adev, &vpe_v6_1_ip_block);2382		break;2383	default:2384		break;2385	}2386 2387	return 0;2388}2389 2390static int amdgpu_discovery_set_umsch_mm_ip_blocks(struct amdgpu_device *adev)2391{2392	switch (amdgpu_ip_version(adev, VCN_HWIP, 0)) {2393	case IP_VERSION(4, 0, 5):2394	case IP_VERSION(4, 0, 6):2395		if (amdgpu_umsch_mm & 0x1) {2396			amdgpu_device_ip_block_add(adev, &umsch_mm_v4_0_ip_block);2397			adev->enable_umsch_mm = true;2398		}2399		break;2400	default:2401		break;2402	}2403 2404	return 0;2405}2406 2407static int amdgpu_discovery_set_isp_ip_blocks(struct amdgpu_device *adev)2408{2409#if defined(CONFIG_DRM_AMD_ISP)2410	switch (amdgpu_ip_version(adev, ISP_HWIP, 0)) {2411	case IP_VERSION(4, 1, 0):2412		amdgpu_device_ip_block_add(adev, &isp_v4_1_0_ip_block);2413		break;2414	case IP_VERSION(4, 1, 1):2415		amdgpu_device_ip_block_add(adev, &isp_v4_1_1_ip_block);2416		break;2417	default:2418		break;2419	}2420#endif2421 2422	return 0;2423}2424 2425int amdgpu_discovery_set_ip_blocks(struct amdgpu_device *adev)2426{2427	int r;2428 2429	switch (adev->asic_type) {2430	case CHIP_VEGA10:2431		vega10_reg_base_init(adev);2432		adev->sdma.num_instances = 2;2433		adev->gmc.num_umc = 4;2434		adev->ip_versions[MMHUB_HWIP][0] = IP_VERSION(9, 0, 0);2435		adev->ip_versions[ATHUB_HWIP][0] = IP_VERSION(9, 0, 0);2436		adev->ip_versions[OSSSYS_HWIP][0] = IP_VERSION(4, 0, 0);2437		adev->ip_versions[HDP_HWIP][0] = IP_VERSION(4, 0, 0);2438		adev->ip_versions[SDMA0_HWIP][0] = IP_VERSION(4, 0, 0);2439		adev->ip_versions[SDMA1_HWIP][0] = IP_VERSION(4, 0, 0);2440		adev->ip_versions[DF_HWIP][0] = IP_VERSION(2, 1, 0);2441		adev->ip_versions[NBIO_HWIP][0] = IP_VERSION(6, 1, 0);2442		adev->ip_versions[UMC_HWIP][0] = IP_VERSION(6, 0, 0);2443		adev->ip_versions[MP0_HWIP][0] = IP_VERSION(9, 0, 0);2444		adev->ip_versions[MP1_HWIP][0] = IP_VERSION(9, 0, 0);2445		adev->ip_versions[THM_HWIP][0] = IP_VERSION(9, 0, 0);2446		adev->ip_versions[SMUIO_HWIP][0] = IP_VERSION(9, 0, 0);2447		adev->ip_versions[GC_HWIP][0] = IP_VERSION(9, 0, 1);2448		adev->ip_versions[UVD_HWIP][0] = IP_VERSION(7, 0, 0);2449		adev->ip_versions[VCE_HWIP][0] = IP_VERSION(4, 0, 0);2450		adev->ip_versions[DCI_HWIP][0] = IP_VERSION(12, 0, 0);2451		break;2452	case CHIP_VEGA12:2453		vega10_reg_base_init(adev);2454		adev->sdma.num_instances = 2;2455		adev->gmc.num_umc = 4;2456		adev->ip_versions[MMHUB_HWIP][0] = IP_VERSION(9, 3, 0);2457		adev->ip_versions[ATHUB_HWIP][0] = IP_VERSION(9, 3, 0);2458		adev->ip_versions[OSSSYS_HWIP][0] = IP_VERSION(4, 0, 1);2459		adev->ip_versions[HDP_HWIP][0] = IP_VERSION(4, 0, 1);2460		adev->ip_versions[SDMA0_HWIP][0] = IP_VERSION(4, 0, 1);2461		adev->ip_versions[SDMA1_HWIP][0] = IP_VERSION(4, 0, 1);2462		adev->ip_versions[DF_HWIP][0] = IP_VERSION(2, 5, 0);2463		adev->ip_versions[NBIO_HWIP][0] = IP_VERSION(6, 2, 0);2464		adev->ip_versions[UMC_HWIP][0] = IP_VERSION(6, 1, 0);2465		adev->ip_versions[MP0_HWIP][0] = IP_VERSION(9, 0, 0);2466		adev->ip_versions[MP1_HWIP][0] = IP_VERSION(9, 0, 0);2467		adev->ip_versions[THM_HWIP][0] = IP_VERSION(9, 0, 0);2468		adev->ip_versions[SMUIO_HWIP][0] = IP_VERSION(9, 0, 1);2469		adev->ip_versions[GC_HWIP][0] = IP_VERSION(9, 2, 1);2470		adev->ip_versions[UVD_HWIP][0] = IP_VERSION(7, 0, 0);2471		adev->ip_versions[VCE_HWIP][0] = IP_VERSION(4, 0, 0);2472		adev->ip_versions[DCI_HWIP][0] = IP_VERSION(12, 0, 1);2473		break;2474	case CHIP_RAVEN:2475		vega10_reg_base_init(adev);2476		adev->sdma.num_instances = 1;2477		adev->vcn.num_vcn_inst = 1;2478		adev->gmc.num_umc = 2;2479		if (adev->apu_flags & AMD_APU_IS_RAVEN2) {2480			adev->ip_versions[MMHUB_HWIP][0] = IP_VERSION(9, 2, 0);2481			adev->ip_versions[ATHUB_HWIP][0] = IP_VERSION(9, 2, 0);2482			adev->ip_versions[OSSSYS_HWIP][0] = IP_VERSION(4, 1, 1);2483			adev->ip_versions[HDP_HWIP][0] = IP_VERSION(4, 1, 1);2484			adev->ip_versions[SDMA0_HWIP][0] = IP_VERSION(4, 1, 1);2485			adev->ip_versions[DF_HWIP][0] = IP_VERSION(2, 1, 1);2486			adev->ip_versions[NBIO_HWIP][0] = IP_VERSION(7, 0, 1);2487			adev->ip_versions[UMC_HWIP][0] = IP_VERSION(7, 5, 0);2488			adev->ip_versions[MP0_HWIP][0] = IP_VERSION(10, 0, 1);2489			adev->ip_versions[MP1_HWIP][0] = IP_VERSION(10, 0, 1);2490			adev->ip_versions[THM_HWIP][0] = IP_VERSION(10, 1, 0);2491			adev->ip_versions[SMUIO_HWIP][0] = IP_VERSION(10, 0, 1);2492			adev->ip_versions[GC_HWIP][0] = IP_VERSION(9, 2, 2);2493			adev->ip_versions[UVD_HWIP][0] = IP_VERSION(1, 0, 1);2494			adev->ip_versions[DCE_HWIP][0] = IP_VERSION(1, 0, 1);2495		} else {2496			adev->ip_versions[MMHUB_HWIP][0] = IP_VERSION(9, 1, 0);2497			adev->ip_versions[ATHUB_HWIP][0] = IP_VERSION(9, 1, 0);2498			adev->ip_versions[OSSSYS_HWIP][0] = IP_VERSION(4, 1, 0);2499			adev->ip_versions[HDP_HWIP][0] = IP_VERSION(4, 1, 0);2500			adev->ip_versions[SDMA0_HWIP][0] = IP_VERSION(4, 1, 0);2501			adev->ip_versions[DF_HWIP][0] = IP_VERSION(2, 1, 0);2502			adev->ip_versions[NBIO_HWIP][0] = IP_VERSION(7, 0, 0);2503			adev->ip_versions[UMC_HWIP][0] = IP_VERSION(7, 0, 0);2504			adev->ip_versions[MP0_HWIP][0] = IP_VERSION(10, 0, 0);2505			adev->ip_versions[MP1_HWIP][0] = IP_VERSION(10, 0, 0);2506			adev->ip_versions[THM_HWIP][0] = IP_VERSION(10, 0, 0);2507			adev->ip_versions[SMUIO_HWIP][0] = IP_VERSION(10, 0, 0);2508			adev->ip_versions[GC_HWIP][0] = IP_VERSION(9, 1, 0);2509			adev->ip_versions[UVD_HWIP][0] = IP_VERSION(1, 0, 0);2510			adev->ip_versions[DCE_HWIP][0] = IP_VERSION(1, 0, 0);2511		}2512		break;2513	case CHIP_VEGA20:2514		vega20_reg_base_init(adev);2515		adev->sdma.num_instances = 2;2516		adev->gmc.num_umc = 8;2517		adev->ip_versions[MMHUB_HWIP][0] = IP_VERSION(9, 4, 0);2518		adev->ip_versions[ATHUB_HWIP][0] = IP_VERSION(9, 4, 0);2519		adev->ip_versions[OSSSYS_HWIP][0] = IP_VERSION(4, 2, 0);2520		adev->ip_versions[HDP_HWIP][0] = IP_VERSION(4, 2, 0);2521		adev->ip_versions[SDMA0_HWIP][0] = IP_VERSION(4, 2, 0);2522		adev->ip_versions[SDMA1_HWIP][0] = IP_VERSION(4, 2, 0);2523		adev->ip_versions[DF_HWIP][0] = IP_VERSION(3, 6, 0);2524		adev->ip_versions[NBIO_HWIP][0] = IP_VERSION(7, 4, 0);2525		adev->ip_versions[UMC_HWIP][0] = IP_VERSION(6, 1, 1);2526		adev->ip_versions[MP0_HWIP][0] = IP_VERSION(11, 0, 2);2527		adev->ip_versions[MP1_HWIP][0] = IP_VERSION(11, 0, 2);2528		adev->ip_versions[THM_HWIP][0] = IP_VERSION(11, 0, 2);2529		adev->ip_versions[SMUIO_HWIP][0] = IP_VERSION(11, 0, 2);2530		adev->ip_versions[GC_HWIP][0] = IP_VERSION(9, 4, 0);2531		adev->ip_versions[UVD_HWIP][0] = IP_VERSION(7, 2, 0);2532		adev->ip_versions[UVD_HWIP][1] = IP_VERSION(7, 2, 0);2533		adev->ip_versions[VCE_HWIP][0] = IP_VERSION(4, 1, 0);2534		adev->ip_versions[DCI_HWIP][0] = IP_VERSION(12, 1, 0);2535		break;2536	case CHIP_ARCTURUS:2537		arct_reg_base_init(adev);2538		adev->sdma.num_instances = 8;2539		adev->vcn.num_vcn_inst = 2;2540		adev->gmc.num_umc = 8;2541		adev->ip_versions[MMHUB_HWIP][0] = IP_VERSION(9, 4, 1);2542		adev->ip_versions[ATHUB_HWIP][0] = IP_VERSION(9, 4, 1);2543		adev->ip_versions[OSSSYS_HWIP][0] = IP_VERSION(4, 2, 1);2544		adev->ip_versions[HDP_HWIP][0] = IP_VERSION(4, 2, 1);2545		adev->ip_versions[SDMA0_HWIP][0] = IP_VERSION(4, 2, 2);2546		adev->ip_versions[SDMA1_HWIP][0] = IP_VERSION(4, 2, 2);2547		adev->ip_versions[SDMA1_HWIP][1] = IP_VERSION(4, 2, 2);2548		adev->ip_versions[SDMA1_HWIP][2] = IP_VERSION(4, 2, 2);2549		adev->ip_versions[SDMA1_HWIP][3] = IP_VERSION(4, 2, 2);2550		adev->ip_versions[SDMA1_HWIP][4] = IP_VERSION(4, 2, 2);2551		adev->ip_versions[SDMA1_HWIP][5] = IP_VERSION(4, 2, 2);2552		adev->ip_versions[SDMA1_HWIP][6] = IP_VERSION(4, 2, 2);2553		adev->ip_versions[DF_HWIP][0] = IP_VERSION(3, 6, 1);2554		adev->ip_versions[NBIO_HWIP][0] = IP_VERSION(7, 4, 1);2555		adev->ip_versions[UMC_HWIP][0] = IP_VERSION(6, 1, 2);2556		adev->ip_versions[MP0_HWIP][0] = IP_VERSION(11, 0, 4);2557		adev->ip_versions[MP1_HWIP][0] = IP_VERSION(11, 0, 2);2558		adev->ip_versions[THM_HWIP][0] = IP_VERSION(11, 0, 3);2559		adev->ip_versions[SMUIO_HWIP][0] = IP_VERSION(11, 0, 3);2560		adev->ip_versions[GC_HWIP][0] = IP_VERSION(9, 4, 1);2561		adev->ip_versions[UVD_HWIP][0] = IP_VERSION(2, 5, 0);2562		adev->ip_versions[UVD_HWIP][1] = IP_VERSION(2, 5, 0);2563		break;2564	case CHIP_ALDEBARAN:2565		aldebaran_reg_base_init(adev);2566		adev->sdma.num_instances = 5;2567		adev->vcn.num_vcn_inst = 2;2568		adev->gmc.num_umc = 4;2569		adev->ip_versions[MMHUB_HWIP][0] = IP_VERSION(9, 4, 2);2570		adev->ip_versions[ATHUB_HWIP][0] = IP_VERSION(9, 4, 2);2571		adev->ip_versions[OSSSYS_HWIP][0] = IP_VERSION(4, 4, 0);2572		adev->ip_versions[HDP_HWIP][0] = IP_VERSION(4, 4, 0);2573		adev->ip_versions[SDMA0_HWIP][0] = IP_VERSION(4, 4, 0);2574		adev->ip_versions[SDMA0_HWIP][1] = IP_VERSION(4, 4, 0);2575		adev->ip_versions[SDMA0_HWIP][2] = IP_VERSION(4, 4, 0);2576		adev->ip_versions[SDMA0_HWIP][3] = IP_VERSION(4, 4, 0);2577		adev->ip_versions[SDMA0_HWIP][4] = IP_VERSION(4, 4, 0);2578		adev->ip_versions[DF_HWIP][0] = IP_VERSION(3, 6, 2);2579		adev->ip_versions[NBIO_HWIP][0] = IP_VERSION(7, 4, 4);2580		adev->ip_versions[UMC_HWIP][0] = IP_VERSION(6, 7, 0);2581		adev->ip_versions[MP0_HWIP][0] = IP_VERSION(13, 0, 2);2582		adev->ip_versions[MP1_HWIP][0] = IP_VERSION(13, 0, 2);2583		adev->ip_versions[THM_HWIP][0] = IP_VERSION(13, 0, 2);2584		adev->ip_versions[SMUIO_HWIP][0] = IP_VERSION(13, 0, 2);2585		adev->ip_versions[GC_HWIP][0] = IP_VERSION(9, 4, 2);2586		adev->ip_versions[UVD_HWIP][0] = IP_VERSION(2, 6, 0);2587		adev->ip_versions[UVD_HWIP][1] = IP_VERSION(2, 6, 0);2588		adev->ip_versions[XGMI_HWIP][0] = IP_VERSION(6, 1, 0);2589		break;2590	default:2591		r = amdgpu_discovery_reg_base_init(adev);2592		if (r)2593			return -EINVAL;2594 2595		amdgpu_discovery_harvest_ip(adev);2596		amdgpu_discovery_get_gfx_info(adev);2597		amdgpu_discovery_get_mall_info(adev);2598		amdgpu_discovery_get_vcn_info(adev);2599		break;2600	}2601 2602	amdgpu_discovery_init_soc_config(adev);2603	amdgpu_discovery_sysfs_init(adev);2604 2605	switch (amdgpu_ip_version(adev, GC_HWIP, 0)) {2606	case IP_VERSION(9, 0, 1):2607	case IP_VERSION(9, 2, 1):2608	case IP_VERSION(9, 4, 0):2609	case IP_VERSION(9, 4, 1):2610	case IP_VERSION(9, 4, 2):2611	case IP_VERSION(9, 4, 3):2612	case IP_VERSION(9, 4, 4):2613		adev->family = AMDGPU_FAMILY_AI;2614		break;2615	case IP_VERSION(9, 1, 0):2616	case IP_VERSION(9, 2, 2):2617	case IP_VERSION(9, 3, 0):2618		adev->family = AMDGPU_FAMILY_RV;2619		break;2620	case IP_VERSION(10, 1, 10):2621	case IP_VERSION(10, 1, 1):2622	case IP_VERSION(10, 1, 2):2623	case IP_VERSION(10, 1, 3):2624	case IP_VERSION(10, 1, 4):2625	case IP_VERSION(10, 3, 0):2626	case IP_VERSION(10, 3, 2):2627	case IP_VERSION(10, 3, 4):2628	case IP_VERSION(10, 3, 5):2629		adev->family = AMDGPU_FAMILY_NV;2630		break;2631	case IP_VERSION(10, 3, 1):2632		adev->family = AMDGPU_FAMILY_VGH;2633		adev->apu_flags |= AMD_APU_IS_VANGOGH;2634		break;2635	case IP_VERSION(10, 3, 3):2636		adev->family = AMDGPU_FAMILY_YC;2637		break;2638	case IP_VERSION(10, 3, 6):2639		adev->family = AMDGPU_FAMILY_GC_10_3_6;2640		break;2641	case IP_VERSION(10, 3, 7):2642		adev->family = AMDGPU_FAMILY_GC_10_3_7;2643		break;2644	case IP_VERSION(11, 0, 0):2645	case IP_VERSION(11, 0, 2):2646	case IP_VERSION(11, 0, 3):2647		adev->family = AMDGPU_FAMILY_GC_11_0_0;2648		break;2649	case IP_VERSION(11, 0, 1):2650	case IP_VERSION(11, 0, 4):2651		adev->family = AMDGPU_FAMILY_GC_11_0_1;2652		break;2653	case IP_VERSION(11, 5, 0):2654	case IP_VERSION(11, 5, 1):2655	case IP_VERSION(11, 5, 2):2656		adev->family = AMDGPU_FAMILY_GC_11_5_0;2657		break;2658	case IP_VERSION(12, 0, 0):2659	case IP_VERSION(12, 0, 1):2660		adev->family = AMDGPU_FAMILY_GC_12_0_0;2661		break;2662	default:2663		return -EINVAL;2664	}2665 2666	switch (amdgpu_ip_version(adev, GC_HWIP, 0)) {2667	case IP_VERSION(9, 1, 0):2668	case IP_VERSION(9, 2, 2):2669	case IP_VERSION(9, 3, 0):2670	case IP_VERSION(10, 1, 3):2671	case IP_VERSION(10, 1, 4):2672	case IP_VERSION(10, 3, 1):2673	case IP_VERSION(10, 3, 3):2674	case IP_VERSION(10, 3, 6):2675	case IP_VERSION(10, 3, 7):2676	case IP_VERSION(11, 0, 1):2677	case IP_VERSION(11, 0, 4):2678	case IP_VERSION(11, 5, 0):2679	case IP_VERSION(11, 5, 1):2680	case IP_VERSION(11, 5, 2):2681		adev->flags |= AMD_IS_APU;2682		break;2683	default:2684		break;2685	}2686 2687	if (amdgpu_ip_version(adev, XGMI_HWIP, 0) == IP_VERSION(4, 8, 0))2688		adev->gmc.xgmi.supported = true;2689 2690	if (amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 4, 3) ||2691	    amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 4, 4))2692		adev->ip_versions[XGMI_HWIP][0] = IP_VERSION(6, 4, 0);2693 2694	/* set NBIO version */2695	switch (amdgpu_ip_version(adev, NBIO_HWIP, 0)) {2696	case IP_VERSION(6, 1, 0):2697	case IP_VERSION(6, 2, 0):2698		adev->nbio.funcs = &nbio_v6_1_funcs;2699		adev->nbio.hdp_flush_reg = &nbio_v6_1_hdp_flush_reg;2700		break;2701	case IP_VERSION(7, 0, 0):2702	case IP_VERSION(7, 0, 1):2703	case IP_VERSION(2, 5, 0):2704		adev->nbio.funcs = &nbio_v7_0_funcs;2705		adev->nbio.hdp_flush_reg = &nbio_v7_0_hdp_flush_reg;2706		break;2707	case IP_VERSION(7, 4, 0):2708	case IP_VERSION(7, 4, 1):2709	case IP_VERSION(7, 4, 4):2710		adev->nbio.funcs = &nbio_v7_4_funcs;2711		adev->nbio.hdp_flush_reg = &nbio_v7_4_hdp_flush_reg;2712		break;2713	case IP_VERSION(7, 9, 0):2714		adev->nbio.funcs = &nbio_v7_9_funcs;2715		adev->nbio.hdp_flush_reg = &nbio_v7_9_hdp_flush_reg;2716		break;2717	case IP_VERSION(7, 11, 0):2718	case IP_VERSION(7, 11, 1):2719	case IP_VERSION(7, 11, 3):2720		adev->nbio.funcs = &nbio_v7_11_funcs;2721		adev->nbio.hdp_flush_reg = &nbio_v7_11_hdp_flush_reg;2722		break;2723	case IP_VERSION(7, 2, 0):2724	case IP_VERSION(7, 2, 1):2725	case IP_VERSION(7, 3, 0):2726	case IP_VERSION(7, 5, 0):2727	case IP_VERSION(7, 5, 1):2728		adev->nbio.funcs = &nbio_v7_2_funcs;2729		adev->nbio.hdp_flush_reg = &nbio_v7_2_hdp_flush_reg;2730		break;2731	case IP_VERSION(2, 1, 1):2732	case IP_VERSION(2, 3, 0):2733	case IP_VERSION(2, 3, 1):2734	case IP_VERSION(2, 3, 2):2735	case IP_VERSION(3, 3, 0):2736	case IP_VERSION(3, 3, 1):2737	case IP_VERSION(3, 3, 2):2738	case IP_VERSION(3, 3, 3):2739		adev->nbio.funcs = &nbio_v2_3_funcs;2740		adev->nbio.hdp_flush_reg = &nbio_v2_3_hdp_flush_reg;2741		break;2742	case IP_VERSION(4, 3, 0):2743	case IP_VERSION(4, 3, 1):2744		if (amdgpu_sriov_vf(adev))2745			adev->nbio.funcs = &nbio_v4_3_sriov_funcs;2746		else2747			adev->nbio.funcs = &nbio_v4_3_funcs;2748		adev->nbio.hdp_flush_reg = &nbio_v4_3_hdp_flush_reg;2749		break;2750	case IP_VERSION(7, 7, 0):2751	case IP_VERSION(7, 7, 1):2752		adev->nbio.funcs = &nbio_v7_7_funcs;2753		adev->nbio.hdp_flush_reg = &nbio_v7_7_hdp_flush_reg;2754		break;2755	case IP_VERSION(6, 3, 1):2756		adev->nbio.funcs = &nbif_v6_3_1_funcs;2757		adev->nbio.hdp_flush_reg = &nbif_v6_3_1_hdp_flush_reg;2758		break;2759	default:2760		break;2761	}2762 2763	switch (amdgpu_ip_version(adev, HDP_HWIP, 0)) {2764	case IP_VERSION(4, 0, 0):2765	case IP_VERSION(4, 0, 1):2766	case IP_VERSION(4, 1, 0):2767	case IP_VERSION(4, 1, 1):2768	case IP_VERSION(4, 1, 2):2769	case IP_VERSION(4, 2, 0):2770	case IP_VERSION(4, 2, 1):2771	case IP_VERSION(4, 4, 0):2772	case IP_VERSION(4, 4, 2):2773	case IP_VERSION(4, 4, 5):2774		adev->hdp.funcs = &hdp_v4_0_funcs;2775		break;2776	case IP_VERSION(5, 0, 0):2777	case IP_VERSION(5, 0, 1):2778	case IP_VERSION(5, 0, 2):2779	case IP_VERSION(5, 0, 3):2780	case IP_VERSION(5, 0, 4):2781	case IP_VERSION(5, 2, 0):2782		adev->hdp.funcs = &hdp_v5_0_funcs;2783		break;2784	case IP_VERSION(5, 2, 1):2785		adev->hdp.funcs = &hdp_v5_2_funcs;2786		break;2787	case IP_VERSION(6, 0, 0):2788	case IP_VERSION(6, 0, 1):2789	case IP_VERSION(6, 1, 0):2790		adev->hdp.funcs = &hdp_v6_0_funcs;2791		break;2792	case IP_VERSION(7, 0, 0):2793		adev->hdp.funcs = &hdp_v7_0_funcs;2794		break;2795	default:2796		break;2797	}2798 2799	switch (amdgpu_ip_version(adev, DF_HWIP, 0)) {2800	case IP_VERSION(3, 6, 0):2801	case IP_VERSION(3, 6, 1):2802	case IP_VERSION(3, 6, 2):2803		adev->df.funcs = &df_v3_6_funcs;2804		break;2805	case IP_VERSION(2, 1, 0):2806	case IP_VERSION(2, 1, 1):2807	case IP_VERSION(2, 5, 0):2808	case IP_VERSION(3, 5, 1):2809	case IP_VERSION(3, 5, 2):2810		adev->df.funcs = &df_v1_7_funcs;2811		break;2812	case IP_VERSION(4, 3, 0):2813		adev->df.funcs = &df_v4_3_funcs;2814		break;2815	case IP_VERSION(4, 6, 2):2816		adev->df.funcs = &df_v4_6_2_funcs;2817		break;2818	case IP_VERSION(4, 15, 0):2819	case IP_VERSION(4, 15, 1):2820		adev->df.funcs = &df_v4_15_funcs;2821		break;2822	default:2823		break;2824	}2825 2826	switch (amdgpu_ip_version(adev, SMUIO_HWIP, 0)) {2827	case IP_VERSION(9, 0, 0):2828	case IP_VERSION(9, 0, 1):2829	case IP_VERSION(10, 0, 0):2830	case IP_VERSION(10, 0, 1):2831	case IP_VERSION(10, 0, 2):2832		adev->smuio.funcs = &smuio_v9_0_funcs;2833		break;2834	case IP_VERSION(11, 0, 0):2835	case IP_VERSION(11, 0, 2):2836	case IP_VERSION(11, 0, 3):2837	case IP_VERSION(11, 0, 4):2838	case IP_VERSION(11, 0, 7):2839	case IP_VERSION(11, 0, 8):2840		adev->smuio.funcs = &smuio_v11_0_funcs;2841		break;2842	case IP_VERSION(11, 0, 6):2843	case IP_VERSION(11, 0, 10):2844	case IP_VERSION(11, 0, 11):2845	case IP_VERSION(11, 5, 0):2846	case IP_VERSION(13, 0, 1):2847	case IP_VERSION(13, 0, 9):2848	case IP_VERSION(13, 0, 10):2849		adev->smuio.funcs = &smuio_v11_0_6_funcs;2850		break;2851	case IP_VERSION(13, 0, 2):2852		adev->smuio.funcs = &smuio_v13_0_funcs;2853		break;2854	case IP_VERSION(13, 0, 3):2855		adev->smuio.funcs = &smuio_v13_0_3_funcs;2856		if (adev->smuio.funcs->get_pkg_type(adev) == AMDGPU_PKG_TYPE_APU) {2857			adev->flags |= AMD_IS_APU;2858		}2859		break;2860	case IP_VERSION(13, 0, 6):2861	case IP_VERSION(13, 0, 8):2862	case IP_VERSION(14, 0, 0):2863	case IP_VERSION(14, 0, 1):2864		adev->smuio.funcs = &smuio_v13_0_6_funcs;2865		break;2866	case IP_VERSION(14, 0, 2):2867		adev->smuio.funcs = &smuio_v14_0_2_funcs;2868		break;2869	default:2870		break;2871	}2872 2873	switch (amdgpu_ip_version(adev, LSDMA_HWIP, 0)) {2874	case IP_VERSION(6, 0, 0):2875	case IP_VERSION(6, 0, 1):2876	case IP_VERSION(6, 0, 2):2877	case IP_VERSION(6, 0, 3):2878		adev->lsdma.funcs = &lsdma_v6_0_funcs;2879		break;2880	case IP_VERSION(7, 0, 0):2881	case IP_VERSION(7, 0, 1):2882		adev->lsdma.funcs = &lsdma_v7_0_funcs;2883		break;2884	default:2885		break;2886	}2887 2888	r = amdgpu_discovery_set_common_ip_blocks(adev);2889	if (r)2890		return r;2891 2892	r = amdgpu_discovery_set_gmc_ip_blocks(adev);2893	if (r)2894		return r;2895 2896	/* For SR-IOV, PSP needs to be initialized before IH */2897	if (amdgpu_sriov_vf(adev)) {2898		r = amdgpu_discovery_set_psp_ip_blocks(adev);2899		if (r)2900			return r;2901		r = amdgpu_discovery_set_ih_ip_blocks(adev);2902		if (r)2903			return r;2904	} else {2905		r = amdgpu_discovery_set_ih_ip_blocks(adev);2906		if (r)2907			return r;2908 2909		if (likely(adev->firmware.load_type == AMDGPU_FW_LOAD_PSP)) {2910			r = amdgpu_discovery_set_psp_ip_blocks(adev);2911			if (r)2912				return r;2913		}2914	}2915 2916	if (likely(adev->firmware.load_type == AMDGPU_FW_LOAD_PSP)) {2917		r = amdgpu_discovery_set_smu_ip_blocks(adev);2918		if (r)2919			return r;2920	}2921 2922	r = amdgpu_discovery_set_display_ip_blocks(adev);2923	if (r)2924		return r;2925 2926	r = amdgpu_discovery_set_gc_ip_blocks(adev);2927	if (r)2928		return r;2929 2930	r = amdgpu_discovery_set_sdma_ip_blocks(adev);2931	if (r)2932		return r;2933 2934	if ((adev->firmware.load_type == AMDGPU_FW_LOAD_DIRECT &&2935	     !amdgpu_sriov_vf(adev)) ||2936	    (adev->firmware.load_type == AMDGPU_FW_LOAD_RLC_BACKDOOR_AUTO && amdgpu_dpm == 1)) {2937		r = amdgpu_discovery_set_smu_ip_blocks(adev);2938		if (r)2939			return r;2940	}2941 2942	r = amdgpu_discovery_set_mm_ip_blocks(adev);2943	if (r)2944		return r;2945 2946	r = amdgpu_discovery_set_mes_ip_blocks(adev);2947	if (r)2948		return r;2949 2950	r = amdgpu_discovery_set_vpe_ip_blocks(adev);2951	if (r)2952		return r;2953 2954	r = amdgpu_discovery_set_umsch_mm_ip_blocks(adev);2955	if (r)2956		return r;2957 2958	r = amdgpu_discovery_set_isp_ip_blocks(adev);2959	if (r)2960		return r;2961	return 0;2962}2963 2964