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: Ben Skeggs <bskeggs@nvidia.com> Reviewed-by: Dave Airlie <airlied@redhat.com> Reviewed-by: Timur Tabi <ttabi@nvidia.com> Tested-by: Timur Tabi <ttabi@nvidia.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -1960,19 +1960,6 @@ r535_gsp_elf_section(struct nvkm_gsp *gsp, const char *name, const u8 **pdata, u
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
static void
|
||||
r535_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;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
|
||||
struct r535_gsp_log {
|
||||
@@ -2209,7 +2196,7 @@ r535_gsp_dtor(struct nvkm_gsp *gsp)
|
||||
mutex_destroy(&gsp->msgq.mutex);
|
||||
mutex_destroy(&gsp->cmdq.mutex);
|
||||
|
||||
r535_gsp_dtor_fws(gsp);
|
||||
nvkm_gsp_dtor_fws(gsp);
|
||||
|
||||
nvkm_gsp_mem_dtor(&gsp->rmargs);
|
||||
nvkm_gsp_mem_dtor(&gsp->wpr_meta);
|
||||
@@ -2284,7 +2271,7 @@ r535_gsp_oneinit(struct nvkm_gsp *gsp)
|
||||
return ret;
|
||||
|
||||
/* Release FW images - we've copied them to DMA buffers now. */
|
||||
r535_gsp_dtor_fws(gsp);
|
||||
nvkm_gsp_dtor_fws(gsp);
|
||||
|
||||
/* Calculate FB layout. */
|
||||
gsp->fb.wpr2.frts.size = 0x100000;
|
||||
@@ -2349,64 +2336,3 @@ r535_gsp_oneinit(struct nvkm_gsp *gsp)
|
||||
idr_init(&gsp->client_id.idr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
r535_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
|
||||
r535_gsp_load(struct nvkm_gsp *gsp, int ver, const struct nvkm_gsp_fwif *fwif)
|
||||
{
|
||||
struct nvkm_subdev *subdev = &gsp->subdev;
|
||||
int ret;
|
||||
bool enable_gsp = fwif->enable;
|
||||
|
||||
#if IS_ENABLED(CONFIG_DRM_NOUVEAU_GSP_DEFAULT)
|
||||
enable_gsp = true;
|
||||
#endif
|
||||
if (!nvkm_boolopt(subdev->device->cfgopt, "NvGspRm", enable_gsp))
|
||||
return -EINVAL;
|
||||
|
||||
if ((ret = r535_gsp_load_fw(gsp, "gsp", fwif->ver, &gsp->fws.rm)) ||
|
||||
(ret = r535_gsp_load_fw(gsp, "booter_load", fwif->ver, &gsp->fws.booter.load)) ||
|
||||
(ret = r535_gsp_load_fw(gsp, "booter_unload", fwif->ver, &gsp->fws.booter.unload)) ||
|
||||
(ret = r535_gsp_load_fw(gsp, "bootloader", fwif->ver, &gsp->fws.bl))) {
|
||||
r535_gsp_dtor_fws(gsp);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define NVKM_GSP_FIRMWARE(chip) \
|
||||
MODULE_FIRMWARE("nvidia/"#chip"/gsp/booter_load-535.113.01.bin"); \
|
||||
MODULE_FIRMWARE("nvidia/"#chip"/gsp/booter_unload-535.113.01.bin"); \
|
||||
MODULE_FIRMWARE("nvidia/"#chip"/gsp/bootloader-535.113.01.bin"); \
|
||||
MODULE_FIRMWARE("nvidia/"#chip"/gsp/gsp-535.113.01.bin")
|
||||
|
||||
NVKM_GSP_FIRMWARE(tu102);
|
||||
NVKM_GSP_FIRMWARE(tu104);
|
||||
NVKM_GSP_FIRMWARE(tu106);
|
||||
|
||||
NVKM_GSP_FIRMWARE(tu116);
|
||||
NVKM_GSP_FIRMWARE(tu117);
|
||||
|
||||
NVKM_GSP_FIRMWARE(ga100);
|
||||
|
||||
NVKM_GSP_FIRMWARE(ga102);
|
||||
NVKM_GSP_FIRMWARE(ga103);
|
||||
NVKM_GSP_FIRMWARE(ga104);
|
||||
NVKM_GSP_FIRMWARE(ga106);
|
||||
NVKM_GSP_FIRMWARE(ga107);
|
||||
|
||||
NVKM_GSP_FIRMWARE(ad102);
|
||||
NVKM_GSP_FIRMWARE(ad103);
|
||||
NVKM_GSP_FIRMWARE(ad104);
|
||||
NVKM_GSP_FIRMWARE(ad106);
|
||||
NVKM_GSP_FIRMWARE(ad107);
|
||||
|
||||
@@ -183,9 +183,55 @@ tu102_gsp_r535_113_01 = {
|
||||
.rm = &r535_gsp_rm,
|
||||
};
|
||||
|
||||
static int
|
||||
tu102_gsp_load_rm(struct nvkm_gsp *gsp, const struct nvkm_gsp_fwif *fwif)
|
||||
{
|
||||
struct nvkm_subdev *subdev = &gsp->subdev;
|
||||
bool enable_gsp = fwif->enable;
|
||||
int ret;
|
||||
|
||||
#if IS_ENABLED(CONFIG_DRM_NOUVEAU_GSP_DEFAULT)
|
||||
enable_gsp = true;
|
||||
#endif
|
||||
if (!nvkm_boolopt(subdev->device->cfgopt, "NvGspRm", enable_gsp))
|
||||
return -EINVAL;
|
||||
|
||||
ret = nvkm_gsp_load_fw(gsp, "gsp", fwif->ver, &gsp->fws.rm);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = nvkm_gsp_load_fw(gsp, "bootloader", fwif->ver, &gsp->fws.bl);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
tu102_gsp_load(struct nvkm_gsp *gsp, int ver, const struct nvkm_gsp_fwif *fwif)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = tu102_gsp_load_rm(gsp, fwif);
|
||||
if (ret)
|
||||
goto done;
|
||||
|
||||
ret = nvkm_gsp_load_fw(gsp, "booter_load", fwif->ver, &gsp->fws.booter.load);
|
||||
if (ret)
|
||||
goto done;
|
||||
|
||||
ret = nvkm_gsp_load_fw(gsp, "booter_unload", fwif->ver, &gsp->fws.booter.unload);
|
||||
|
||||
done:
|
||||
if (ret)
|
||||
nvkm_gsp_dtor_fws(gsp);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct nvkm_gsp_fwif
|
||||
tu102_gsps[] = {
|
||||
{ 0, r535_gsp_load, &tu102_gsp_r535_113_01, "535.113.01" },
|
||||
{ 0, tu102_gsp_load, &tu102_gsp_r535_113_01, "535.113.01" },
|
||||
{ -1, gv100_gsp_nofw, &gv100_gsp },
|
||||
{}
|
||||
};
|
||||
@@ -196,3 +242,7 @@ tu102_gsp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
|
||||
{
|
||||
return nvkm_gsp_new_(tu102_gsps, device, type, inst, pgsp);
|
||||
}
|
||||
|
||||
NVKM_GSP_FIRMWARE_BOOTER(tu102, 535.113.01);
|
||||
NVKM_GSP_FIRMWARE_BOOTER(tu104, 535.113.01);
|
||||
NVKM_GSP_FIRMWARE_BOOTER(tu106, 535.113.01);
|
||||
|
||||
@@ -44,7 +44,7 @@ tu116_gsp_r535_113_01 = {
|
||||
|
||||
static struct nvkm_gsp_fwif
|
||||
tu116_gsps[] = {
|
||||
{ 0, r535_gsp_load, &tu116_gsp_r535_113_01, "535.113.01" },
|
||||
{ 0, tu102_gsp_load, &tu116_gsp_r535_113_01, "535.113.01" },
|
||||
{ -1, gv100_gsp_nofw, &gv100_gsp },
|
||||
{}
|
||||
};
|
||||
@@ -55,3 +55,6 @@ tu116_gsp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
|
||||
{
|
||||
return nvkm_gsp_new_(tu116_gsps, device, type, inst, pgsp);
|
||||
}
|
||||
|
||||
NVKM_GSP_FIRMWARE_BOOTER(tu116, 535.113.01);
|
||||
NVKM_GSP_FIRMWARE_BOOTER(tu117, 535.113.01);
|
||||
|
||||
Reference in New Issue
Block a user