|
@@ -109,6 +109,7 @@ struct its_node {
|
|
|
unsigned int msi_domain_flags;
|
|
|
u32 pre_its_base; /* for Socionext Synquacer */
|
|
|
bool is_v4;
|
|
|
+ int vlpi_redist_offset;
|
|
|
};
|
|
|
|
|
|
#define ITS_ITT_ALIGN SZ_256
|
|
@@ -558,13 +559,15 @@ static struct its_vpe *its_build_vmapp_cmd(struct its_node *its,
|
|
|
struct its_cmd_desc *desc)
|
|
|
{
|
|
|
unsigned long vpt_addr;
|
|
|
+ u64 target;
|
|
|
|
|
|
vpt_addr = virt_to_phys(page_address(desc->its_vmapp_cmd.vpe->vpt_page));
|
|
|
+ target = desc->its_vmapp_cmd.col->target_address + its->vlpi_redist_offset;
|
|
|
|
|
|
its_encode_cmd(cmd, GITS_CMD_VMAPP);
|
|
|
its_encode_vpeid(cmd, desc->its_vmapp_cmd.vpe->vpe_id);
|
|
|
its_encode_valid(cmd, desc->its_vmapp_cmd.valid);
|
|
|
- its_encode_target(cmd, desc->its_vmapp_cmd.col->target_address);
|
|
|
+ its_encode_target(cmd, target);
|
|
|
its_encode_vpt_addr(cmd, vpt_addr);
|
|
|
its_encode_vpt_size(cmd, LPI_NRBITS - 1);
|
|
|
|
|
@@ -623,11 +626,14 @@ static struct its_vpe *its_build_vmovp_cmd(struct its_node *its,
|
|
|
struct its_cmd_block *cmd,
|
|
|
struct its_cmd_desc *desc)
|
|
|
{
|
|
|
+ u64 target;
|
|
|
+
|
|
|
+ target = desc->its_vmovp_cmd.col->target_address + its->vlpi_redist_offset;
|
|
|
its_encode_cmd(cmd, GITS_CMD_VMOVP);
|
|
|
its_encode_seq_num(cmd, desc->its_vmovp_cmd.seq_num);
|
|
|
its_encode_its_list(cmd, desc->its_vmovp_cmd.its_list);
|
|
|
its_encode_vpeid(cmd, desc->its_vmovp_cmd.vpe->vpe_id);
|
|
|
- its_encode_target(cmd, desc->its_vmovp_cmd.col->target_address);
|
|
|
+ its_encode_target(cmd, target);
|
|
|
|
|
|
its_fixup_cmd(cmd);
|
|
|
|
|
@@ -2834,6 +2840,18 @@ static bool __maybe_unused its_enable_quirk_socionext_synquacer(void *data)
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+static bool __maybe_unused its_enable_quirk_hip07_161600802(void *data)
|
|
|
+{
|
|
|
+ struct its_node *its = data;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Hip07 insists on using the wrong address for the VLPI
|
|
|
+ * page. Trick it into doing the right thing...
|
|
|
+ */
|
|
|
+ its->vlpi_redist_offset = SZ_128K;
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
static const struct gic_quirk its_quirks[] = {
|
|
|
#ifdef CONFIG_CAVIUM_ERRATUM_22375
|
|
|
{
|
|
@@ -2871,6 +2889,14 @@ static const struct gic_quirk its_quirks[] = {
|
|
|
.mask = 0xffffffff,
|
|
|
.init = its_enable_quirk_socionext_synquacer,
|
|
|
},
|
|
|
+#endif
|
|
|
+#ifdef CONFIG_HISILICON_ERRATUM_161600802
|
|
|
+ {
|
|
|
+ .desc = "ITS: Hip07 erratum 161600802",
|
|
|
+ .iidr = 0x00000004,
|
|
|
+ .mask = 0xffffffff,
|
|
|
+ .init = its_enable_quirk_hip07_161600802,
|
|
|
+ },
|
|
|
#endif
|
|
|
{
|
|
|
}
|