On Thu, Aug 20, 2026 at 09:11:14PM +0200, Rafael J. Wysocki wrote:
> From: "Rafael J. Wysocki" <[email protected]>
> 
> Commit f234fdaae1ca ("ACPI: scan: Avoid registering platform devices
> with resource overlaps") attempted to avoid platform device registration
> errors due to overlaps of resources of the same type returned by the
> same _CRS object in the ACPI tables.  It did that by combining two or
> more overlapping resources into one, but it went too far and also
> caused resources that overlap completely to be combined which broke
> the arm-cmn driver that expects two MMIO resources to be present for
> each device it binds to and it expects those two resources to overlap
> completely.
> 
> Address this issue by adding checks for completely overlapping
> resources to acpi_platform_adjust_resources() and add a comment
> explaining what is done there.
> 
> Fixes: f234fdaae1ca ("ACPI: scan: Avoid registering platform devices with 
> resource overlaps")
> Reported-by: Nathan Chancellor <[email protected]> 
> Tested-by: Nathan Chancellor <[email protected]> 
> Closes: https://lore.kernel.org/linux-acpi/20260819003752.GA3063251@ax162/
> Signed-off-by: Rafael J. Wysocki <[email protected]>
> ---
> 
> v1 -> v2:
>    * It is better to check for complete overlaps both ways as suggested
>      by Sashiko.
> 
> @Julien: I would appreciate testing this on the machine that needed
> commit f234fdaae1ca.
> 
> ---
>  drivers/acpi/acpi_platform.c |    8 +++++++-
>  1 file changed, 7 insertions(+), 1 deletion(-)
> 
> --- a/drivers/acpi/acpi_platform.c
> +++ b/drivers/acpi/acpi_platform.c
> @@ -85,7 +85,13 @@ static unsigned int acpi_platform_adjust
>       for (i = 0; i < count; ) {
>               struct resource *res = &resources[i];
>  
> -             if (resource_type(new_res) != resource_type(res) ||
> +             /*
> +              * Look for overlaps of resources of the same type that would
> +              * cause resource insertion to fail down the road.
> +              */
> +             if (__resource_contains_unbound(res, new_res) ||
> +                 __resource_contains_unbound(new_res, res) ||
> +                 resource_type(new_res) != resource_type(res) ||
>                   !resource_union(new_res, res, new_res)) {
>                       i++;
>                       continue;
> 
> 
> 


Reviewed-by: Jarkko Sakkinen <[email protected]>

BR, Jarkko

Reply via email to