/* De-Init of components as needed */
 }
 
+static void ath12k_core_check_bdfext(const struct dmi_header *hdr, void *data)
+{
+       struct ath12k_base *ab = data;
+       const char *magic = ATH12K_SMBIOS_BDF_EXT_MAGIC;
+       struct ath12k_smbios_bdf *smbios = (struct ath12k_smbios_bdf *)hdr;
+       ssize_t copied;
+       size_t len;
+       int i;
+
+       if (ab->qmi.target.bdf_ext[0] != '\0')
+               return;
+
+       if (hdr->type != ATH12K_SMBIOS_BDF_EXT_TYPE)
+               return;
+
+       if (hdr->length != ATH12K_SMBIOS_BDF_EXT_LENGTH) {
+               ath12k_dbg(ab, ATH12K_DBG_BOOT,
+                          "wrong smbios bdf ext type length (%d).\n",
+                          hdr->length);
+               return;
+       }
+
+       if (!smbios->bdf_enabled) {
+               ath12k_dbg(ab, ATH12K_DBG_BOOT, "bdf variant name not found.\n");
+               return;
+       }
+
+       /* Only one string exists (per spec) */
+       if (memcmp(smbios->bdf_ext, magic, strlen(magic)) != 0) {
+               ath12k_dbg(ab, ATH12K_DBG_BOOT,
+                          "bdf variant magic does not match.\n");
+               return;
+       }
+
+       len = min_t(size_t,
+                   strlen(smbios->bdf_ext), sizeof(ab->qmi.target.bdf_ext));
+       for (i = 0; i < len; i++) {
+               if (!isascii(smbios->bdf_ext[i]) || !isprint(smbios->bdf_ext[i])) {
+                       ath12k_dbg(ab, ATH12K_DBG_BOOT,
+                                  "bdf variant name contains non ascii chars.\n");
+                       return;
+               }
+       }
+
+       /* Copy extension name without magic prefix */
+       copied = strscpy(ab->qmi.target.bdf_ext, smbios->bdf_ext + strlen(magic),
+                        sizeof(ab->qmi.target.bdf_ext));
+       if (copied < 0) {
+               ath12k_dbg(ab, ATH12K_DBG_BOOT,
+                          "bdf variant string is longer than the buffer can accommodate\n");
+               return;
+       }
+
+       ath12k_dbg(ab, ATH12K_DBG_BOOT,
+                  "found and validated bdf variant smbios_type 0x%x bdf %s\n",
+                  ATH12K_SMBIOS_BDF_EXT_TYPE, ab->qmi.target.bdf_ext);
+}
+
+int ath12k_core_check_smbios(struct ath12k_base *ab)
+{
+       ab->qmi.target.bdf_ext[0] = '\0';
+       dmi_walk(ath12k_core_check_bdfext, ab);
+
+       if (ab->qmi.target.bdf_ext[0] == '\0')
+               return -ENODATA;
+
+       return 0;
+}
+
 static int ath12k_core_soc_create(struct ath12k_base *ab)
 {
        int ret;
 
 #include <linux/interrupt.h>
 #include <linux/irq.h>
 #include <linux/bitfield.h>
+#include <linux/dmi.h>
+#include <linux/ctype.h>
 #include "qmi.h"
 #include "htc.h"
 #include "wmi.h"
 /* Pending management packets threshold for dropping probe responses */
 #define ATH12K_PRB_RSP_DROP_THRESHOLD ((ATH12K_TX_MGMT_TARGET_MAX_SUPPORT_WMI * 3) / 4)
 
+/* SMBIOS type containing Board Data File Name Extension */
+#define ATH12K_SMBIOS_BDF_EXT_TYPE 0xF8
+
+/* SMBIOS type structure length (excluding strings-set) */
+#define ATH12K_SMBIOS_BDF_EXT_LENGTH 0x9
+
+/* The magic used by QCA spec */
+#define ATH12K_SMBIOS_BDF_EXT_MAGIC "BDF_"
+
 #define ATH12K_INVALID_HW_MAC_ID       0xFF
 #define        ATH12K_RX_RATE_TABLE_NUM        320
 #define        ATH12K_RX_RATE_TABLE_11AX_NUM   576
        struct net_device napi_ndev;
 };
 
+struct ath12k_smbios_bdf {
+       struct dmi_header hdr;
+       u32 padding;
+       u8 bdf_enabled;
+       u8 bdf_ext[];
+} __packed;
+
 #define HEHANDLE_CAP_PHYINFO_SIZE       3
 #define HECAP_PHYINFO_SIZE              9
 #define HECAP_MACINFO_SIZE              5
 int ath12k_core_fetch_bdf(struct ath12k_base *ath12k,
                          struct ath12k_board_data *bd);
 void ath12k_core_free_bdf(struct ath12k_base *ab, struct ath12k_board_data *bd);
-
+int ath12k_core_check_dt(struct ath12k_base *ath12k);
+int ath12k_core_check_smbios(struct ath12k_base *ab);
 void ath12k_core_halt(struct ath12k *ar);
 int ath12k_core_resume(struct ath12k_base *ab);
 int ath12k_core_suspend(struct ath12k_base *ab);