| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef SYSROOT_ZIRCON_BOOT_DRIVER_CONFIG_H_ |
| #define SYSROOT_ZIRCON_BOOT_DRIVER_CONFIG_H_ |
| |
| #include <stdint.h> |
| #include <zircon/compiler.h> |
| #include <zircon/types.h> |
| |
| // ZBI_TYPE_KERNEL_DRIVER item types (for zbi_header_t.extra) |
| #define KDRV_ARM_PSCI 0x49435350 // 'PSCI' |
| #define KDRV_ARM_GIC_V2 0x32434947 // 'GIC2' |
| #define KDRV_ARM_GIC_V3 0x33434947 // 'GIC3' |
| #define KDRV_ARM_GENERIC_TIMER 0x4D495441 // 'ATIM' |
| #define KDRV_PL011_UART 0x55304C50 // 'PL0U' |
| #define KDRV_AMLOGIC_UART 0x554C4D41 // 'AMLU' |
| #define KDRV_NXP_IMX_UART 0x55584D49 // 'IMXU' |
| #define KDRV_MT8167_UART 0x5538544D // 'MT8U' |
| #define KDRV_AMLOGIC_HDCP 0x484C4D41 // 'AMLH' |
| #define KDRV_MSM_UART 0x554D534D // 'MSMU' |
| #define KDRV_MSM_POWER 1347244877 // 'MSMP' |
| #define KDRV_DW8250_UART 0x44573855 // 'DW8U' |
| #define KDRV_AS370_POWER 0x50303733 // '370P' |
| #define KDRV_AMLOGIC_RNG 0x484C4D52 // 'AMLR' |
| #define KDRV_GENERIC_32BIT_WATCHDOG 0x32334457 // 'WD32' |
| #define KDRV_I8250_PIO_UART 0x30353238 // '8250' |
| #define KDRV_I8250_MMIO_UART 0x4d353238 // '825M' |
| |
| // Kernel driver struct that can be used for simple drivers. |
| // Used by KDRV_PL011_UART, KDRV_AMLOGIC_UART, KDRV_NXP_IMX_UART, |
| // and KDRV_I8250_MMIO_UART. |
| typedef struct { |
| uint64_t mmio_phys; |
| uint32_t irq; |
| uint32_t reserved; |
| } dcfg_simple_t; |
| |
| // Used by KDRV_I8250_PIO_UART. |
| typedef struct { |
| uint16_t base; |
| uint16_t reserved; |
| uint32_t irq; |
| } dcfg_simple_pio_t; |
| |
| // for KDRV_MT8167_UART |
| typedef struct { |
| uint64_t soc_mmio_phys; |
| uint64_t uart_mmio_phys; |
| uint32_t irq; |
| uint32_t reserved; |
| } dcfg_soc_uart_t; |
| |
| // for KDRV_ARM_PSCI |
| typedef struct { |
| uint8_t use_hvc; |
| uint8_t reserved[7]; |
| uint64_t shutdown_args[3]; |
| uint64_t reboot_args[3]; |
| uint64_t reboot_bootloader_args[3]; |
| uint64_t reboot_recovery_args[3]; |
| } dcfg_arm_psci_driver_t; |
| |
| typedef struct { |
| uint64_t soc_imem_phys; |
| uint64_t soc_imem_offset; |
| } dcfg_msm_power_driver_t; |
| |
| // for KDRV_ARM_GIC_V2 |
| typedef struct { |
| uint64_t mmio_phys; |
| uint64_t msi_frame_phys; |
| uint64_t gicd_offset; |
| uint64_t gicc_offset; |
| uint64_t gich_offset; |
| uint64_t gicv_offset; |
| uint32_t ipi_base; |
| uint8_t optional; |
| uint8_t use_msi; |
| uint16_t reserved; |
| } dcfg_arm_gicv2_driver_t; |
| |
| // for KDRV_ARM_GIC_V3 |
| typedef struct { |
| uint64_t mmio_phys; |
| uint64_t gicd_offset; |
| uint64_t gicr_offset; |
| uint64_t gicr_stride; |
| uint64_t mx8_gpr_phys; |
| uint32_t ipi_base; |
| uint8_t optional; |
| uint8_t reserved[3]; |
| } dcfg_arm_gicv3_driver_t; |
| |
| // for KDRV_ARM_GENERIC_TIMER |
| typedef struct { |
| uint32_t irq_phys; |
| uint32_t irq_virt; |
| uint32_t irq_sphys; |
| uint32_t freq_override; |
| } dcfg_arm_generic_timer_driver_t; |
| |
| // for KDRV_AMLOGIC_HDCP |
| typedef struct { |
| uint64_t preset_phys; |
| uint64_t hiu_phys; |
| uint64_t hdmitx_phys; |
| } dcfg_amlogic_hdcp_driver_t; |
| |
| // for KDRV_AMLOGIC_RNG |
| typedef struct { |
| uint64_t rng_data_phys; |
| uint64_t rng_status_phys; |
| uint64_t rng_refresh_interval_usec; |
| } dcfg_amlogic_rng_driver_t; |
| |
| // Defines a register write action for a generic kernel watchdog driver. An |
| // action consists of the following steps. |
| // |
| // 1) Read from the register located a physical address |addr| |
| // 2) Clear all of the bits in the value which was read using the |clr_mask| |
| // 3) Set all of the bits in the value using the |set_mask| |
| // 4) Write this value back to the address located at addr. |
| // |
| typedef struct { |
| uint64_t addr; |
| uint32_t clr_mask; |
| uint32_t set_mask; |
| } dcfg_generic_32bit_watchdog_action_t; |
| |
| #define KDRV_GENERIC_32BIT_WATCHDOG_FLAG_ENABLED ((uint32_t)0x00000001) |
| #define KDRV_GENERIC_32BIT_WATCHDOG_MIN_PERIOD ZX_MSEC(1) |
| |
| // Definitions of actions which may be taken by a generic 32 bit watchdog timer |
| // kernel driver which may be passed by a bootloader. Field definitions are as |
| // follows. |
| // |
| // |pet_action| |
| // The address and masks needed to "pet" (aka, dismiss) a hardware watchdog timer. |
| // |
| // |enable_action| |
| // The address and masks needed to enable a hardware watchdog timer. If enable |
| // is an unsupported operation, the addr of the |enable_action| shall be zero. |
| // |
| // |disable_action| |
| // The address and masks needed to disable a hardware watchdog timer. If |
| // disable is an unsupported operation, the addr of the |disable_action| shall |
| // be zero. |
| // |
| // |watchdog_period_nsec| |
| // The period of the watchdog timer given in nanoseconds. When enabled, the |
| // watchdog timer driver must pet the watch dog at least this often. The value |
| // must be at least 1 mSec, typically much larger (on the order of a second or |
| // two) |
| // |
| // |flags| |
| // Storage for additional flags. Currently, only one flag is defined, |
| // "FLAG_ENABLED". When this flag is set, it indicates that the watchdog timer |
| // was left enabled by the bootloader at startup. |
| typedef struct { |
| dcfg_generic_32bit_watchdog_action_t pet_action; |
| dcfg_generic_32bit_watchdog_action_t enable_action; |
| dcfg_generic_32bit_watchdog_action_t disable_action; |
| zx_duration_t watchdog_period_nsec; |
| uint32_t flags; |
| uint32_t reserved; |
| } dcfg_generic_32bit_watchdog_t; |
| |
| #endif // SYSROOT_ZIRCON_BOOT_DRIVER_CONFIG_H_ |