]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Drivers/PL390Gic/PL390Gic.c
ArmPkg/ArmGicLib: Changed ArmGicSendSgiTo() to allow to send a specific SGI
[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
41UINT32\r
42EFIAPI\r
43ArmGicAcknowledgeSgiFrom (\r
44 IN INTN GicInterruptInterfaceBase,\r
45 IN INTN CoreId\r
46 )\r
47{\r
48 INTN InterruptId;\r
49\r
50 InterruptId = MmioRead32 (GicInterruptInterfaceBase + ARM_GIC_ICCIAR);\r
51\r
52 // Check if the Interrupt ID is valid, The read from Interrupt Ack register returns CPU ID and Interrupt ID\r
be613c8b 53 if ((((CoreId & 0x7) << 10) | PcdGet32(PcdGicSgiIntId)) == InterruptId) {\r
55a0d64b 54 // Got SGI number 0 hence signal End of Interrupt by writing to ICCEOIR\r
55 MmioWrite32 (GicInterruptInterfaceBase + ARM_GIC_ICCEIOR, InterruptId);\r
56 return 1;\r
57 } else {\r
58 return 0;\r
59 }\r
60}\r
61\r
62UINT32\r
63EFIAPI\r
64ArmGicAcknowledgeSgi2From (\r
65 IN INTN GicInterruptInterfaceBase,\r
66 IN INTN CoreId,\r
67 IN INTN SgiId\r
68 )\r
69{\r
70 INTN InterruptId;\r
71\r
72 InterruptId = MmioRead32(GicInterruptInterfaceBase + ARM_GIC_ICCIAR);\r
73\r
74 // Check if the Interrupt ID is valid, The read from Interrupt Ack register returns CPU ID and Interrupt ID\r
75 if((((CoreId & 0x7) << 10) | (SgiId & 0x3FF)) == (InterruptId & 0x1FFF)) {\r
76 // Got SGI number 0 hence signal End of Interrupt by writing to ICCEOIR\r
77 MmioWrite32 (GicInterruptInterfaceBase + ARM_GIC_ICCEIOR, InterruptId);\r
78 return 1;\r
79 } else {\r
80 return 0;\r
81 }\r
82}\r