/*
 * Copyright © 2017 Advanced Micro Devices, Inc.
 *
 * Permission is hereby granted, free of charge, to any person obtaining
 * a copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sub license, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS, AUTHORS
 * AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
 * USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 * The above copyright notice and this permission notice (including the
 * next paragraph) shall be included in all copies or substantial portions
 * of the Software.
 */

#include "ac_gpu_info.h"
#include "addrlib/src/amdgpu_asic_addr.h"
#include "sid.h"

#include "util/macros.h"
#include "util/u_math.h"

#include <stdio.h>

#include <xf86drm.h>
#include "drm-uapi/amdgpu_drm.h"

#include <amdgpu.h>

#define CIK_TILE_MODE_COLOR_2D			14

#define CIK__GB_TILE_MODE__PIPE_CONFIG(x)        (((x) >> 6) & 0x1f)
#define     CIK__PIPE_CONFIG__ADDR_SURF_P2               0
#define     CIK__PIPE_CONFIG__ADDR_SURF_P4_8x16          4
#define     CIK__PIPE_CONFIG__ADDR_SURF_P4_16x16         5
#define     CIK__PIPE_CONFIG__ADDR_SURF_P4_16x32         6
#define     CIK__PIPE_CONFIG__ADDR_SURF_P4_32x32         7
#define     CIK__PIPE_CONFIG__ADDR_SURF_P8_16x16_8x16    8
#define     CIK__PIPE_CONFIG__ADDR_SURF_P8_16x32_8x16    9
#define     CIK__PIPE_CONFIG__ADDR_SURF_P8_32x32_8x16    10
#define     CIK__PIPE_CONFIG__ADDR_SURF_P8_16x32_16x16   11
#define     CIK__PIPE_CONFIG__ADDR_SURF_P8_32x32_16x16   12
#define     CIK__PIPE_CONFIG__ADDR_SURF_P8_32x32_16x32   13
#define     CIK__PIPE_CONFIG__ADDR_SURF_P8_32x64_32x32   14
#define     CIK__PIPE_CONFIG__ADDR_SURF_P16_32X32_8X16   16
#define     CIK__PIPE_CONFIG__ADDR_SURF_P16_32X32_16X16  17

static unsigned cik_get_num_tile_pipes(struct amdgpu_gpu_info *info)
{
   unsigned mode2d = info->gb_tile_mode[CIK_TILE_MODE_COLOR_2D];

   switch (CIK__GB_TILE_MODE__PIPE_CONFIG(mode2d)) {
   case CIK__PIPE_CONFIG__ADDR_SURF_P2:
       return 2;
   case CIK__PIPE_CONFIG__ADDR_SURF_P4_8x16:
   case CIK__PIPE_CONFIG__ADDR_SURF_P4_16x16:
   case CIK__PIPE_CONFIG__ADDR_SURF_P4_16x32:
   case CIK__PIPE_CONFIG__ADDR_SURF_P4_32x32:
       return 4;
   case CIK__PIPE_CONFIG__ADDR_SURF_P8_16x16_8x16:
   case CIK__PIPE_CONFIG__ADDR_SURF_P8_16x32_8x16:
   case CIK__PIPE_CONFIG__ADDR_SURF_P8_32x32_8x16:
   case CIK__PIPE_CONFIG__ADDR_SURF_P8_16x32_16x16:
   case CIK__PIPE_CONFIG__ADDR_SURF_P8_32x32_16x16:
   case CIK__PIPE_CONFIG__ADDR_SURF_P8_32x32_16x32:
   case CIK__PIPE_CONFIG__ADDR_SURF_P8_32x64_32x32:
       return 8;
   case CIK__PIPE_CONFIG__ADDR_SURF_P16_32X32_8X16:
   case CIK__PIPE_CONFIG__ADDR_SURF_P16_32X32_16X16:
       return 16;
   default:
       fprintf(stderr, "Invalid GFX7 pipe configuration, assuming P2\n");
       assert(!"this should never occur");
       return 2;
   }
}

static bool has_syncobj(int fd)
{
	uint64_t value;
	if (drmGetCap(fd, DRM_CAP_SYNCOBJ, &value))
		return false;
	return value ? true : false;
}

static uint64_t fix_vram_size(uint64_t size)
{
	/* The VRAM size is underreported, so we need to fix it, because
	 * it's used to compute the number of memory modules for harvesting.
	 */
	return align64(size, 256*1024*1024);
}

static uint32_t
get_l2_cache_size(enum radeon_family family)
{
	switch (family) {
	case CHIP_KABINI:
	case CHIP_STONEY:
		return 128 * 1024;
	case CHIP_OLAND:
	case CHIP_HAINAN:
	case CHIP_ICELAND:
		return 256 * 1024;
	case CHIP_PITCAIRN:
	case CHIP_VERDE:
	case CHIP_BONAIRE:
	case CHIP_KAVERI:
	case CHIP_POLARIS12:
	case CHIP_CARRIZO:
		return 512 * 1024;
	case CHIP_TAHITI:
	case CHIP_TONGA:
		return 768 * 1024;
		break;
	case CHIP_HAWAII:
	case CHIP_POLARIS11:
		return 1024 * 1024;
	case CHIP_FIJI:
	case CHIP_POLARIS10:
		return 2048 * 1024;
		break;
	default:
		return 4096 * 1024;
	}
}

bool ac_query_gpu_info(int fd, void *dev_p,
		       struct radeon_info *info,
		       struct amdgpu_gpu_info *amdinfo)
{
	struct drm_amdgpu_info_device device_info = {};
	struct amdgpu_buffer_size_alignments alignment_info = {};
	struct drm_amdgpu_info_hw_ip dma = {}, compute = {}, uvd = {};
	struct drm_amdgpu_info_hw_ip uvd_enc = {}, vce = {}, vcn_dec = {}, vcn_jpeg = {};
	struct drm_amdgpu_info_hw_ip vcn_enc = {}, gfx = {};
	struct amdgpu_gds_resource_info gds = {};
	uint32_t vce_version = 0, vce_feature = 0, uvd_version = 0, uvd_feature = 0;
	int r, i, j;
	amdgpu_device_handle dev = dev_p;
	drmDevicePtr devinfo;

	/* Get PCI info. */
	r = drmGetDevice2(fd, 0, &devinfo);
	if (r) {
		fprintf(stderr, "amdgpu: drmGetDevice2 failed.\n");
		return false;
	}
	info->pci_domain = devinfo->businfo.pci->domain;
	info->pci_bus = devinfo->businfo.pci->bus;
	info->pci_dev = devinfo->businfo.pci->dev;
	info->pci_func = devinfo->businfo.pci->func;
	drmFreeDevice(&devinfo);

	assert(info->drm_major == 3);
	info->is_amdgpu = true;

	/* Query hardware and driver information. */
	r = amdgpu_query_gpu_info(dev, amdinfo);
	if (r) {
		fprintf(stderr, "amdgpu: amdgpu_query_gpu_info failed.\n");
		return false;
	}

	r = amdgpu_query_info(dev, AMDGPU_INFO_DEV_INFO, sizeof(device_info),
			      &device_info);
	if (r) {
		fprintf(stderr, "amdgpu: amdgpu_query_info(dev_info) failed.\n");
		return false;
	}

	r = amdgpu_query_buffer_size_alignment(dev, &alignment_info);
	if (r) {
		fprintf(stderr, "amdgpu: amdgpu_query_buffer_size_alignment failed.\n");
		return false;
	}

	r = amdgpu_query_hw_ip_info(dev, AMDGPU_HW_IP_DMA, 0, &dma);
	if (r) {
		fprintf(stderr, "amdgpu: amdgpu_query_hw_ip_info(dma) failed.\n");
		return false;
	}

