Message ID | 20200320092428.20880-9-eric.auger@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | arm/arm64: Add ITS tests | expand |
Hi Eric, On 2020/3/20 17:24, Eric Auger wrote: > Introduce an helper functions to register > - a new device, characterized by its device id and the > max number of event IDs that dimension its ITT (Interrupt > Translation Table). The function allocates the ITT. > > - a new collection, characterized by its ID and the > target processing engine (PE). > > Signed-off-by: Eric Auger <eric.auger@redhat.com> > > --- > > v3 -> v4: > - remove unused its_baser variable from its_create_device() > - use get_order() > - device->itt becomes a GVA instead of GPA > > v2 -> v3: > - s/report_abort/assert > > v1 -> v2: > - s/nb_/nr_ > --- > lib/arm64/asm/gic-v3-its.h | 19 +++++++++++++++++++ > lib/arm64/gic-v3-its.c | 38 ++++++++++++++++++++++++++++++++++++++ > 2 files changed, 57 insertions(+) > > diff --git a/lib/arm64/asm/gic-v3-its.h b/lib/arm64/asm/gic-v3-its.h > index 4683011..adcb642 100644 > --- a/lib/arm64/asm/gic-v3-its.h > +++ b/lib/arm64/asm/gic-v3-its.h > @@ -31,6 +31,19 @@ struct its_baser { > }; > > #define GITS_BASER_NR_REGS 8 > +#define GITS_MAX_DEVICES 8 > +#define GITS_MAX_COLLECTIONS 8 > + > +struct its_device { > + u32 device_id; /* device ID */ > + u32 nr_ites; /* Max Interrupt Translation Entries */ > + void *itt; /* Interrupt Translation Table GVA */ > +}; > + > +struct its_collection { > + u64 target_address; > + u16 col_id; > +}; > > struct its_data { > void *base; > @@ -39,6 +52,10 @@ struct its_data { > struct its_baser coll_baser; > struct its_cmd_block *cmd_base; > struct its_cmd_block *cmd_write; > + struct its_device devices[GITS_MAX_DEVICES]; > + u32 nr_devices; /* Allocated Devices */ > + struct its_collection collections[GITS_MAX_COLLECTIONS]; > + u32 nr_collections; /* Allocated Collections */ > }; > > extern struct its_data its_data; > @@ -93,5 +110,7 @@ extern void its_parse_typer(void); > extern void its_init(void); > extern int its_baser_lookup(int i, struct its_baser *baser); > extern void its_enable_defaults(void); > +extern struct its_device *its_create_device(u32 dev_id, int nr_ites); > +extern struct its_collection *its_create_collection(u32 col_id, u32 target_pe); Maybe use 'u16 col_id'? Besides, Reviewed-by: Zenghui Yu <yuzenghui@huawei.com> Thanks
Hi Zenghui, On 3/25/20 9:10 AM, Zenghui Yu wrote: > Hi Eric, > > On 2020/3/20 17:24, Eric Auger wrote: >> Introduce an helper functions to register >> - a new device, characterized by its device id and the >> max number of event IDs that dimension its ITT (Interrupt >> Translation Table). The function allocates the ITT. >> >> - a new collection, characterized by its ID and the >> target processing engine (PE). >> >> Signed-off-by: Eric Auger <eric.auger@redhat.com> >> >> --- >> >> v3 -> v4: >> - remove unused its_baser variable from its_create_device() >> - use get_order() >> - device->itt becomes a GVA instead of GPA >> >> v2 -> v3: >> - s/report_abort/assert >> >> v1 -> v2: >> - s/nb_/nr_ >> --- >> lib/arm64/asm/gic-v3-its.h | 19 +++++++++++++++++++ >> lib/arm64/gic-v3-its.c | 38 ++++++++++++++++++++++++++++++++++++++ >> 2 files changed, 57 insertions(+) >> >> diff --git a/lib/arm64/asm/gic-v3-its.h b/lib/arm64/asm/gic-v3-its.h >> index 4683011..adcb642 100644 >> --- a/lib/arm64/asm/gic-v3-its.h >> +++ b/lib/arm64/asm/gic-v3-its.h >> @@ -31,6 +31,19 @@ struct its_baser { >> }; >> #define GITS_BASER_NR_REGS 8 >> +#define GITS_MAX_DEVICES 8 >> +#define GITS_MAX_COLLECTIONS 8 >> + >> +struct its_device { >> + u32 device_id; /* device ID */ >> + u32 nr_ites; /* Max Interrupt Translation Entries */ >> + void *itt; /* Interrupt Translation Table GVA */ >> +}; >> + >> +struct its_collection { >> + u64 target_address; >> + u16 col_id; >> +}; >> struct its_data { >> void *base; >> @@ -39,6 +52,10 @@ struct its_data { >> struct its_baser coll_baser; >> struct its_cmd_block *cmd_base; >> struct its_cmd_block *cmd_write; >> + struct its_device devices[GITS_MAX_DEVICES]; >> + u32 nr_devices; /* Allocated Devices */ >> + struct its_collection collections[GITS_MAX_COLLECTIONS]; >> + u32 nr_collections; /* Allocated Collections */ >> }; >> extern struct its_data its_data; >> @@ -93,5 +110,7 @@ extern void its_parse_typer(void); >> extern void its_init(void); >> extern int its_baser_lookup(int i, struct its_baser *baser); >> extern void its_enable_defaults(void); >> +extern struct its_device *its_create_device(u32 dev_id, int nr_ites); >> +extern struct its_collection *its_create_collection(u32 col_id, u32 >> target_pe); > > Maybe use 'u16 col_id'? fair enough. At this point, not sure this is worth a respin though ;-) > > Besides, > Reviewed-by: Zenghui Yu <yuzenghui@huawei.com> Thanks! Eric > > > Thanks > >
On Wed, Mar 25, 2020 at 10:20:43PM +0100, Auger Eric wrote: > Hi Zenghui, > > On 3/25/20 9:10 AM, Zenghui Yu wrote: > > Hi Eric, > > > > On 2020/3/20 17:24, Eric Auger wrote: > >> Introduce an helper functions to register > >> - a new device, characterized by its device id and the > >> max number of event IDs that dimension its ITT (Interrupt > >> Translation Table). The function allocates the ITT. > >> > >> - a new collection, characterized by its ID and the > >> target processing engine (PE). > >> > >> Signed-off-by: Eric Auger <eric.auger@redhat.com> > >> > >> --- > >> > >> v3 -> v4: > >> - remove unused its_baser variable from its_create_device() > >> - use get_order() > >> - device->itt becomes a GVA instead of GPA > >> > >> v2 -> v3: > >> - s/report_abort/assert > >> > >> v1 -> v2: > >> - s/nb_/nr_ > >> --- > >> lib/arm64/asm/gic-v3-its.h | 19 +++++++++++++++++++ > >> lib/arm64/gic-v3-its.c | 38 ++++++++++++++++++++++++++++++++++++++ > >> 2 files changed, 57 insertions(+) > >> > >> diff --git a/lib/arm64/asm/gic-v3-its.h b/lib/arm64/asm/gic-v3-its.h > >> index 4683011..adcb642 100644 > >> --- a/lib/arm64/asm/gic-v3-its.h > >> +++ b/lib/arm64/asm/gic-v3-its.h > >> @@ -31,6 +31,19 @@ struct its_baser { > >> }; > >> #define GITS_BASER_NR_REGS 8 > >> +#define GITS_MAX_DEVICES 8 > >> +#define GITS_MAX_COLLECTIONS 8 > >> + > >> +struct its_device { > >> + u32 device_id; /* device ID */ > >> + u32 nr_ites; /* Max Interrupt Translation Entries */ > >> + void *itt; /* Interrupt Translation Table GVA */ > >> +}; > >> + > >> +struct its_collection { > >> + u64 target_address; > >> + u16 col_id; > >> +}; > >> struct its_data { > >> void *base; > >> @@ -39,6 +52,10 @@ struct its_data { > >> struct its_baser coll_baser; > >> struct its_cmd_block *cmd_base; > >> struct its_cmd_block *cmd_write; > >> + struct its_device devices[GITS_MAX_DEVICES]; > >> + u32 nr_devices; /* Allocated Devices */ > >> + struct its_collection collections[GITS_MAX_COLLECTIONS]; > >> + u32 nr_collections; /* Allocated Collections */ > >> }; > >> extern struct its_data its_data; > >> @@ -93,5 +110,7 @@ extern void its_parse_typer(void); > >> extern void its_init(void); > >> extern int its_baser_lookup(int i, struct its_baser *baser); > >> extern void its_enable_defaults(void); > >> +extern struct its_device *its_create_device(u32 dev_id, int nr_ites); > >> +extern struct its_collection *its_create_collection(u32 col_id, u32 > >> target_pe); > > > > Maybe use 'u16 col_id'? > fair enough. At this point, not sure this is worth a respin though ;-) I'd like all the virt_to_phys calls removed where there are not necessary, which was pointed out in a different patch. This can be fixed up at the same time. Thanks, drew > > > > Besides, > > Reviewed-by: Zenghui Yu <yuzenghui@huawei.com> > Thanks! > > Eric > > > > > > > > > > Thanks > > > > > >
diff --git a/lib/arm64/asm/gic-v3-its.h b/lib/arm64/asm/gic-v3-its.h index 4683011..adcb642 100644 --- a/lib/arm64/asm/gic-v3-its.h +++ b/lib/arm64/asm/gic-v3-its.h @@ -31,6 +31,19 @@ struct its_baser { }; #define GITS_BASER_NR_REGS 8 +#define GITS_MAX_DEVICES 8 +#define GITS_MAX_COLLECTIONS 8 + +struct its_device { + u32 device_id; /* device ID */ + u32 nr_ites; /* Max Interrupt Translation Entries */ + void *itt; /* Interrupt Translation Table GVA */ +}; + +struct its_collection { + u64 target_address; + u16 col_id; +}; struct its_data { void *base; @@ -39,6 +52,10 @@ struct its_data { struct its_baser coll_baser; struct its_cmd_block *cmd_base; struct its_cmd_block *cmd_write; + struct its_device devices[GITS_MAX_DEVICES]; + u32 nr_devices; /* Allocated Devices */ + struct its_collection collections[GITS_MAX_COLLECTIONS]; + u32 nr_collections; /* Allocated Collections */ }; extern struct its_data its_data; @@ -93,5 +110,7 @@ extern void its_parse_typer(void); extern void its_init(void); extern int its_baser_lookup(int i, struct its_baser *baser); extern void its_enable_defaults(void); +extern struct its_device *its_create_device(u32 dev_id, int nr_ites); +extern struct its_collection *its_create_collection(u32 col_id, u32 target_pe); #endif /* _ASMARM64_GIC_V3_ITS_H_ */ diff --git a/lib/arm64/gic-v3-its.c b/lib/arm64/gic-v3-its.c index afc66a3..f0a0381 100644 --- a/lib/arm64/gic-v3-its.c +++ b/lib/arm64/gic-v3-its.c @@ -109,3 +109,41 @@ void its_enable_defaults(void) writel(GITS_CTLR_ENABLE, its_data.base + GITS_CTLR); } + +struct its_device *its_create_device(u32 device_id, int nr_ites) +{ + struct its_device *new; + unsigned long n; + + assert(its_data.nr_devices < GITS_MAX_DEVICES); + + new = &its_data.devices[its_data.nr_devices]; + + new->device_id = device_id; + new->nr_ites = nr_ites; + + n = (its_data.typer.ite_size * nr_ites) >> PAGE_SHIFT; + new->itt = alloc_pages(get_order(n)); + + its_data.nr_devices++; + return new; +} + +struct its_collection *its_create_collection(u32 col_id, u32 pe) +{ + struct its_collection *new; + + assert(its_data.nr_collections < GITS_MAX_COLLECTIONS); + + new = &its_data.collections[its_data.nr_collections]; + + new->col_id = col_id; + + if (its_data.typer.pta) + new->target_address = (u64)gicv3_data.redist_base[pe]; + else + new->target_address = pe << 16; + + its_data.nr_collections++; + return new; +}
Introduce an helper functions to register - a new device, characterized by its device id and the max number of event IDs that dimension its ITT (Interrupt Translation Table). The function allocates the ITT. - a new collection, characterized by its ID and the target processing engine (PE). Signed-off-by: Eric Auger <eric.auger@redhat.com> --- v3 -> v4: - remove unused its_baser variable from its_create_device() - use get_order() - device->itt becomes a GVA instead of GPA v2 -> v3: - s/report_abort/assert v1 -> v2: - s/nb_/nr_ --- lib/arm64/asm/gic-v3-its.h | 19 +++++++++++++++++++ lib/arm64/gic-v3-its.c | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+)