1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-10-18 02:19:39 +00:00

acpi_cpu: Reduce BUS_MASTER_RLD manipulations

Instead of setting and clearing BUS_MASTER_RLD register on every C3
state enter/exit, set it only once if the system supports C3 state
and we are going to "disable" bus master arbitration while in it.

This is what Linux does for the past 14 years, and for even more time
this register is not implemented in a relevant hardware.  Same time
since this is only a single bit in a bigger register, ACPI has to
do take a global lock and do read-modify-write for it, that is too
expensive, saved only by C3 not entered frequently, but enough to be
seen in idle system CPU profiles.

MFC after:	1 month
This commit is contained in:
Alexander Motin 2023-12-25 21:19:28 -05:00
parent 6adf554abd
commit 5bc10feacc

View File

@ -512,6 +512,9 @@ static void
enable_idle(struct acpi_cpu_softc *sc)
{
if (sc->cpu_cx_count > sc->cpu_non_c3 + 1 &&
(cpu_quirks & CPU_QUIRK_NO_BM_CTRL) == 0)
AcpiWriteBitRegister(ACPI_BITREG_BUS_MASTER_RLD, 1);
sc->cpu_disable_idle = FALSE;
}
@ -1164,14 +1167,13 @@ acpi_cpu_idle(sbintime_t sbt)
}
/*
* For C3, disable bus master arbitration and enable bus master wake
* if BM control is available, otherwise flush the CPU cache.
* For C3, disable bus master arbitration if BM control is available.
* CPU may have to wake up to handle it. Otherwise flush the CPU cache.
*/
if (cx_next->type == ACPI_STATE_C3) {
if ((cpu_quirks & CPU_QUIRK_NO_BM_CTRL) == 0) {
if ((cpu_quirks & CPU_QUIRK_NO_BM_CTRL) == 0)
AcpiWriteBitRegister(ACPI_BITREG_ARB_DISABLE, 1);
AcpiWriteBitRegister(ACPI_BITREG_BUS_MASTER_RLD, 1);
} else
else
ACPI_FLUSH_CPU_CACHE();
}
@ -1206,12 +1208,10 @@ acpi_cpu_idle(sbintime_t sbt)
else
end_ticks = cpu_ticks();
/* Enable bus master arbitration and disable bus master wakeup. */
/* Enable bus master arbitration. */
if (cx_next->type == ACPI_STATE_C3 &&
(cpu_quirks & CPU_QUIRK_NO_BM_CTRL) == 0) {
(cpu_quirks & CPU_QUIRK_NO_BM_CTRL) == 0)
AcpiWriteBitRegister(ACPI_BITREG_ARB_DISABLE, 0);
AcpiWriteBitRegister(ACPI_BITREG_BUS_MASTER_RLD, 0);
}
ACPI_ENABLE_IRQS();
if (cx_next->type == ACPI_STATE_C3)