Commit 7f022236 authored by Ben Skeggs's avatar Ben Skeggs Committed by Dave Airlie
Browse files

drm/nouveau/gsp: move firmware loading to GPU-specific code



GH100/GBxxx use a slightly different set of firmwares to boot GSP-RM.

Signed-off-by: default avatarBen Skeggs <bskeggs@nvidia.com>
Reviewed-by: default avatarDave Airlie <airlied@redhat.com>
Reviewed-by: default avatarTimur Tabi <ttabi@nvidia.com>
Tested-by: default avatarTimur Tabi <ttabi@nvidia.com>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent f9643364
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -45,7 +45,7 @@ ad102_gsp_r535_113_01 = {

static struct nvkm_gsp_fwif
ad102_gsps[] = {
	{ 0, r535_gsp_load, &ad102_gsp_r535_113_01, "535.113.01", true },
	{ 0, tu102_gsp_load, &ad102_gsp_r535_113_01, "535.113.01", true },
	{}
};

@@ -55,3 +55,9 @@ ad102_gsp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
{
	return nvkm_gsp_new_(ad102_gsps, device, type, inst, pgsp);
}

NVKM_GSP_FIRMWARE_BOOTER(ad102, 535.113.01);
NVKM_GSP_FIRMWARE_BOOTER(ad103, 535.113.01);
NVKM_GSP_FIRMWARE_BOOTER(ad104, 535.113.01);
NVKM_GSP_FIRMWARE_BOOTER(ad106, 535.113.01);
NVKM_GSP_FIRMWARE_BOOTER(ad107, 535.113.01);
+23 −0
Original line number Diff line number Diff line
@@ -80,6 +80,19 @@ nvkm_gsp_oneinit(struct nvkm_subdev *subdev)
	return gsp->func->oneinit(gsp);
}

void
nvkm_gsp_dtor_fws(struct nvkm_gsp *gsp)
{
	nvkm_firmware_put(gsp->fws.bl);
	gsp->fws.bl = NULL;
	nvkm_firmware_put(gsp->fws.booter.unload);
	gsp->fws.booter.unload = NULL;
	nvkm_firmware_put(gsp->fws.booter.load);
	gsp->fws.booter.load = NULL;
	nvkm_firmware_put(gsp->fws.rm);
	gsp->fws.rm = NULL;
}

static void *
nvkm_gsp_dtor(struct nvkm_subdev *subdev)
{
@@ -100,6 +113,16 @@ nvkm_gsp = {
	.fini = nvkm_gsp_fini,
};

int
nvkm_gsp_load_fw(struct nvkm_gsp *gsp, const char *name, const char *ver,
		 const struct firmware **pfw)
{
	char fwname[64];

	snprintf(fwname, sizeof(fwname), "gsp/%s-%s", name, ver);
	return nvkm_firmware_get(&gsp->subdev, fwname, 0, pfw);
}

int
nvkm_gsp_new_(const struct nvkm_gsp_fwif *fwif, struct nvkm_device *device,
	      enum nvkm_subdev_type type, int inst, struct nvkm_gsp **pgsp)
+3 −1
Original line number Diff line number Diff line
@@ -61,7 +61,7 @@ ga100_gsp_r535_113_01 = {

static struct nvkm_gsp_fwif
ga100_gsps[] = {
	{  0,  r535_gsp_load, &ga100_gsp_r535_113_01, "535.113.01" },
	{  0, tu102_gsp_load, &ga100_gsp_r535_113_01, "535.113.01" },
	{ -1, gv100_gsp_nofw, &gv100_gsp },
	{}
};
@@ -72,3 +72,5 @@ ga100_gsp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
{
	return nvkm_gsp_new_(ga100_gsps, device, type, inst, pgsp);
}

NVKM_GSP_FIRMWARE_BOOTER(ga100, 535.113.01);
+7 −1
Original line number Diff line number Diff line
@@ -178,7 +178,7 @@ ga102_gsp = {

static struct nvkm_gsp_fwif
ga102_gsps[] = {
	{  0,  r535_gsp_load, &ga102_gsp_r535_113_01, "535.113.01" },
	{  0, tu102_gsp_load, &ga102_gsp_r535_113_01, "535.113.01" },
	{ -1, gv100_gsp_nofw, &ga102_gsp },
	{}
};
@@ -189,3 +189,9 @@ ga102_gsp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
{
	return nvkm_gsp_new_(ga102_gsps, device, type, inst, pgsp);
}

NVKM_GSP_FIRMWARE_BOOTER(ga102, 535.113.01);
NVKM_GSP_FIRMWARE_BOOTER(ga103, 535.113.01);
NVKM_GSP_FIRMWARE_BOOTER(ga104, 535.113.01);
NVKM_GSP_FIRMWARE_BOOTER(ga106, 535.113.01);
NVKM_GSP_FIRMWARE_BOOTER(ga107, 535.113.01);
+11 −1
Original line number Diff line number Diff line
@@ -15,8 +15,18 @@ struct nvkm_gsp_fwif {
	bool enable;
};

int nvkm_gsp_load_fw(struct nvkm_gsp *, const char *name, const char *ver,
		     const struct firmware **);
void nvkm_gsp_dtor_fws(struct nvkm_gsp *);

int gv100_gsp_nofw(struct nvkm_gsp *, int, const struct nvkm_gsp_fwif *);
int  r535_gsp_load(struct nvkm_gsp *, int, const struct nvkm_gsp_fwif *);
int tu102_gsp_load(struct nvkm_gsp *, int, const struct nvkm_gsp_fwif *);

#define NVKM_GSP_FIRMWARE_BOOTER(chip,vers)                      \
MODULE_FIRMWARE("nvidia/"#chip"/gsp/booter_load-"#vers".bin");   \
MODULE_FIRMWARE("nvidia/"#chip"/gsp/booter_unload-"#vers".bin"); \
MODULE_FIRMWARE("nvidia/"#chip"/gsp/bootloader-"#vers".bin");    \
MODULE_FIRMWARE("nvidia/"#chip"/gsp/gsp-"#vers".bin")

struct nvkm_gsp_func {
	const struct nvkm_falcon_func *flcn;
Loading