This is the most accurate description in this thread so far. You're just missing bootcode, which is more like the step between hardware and software mentioned in the OP. It's functionally like software (written in assembly and/or a programming language like C, compiled, assembled, and linked into an executable), but it's stored in a ROM, which makes it like hardware. Unless there's a patching system built in to the bootcode, you can't modify it without a respin of the hardware (which is expensive and time consuming).
The microprocessor (mp) it runs on is hard-coded to load bootcode's entry point when the mp is brought out of hard reset, and the code itself does the essential initialization of the SoC. It can handle things like enabling performance features, setting up default interrupt handlers, training links, bringing various other parts of the chip out of hard reset, repairing internal SRAM, setting up the chip to properly handle the parts that are and aren't fused off, etc. Once it finishes, it starts the bios on CPUs (which is basically the bootcode for the motherboard, though it isn't hard-coded but usually stored in a flash chip so it can be updated), or if it's an embedded mp it can start firmware or just wait for an interrupt.
The bios sets up the motherboard and then starts the bootloader, which is located on a boot partition of a storage drive. The bootloader will then select and start the OS, which loads the drivers and provides the framework for software to find the relevant ones.
This is the most accurate description in this thread so far. You're just missing bootcode, which is more like the step between hardware and software mentioned in the OP. It's functionally like software (written in assembly and/or a programming language like C, compiled, assembled, and linked into an executable), but it's stored in a ROM, which makes it like hardware. Unless there's a patching system built in to the bootcode, you can't modify it without a respin of the hardware (which is expensive and time consuming).
The microprocessor (mp) it runs on is hard-coded to load bootcode's entry point when the mp is brought out of hard reset, and the code itself does the essential initialization of the SoC. It can handle things like enabling performance features, setting up default interrupt handlers, training links, bringing various other parts of the chip out of hard reset, repairing internal SRAM, setting up the chip to properly handle the parts that are and aren't fused off, etc. Once it finishes, it starts the bios on CPUs (which is basically the bootcode for the motherboard, though it isn't hard-coded but usually stored in a flash chip so it can be updated), or if it's an embedded mp it can start firmware or just wait for an interrupt.
The bios sets up the motherboard and then starts the bootloader, which is located on a boot partition of a storage drive. The bootloader will then select and start the OS, which loads the drivers and provides the framework for software to find the relevant ones.