memcpy(&ab->acpi.geo_offset_data, obj->buffer.pointer,
                               obj->buffer.length);
 
+                       break;
+               case ATH12K_ACPI_DSM_FUNC_INDEX_CCA:
+                       if (obj->buffer.length != ATH12K_ACPI_DSM_CCA_DATA_SIZE) {
+                               ath12k_warn(ab, "invalid ACPI DSM CCA data size: %d\n",
+                                           obj->buffer.length);
+                               ret = -EINVAL;
+                               goto out;
+                       }
+
+                       memcpy(&ab->acpi.cca_data, obj->buffer.pointer,
+                              obj->buffer.length);
+
                        break;
                }
        } else {
 int ath12k_acpi_start(struct ath12k_base *ab)
 {
        acpi_status status;
+       u8 *buf;
        int ret;
 
        if (!ab->hw_params->acpi_guid)
                        return ret;
        }
 
+       if (ATH12K_ACPI_FUNC_BIT_VALID(ab->acpi, ATH12K_ACPI_FUNC_BIT_CCA)) {
+               ret = ath12k_acpi_dsm_get_data(ab, ATH12K_ACPI_DSM_FUNC_INDEX_CCA);
+               if (ret) {
+                       ath12k_warn(ab, "failed to get ACPI DSM CCA threshold configuration: %d\n",
+                                   ret);
+                       return ret;
+               }
+
+               if (ab->acpi.cca_data[0] == ATH12K_ACPI_CCA_THR_VERSION &&
+                   ab->acpi.cca_data[ATH12K_ACPI_CCA_THR_OFFSET_DATA_OFFSET] ==
+                   ATH12K_ACPI_CCA_THR_ENABLE_FLAG) {
+                       buf = ab->acpi.cca_data + ATH12K_ACPI_CCA_THR_OFFSET_DATA_OFFSET;
+                       ret = ath12k_wmi_set_bios_cmd(ab,
+                                                     WMI_BIOS_PARAM_CCA_THRESHOLD_TYPE,
+                                                     buf,
+                                                     ATH12K_ACPI_CCA_THR_OFFSET_LEN);
+                       if (ret) {
+                               ath12k_warn(ab, "failed to set ACPI DSM CCA threshold: %d\n",
+                                           ret);
+                               return ret;
+                       }
+               }
+       }
+
        status = acpi_install_notify_handler(ACPI_HANDLE(ab->dev),
                                             ACPI_DEVICE_NOTIFY,
                                             ath12k_acpi_dsm_notify, ab);
 
 #define ATH12K_ACPI_DSM_FUNC_SUPPORT_FUNCS     0
 #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_TAS_CFG           8
 #define ATH12K_ACPI_DSM_FUNC_TAS_DATA          9
 
 #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_FUNC_BIT_TAS_CFG                   BIT(7)
 #define ATH12K_ACPI_FUNC_BIT_TAS_DATA                  BIT(8)
 
 #define ATH12K_ACPI_TAS_DATA_ENABLE            0x1
 #define ATH12K_ACPI_POWER_LIMIT_VERSION                0x1
 #define ATH12K_ACPI_POWER_LIMIT_ENABLE_FLAG    0x1
+#define ATH12K_ACPI_CCA_THR_VERSION            0x1
+#define ATH12K_ACPI_CCA_THR_ENABLE_FLAG                0x1
 
 #define ATH12K_ACPI_GEO_OFFSET_DATA_OFFSET     1
 #define ATH12K_ACPI_DBS_BACKOFF_DATA_OFFSET    2
+#define ATH12K_ACPI_CCA_THR_OFFSET_DATA_OFFSET 5
 #define ATH12K_ACPI_BIOS_SAR_DBS_BACKOFF_LEN   10
 #define ATH12K_ACPI_POWER_LIMIT_DATA_OFFSET    12
 #define ATH12K_ACPI_BIOS_SAR_GEO_OFFSET_LEN    18
 #define ATH12K_ACPI_BIOS_SAR_TABLE_LEN         22
+#define ATH12K_ACPI_CCA_THR_OFFSET_LEN         36
 
 #define ATH12K_ACPI_DSM_TAS_DATA_SIZE                  69
 #define ATH12K_ACPI_DSM_TAS_CFG_SIZE                   108
                                              ATH12K_ACPI_BIOS_SAR_GEO_OFFSET_LEN)
 #define ATH12K_ACPI_DSM_BIOS_SAR_DATA_SIZE (ATH12K_ACPI_POWER_LIMIT_DATA_OFFSET + \
                                            ATH12K_ACPI_BIOS_SAR_TABLE_LEN)
+#define ATH12K_ACPI_DSM_CCA_DATA_SIZE (ATH12K_ACPI_CCA_THR_OFFSET_DATA_OFFSET + \
+                                      ATH12K_ACPI_CCA_THR_OFFSET_LEN)
 
 #ifdef CONFIG_ACPI
 
 
                u8 tas_sar_power_table[ATH12K_ACPI_DSM_TAS_DATA_SIZE];
                u8 bios_sar_data[ATH12K_ACPI_DSM_BIOS_SAR_DATA_SIZE];
                u8 geo_offset_data[ATH12K_ACPI_DSM_GEO_OFFSET_DATA_SIZE];
+               u8 cca_data[ATH12K_ACPI_DSM_CCA_DATA_SIZE];
        } acpi;
 
 #endif /* CONFIG_ACPI */
 
 } __packed;
 
 enum wmi_bios_param_type {
+       WMI_BIOS_PARAM_CCA_THRESHOLD_TYPE       = 0,
        WMI_BIOS_PARAM_TAS_CONFIG_TYPE          = 1,
        WMI_BIOS_PARAM_TAS_DATA_TYPE            = 2,
        WMI_BIOS_PARAM_TYPE_MAX,