irqchip/gic-v3-its: Kill its->ite_size and use TYPER copy instead

Now that we have a copy of TYPER in the ITS structure, rely on this
to provide the same service as its->ite_size, which gets axed.
Errata workarounds are now updating the cached fields instead of
requiring a separate field in the ITS structure.

Signed-off-by: Marc Zyngier <maz@kernel.org>
Reviewed-by: Zenghui Yu <yuzenghui@huawei.com>
Link: https://lore.kernel.org/r/20191027144234.8395-6-maz@kernel.org
Link: https://lore.kernel.org/r/20191108165805.3071-6-maz@kernel.org
This commit is contained in:
Marc Zyngier 2019-11-08 16:57:59 +00:00
Родитель 0dd57fed6b
Коммит ffedbf0cba
2 изменённых файлов: 5 добавлений и 5 удалений

Просмотреть файл

@ -6,6 +6,7 @@
#include <linux/acpi.h> #include <linux/acpi.h>
#include <linux/acpi_iort.h> #include <linux/acpi_iort.h>
#include <linux/bitfield.h>
#include <linux/bitmap.h> #include <linux/bitmap.h>
#include <linux/cpu.h> #include <linux/cpu.h>
#include <linux/crash_dump.h> #include <linux/crash_dump.h>
@ -108,7 +109,6 @@ struct its_node {
struct list_head its_device_list; struct list_head its_device_list;
u64 flags; u64 flags;
unsigned long list_nr; unsigned long list_nr;
u32 ite_size;
u32 device_ids; u32 device_ids;
int numa_node; int numa_node;
unsigned int msi_domain_flags; unsigned int msi_domain_flags;
@ -2453,7 +2453,7 @@ static struct its_device *its_create_device(struct its_node *its, u32 dev_id,
* sized as a power of two (and you need at least one bit...). * sized as a power of two (and you need at least one bit...).
*/ */
nr_ites = max(2, nvecs); nr_ites = max(2, nvecs);
sz = nr_ites * its->ite_size; sz = nr_ites * (FIELD_GET(GITS_TYPER_ITT_ENTRY_SIZE, its->typer) + 1);
sz = max(sz, ITS_ITT_ALIGN) + ITS_ITT_ALIGN - 1; sz = max(sz, ITS_ITT_ALIGN) + ITS_ITT_ALIGN - 1;
itt = kzalloc_node(sz, GFP_KERNEL, its->numa_node); itt = kzalloc_node(sz, GFP_KERNEL, its->numa_node);
if (alloc_lpis) { if (alloc_lpis) {
@ -3268,7 +3268,8 @@ static bool __maybe_unused its_enable_quirk_qdf2400_e0065(void *data)
struct its_node *its = data; struct its_node *its = data;
/* On QDF2400, the size of the ITE is 16Bytes */ /* On QDF2400, the size of the ITE is 16Bytes */
its->ite_size = 16; its->typer &= ~GITS_TYPER_ITT_ENTRY_SIZE;
its->typer |= FIELD_PREP(GITS_TYPER_ITT_ENTRY_SIZE, 16 - 1);
return true; return true;
} }
@ -3637,7 +3638,6 @@ static int __init its_probe_one(struct resource *res,
its->typer = typer; its->typer = typer;
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->device_ids = GITS_TYPER_DEVBITS(typer); its->device_ids = GITS_TYPER_DEVBITS(typer);
if (is_v4(its)) { if (is_v4(its)) {
if (!(typer & GITS_TYPER_VMOVP)) { if (!(typer & GITS_TYPER_VMOVP)) {

Просмотреть файл

@ -334,7 +334,7 @@
#define GITS_TYPER_PLPIS (1UL << 0) #define GITS_TYPER_PLPIS (1UL << 0)
#define GITS_TYPER_VLPIS (1UL << 1) #define GITS_TYPER_VLPIS (1UL << 1)
#define GITS_TYPER_ITT_ENTRY_SIZE_SHIFT 4 #define GITS_TYPER_ITT_ENTRY_SIZE_SHIFT 4
#define GITS_TYPER_ITT_ENTRY_SIZE(r) ((((r) >> GITS_TYPER_ITT_ENTRY_SIZE_SHIFT) & 0xf) + 1) #define GITS_TYPER_ITT_ENTRY_SIZE GENMASK_ULL(7, 4)
#define GITS_TYPER_IDBITS_SHIFT 8 #define GITS_TYPER_IDBITS_SHIFT 8
#define GITS_TYPER_DEVBITS_SHIFT 13 #define GITS_TYPER_DEVBITS_SHIFT 13
#define GITS_TYPER_DEVBITS(r) ((((r) >> GITS_TYPER_DEVBITS_SHIFT) & 0x1f) + 1) #define GITS_TYPER_DEVBITS(r) ((((r) >> GITS_TYPER_DEVBITS_SHIFT) & 0x1f) + 1)