	r = amdgpu_query_hw_ip_info(dev, AMDGPU_HW_IP_GFX, 0, &gfx);
	if (r) {
		fprintf(stderr, "amdgpu: amdgpu_query_hw_ip_info(gfx) failed.\n");
		return false;
	}

	r = amdgpu_query_hw_ip_info(dev, AMDGPU_HW_IP_COMPUTE, 0, &compute);
	if (r) {
		fprintf(stderr, "amdgpu: amdgpu_query_hw_ip_info(compute) failed.\n");
		return false;
	}

	r = amdgpu_query_hw_ip_info(dev, AMDGPU_HW_IP_UVD, 0, &uvd);
	if (r) {
		fprintf(stderr, "amdgpu: amdgpu_query_hw_ip_info(uvd) failed.\n");
		return false;
	}

	if (info->drm_minor >= 17) {
		r = amdgpu_query_hw_ip_info(dev, AMDGPU_HW_IP_UVD_ENC, 0, &uvd_enc);
		if (r) {
			fprintf(stderr, "amdgpu: amdgpu_query_hw_ip_info(uvd_enc) failed.\n");
			return false;
		}
	}

	if (info->drm_minor >= 17) {
		r = amdgpu_query_hw_ip_info(dev, AMDGPU_HW_IP_VCN_DEC, 0, &vcn_dec);
		if (r) {
			fprintf(stderr, "amdgpu: amdgpu_query_hw_ip_info(vcn_dec) failed.\n");
			return false;
		}
	}

	if (info->drm_minor >= 17) {
		r = amdgpu_query_hw_ip_info(dev, AMDGPU_HW_IP_VCN_ENC, 0, &vcn_enc);
		if (r) {
			fprintf(stderr, "amdgpu: amdgpu_query_hw_ip_info(vcn_enc) failed.\n");
			return false;
		}
	}

	if (info->drm_minor >= 27) {
		r = amdgpu_query_hw_ip_info(dev, AMDGPU_HW_IP_VCN_JPEG, 0, &vcn_jpeg);
		if (r) {
			fprintf(stderr, "amdgpu: amdgpu_query_hw_ip_info(vcn_jpeg) failed.\n");
			return false;
		}
	}

	r = amdgpu_query_firmware_version(dev, AMDGPU_INFO_FW_GFX_ME, 0, 0,
					&info->me_fw_version,
					&info->me_fw_feature);
	if (r) {
		fprintf(stderr, "amdgpu: amdgpu_query_firmware_version(me) failed.\n");
		return false;
	}

	r = amdgpu_query_firmware_version(dev, AMDGPU_INFO_FW_GFX_PFP, 0, 0,
					&info->pfp_fw_version,
					&info->pfp_fw_feature);
	if (r) {
		fprintf(stderr, "amdgpu: amdgpu_query_firmware_version(pfp) failed.\n");
		return false;
	}

	r = amdgpu_query_firmware_version(dev, AMDGPU_INFO_FW_GFX_CE, 0, 0,
					&info->ce_fw_version,
					&info->ce_fw_feature);
	if (r) {
		fprintf(stderr, "amdgpu: amdgpu_query_firmware_version(ce) failed.\n");
		return false;
	}

	r = amdgpu_query_firmware_version(dev, AMDGPU_INFO_FW_UVD, 0, 0,
					&uvd_version, &uvd_feature);
	if (r) {
		fprintf(stderr, "amdgpu: amdgpu_query_firmware_version(uvd) failed.\n");
		return false;
	}

	r = amdgpu_query_hw_ip_info(dev, AMDGPU_HW_IP_VCE, 0, &vce);
	if (r) {
		fprintf(stderr, "amdgpu: amdgpu_query_hw_ip_info(vce) failed.\n");
		return false;
	}

	r = amdgpu_query_firmware_version(dev, AMDGPU_INFO_FW_VCE, 0, 0,
					&vce_version, &vce_feature);
	if (r) {
		fprintf(stderr, "amdgpu: amdgpu_query_firmware_version(vce) failed.\n");
		return false;
	}

	r = amdgpu_query_sw_info(dev, amdgpu_sw_info_address32_hi, &info->address32_hi);
	if (r) {
		fprintf(stderr, "amdgpu: amdgpu_query_sw_info(address32_hi) failed.\n");
		return false;
	}

	r = amdgpu_query_gds_info(dev, &gds);
	if (r) {
		fprintf(stderr, "amdgpu: amdgpu_query_gds_info failed.\n");
		return false;
	}

	if (info->drm_minor >= 9) {
		struct drm_amdgpu_memory_info meminfo = {};

		r = amdgpu_query_info(dev, AMDGPU_INFO_MEMORY, sizeof(meminfo), &meminfo);
		if (r) {
			fprintf(stderr, "amdgpu: amdgpu_query_info(memory) failed.\n");
			return false;
		}

		/* Note: usable_heap_size values can be random and can't be relied on. */
		info->gart_size = meminfo.gtt.total_heap_size;
		info->vram_size = fix_vram_size(meminfo.vram.total_heap_size);
		info->vram_vis_size = meminfo.cpu_accessible_vram.total_heap_size;
	} else {
		/* This is a deprecated interface, which reports usable sizes
		 * (total minus pinned), but the pinned size computation is
		 * buggy, so the values returned from these functions can be
		 * random.
		 */
		struct amdgpu_heap_info vram, vram_vis, gtt;

		r = amdgpu_query_heap_info(dev, AMDGPU_GEM_DOMAIN_VRAM, 0, &vram);
		if (r) {
			fprintf(stderr, "amdgpu: amdgpu_query_heap_info(vram) failed.\n");
			return false;
		}

		r = amdgpu_query_heap_info(dev, AMDGPU_GEM_DOMAIN_VRAM,
					AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED,
					&vram_vis);
		if (r) {
			fprintf(stderr, "amdgpu: amdgpu_query_heap_info(vram_vis) failed.\n");
			return false;
		}

		r = amdgpu_query_heap_info(dev, AMDGPU_GEM_DOMAIN_GTT, 0, &gtt);
		if (r) {
			fprintf(stderr, "amdgpu: amdgpu_query_heap_info(gtt) failed.\n");
			return false;
		}

		info->gart_size = gtt.heap_size;
		info->vram_size = fix_vram_size(vram.heap_size);
		info->vram_vis_size = vram_vis.heap_size;
	}

	/* Set chip identification. */
	info->pci_id = amdinfo->asic_id; /* TODO: is this correct? */
	info->pci_rev_id = amdinfo->pci_rev_id;
	info->vce_harvest_config = amdinfo->vce_harvest_config;

#define identify_chip2(asic, chipname) \
	if (ASICREV_IS(amdinfo->chip_external_rev, asic)) { \
		info->family = CHIP_##chipname; \
		info->name = #chipname; \
	}
#define identify_chip(chipname) identify_chip2(chipname, chipname)

