From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrew Cooper Subject: Re: [PATCH v5 14/24] hvmloader: construct SLIT Date: Fri, 13 Feb 2015 16:10:05 +0000 Message-ID: <54DE21DD.7090903@citrix.com> References: <1423770294-9779-1-git-send-email-wei.liu2@citrix.com> <1423770294-9779-15-git-send-email-wei.liu2@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1423770294-9779-15-git-send-email-wei.liu2@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Wei Liu , xen-devel@lists.xen.org Cc: dario.faggioli@citrix.com, JBeulich@suse.com, ian.jackson@eu.citrix.com, ian.campbell@citrix.com, ufimtseva@gmail.com List-Id: xen-devel@lists.xenproject.org On 12/02/15 19:44, Wei Liu wrote: > Signed-off-by: Wei Liu > Acked-by: Jan Beulich Reviewed-by: Andrew Cooper > --- > Changes in v3: > 1. Coding style fix. > 2. Fix an error code. > 3. Use unsigned int for loop variable. > > Changes in v2: > 1. Adapt to new vNUMA retrieval routine. > 2. Move SLIT very late in secondary table build. > --- > tools/firmware/hvmloader/acpi/acpi2_0.h | 8 +++++++ > tools/firmware/hvmloader/acpi/build.c | 40 ++++++++++++++++++++++++++++++++- > 2 files changed, 47 insertions(+), 1 deletion(-) > > diff --git a/tools/firmware/hvmloader/acpi/acpi2_0.h b/tools/firmware/hvmloader/acpi/acpi2_0.h > index 6169213..d698095 100644 > --- a/tools/firmware/hvmloader/acpi/acpi2_0.h > +++ b/tools/firmware/hvmloader/acpi/acpi2_0.h > @@ -414,6 +414,12 @@ struct acpi_20_srat_memory { > #define ACPI_MEM_AFFIN_HOTPLUGGABLE (1 << 1) > #define ACPI_MEM_AFFIN_NONVOLATILE (1 << 2) > > +struct acpi_20_slit { > + struct acpi_header header; > + uint64_t localities; > + uint8_t entry[0]; > +}; > + > /* > * Table Signatures. > */ > @@ -427,6 +433,7 @@ struct acpi_20_srat_memory { > #define ACPI_2_0_HPET_SIGNATURE ASCII32('H','P','E','T') > #define ACPI_2_0_WAET_SIGNATURE ASCII32('W','A','E','T') > #define ACPI_2_0_SRAT_SIGNATURE ASCII32('S','R','A','T') > +#define ACPI_2_0_SLIT_SIGNATURE ASCII32('S','L','I','T') > > /* > * Table revision numbers. > @@ -441,6 +448,7 @@ struct acpi_20_srat_memory { > #define ACPI_2_0_WAET_REVISION 0x01 > #define ACPI_1_0_FADT_REVISION 0x01 > #define ACPI_2_0_SRAT_REVISION 0x01 > +#define ACPI_2_0_SLIT_REVISION 0x01 > > #pragma pack () > > diff --git a/tools/firmware/hvmloader/acpi/build.c b/tools/firmware/hvmloader/acpi/build.c > index 3e96c23..7dac6a8 100644 > --- a/tools/firmware/hvmloader/acpi/build.c > +++ b/tools/firmware/hvmloader/acpi/build.c > @@ -264,6 +264,38 @@ static struct acpi_20_srat *construct_srat(void) > return srat; > } > > +static struct acpi_20_slit *construct_slit(void) > +{ > + struct acpi_20_slit *slit; > + unsigned int i, num, size; > + > + num = nr_vnodes * nr_vnodes; > + size = sizeof(*slit) + num * sizeof(uint8_t); > + > + slit = mem_alloc(size, 16); > + if ( !slit ) > + return NULL; > + > + memset(slit, 0, size); > + slit->header.signature = ACPI_2_0_SLIT_SIGNATURE; > + slit->header.revision = ACPI_2_0_SLIT_REVISION; > + fixed_strcpy(slit->header.oem_id, ACPI_OEM_ID); > + fixed_strcpy(slit->header.oem_table_id, ACPI_OEM_TABLE_ID); > + slit->header.oem_revision = ACPI_OEM_REVISION; > + slit->header.creator_id = ACPI_CREATOR_ID; > + slit->header.creator_revision = ACPI_CREATOR_REVISION; > + > + for ( i = 0; i < num; i++ ) > + slit->entry[i] = vdistance[i]; > + > + slit->localities = nr_vnodes; > + > + slit->header.length = size; > + set_checksum(slit, offsetof(struct acpi_header, checksum), size); > + > + return slit; > +} > + > static int construct_passthrough_tables(unsigned long *table_ptrs, > int nr_tables) > { > @@ -319,6 +351,7 @@ static int construct_secondary_tables(unsigned long *table_ptrs, > struct acpi_20_waet *waet; > struct acpi_20_tcpa *tcpa; > struct acpi_20_srat *srat; > + struct acpi_20_slit *slit; > unsigned char *ssdt; > static const uint16_t tis_signature[] = {0x0001, 0x0001, 0x0001}; > uint16_t *tis_hdr; > @@ -408,7 +441,7 @@ static int construct_secondary_tables(unsigned long *table_ptrs, > } > } > > - /* SRAT */ > + /* SRAT and SLIT */ > if ( nr_vnodes > 0 ) > { > srat = construct_srat(); > @@ -416,6 +449,11 @@ static int construct_secondary_tables(unsigned long *table_ptrs, > table_ptrs[nr_tables++] = (unsigned long)srat; > else > printf("Failed to build SRAT, skipping...\n"); > + slit = construct_slit(); > + if ( slit ) > + table_ptrs[nr_tables++] = (unsigned long)slit; > + else > + printf("Failed to build SLIT, skipping...\n"); > } > > /* Load any additional tables passed through. */