@@ -2042,15 +2042,40 @@ static void __init gic_of_setup_kvm_info(struct device_node *node)
20422042 vgic_set_kvm_info (& gic_v3_kvm_info );
20432043}
20442044
2045+ static void gic_request_region (resource_size_t base , resource_size_t size ,
2046+ const char * name )
2047+ {
2048+ if (!request_mem_region (base , size , name ))
2049+ pr_warn_once (FW_BUG "%s region %pa has overlapping address\n" ,
2050+ name , & base );
2051+ }
2052+
2053+ static void __iomem * gic_of_iomap (struct device_node * node , int idx ,
2054+ const char * name , struct resource * res )
2055+ {
2056+ void __iomem * base ;
2057+ int ret ;
2058+
2059+ ret = of_address_to_resource (node , idx , res );
2060+ if (ret )
2061+ return IOMEM_ERR_PTR (ret );
2062+
2063+ gic_request_region (res -> start , resource_size (res ), name );
2064+ base = of_iomap (node , idx );
2065+
2066+ return base ?: IOMEM_ERR_PTR (- ENOMEM );
2067+ }
2068+
20452069static int __init gic_of_init (struct device_node * node , struct device_node * parent )
20462070{
20472071 void __iomem * dist_base ;
20482072 struct redist_region * rdist_regs ;
2073+ struct resource res ;
20492074 u64 redist_stride ;
20502075 u32 nr_redist_regions ;
20512076 int err , i ;
20522077
2053- dist_base = of_io_request_and_map (node , 0 , "GICD" );
2078+ dist_base = gic_of_iomap (node , 0 , "GICD" , & res );
20542079 if (IS_ERR (dist_base )) {
20552080 pr_err ("%pOF: unable to map gic dist registers\n" , node );
20562081 return PTR_ERR (dist_base );
@@ -2073,12 +2098,8 @@ static int __init gic_of_init(struct device_node *node, struct device_node *pare
20732098 }
20742099
20752100 for (i = 0 ; i < nr_redist_regions ; i ++ ) {
2076- struct resource res ;
2077- int ret ;
2078-
2079- ret = of_address_to_resource (node , 1 + i , & res );
2080- rdist_regs [i ].redist_base = of_io_request_and_map (node , 1 + i , "GICR" );
2081- if (ret || IS_ERR (rdist_regs [i ].redist_base )) {
2101+ rdist_regs [i ].redist_base = gic_of_iomap (node , 1 + i , "GICR" , & res );
2102+ if (IS_ERR (rdist_regs [i ].redist_base )) {
20822103 pr_err ("%pOF: couldn't map region %d\n" , node , i );
20832104 err = - ENODEV ;
20842105 goto out_unmap_rdist ;
@@ -2151,7 +2172,7 @@ gic_acpi_parse_madt_redist(union acpi_subtable_headers *header,
21512172 pr_err ("Couldn't map GICR region @%llx\n" , redist -> base_address );
21522173 return - ENOMEM ;
21532174 }
2154- request_mem_region (redist -> base_address , redist -> length , "GICR" );
2175+ gic_request_region (redist -> base_address , redist -> length , "GICR" );
21552176
21562177 gic_acpi_register_redist (redist -> base_address , redist_base );
21572178 return 0 ;
@@ -2174,7 +2195,7 @@ gic_acpi_parse_madt_gicc(union acpi_subtable_headers *header,
21742195 redist_base = ioremap (gicc -> gicr_base_address , size );
21752196 if (!redist_base )
21762197 return - ENOMEM ;
2177- request_mem_region (gicc -> gicr_base_address , size , "GICR" );
2198+ gic_request_region (gicc -> gicr_base_address , size , "GICR" );
21782199
21792200 gic_acpi_register_redist (gicc -> gicr_base_address , redist_base );
21802201 return 0 ;
@@ -2376,7 +2397,7 @@ gic_acpi_init(union acpi_subtable_headers *header, const unsigned long end)
23762397 pr_err ("Unable to map GICD registers\n" );
23772398 return - ENOMEM ;
23782399 }
2379- request_mem_region (dist -> base_address , ACPI_GICV3_DIST_MEM_SIZE , "GICD" );
2400+ gic_request_region (dist -> base_address , ACPI_GICV3_DIST_MEM_SIZE , "GICD" );
23802401
23812402 err = gic_validate_dist_version (acpi_data .dist_base );
23822403 if (err ) {
0 commit comments