[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v5 14/24] hvmloader: construct SLIT



On 12/02/15 19:44, Wei Liu wrote:
> Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx>
> Acked-by: Jan Beulich <JBeulich@xxxxxxxx>

Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>

> ---
> 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. */


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.