Skip to content

Commit 53dac06

Browse files
Ben Skeggsairlied
authored andcommitted
drm/nouveau/gsp: add support for 570.144
Add r570-specific HAL routines, and support loading of GSP-RM version 570.144 if firmware is available. There should be no impact on r535, or non-GSP paths. 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 1b9d7b9 commit 53dac06

File tree

35 files changed

+3193
-19
lines changed

35 files changed

+3193
-19
lines changed

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ ad102_gsp = {
4141

4242
static struct nvkm_gsp_fwif
4343
ad102_gsps[] = {
44+
{ 1, tu102_gsp_load, &ad102_gsp, &r570_rm_ga102, "570.144", true },
4445
{ 0, tu102_gsp_load, &ad102_gsp, &r535_rm_ga102, "535.113.01", true },
4546
{}
4647
};
@@ -57,3 +58,9 @@ NVKM_GSP_FIRMWARE_BOOTER(ad103, 535.113.01);
5758
NVKM_GSP_FIRMWARE_BOOTER(ad104, 535.113.01);
5859
NVKM_GSP_FIRMWARE_BOOTER(ad106, 535.113.01);
5960
NVKM_GSP_FIRMWARE_BOOTER(ad107, 535.113.01);
61+
62+
NVKM_GSP_FIRMWARE_BOOTER(ad102, 570.144);
63+
NVKM_GSP_FIRMWARE_BOOTER(ad103, 570.144);
64+
NVKM_GSP_FIRMWARE_BOOTER(ad104, 570.144);
65+
NVKM_GSP_FIRMWARE_BOOTER(ad106, 570.144);
66+
NVKM_GSP_FIRMWARE_BOOTER(ad107, 570.144);

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,8 @@ nvkm_gsp_new_(const struct nvkm_gsp_fwif *fwif, struct nvkm_device *device,
142142
gsp->func = fwif->func;
143143

144144
if (fwif->rm) {
145+
nvkm_info(&gsp->subdev, "RM version: %s\n", fwif->ver);
146+
145147
gsp->rm = kzalloc(sizeof(*gsp->rm), GFP_KERNEL);
146148
if (!gsp->rm)
147149
return -ENOMEM;

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ ga100_gsp = {
5858

5959
static struct nvkm_gsp_fwif
6060
ga100_gsps[] = {
61+
{ 1, tu102_gsp_load, &ga100_gsp, &r570_rm_tu102, "570.144" },
6162
{ 0, tu102_gsp_load, &ga100_gsp, &r535_rm_tu102, "535.113.01" },
6263
{ -1, gv100_gsp_nofw, &gv100_gsp },
6364
{}
@@ -71,3 +72,4 @@ ga100_gsp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
7172
}
7273

7374
NVKM_GSP_FIRMWARE_BOOTER(ga100, 535.113.01);
75+
NVKM_GSP_FIRMWARE_BOOTER(ga100, 570.144);

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ ga102_gsp = {
174174

175175
static struct nvkm_gsp_fwif
176176
ga102_gsps[] = {
177+
{ 1, tu102_gsp_load, &ga102_gsp_r535, &r570_rm_ga102, "570.144" },
177178
{ 0, tu102_gsp_load, &ga102_gsp_r535, &r535_rm_ga102, "535.113.01" },
178179
{ -1, gv100_gsp_nofw, &ga102_gsp },
179180
{}
@@ -191,3 +192,9 @@ NVKM_GSP_FIRMWARE_BOOTER(ga103, 535.113.01);
191192
NVKM_GSP_FIRMWARE_BOOTER(ga104, 535.113.01);
192193
NVKM_GSP_FIRMWARE_BOOTER(ga106, 535.113.01);
193194
NVKM_GSP_FIRMWARE_BOOTER(ga107, 535.113.01);
195+
196+
NVKM_GSP_FIRMWARE_BOOTER(ga102, 570.144);
197+
NVKM_GSP_FIRMWARE_BOOTER(ga103, 570.144);
198+
NVKM_GSP_FIRMWARE_BOOTER(ga104, 570.144);
199+
NVKM_GSP_FIRMWARE_BOOTER(ga106, 570.144);
200+
NVKM_GSP_FIRMWARE_BOOTER(ga107, 570.144);

drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/Kbuild

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,4 @@ nvkm-y += nvkm/subdev/gsp/rm/ga1xx.o
1313
nvkm-y += nvkm/subdev/gsp/rm/ad10x.o
1414

1515
include $(src)/nvkm/subdev/gsp/rm/r535/Kbuild
16+
include $(src)/nvkm/subdev/gsp/rm/r570/Kbuild

drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/gr.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,34 @@ nvkm_rm_gr_obj_ctor(const struct nvkm_oclass *oclass, void *argv, u32 argc,
1616
return nvkm_rm_engine_obj_new(&chan->chan->rm.object, chan->chan->id, oclass, pobject);
1717
}
1818

19+
static int
20+
nvkm_rm_gr_fini(struct nvkm_gr *base, bool suspend)
21+
{
22+
struct nvkm_rm *rm = base->engine.subdev.device->gsp->rm;
23+
struct r535_gr *gr = container_of(base, typeof(*gr), base);
24+
25+
if (rm->api->gr->scrubber.fini)
26+
rm->api->gr->scrubber.fini(gr);
27+
28+
return 0;
29+
}
30+
31+
static int
32+
nvkm_rm_gr_init(struct nvkm_gr *base)
33+
{
34+
struct nvkm_rm *rm = base->engine.subdev.device->gsp->rm;
35+
struct r535_gr *gr = container_of(base, typeof(*gr), base);
36+
int ret;
37+
38+
if (rm->api->gr->scrubber.init) {
39+
ret = rm->api->gr->scrubber.init(gr);
40+
if (ret)
41+
return ret;
42+
}
43+
44+
return 0;
45+
}
46+
1947
int
2048
nvkm_rm_gr_new(struct nvkm_rm *rm)
2149
{
@@ -34,6 +62,8 @@ nvkm_rm_gr_new(struct nvkm_rm *rm)
3462

3563
func->dtor = r535_gr_dtor;
3664
func->oneinit = r535_gr_oneinit;
65+
func->init = nvkm_rm_gr_init;
66+
func->fini = nvkm_rm_gr_fini;
3767
func->units = r535_gr_units;
3868
func->chan_new = r535_gr_chan_new;
3969

@@ -51,6 +81,7 @@ nvkm_rm_gr_new(struct nvkm_rm *rm)
5181
}
5282

5383
nvkm_gr_ctor(func, rm->device, NVKM_ENGINE_GR, 0, true, &gr->base);
84+
gr->scrubber.chid = -1;
5485
rm->device->gr = &gr->base;
5586
return 0;
5687
}

drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/gr.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,22 @@ struct r535_gr {
3434
int ctxbuf_nr;
3535

3636
struct nvkm_memory *ctxbuf_mem[R515_GR_MAX_CTXBUFS];
37+
38+
struct {
39+
int chid;
40+
struct nvkm_memory *inst;
41+
struct nvkm_vmm *vmm;
42+
struct nvkm_gsp_object chan;
43+
struct nvkm_gsp_object threed;
44+
struct {
45+
struct nvkm_memory *mem[R515_GR_MAX_CTXBUFS];
46+
struct nvkm_vma *vma[R515_GR_MAX_CTXBUFS];
47+
} ctxbuf;
48+
bool enabled;
49+
} scrubber;
3750
};
51+
52+
struct NV2080_CTRL_INTERNAL_ENGINE_CONTEXT_BUFFER_INFO;
53+
void r535_gr_get_ctxbuf_info(struct r535_gr *, int i,
54+
struct NV2080_CTRL_INTERNAL_ENGINE_CONTEXT_BUFFER_INFO *);
3855
#endif

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,14 @@
3333
static void
3434
r535_bar_flush(struct nvkm_bar *bar)
3535
{
36+
/* Use NV_PFLUSH in resume path - needed on R570 to flush writes before
37+
* BAR2 page tables have been restored.
38+
*/
39+
if (unlikely(!bar->bar2)) {
40+
g84_bar_flush(bar);
41+
return;
42+
}
43+
3644
ioread32_native(bar->flushBAR2);
3745
}
3846

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,9 @@ struct fbsr {
4848
u64 sys_offset;
4949
};
5050

51-
static int
52-
fbsr_memlist(struct nvkm_gsp_device *device, u32 handle, enum nvkm_memory_target aper,
53-
u64 phys, u64 size, struct sg_table *sgt, struct nvkm_gsp_object *object)
51+
int
52+
r535_fbsr_memlist(struct nvkm_gsp_device *device, u32 handle, enum nvkm_memory_target aper,
53+
u64 phys, u64 size, struct sg_table *sgt, struct nvkm_gsp_object *object)
5454
{
5555
struct nvkm_gsp_client *client = device->object.client;
5656
struct nvkm_gsp *gsp = client->gsp;
@@ -117,8 +117,8 @@ fbsr_send(struct fbsr *fbsr, struct fbsr_item *item)
117117
struct nvkm_gsp_object memlist;
118118
int ret;
119119

120-
ret = fbsr_memlist(&fbsr->device, fbsr->hmemory, NVKM_MEM_TARGET_VRAM,
121-
item->addr, item->size, NULL, &memlist);
120+
ret = r535_fbsr_memlist(&fbsr->device, fbsr->hmemory, NVKM_MEM_TARGET_VRAM,
121+
item->addr, item->size, NULL, &memlist);
122122
if (ret)
123123
return ret;
124124

@@ -155,8 +155,8 @@ fbsr_init(struct fbsr *fbsr, struct sg_table *sgt, u64 items_size)
155155
struct nvkm_gsp_object memlist;
156156
int ret;
157157

158-
ret = fbsr_memlist(&fbsr->device, fbsr->hmemory, NVKM_MEM_TARGET_HOST,
159-
0, fbsr->size, sgt, &memlist);
158+
ret = r535_fbsr_memlist(&fbsr->device, fbsr->hmemory, NVKM_MEM_TARGET_HOST,
159+
0, fbsr->size, sgt, &memlist);
160160
if (ret)
161161
return ret;
162162

@@ -200,7 +200,7 @@ fbsr_inst(struct fbsr *fbsr, const char *type, struct nvkm_memory *memory)
200200
return fbsr_vram(fbsr, type, nvkm_memory_addr(memory), nvkm_memory_size(memory));
201201
}
202202

203-
static void
203+
void
204204
r535_fbsr_resume(struct nvkm_gsp *gsp)
205205
{
206206
/* RM has restored VRAM contents already, so just need to free the sysmem buffer. */

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ r535_runl = {
339339
.allow = r535_runl_allow,
340340
};
341341

342-
static void
342+
void
343343
r535_fifo_rc_chid(struct nvkm_fifo *fifo, int chid)
344344
{
345345
struct nvkm_chan *chan;

0 commit comments

Comments
 (0)