NVIDIA GPUs include a common scripting language (devinit) that can be interpreted by a number of "engines", e.g. within a kernel-mode software driver, the VGA BIOS or an on-board small microcontroller which provides certain security assertions (the 'PMU').
This system allows a GPU programming sequence to be shared by multiple entities that would not otherwise be able to execute common code.
This series adds support to nouveau for two opcodes seen on VBIOSes prior to the locked-down PMU taking over responsibility for executing devinit scripts.
Documentation for these two opcodes can be found at:
https://github.com/envytools/envytools/pull/189
Rhys Kidd (2): drm/nouveau/bios/init: handle INIT_RESET_BEGUN devinit opcode drm/nouveau/bios/init: handle INIT_RESET_END devinit opcode
.../gpu/drm/nouveau/nvkm/subdev/bios/init.c | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-)
Signal that the reset sequence has begun.
This opcode signals that the software reset sequence has begun. Ordinarily, no actual operations are performed by the opcode. However it allows for possible software work arounds by devinit engines in software agents other than the VBIOS, such as the resman, FCODE, and EFI driver.
Signed-off-by: Rhys Kidd rhyskidd@gmail.com --- drivers/gpu/drm/nouveau/nvkm/subdev/bios/init.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/bios/init.c b/drivers/gpu/drm/nouveau/nvkm/subdev/bios/init.c index ec0e9f7224b5..a54b5e410dcd 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/bios/init.c +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/bios/init.c @@ -1934,6 +1934,17 @@ init_ram_restrict_pll(struct nvbios_init *init) } }
+/** + * INIT_RESET_BEGUN - opcode 0x8c + * + */ +static void +init_reset_begun(struct nvbios_init *init) +{ + trace("RESET_BEGUN\n"); + init->offset += 1; +} + /** * INIT_GPIO - opcode 0x8e * @@ -2260,7 +2271,7 @@ static struct nvbios_init_opcode { [0x79] = { init_pll }, [0x7a] = { init_zm_reg }, [0x87] = { init_ram_restrict_pll }, - [0x8c] = { init_reserved }, + [0x8c] = { init_reset_begun }, [0x8d] = { init_reserved }, [0x8e] = { init_gpio }, [0x8f] = { init_ram_restrict_zm_reg_group },
Signal that the reset sequence has completed.
This opcode signals that the software reset sequence has completed. Ordinarily, no actual operations are performed by the opcode. However it allows for possible software work arounds by devinit engines in software agents other than the VBIOS, such as the resman, FCODE, and EFI driver.
Signed-off-by: Rhys Kidd rhyskidd@gmail.com --- drivers/gpu/drm/nouveau/nvkm/subdev/bios/init.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/bios/init.c b/drivers/gpu/drm/nouveau/nvkm/subdev/bios/init.c index a54b5e410dcd..49d09503cd31 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/bios/init.c +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/bios/init.c @@ -1945,6 +1945,17 @@ init_reset_begun(struct nvbios_init *init) init->offset += 1; }
+/** + * INIT_RESET_END - opcode 0x8d + * + */ +static void +init_reset_end(struct nvbios_init *init) +{ + trace("RESET_END\n"); + init->offset += 1; +} + /** * INIT_GPIO - opcode 0x8e * @@ -2272,7 +2283,7 @@ static struct nvbios_init_opcode { [0x7a] = { init_zm_reg }, [0x87] = { init_ram_restrict_pll }, [0x8c] = { init_reset_begun }, - [0x8d] = { init_reserved }, + [0x8d] = { init_reset_end }, [0x8e] = { init_gpio }, [0x8f] = { init_ram_restrict_zm_reg_group }, [0x90] = { init_copy_zm_reg },
For the whole series:
Reviewed-by: Lyude Paul lyude@redhat.com
Tested on a GK104 and GK110 (same ones as my vbios traces in our vbios repo)
On Mon, 2019-06-03 at 00:13 +1000, Rhys Kidd wrote:
NVIDIA GPUs include a common scripting language (devinit) that can be interpreted by a number of "engines", e.g. within a kernel-mode software driver, the VGA BIOS or an on-board small microcontroller which provides certain security assertions (the 'PMU').
This system allows a GPU programming sequence to be shared by multiple entities that would not otherwise be able to execute common code.
This series adds support to nouveau for two opcodes seen on VBIOSes prior to the locked-down PMU taking over responsibility for executing devinit scripts.
Documentation for these two opcodes can be found at:
https://github.com/envytools/envytools/pull/189
Rhys Kidd (2): drm/nouveau/bios/init: handle INIT_RESET_BEGUN devinit opcode drm/nouveau/bios/init: handle INIT_RESET_END devinit opcode
.../gpu/drm/nouveau/nvkm/subdev/bios/init.c | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-)
dri-devel@lists.freedesktop.org