diff options
author | Arindam Nath <arindam.nath@amd.com> | 2016-04-06 15:33:51 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2016-05-04 20:19:35 -0400 |
commit | 7050c6ef5f0e9bc5e6bf9eb035320b70f731b919 (patch) | |
tree | dfa4df5d70b954551999ace972f998ee93371d57 | |
parent | 794f50b95d40bbde905c3c4c514a33fdda54f497 (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.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_uvd.c | 55 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/uvd_v4_2.c | 8 |
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 | ||
1681 | struct radeon_uvd { | 1681 | struct 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 | ||
52 | MODULE_FIRMWARE(FIRMWARE_R600); | 54 | MODULE_FIRMWARE(FIRMWARE_R600); |
53 | MODULE_FIRMWARE(FIRMWARE_RS780); | 55 | MODULE_FIRMWARE(FIRMWARE_RS780); |
@@ -56,6 +58,7 @@ MODULE_FIRMWARE(FIRMWARE_RV710); | |||
56 | MODULE_FIRMWARE(FIRMWARE_CYPRESS); | 58 | MODULE_FIRMWARE(FIRMWARE_CYPRESS); |
57 | MODULE_FIRMWARE(FIRMWARE_SUMO); | 59 | MODULE_FIRMWARE(FIRMWARE_SUMO); |
58 | MODULE_FIRMWARE(FIRMWARE_TAHITI); | 60 | MODULE_FIRMWARE(FIRMWARE_TAHITI); |
61 | MODULE_FIRMWARE(FIRMWARE_BONAIRE_LEGACY); | ||
59 | MODULE_FIRMWARE(FIRMWARE_BONAIRE); | 62 | MODULE_FIRMWARE(FIRMWARE_BONAIRE); |
60 | 63 | ||
61 | static void radeon_uvd_idle_work_handler(struct work_struct *work); | 64 | static 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); | |||
63 | int radeon_uvd_init(struct radeon_device *rdev) | 66 | int 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); |