*/
 #define IRQS_PER_CHUNK_SHIFT   5
 #define IRQS_PER_CHUNK         (1 << IRQS_PER_CHUNK_SHIFT)
+#define ITS_MAX_LPI_NRBITS     16 /* 64K LPIs */
 
 static unsigned long *lpi_bitmap;
 static u32 lpi_chunks;
+static u32 lpi_id_bits;
 static DEFINE_SPINLOCK(lpi_lock);
 
 static int its_lpi_to_chunk(int lpi)
 }
 
 /*
- * We allocate 64kB for PROPBASE. That gives us at most 64K LPIs to
+ * We allocate memory for PROPBASE to cover 2 ^ lpi_id_bits LPIs to
  * deal with (one configuration byte per interrupt). PENDBASE has to
  * be 64kB aligned (one bit per LPI, plus 8192 bits for SPI/PPI/SGI).
  */
-#define LPI_PROPBASE_SZ                SZ_64K
-#define LPI_PENDBASE_SZ                (LPI_PROPBASE_SZ / 8 + SZ_1K)
-
-/*
- * This is how many bits of ID we need, including the useless ones.
- */
-#define LPI_NRBITS             ilog2(LPI_PROPBASE_SZ + SZ_8K)
+#define LPI_NRBITS             lpi_id_bits
+#define LPI_PROPBASE_SZ                ALIGN(BIT(LPI_NRBITS), SZ_64K)
+#define LPI_PENDBASE_SZ                ALIGN(BIT(LPI_NRBITS) / 8, SZ_64K)
 
 #define LPI_PROP_DEFAULT_PRIO  0xa0
 
 {
        phys_addr_t paddr;
 
+       lpi_id_bits = min_t(u32, gic_rdists->id_bits, ITS_MAX_LPI_NRBITS);
        gic_rdists->prop_page = alloc_pages(GFP_NOWAIT,
                                           get_order(LPI_PROPBASE_SZ));
        if (!gic_rdists->prop_page) {
        /* Make sure the GIC will observe the written configuration */
        gic_flush_dcache_to_poc(page_address(gic_rdists->prop_page), LPI_PROPBASE_SZ);
 
-       return 0;
+       return its_lpi_init(lpi_id_bits);
 }
 
 static const char *its_base_type_string[] = {
                 * hence the 'max(LPI_PENDBASE_SZ, SZ_64K)' below.
                 */
                pend_page = alloc_pages(GFP_NOWAIT | __GFP_ZERO,
-                                       get_order(max(LPI_PENDBASE_SZ, SZ_64K)));
+                                       get_order(max_t(u32, LPI_PENDBASE_SZ, SZ_64K)));
                if (!pend_page) {
                        pr_err("Failed to allocate PENDBASE for CPU%d\n",
                               smp_processor_id());
        }
 
        gic_rdists = rdists;
-       its_alloc_lpi_tables();
-       its_lpi_init(rdists->id_bits);
-
-       return 0;
+       return its_alloc_lpi_tables();
 }