]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Drivers/PL390Gic/PL390Gic.c
OvmfPkg/Virtio.h: Added the Virtio Vendor and MMIO IDs
[mirror_edk2.git] / ArmPkg / Drivers / PL390Gic / PL390Gic.c
CommitLineData
55a0d64b 1/** @file\r
2*\r
e9f7c58f 3* Copyright (c) 2011-2012, ARM Limited. All rights reserved.\r
55a0d64b 4* \r
5* This program and the accompanying materials \r
6* are licensed and made available under the terms and conditions of the BSD License \r
7* which accompanies this distribution. The full text of the license may be found at \r
8* http://opensource.org/licenses/bsd-license.php \r
9*\r
10* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
11* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
12*\r
13**/\r
14\r
15#include <Uefi.h>\r
16#include <Library/IoLib.h>\r
17#include <Library/ArmGicLib.h>\r
be613c8b 18#include <Library/PcdLib.h>\r
55a0d64b 19\r
e9f7c58f 20UINTN\r
21EFIAPI\r
22ArmGicGetMaxNumInterrupts (\r
23 IN INTN GicDistributorBase\r
24 )\r
25{\r
26 return 32 * ((MmioRead32 (GicDistributorBase + ARM_GIC_ICDICTR) & 0x1F) + 1);\r
27}\r
28\r
55a0d64b 29VOID\r
30EFIAPI\r
31ArmGicSendSgiTo (\r
32 IN INTN GicDistributorBase,\r
33 IN INTN TargetListFilter,\r
4c19ece3 34 IN INTN CPUTargetList,\r
35 IN INTN SgiId\r
55a0d64b 36 )\r
37{\r
4c19ece3 38 MmioWrite32 (GicDistributorBase + ARM_GIC_ICDSGIR, ((TargetListFilter & 0x3) << 24) | ((CPUTargetList & 0xFF) << 16) | SgiId);\r
55a0d64b 39}\r
40\r
315649cd 41RETURN_STATUS\r
55a0d64b 42EFIAPI\r
315649cd 43ArmGicAcknowledgeInterrupt (\r
44 IN UINTN GicDistributorBase,\r
45 IN UINTN GicInterruptInterfaceBase,\r
46 OUT UINTN *CoreId,\r
47 OUT UINTN *InterruptId\r
55a0d64b 48 )\r
49{\r
315649cd 50 UINT32 Interrupt;\r
55a0d64b 51\r
315649cd 52 // Read the Interrupt Acknowledge Register\r
53 Interrupt = MmioRead32 (GicInterruptInterfaceBase + ARM_GIC_ICCIAR);\r
55a0d64b 54\r
315649cd 55 // Check if it is a valid interrupt ID\r
56 if ((Interrupt & 0x3FF) < ArmGicGetMaxNumInterrupts (GicDistributorBase)) {\r
57 // Got a valid SGI number hence signal End of Interrupt by writing to ICCEOIR\r
58 MmioWrite32 (GicInterruptInterfaceBase + ARM_GIC_ICCEIOR, Interrupt);\r
55a0d64b 59\r
315649cd 60 if (CoreId) {\r
61 *CoreId = (Interrupt >> 10) & 0x7;\r
62 }\r
63 if (InterruptId) {\r
64 *InterruptId = Interrupt & 0x3FF;\r
65 }\r
66 return RETURN_SUCCESS;\r
55a0d64b 67 } else {\r
315649cd 68 return RETURN_INVALID_PARAMETER;\r
55a0d64b 69 }\r
70}\r