|
@@ -1650,23 +1650,14 @@ static void its_free_tables(struct its_node *its)
|
|
|
|
|
|
static int its_alloc_tables(struct its_node *its)
|
|
static int its_alloc_tables(struct its_node *its)
|
|
{
|
|
{
|
|
- u64 typer = gic_read_typer(its->base + GITS_TYPER);
|
|
|
|
- u32 ids = GITS_TYPER_DEVBITS(typer);
|
|
|
|
u64 shr = GITS_BASER_InnerShareable;
|
|
u64 shr = GITS_BASER_InnerShareable;
|
|
u64 cache = GITS_BASER_RaWaWb;
|
|
u64 cache = GITS_BASER_RaWaWb;
|
|
u32 psz = SZ_64K;
|
|
u32 psz = SZ_64K;
|
|
int err, i;
|
|
int err, i;
|
|
|
|
|
|
- if (its->flags & ITS_FLAGS_WORKAROUND_CAVIUM_22375) {
|
|
|
|
- /*
|
|
|
|
- * erratum 22375: only alloc 8MB table size
|
|
|
|
- * erratum 24313: ignore memory access type
|
|
|
|
- */
|
|
|
|
- cache = GITS_BASER_nCnB;
|
|
|
|
- ids = 0x14; /* 20 bits, 8MB */
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- its->device_ids = ids;
|
|
|
|
|
|
+ if (its->flags & ITS_FLAGS_WORKAROUND_CAVIUM_22375)
|
|
|
|
+ /* erratum 24313: ignore memory access type */
|
|
|
|
+ cache = GITS_BASER_nCnB;
|
|
|
|
|
|
for (i = 0; i < GITS_BASER_NR_REGS; i++) {
|
|
for (i = 0; i < GITS_BASER_NR_REGS; i++) {
|
|
struct its_baser *baser = its->tables + i;
|
|
struct its_baser *baser = its->tables + i;
|
|
@@ -2743,6 +2734,8 @@ static void __maybe_unused its_enable_quirk_cavium_22375(void *data)
|
|
{
|
|
{
|
|
struct its_node *its = data;
|
|
struct its_node *its = data;
|
|
|
|
|
|
|
|
+ /* erratum 22375: only alloc 8MB table size */
|
|
|
|
+ its->device_ids = 0x14; /* 20 bits, 8MB */
|
|
its->flags |= ITS_FLAGS_WORKAROUND_CAVIUM_22375;
|
|
its->flags |= ITS_FLAGS_WORKAROUND_CAVIUM_22375;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -2944,6 +2937,7 @@ static int __init its_probe_one(struct resource *res,
|
|
its->base = its_base;
|
|
its->base = its_base;
|
|
its->phys_base = res->start;
|
|
its->phys_base = res->start;
|
|
its->ite_size = GITS_TYPER_ITT_ENTRY_SIZE(typer);
|
|
its->ite_size = GITS_TYPER_ITT_ENTRY_SIZE(typer);
|
|
|
|
+ its->device_ids = GITS_TYPER_DEVBITS(typer);
|
|
its->is_v4 = !!(typer & GITS_TYPER_VLPIS);
|
|
its->is_v4 = !!(typer & GITS_TYPER_VLPIS);
|
|
if (its->is_v4) {
|
|
if (its->is_v4) {
|
|
if (!(typer & GITS_TYPER_VMOVP)) {
|
|
if (!(typer & GITS_TYPER_VMOVP)) {
|