summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/drivers/wifi/generic/Makefile.inc2
-rw-r--r--src/drivers/wifi/generic/chip.h7
-rw-r--r--src/drivers/wifi/generic/generic.c31
-rw-r--r--src/drivers/wifi/generic/wifi.h10
-rw-r--r--src/mainboard/google/brya/variants/brya0/overridetree.cb4
-rw-r--r--src/soc/intel/alderlake/chip.h5
-rw-r--r--src/soc/intel/alderlake/romstage/fsp_params.c9
7 files changed, 55 insertions, 13 deletions
diff --git a/src/drivers/wifi/generic/Makefile.inc b/src/drivers/wifi/generic/Makefile.inc
index 5650d8ab6ffc..91f22d163ee3 100644
--- a/src/drivers/wifi/generic/Makefile.inc
+++ b/src/drivers/wifi/generic/Makefile.inc
@@ -1,6 +1,8 @@
ifeq ($(CONFIG_DRIVERS_WIFI_GENERIC),y)
+romstage-y += generic.c
+
ramstage-y += generic.c
ramstage-$(CONFIG_GENERATE_SMBIOS_TABLES) += smbios.c
ramstage-$(CONFIG_HAVE_ACPI_TABLES) += acpi.c
diff --git a/src/drivers/wifi/generic/chip.h b/src/drivers/wifi/generic/chip.h
index 907b260fa3cf..56a4afc5e487 100644
--- a/src/drivers/wifi/generic/chip.h
+++ b/src/drivers/wifi/generic/chip.h
@@ -12,6 +12,13 @@ struct drivers_wifi_generic_config {
/* When set to true, this will add a _DSD which contains a single
property, `DmaProperty`, set to 1, under the ACPI Device. */
bool is_untrusted;
+
+ /*
+ * Applicable for Intel chipsets that use CNVi WiFi only. Set this to 1
+ * to enable CNVi DDR RFIM (radio frequency interference mitigation);
+ * SoC code propagates this value the applicable FSP UPD.
+ */
+ bool enable_cnvi_ddr_rfim;
};
#endif /* _GENERIC_WIFI_H_ */
diff --git a/src/drivers/wifi/generic/generic.c b/src/drivers/wifi/generic/generic.c
index de93741f2733..a6936f1d11b5 100644
--- a/src/drivers/wifi/generic/generic.c
+++ b/src/drivers/wifi/generic/generic.c
@@ -7,6 +7,7 @@
#include <elog.h>
#include "chip.h"
#include "wifi_private.h"
+#include "wifi.h"
static void wifi_pci_dev_init(struct device *dev)
{
@@ -40,17 +41,39 @@ struct device_operations wifi_cnvi_ops = {
#endif
};
+static bool is_cnvi(const struct device *dev)
+{
+#if !DEVTREE_EARLY
+ return dev && dev->ops == &wifi_cnvi_ops;
+#else
+ return dev && dev->path.type != DEVICE_PATH_PCI;
+#endif
+}
+
+bool wifi_generic_cnvi_ddr_rfim_enabled(const struct device *dev)
+{
+ const struct drivers_wifi_generic_config *config;
+
+ if (!dev || !is_cnvi(dev) || !dev->chip_info)
+ return false;
+
+ config = dev->chip_info;
+ return config->enable_cnvi_ddr_rfim;
+}
+
static void wifi_generic_enable(struct device *dev)
{
- struct drivers_wifi_generic_config *config = dev ? dev->chip_info : NULL;
+ DEVTREE_CONST struct drivers_wifi_generic_config *config = dev ? dev->chip_info : NULL;
if (!config)
return;
- if (dev->path.type == DEVICE_PATH_PCI)
- dev->ops = &wifi_pcie_ops;
- else
+#if !DEVTREE_EARLY
+ if (is_cnvi(dev))
dev->ops = &wifi_cnvi_ops;
+ else
+ dev->ops = &wifi_pcie_ops;
+#endif
}
struct chip_operations drivers_wifi_generic_ops = {
diff --git a/src/drivers/wifi/generic/wifi.h b/src/drivers/wifi/generic/wifi.h
new file mode 100644
index 000000000000..54acfa440fb1
--- /dev/null
+++ b/src/drivers/wifi/generic/wifi.h
@@ -0,0 +1,10 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#include <device/device.h>
+
+#ifndef _WIFI_GENERIC_WIFI_H_
+#define _WIFI_GENERIC_WIFI_H_
+
+bool wifi_generic_cnvi_ddr_rfim_enabled(const struct device *dev);
+
+#endif /* _WIFI_GENERIC_WIFI_H_ */
diff --git a/src/mainboard/google/brya/variants/brya0/overridetree.cb b/src/mainboard/google/brya/variants/brya0/overridetree.cb
index 60d04696f7be..f621b127aa67 100644
--- a/src/mainboard/google/brya/variants/brya0/overridetree.cb
+++ b/src/mainboard/google/brya/variants/brya0/overridetree.cb
@@ -45,9 +45,6 @@ chip soc/intel/alderlake
register "typec_aux_bias_pads[0]" = "{.pad_auxp_dc = GPP_E22, .pad_auxn_dc = GPP_E23}"
- # Enable CNVi DDR RFIM
- register "CnviDdrRfim" = "1"
-
# FIVR configurations for brya are disabled since the board doesn't have V1p05 and Vnn
# bypass rails implemented.
register "ext_fivr_settings" = "{
@@ -187,6 +184,7 @@ chip soc/intel/alderlake
device ref cnvi_wifi on
chip drivers/wifi/generic
register "wake" = "GPE0_PME_B0"
+ register "enable_cnvi_ddr_rfim" = "true"
device generic 0 on end
end
end
diff --git a/src/soc/intel/alderlake/chip.h b/src/soc/intel/alderlake/chip.h
index 67664061c884..7a169025e4f4 100644
--- a/src/soc/intel/alderlake/chip.h
+++ b/src/soc/intel/alderlake/chip.h
@@ -559,11 +559,6 @@ struct soc_intel_alderlake_config {
* 0: Fast/2, 1: Fast/4, 2: Fast/8, 3: Fast/16; see enum slew_rate for values
*/
uint8_t SlowSlewRate[NUM_VR_DOMAINS];
-
- /* CNVi DDR RFIM Enable/Disable
- * Default 0. Setting this to 1 enable CNVi DDR RFIM.
- */
- bool CnviDdrRfim;
};
typedef struct soc_intel_alderlake_config config_t;
diff --git a/src/soc/intel/alderlake/romstage/fsp_params.c b/src/soc/intel/alderlake/romstage/fsp_params.c
index e0f5eb79e7ef..3483abddd732 100644
--- a/src/soc/intel/alderlake/romstage/fsp_params.c
+++ b/src/soc/intel/alderlake/romstage/fsp_params.c
@@ -5,6 +5,7 @@
#include <cpu/x86/msr.h>
#include <cpu/intel/cpu_ids.h>
#include <device/device.h>
+#include <drivers/wifi/generic/wifi.h>
#include <fsp/util.h>
#include <intelblocks/cpulib.h>
#include <intelblocks/pcie_rp.h>
@@ -208,7 +209,13 @@ static void fill_fspm_misc_params(FSP_M_CONFIG *m_cfg,
m_cfg->GpioOverride = 0x1;
/* CNVi DDR RFI Mitigation */
- m_cfg->CnviDdrRfim = config->CnviDdrRfim;
+ const struct device_path path[] = {
+ { .type = DEVICE_PATH_PCI, .pci.devfn = PCH_DEVFN_CNVI_WIFI },
+ { .type = DEVICE_PATH_GENERIC, .generic.id = 0 } };
+ const struct device *dev = find_dev_nested_path(pci_root_bus(), path,
+ ARRAY_SIZE(path));
+ if (is_dev_enabled(dev))
+ m_cfg->CnviDdrRfim = wifi_generic_cnvi_ddr_rfim_enabled(dev);
}
static void fill_fspm_audio_params(FSP_M_CONFIG *m_cfg,