	switch (amdinfo->family_id) {
	case FAMILY_SI:
		identify_chip(TAHITI);
		identify_chip(PITCAIRN);
		identify_chip2(CAPEVERDE, VERDE);
		identify_chip(OLAND);
		identify_chip(HAINAN);
		break;
	case FAMILY_CI:
		identify_chip(BONAIRE);
		identify_chip(HAWAII);
		break;
	case FAMILY_KV:
		identify_chip2(SPECTRE, KAVERI);
		identify_chip2(SPOOKY, KAVERI);
		identify_chip2(KALINDI, KABINI);
		identify_chip2(GODAVARI, KABINI);
		break;
	case FAMILY_VI:
		identify_chip(ICELAND);
		identify_chip(TONGA);
		identify_chip(FIJI);
		identify_chip(POLARIS10);
		identify_chip(POLARIS11);
		identify_chip(POLARIS12);
		identify_chip(VEGAM);
		break;
	case FAMILY_CZ:
		identify_chip(CARRIZO);
		identify_chip(STONEY);
		break;
	case FAMILY_AI:
		identify_chip(VEGA10);
		identify_chip(VEGA12);
		identify_chip(VEGA20);
		identify_chip(ARCTURUS);
		break;
	case FAMILY_RV:
		identify_chip(RAVEN);
		identify_chip(RAVEN2);
		identify_chip(RENOIR);
		break;
	case FAMILY_NV:
		identify_chip(NAVI10);
		identify_chip(NAVI12);
		identify_chip(NAVI14);
		identify_chip(SIENNA);
		break;
	}

	if (!info->name) {
		fprintf(stderr, "amdgpu: unknown (family_id, chip_external_rev): (%u, %u)\n",
			amdinfo->family_id, amdinfo->chip_external_rev);
		return false;
	}

	if (info->family >= CHIP_SIENNA)
		info->chip_class = GFX10_3;
	else if (info->family >= CHIP_NAVI10)
		info->chip_class = GFX10;
	else if (info->family >= CHIP_VEGA10)
		info->chip_class = GFX9;
	else if (info->family >= CHIP_TONGA)
		info->chip_class = GFX8;
	else if (info->family >= CHIP_BONAIRE)
		info->chip_class = GFX7;
	else if (info->family >= CHIP_TAHITI)
		info->chip_class = GFX6;
	else {
		fprintf(stderr, "amdgpu: Unknown family.\n");
		return false;
	}

	info->family_id = amdinfo->family_id;
	info->chip_external_rev = amdinfo->chip_external_rev;
	info->marketing_name = amdgpu_get_marketing_name(dev);
	info->is_pro_graphics = info->marketing_name &&
				(!strcmp(info->marketing_name, "Pro") ||
				 !strcmp(info->marketing_name, "PRO") ||
				 !strcmp(info->marketing_name, "Frontier"));

	/* Set which chips have dedicated VRAM. */
	info->has_dedicated_vram =
		!(amdinfo->ids_flags & AMDGPU_IDS_FLAGS_FUSION);

	/* The kernel can split large buffers in VRAM but not in GTT, so large
	 * allocations can fail or cause buffer movement failures in the kernel.
	 */
	if (info->has_dedicated_vram)
		info->max_alloc_size = info->vram_size * 0.8;
	else
		info->max_alloc_size = info->gart_size * 0.7;

	info->vram_type = amdinfo->vram_type;
	info->vram_bit_width = amdinfo->vram_bit_width;
	info->ce_ram_size = amdinfo->ce_ram_size;

	info->l2_cache_size = get_l2_cache_size(info->family);
	info->l1_cache_size = 16384;

	/* Set which chips have uncached device memory. */
	info->has_l2_uncached = info->chip_class >= GFX9;

	/* Set hardware information. */
	info->gds_size = gds.gds_total_size;
	info->gds_gfx_partition_size = gds.gds_gfx_partition_size;
	/* convert the shader/memory clocks from KHz to MHz */
	info->max_shader_clock = amdinfo->max_engine_clk / 1000;
	info->max_memory_clock = amdinfo->max_memory_clk / 1000;
	info->num_tcc_blocks = device_info.num_tcc_blocks;
	info->max_se = amdinfo->num_shader_engines;
	info->max_sh_per_se = amdinfo->num_shader_arrays_per_engine;
	info->has_hw_decode =
		(uvd.available_rings != 0) || (vcn_dec.available_rings != 0) ||
		(vcn_jpeg.available_rings != 0);
	info->uvd_fw_version =
		uvd.available_rings ? uvd_version : 0;
	info->vce_fw_version =
		vce.available_rings ? vce_version : 0;
	info->uvd_enc_supported =
		uvd_enc.available_rings ? true : false;
	info->has_userptr = true;
	info->has_syncobj = has_syncobj(fd);
	info->has_syncobj_wait_for_submit = info->has_syncobj && info->drm_minor >= 20;
	info->has_fence_to_handle = info->has_syncobj && info->drm_minor >= 21;
	info->has_ctx_priority = info->drm_minor >= 22;
	info->has_local_buffers = info->drm_minor >= 20;
	info->kernel_flushes_hdp_before_ib = true;
	info->htile_cmask_support_1d_tiling = true;
	info->si_TA_CS_BC_BASE_ADDR_allowed = true;
	info->has_bo_metadata = true;
	info->has_gpu_reset_status_query = true;
	info->has_eqaa_surface_allocator = true;
	info->has_format_bc1_through_bc7 = true;
	/* DRM 3.1.0 doesn't flush TC for GFX8 correctly. */
	info->kernel_flushes_tc_l2_after_ib = info->chip_class != GFX8 ||
					      info->drm_minor >= 2;
	info->has_indirect_compute_dispatch = true;
	/* GFX6 doesn't support unaligned loads. */
	info->has_unaligned_shader_loads = info->chip_class != GFX6;
	/* Disable sparse mappings on GFX6 due to VM faults in CP DMA. Enable them once
	 * these faults are mitigated in software.
	 */
	info->has_sparse_vm_mappings = info->chip_class >= GFX7 && info->drm_minor >= 13;
	info->has_2d_tiling = true;
	info->has_read_registers_query = true;
	info->has_scheduled_fence_dependency = info->drm_minor >= 28;
	info->mid_command_buffer_preemption_enabled =
		amdinfo->ids_flags & AMDGPU_IDS_FLAGS_PREEMPTION;

	info->pa_sc_tile_steering_override = device_info.pa_sc_tile_steering_override;
	info->num_render_backends = amdinfo->rb_pipes;
	/* The value returned by the kernel driver was wrong. */
	if (info->family == CHIP_KAVERI)
		info->num_render_backends = 2;

	info->clock_crystal_freq = amdinfo->gpu_counter_freq;
	if (!info->clock_crystal_freq) {
		fprintf(stderr, "amdgpu: clock crystal frequency is 0, timestamps will be wrong\n");
		info->clock_crystal_freq = 1;
	}
	if (info->chip_class >= GFX10) {
		info->tcc_cache_line_size = 128;

		if (info->drm_minor >= 35) {
			info->tcc_harvested = device_info.tcc_disabled_mask != 0;
		} else {
			/* This is a hack, but it's all we can do without a kernel upgrade. */
			info->tcc_harvested =
				(info->vram_size / info->num_tcc_blocks) != 512*1024*1024;
		}
	} else {
		info->tcc_cache_line_size = 64;
	}
	info->gb_addr_config = amdinfo->gb_addr_cfg;
	if (info->chip_class == GFX9) {
		info->num_tile_pipes = 1 << G_0098F8_NUM_PIPES(amdinfo->gb_addr_cfg);
		info->pipe_interleave_bytes =
			256 << G_0098F8_PIPE_INTERLEAVE_SIZE_GFX9(amdinfo->gb_addr_cfg);
	} else {
		info->num_tile_pipes = cik_get_num_tile_pipes(amdinfo);
		info->pipe_interleave_bytes =
			256 << G_0098F8_PIPE_INTERLEAVE_SIZE_GFX6(amdinfo->gb_addr_cfg);
	}
	info->r600_has_virtual_memory = true;

