irqchip/gic-v3: Dynamically allocate PPI partition descriptors
Again, PPIs are becoming a variable set. Let's hack the PPI partition code to make the top-level array dynamically allocated. Signed-off-by: Marc Zyngier <maz@kernel.org>
This commit is contained in:
parent
81a4327304
commit
52085d3f20
@ -52,7 +52,7 @@ struct gic_chip_data {
|
|||||||
u64 flags;
|
u64 flags;
|
||||||
bool has_rss;
|
bool has_rss;
|
||||||
unsigned int ppi_nr;
|
unsigned int ppi_nr;
|
||||||
struct partition_desc *ppi_descs[16];
|
struct partition_desc **ppi_descs;
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct gic_chip_data gic_data __read_mostly;
|
static struct gic_chip_data gic_data __read_mostly;
|
||||||
@ -1354,7 +1354,8 @@ static int gic_irq_domain_select(struct irq_domain *d,
|
|||||||
* then we need to match the partition domain.
|
* then we need to match the partition domain.
|
||||||
*/
|
*/
|
||||||
if (fwspec->param_count >= 4 &&
|
if (fwspec->param_count >= 4 &&
|
||||||
fwspec->param[0] == 1 && fwspec->param[3] != 0)
|
fwspec->param[0] == 1 && fwspec->param[3] != 0 &&
|
||||||
|
gic_data.ppi_descs)
|
||||||
return d == partition_get_domain(gic_data.ppi_descs[fwspec->param[1]]);
|
return d == partition_get_domain(gic_data.ppi_descs[fwspec->param[1]]);
|
||||||
|
|
||||||
return d == gic_data.domain;
|
return d == gic_data.domain;
|
||||||
@ -1375,6 +1376,9 @@ static int partition_domain_translate(struct irq_domain *d,
|
|||||||
struct device_node *np;
|
struct device_node *np;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if (!gic_data.ppi_descs)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
np = of_find_node_by_phandle(fwspec->param[3]);
|
np = of_find_node_by_phandle(fwspec->param[3]);
|
||||||
if (WARN_ON(!np))
|
if (WARN_ON(!np))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@ -1531,6 +1535,10 @@ static void __init gic_populate_ppi_partitions(struct device_node *gic_node)
|
|||||||
if (!parts_node)
|
if (!parts_node)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
gic_data.ppi_descs = kcalloc(gic_data.ppi_nr, sizeof(*gic_data.ppi_descs), GFP_KERNEL);
|
||||||
|
if (!gic_data.ppi_descs)
|
||||||
|
return;
|
||||||
|
|
||||||
nr_parts = of_get_child_count(parts_node);
|
nr_parts = of_get_child_count(parts_node);
|
||||||
|
|
||||||
if (!nr_parts)
|
if (!nr_parts)
|
||||||
@ -1582,7 +1590,7 @@ static void __init gic_populate_ppi_partitions(struct device_node *gic_node)
|
|||||||
part_idx++;
|
part_idx++;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < 16; i++) {
|
for (i = 0; i < gic_data.ppi_nr; i++) {
|
||||||
unsigned int irq;
|
unsigned int irq;
|
||||||
struct partition_desc *desc;
|
struct partition_desc *desc;
|
||||||
struct irq_fwspec ppi_fwspec = {
|
struct irq_fwspec ppi_fwspec = {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user