提交 7c29f300 编写于 作者: M Marc Zyngier 提交者: Xie XiuQi

irqchip/gic-v3-its: Keep track of property table's PA and VA

mainline inclusion
from 4.20-rc1
commit: e1a2e2010ba9d3c765b2e37a7ae8b332564716f1
category: kdump
bugzilla: 5272
CVE: NA

This 10 patches is used for secondary kernel using LPI.

[PATCH 01/10] irqchip/gic-v3-its: Change initialization ordering for LPIs
[PATCH 02/10] irqchip/gic-v3-its: Simplify LPI_PENDBASE_SZ usage
[PATCH 03/10] irqchip/gic-v3-its: Split property table clearing from allocation
[PATCH 04/10] irqchip/gic-v3-its: Move pending table allocation to init time
[PATCH 05/10] irqchip/gic-v3-its: Keep track of property table's PA and VA
[PATCH 06/10] irqchip/gic-v3-its: Allow use of pre-programmed LPI tables
[PATCH 07/10] irqchip/gic-v3-its: Use pre-programmed redistributor tables with kdump kernels
[PATCH 08/10] irqchip/gic-v3-its: Check that all RDs have the same property table
[PATCH 09/10] irqchip/gic-v3-its: Register LPI tables with EFI config table
[PATCH 10/10] irqchip/gic-v3-its: Allow use of LPI tables in reserved memory

--------------------------------------

We're currently only tracking the page allocated to contain the
property table by its struct page. In the future, it is going to
be convenient to track both PA and VA for that page instead. Let's
do that.
Tested-by: NJeremy Linton <jeremy.linton@arm.com>
Tested-by: NBhupesh Sharma <bhsharma@redhat.com>
Tested-by: NLei Zhang <zhang.lei@jp.fujitsu.com>
Signed-off-by: NMarc Zyngier <marc.zyngier@arm.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
Reviewed-by: NHanjun Guo <guohanjun@huawei.com>
上级 ed9b4fe8
...@@ -1029,7 +1029,7 @@ static inline u32 its_get_event_id(struct irq_data *d) ...@@ -1029,7 +1029,7 @@ static inline u32 its_get_event_id(struct irq_data *d)
static void lpi_write_config(struct irq_data *d, u8 clr, u8 set) static void lpi_write_config(struct irq_data *d, u8 clr, u8 set)
{ {
irq_hw_number_t hwirq; irq_hw_number_t hwirq;
struct page *prop_page; void *va;
u8 *cfg; u8 *cfg;
if (irqd_is_forwarded_to_vcpu(d)) { if (irqd_is_forwarded_to_vcpu(d)) {
...@@ -1037,7 +1037,7 @@ static void lpi_write_config(struct irq_data *d, u8 clr, u8 set) ...@@ -1037,7 +1037,7 @@ static void lpi_write_config(struct irq_data *d, u8 clr, u8 set)
u32 event = its_get_event_id(d); u32 event = its_get_event_id(d);
struct its_vlpi_map *map; struct its_vlpi_map *map;
prop_page = its_dev->event_map.vm->vprop_page; va = page_address(its_dev->event_map.vm->vprop_page);
map = &its_dev->event_map.vlpi_maps[event]; map = &its_dev->event_map.vlpi_maps[event];
hwirq = map->vintid; hwirq = map->vintid;
...@@ -1045,11 +1045,11 @@ static void lpi_write_config(struct irq_data *d, u8 clr, u8 set) ...@@ -1045,11 +1045,11 @@ static void lpi_write_config(struct irq_data *d, u8 clr, u8 set)
map->properties &= ~clr; map->properties &= ~clr;
map->properties |= set | LPI_PROP_GROUP1; map->properties |= set | LPI_PROP_GROUP1;
} else { } else {
prop_page = gic_rdists->prop_page; va = gic_rdists->prop_table_va;
hwirq = d->hwirq; hwirq = d->hwirq;
} }
cfg = page_address(prop_page) + hwirq - 8192; cfg = va + hwirq - 8192;
*cfg &= ~clr; *cfg &= ~clr;
*cfg |= set | LPI_PROP_GROUP1; *cfg |= set | LPI_PROP_GROUP1;
...@@ -1628,18 +1628,21 @@ static void its_free_prop_table(struct page *prop_page) ...@@ -1628,18 +1628,21 @@ static void its_free_prop_table(struct page *prop_page)
static int __init its_setup_lpi_prop_table(void) static int __init its_setup_lpi_prop_table(void)
{ {
phys_addr_t paddr; struct page *page;
lpi_id_bits = min_t(u32, GICD_TYPER_ID_BITS(gic_rdists->gicd_typer), lpi_id_bits = min_t(u32, GICD_TYPER_ID_BITS(gic_rdists->gicd_typer),
ITS_MAX_LPI_NRBITS); ITS_MAX_LPI_NRBITS);
gic_rdists->prop_page = its_allocate_prop_table(GFP_NOWAIT); page = its_allocate_prop_table(GFP_NOWAIT);
if (!gic_rdists->prop_page) { if (!page) {
pr_err("Failed to allocate PROPBASE\n"); pr_err("Failed to allocate PROPBASE\n");
return -ENOMEM; return -ENOMEM;
} }
paddr = page_to_phys(gic_rdists->prop_page); gic_rdists->prop_table_pa = page_to_phys(page);
pr_info("GIC: using LPI property table @%pa\n", &paddr); gic_rdists->prop_table_va = page_address(page);
pr_info("GICv3: using LPI property table @%pa\n",
&gic_rdists->prop_table_pa);
return its_lpi_init(lpi_id_bits); return its_lpi_init(lpi_id_bits);
} }
...@@ -1987,7 +1990,7 @@ static void its_cpu_init_lpis(void) ...@@ -1987,7 +1990,7 @@ static void its_cpu_init_lpis(void)
paddr = page_to_phys(pend_page); paddr = page_to_phys(pend_page);
/* set PROPBASE */ /* set PROPBASE */
val = (page_to_phys(gic_rdists->prop_page) | val = (gic_rdists->prop_table_pa |
GICR_PROPBASER_InnerShareable | GICR_PROPBASER_InnerShareable |
GICR_PROPBASER_RaWaWb | GICR_PROPBASER_RaWaWb |
((LPI_NRBITS - 1) & GICR_PROPBASER_IDBITS_MASK)); ((LPI_NRBITS - 1) & GICR_PROPBASER_IDBITS_MASK));
......
...@@ -587,7 +587,8 @@ struct rdists { ...@@ -587,7 +587,8 @@ struct rdists {
phys_addr_t phys_base; phys_addr_t phys_base;
bool lpi_enabled; bool lpi_enabled;
} __percpu *rdist; } __percpu *rdist;
struct page *prop_page; phys_addr_t prop_table_pa;
void *prop_table_va;
u64 flags; u64 flags;
u32 gicd_typer; u32 gicd_typer;
bool has_vlpis; bool has_vlpis;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册