Home | History | Annotate | Download | only in AcpiTables
      1 /** @file
      2 *  Generic Timer Description Table (GTDT)
      3 *
      4 *  Copyright (c) 2012 - 2014, ARM Limited. All rights reserved.
      5 *  Copyright (c) 2016, Linaro Ltd. All rights reserved
      6 *
      7 *  This program and the accompanying materials
      8 *  are licensed and made available under the terms and conditions of the BSD License
      9 *  which accompanies this distribution.  The full text of the license may be found at
     10 *  http://opensource.org/licenses/bsd-license.php
     11 *
     12 *  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     13 *  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     14 *
     15 **/
     16 
     17 #include "FvpPlatform.h"
     18 #include <Library/AcpiLib.h>
     19 #include <Library/PcdLib.h>
     20 #include <IndustryStandard/Acpi61.h>
     21 
     22 #define FVP_SYSTEM_TIMER_BASE_ADDRESS   0x000000002a430000
     23 #define FVP_CNT_READ_BASE_ADDRESS       0x000000002a800000
     24 
     25 #define FVP_SECURE_TIMER_EL1_GSIV       0x1D
     26 #define FVP_NON_SECURE_TIMER_EL1_GSIV   0x1E
     27 #define FVP_VIRTUAL_TIMER_GSIV          0x1B
     28 #define FVP_NON_SECURE_EL2_GSIV         0x1A
     29 
     30 #define GTDT_TIMER_EDGE_TRIGGERED   EFI_ACPI_6_1_GTDT_TIMER_FLAG_TIMER_INTERRUPT_MODE
     31 #define GTDT_TIMER_LEVEL_TRIGGERED  0
     32 #define GTDT_TIMER_ACTIVE_LOW       EFI_ACPI_6_1_GTDT_TIMER_FLAG_TIMER_INTERRUPT_POLARITY
     33 #define GTDT_TIMER_ACTIVE_HIGH      0
     34 #define GTDT_TIMER_SAVE_CONTEXT     EFI_ACPI_6_1_GTDT_TIMER_FLAG_ALWAYS_ON_CAPABILITY
     35 #define GTDT_TIMER_LOSE_CONTEXT     0
     36 
     37 #define FVP_GTDT_GTIMER_FLAGS       (GTDT_TIMER_LOSE_CONTEXT | GTDT_TIMER_ACTIVE_HIGH | GTDT_TIMER_EDGE_TRIGGERED)
     38 
     39 #define FVP_PLATFORM_TIMER_COUNT    2
     40 #define FVP_TIMER_FRAMES_COUNT      2
     41 #define FVP_WATCHDOG_COUNT          1
     42 
     43 #define FVP_GT_BLOCK_CTL_BASE           0x000000002A810000
     44 #define FVP_GT_BLOCK_FRAME0_CTL_BASE    0x000000002A820000
     45 #define FVP_GT_BLOCK_FRAME0_CTL_EL0_BASE  0xFFFFFFFFFFFFFFFF
     46 #define FVP_GT_BLOCK_FRAME0_GSIV        0x39
     47 
     48 #define FVP_GT_BLOCK_FRAME1_CTL_BASE    0x000000002A830000
     49 #define FVP_GT_BLOCK_FRAME1_CTL_EL0_BASE  0xFFFFFFFFFFFFFFFF
     50 #define FVP_GT_BLOCK_FRAME1_GSIV        0x3A
     51 
     52 #define GTX_TIMER_EDGE_TRIGGERED    EFI_ACPI_6_1_GTDT_GT_BLOCK_TIMER_FLAG_TIMER_INTERRUPT_MODE
     53 #define GTX_TIMER_LEVEL_TRIGGERED   0
     54 #define GTX_TIMER_ACTIVE_LOW        EFI_ACPI_6_1_GTDT_GT_BLOCK_TIMER_FLAG_TIMER_INTERRUPT_POLARITY
     55 #define GTX_TIMER_ACTIVE_HIGH       0
     56 
     57 #define FVP_GTX_TIMER_FLAGS         (GTX_TIMER_ACTIVE_HIGH | GTX_TIMER_LEVEL_TRIGGERED)
     58 
     59 #define GTX_TIMER_SECURE            EFI_ACPI_6_1_GTDT_GT_BLOCK_COMMON_FLAG_SECURE_TIMER
     60 #define GTX_TIMER_NON_SECURE        0
     61 #define GTX_TIMER_SAVE_CONTEXT      EFI_ACPI_6_1_GTDT_GT_BLOCK_COMMON_FLAG_ALWAYS_ON_CAPABILITY
     62 #define GTX_TIMER_LOSE_CONTEXT      0
     63 
     64 #define FVP_GTX_COMMON_FLAGS        (GTX_TIMER_SAVE_CONTEXT | GTX_TIMER_SECURE)
     65 
     66 #define FVP_SBSA_WATCHDOG_REFRESH_BASE     0x000000002a450000
     67 #define FVP_SBSA_WATCHDOG_CONTROL_BASE     0x000000002a440000
     68 #define FVP_SBSA_WATCHDOG_GSIV             0x3B
     69 
     70 #define SBSA_WATCHDOG_EDGE_TRIGGERED   EFI_ACPI_6_1_GTDT_SBSA_GENERIC_WATCHDOG_FLAG_TIMER_INTERRUPT_MODE
     71 #define SBSA_WATCHDOG_LEVEL_TRIGGERED  0
     72 #define SBSA_WATCHDOG_ACTIVE_LOW       EFI_ACPI_6_1_GTDT_SBSA_GENERIC_WATCHDOG_FLAG_TIMER_INTERRUPT_POLARITY
     73 #define SBSA_WATCHDOG_ACTIVE_HIGH      0
     74 #define SBSA_WATCHDOG_SECURE           EFI_ACPI_6_1_GTDT_SBSA_GENERIC_WATCHDOG_FLAG_SECURE_TIMER
     75 #define SBSA_WATCHDOG_NON_SECURE       0
     76 
     77 #define FVP_SBSA_WATCHDOG_FLAGS            (SBSA_WATCHDOG_NON_SECURE | SBSA_WATCHDOG_ACTIVE_HIGH | SBSA_WATCHDOG_LEVEL_TRIGGERED)
     78 
     79 #pragma pack (1)
     80 
     81 typedef struct {
     82   EFI_ACPI_6_1_GENERIC_TIMER_DESCRIPTION_TABLE          Gtdt;
     83   EFI_ACPI_6_1_GTDT_GT_BLOCK_STRUCTURE                  GtBlock;
     84   EFI_ACPI_6_1_GTDT_GT_BLOCK_TIMER_STRUCTURE            Frames[FVP_TIMER_FRAMES_COUNT];
     85   EFI_ACPI_6_1_GTDT_SBSA_GENERIC_WATCHDOG_STRUCTURE     Watchdogs[FVP_WATCHDOG_COUNT];
     86 } FVP_GENERIC_TIMER_DESCRIPTION_TABLES;
     87 
     88 #pragma pack ()
     89 
     90 FVP_GENERIC_TIMER_DESCRIPTION_TABLES Gtdt = {
     91   {
     92     ARM_ACPI_HEADER(
     93       EFI_ACPI_6_1_GENERIC_TIMER_DESCRIPTION_TABLE_SIGNATURE,
     94       FVP_GENERIC_TIMER_DESCRIPTION_TABLES,
     95       EFI_ACPI_6_1_GENERIC_TIMER_DESCRIPTION_TABLE_REVISION
     96     ),
     97     FVP_SYSTEM_TIMER_BASE_ADDRESS,                        // UINT64  PhysicalAddress
     98     EFI_ACPI_RESERVED_DWORD,                              // UINT32  Reserved
     99     FVP_SECURE_TIMER_EL1_GSIV,                            // UINT32  SecurePL1TimerGSIV
    100     FVP_GTDT_GTIMER_FLAGS,                                // UINT32  SecurePL1TimerFlags
    101     FVP_NON_SECURE_TIMER_EL1_GSIV,                        // UINT32  NonSecurePL1TimerGSIV
    102     FVP_GTDT_GTIMER_FLAGS,                                // UINT32  NonSecurePL1TimerFlags
    103     FVP_VIRTUAL_TIMER_GSIV,                               // UINT32  VirtualTimerGSIV
    104     FVP_GTDT_GTIMER_FLAGS,                                // UINT32  VirtualTimerFlags
    105     FVP_NON_SECURE_EL2_GSIV,                              // UINT32  NonSecurePL2TimerGSIV
    106     FVP_GTDT_GTIMER_FLAGS,                                // UINT32  NonSecurePL2TimerFlags
    107     FVP_CNT_READ_BASE_ADDRESS,                            // UINT64  CntReadBasePhysicalAddress
    108     FVP_PLATFORM_TIMER_COUNT,                             // UINT32  PlatformTimerCount
    109     sizeof (EFI_ACPI_6_1_GENERIC_TIMER_DESCRIPTION_TABLE) // UINT32  PlatfromTimerOffset
    110   },
    111   {
    112     EFI_ACPI_6_1_GTDT_GT_BLOCK,                           // UINT8 Type
    113     sizeof(EFI_ACPI_6_1_GTDT_GT_BLOCK_STRUCTURE)          // UINT16 Length
    114       + sizeof(EFI_ACPI_6_1_GTDT_GT_BLOCK_TIMER_STRUCTURE) *
    115         FVP_TIMER_FRAMES_COUNT,
    116     EFI_ACPI_RESERVED_BYTE,                               // UINT8 Reserved
    117     FVP_GT_BLOCK_CTL_BASE,                                // UINT64 CntCtlBase
    118     FVP_TIMER_FRAMES_COUNT,                               // UINT32 GTBlockTimerCount
    119     sizeof(EFI_ACPI_6_1_GTDT_GT_BLOCK_STRUCTURE)          // UINT32 GTBlockTimerOffset
    120   },
    121   {
    122     {
    123       0,                                                    // UINT8 GTFrameNumber
    124       {EFI_ACPI_RESERVED_BYTE,
    125        EFI_ACPI_RESERVED_BYTE,
    126        EFI_ACPI_RESERVED_BYTE},                             // UINT8 Reserved[3]
    127       FVP_GT_BLOCK_FRAME0_CTL_BASE,                         // UINT64 CntBaseX
    128       FVP_GT_BLOCK_FRAME0_CTL_EL0_BASE,                     // UINT64 CntEL0BaseX
    129       FVP_GT_BLOCK_FRAME0_GSIV,                             // UINT32 GTxPhysicalTimerGSIV
    130       FVP_GTX_TIMER_FLAGS,                                  // UINT32 GTxPhysicalTimerFlags
    131       0,                                                    // UINT32 GTxVirtualTimerGSIV
    132       0,                                                    // UINT32 GTxVirtualTimerFlags
    133       FVP_GTX_COMMON_FLAGS                                  // UINT32 GTxCommonFlags
    134     },
    135     {
    136       1,                                                    // UINT8 GTFrameNumber
    137       {EFI_ACPI_RESERVED_BYTE,
    138        EFI_ACPI_RESERVED_BYTE,
    139        EFI_ACPI_RESERVED_BYTE},                             // UINT8 Reserved[3]
    140       FVP_GT_BLOCK_FRAME1_CTL_BASE,                         // UINT64 CntBaseX
    141       FVP_GT_BLOCK_FRAME1_CTL_EL0_BASE,                     // UINT64 CntEL0BaseX
    142       FVP_GT_BLOCK_FRAME1_GSIV,                             // UINT32 GTxPhysicalTimerGSIV
    143       FVP_GTX_TIMER_FLAGS,                                  // UINT32 GTxPhysicalTimerFlags
    144       0,                                                    // UINT32 GTxVirtualTimerGSIV
    145       0,                                                    // UINT32 GTxVirtualTimerFlags
    146       FVP_GTX_COMMON_FLAGS                                  // UINT32 GTxCommonFlags
    147     }
    148   },
    149   {
    150     {
    151       EFI_ACPI_6_1_GTDT_SBSA_GENERIC_WATCHDOG,                // UINT8 Type
    152       sizeof(EFI_ACPI_6_1_GTDT_SBSA_GENERIC_WATCHDOG_STRUCTURE), // UINT16 Length
    153       EFI_ACPI_RESERVED_BYTE,                                 // UINT8 Reserved
    154       FVP_SBSA_WATCHDOG_REFRESH_BASE,                         // UINT64 RefreshFramePhysicalAddress
    155       FVP_SBSA_WATCHDOG_CONTROL_BASE,                         // UINT64 WatchdogControlFramePhysicalAddress
    156       FVP_SBSA_WATCHDOG_GSIV,                                 // UINT32 WatchdogTimerGSIV
    157       FVP_SBSA_WATCHDOG_FLAGS                                 // UINT32 WatchdogTimerFlags
    158     }
    159   }
    160 };
    161 
    162 //
    163 // Reference the table being generated to prevent the optimizer from removing the
    164 // data structure from the executable
    165 //
    166 VOID* CONST ReferenceAcpiTable = &Gtdt;
    167