]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
drm/amdgpu/discovery: reserve discovery data at the top of VRAM
authorXiaojie Yuan <xiaojie.yuan@amd.com>
Thu, 10 Oct 2019 12:44:20 +0000 (20:44 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 15 Oct 2019 19:48:46 +0000 (15:48 -0400)
IP Discovery data is TMR fenced by the latest PSP BL,
so we need to reserve this region.

Tested on navi10/12/14 with VBIOS integrated with latest PSP BL.

v2: use DISCOVERY_TMR_SIZE macro as bo size
    use amdgpu_bo_create_kernel_at() to allocate bo

Signed-off-by: Xiaojie Yuan <xiaojie.yuan@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu.h
drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.h
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
drivers/gpu/drm/amd/include/discovery.h

index c82579c93265dcd4ff2609e922c27fbee1bd971a..b7b00fc90d658f6592cb170901f79453df871b4e 100644 (file)
@@ -759,6 +759,7 @@ struct amdgpu_device {
        uint8_t                         *bios;
        uint32_t                        bios_size;
        struct amdgpu_bo                *stolen_vga_memory;
+       struct amdgpu_bo                *discovery_memory;
        uint32_t                        bios_scratch_reg_offset;
        uint32_t                        bios_scratch[AMDGPU_BIOS_NUM_SCRATCH];
 
index 1481899f86c166ed25c0639c80031ec2b9fdea90..71198c5318e154b700be28e9f9a0b3e69d3fca51 100644 (file)
@@ -136,7 +136,7 @@ static int amdgpu_discovery_read_binary(struct amdgpu_device *adev, uint8_t *bin
 {
        uint32_t *p = (uint32_t *)binary;
        uint64_t vram_size = (uint64_t)RREG32(mmRCC_CONFIG_MEMSIZE) << 20;
-       uint64_t pos = vram_size - BINARY_MAX_SIZE;
+       uint64_t pos = vram_size - DISCOVERY_TMR_SIZE;
        unsigned long flags;
 
        while (pos < vram_size) {
@@ -179,7 +179,7 @@ int amdgpu_discovery_init(struct amdgpu_device *adev)
        uint16_t checksum;
        int r;
 
-       adev->discovery = kzalloc(BINARY_MAX_SIZE, GFP_KERNEL);
+       adev->discovery = kzalloc(DISCOVERY_TMR_SIZE, GFP_KERNEL);
        if (!adev->discovery)
                return -ENOMEM;
 
index 85b8c4d4d5763735fa9edf561bf095c59ae1a559..5a6693d7d269f114fc2d66c0d51088407fdaba03 100644 (file)
@@ -24,6 +24,8 @@
 #ifndef __AMDGPU_DISCOVERY__
 #define __AMDGPU_DISCOVERY__
 
+#define DISCOVERY_TMR_SIZE  (64 << 10)
+
 int amdgpu_discovery_init(struct amdgpu_device *adev);
 void amdgpu_discovery_fini(struct amdgpu_device *adev);
 int amdgpu_discovery_reg_base_init(struct amdgpu_device *adev);
index 9da6350a4ba2f04a650c36e38803171cc96e4a3b..2e85a5154f87fef1e731de65fdf43318ac0453e1 100644 (file)
@@ -1750,6 +1750,20 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)
                                    NULL, &stolen_vga_buf);
        if (r)
                return r;
+
+       /*
+        * reserve one TMR (64K) memory at the top of VRAM which holds
+        * IP Discovery data and is protected by PSP.
+        */
+       r = amdgpu_bo_create_kernel_at(adev,
+                                      adev->gmc.real_vram_size - DISCOVERY_TMR_SIZE,
+                                      DISCOVERY_TMR_SIZE,
+                                      AMDGPU_GEM_DOMAIN_VRAM,
+                                      &adev->discovery_memory,
+                                      NULL);
+       if (r)
+               return r;
+
        DRM_INFO("amdgpu: %uM of VRAM memory ready\n",
                 (unsigned) (adev->gmc.real_vram_size / (1024 * 1024)));
 
@@ -1814,6 +1828,9 @@ void amdgpu_ttm_late_init(struct amdgpu_device *adev)
        void *stolen_vga_buf;
        /* return the VGA stolen memory (if any) back to VRAM */
        amdgpu_bo_free_kernel(&adev->stolen_vga_memory, NULL, &stolen_vga_buf);
+
+       /* return the IP Discovery TMR memory back to VRAM */
+       amdgpu_bo_free_kernel(&adev->discovery_memory, NULL, NULL);
 }
 
 /**
index 5dcb776548d8974f50acc75d5da11f3be9c1f14f..7ec4331e67f26e5860268637c2e5f77b28a9fe25 100644 (file)
@@ -25,7 +25,6 @@
 #define _DISCOVERY_H_
 
 #define PSP_HEADER_SIZE                 256
-#define BINARY_MAX_SIZE                 (64 << 10)
 #define BINARY_SIGNATURE                0x28211407
 #define DISCOVERY_TABLE_SIGNATURE       0x53445049