kfree(data);
        return ret;
 }
-IWL_EXPORT_SYMBOL(iwl_acpi_get_ppag_table);
 
 void iwl_acpi_get_phy_filters(struct iwl_fw_runtime *fwrt,
                              struct iwl_phy_specific_cfg *filters)
 
 IWL_BIOS_TABLE_LOADER(wrds);
 IWL_BIOS_TABLE_LOADER(ewrd);
 IWL_BIOS_TABLE_LOADER(wgds);
+IWL_BIOS_TABLE_LOADER(ppag);
 
 static const struct dmi_system_id dmi_ppag_approved_list[] = {
        { .ident = "HP",
 
 
 int iwl_bios_get_wgds_table(struct iwl_fw_runtime *fwrt);
 
+int iwl_bios_get_ppag_table(struct iwl_fw_runtime *fwrt);
 #endif /* __fw_regulatory_h__ */
 
        u32 geo_rev;
        u32 geo_num_profiles;
        bool geo_enabled;
-#ifdef CONFIG_ACPI
        struct iwl_ppag_chain ppag_chains[IWL_NUM_CHAIN_LIMITS];
        u32 ppag_flags;
        u32 ppag_ver;
+#ifdef CONFIG_ACPI
        struct iwl_sar_offset_mapping_cmd sgom_table;
        bool sgom_enabled;
        struct iwl_uats_table_cmd uats_table;
 
        kfree(data);
        return ret;
 }
+
+int iwl_uefi_get_ppag_table(struct iwl_fw_runtime *fwrt)
+{
+       struct uefi_cnv_var_ppag *data;
+       int ret = 0;
+
+       data = iwl_uefi_get_verified_variable(fwrt->trans, IWL_UEFI_PPAG_NAME,
+                                             "PPAG", sizeof(*data), NULL);
+       if (IS_ERR(data))
+               return -EINVAL;
+
+       if (data->revision < IWL_UEFI_MIN_PPAG_REV ||
+           data->revision > IWL_UEFI_MAX_PPAG_REV) {
+               ret = -EINVAL;
+               IWL_DEBUG_RADIO(fwrt, "Unsupported UEFI PPAG revision:%d\n",
+                               data->revision);
+               goto out;
+       }
+
+       fwrt->ppag_ver = data->revision;
+       fwrt->ppag_flags = data->ppag_modes & IWL_PPAG_ETSI_CHINA_MASK;
+
+       BUILD_BUG_ON(sizeof(fwrt->ppag_chains) != sizeof(data->ppag_chains));
+       memcpy(&fwrt->ppag_chains, &data->ppag_chains,
+              sizeof(data->ppag_chains));
+out:
+       kfree(data);
+       return ret;
+}
 
 #define IWL_UEFI_WRDS_NAME             L"UefiCnvWlanWRDS"
 #define IWL_UEFI_EWRD_NAME             L"UefiCnvWlanEWRD"
 #define IWL_UEFI_WGDS_NAME             L"UefiCnvWlanWGDS"
+#define IWL_UEFI_PPAG_NAME             L"UefiCnvWlanPPAG"
 
 #define IWL_SGOM_MAP_SIZE              339
 #define IWL_UATS_MAP_SIZE              339
 #define IWL_UEFI_WRDS_REVISION         2
 #define IWL_UEFI_EWRD_REVISION         2
 #define IWL_UEFI_WGDS_REVISION         3
+#define IWL_UEFI_MIN_PPAG_REV          1
+#define IWL_UEFI_MAX_PPAG_REV          3
 
 struct pnvm_sku_package {
        u8 rev;
        struct iwl_geo_profile geo_profiles[BIOS_GEO_MAX_PROFILE_NUM];
 } __packed;
 
+/*
+ * struct uefi_cnv_var_ppag - PPAG table as defined in UEFI
+ * @revision: the revision of the table
+ * @ppag_modes: bit 0 - PPAG is enabled/disabled in ETSI,
+ *     bit 1 - PPAG is enabled/disabled in China
+ * @ppag_chains: the PPAG values per chain and band
+ */
+struct uefi_cnv_var_ppag {
+       u8 revision;
+       u32 ppag_modes;
+       struct iwl_ppag_chain ppag_chains[IWL_NUM_CHAIN_LIMITS];
+} __packed;
+
 /*
  * This is known to be broken on v4.19 and to work on v5.4.  Until we
  * figure out why this is the case and how to make it work, simply
 int iwl_uefi_get_wrds_table(struct iwl_fw_runtime *fwrt);
 int iwl_uefi_get_ewrd_table(struct iwl_fw_runtime *fwrt);
 int iwl_uefi_get_wgds_table(struct iwl_fw_runtime *fwrt);
+int iwl_uefi_get_ppag_table(struct iwl_fw_runtime *fwrt);
 #else /* CONFIG_EFI */
 static inline void *iwl_uefi_get_pnvm(struct iwl_trans *trans, size_t *len)
 {
 {
        return -ENOENT;
 }
+
+static inline int iwl_uefi_get_ppag_table(struct iwl_fw_runtime *fwrt)
+{
+       return -ENOENT;
+}
 #endif /* CONFIG_EFI */
 
 #if defined(CONFIG_EFI) && defined(CONFIG_ACPI)
 
        return iwl_mvm_send_cmd_pdu(mvm, cmd_id, 0, len, &cmd);
 }
 
-#ifdef CONFIG_ACPI
-
 int iwl_mvm_ppag_send_cmd(struct iwl_mvm *mvm)
 {
        union iwl_ppag_table_cmd cmd;
        return iwl_mvm_ppag_send_cmd(mvm);
 }
 
+#ifdef CONFIG_ACPI
+
 static const struct dmi_system_id dmi_tas_approved_list[] = {
        { .ident = "HP",
          .matches = {
 
 #else /* CONFIG_ACPI */
 
-int iwl_mvm_ppag_send_cmd(struct iwl_mvm *mvm)
-{
-       return -ENOENT;
-}
-
-static int iwl_mvm_ppag_init(struct iwl_mvm *mvm)
-{
-       return 0;
-}
-
 static void iwl_mvm_tas_init(struct iwl_mvm *mvm)
 {
 }
        iwl_acpi_get_guid_lock_status(&mvm->fwrt);
 
        /* read PPAG table */
-       ret = iwl_acpi_get_ppag_table(&mvm->fwrt);
+       ret = iwl_bios_get_ppag_table(&mvm->fwrt);
        if (ret < 0) {
                IWL_DEBUG_RADIO(mvm,
                                "PPAG BIOS table invalid or unavailable. (%d)\n",