ab->acpi.bit_flag = obj->integer.value;
                        break;
                }
+       } else if (obj->type == ACPI_TYPE_STRING) {
+               switch (func) {
+               case ATH12K_ACPI_DSM_FUNC_BDF_EXT:
+                       if (obj->string.length <= ATH12K_ACPI_BDF_ANCHOR_STRING_LEN ||
+                           obj->string.length > ATH12K_ACPI_BDF_MAX_LEN ||
+                           memcmp(obj->string.pointer, ATH12K_ACPI_BDF_ANCHOR_STRING,
+                                  ATH12K_ACPI_BDF_ANCHOR_STRING_LEN)) {
+                               ath12k_warn(ab, "invalid ACPI DSM BDF size: %d\n",
+                                           obj->string.length);
+                               ret = -EINVAL;
+                               goto out;
+                       }
+
+                       memcpy(ab->acpi.bdf_string, obj->string.pointer,
+                              obj->buffer.length);
+
+                       break;
+               }
        } else if (obj->type == ACPI_TYPE_BUFFER) {
                switch (func) {
                case ATH12K_ACPI_DSM_FUNC_SUPPORT_FUNCS:
        ab->acpi.acpi_bios_sar_enable = false;
        ab->acpi.acpi_cca_enable = false;
        ab->acpi.acpi_band_edge_enable = false;
+       ab->acpi.acpi_enable_bdf = false;
+       ab->acpi.bdf_string[0] = '\0';
 
        if (!ab->hw_params->acpi_guid)
                /* not supported with this hardware */
                        ab->acpi.acpi_disable_rfkill = true;
        }
 
+       if (ATH12K_ACPI_FUNC_BIT_VALID(ab->acpi, ATH12K_ACPI_FUNC_BIT_BDF_EXT)) {
+               ret = ath12k_acpi_dsm_get_data(ab, ATH12K_ACPI_DSM_FUNC_BDF_EXT);
+               if (ret || ab->acpi.bdf_string[0] == '\0') {
+                       ath12k_warn(ab, "failed to get ACPI BDF EXT: %d\n", ret);
+                       return ret;
+               }
+
+               ab->acpi.acpi_enable_bdf = true;
+       }
+
        if (ATH12K_ACPI_FUNC_BIT_VALID(ab->acpi, ATH12K_ACPI_FUNC_BIT_TAS_CFG)) {
                ret = ath12k_acpi_dsm_get_data(ab, ATH12K_ACPI_DSM_FUNC_TAS_CFG);
                if (ret) {
        return 0;
 }
 
+int ath12k_acpi_check_bdf_variant_name(struct ath12k_base *ab)
+{
+       size_t max_len = sizeof(ab->qmi.target.bdf_ext);
+
+       if (!ab->acpi.acpi_enable_bdf)
+               return -ENODATA;
+
+       if (strscpy(ab->qmi.target.bdf_ext, ab->acpi.bdf_string + 4, max_len) < 0)
+               ath12k_dbg(ab, ATH12K_DBG_BOOT,
+                          "acpi bdf variant longer than the buffer (variant: %s)\n",
+                          ab->acpi.bdf_string);
+
+       return 0;
+}
+
 void ath12k_acpi_stop(struct ath12k_base *ab)
 {
        if (!ab->acpi.started)
 
 
 #define ATH12K_ACPI_DSM_FUNC_SUPPORT_FUNCS     0
 #define ATH12K_ACPI_DSM_FUNC_DISABLE_FLAG      2
+#define ATH12K_ACPI_DSM_FUNC_BDF_EXT           3
 #define ATH12K_ACPI_DSM_FUNC_BIOS_SAR          4
 #define ATH12K_ACPI_DSM_FUNC_GEO_OFFSET                5
 #define ATH12K_ACPI_DSM_FUNC_INDEX_CCA         6
 #define ATH12K_ACPI_DSM_FUNC_INDEX_BAND_EDGE           10
 
 #define ATH12K_ACPI_FUNC_BIT_DISABLE_FLAG              BIT(1)
+#define ATH12K_ACPI_FUNC_BIT_BDF_EXT                   BIT(2)
 #define ATH12K_ACPI_FUNC_BIT_BIOS_SAR                  BIT(3)
 #define ATH12K_ACPI_FUNC_BIT_GEO_OFFSET                        BIT(4)
 #define ATH12K_ACPI_FUNC_BIT_CCA                       BIT(5)
 #define ATH12K_ACPI_DSM_DISABLE_11BE_BIT       BIT(0)
 #define ATH12K_ACPI_DSM_DISABLE_RFKILL_BIT     BIT(2)
 
+#define ATH12K_ACPI_BDF_ANCHOR_STRING_LEN      3
+#define ATH12K_ACPI_BDF_ANCHOR_STRING          "BDF"
+#define ATH12K_ACPI_BDF_MAX_LEN                        100
+
 #define ATH12K_ACPI_DSM_GEO_OFFSET_DATA_SIZE (ATH12K_ACPI_GEO_OFFSET_DATA_OFFSET + \
                                              ATH12K_ACPI_BIOS_SAR_GEO_OFFSET_LEN)
 #define ATH12K_ACPI_DSM_BIOS_SAR_DATA_SIZE (ATH12K_ACPI_POWER_LIMIT_DATA_OFFSET + \
 bool ath12k_acpi_get_disable_rfkill(struct ath12k_base *ab);
 bool ath12k_acpi_get_disable_11be(struct ath12k_base *ab);
 void ath12k_acpi_set_dsm_func(struct ath12k_base *ab);
+int ath12k_acpi_check_bdf_variant_name(struct ath12k_base *ab);
 
 #else
 
 {
 }
 
+static inline int ath12k_acpi_check_bdf_variant_name(struct ath12k_base *ab)
+{
+       return 0;
+}
+
 #endif /* CONFIG_ACPI */
 
 #endif /* ATH12K_ACPI_H */