Skip to content

Commit 594766c

Browse files
Ben Skeggsairlied
authored andcommitted
drm/nouveau/gsp: move booter handling to GPU-specific code
GH100/GBxxx have significant changes to the GSP-RM boot process. Signed-off-by: Ben Skeggs <[email protected]> Reviewed-by: Dave Airlie <[email protected]> Reviewed-by: Timur Tabi <[email protected]> Tested-by: Timur Tabi <[email protected]> Signed-off-by: Dave Airlie <[email protected]>
1 parent 7f02223 commit 594766c

File tree

8 files changed

+125
-103
lines changed

8 files changed

+125
-103
lines changed

drivers/gpu/drm/nouveau/nvkm/subdev/gsp/ad102.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ ad102_gsp_r535_113_01 = {
3636

3737
.dtor = r535_gsp_dtor,
3838
.oneinit = tu102_gsp_oneinit,
39-
.init = r535_gsp_init,
40-
.fini = r535_gsp_fini,
39+
.init = tu102_gsp_init,
40+
.fini = tu102_gsp_fini,
4141
.reset = ga102_gsp_reset,
4242

4343
.rm = &r535_gsp_rm,

drivers/gpu/drm/nouveau/nvkm/subdev/gsp/base.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ nvkm_gsp_fini(struct nvkm_subdev *subdev, bool suspend)
5252
{
5353
struct nvkm_gsp *gsp = nvkm_gsp(subdev);
5454

55-
if (!gsp->func->fini)
55+
if (!gsp->func->fini || !gsp->running)
5656
return 0;
5757

5858
return gsp->func->fini(gsp, suspend);

drivers/gpu/drm/nouveau/nvkm/subdev/gsp/ga100.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@ ga100_gsp_r535_113_01 = {
5252

5353
.dtor = r535_gsp_dtor,
5454
.oneinit = tu102_gsp_oneinit,
55-
.init = r535_gsp_init,
56-
.fini = r535_gsp_fini,
55+
.init = tu102_gsp_init,
56+
.fini = tu102_gsp_fini,
5757
.reset = tu102_gsp_reset,
5858

5959
.rm = &r535_gsp_rm,

drivers/gpu/drm/nouveau/nvkm/subdev/gsp/ga102.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,8 +164,8 @@ ga102_gsp_r535_113_01 = {
164164

165165
.dtor = r535_gsp_dtor,
166166
.oneinit = tu102_gsp_oneinit,
167-
.init = r535_gsp_init,
168-
.fini = r535_gsp_fini,
167+
.init = tu102_gsp_init,
168+
.fini = tu102_gsp_fini,
169169
.reset = ga102_gsp_reset,
170170

171171
.rm = &r535_gsp_rm,

drivers/gpu/drm/nouveau/nvkm/subdev/gsp/priv.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ extern const struct nvkm_falcon_fw_func tu102_gsp_fwsec;
5959
int tu102_gsp_booter_ctor(struct nvkm_gsp *, const char *, const struct firmware *,
6060
struct nvkm_falcon *, struct nvkm_falcon_fw *);
6161
int tu102_gsp_oneinit(struct nvkm_gsp *);
62+
int tu102_gsp_init(struct nvkm_gsp *);
63+
int tu102_gsp_fini(struct nvkm_gsp *, bool suspend);
6264
int tu102_gsp_reset(struct nvkm_gsp *);
6365

6466
extern const struct nvkm_falcon_func ga102_gsp_flcn;
@@ -72,6 +74,7 @@ int r535_gsp_oneinit(struct nvkm_gsp *);
7274
int r535_gsp_init(struct nvkm_gsp *);
7375
int r535_gsp_fini(struct nvkm_gsp *, bool suspend);
7476
extern const struct nvkm_gsp_rm r535_gsp_rm;
77+
int r535_gsp_rmargs_init(struct nvkm_gsp *gsp, bool resume);
7578

7679
int nvkm_gsp_new_(const struct nvkm_gsp_fwif *, struct nvkm_device *, enum nvkm_subdev_type, int,
7780
struct nvkm_gsp **);

drivers/gpu/drm/nouveau/nvkm/subdev/gsp/r535.c

Lines changed: 4 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -1145,48 +1145,6 @@ r535_gsp_msg_run_cpu_sequencer(void *priv, u32 fn, void *repv, u32 repc)
11451145
return 0;
11461146
}
11471147

1148-
static int
1149-
r535_gsp_booter_unload(struct nvkm_gsp *gsp, u32 mbox0, u32 mbox1)
1150-
{
1151-
struct nvkm_subdev *subdev = &gsp->subdev;
1152-
struct nvkm_device *device = subdev->device;
1153-
u32 wpr2_hi;
1154-
int ret;
1155-
1156-
wpr2_hi = nvkm_rd32(device, 0x1fa828);
1157-
if (!wpr2_hi) {
1158-
nvkm_debug(subdev, "WPR2 not set - skipping booter unload\n");
1159-
return 0;
1160-
}
1161-
1162-
ret = nvkm_falcon_fw_boot(&gsp->booter.unload, &gsp->subdev, true, &mbox0, &mbox1, 0, 0);
1163-
if (WARN_ON(ret))
1164-
return ret;
1165-
1166-
wpr2_hi = nvkm_rd32(device, 0x1fa828);
1167-
if (WARN_ON(wpr2_hi))
1168-
return -EIO;
1169-
1170-
return 0;
1171-
}
1172-
1173-
static int
1174-
r535_gsp_booter_load(struct nvkm_gsp *gsp, u32 mbox0, u32 mbox1)
1175-
{
1176-
int ret;
1177-
1178-
ret = nvkm_falcon_fw_boot(&gsp->booter.load, &gsp->subdev, true, &mbox0, &mbox1, 0, 0);
1179-
if (ret)
1180-
return ret;
1181-
1182-
nvkm_falcon_wr32(&gsp->falcon, 0x080, gsp->boot.app_version);
1183-
1184-
if (WARN_ON(!nvkm_falcon_riscv_active(&gsp->falcon)))
1185-
return -EIO;
1186-
1187-
return 0;
1188-
}
1189-
11901148
static int
11911149
r535_gsp_wpr_meta_init(struct nvkm_gsp *gsp)
11921150
{
@@ -1287,7 +1245,7 @@ r535_gsp_shared_init(struct nvkm_gsp *gsp)
12871245
return 0;
12881246
}
12891247

1290-
static int
1248+
int
12911249
r535_gsp_rmargs_init(struct nvkm_gsp *gsp, bool resume)
12921250
{
12931251
GSP_ARGUMENTS_CACHED *args;
@@ -1816,12 +1774,8 @@ nvkm_gsp_radix3_sg(struct nvkm_gsp *gsp, struct sg_table *sgt, u64 size,
18161774
int
18171775
r535_gsp_fini(struct nvkm_gsp *gsp, bool suspend)
18181776
{
1819-
u32 mbox0 = 0xff, mbox1 = 0xff;
18201777
int ret;
18211778

1822-
if (!gsp->running)
1823-
return 0;
1824-
18251779
if (suspend) {
18261780
GspFwWprMeta *meta = gsp->wpr_meta.data;
18271781
u64 len = meta->gspFwWprEnd - meta->gspFwWprStart;
@@ -1844,9 +1798,6 @@ r535_gsp_fini(struct nvkm_gsp *gsp, bool suspend)
18441798
sr->revision = GSP_FW_SR_META_REVISION;
18451799
sr->sysmemAddrOfSuspendResumeData = gsp->sr.radix3.lvl0.addr;
18461800
sr->sizeOfSuspendResumeData = len;
1847-
1848-
mbox0 = lower_32_bits(gsp->sr.meta.addr);
1849-
mbox1 = upper_32_bits(gsp->sr.meta.addr);
18501801
}
18511802

18521803
ret = r535_gsp_rpc_unloading_guest_driver(gsp, suspend);
@@ -1858,38 +1809,19 @@ r535_gsp_fini(struct nvkm_gsp *gsp, bool suspend)
18581809
break;
18591810
);
18601811

1861-
nvkm_falcon_reset(&gsp->falcon);
1862-
1863-
ret = nvkm_gsp_fwsec_sb(gsp);
1864-
WARN_ON(ret);
1865-
1866-
ret = r535_gsp_booter_unload(gsp, mbox0, mbox1);
1867-
WARN_ON(ret);
1868-
18691812
gsp->running = false;
18701813
return 0;
18711814
}
18721815

18731816
int
18741817
r535_gsp_init(struct nvkm_gsp *gsp)
18751818
{
1876-
u32 mbox0, mbox1;
18771819
int ret;
18781820

1879-
if (!gsp->sr.meta.data) {
1880-
mbox0 = lower_32_bits(gsp->wpr_meta.addr);
1881-
mbox1 = upper_32_bits(gsp->wpr_meta.addr);
1882-
} else {
1883-
r535_gsp_rmargs_init(gsp, true);
1884-
1885-
mbox0 = lower_32_bits(gsp->sr.meta.addr);
1886-
mbox1 = upper_32_bits(gsp->sr.meta.addr);
1887-
}
1821+
nvkm_falcon_wr32(&gsp->falcon, 0x080, gsp->boot.app_version);
18881822

1889-
/* Execute booter to handle (eventually...) booting GSP-RM. */
1890-
ret = r535_gsp_booter_load(gsp, mbox0, mbox1);
1891-
if (WARN_ON(ret))
1892-
goto done;
1823+
if (WARN_ON(!nvkm_falcon_riscv_active(&gsp->falcon)))
1824+
return -EIO;
18931825

18941826
ret = r535_gsp_rpc_poll(gsp, NV_VGPU_MSG_EVENT_GSP_INIT_DONE);
18951827
if (ret)
@@ -2220,16 +2152,6 @@ r535_gsp_oneinit(struct nvkm_gsp *gsp)
22202152
mutex_init(&gsp->cmdq.mutex);
22212153
mutex_init(&gsp->msgq.mutex);
22222154

2223-
ret = gsp->func->booter.ctor(gsp, "booter-load", gsp->fws.booter.load,
2224-
&device->sec2->falcon, &gsp->booter.load);
2225-
if (ret)
2226-
return ret;
2227-
2228-
ret = gsp->func->booter.ctor(gsp, "booter-unload", gsp->fws.booter.unload,
2229-
&device->sec2->falcon, &gsp->booter.unload);
2230-
if (ret)
2231-
return ret;
2232-
22332155
/* Load GSP firmware from ELF image into DMA-accessible memory. */
22342156
ret = r535_gsp_elf_section(gsp, ".fwimage", &data, &size);
22352157
if (ret)
@@ -2324,14 +2246,6 @@ r535_gsp_oneinit(struct nvkm_gsp *gsp)
23242246
if (WARN_ON(ret))
23252247
return ret;
23262248

2327-
/* Reset GSP into RISC-V mode. */
2328-
ret = gsp->func->reset(gsp);
2329-
if (WARN_ON(ret))
2330-
return ret;
2331-
2332-
nvkm_falcon_wr32(&gsp->falcon, 0x040, lower_32_bits(gsp->libos.addr));
2333-
nvkm_falcon_wr32(&gsp->falcon, 0x044, upper_32_bits(gsp->libos.addr));
2334-
23352249
mutex_init(&gsp->client_id.mutex);
23362250
idr_init(&gsp->client_id.idr);
23372251
return 0;

drivers/gpu/drm/nouveau/nvkm/subdev/gsp/tu102.c

Lines changed: 109 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,43 @@
2222
#include "priv.h"
2323

2424
#include <subdev/fb.h>
25+
#include <engine/sec2.h>
2526

2627
#include <nvfw/flcn.h>
2728
#include <nvfw/fw.h>
2829
#include <nvfw/hs.h>
2930

31+
static int
32+
tu102_gsp_booter_unload(struct nvkm_gsp *gsp, u32 mbox0, u32 mbox1)
33+
{
34+
struct nvkm_subdev *subdev = &gsp->subdev;
35+
struct nvkm_device *device = subdev->device;
36+
u32 wpr2_hi;
37+
int ret;
38+
39+
wpr2_hi = nvkm_rd32(device, 0x1fa828);
40+
if (!wpr2_hi) {
41+
nvkm_debug(subdev, "WPR2 not set - skipping booter unload\n");
42+
return 0;
43+
}
44+
45+
ret = nvkm_falcon_fw_boot(&gsp->booter.unload, &gsp->subdev, true, &mbox0, &mbox1, 0, 0);
46+
if (WARN_ON(ret))
47+
return ret;
48+
49+
wpr2_hi = nvkm_rd32(device, 0x1fa828);
50+
if (WARN_ON(wpr2_hi))
51+
return -EIO;
52+
53+
return 0;
54+
}
55+
56+
static int
57+
tu102_gsp_booter_load(struct nvkm_gsp *gsp, u32 mbox0, u32 mbox1)
58+
{
59+
return nvkm_falcon_fw_boot(&gsp->booter.load, &gsp->subdev, true, &mbox0, &mbox1, 0, 0);
60+
}
61+
3062
int
3163
tu102_gsp_booter_ctor(struct nvkm_gsp *gsp, const char *name, const struct firmware *blob,
3264
struct nvkm_falcon *falcon, struct nvkm_falcon_fw *fw)
@@ -114,6 +146,55 @@ tu102_gsp_reset(struct nvkm_gsp *gsp)
114146
return gsp->falcon.func->reset_eng(&gsp->falcon);
115147
}
116148

149+
int
150+
tu102_gsp_fini(struct nvkm_gsp *gsp, bool suspend)
151+
{
152+
u32 mbox0 = 0xff, mbox1 = 0xff;
153+
int ret;
154+
155+
ret = r535_gsp_fini(gsp, suspend);
156+
if (ret && suspend)
157+
return ret;
158+
159+
nvkm_falcon_reset(&gsp->falcon);
160+
161+
ret = nvkm_gsp_fwsec_sb(gsp);
162+
WARN_ON(ret);
163+
164+
if (suspend) {
165+
mbox0 = lower_32_bits(gsp->sr.meta.addr);
166+
mbox1 = upper_32_bits(gsp->sr.meta.addr);
167+
}
168+
169+
ret = tu102_gsp_booter_unload(gsp, mbox0, mbox1);
170+
WARN_ON(ret);
171+
return 0;
172+
}
173+
174+
int
175+
tu102_gsp_init(struct nvkm_gsp *gsp)
176+
{
177+
u32 mbox0, mbox1;
178+
int ret;
179+
180+
if (!gsp->sr.meta.data) {
181+
mbox0 = lower_32_bits(gsp->wpr_meta.addr);
182+
mbox1 = upper_32_bits(gsp->wpr_meta.addr);
183+
} else {
184+
r535_gsp_rmargs_init(gsp, true);
185+
186+
mbox0 = lower_32_bits(gsp->sr.meta.addr);
187+
mbox1 = upper_32_bits(gsp->sr.meta.addr);
188+
}
189+
190+
/* Execute booter to handle (eventually...) booting GSP-RM. */
191+
ret = tu102_gsp_booter_load(gsp, mbox0, mbox1);
192+
if (WARN_ON(ret))
193+
return ret;
194+
195+
return r535_gsp_init(gsp);
196+
}
197+
117198
static u64
118199
tu102_gsp_vga_workspace_addr(struct nvkm_gsp *gsp, u64 fb_size)
119200
{
@@ -136,14 +217,38 @@ tu102_gsp_vga_workspace_addr(struct nvkm_gsp *gsp, u64 fb_size)
136217
int
137218
tu102_gsp_oneinit(struct nvkm_gsp *gsp)
138219
{
139-
gsp->fb.size = nvkm_fb_vidmem_size(gsp->subdev.device);
220+
struct nvkm_device *device = gsp->subdev.device;
221+
int ret;
222+
223+
gsp->fb.size = nvkm_fb_vidmem_size(device);
140224

141225
gsp->fb.bios.vga_workspace.addr = tu102_gsp_vga_workspace_addr(gsp, gsp->fb.size);
142226
gsp->fb.bios.vga_workspace.size = gsp->fb.size - gsp->fb.bios.vga_workspace.addr;
143227
gsp->fb.bios.addr = gsp->fb.bios.vga_workspace.addr;
144228
gsp->fb.bios.size = gsp->fb.bios.vga_workspace.size;
145229

146-
return r535_gsp_oneinit(gsp);
230+
ret = gsp->func->booter.ctor(gsp, "booter-load", gsp->fws.booter.load,
231+
&device->sec2->falcon, &gsp->booter.load);
232+
if (ret)
233+
return ret;
234+
235+
ret = gsp->func->booter.ctor(gsp, "booter-unload", gsp->fws.booter.unload,
236+
&device->sec2->falcon, &gsp->booter.unload);
237+
if (ret)
238+
return ret;
239+
240+
ret = r535_gsp_oneinit(gsp);
241+
if (ret)
242+
return ret;
243+
244+
/* Reset GSP into RISC-V mode. */
245+
ret = gsp->func->reset(gsp);
246+
if (ret)
247+
return ret;
248+
249+
nvkm_falcon_wr32(&gsp->falcon, 0x040, lower_32_bits(gsp->libos.addr));
250+
nvkm_falcon_wr32(&gsp->falcon, 0x044, upper_32_bits(gsp->libos.addr));
251+
return 0;
147252
}
148253

149254
const struct nvkm_falcon_func
@@ -176,8 +281,8 @@ tu102_gsp_r535_113_01 = {
176281

177282
.dtor = r535_gsp_dtor,
178283
.oneinit = tu102_gsp_oneinit,
179-
.init = r535_gsp_init,
180-
.fini = r535_gsp_fini,
284+
.init = tu102_gsp_init,
285+
.fini = tu102_gsp_fini,
181286
.reset = tu102_gsp_reset,
182287

183288
.rm = &r535_gsp_rm,

drivers/gpu/drm/nouveau/nvkm/subdev/gsp/tu116.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ tu116_gsp_r535_113_01 = {
3535

3636
.dtor = r535_gsp_dtor,
3737
.oneinit = tu102_gsp_oneinit,
38-
.init = r535_gsp_init,
39-
.fini = r535_gsp_fini,
38+
.init = tu102_gsp_init,
39+
.fini = tu102_gsp_fini,
4040
.reset = tu102_gsp_reset,
4141

4242
.rm = &r535_gsp_rm,

0 commit comments

Comments
 (0)