	/* LDS is 64KB per CU (4 SIMDs), which is 16KB per SIMD (usage above
	 * 16KB makes some SIMDs unoccupied).
	 *
	 * LDS is 128KB in WGP mode and 64KB in CU mode. Assume the WGP mode is used.
	 */
	info->lds_size_per_workgroup = info->chip_class >= GFX10 ? 128 * 1024 : 64 * 1024;
	info->lds_granularity = info->chip_class >= GFX7 ? 128 * 4 : 64 * 4;

	assert(util_is_power_of_two_or_zero(dma.available_rings + 1));
	assert(util_is_power_of_two_or_zero(compute.available_rings + 1));

	info->has_graphics = gfx.available_rings > 0;
	info->num_rings[RING_GFX] = util_bitcount(gfx.available_rings);
	info->num_rings[RING_COMPUTE] = util_bitcount(compute.available_rings);
	info->num_rings[RING_DMA] = util_bitcount(dma.available_rings);
	info->num_rings[RING_UVD] = util_bitcount(uvd.available_rings);
	info->num_rings[RING_VCE] = util_bitcount(vce.available_rings);
	info->num_rings[RING_UVD_ENC] = util_bitcount(uvd_enc.available_rings);
	info->num_rings[RING_VCN_DEC] = util_bitcount(vcn_dec.available_rings);
	info->num_rings[RING_VCN_ENC] = util_bitcount(vcn_enc.available_rings);
	info->num_rings[RING_VCN_JPEG] = util_bitcount(vcn_jpeg.available_rings);

	/* This is "align_mask" copied from the kernel, maximums of all IP versions. */
	info->ib_pad_dw_mask[RING_GFX] = 0xff;
	info->ib_pad_dw_mask[RING_COMPUTE] = 0xff;
	info->ib_pad_dw_mask[RING_DMA] = 0xf;
	info->ib_pad_dw_mask[RING_UVD] = 0xf;
	info->ib_pad_dw_mask[RING_VCE] = 0x3f;
	info->ib_pad_dw_mask[RING_UVD_ENC] = 0x3f;
	info->ib_pad_dw_mask[RING_VCN_DEC] = 0xf;
	info->ib_pad_dw_mask[RING_VCN_ENC] = 0x3f;
	info->ib_pad_dw_mask[RING_VCN_JPEG] = 0xf;

	/* The mere presence of CLEAR_STATE in the IB causes random GPU hangs
	 * on GFX6. Some CLEAR_STATE cause asic hang on radeon kernel, etc.
	 * SPI_VS_OUT_CONFIG. So only enable GFX7 CLEAR_STATE on amdgpu kernel.
	 */
	info->has_clear_state = info->chip_class >= GFX7;

	info->has_distributed_tess = info->chip_class >= GFX10 ||
				     (info->chip_class >= GFX8 && info->max_se >= 2);

	info->has_dcc_constant_encode = info->family == CHIP_RAVEN2 ||
					info->family == CHIP_RENOIR ||
					info->chip_class >= GFX10;

	info->has_rbplus = info->family == CHIP_STONEY ||
			   info->chip_class >= GFX9;

	/* Some chips have RB+ registers, but don't support RB+. Those must
	 * always disable it.
	 */
	info->rbplus_allowed = info->has_rbplus &&
			       (info->family == CHIP_STONEY ||
			        info->family == CHIP_VEGA12 ||
			        info->family == CHIP_RAVEN ||
			        info->family == CHIP_RAVEN2 ||
			        info->family == CHIP_RENOIR ||
				info->chip_class >= GFX10_3);

	info->has_out_of_order_rast = info->chip_class >= GFX8 &&
				      info->chip_class <= GFX9 &&
				      info->max_se >= 2;

	/* Whether chips support double rate packed math instructions. */
	info->has_packed_math_16bit = info->chip_class >= GFX9;

	/* TODO: Figure out how to use LOAD_CONTEXT_REG on GFX6-GFX7. */
	info->has_load_ctx_reg_pkt = info->chip_class >= GFX9 ||
				     (info->chip_class >= GFX8 &&
				      info->me_fw_feature >= 41);

	info->cpdma_prefetch_writes_memory = info->chip_class <= GFX8;

	info->has_gfx9_scissor_bug = info->family == CHIP_VEGA10 ||
				     info->family == CHIP_RAVEN;

	info->has_tc_compat_zrange_bug = info->chip_class >= GFX8 &&
					 info->chip_class <= GFX9;

	info->has_msaa_sample_loc_bug = (info->family >= CHIP_POLARIS10 &&
					 info->family <= CHIP_POLARIS12) ||
					info->family == CHIP_VEGA10 ||
					info->family == CHIP_RAVEN;

	info->has_ls_vgpr_init_bug = info->family == CHIP_VEGA10 ||
				     info->family == CHIP_RAVEN;

	/* Get the number of good compute units. */
	info->num_good_compute_units = 0;
	for (i = 0; i < info->max_se; i++) {
		for (j = 0; j < info->max_sh_per_se; j++) {
			/*
			 * The cu bitmap in amd gpu info structure is
			 * 4x4 size array, and it's usually suitable for Vega
			 * ASICs which has 4*2 SE/SH layout.
			 * But for Arcturus, SE/SH layout is changed to 8*1.
			 * To mostly reduce the impact, we make it compatible
			 * with current bitmap array as below:
			 *    SE4,SH0 --> cu_bitmap[0][1]
			 *    SE5,SH0 --> cu_bitmap[1][1]
			 *    SE6,SH0 --> cu_bitmap[2][1]
			 *    SE7,SH0 --> cu_bitmap[3][1]
			 */
			info->cu_mask[i%4][j+i/4] = amdinfo->cu_bitmap[i%4][j+i/4];
			info->num_good_compute_units +=
				util_bitcount(info->cu_mask[i][j]);
		}
	}

	/* On GFX10, only whole WGPs (in units of 2 CUs) can be disabled,
	 * and max - min <= 2.
	 */
	unsigned cu_group = info->chip_class >= GFX10 ? 2 : 1;
	info->max_good_cu_per_sa = DIV_ROUND_UP(info->num_good_compute_units,
						(info->max_se * info->max_sh_per_se * cu_group)) * cu_group;
	info->min_good_cu_per_sa = (info->num_good_compute_units /
				    (info->max_se * info->max_sh_per_se * cu_group)) * cu_group;

	memcpy(info->si_tile_mode_array, amdinfo->gb_tile_mode,
		sizeof(amdinfo->gb_tile_mode));
	info->enabled_rb_mask = amdinfo->enabled_rb_pipes_mask;

	memcpy(info->cik_macrotile_mode_array, amdinfo->gb_macro_tile_mode,
		sizeof(amdinfo->gb_macro_tile_mode));

	info->pte_fragment_size = alignment_info.size_local;
	info->gart_page_size = alignment_info.size_remote;

	if (info->chip_class == GFX6)
		info->gfx_ib_pad_with_type2 = true;

