^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * soc-intel-quirks.h - prototypes for quirk autodetection
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (c) 2019, Intel Corporation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #ifndef _SND_SOC_INTEL_QUIRKS_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #define _SND_SOC_INTEL_QUIRKS_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #if IS_ENABLED(CONFIG_X86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/dmi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <asm/cpu_device_id.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <asm/intel-family.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <asm/iosf_mbi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define SOC_INTEL_IS_CPU(soc, type) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) static inline bool soc_intel_is_##soc(void) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) static const struct x86_cpu_id soc##_cpu_ids[] = { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) X86_MATCH_INTEL_FAM6_MODEL(type, NULL), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) {} \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) }; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) const struct x86_cpu_id *id; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) id = x86_match_cpu(soc##_cpu_ids); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) if (id) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) return true; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) return false; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) SOC_INTEL_IS_CPU(byt, ATOM_SILVERMONT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) SOC_INTEL_IS_CPU(cht, ATOM_AIRMONT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) SOC_INTEL_IS_CPU(apl, ATOM_GOLDMONT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) SOC_INTEL_IS_CPU(glk, ATOM_GOLDMONT_PLUS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) SOC_INTEL_IS_CPU(cml, KABYLAKE_L);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) static inline bool soc_intel_is_byt_cr(struct platform_device *pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) * List of systems which:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) * 1. Use a non CR version of the Bay Trail SoC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) * 2. Contain at least 6 interrupt resources so that the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) * platform_get_resource(pdev, IORESOURCE_IRQ, 5) check below
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) * succeeds
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) * 3. Despite 1. and 2. still have their IPC IRQ at index 0 rather then 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) * This needs to be here so that it can be shared between the SST and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) * SOF drivers. We rely on the compiler to optimize this out in files
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) * where soc_intel_is_byt_cr is not used.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) static const struct dmi_system_id force_bytcr_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) { /* Lenovo Yoga Tablet 2 series */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) .matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) DMI_MATCH(DMI_PRODUCT_FAMILY, "YOGATablet2"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) struct device *dev = &pdev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) int status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) if (!soc_intel_is_byt())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) if (dmi_check_system(force_bytcr_table))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) if (iosf_mbi_available()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) u32 bios_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) status = iosf_mbi_read(BT_MBI_UNIT_PMC, /* 0x04 PUNIT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) MBI_REG_READ, /* 0x10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) 0x006, /* BIOS_CONFIG */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) &bios_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) dev_err(dev, "could not read PUNIT BIOS_CONFIG\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) /* bits 26:27 mirror PMIC options */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) bios_status = (bios_status >> 26) & 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) if (bios_status == 1 || bios_status == 3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) dev_info(dev, "Detected Baytrail-CR platform\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) dev_info(dev, "BYT-CR not detected\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) dev_info(dev, "IOSF_MBI not available, no BYT-CR detection\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) if (!platform_get_resource(pdev, IORESOURCE_IRQ, 5)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) * Some devices detected as BYT-T have only a single IRQ listed,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) * causing platform_get_irq with index 5 to return -ENXIO.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) * The correct IRQ in this case is at index 0, as on BYT-CR.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) dev_info(dev, "Falling back to Baytrail-CR platform\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) static inline bool soc_intel_is_byt_cr(struct platform_device *pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) static inline bool soc_intel_is_byt(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) static inline bool soc_intel_is_cht(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) static inline bool soc_intel_is_apl(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) static inline bool soc_intel_is_glk(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) static inline bool soc_intel_is_cml(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) #endif /* _SND_SOC_INTEL_QUIRKS_H */