Changeset 275


Ignore:
Timestamp:
Jul 26, 2017, 1:20:36 PM (4 years ago)
Author:
max@…
Message:

Add a SRAT parser. For some reason, QEMU does not want to enable the
memory ranges...

Location:
trunk/hal/x86_64/core
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/hal/x86_64/core/hal_acpi.c

    r241 r275  
    173173/* -------------------------------------------------------------------------- */
    174174
     175static void hal_acpi_parse_srat(srat_t *srat)
     176{
     177        srat_cpu_affinity_t *cpu;
     178        srat_mem_affinity_t *mem;
     179        void *ptr, *end;
     180        subheader_t *sub;
     181        uint32_t dom;
     182
     183        ptr = (void *)(srat + 1);
     184        end = (void *)srat + srat->Header.Length;
     185
     186        while (ptr < end) {
     187                sub = (subheader_t *)ptr;
     188                if (sub->Type == ACPI_SRAT_TYPE_CPU_AFFINITY) {
     189                        cpu = (srat_cpu_affinity_t *)sub;
     190                        if (cpu->Flags & ACPI_SRAT_CPU_USE_AFFINITY) {
     191                                dom = ((uint32_t)cpu->ProximityDomainHi[2] << 24) |
     192                                      ((uint32_t)cpu->ProximityDomainHi[1] << 16) |
     193                                      ((uint32_t)cpu->ProximityDomainHi[0] << 8) |
     194                                       (uint32_t)cpu->ProximityDomainLo;
     195                                x86_printf("-> found CPU affinity: %z->%z\n",
     196                                    (uint64_t)cpu->ApicId, (uint64_t)dom);
     197                        }
     198                } else if (sub->Type == ACPI_SRAT_TYPE_MEMORY_AFFINITY) {
     199                        mem = (srat_mem_affinity_t *)sub;
     200//                      if (mem->Flags & ACPI_SRAT_MEM_ENABLED)
     201                                x86_printf("-> found MEM affinity: %z->[%Z,%Z,%Z]\n",
     202                                    mem->ProximityDomain,
     203                                    mem->BaseAddress, mem->Length,(uint64_t)mem->Flags);
     204                }
     205
     206                ptr += sub->Length;
     207        }
     208
     209}
     210
     211static srat_t *hal_acpi_map_srat(rsdt_t *rsdt)
     212{
     213        vaddr_t va;
     214        paddr_t pa;
     215        uint32_t *ent;
     216        size_t i, n;
     217
     218        n = RSDT_NENTRIES(rsdt);
     219        ent = RSDT_ENTRIES(rsdt);
     220
     221        for (i = 0; i < n; i++) {
     222                pa = (paddr_t)ent[i];
     223                va = hal_acpi_map_table(pa, "SRAT");
     224                if (va == 0)
     225                        continue;
     226
     227                return (srat_t *)va;
     228        }
     229
     230        return NULL;
     231}
     232
     233/* -------------------------------------------------------------------------- */
     234
    175235static rsdt_t *hal_acpi_map_rsdt(rsdp_t *rsdp)
    176236{
     
    242302        rsdt_t *rsdt;
    243303        madt_t *madt;
     304        srat_t *srat;
    244305        paddr_t bios_min = 0x0E0000;
    245306        paddr_t bios_max = 0x100000;
     
    262323                x86_panic("RSDT not found");
    263324
    264         /* Now, map MADT */
     325        /* Map MADT and parse it */
    265326        madt = hal_acpi_map_madt(rsdt);
    266327        if (madt == NULL)
    267328                x86_panic("MADT not found");
    268 
    269         /* Parse it */
    270329        hal_acpi_parse_madt(madt);
    271 }
    272 
     330
     331        /* Map SRAT and parse it */
     332        srat = hal_acpi_map_srat(rsdt);
     333        if (srat != NULL)
     334                hal_acpi_parse_srat(srat);
     335        else
     336                x86_printf("-> SRAT not found, single cluster\n");
     337}
     338
  • trunk/hal/x86_64/core/hal_acpi.h

    r241 r275  
    192192typedef struct acpi_madt_io_apic madt_ioapic_t;
    193193
     194/*******************************************************************************
     195 * SRAT - System Resource Affinity Table
     196 *        Version 3
     197 ******************************************************************************/
     198
     199struct acpi_table_srat {
     200        header_t Header;        /* Common ACPI table header */
     201        uint32_t TableRevision; /* Must be value '1' */
     202        uint64_t Reserved;      /* Reserved, must be zero */
     203};
     204typedef struct acpi_table_srat  srat_t;
     205
     206/*******************************************************************************
     207 * SRAT structures
     208 ******************************************************************************/
     209
     210enum AcpiSratType {
     211        ACPI_SRAT_TYPE_CPU_AFFINITY        = 0,
     212        ACPI_SRAT_TYPE_MEMORY_AFFINITY     = 1,
     213        ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY = 2,
     214        ACPI_SRAT_TYPE_GICC_AFFINITY       = 3,
     215        ACPI_SRAT_TYPE_RESERVED            = 4  /* 4 and greater are reserved */
     216};
     217
     218#define ACPI_SRAT_CPU_USE_AFFINITY  (1) /* 00: Use affinity structure */
     219
     220struct acpi_srat_cpu_affinity {
     221        subheader_t Header;
     222        uint8_t ProximityDomainLo;
     223        uint8_t ApicId;
     224        uint32_t Flags;
     225        uint8_t LocalSapicEid;
     226        uint8_t ProximityDomainHi[3];
     227        uint32_t ClockDomain;
     228};
     229typedef struct acpi_srat_cpu_affinity   srat_cpu_affinity_t;
     230
     231#define ACPI_SRAT_MEM_ENABLED       (1)    /* 00: Use affinity structure */
     232#define ACPI_SRAT_MEM_HOT_PLUGGABLE (1<<1) /* 01: Memory region is hot pluggable */
     233#define ACPI_SRAT_MEM_NON_VOLATILE  (1<<2) /* 02: Memory region is non-volatile */
     234
     235struct acpi_srat_mem_affinity {
     236        subheader_t Header;
     237        uint32_t ProximityDomain;
     238        uint16_t Reserved;        /* Reserved, must be zero */
     239        uint64_t BaseAddress;
     240        uint64_t Length;
     241        uint32_t Reserved1;
     242        uint32_t Flags;
     243        uint64_t Reserved2;       /* Reserved, must be zero */
     244};
     245typedef struct acpi_srat_mem_affinity   srat_mem_affinity_t;
     246
Note: See TracChangeset for help on using the changeset viewer.