	unsigned ib_align = 0;
	ib_align = MAX2(ib_align, gfx.ib_start_alignment);
	ib_align = MAX2(ib_align, gfx.ib_size_alignment);
	ib_align = MAX2(ib_align, compute.ib_start_alignment);
	ib_align = MAX2(ib_align, compute.ib_size_alignment);
	ib_align = MAX2(ib_align, dma.ib_start_alignment);
	ib_align = MAX2(ib_align, dma.ib_size_alignment);
	ib_align = MAX2(ib_align, uvd.ib_start_alignment);
	ib_align = MAX2(ib_align, uvd.ib_size_alignment);
	ib_align = MAX2(ib_align, uvd_enc.ib_start_alignment);
	ib_align = MAX2(ib_align, uvd_enc.ib_size_alignment);
	ib_align = MAX2(ib_align, vce.ib_start_alignment);
	ib_align = MAX2(ib_align, vce.ib_size_alignment);
	ib_align = MAX2(ib_align, vcn_dec.ib_start_alignment);
	ib_align = MAX2(ib_align, vcn_dec.ib_size_alignment);
	ib_align = MAX2(ib_align, vcn_enc.ib_start_alignment);
	ib_align = MAX2(ib_align, vcn_enc.ib_size_alignment);
	ib_align = MAX2(ib_align, vcn_jpeg.ib_start_alignment);
	ib_align = MAX2(ib_align, vcn_jpeg.ib_size_alignment);
	/* GFX10 and maybe GFX9 need this alignment for cache coherency. */
	if (info->chip_class >= GFX9)
		ib_align = MAX2(ib_align, info->tcc_cache_line_size);
	/* The kernel pads gfx and compute IBs to 256 dwords since:
	 *   66f3b2d527154bd258a57c8815004b5964aa1cf5
	 * Do the same.
	 */
	ib_align = MAX2(ib_align, 1024);
	info->ib_alignment = ib_align;

        if ((info->drm_minor >= 31 &&
             (info->family == CHIP_RAVEN ||
              info->family == CHIP_RAVEN2 ||
              info->family == CHIP_RENOIR)) ||
            (info->drm_minor >= 34 &&
             (info->family == CHIP_NAVI12 ||
              info->family == CHIP_NAVI14))) {
		if (info->num_render_backends == 1)
			info->use_display_dcc_unaligned = true;
		else
			info->use_display_dcc_with_retile_blit = true;
	}

	info->has_gds_ordered_append = info->chip_class >= GFX7 &&
				       info->drm_minor >= 29;

	if (info->chip_class >= GFX9) {
		unsigned pc_lines = 0;

		switch (info->family) {
		case CHIP_VEGA10:
		case CHIP_VEGA12:
		case CHIP_VEGA20:
			pc_lines = 2048;
			break;
		case CHIP_RAVEN:
		case CHIP_RAVEN2:
		case CHIP_RENOIR:
		case CHIP_NAVI10:
		case CHIP_NAVI12:
		case CHIP_SIENNA:
			pc_lines = 1024;
			break;
		case CHIP_NAVI14:
			pc_lines = 512;
			break;
		case CHIP_ARCTURUS:
			break;
		default:
			assert(0);
		}

		info->pc_lines = pc_lines;

		if (info->chip_class >= GFX10) {
			info->pbb_max_alloc_count = pc_lines / 3;
		} else {
			info->pbb_max_alloc_count =
				MIN2(128, pc_lines / (4 * info->max_se));
		}
	}

	/* The number of SDPs is the same as the number of TCCs for now. */
	if (info->chip_class >= GFX10)
		info->num_sdp_interfaces = device_info.num_tcc_blocks;

	if (info->chip_class >= GFX10_3)
		info->max_wave64_per_simd = 16;
	else if (info->chip_class == GFX10)
		info->max_wave64_per_simd = 20;
	else if (info->family >= CHIP_POLARIS10 && info->family <= CHIP_VEGAM)
		info->max_wave64_per_simd = 8;
	else
		info->max_wave64_per_simd = 10;

	if (info->chip_class >= GFX10) {
		info->num_physical_sgprs_per_simd = 128 * info->max_wave64_per_simd;
		info->min_sgpr_alloc = 128;
		info->sgpr_alloc_granularity = 128;
		/* Don't use late alloc on small chips. */
		info->use_late_alloc = info->num_render_backends > 4;
	} else if (info->chip_class >= GFX8) {
		info->num_physical_sgprs_per_simd = 800;
		info->min_sgpr_alloc = 16;
		info->sgpr_alloc_granularity = 16;
		info->use_late_alloc = true;
	} else {
		info->num_physical_sgprs_per_simd = 512;
		info->min_sgpr_alloc = 8;
		info->sgpr_alloc_granularity = 8;
		/* Potential hang on Kabini: */
		info->use_late_alloc = info->family != CHIP_KABINI;
	}

	info->max_sgpr_alloc = info->family == CHIP_TONGA ||
			       info->family == CHIP_ICELAND ? 96 : 104;

	info->min_wave64_vgpr_alloc = 4;
	info->max_vgpr_alloc = 256;
	info->wave64_vgpr_alloc_granularity = 4;

	info->num_physical_wave64_vgprs_per_simd = info->chip_class >= GFX10 ? 512 : 256;
	info->num_simd_per_compute_unit = info->chip_class >= GFX10 ? 2 : 4;

	return true;
}

void ac_compute_driver_uuid(char *uuid, size_t size)
{
	char amd_uuid[] = "AMD-MESA-DRV";

	assert(size >= sizeof(amd_uuid));

	memset(uuid, 0, size);
	strncpy(uuid, amd_uuid, size);
}

void ac_compute_device_uuid(struct radeon_info *info, char *uuid, size_t size)
{
	uint32_t *uint_uuid = (uint32_t*)uuid;

	assert(size >= sizeof(uint32_t)*4);

	/**
	 * Use the device info directly instead of using a sha1. GL/VK UUIDs
	 * are 16 byte vs 20 byte for sha1, and the truncation that would be
	 * required would get rid of part of the little entropy we have.
	 * */
	memset(uuid, 0, size);
	uint_uuid[0] = info->pci_domain;
	uint_uuid[1] = info->pci_bus;
	uint_uuid[2] = info->pci_dev;
	uint_uuid[3] = info->pci_func;
}

