diff --git a/NOTES b/NOTES new file mode 100644 index 000000000000..62a82c1f3f92 --- /dev/null +++ b/NOTES @@ -0,0 +1 @@ +- PWR0 for RPI5? diff --git a/sys/arch/arm/acpi/acpi_platform.c b/sys/arch/arm/acpi/acpi_platform.c index 47b7e0412bb7..92eff2b4f675 100644 --- a/sys/arch/arm/acpi/acpi_platform.c +++ b/sys/arch/arm/acpi/acpi_platform.c @@ -31,6 +31,7 @@ #include "com.h" #include "plcom.h" +#include "opt_console.h" #include "opt_efi.h" #include "opt_multiprocessor.h" @@ -90,6 +91,39 @@ __KERNEL_RCSID(0, "$NetBSD: acpi_platform.c,v 1.40 2025/10/04 04:12:37 thorpej E #define SPCR_BAUD_57600 6 #define SPCR_BAUD_115200 7 +#ifdef CONSADDR +#define ACPI_CORE_VBASE KERNEL_IO_VBASE +#define ACPI_CORE_PBASE L2_TRUNC_BLOCK(CONSADDR) +#define ACPI_CORE_SIZE 0x08000000 + +#define ACPI_CORE_PTOV(p) (((p) - ACPI_CORE_PBASE) + ACPI_CORE_VBASE) + +#define ACPI_UART_BASE CONSADDR + + +void acpi_platform_early_putchar(char); + +void __noasan +acpi_platform_early_putchar(char c) +{ + volatile uint32_t *uartaddr = cpu_earlydevice_va_p() ? + (volatile uint32_t *)ACPI_CORE_PTOV(ACPI_UART_BASE) : + (volatile uint32_t *)ACPI_UART_BASE; + + while ((le32toh(uartaddr[PL01XCOM_FR / 4]) & PL01X_FR_TXFF) != 0) + continue; + + uartaddr[PL01XCOM_DR / 4] = htole32(c); + dsb(sy); + + while ((le32toh(uartaddr[PL01XCOM_FR / 4]) & PL01X_FR_TXFE) == 0) + continue; +} + +#endif + + + static const struct acpi_spcr_baud_rate { uint8_t id; int baud_rate; @@ -134,6 +168,11 @@ static const struct pmap_devmap * acpi_platform_devmap(void) { static const struct pmap_devmap devmap[] = { +#ifdef CONSADDR + DEVMAP_ENTRY(ACPI_CORE_VBASE, + ACPI_CORE_PBASE, + ACPI_CORE_SIZE), +#endif DEVMAP_ENTRY_END }; diff --git a/sys/dev/acpi/sdhc_acpi.c b/sys/dev/acpi/sdhc_acpi.c index bb58a497b724..db206f7eccb6 100644 --- a/sys/dev/acpi/sdhc_acpi.c +++ b/sys/dev/acpi/sdhc_acpi.c @@ -111,6 +111,13 @@ static const struct sdhc_acpi_slot { SDHC_FLAG_NO_PWR0 | SDHC_FLAG_SINGLE_POWER_WRITE }, + /* Broadcom BRCM5D12 (eMMC/SD on Raspberry Pi 5) */ + { .hid = "BRCM5D12", .uid = "0", .type = SLOT_TYPE_SD, + .flags = SDHC_FLAG_NO_PWR0 }, + { .hid = "BRCM5D12", .uid = "1", .type = SLOT_TYPE_EMMC, + .flags = SDHC_FLAG_NO_PWR0 }, + { .hid = "BRCM5D12", .type = SLOT_TYPE_EMMC }, + /* Generic IDs last */ { .hid = "PNP0D40", .type = SLOT_TYPE_SD }, { .hid = "PNP0FFF", .uid = "3", .type = SLOT_TYPE_SD }, @@ -133,6 +140,7 @@ sdhc_acpi_find_slot(ACPI_DEVICE_INFO *ad) slot = &sdhc_acpi_slot_map[i]; const char * const slot_id[] = { slot->hid, NULL }; if (acpi_match_hid(ad, slot_id)) { +printf("%s: hid >%s< uid >%s< flags %x\n", __func__, slot->hid, slot->uid, slot->flags); if (slot->uid == NULL || ((ad->Valid & ACPI_VALID_UID) != 0 && uid != NULL && @@ -179,6 +187,20 @@ sdhc_acpi_attach(device_t parent, device_t self, void *opaque) if (slot->type == SLOT_TYPE_EMMC) sc->sc.sc_vendor_hw_reset = sdhc_acpi_intel_emmc_hw_reset; +#if 1 + /* Workaround: some boards (e.g. BRCM5D12) don't expose 1.8V control + * via ACPI. Disable 1.8V support so the host won't attempt voltage + * switching which causes SDIO CMD5 to time out. */ + if ((aa->aa_node->ad_devinfo->Valid & ACPI_VALID_HID) && + aa->aa_node->ad_devinfo->HardwareId.String != NULL && + strcmp(aa->aa_node->ad_devinfo->HardwareId.String, "BRCM5D12") == 0) { + sc->sc.sc_flags |= SDHC_FLAG_NO_1_8_V; + aprint_verbose_dev(self, "sdhc: applying BRCM5D12 quirk, disabling 1.8V\n"); + sc->sc.sc_flags |= SDHC_FLAG_NO_PWR0; + aprint_verbose_dev(self, "sdhc: applying BRCM5D12 quirk, applying NO_PWR0\n"); + } +#endif + rv = acpi_dsm_query(sc->sc_handle, sdhc_acpi_rockchip_dsm_uuid, ROCKCHIP_DSM_REV, &funcs); if (ACPI_SUCCESS(rv) && diff --git a/sys/dev/sdmmc/if_bwfm_sdio.c b/sys/dev/sdmmc/if_bwfm_sdio.c index a9326fde603b..449692b5f7dd 100644 --- a/sys/dev/sdmmc/if_bwfm_sdio.c +++ b/sys/dev/sdmmc/if_bwfm_sdio.c @@ -297,6 +297,11 @@ static const struct bwfm_sdio_product { SDMMC_PRODUCT_BROADCOM_BCM4334, SDMMC_CIS_BROADCOM_BCM4334 }, + { + SDMMC_VENDOR_BROADCOM, + SDMMC_PRODUCT_BROADCOM_BCM4345, + SDMMC_CIS_BROADCOM_BCM4345 + }, { SDMMC_VENDOR_BROADCOM, SDMMC_PRODUCT_BROADCOM_BCM43143,