@@ -169,7 +169,7 @@ int iwl_acpi_get_dsm(struct iwl_fw_runtime *fwrt,
169169
170170 BUILD_BUG_ON (ARRAY_SIZE (acpi_dsm_size ) != DSM_FUNC_NUM_FUNCS );
171171
172- if (WARN_ON (func >= ARRAY_SIZE (acpi_dsm_size )))
172+ if (WARN_ON (func >= ARRAY_SIZE (acpi_dsm_size ) || ! func ))
173173 return - EINVAL ;
174174
175175 expected_size = acpi_dsm_size [func ];
@@ -178,6 +178,29 @@ int iwl_acpi_get_dsm(struct iwl_fw_runtime *fwrt,
178178 if (expected_size != sizeof (u8 ) && expected_size != sizeof (u32 ))
179179 return - EOPNOTSUPP ;
180180
181+ if (!fwrt -> acpi_dsm_funcs_valid ) {
182+ ret = iwl_acpi_get_dsm_integer (fwrt -> dev , ACPI_DSM_REV ,
183+ DSM_FUNC_QUERY ,
184+ & iwl_guid , & tmp ,
185+ acpi_dsm_size [DSM_FUNC_QUERY ]);
186+ if (ret ) {
187+ /* always indicate BIT(0) to avoid re-reading */
188+ fwrt -> acpi_dsm_funcs_valid = BIT (0 );
189+ return ret ;
190+ }
191+
192+ IWL_DEBUG_RADIO (fwrt , "ACPI DSM validity bitmap 0x%x\n" ,
193+ (u32 )tmp );
194+ /* always indicate BIT(0) to avoid re-reading */
195+ fwrt -> acpi_dsm_funcs_valid = tmp | BIT (0 );
196+ }
197+
198+ if (!(fwrt -> acpi_dsm_funcs_valid & BIT (func ))) {
199+ IWL_DEBUG_RADIO (fwrt , "ACPI DSM %d not indicated as valid\n" ,
200+ func );
201+ return - ENODATA ;
202+ }
203+
181204 ret = iwl_acpi_get_dsm_integer (fwrt -> dev , ACPI_DSM_REV , func ,
182205 & iwl_guid , & tmp , expected_size );
183206 if (ret )
0 commit comments