/* SPDX-License-Identifier: GPL-2.0-only */ #include #include #include #include #include #define SOCKET_TYPE_SHIFT 28 #define SOCKET_TYPSE_MASK (0xf << SOCKET_TYPE_SHIFT) static enum socket_type get_socket_type(void) { uint32_t ebx = cpuid_ebx(0x80000001); ebx = (ebx & SOCKET_TYPSE_MASK) >> SOCKET_TYPE_SHIFT; return (enum socket_type)ebx; } void print_socket_type(void) { enum socket_type socket = get_socket_type(); printk(BIOS_INFO, "Socket type: "); switch (socket) { case SOCKET_FP5: printk(BIOS_INFO, "FP5\n"); break; case SOCKET_AM4: printk(BIOS_INFO, "AM4\n"); break; case SOCKET_FT5: printk(BIOS_INFO, "FT5\n"); break; default: printk(BIOS_INFO, "unknown\n"); } } bool soc_is_pollock(void) { return soc_is_zen_plus() && get_socket_type() == SOCKET_FT5; } /* * TODO: This detection works for the Dali SKUs used in Chrome-devices, but fails for other * Dali SKUs, since other Dali SKUs have a Zen+ CPUID and not a Raven2 one. */ bool soc_is_dali(void) { return soc_is_raven2() && get_socket_type() == SOCKET_FP5; } bool soc_is_picasso(void) { return soc_is_zen_plus() && get_socket_type() == SOCKET_FP5; } bool soc_is_raven2(void) { /* mask lower model number nibble and stepping */ return cpuid_eax(1) >> 8 == RAVEN2_CPUID >> 8; } bool soc_is_zen_plus(void) { /* mask lower model number nibble and stepping */ return cpuid_eax(1) >> 8 == PICASSO_CPUID >> 8; }