hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/drivers/acpi/acpica/evgpeblk.c
....@@ -3,7 +3,7 @@
33 *
44 * Module Name: evgpeblk - GPE block creation and initialization.
55 *
6
- * Copyright (C) 2000 - 2018, Intel Corp.
6
+ * Copyright (C) 2000 - 2020, Intel Corp.
77 *
88 *****************************************************************************/
99
....@@ -110,6 +110,9 @@
110110
111111 status =
112112 acpi_hw_disable_gpe_block(gpe_block->xrupt_block, gpe_block, NULL);
113
+ if (ACPI_FAILURE(status)) {
114
+ return_ACPI_STATUS(status);
115
+ }
113116
114117 if (!gpe_block->previous && !gpe_block->next) {
115118
....@@ -230,12 +233,6 @@
230233
231234 this_register->status_address.space_id = gpe_block->space_id;
232235 this_register->enable_address.space_id = gpe_block->space_id;
233
- this_register->status_address.bit_width =
234
- ACPI_GPE_REGISTER_WIDTH;
235
- this_register->enable_address.bit_width =
236
- ACPI_GPE_REGISTER_WIDTH;
237
- this_register->status_address.bit_offset = 0;
238
- this_register->enable_address.bit_offset = 0;
239236
240237 /* Init the event_info for each GPE within this register */
241238
....@@ -248,14 +245,14 @@
248245
249246 /* Disable all GPEs within this register */
250247
251
- status = acpi_hw_write(0x00, &this_register->enable_address);
248
+ status = acpi_hw_gpe_write(0x00, &this_register->enable_address);
252249 if (ACPI_FAILURE(status)) {
253250 goto error_exit;
254251 }
255252
256253 /* Clear any pending GPE events within this register */
257254
258
- status = acpi_hw_write(0xFF, &this_register->status_address);
255
+ status = acpi_hw_gpe_write(0xFF, &this_register->status_address);
259256 if (ACPI_FAILURE(status)) {
260257 goto error_exit;
261258 }
....@@ -314,6 +311,23 @@
314311 return_ACPI_STATUS(AE_OK);
315312 }
316313
314
+ /* Validate the space_ID */
315
+
316
+ if ((space_id != ACPI_ADR_SPACE_SYSTEM_MEMORY) &&
317
+ (space_id != ACPI_ADR_SPACE_SYSTEM_IO)) {
318
+ ACPI_ERROR((AE_INFO,
319
+ "Unsupported address space: 0x%X", space_id));
320
+ return_ACPI_STATUS(AE_SUPPORT);
321
+ }
322
+
323
+ if (space_id == ACPI_ADR_SPACE_SYSTEM_IO) {
324
+ status = acpi_hw_validate_io_block(address,
325
+ ACPI_GPE_REGISTER_WIDTH,
326
+ register_count);
327
+ if (ACPI_FAILURE(status))
328
+ return_ACPI_STATUS(status);
329
+ }
330
+
317331 /* Allocate a new GPE block */
318332
319333 gpe_block = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_gpe_block_info));
....@@ -359,10 +373,10 @@
359373 walk_info.gpe_device = gpe_device;
360374 walk_info.execute_by_owner_id = FALSE;
361375
362
- status = acpi_ns_walk_namespace(ACPI_TYPE_METHOD, gpe_device,
363
- ACPI_UINT32_MAX, ACPI_NS_WALK_NO_UNLOCK,
364
- acpi_ev_match_gpe_method, NULL,
365
- &walk_info, NULL);
376
+ (void)acpi_ns_walk_namespace(ACPI_TYPE_METHOD, gpe_device,
377
+ ACPI_UINT32_MAX, ACPI_NS_WALK_NO_UNLOCK,
378
+ acpi_ev_match_gpe_method, NULL, &walk_info,
379
+ NULL);
366380
367381 /* Return the new block */
368382