|
40 | 40 | #define FLAGS_WORKAROUND_GICR_WAKER_MSM8996 (1ULL << 0)
|
41 | 41 | #define FLAGS_WORKAROUND_CAVIUM_ERRATUM_38539 (1ULL << 1)
|
42 | 42 | #define FLAGS_WORKAROUND_MTK_GICR_SAVE (1ULL << 2)
|
| 43 | +#define FLAGS_WORKAROUND_ASR_ERRATUM_8601001 (1ULL << 3) |
43 | 44 |
|
44 | 45 | #define GIC_IRQ_TYPE_PARTITION (GIC_IRQ_TYPE_LPI + 1)
|
45 | 46 |
|
@@ -661,6 +662,11 @@ static u64 gic_cpu_to_affinity(int cpu)
|
661 | 662 | u64 mpidr = cpu_logical_map(cpu);
|
662 | 663 | u64 aff;
|
663 | 664 |
|
| 665 | + /* ASR8601 needs to have its affinities shifted down... */ |
| 666 | + if (unlikely(gic_data.flags & FLAGS_WORKAROUND_ASR_ERRATUM_8601001)) |
| 667 | + mpidr = (MPIDR_AFFINITY_LEVEL(mpidr, 1) | |
| 668 | + (MPIDR_AFFINITY_LEVEL(mpidr, 2) << 8)); |
| 669 | + |
664 | 670 | aff = ((u64)MPIDR_AFFINITY_LEVEL(mpidr, 3) << 32 |
|
665 | 671 | MPIDR_AFFINITY_LEVEL(mpidr, 2) << 16 |
|
666 | 672 | MPIDR_AFFINITY_LEVEL(mpidr, 1) << 8 |
|
@@ -1801,12 +1807,26 @@ static bool gic_enable_quirk_nvidia_t241(void *data)
|
1801 | 1807 | return true;
|
1802 | 1808 | }
|
1803 | 1809 |
|
| 1810 | +static bool gic_enable_quirk_asr8601(void *data) |
| 1811 | +{ |
| 1812 | + struct gic_chip_data *d = data; |
| 1813 | + |
| 1814 | + d->flags |= FLAGS_WORKAROUND_ASR_ERRATUM_8601001; |
| 1815 | + |
| 1816 | + return true; |
| 1817 | +} |
| 1818 | + |
1804 | 1819 | static const struct gic_quirk gic_quirks[] = {
|
1805 | 1820 | {
|
1806 | 1821 | .desc = "GICv3: Qualcomm MSM8996 broken firmware",
|
1807 | 1822 | .compatible = "qcom,msm8996-gic-v3",
|
1808 | 1823 | .init = gic_enable_quirk_msm8996,
|
1809 | 1824 | },
|
| 1825 | + { |
| 1826 | + .desc = "GICv3: ASR erratum 8601001", |
| 1827 | + .compatible = "asr,asr8601-gic-v3", |
| 1828 | + .init = gic_enable_quirk_asr8601, |
| 1829 | + }, |
1810 | 1830 | {
|
1811 | 1831 | .desc = "GICv3: Mediatek Chromebook GICR save problem",
|
1812 | 1832 | .property = "mediatek,broken-save-restore-fw",
|
|
0 commit comments