diff options
Diffstat (limited to 'drivers/gpu/nvgpu')
-rw-r--r-- | drivers/gpu/nvgpu/gm206/bios_gm206.c | 58 |
1 files changed, 14 insertions, 44 deletions
diff --git a/drivers/gpu/nvgpu/gm206/bios_gm206.c b/drivers/gpu/nvgpu/gm206/bios_gm206.c index b0626d19..62dce777 100644 --- a/drivers/gpu/nvgpu/gm206/bios_gm206.c +++ b/drivers/gpu/nvgpu/gm206/bios_gm206.c | |||
@@ -11,13 +11,10 @@ | |||
11 | * more details. | 11 | * more details. |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <linux/pci.h> | ||
15 | |||
16 | #include <nvgpu/bios.h> | 14 | #include <nvgpu/bios.h> |
17 | #include <nvgpu/kmem.h> | 15 | #include <nvgpu/kmem.h> |
18 | #include <nvgpu/nvgpu_common.h> | 16 | #include <nvgpu/nvgpu_common.h> |
19 | #include <nvgpu/timers.h> | 17 | #include <nvgpu/timers.h> |
20 | #include <nvgpu/firmware.h> | ||
21 | #include <nvgpu/falcon.h> | 18 | #include <nvgpu/falcon.h> |
22 | #include <nvgpu/enabled.h> | 19 | #include <nvgpu/enabled.h> |
23 | 20 | ||
@@ -176,48 +173,25 @@ int gm206_bios_init(struct gk20a *g) | |||
176 | struct nvgpu_os_linux *l = nvgpu_os_linux_from_gk20a(g); | 173 | struct nvgpu_os_linux *l = nvgpu_os_linux_from_gk20a(g); |
177 | struct dentry *d; | 174 | struct dentry *d; |
178 | #endif | 175 | #endif |
179 | struct nvgpu_firmware *bios_fw; | ||
180 | int err; | 176 | int err; |
181 | struct pci_dev *pdev = to_pci_dev(dev_from_gk20a(g)); | ||
182 | char rom_name[sizeof(BIOS_OVERLAY_NAME_FORMATTED)]; | ||
183 | 177 | ||
184 | gk20a_dbg_fn(""); | 178 | gk20a_dbg_fn(""); |
185 | 179 | ||
186 | snprintf(rom_name, sizeof(rom_name), BIOS_OVERLAY_NAME, pdev->device); | 180 | gk20a_dbg_info("reading bios from EEPROM"); |
187 | gk20a_dbg_info("checking for VBIOS overlay %s", rom_name); | 181 | g->bios.size = BIOS_SIZE; |
188 | bios_fw = nvgpu_request_firmware(g, rom_name, | 182 | g->bios.data = nvgpu_vmalloc(g, BIOS_SIZE); |
189 | NVGPU_REQUEST_FIRMWARE_NO_WARN | | 183 | if (!g->bios.data) |
190 | NVGPU_REQUEST_FIRMWARE_NO_SOC); | 184 | return -ENOMEM; |
191 | if (bios_fw) { | 185 | g->ops.xve.disable_shadow_rom(g); |
192 | gk20a_dbg_info("using VBIOS overlay"); | 186 | for (i = 0; i < g->bios.size/4; i++) { |
193 | g->bios.size = bios_fw->size - ROM_FILE_PAYLOAD_OFFSET; | 187 | u32 val = be32_to_cpu(gk20a_readl(g, 0x300000 + i*4)); |
194 | g->bios.data = vmalloc(g->bios.size); | 188 | |
195 | if (!g->bios.data) { | 189 | g->bios.data[(i*4)] = (val >> 24) & 0xff; |
196 | err = -ENOMEM; | 190 | g->bios.data[(i*4)+1] = (val >> 16) & 0xff; |
197 | goto free_firmware; | 191 | g->bios.data[(i*4)+2] = (val >> 8) & 0xff; |
198 | } | 192 | g->bios.data[(i*4)+3] = val & 0xff; |
199 | |||
200 | memcpy(g->bios.data, &bios_fw->data[ROM_FILE_PAYLOAD_OFFSET], | ||
201 | g->bios.size); | ||
202 | |||
203 | nvgpu_release_firmware(g, bios_fw); | ||
204 | } else { | ||
205 | gk20a_dbg_info("reading bios from EEPROM"); | ||
206 | g->bios.size = BIOS_SIZE; | ||
207 | g->bios.data = nvgpu_vmalloc(g, BIOS_SIZE); | ||
208 | if (!g->bios.data) | ||
209 | return -ENOMEM; | ||
210 | g->ops.xve.disable_shadow_rom(g); | ||
211 | for (i = 0; i < g->bios.size/4; i++) { | ||
212 | u32 val = be32_to_cpu(gk20a_readl(g, 0x300000 + i*4)); | ||
213 | |||
214 | g->bios.data[(i*4)] = (val >> 24) & 0xff; | ||
215 | g->bios.data[(i*4)+1] = (val >> 16) & 0xff; | ||
216 | g->bios.data[(i*4)+2] = (val >> 8) & 0xff; | ||
217 | g->bios.data[(i*4)+3] = val & 0xff; | ||
218 | } | ||
219 | g->ops.xve.enable_shadow_rom(g); | ||
220 | } | 193 | } |
194 | g->ops.xve.enable_shadow_rom(g); | ||
221 | 195 | ||
222 | err = nvgpu_bios_parse_rom(g); | 196 | err = nvgpu_bios_parse_rom(g); |
223 | if (err) | 197 | if (err) |
@@ -263,8 +237,4 @@ int gm206_bios_init(struct gk20a *g) | |||
263 | } | 237 | } |
264 | 238 | ||
265 | return 0; | 239 | return 0; |
266 | |||
267 | free_firmware: | ||
268 | nvgpu_release_firmware(g, bios_fw); | ||
269 | return err; | ||
270 | } | 240 | } |