Commit 7b5f3cbf authored by Lingbo Kong's avatar Lingbo Kong Committed by Kalle Valo
Browse files

wifi: ath12k: ACPI band edge channel power support



Currently, ath12k does not have the ability to set band edge channel power
for WCN7850. In order to support this, ath12k gets band edge channel power
table in ath12k_acpi_dsm_get_data() function and sets pdev_id and
param_type_id, then finally sends these data and
WMI_PDEV_SET_BIOS_INTERFACE_CMDID to firmware to set band edge channel
power.

Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0-03427-QCAHMTSWPL_V1.0_V2.0_SILICONZ-1.15378.4

Signed-off-by: default avatarLingbo Kong <quic_lingbok@quicinc.com>
Signed-off-by: default avatarKalle Valo <quic_kvalo@quicinc.com>
Link: https://msgid.link/20240422033054.979-5-quic_lingbok@quicinc.com
parent 12bccacb
Loading
Loading
Loading
Loading
+36 −0
Original line number Diff line number Diff line
@@ -91,6 +91,18 @@ static int ath12k_acpi_dsm_get_data(struct ath12k_base *ab, int func)
			memcpy(&ab->acpi.cca_data, obj->buffer.pointer,
			       obj->buffer.length);

			break;
		case ATH12K_ACPI_DSM_FUNC_INDEX_BAND_EDGE:
			if (obj->buffer.length != ATH12K_ACPI_DSM_BAND_EDGE_DATA_SIZE) {
				ath12k_warn(ab, "invalid ACPI DSM band edge data size: %d\n",
					    obj->buffer.length);
				ret = -EINVAL;
				goto out;
			}

			memcpy(&ab->acpi.band_edge_power, obj->buffer.pointer,
			       obj->buffer.length);

			break;
		}
	} else {
@@ -334,6 +346,30 @@ int ath12k_acpi_start(struct ath12k_base *ab)
		}
	}

	if (ATH12K_ACPI_FUNC_BIT_VALID(ab->acpi,
				       ATH12K_ACPI_FUNC_BIT_BAND_EDGE_CHAN_POWER)) {
		ret = ath12k_acpi_dsm_get_data(ab, ATH12K_ACPI_DSM_FUNC_INDEX_BAND_EDGE);
		if (ret) {
			ath12k_warn(ab, "failed to get ACPI DSM band edge channel power: %d\n",
				    ret);
			return ret;
		}

		if (ab->acpi.band_edge_power[0] == ATH12K_ACPI_BAND_EDGE_VERSION &&
		    ab->acpi.band_edge_power[1] == ATH12K_ACPI_BAND_EDGE_ENABLE_FLAG) {
			ret = ath12k_wmi_set_bios_cmd(ab,
						      WMI_BIOS_PARAM_TYPE_BANDEDGE,
						      ab->acpi.band_edge_power,
						      sizeof(ab->acpi.band_edge_power));
			if (ret) {
				ath12k_warn(ab,
					    "failed to set ACPI DSM band edge channel power: %d\n",
					    ret);
				return ret;
			}
		}
	}

	status = acpi_install_notify_handler(ACPI_HANDLE(ab->dev),
					     ACPI_DEVICE_NOTIFY,
					     ath12k_acpi_dsm_notify, ab);
+5 −0
Original line number Diff line number Diff line
@@ -14,12 +14,14 @@
#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_DSM_FUNC_INDEX_BAND_EDGE		10

#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_FUNC_BIT_BAND_EDGE_CHAN_POWER	BIT(9)

#define ATH12K_ACPI_NOTIFY_EVENT			0x86
#define ATH12K_ACPI_FUNC_BIT_VALID(_acdata, _func)	(((_acdata).func_bit) & (_func))
@@ -30,6 +32,8 @@
#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_BAND_EDGE_VERSION		0x1
#define ATH12K_ACPI_BAND_EDGE_ENABLE_FLAG	0x1

#define ATH12K_ACPI_GEO_OFFSET_DATA_OFFSET	1
#define ATH12K_ACPI_DBS_BACKOFF_DATA_OFFSET	2
@@ -41,6 +45,7 @@
#define ATH12K_ACPI_CCA_THR_OFFSET_LEN		36

#define ATH12K_ACPI_DSM_TAS_DATA_SIZE			69
#define ATH12K_ACPI_DSM_BAND_EDGE_DATA_SIZE		100
#define ATH12K_ACPI_DSM_TAS_CFG_SIZE			108

#define ATH12K_ACPI_DSM_GEO_OFFSET_DATA_SIZE (ATH12K_ACPI_GEO_OFFSET_DATA_OFFSET + \
+1 −0
Original line number Diff line number Diff line
@@ -916,6 +916,7 @@ struct ath12k_base {
		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];
		u8 band_edge_power[ATH12K_ACPI_DSM_BAND_EDGE_DATA_SIZE];
	} acpi;

#endif /* CONFIG_ACPI */
+4 −0
Original line number Diff line number Diff line
@@ -4808,6 +4808,10 @@ 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,

	/* bandedge control power */
	WMI_BIOS_PARAM_TYPE_BANDEDGE		= 3,

	WMI_BIOS_PARAM_TYPE_MAX,
};