diff --git a/machine/src/platform/rpi3/mod.rs b/machine/src/platform/rpi3/mod.rs index 38fab56..aba0b4b 100644 --- a/machine/src/platform/rpi3/mod.rs +++ b/machine/src/platform/rpi3/mod.rs @@ -19,11 +19,55 @@ pub mod vc; pub struct BcmHost; +// Per <https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#peripheral-addresses>: +// +// SoC Peripheral Address Peripheral Size SDRAM Address Source +// BCM2835 0x20000000 0x01000000 0x40000000 <https://github.com/raspberrypi/linux/blob/7f465f823c2ecbade5877b8bbcb2093a8060cb0e/arch/arm/boot/dts/bcm2835.dtsi#L21> +// BCM2836 0x3f000000 0x01000000 0xc0000000 <https://github.com/raspberrypi/linux/blob/7f465f823c2ecbade5877b8bbcb2093a8060cb0e/arch/arm/boot/dts/bcm2836.dtsi#L10> +// BCM2837 0x3f000000 0x01000000 0xc0000000 <https://github.com/raspberrypi/linux/blob/7f465f823c2ecbade5877b8bbcb2093a8060cb0e/arch/arm/boot/dts/bcm2837.dtsi#L9> +// BCM2711 0xfe000000 0x01800000 0xc0000000 <https://github.com/raspberrypi/linux/blob/7f465f823c2ecbade5877b8bbcb2093a8060cb0e/arch/arm/boot/dts/bcm2711.dtsi#L41> + +// <https://www.raspberrypi.com/documentation/computers/processors.html> +// The BCM2835 is the Broadcom chip used in the Raspberry Pi Model A, B, B+, the Compute Module, and the Raspberry Pi Zero. +// The BCM2836 is used in the Raspberry Pi 2 Model B. +// The BCM2837 is used in the Raspberry Pi 3, and in later models of the Raspberry Pi 2. +// The BCM2837B0 is used in the Raspberry Pi 3B+ and 3A+. +// The BCM2711 is used in the Raspberry Pi 4 Model B. +// RP3A0 (BCM2710A1 — which is the die packaged inside the BCM2837 chip - Raspberry Pi 3) used in Raspberry Pi Zero 2 W + +// Machine Board Chip +// raspi1 raspi bcm2835 +// raspi1 raspi bcm2835 +// raspi3b+ raspi bcm2837 +// raspi4 raspi bcm2711 + impl BcmHost { + /// At which address to load the kernel binary. + pub const fn kernel_load_address() -> u64 { + 0x8_0000 + } + + /// As per <https://www.raspberrypi.org/forums/viewtopic.php?p=1170522#p1170522> + /// + pub fn bus2phys(bus: usize) -> usize { + bus & !0xc000_0000 + } + + pub fn phys2bus(phys: usize) -> usize { + phys | 0xc000_0000 + } +} + +// RasPi3B+ +#[cfg(feature = "rpi3")] +impl BcmHost { + /// Name of the hardware device this BcmHost is compiled for. + pub const fn board_name() -> &'static str { + "Raspberry Pi 3+" + } + /// This returns the ARM-side physical address where peripherals are mapped. /// - /// As per <https://www.raspberrypi.org/documentation/hardware/raspberrypi/peripheral_addresses.md> - /// BCM SOC could address only 1Gb of memory, so 0x4000_0000 is the high watermark. pub const fn get_peripheral_address() -> usize { 0x3f00_0000 } @@ -37,14 +81,29 @@ impl BcmHost { pub const fn get_sdram_address() -> usize { 0xc000_0000 // uncached } +} - /// As per <https://www.raspberrypi.org/forums/viewtopic.php?p=1170522#p1170522> - /// - pub fn bus2phys(bus: usize) -> usize { - bus & !0xc000_0000 +// RasPi4 +#[cfg(feature = "rpi4")] +impl BcmHost { + /// Name of the hardware device this BcmHost is compiled for. + pub const fn board_name() -> &'static str { + "Raspberry Pi 4+" } - pub fn phys2bus(phys: usize) -> usize { - phys | 0xc000_0000 + /// This returns the ARM-side physical address where peripherals are mapped. + /// + pub const fn get_peripheral_address() -> usize { + 0xfe00_0000 + } + + /// This returns the size of the peripherals' space. + pub const fn get_peripheral_size() -> usize { + 0x0180_0000 + } + + /// This returns the bus address of the SDRAM. + pub const fn get_sdram_address() -> usize { + 0xc000_0000 // uncached } }