void ac_print_gpu_info(struct radeon_info *info)
{
	printf("Device info:\n");
	printf("    pci (domain:bus:dev.func): %04x:%02x:%02x.%x\n",
	       info->pci_domain, info->pci_bus,
	       info->pci_dev, info->pci_func);

	printf("    name = %s\n", info->name);
	printf("    marketing_name = %s\n", info->marketing_name);
	printf("    is_pro_graphics = %u\n", info->is_pro_graphics);
	printf("    pci_id = 0x%x\n", info->pci_id);
	printf("    pci_rev_id = 0x%x\n", info->pci_rev_id);
	printf("    family = %i\n", info->family);
	printf("    chip_class = %i\n", info->chip_class);
	printf("    family_id = %i\n", info->family_id);
	printf("    chip_external_rev = %i\n", info->chip_external_rev);
	printf("    clock_crystal_freq = %i\n", info->clock_crystal_freq);

	printf("Features:\n");
	printf("    has_graphics = %i\n", info->has_graphics);
	printf("    num_rings[RING_GFX] = %i\n", info->num_rings[RING_GFX]);
	printf("    num_rings[RING_DMA] = %i\n", info->num_rings[RING_DMA]);
	printf("    num_rings[RING_COMPUTE] = %u\n", info->num_rings[RING_COMPUTE]);
	printf("    num_rings[RING_UVD] = %i\n", info->num_rings[RING_UVD]);
	printf("    num_rings[RING_VCE] = %i\n", info->num_rings[RING_VCE]);
	printf("    num_rings[RING_UVD_ENC] = %i\n", info->num_rings[RING_UVD_ENC]);
	printf("    num_rings[RING_VCN_DEC] = %i\n", info->num_rings[RING_VCN_DEC]);
	printf("    num_rings[RING_VCN_ENC] = %i\n", info->num_rings[RING_VCN_ENC]);
	printf("    num_rings[RING_VCN_JPEG] = %i\n", info->num_rings[RING_VCN_JPEG]);
	printf("    has_clear_state = %u\n", info->has_clear_state);
	printf("    has_distributed_tess = %u\n", info->has_distributed_tess);
	printf("    has_dcc_constant_encode = %u\n", info->has_dcc_constant_encode);
	printf("    has_rbplus = %u\n", info->has_rbplus);
	printf("    rbplus_allowed = %u\n", info->rbplus_allowed);
	printf("    has_load_ctx_reg_pkt = %u\n", info->has_load_ctx_reg_pkt);
	printf("    has_out_of_order_rast = %u\n", info->has_out_of_order_rast);
	printf("    cpdma_prefetch_writes_memory = %u\n", info->cpdma_prefetch_writes_memory);
	printf("    has_gfx9_scissor_bug = %i\n", info->has_gfx9_scissor_bug);
	printf("    has_tc_compat_zrange_bug = %i\n", info->has_tc_compat_zrange_bug);
	printf("    has_msaa_sample_loc_bug = %i\n", info->has_msaa_sample_loc_bug);
	printf("    has_ls_vgpr_init_bug = %i\n", info->has_ls_vgpr_init_bug);

	printf("Display features:\n");
	printf("    use_display_dcc_unaligned = %u\n", info->use_display_dcc_unaligned);
	printf("    use_display_dcc_with_retile_blit = %u\n", info->use_display_dcc_with_retile_blit);

	printf("Memory info:\n");
	printf("    pte_fragment_size = %u\n", info->pte_fragment_size);
	printf("    gart_page_size = %u\n", info->gart_page_size);
	printf("    gart_size = %i MB\n", (int)DIV_ROUND_UP(info->gart_size, 1024*1024));
	printf("    vram_size = %i MB\n", (int)DIV_ROUND_UP(info->vram_size, 1024*1024));
	printf("    vram_vis_size = %i MB\n", (int)DIV_ROUND_UP(info->vram_vis_size, 1024*1024));
	printf("    vram_type = %i\n", info->vram_type);
	printf("    vram_bit_width = %i\n", info->vram_bit_width);
	printf("    gds_size = %u kB\n", info->gds_size / 1024);
	printf("    gds_gfx_partition_size = %u kB\n", info->gds_gfx_partition_size / 1024);
	printf("    max_alloc_size = %i MB\n",
	       (int)DIV_ROUND_UP(info->max_alloc_size, 1024*1024));
	printf("    min_alloc_size = %u\n", info->min_alloc_size);
	printf("    address32_hi = %u\n", info->address32_hi);
	printf("    has_dedicated_vram = %u\n", info->has_dedicated_vram);
	printf("    num_sdp_interfaces = %u\n", info->num_sdp_interfaces);
	printf("    num_tcc_blocks = %i\n", info->num_tcc_blocks);
	printf("    tcc_cache_line_size = %u\n", info->tcc_cache_line_size);
	printf("    tcc_harvested = %u\n", info->tcc_harvested);
	printf("    pc_lines = %u\n", info->pc_lines);
	printf("    lds_size_per_workgroup = %u\n", info->lds_size_per_workgroup);
	printf("    lds_granularity = %i\n", info->lds_granularity);
	printf("    max_memory_clock = %i\n", info->max_memory_clock);
	printf("    ce_ram_size = %i\n", info->ce_ram_size);
	printf("    l1_cache_size = %i\n", info->l1_cache_size);
	printf("    l2_cache_size = %i\n", info->l2_cache_size);

	printf("CP info:\n");
	printf("    gfx_ib_pad_with_type2 = %i\n", info->gfx_ib_pad_with_type2);
	printf("    ib_alignment = %u\n", info->ib_alignment);
	printf("    me_fw_version = %i\n", info->me_fw_version);
	printf("    me_fw_feature = %i\n", info->me_fw_feature);
	printf("    pfp_fw_version = %i\n", info->pfp_fw_version);
	printf("    pfp_fw_feature = %i\n", info->pfp_fw_feature);
	printf("    ce_fw_version = %i\n", info->ce_fw_version);
	printf("    ce_fw_feature = %i\n", info->ce_fw_feature);

	printf("Multimedia info:\n");
	printf("    has_hw_decode = %u\n", info->has_hw_decode);
	printf("    uvd_enc_supported = %u\n", info->uvd_enc_supported);
	printf("    uvd_fw_version = %u\n", info->uvd_fw_version);
	printf("    vce_fw_version = %u\n", info->vce_fw_version);
	printf("    vce_harvest_config = %i\n", info->vce_harvest_config);

	printf("Kernel & winsys capabilities:\n");
	printf("    drm = %i.%i.%i\n", info->drm_major,
	       info->drm_minor, info->drm_patchlevel);
	printf("    has_userptr = %i\n", info->has_userptr);
	printf("    has_syncobj = %u\n", info->has_syncobj);
	printf("    has_syncobj_wait_for_submit = %u\n", info->has_syncobj_wait_for_submit);
	printf("    has_fence_to_handle = %u\n", info->has_fence_to_handle);
	printf("    has_ctx_priority = %u\n", info->has_ctx_priority);
	printf("    has_local_buffers = %u\n", info->has_local_buffers);
	printf("    kernel_flushes_hdp_before_ib = %u\n", info->kernel_flushes_hdp_before_ib);
	printf("    htile_cmask_support_1d_tiling = %u\n", info->htile_cmask_support_1d_tiling);
	printf("    si_TA_CS_BC_BASE_ADDR_allowed = %u\n", info->si_TA_CS_BC_BASE_ADDR_allowed);
	printf("    has_bo_metadata = %u\n", info->has_bo_metadata);
	printf("    has_gpu_reset_status_query = %u\n", info->has_gpu_reset_status_query);
	printf("    has_eqaa_surface_allocator = %u\n", info->has_eqaa_surface_allocator);
	printf("    has_format_bc1_through_bc7 = %u\n", info->has_format_bc1_through_bc7);
	printf("    kernel_flushes_tc_l2_after_ib = %u\n", info->kernel_flushes_tc_l2_after_ib);
	printf("    has_indirect_compute_dispatch = %u\n", info->has_indirect_compute_dispatch);
	printf("    has_unaligned_shader_loads = %u\n", info->has_unaligned_shader_loads);
	printf("    has_sparse_vm_mappings = %u\n", info->has_sparse_vm_mappings);
	printf("    has_2d_tiling = %u\n", info->has_2d_tiling);
	printf("    has_read_registers_query = %u\n", info->has_read_registers_query);
	printf("    has_gds_ordered_append = %u\n", info->has_gds_ordered_append);
	printf("    has_scheduled_fence_dependency = %u\n", info->has_scheduled_fence_dependency);
	printf("    mid_command_buffer_preemption_enabled = %u\n", info->mid_command_buffer_preemption_enabled);

	printf("Shader core info:\n");
	printf("    max_shader_clock = %i\n", info->max_shader_clock);
	printf("    num_good_compute_units = %i\n", info->num_good_compute_units);
	printf("    max_good_cu_per_sa = %i\n", info->max_good_cu_per_sa);
	printf("    min_good_cu_per_sa = %i\n", info->min_good_cu_per_sa);
	printf("    max_se = %i\n", info->max_se);
	printf("    max_sh_per_se = %i\n", info->max_sh_per_se);
	printf("    max_wave64_per_simd = %i\n", info->max_wave64_per_simd);
	printf("    num_physical_sgprs_per_simd = %i\n", info->num_physical_sgprs_per_simd);
	printf("    num_physical_wave64_vgprs_per_simd = %i\n", info->num_physical_wave64_vgprs_per_simd);
	printf("    num_simd_per_compute_unit = %i\n", info->num_simd_per_compute_unit);
	printf("    min_sgpr_alloc = %i\n", info->min_sgpr_alloc);
	printf("    max_sgpr_alloc = %i\n", info->max_sgpr_alloc);
	printf("    sgpr_alloc_granularity = %i\n", info->sgpr_alloc_granularity);
	printf("    min_wave64_vgpr_alloc = %i\n", info->min_wave64_vgpr_alloc);
	printf("    max_vgpr_alloc = %i\n", info->max_vgpr_alloc);
	printf("    wave64_vgpr_alloc_granularity = %i\n", info->wave64_vgpr_alloc_granularity);

	printf("Render backend info:\n");
	printf("    pa_sc_tile_steering_override = 0x%x\n", info->pa_sc_tile_steering_override);
	printf("    num_render_backends = %i\n", info->num_render_backends);
	printf("    num_tile_pipes = %i\n", info->num_tile_pipes);
	printf("    pipe_interleave_bytes = %i\n", info->pipe_interleave_bytes);
	printf("    enabled_rb_mask = 0x%x\n", info->enabled_rb_mask);
	printf("    max_alignment = %u\n", (unsigned)info->max_alignment);
	printf("    pbb_max_alloc_count = %u\n", info->pbb_max_alloc_count);

	printf("GB_ADDR_CONFIG: 0x%08x\n", info->gb_addr_config);
	if (info->chip_class >= GFX10) {
		printf("    num_pipes = %u\n",
		       1 << G_0098F8_NUM_PIPES(info->gb_addr_config));
		printf("    pipe_interleave_size = %u\n",
		       256 << G_0098F8_PIPE_INTERLEAVE_SIZE_GFX9(info->gb_addr_config));
		printf("    max_compressed_frags = %u\n",
		       1 << G_0098F8_MAX_COMPRESSED_FRAGS(info->gb_addr_config));
	} else if (info->chip_class == GFX9) {
		printf("    num_pipes = %u\n",
		       1 << G_0098F8_NUM_PIPES(info->gb_addr_config));
		printf("    pipe_interleave_size = %u\n",
		       256 << G_0098F8_PIPE_INTERLEAVE_SIZE_GFX9(info->gb_addr_config));
		printf("    max_compressed_frags = %u\n",
		       1 << G_0098F8_MAX_COMPRESSED_FRAGS(info->gb_addr_config));
		printf("    bank_interleave_size = %u\n",
		       1 << G_0098F8_BANK_INTERLEAVE_SIZE(info->gb_addr_config));
		printf("    num_banks = %u\n",
		       1 << G_0098F8_NUM_BANKS(info->gb_addr_config));
		printf("    shader_engine_tile_size = %u\n",
		       16 << G_0098F8_SHADER_ENGINE_TILE_SIZE(info->gb_addr_config));
		printf("    num_shader_engines = %u\n",
		       1 << G_0098F8_NUM_SHADER_ENGINES_GFX9(info->gb_addr_config));
		printf("    num_gpus = %u (raw)\n",
		       G_0098F8_NUM_GPUS_GFX9(info->gb_addr_config));
		printf("    multi_gpu_tile_size = %u (raw)\n",
		       G_0098F8_MULTI_GPU_TILE_SIZE(info->gb_addr_config));
		printf("    num_rb_per_se = %u\n",
		       1 << G_0098F8_NUM_RB_PER_SE(info->gb_addr_config));
		printf("    row_size = %u\n",
		       1024 << G_0098F8_ROW_SIZE(info->gb_addr_config));
		printf("    num_lower_pipes = %u (raw)\n",
		       G_0098F8_NUM_LOWER_PIPES(info->gb_addr_config));
		printf("    se_enable = %u (raw)\n",
		       G_0098F8_SE_ENABLE(info->gb_addr_config));
	} else {
		printf("    num_pipes = %u\n",
		       1 << G_0098F8_NUM_PIPES(info->gb_addr_config));
		printf("    pipe_interleave_size = %u\n",
		       256 << G_0098F8_PIPE_INTERLEAVE_SIZE_GFX6(info->gb_addr_config));
		printf("    bank_interleave_size = %u\n",
		       1 << G_0098F8_BANK_INTERLEAVE_SIZE(info->gb_addr_config));
		printf("    num_shader_engines = %u\n",
		       1 << G_0098F8_NUM_SHADER_ENGINES_GFX6(info->gb_addr_config));
		printf("    shader_engine_tile_size = %u\n",
		       16 << G_0098F8_SHADER_ENGINE_TILE_SIZE(info->gb_addr_config));
		printf("    num_gpus = %u (raw)\n",
		       G_0098F8_NUM_GPUS_GFX6(info->gb_addr_config));
		printf("    multi_gpu_tile_size = %u (raw)\n",
		       G_0098F8_MULTI_GPU_TILE_SIZE(info->gb_addr_config));
		printf("    row_size = %u\n",
		       1024 << G_0098F8_ROW_SIZE(info->gb_addr_config));
		printf("    num_lower_pipes = %u (raw)\n",
		       G_0098F8_NUM_LOWER_PIPES(info->gb_addr_config));
	}
}

