aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArindam Nath <arindam.nath@amd.com>2016-04-06 15:33:51 -0400
committerAlex Deucher <alexander.deucher@amd.com>2016-05-04 20:19:35 -0400
commit7050c6ef5f0e9bc5e6bf9eb035320b70f731b919 (patch)
treedfa4df5d70b954551999ace972f998ee93371d57
parent794f50b95d40bbde905c3c4c514a33fdda54f497 (diff)
drm/radeon: add support for loading new UVD fw
Signed-off-by: Christian König <christian.koenig@amd.com> Signed-off-by: Arindam Nath <arindam.nath@amd.com> Reviewed-by: Leo Liu <leo.liu@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/radeon/radeon.h1
-rw-r--r--drivers/gpu/drm/radeon/radeon_uvd.c55
-rw-r--r--drivers/gpu/drm/radeon/uvd_v4_2.c8
3 files changed, 49 insertions, 15 deletions
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 170e69111d1b..d0a96c7f915d 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -1679,6 +1679,7 @@ int radeon_pm_get_type_index(struct radeon_device *rdev,
1679#define RADEON_UVD_HEAP_SIZE (1024*1024) 1679#define RADEON_UVD_HEAP_SIZE (1024*1024)
1680 1680
1681struct radeon_uvd { 1681struct radeon_uvd {
1682 bool fw_header_present;
1682 struct radeon_bo *vcpu_bo; 1683 struct radeon_bo *vcpu_bo;
1683 void *cpu_addr; 1684 void *cpu_addr;
1684 uint64_t gpu_addr; 1685 uint64_t gpu_addr;
diff --git a/drivers/gpu/drm/radeon/radeon_uvd.c b/drivers/gpu/drm/radeon/radeon_uvd.c
index 6fe9e4e76284..008de2799d9f 100644
--- a/drivers/gpu/drm/radeon/radeon_uvd.c
+++ b/drivers/gpu/drm/radeon/radeon_uvd.c
@@ -34,6 +34,7 @@
34#include <drm/drm.h> 34#include <drm/drm.h>
35 35
36#include "radeon.h" 36#include "radeon.h"
37#include "radeon_ucode.h"
37#include "r600d.h" 38#include "r600d.h"
38 39
39/* 1 second timeout */ 40/* 1 second timeout */
@@ -47,7 +48,8 @@
47#define FIRMWARE_CYPRESS "radeon/CYPRESS_uvd.bin" 48#define FIRMWARE_CYPRESS "radeon/CYPRESS_uvd.bin"
48#define FIRMWARE_SUMO "radeon/SUMO_uvd.bin" 49#define FIRMWARE_SUMO "radeon/SUMO_uvd.bin"
49#define FIRMWARE_TAHITI "radeon/TAHITI_uvd.bin" 50#define FIRMWARE_TAHITI "radeon/TAHITI_uvd.bin"
50#define FIRMWARE_BONAIRE "radeon/BONAIRE_uvd.bin" 51#define FIRMWARE_BONAIRE_LEGACY "radeon/BONAIRE_uvd.bin"
52#define FIRMWARE_BONAIRE "radeon/bonaire_uvd.bin"
51 53
52MODULE_FIRMWARE(FIRMWARE_R600); 54MODULE_FIRMWARE(FIRMWARE_R600);
53MODULE_FIRMWARE(FIRMWARE_RS780); 55MODULE_FIRMWARE(FIRMWARE_RS780);
@@ -56,6 +58,7 @@ MODULE_FIRMWARE(FIRMWARE_RV710);
56MODULE_FIRMWARE(FIRMWARE_CYPRESS); 58MODULE_FIRMWARE(FIRMWARE_CYPRESS);
57MODULE_FIRMWARE(FIRMWARE_SUMO); 59MODULE_FIRMWARE(FIRMWARE_SUMO);
58MODULE_FIRMWARE(FIRMWARE_TAHITI); 60MODULE_FIRMWARE(FIRMWARE_TAHITI);
61MODULE_FIRMWARE(FIRMWARE_BONAIRE_LEGACY);
59MODULE_FIRMWARE(FIRMWARE_BONAIRE); 62MODULE_FIRMWARE(FIRMWARE_BONAIRE);
60 63
61static void radeon_uvd_idle_work_handler(struct work_struct *work); 64static void radeon_uvd_idle_work_handler(struct work_struct *work);
@@ -63,7 +66,7 @@ static void radeon_uvd_idle_work_handler(struct work_struct *work);
63int radeon_uvd_init(struct radeon_device *rdev) 66int radeon_uvd_init(struct radeon_device *rdev)
64{ 67{
65 unsigned long bo_size; 68 unsigned long bo_size;
66 const char *fw_name; 69 const char *fw_name = NULL, *legacy_fw_name = NULL;
67 int i, r; 70 int i, r;
68 71
69 INIT_DELAYED_WORK(&rdev->uvd.idle_work, radeon_uvd_idle_work_handler); 72 INIT_DELAYED_WORK(&rdev->uvd.idle_work, radeon_uvd_idle_work_handler);
@@ -74,22 +77,22 @@ int radeon_uvd_init(struct radeon_device *rdev)
74 case CHIP_RV670: 77 case CHIP_RV670:
75 case CHIP_RV620: 78 case CHIP_RV620:
76 case CHIP_RV635: 79 case CHIP_RV635:
77 fw_name = FIRMWARE_R600; 80 legacy_fw_name = FIRMWARE_R600;
78 break; 81 break;
79 82
80 case CHIP_RS780: 83 case CHIP_RS780:
81 case CHIP_RS880: 84 case CHIP_RS880:
82 fw_name = FIRMWARE_RS780; 85 legacy_fw_name = FIRMWARE_RS780;
83 break; 86 break;
84 87
85 case CHIP_RV770: 88 case CHIP_RV770:
86 fw_name = FIRMWARE_RV770; 89 legacy_fw_name = FIRMWARE_RV770;
87 break; 90 break;
88 91
89 case CHIP_RV710: 92 case CHIP_RV710:
90 case CHIP_RV730: 93 case CHIP_RV730:
91 case CHIP_RV740: 94 case CHIP_RV740:
92 fw_name = FIRMWARE_RV710; 95 legacy_fw_name = FIRMWARE_RV710;
93 break; 96 break;
94 97
95 case CHIP_CYPRESS: 98 case CHIP_CYPRESS:
@@ -97,7 +100,7 @@ int radeon_uvd_init(struct radeon_device *rdev)
97 case CHIP_JUNIPER: 100 case CHIP_JUNIPER:
98 case CHIP_REDWOOD: 101 case CHIP_REDWOOD:
99 case CHIP_CEDAR: 102 case CHIP_CEDAR:
100 fw_name = FIRMWARE_CYPRESS; 103 legacy_fw_name = FIRMWARE_CYPRESS;
101 break; 104 break;
102 105
103 case CHIP_SUMO: 106 case CHIP_SUMO:
@@ -107,7 +110,7 @@ int radeon_uvd_init(struct radeon_device *rdev)
107 case CHIP_BARTS: 110 case CHIP_BARTS:
108 case CHIP_TURKS: 111 case CHIP_TURKS:
109 case CHIP_CAICOS: 112 case CHIP_CAICOS:
110 fw_name = FIRMWARE_SUMO; 113 legacy_fw_name = FIRMWARE_SUMO;
111 break; 114 break;
112 115
113 case CHIP_TAHITI: 116 case CHIP_TAHITI:
@@ -115,7 +118,7 @@ int radeon_uvd_init(struct radeon_device *rdev)
115 case CHIP_PITCAIRN: 118 case CHIP_PITCAIRN:
116 case CHIP_ARUBA: 119 case CHIP_ARUBA:
117 case CHIP_OLAND: 120 case CHIP_OLAND:
118 fw_name = FIRMWARE_TAHITI; 121 legacy_fw_name = FIRMWARE_TAHITI;
119 break; 122 break;
120 123
121 case CHIP_BONAIRE: 124 case CHIP_BONAIRE:
@@ -123,6 +126,7 @@ int radeon_uvd_init(struct radeon_device *rdev)
123 case CHIP_KAVERI: 126 case CHIP_KAVERI:
124 case CHIP_HAWAII: 127 case CHIP_HAWAII:
125 case CHIP_MULLINS: 128 case CHIP_MULLINS:
129 legacy_fw_name = FIRMWARE_BONAIRE_LEGACY;
126 fw_name = FIRMWARE_BONAIRE; 130 fw_name = FIRMWARE_BONAIRE;
127 break; 131 break;
128 132
@@ -130,11 +134,34 @@ int radeon_uvd_init(struct radeon_device *rdev)
130 return -EINVAL; 134 return -EINVAL;
131 } 135 }
132 136
133 r = request_firmware(&rdev->uvd_fw, fw_name, rdev->dev); 137 rdev->uvd.fw_header_present = false;
134 if (r) { 138 if (fw_name) {
135 dev_err(rdev->dev, "radeon_uvd: Can't load firmware \"%s\"\n", 139 /* Let's try to load the newer firmware first */
136 fw_name); 140 r = request_firmware(&rdev->uvd_fw, fw_name, rdev->dev);
137 return r; 141 if (r) {
142 dev_err(rdev->dev, "radeon_uvd: Can't load firmware \"%s\"\n",
143 fw_name);
144 } else {
145 r = radeon_ucode_validate(rdev->uvd_fw);
146 if (r)
147 return r;
148
149 rdev->uvd.fw_header_present = true;
150 }
151 }
152
153 /*
154 * In case there is only legacy firmware, or we encounter an error
155 * while loading the new firmware, we fall back to loading the legacy
156 * firmware now.
157 */
158 if (!fw_name || r) {
159 r = request_firmware(&rdev->uvd_fw, legacy_fw_name, rdev->dev);
160 if (r) {
161 dev_err(rdev->dev, "radeon_uvd: Can't load firmware \"%s\"\n",
162 legacy_fw_name);
163 return r;
164 }
138 } 165 }
139 166
140 bo_size = RADEON_GPU_PAGE_ALIGN(rdev->uvd_fw->size + 8) + 167 bo_size = RADEON_GPU_PAGE_ALIGN(rdev->uvd_fw->size + 8) +
diff --git a/drivers/gpu/drm/radeon/uvd_v4_2.c b/drivers/gpu/drm/radeon/uvd_v4_2.c
index d04d5073eef2..205562fa31e3 100644
--- a/drivers/gpu/drm/radeon/uvd_v4_2.c
+++ b/drivers/gpu/drm/radeon/uvd_v4_2.c
@@ -41,7 +41,13 @@ int uvd_v4_2_resume(struct radeon_device *rdev)
41 uint32_t size; 41 uint32_t size;
42 42
43 /* programm the VCPU memory controller bits 0-27 */ 43 /* programm the VCPU memory controller bits 0-27 */
44 addr = rdev->uvd.gpu_addr >> 3; 44
45 /* skip over the header of the new firmware format */
46 if (rdev->uvd.fw_header_present)
47 addr = (rdev->uvd.gpu_addr + 0x200) >> 3;
48 else
49 addr = rdev->uvd.gpu_addr >> 3;
50
45 size = RADEON_GPU_PAGE_ALIGN(rdev->uvd_fw->size + 4) >> 3; 51 size = RADEON_GPU_PAGE_ALIGN(rdev->uvd_fw->size + 4) >> 3;
46 WREG32(UVD_VCPU_CACHE_OFFSET0, addr); 52 WREG32(UVD_VCPU_CACHE_OFFSET0, addr);
47 WREG32(UVD_VCPU_CACHE_SIZE0, size); 53 WREG32(UVD_VCPU_CACHE_SIZE0, size);