On 2/9/26 2:40 PM, Timur Tabi wrote:
> GA100 is a compute-only variant of GA102 that boots GSP-RM like a Turing.
> 
> Although architecturally like an Ampere, GA100 uses the same GSP-RM
> firmware files as Turing, and therefore must boot it like Turing does.
> In addition, as a compute-only part, GA100 has no display engine,
> no VBIOS, and no graphics (GR) engine.
> 
> Since it doesn't have VBIOS, there is no FWSEC firmware, and so there is
> no FRTS region that needs to be reserved or initialized.
> 
> Although Nouveau now supports GA100, there is currently no real support
> for this GPU with either Clover or Rusticl/NVK, as both require a 3D
> engine.  This is in contrast with GH100, which does contain a GR engine
> and is supported.
> 
> Also note that this patch partially reverts commit e8b3627bec35 ("nouveau:
> don't attempt fwsec on sb on newer platforms."), which added fwsec
> pointers to struct ga100_gsp erroneously.
> 
> Signed-off-by: Timur Tabi <[email protected]>
> ---
>  .../gpu/drm/nouveau/nvkm/engine/device/base.c  | 11 ++---------
>  .../gpu/drm/nouveau/nvkm/subdev/gsp/ga100.c    |  4 ----
>  .../gpu/drm/nouveau/nvkm/subdev/gsp/tu102.c    | 18 +++++++++++++-----
>  3 files changed, 15 insertions(+), 18 deletions(-)
> 
> diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c 
> b/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
> index 2517b65d8faa..fc730ed05fcb 100644
> --- a/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
> +++ b/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
> @@ -2513,7 +2513,6 @@ static const struct nvkm_device_chip
>  nv170_chipset = {
>       .name = "GA100",
>       .bar      = { 0x00000001, tu102_bar_new },
> -     .bios     = { 0x00000001, nvkm_bios_new },
>       .devinit  = { 0x00000001, ga100_devinit_new },
>       .fault    = { 0x00000001, tu102_fault_new },
>       .fb       = { 0x00000001, ga100_fb_new },
> @@ -2530,6 +2529,7 @@ nv170_chipset = {
>       .vfn      = { 0x00000001, ga100_vfn_new },
>       .ce       = { 0x000003ff, ga100_ce_new },
>       .fifo     = { 0x00000001, ga100_fifo_new },
> +     .sec2     = { 0x00000001, tu102_sec2_new },
>  };
>  
>  static const struct nvkm_device_chip
> @@ -3329,6 +3329,7 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
>       case 0x166: device->chip = &nv166_chipset; break;
>       case 0x167: device->chip = &nv167_chipset; break;
>       case 0x168: device->chip = &nv168_chipset; break;
> +     case 0x170: device->chip = &nv170_chipset; break;
>       case 0x172: device->chip = &nv172_chipset; break;
>       case 0x173: device->chip = &nv173_chipset; break;
>       case 0x174: device->chip = &nv174_chipset; break;
> @@ -3348,14 +3349,6 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
>       case 0x1b6: device->chip = &nv1b6_chipset; break;
>       case 0x1b7: device->chip = &nv1b7_chipset; break;
>       default:
> -             if (nvkm_boolopt(device->cfgopt, "NvEnableUnsupportedChipsets", 
> false)) {
> -                     switch (device->chipset) {
> -                     case 0x170: device->chip = &nv170_chipset; break;
> -                     default:
> -                             break;
> -                     }
> -             }
> -
>               if (!device->chip) {
>                       nvdev_error(device, "unknown chipset (%08x)\n", boot0);
>                       ret = -ENODEV;
> diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/ga100.c 
> b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/ga100.c
> index 27a13aeccd3c..fdd820eeef81 100644
> --- a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/ga100.c
> +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/ga100.c
> @@ -41,15 +41,11 @@ ga100_gsp_flcn = {
>  static const struct nvkm_gsp_func
>  ga100_gsp = {
>       .flcn = &ga100_gsp_flcn,
> -     .fwsec = &tu102_gsp_fwsec,
>  
>       .sig_section = ".fwsignature_ga100",
>  
>       .booter.ctor = tu102_gsp_booter_ctor,
>  
> -     .fwsec_sb.ctor = tu102_gsp_fwsec_sb_ctor,
> -     .fwsec_sb.dtor = tu102_gsp_fwsec_sb_dtor,
> -
>       .dtor = r535_gsp_dtor,
>       .oneinit = tu102_gsp_oneinit,
>       .init = tu102_gsp_init,
> diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/tu102.c 
> b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/tu102.c
> index 04b642a1f730..1f7360276744 100644
> --- a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/tu102.c
> +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/tu102.c
> @@ -318,8 +318,13 @@ tu102_gsp_oneinit(struct nvkm_gsp *gsp)
>       if (ret)
>               return ret;
>  
> -     /* Calculate FB layout. */
> -     gsp->fb.wpr2.frts.size = 0x100000;
> +     /*
> +      * Calculate FB layout. FRTS is a memory region created by the 
> FWSEC-FRTS firmware.
> +      * FWSEC comes from VBIOS.  So on systems with no VBIOS (e.g. GA100), 
> the FRTS does
> +      * not exist.  Therefore, use the existence of VBIOS to determine 
> whether to reserve
> +      * an FRTS region.
> +      */
> +     gsp->fb.wpr2.frts.size = device->bios ? 0x100000 : 0;
>       gsp->fb.wpr2.frts.addr = ALIGN_DOWN(gsp->fb.bios.addr, 0x20000) - 
> gsp->fb.wpr2.frts.size;
>  
>       gsp->fb.wpr2.boot.size = gsp->boot.fw.size;
> @@ -343,9 +348,12 @@ tu102_gsp_oneinit(struct nvkm_gsp *gsp)
>       if (ret)
>               return ret;
>  
> -     ret = nvkm_gsp_fwsec_frts(gsp);
> -     if (WARN_ON(ret))
> -             return ret;
> +     /* Only boot FWSEC-FRTS if it actually exists */
> +     if (gsp->fb.wpr2.frts.size) {
> +             ret = nvkm_gsp_fwsec_frts(gsp);
> +             if (WARN_ON(ret))
> +                     return ret;
> +     }

This looks conceptually correct, although I'm not a nouveau expert, so:

Acked-by: John Hubbard <[email protected]>


thanks,
-- 
John Hubbard

>  
>       /* Reset GSP into RISC-V mode. */
>       ret = gsp->func->reset(gsp);
> 
> base-commit: 310326bb7df4bba094a3fc60364c641c547fd923

Reply via email to