int
ac_get_gs_table_depth(enum chip_class chip_class, enum radeon_family family)
{
	if (chip_class >= GFX9)
		return -1;

	switch (family) {
	case CHIP_OLAND:
	case CHIP_HAINAN:
	case CHIP_KAVERI:
	case CHIP_KABINI:
	case CHIP_ICELAND:
	case CHIP_CARRIZO:
	case CHIP_STONEY:
		return 16;
	case CHIP_TAHITI:
	case CHIP_PITCAIRN:
	case CHIP_VERDE:
	case CHIP_BONAIRE:
	case CHIP_HAWAII:
	case CHIP_TONGA:
	case CHIP_FIJI:
	case CHIP_POLARIS10:
	case CHIP_POLARIS11:
	case CHIP_POLARIS12:
	case CHIP_VEGAM:
		return 32;
	default:
		unreachable("Unknown GPU");
	}
}

void
ac_get_raster_config(struct radeon_info *info,
		     uint32_t *raster_config_p,
		     uint32_t *raster_config_1_p,
		     uint32_t *se_tile_repeat_p)
{
	unsigned raster_config, raster_config_1, se_tile_repeat;

	switch (info->family) {
	/* 1 SE / 1 RB */
	case CHIP_HAINAN:
	case CHIP_KABINI:
	case CHIP_STONEY:
		raster_config = 0x00000000;
		raster_config_1 = 0x00000000;
		break;
	/* 1 SE / 4 RBs */
	case CHIP_VERDE:
		raster_config = 0x0000124a;
		raster_config_1 = 0x00000000;
		break;
	/* 1 SE / 2 RBs (Oland is special) */
	case CHIP_OLAND:
		raster_config = 0x00000082;
		raster_config_1 = 0x00000000;
		break;
	/* 1 SE / 2 RBs */
	case CHIP_KAVERI:
	case CHIP_ICELAND:
	case CHIP_CARRIZO:
		raster_config = 0x00000002;
		raster_config_1 = 0x00000000;
		break;
	/* 2 SEs / 4 RBs */
	case CHIP_BONAIRE:
	case CHIP_POLARIS11:
	case CHIP_POLARIS12:
		raster_config = 0x16000012;
		raster_config_1 = 0x00000000;
		break;
	/* 2 SEs / 8 RBs */
	case CHIP_TAHITI:
	case CHIP_PITCAIRN:
		raster_config = 0x2a00126a;
		raster_config_1 = 0x00000000;
		break;
	/* 4 SEs / 8 RBs */
	case CHIP_TONGA:
	case CHIP_POLARIS10:
		raster_config = 0x16000012;
		raster_config_1 = 0x0000002a;
		break;
	/* 4 SEs / 16 RBs */
	case CHIP_HAWAII:
	case CHIP_FIJI:
	case CHIP_VEGAM:
		raster_config = 0x3a00161a;
		raster_config_1 = 0x0000002e;
		break;
	default:
		fprintf(stderr,
			"ac: Unknown GPU, using 0 for raster_config\n");
		raster_config = 0x00000000;
		raster_config_1 = 0x00000000;
		break;
	}

	/* drm/radeon on Kaveri is buggy, so disable 1 RB to work around it.
	 * This decreases performance by up to 50% when the RB is the bottleneck.
	 */
	if (info->family == CHIP_KAVERI && !info->is_amdgpu)
		raster_config = 0x00000000;

	/* Fiji: Old kernels have incorrect tiling config. This decreases
	 * RB performance by 25%. (it disables 1 RB in the second packer)
	 */
	if (info->family == CHIP_FIJI &&
	    info->cik_macrotile_mode_array[0] == 0x000000e8) {
		raster_config = 0x16000012;
		raster_config_1 = 0x0000002a;
	}

	unsigned se_width = 8 << G_028350_SE_XSEL_GFX6(raster_config);
	unsigned se_height = 8 << G_028350_SE_YSEL_GFX6(raster_config);

	/* I don't know how to calculate this, though this is probably a good guess. */
	se_tile_repeat = MAX2(se_width, se_height) * info->max_se;

	*raster_config_p = raster_config;
	*raster_config_1_p = raster_config_1;
	if (se_tile_repeat_p)
		*se_tile_repeat_p = se_tile_repeat;
}

