uboot/arch/x86/cpu/tangier/acpi.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * Copyright (c) 2017 Intel Corporation
   4 *
   5 * Partially based on acpi.c for other x86 platforms
   6 */
   7
   8#include <common.h>
   9#include <cpu.h>
  10#include <dm.h>
  11#include <acpi/acpi_table.h>
  12#include <asm/ioapic.h>
  13#include <asm/mpspec.h>
  14#include <asm/tables.h>
  15#include <asm/arch/global_nvs.h>
  16#include <asm/arch/iomap.h>
  17#include <dm/uclass-internal.h>
  18
  19void acpi_create_fadt(struct acpi_fadt *fadt, struct acpi_facs *facs,
  20                      void *dsdt)
  21{
  22        struct acpi_table_header *header = &(fadt->header);
  23
  24        memset((void *)fadt, 0, sizeof(struct acpi_fadt));
  25
  26        acpi_fill_header(header, "FACP");
  27        header->length = sizeof(struct acpi_fadt);
  28        header->revision = 6;
  29
  30        fadt->firmware_ctrl = (u32)facs;
  31        fadt->dsdt = (u32)dsdt;
  32        fadt->preferred_pm_profile = ACPI_PM_UNSPECIFIED;
  33
  34        fadt->iapc_boot_arch = ACPI_FADT_VGA_NOT_PRESENT |
  35                               ACPI_FADT_NO_PCIE_ASPM_CONTROL;
  36        fadt->flags =
  37                ACPI_FADT_WBINVD |
  38                ACPI_FADT_POWER_BUTTON | ACPI_FADT_SLEEP_BUTTON |
  39                ACPI_FADT_SEALED_CASE | ACPI_FADT_HEADLESS |
  40                ACPI_FADT_HW_REDUCED_ACPI;
  41
  42        fadt->minor_revision = 2;
  43
  44        fadt->x_firmware_ctl_l = (u32)facs;
  45        fadt->x_firmware_ctl_h = 0;
  46        fadt->x_dsdt_l = (u32)dsdt;
  47        fadt->x_dsdt_h = 0;
  48
  49        header->checksum = table_compute_checksum(fadt, header->length);
  50}
  51
  52u32 acpi_fill_madt(u32 current)
  53{
  54        current += acpi_create_madt_lapics(current);
  55
  56        current += acpi_create_madt_ioapic((struct acpi_madt_ioapic *)current,
  57                        io_apic_read(IO_APIC_ID) >> 24, IO_APIC_ADDR, 0);
  58
  59        return current;
  60}
  61
  62int acpi_fill_mcfg(struct acpi_ctx *ctx)
  63{
  64        size_t size;
  65
  66        /* TODO: Derive parameters from SFI MCFG table */
  67        size = acpi_create_mcfg_mmconfig
  68                ((struct acpi_mcfg_mmconfig *)ctx->current,
  69                MCFG_BASE_ADDRESS, 0x0, 0x0, 0x0);
  70        acpi_inc(ctx, size);
  71
  72        return 0;
  73}
  74
  75static u32 acpi_fill_csrt_dma(struct acpi_csrt_group *grp)
  76{
  77        struct acpi_csrt_shared_info *si = (struct acpi_csrt_shared_info *)&grp[1];
  78
  79        /* Fill the Resource Group with Shared Information attached */
  80        memset(grp, 0, sizeof(*grp));
  81        grp->shared_info_length = sizeof(struct acpi_csrt_shared_info);
  82        grp->length = sizeof(struct acpi_csrt_group) + grp->shared_info_length;
  83        /* TODO: All values below should come from U-Boot DT somehow */
  84        sprintf((char *)&grp->vendor_id, "%04X", 0x8086);
  85        grp->device_id = 0x11a2;
  86
  87        /* Fill the Resource Group Shared Information */
  88        memset(si, 0, sizeof(*si));
  89        si->major_version = 1;
  90        si->minor_version = 0;
  91        /* TODO: All values below should come from U-Boot DT somehow */
  92        si->mmio_base_low = 0xff192000;
  93        si->mmio_base_high = 0;
  94        si->gsi_interrupt = 32;
  95        si->interrupt_polarity = 0;     /* Active High */
  96        si->interrupt_mode = 0;         /* Level triggered */
  97        si->num_channels = 8;
  98        si->dma_address_width = 32;
  99        si->base_request_line = 0;
 100        si->num_handshake_signals = 16;
 101        si->max_block_size = 0x1ffff;
 102
 103        return grp->length;
 104}
 105
 106int acpi_fill_csrt(struct acpi_ctx *ctx)
 107{
 108        int size;
 109
 110        size = acpi_fill_csrt_dma(ctx->current);
 111        acpi_inc(ctx, size);
 112
 113        return 0;
 114}
 115
 116int acpi_create_gnvs(struct acpi_global_nvs *gnvs)
 117{
 118        struct udevice *dev;
 119        int ret;
 120
 121        /* at least we have one processor */
 122        gnvs->pcnt = 1;
 123
 124        /* override the processor count with actual number */
 125        ret = uclass_find_first_device(UCLASS_CPU, &dev);
 126        if (ret == 0 && dev != NULL) {
 127                ret = cpu_get_count(dev);
 128                if (ret > 0)
 129                        gnvs->pcnt = ret;
 130        }
 131
 132        return 0;
 133}
 134