Re: [PATCH 22/27] gpu: nova-core: gsp: add the GSP_INIT request builder

Zhi Wang <[email protected]>
Newsgroups dev.linux.lists.nova-gpu,org.kernel.vger.linux-kernel
Message-ID <20260820211633.0cec6f78@inno-dell>
On Tue, 18 Aug 2026 20:52:15 -0700
John Hubbard <[email protected]> wrote:

> The r000 GSP boot protocol replaces the separate system-info, registry
> and static-info commands with one GSP_INIT request, whose payload is
> an NVKV key-value blob rather than a packed struct.
> 
> Nova-core has the NVKV codec and the GSP_INIT schema, but nothing that
> fills the schema in from a PCI device.
> 
> Add the builder. It encodes the PCI identifiers and config mirror
> range the RPC path already sends, and the registry entries, whose
> names carry the NULL that GSP-RM counts in the encoded length.
> 
> Assisted-by: Cursor:claude-opus-5
> Signed-off-by: John Hubbard <[email protected]>

snip

> [`GspSetSystemInfo::init`] on the RPC path.
> +    pub(crate) fn new(
> +        dev: &pci::Device<device::Bound>,
> +        chipset: Chipset,
> +        regkeys: KVVec<RegKey>,
> +    ) -> Self {
> +        let mirror = chipset.pci_config_mirror_range();
> +        let device_id = (u32::from(dev.device_id()) << 16) |
> u32::from(dev.vendor_id().as_raw());
> +        let sub_device_id =
> +            (u32::from(dev.subsystem_device_id()) << 16) |
> u32::from(dev.subsystem_vendor_id()); +
> +        Self {
> +            pci_device_id: device_id.into(),
> +            pci_sub_device_id: sub_device_id.into(),
> +            pci_revision_id: u32::from(dev.revision_id()).into(),
> +            pci_config_mirror_base: mirror.start.into(),
> +            pci_config_mirror_size: (mirror.end -
> mirror.start).into(),
> +            oor_arch: OorArch::host().into(),
> +            bus_device_func: u64::from(dev.dev_id()).into(),

This looks not correct (though the name looks really really confusing):

https://github.com/NVIDIA/open-gpu-kernel-modules/blob/main/src/nvidia/generated/g_gpu_nvoc.h#L439

// DRF macros for GPUBUSINFO::nvDomainBusDeviceFunc
#define NVGPU_BUSDEVICE_DOMAIN     63:32
#define NVGPU_BUSDEVICE_BUS        15:8
#define NVGPU_BUSDEVICE_DEVICE      7:0

static NV_INLINE NvU64 gpuEncodeDomainBusDevice(NvU32 domain, NvU8 bus,
NvU8 device) {
    return DRF_NUM64(GPU, _BUSDEVICE, _DOMAIN, domain) |
           DRF_NUM64(GPU, _BUSDEVICE, _BUS, bus) |
           DRF_NUM64(GPU, _BUSDEVICE, _DEVICE, device);
}

The output should be ((domain << 32) | (bus << 8) | slot) - DBD

While in our code, dev.dev_id() returns from PCI_DEVID(), which is (bus
<< 8) | (slot << 3) | function - BDF.

Z.

> +            regkeys,
> +            vf_info: None,
> +        }
> +    }
>  }
>  
>  // Decode:
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.