drm/amdgpu: Read discovery info from system memory
authorLijo Lazar <lijo.lazar@amd.com>
Mon, 30 Jan 2023 04:08:09 +0000 (09:38 +0530)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 9 Jun 2023 13:55:42 +0000 (09:55 -0400)
On certain ASICs, discovery info is available at reserved region in system
memory. The location is available through ACPI interface. Add API to read
discovery info from there.

Signed-off-by: Lijo Lazar <lijo.lazar@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c

index 6701f17..2460709 100644 (file)
@@ -203,6 +203,29 @@ static int hw_id_map[MAX_HWIP] = {
        [PCIE_HWIP]     = PCIE_HWID,
 };
 
+static int amdgpu_discovery_read_binary_from_sysmem(struct amdgpu_device *adev, uint8_t *binary)
+{
+       u64 tmr_offset, tmr_size, pos;
+       void *discv_regn;
+       int ret;
+
+       ret = amdgpu_acpi_get_tmr_info(adev, &tmr_offset, &tmr_size);
+       if (ret)
+               return ret;
+
+       pos = tmr_offset + tmr_size - DISCOVERY_TMR_OFFSET;
+
+       /* This region is read-only and reserved from system use */
+       discv_regn = memremap(pos, adev->mman.discovery_tmr_size, MEMREMAP_WC);
+       if (discv_regn) {
+               memcpy(binary, discv_regn, adev->mman.discovery_tmr_size);
+               memunmap(discv_regn);
+               return 0;
+       }
+
+       return -ENOENT;
+}
+
 static void amdgpu_discovery_read_binary_from_vram(struct amdgpu_device *adev, uint8_t *binary)
 {
        uint64_t vram_size = (uint64_t)RREG32(mmRCC_CONFIG_MEMSIZE) << 20;