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:
Родитель
0dd57fed6b
Коммит
ffedbf0cba
|
@ -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)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче