Commit 164e64ad authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull ACPI fixes from Rafael Wysocki:
 "These revert one recent commit that turned out to be problematic,
  address two issues in the ACPI "custom method" interface and update
  GPIO properties documentation.

  Specifics:

   - Revent recent commit related to the handling of ACPI power
     resources during initialization, because it turned out to cause
     problems to occur on some systems (Rafael Wysocki).

   - Fix potential use-after-free and potential memory leak in the ACPI
     "custom method" debugfs interface (Mark Langsdorf).

   - Update ACPI GPIO properties documentation to cover assumptions
     regarding GPIO polarity (Andy Shevchenko)"

* tag 'acpi-5.13-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
  Revert "ACPI: scan: Turn off unused power resources during initialization"
  ACPI: custom_method: fix a possible memory leak
  ACPI: custom_method: fix potential use-after-free issue
  Documentation: firmware-guide: gpio-properties: Add note to SPI CS case
parents 2423e142 3da53c75
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -99,6 +99,12 @@ native::
      }
  }

Note, that historically ACPI has no means of the GPIO polarity and thus
the SPISerialBus() resource defines it on the per-chip basis. In order
to avoid a chain of negations, the GPIO polarity is considered being
Active High. Even for the cases when _DSD() is involved (see the example
above) the GPIO CS polarity must be defined Active High to avoid ambiguity.

Other supported properties
==========================

+3 −1
Original line number Diff line number Diff line
@@ -42,6 +42,8 @@ static ssize_t cm_write(struct file *file, const char __user *user_buf,
				   sizeof(struct acpi_table_header)))
			return -EFAULT;
		uncopied_bytes = max_size = table.length;
		/* make sure the buf is not allocated */
		kfree(buf);
		buf = kzalloc(max_size, GFP_KERNEL);
		if (!buf)
			return -ENOMEM;
@@ -55,6 +57,7 @@ static ssize_t cm_write(struct file *file, const char __user *user_buf,
	    (*ppos + count < count) ||
	    (count > uncopied_bytes)) {
		kfree(buf);
		buf = NULL;
		return -EINVAL;
	}

@@ -76,7 +79,6 @@ static ssize_t cm_write(struct file *file, const char __user *user_buf,
		add_taint(TAINT_OVERRIDDEN_ACPI_TABLE, LOCKDEP_NOW_UNRELIABLE);
	}

	kfree(buf);
	return count;
}

+0 −1
Original line number Diff line number Diff line
@@ -142,7 +142,6 @@ int acpi_device_sleep_wake(struct acpi_device *dev,
int acpi_power_get_inferred_state(struct acpi_device *device, int *state);
int acpi_power_on_resources(struct acpi_device *device, int state);
int acpi_power_transition(struct acpi_device *device, int state);
void acpi_turn_off_unused_power_resources(void);

/* --------------------------------------------------------------------------
                              Device Power Management
+1 −1
Original line number Diff line number Diff line
@@ -995,7 +995,6 @@ void acpi_resume_power_resources(void)

	mutex_unlock(&power_resource_list_lock);
}
#endif

void acpi_turn_off_unused_power_resources(void)
{
@@ -1016,3 +1015,4 @@ void acpi_turn_off_unused_power_resources(void)

	mutex_unlock(&power_resource_list_lock);
}
#endif
+0 −2
Original line number Diff line number Diff line
@@ -2359,8 +2359,6 @@ int __init acpi_scan_init(void)
		}
	}

	acpi_turn_off_unused_power_resources();

	acpi_scan_initialized = true;

 out:
Loading