Commit fcd91a95 authored by Lijo Lazar's avatar Lijo Lazar Committed by Alex Deucher
Browse files

drm/amdgpu: Add option to refresh NPS data



In certain use cases, NPS data needs to be refreshed again from
discovery table. Add API parameter to refresh NPS data from discovery
table.

Signed-off-by: default avatarLijo Lazar <lijo.lazar@amd.com>
Reviewed-by: default avatarRajneesh Bhardwaj <rajneesh.bhardwaj@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 5682cd86
Loading
Loading
Loading
Loading
+53 −15
Original line number Diff line number Diff line
@@ -1723,20 +1723,56 @@ union nps_info {
	struct nps_info_v1_0 v1;
};

static int amdgpu_discovery_refresh_nps_info(struct amdgpu_device *adev,
					     union nps_info *nps_data)
{
	uint64_t vram_size, pos, offset;
	struct nps_info_header *nhdr;
	struct binary_header bhdr;
	uint16_t checksum;

	vram_size = (uint64_t)RREG32(mmRCC_CONFIG_MEMSIZE) << 20;
	pos = vram_size - DISCOVERY_TMR_OFFSET;
	amdgpu_device_vram_access(adev, pos, &bhdr, sizeof(bhdr), false);

	offset = le16_to_cpu(bhdr.table_list[NPS_INFO].offset);
	checksum = le16_to_cpu(bhdr.table_list[NPS_INFO].checksum);

	amdgpu_device_vram_access(adev, (pos + offset), nps_data,
				  sizeof(*nps_data), false);

	nhdr = (struct nps_info_header *)(nps_data);
	if (!amdgpu_discovery_verify_checksum((uint8_t *)nps_data,
					      le32_to_cpu(nhdr->size_bytes),
					      checksum)) {
		dev_err(adev->dev, "nps data refresh, checksum mismatch\n");
		return -EINVAL;
	}

	return 0;
}

int amdgpu_discovery_get_nps_info(struct amdgpu_device *adev,
				  uint32_t *nps_type,
				  struct amdgpu_gmc_memrange **ranges,
				  int *range_cnt)
				  int *range_cnt, bool refresh)
{
	struct amdgpu_gmc_memrange *mem_ranges;
	struct binary_header *bhdr;
	union nps_info *nps_info;
	union nps_info nps_data;
	u16 offset;
	int i;
	int i, r;

	if (!nps_type || !range_cnt || !ranges)
		return -EINVAL;

	if (refresh) {
		r = amdgpu_discovery_refresh_nps_info(adev, &nps_data);
		if (r)
			return r;
		nps_info = &nps_data;
	} else {
		if (!adev->mman.discovery_bin) {
			dev_err(adev->dev,
				"fetch mem range failed, ip discovery uninitialized\n");
@@ -1753,7 +1789,9 @@ int amdgpu_discovery_get_nps_info(struct amdgpu_device *adev,
		if (amdgpu_discovery_verify_npsinfo(adev, bhdr))
			return -ENOENT;

	nps_info = (union nps_info *)(adev->mman.discovery_bin + offset);
		nps_info =
			(union nps_info *)(adev->mman.discovery_bin + offset);
	}

	switch (le16_to_cpu(nps_info->v1.header.version_major)) {
	case 1:
+1 −1
Original line number Diff line number Diff line
@@ -33,6 +33,6 @@ int amdgpu_discovery_set_ip_blocks(struct amdgpu_device *adev);
int amdgpu_discovery_get_nps_info(struct amdgpu_device *adev,
				  uint32_t *nps_type,
				  struct amdgpu_gmc_memrange **ranges,
				  int *range_cnt);
				  int *range_cnt, bool refresh);

#endif /* __AMDGPU_DISCOVERY__ */
+1 −1
Original line number Diff line number Diff line
@@ -1172,7 +1172,7 @@ int amdgpu_gmc_get_nps_memranges(struct amdgpu_device *adev,
		return -EINVAL;

	ret = amdgpu_discovery_get_nps_info(adev, &nps_type, &ranges,
					    &range_cnt);
					    &range_cnt, false);

	if (ret)
		return ret;