void
ac_get_harvested_configs(struct radeon_info *info,
			 unsigned raster_config,
			 unsigned *cik_raster_config_1_p,
			 unsigned *raster_config_se)
{
	unsigned sh_per_se = MAX2(info->max_sh_per_se, 1);
	unsigned num_se = MAX2(info->max_se, 1);
	unsigned rb_mask = info->enabled_rb_mask;
	unsigned num_rb = MIN2(info->num_render_backends, 16);
	unsigned rb_per_pkr = MIN2(num_rb / num_se / sh_per_se, 2);
	unsigned rb_per_se = num_rb / num_se;
	unsigned se_mask[4];
	unsigned se;

	se_mask[0] = ((1 << rb_per_se) - 1) & rb_mask;
	se_mask[1] = (se_mask[0] << rb_per_se) & rb_mask;
	se_mask[2] = (se_mask[1] << rb_per_se) & rb_mask;
	se_mask[3] = (se_mask[2] << rb_per_se) & rb_mask;

	assert(num_se == 1 || num_se == 2 || num_se == 4);
	assert(sh_per_se == 1 || sh_per_se == 2);
	assert(rb_per_pkr == 1 || rb_per_pkr == 2);


	if (info->chip_class >= GFX7) {
		unsigned raster_config_1 = *cik_raster_config_1_p;
		if ((num_se > 2) && ((!se_mask[0] && !se_mask[1]) ||
				     (!se_mask[2] && !se_mask[3]))) {
			raster_config_1 &= C_028354_SE_PAIR_MAP;

			if (!se_mask[0] && !se_mask[1]) {
				raster_config_1 |=
					S_028354_SE_PAIR_MAP(V_028354_RASTER_CONFIG_SE_PAIR_MAP_3);
			} else {
				raster_config_1 |=
					S_028354_SE_PAIR_MAP(V_028354_RASTER_CONFIG_SE_PAIR_MAP_0);
			}
			*cik_raster_config_1_p = raster_config_1;
		}
	}

	for (se = 0; se < num_se; se++) {
		unsigned pkr0_mask = ((1 << rb_per_pkr) - 1) << (se * rb_per_se);
		unsigned pkr1_mask = pkr0_mask << rb_per_pkr;
		int idx = (se / 2) * 2;

		raster_config_se[se] = raster_config;
		if ((num_se > 1) && (!se_mask[idx] || !se_mask[idx + 1])) {
			raster_config_se[se] &= C_028350_SE_MAP;

			if (!se_mask[idx]) {
				raster_config_se[se] |=
					S_028350_SE_MAP(V_028350_RASTER_CONFIG_SE_MAP_3);
			} else {
				raster_config_se[se] |=
					S_028350_SE_MAP(V_028350_RASTER_CONFIG_SE_MAP_0);
			}
		}

		pkr0_mask &= rb_mask;
		pkr1_mask &= rb_mask;
		if (rb_per_se > 2 && (!pkr0_mask || !pkr1_mask)) {
			raster_config_se[se] &= C_028350_PKR_MAP;

			if (!pkr0_mask) {
				raster_config_se[se] |=
					S_028350_PKR_MAP(V_028350_RASTER_CONFIG_PKR_MAP_3);
			} else {
				raster_config_se[se] |=
					S_028350_PKR_MAP(V_028350_RASTER_CONFIG_PKR_MAP_0);
			}
		}

		if (rb_per_se >= 2) {
			unsigned rb0_mask = 1 << (se * rb_per_se);
			unsigned rb1_mask = rb0_mask << 1;

			rb0_mask &= rb_mask;
			rb1_mask &= rb_mask;
			if (!rb0_mask || !rb1_mask) {
				raster_config_se[se] &= C_028350_RB_MAP_PKR0;

				if (!rb0_mask) {
					raster_config_se[se] |=
						S_028350_RB_MAP_PKR0(V_028350_RASTER_CONFIG_RB_MAP_3);
				} else {
					raster_config_se[se] |=
						S_028350_RB_MAP_PKR0(V_028350_RASTER_CONFIG_RB_MAP_0);
				}
			}

			if (rb_per_se > 2) {
				rb0_mask = 1 << (se * rb_per_se + rb_per_pkr);
				rb1_mask = rb0_mask << 1;
				rb0_mask &= rb_mask;
				rb1_mask &= rb_mask;
				if (!rb0_mask || !rb1_mask) {
					raster_config_se[se] &= C_028350_RB_MAP_PKR1;

					if (!rb0_mask) {
						raster_config_se[se] |=
							S_028350_RB_MAP_PKR1(V_028350_RASTER_CONFIG_RB_MAP_3);
					} else {
						raster_config_se[se] |=
							S_028350_RB_MAP_PKR1(V_028350_RASTER_CONFIG_RB_MAP_0);
					}
				}
			}
		}
	}
}

unsigned ac_get_compute_resource_limits(struct radeon_info *info,
					unsigned waves_per_threadgroup,
					unsigned max_waves_per_sh,
					unsigned threadgroups_per_cu)
{
	unsigned compute_resource_limits =
		S_00B854_SIMD_DEST_CNTL(waves_per_threadgroup % 4 == 0);

	if (info->chip_class >= GFX7) {
		unsigned num_cu_per_se = info->num_good_compute_units /
					 info->max_se;

		/* Force even distribution on all SIMDs in CU if the workgroup
		 * size is 64. This has shown some good improvements if # of CUs
		 * per SE is not a multiple of 4.
		 */
		if (num_cu_per_se % 4 && waves_per_threadgroup == 1)
			compute_resource_limits |= S_00B854_FORCE_SIMD_DIST(1);

		assert(threadgroups_per_cu >= 1 && threadgroups_per_cu <= 8);
		compute_resource_limits |= S_00B854_WAVES_PER_SH(max_waves_per_sh) |
					   S_00B854_CU_GROUP_COUNT(threadgroups_per_cu - 1);
	} else {
		/* GFX6 */
		if (max_waves_per_sh) {
			unsigned limit_div16 = DIV_ROUND_UP(max_waves_per_sh, 16);
			compute_resource_limits |= S_00B854_WAVES_PER_SH_SI(limit_div16);
		}
	}
	return compute_resource_limits;
}
