From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=40.107.0.73; helo=eur02-am5-obe.outbound.protection.outlook.com; envelope-from=meenakshi.aggarwal@nxp.com; receiver=edk2-devel@lists.01.org Received: from EUR02-AM5-obe.outbound.protection.outlook.com (mail-eopbgr00073.outbound.protection.outlook.com [40.107.0.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id D7BEC223230CB for ; Fri, 16 Feb 2018 00:49:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=IVmzEjjZizNwTmFvU35pSGodaVIdorOvRozWvEUZTrc=; b=EY02koAeCD6lWOmP+T+pQ8G127xMHakGCHtnK/pasQQwp0KNd2JThwAu8Vmbx/d9mh25bFhHzlpRRIhXfZVsnepkTZvFcH5s1a3Q2h9pBHFEHsr7nYiHbmDNLQIlYkncN5oUr2yp3CZUDTZ2TyJRQs9QU7HMhGLySM7JNs6J0Js= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=meenakshi.aggarwal@nxp.com; Received: from idcbfarm.ap.freescale.net (192.88.169.1) by VI1PR04MB1008.eurprd04.prod.outlook.com (2a01:111:e400:5090::28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.485.10; Fri, 16 Feb 2018 08:54:57 +0000 From: Meenakshi To: ard.biesheuvel@linaro.org, leif.lindholm@linaro.org, michael.d.kinney@intel.com, edk2-devel@lists.01.org Date: Fri, 16 Feb 2018 14:20:29 +0530 Message-Id: <1518771035-6733-34-git-send-email-meenakshi.aggarwal@nxp.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1518771035-6733-1-git-send-email-meenakshi.aggarwal@nxp.com> References: <1518771035-6733-1-git-send-email-meenakshi.aggarwal@nxp.com> MIME-Version: 1.0 X-Originating-IP: [192.88.169.1] X-ClientProxiedBy: HK2PR02CA0172.apcprd02.prod.outlook.com (2603:1096:201:1f::32) To VI1PR04MB1008.eurprd04.prod.outlook.com (2a01:111:e400:5090::28) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 36f50cb3-b2ea-4d91-7aa1-08d5751af770 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(48565401081)(5600026)(4604075)(4534165)(4627221)(201703031133081)(201702281549075)(2017052603307)(7153060)(7193020); SRVR:VI1PR04MB1008; X-Microsoft-Exchange-Diagnostics: 1; VI1PR04MB1008; 3:GKVk7Pl+HMhf+of7pIUIEm4+aGuZzWq3UONhGNS6bAosZZ4hIHrXGIJ4CQ1BJLnoJiTvqwcTNfRh4HXkPsCmsth8wwKTPVCHTjh9R3OuBS60SzrasvOtHrNGpREBeCsw3TkolTzNDXz5kAnFyE7cjcrifwzdjrkdydZQjv/o35RCdSKeGuqsvigtVifeTg48F/DKnTolpInS0l019CtD1sKxIzXL6iRvcGkn5qdJ3sAjOEqxANsTin3qfK3zBrTl; 25:yqFBWcFGrtV9cUvH8m+dmKcFdsgEANfhHIr//gevE4PdsOZkMez0LpXNbL/bJvbYxvg5q+BdrgEolV5jkw1/+V0PbQCsHNhj7fOEPbWtEBuQnP2KtBDZ4qo70lqZnghLU0huH1t+O3YtApyq9pDgyV2xAHpaxKYXDNDDEhENmpYagv5lFVMWbcmOzdP2S4DJXGWZbcF2MxEu9KdDyFx+d+X9DTsZ/8UJbWqLO+EDJJCon3sVb7stBGE8rpLGnflY7KEKq+ZITri6cq0uRzEWiDMrnpKoIWz+CZFDS77Ks/BRP2YSXacIn0mxh02bVvwk/vDLHVxHLIa7ZiyQPQZGyA==; 31:FB9Y7kXnSYuQefFZkZyMGmYg5VEeY7CDlvOEq4XJxYZ33dwrvv4wwAxNd3oWb9o9AzvGSPGljB01v8lvwxQgm3daP8RbJXmC/NTY7ImLA5P/vAhZ+9XO+VMD8DVaYGqRTcx2oHfM2UtFRTWZ5b8+nDNUvEUsqRrinimN8JDbymeO5DgY4eidrT9qRx8/aPON+Q0qMxZDGm3IwavbxTulFAWOtYf+JOEFOeXSlE1SEUo= X-MS-TrafficTypeDiagnostic: VI1PR04MB1008: X-Microsoft-Exchange-Diagnostics: 1; VI1PR04MB1008; 20:U5ibOpuWr0jQ2KiK+cWDsB+jMJ9IJff6cAwapqnFWBLZLQzc6fQ/W6He15rwuUEg7RlGTHW2BgrgUyoUCBzACSEFHznBIH6tIkes6Hf7gFrcXlXcuBjxXP+c1U+VTUR1kIsrFmTONLYaX19OSbviwRui7VP3dlUTBD3SGDyGbVhPM/9Fks9bMxkj62qj3Tsl0lW2SifNq0BbGKqLNyKjGZXB41HJuyENFdU+lOOGbUctb/DBzb8bZ84/Ve5SJUaxzbIqt63D+CEH2KxSiuqO348tpy3QPrTgKkhM8i63nlv/BsBfmIlX5vqskIFK4wd8MTE0+YkPWtE6UYoKem2I+EfI8Uzt7giHt5JjdtvNFA64iW/ZVLLwicgCNUAiGc5klpM3MTcgPwtY4r85+c/OqAK9pc0ZKHzd0CaSo2towfeeiQHoKSwSau229lnb+DVZ2Ixg/0hw4g20GrWGnIuBZNufbMUF6+sD3hnd6i5822s/FEyoLFeMvVswWwBm9/dB; 4:xCS3JR7qgcoJ5zjRzLiNf86QeF728dt+qV91SFjSwmilnjWJpxtcmqO3348dAgFGf3X1jPEuLcUJPx5b14nisnMoJ7RrQ2KRW6yvPRu/4Fx/9TJG1SR+P9KBcEUMFYSJ+vkNGRS2Vcu0w/GSyOP2woBocS3gav6vmUz4QF4WyxIWvn+LfloFl8mi44fss6a0DZ/XLNGtUazrXR3TkhKWJv8mn/UqI21m4XlVyxBAEQpvIZlKPFYt4LdAOaj0lpKzNm8449r/7HZfxCd4ViqtHgRKteCsF9eUgu6L+j4hQGNPsSsMvSa/WJ3Z4sER7vy5 X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(8121501046)(5005006)(93006095)(93001095)(10201501046)(3002001)(3231101)(944501161)(6055026)(6041288)(20161123558120)(20161123564045)(20161123560045)(20161123562045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(6072148)(201708071742011); SRVR:VI1PR04MB1008; BCL:0; PCL:0; RULEID:; SRVR:VI1PR04MB1008; X-Forefront-PRVS: 0585417D7B X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(346002)(376002)(39380400002)(396003)(39860400002)(366004)(199004)(189003)(86362001)(575784001)(6486002)(8676002)(76176011)(36756003)(53376002)(966005)(4326008)(6116002)(15188155005)(16799955002)(7736002)(386003)(68736007)(186003)(26005)(53936002)(305945005)(16526019)(81156014)(3846002)(6506007)(478600001)(50226002)(16586007)(8936002)(2950100002)(316002)(2906002)(59450400001)(25786009)(97736004)(50466002)(48376002)(105586002)(52116002)(47776003)(81166006)(51416003)(5660300001)(6666003)(106356001)(66066001)(54906003)(6306002)(6512007)(19627235001); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR04MB1008; H:idcbfarm.ap.freescale.net; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: nxp.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR04MB1008; 23:ZcukPyUNOkU9yBbhx4kKUJAMhOu7pJjJV3jSi+/V0?= =?us-ascii?Q?kiR/4A1N7WWa5h4sifWBxS3YnRZY8bgtcP8+EkKVc79ufR9Iwd4gW1lCuO8N?= =?us-ascii?Q?vFhGf0OMLrmMI+dBhmJybQ+S+FdgyI8cXQ+5DRh9Gu7IEUplpw/+soE11zaD?= =?us-ascii?Q?cnJTRWlon3JCgLTHxN/UvuVwoL+rHmVkAxBDsEI5otPvra/8eSiZ60h/fO/V?= =?us-ascii?Q?Jpsq2oBp4VziZGS/jpUzKlVp0gkg1F0EybS6MR3Kv1qUqJAp9yYkkIDmDnBH?= =?us-ascii?Q?U+0nc/68TifYXDipC7d/nGKVbf6Hr2L12HDfp3Gpr7o95NeJHfkClUSpPZIk?= =?us-ascii?Q?W7Lb+2jX8/kq1soer1ro5BoN6P6VGcmRd2GdROP88kunBDc3fCIHLuaBxEkA?= =?us-ascii?Q?AHtFupP9gqCn4PIfhLzZ1OVIL1MV5hhFAInoPNYOtWQ6aBOcMIEL6nN6XGDX?= =?us-ascii?Q?QRsrtRg9j8SzxZ6NiJGsJ0SYD5lV2P2LPfWMKrkN35LlxPLoa+TzhGAmP9CT?= =?us-ascii?Q?PhOrjVoEjk/hrot+zvFEHnMqeLfQl4aIDZQKS1eNPtrQp/EWdoNlFcgtCiGL?= =?us-ascii?Q?Y2AT6IAl+p1fM762VvzxT75endnxf9CXIzsYiFjNuYQENSCNeHTrQl7PV0Ha?= =?us-ascii?Q?o36p437eKNcGMo3UQ3hPnec0VzRD8r9XKdB/yp+ZclEdw7uggESE5ayZIjeX?= =?us-ascii?Q?LIeODm9OBDfXmLRc6YitfStlgf/KtU7c9YLwbMsHVeEq6wp9RtoEj0DAYEcx?= =?us-ascii?Q?+MrxotvkN2B6ZwtdvxcOeLT9TesQcd2vjZvXcGXBZJ1DuPlGyzG3ylulwSxA?= =?us-ascii?Q?lP42IbrYzOPPiEUh/dMwV1RZ6Ecyq81Iv2BenMCBhrQsh4U4I4zIkFl/54J2?= =?us-ascii?Q?Eq+a6ltx2ezDx2ATfgY9GURKN35m036RWemb+s0XEA6gmvwaEJqNGnjbzibe?= =?us-ascii?Q?f+GS3/GUo7qxrrsTk31IUcktYOcspn1K3qd7pSXFvd1k0eCfPL9KRSdYSIFy?= =?us-ascii?Q?QnWttxdgw52B9src0GpFEopp4n2lN5NcNRSq46b8eT/yrBIa4yF1youhSfWf?= =?us-ascii?Q?0eTCOBQzSWs0kWbDA/4Mqe0sjTlTX3x4lZZiUdYFs9VXWdpFwDC3GnGHuEDr?= =?us-ascii?Q?CaSzGwJO9YfZC+aOvz6vClnptRepgwr1/mWLHoCPqiqrVW3i+yUowzWzLc6s?= =?us-ascii?Q?BIJab4l6RirKR7xT5l5j5D5t04qBe6CDxtxyHtonCmk7DaeSdazvMOWjdAod?= =?us-ascii?Q?xAPRN0SvJ+aWBQj9THcIqr4eJYLiHrJAwaesnVGPIC+QwXSBsuQ2wFbCc+6I?= =?us-ascii?B?Zz09?= X-Microsoft-Exchange-Diagnostics: 1; VI1PR04MB1008; 6:gcADolosXYgM2Jimr1+01dUZQXAlL6lhyk59sGLvIFLL8D/jK59qDwIz4rodb8bUoSewEAVolbXaJx8C7k9Y0oum0/OCCMfNHrn64TF+ERrOmH7VLrfgR1fURCaInOJSTgKzbPJLUzKSVPW3kOj4ZBpHDR+pkUt47M0tRtqbJTJZcU4CyJEAXPTJxOoqF2/ireCsTubJYnordFeZY+LK41YyzEgpPbKgSdprWrJwtn3N/4a/kr1qSOEE/Vya9GHrUlDTveAdCFBR53wn7hKSNMJPN0zbGIdM1WzjXuEmtJ/5OpbCyJPARJlG6/IRMQdG+SmSob3KKEG8fYCUEc0NJE2Aifcf0La0QGZxVQpS7uk=; 5:1GYaOBmXMRC9ALl9X1Ig9FzafclOp2Q8m0nQLi5ievd5INlZnI52m6VS3fRjv+ydI7Neb1ehZU79cJJXtoBMp//Y64QBNKhoFfWZ2L/a9IqT+QpjSm/8fQ+zVl4IkPlNZwCVYNZDbuRT3QBkiv9D8uOiTSercimVkZaPwDDaVHA=; 24:aFvQ4Dp66eEWEZUNiLvFmnJyCFejYGpWF3X7U12BjrAfycjXEa5Ud9GifZh/F0BBuVeYtTh5QxqFBfVDqStHuoeeqjsRJaeJKvBS332Qb2k=; 7:lLIVuVQBH7Tg/MeQgM1qIvOJqH8UTpIDJjgdjDt2yoD+JiqD2LKMMvXSBS5oN3KMBq4pTO1c+xUG2mC0bItjIesoyx/8AB70JjVtnlEPbAq0WGHPabLwnfRvoiDSqhHRAHoiUrYyigAzHTC+nLHNEOPOgNJ487g2PuknjIrmxzg3IiLt8izkachitS4sr44GnsA8AN3ArGi5FWcS45nOOPWyYHnbJTg6VnBcEsjtkjVDinG3POhE/NJ4bviC4saI SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Feb 2018 08:54:57.9361 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 36f50cb3-b2ea-4d91-7aa1-08d5751af770 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR04MB1008 Subject: [PATCH edk2-platforms 33/39] Silicon/NXP: Implement PciHostBridgeLib support X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 16 Feb 2018 08:49:12 -0000 Content-Type: text/plain From: Vabhav Implement the library that exposes the PCIe root complexes to the generic PCI host bridge driver,Putting SoC Specific low level init code for the RCs. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Vabhav Signed-off-by: Meenakshi Aggarwal --- .../Library/PciHostBridgeLib/PciHostBridgeLib.c | 618 +++++++++++++++++++++ .../Library/PciHostBridgeLib/PciHostBridgeLib.inf | 50 ++ 2 files changed, 668 insertions(+) create mode 100644 Silicon/NXP/Library/PciHostBridgeLib/PciHostBridgeLib.c create mode 100644 Silicon/NXP/Library/PciHostBridgeLib/PciHostBridgeLib.inf diff --git a/Silicon/NXP/Library/PciHostBridgeLib/PciHostBridgeLib.c b/Silicon/NXP/Library/PciHostBridgeLib/PciHostBridgeLib.c new file mode 100644 index 0000000..e6f9b7c --- /dev/null +++ b/Silicon/NXP/Library/PciHostBridgeLib/PciHostBridgeLib.c @@ -0,0 +1,618 @@ +/** @file + PCI Host Bridge Library instance for NXP SoCs + + Copyright 2018 NXP + + This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License which accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT + WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#pragma pack(1) +typedef struct { + ACPI_HID_DEVICE_PATH AcpiDevicePath; + EFI_DEVICE_PATH_PROTOCOL EndDevicePath; +} EFI_PCI_ROOT_BRIDGE_DEVICE_PATH; +#pragma pack () + +STATIC CONST EFI_PCI_ROOT_BRIDGE_DEVICE_PATH mEfiPciRootBridgeDevicePath[] = { + { + { + { + ACPI_DEVICE_PATH, + ACPI_DP, + { + (UINT8)(sizeof (ACPI_HID_DEVICE_PATH)), + (UINT8)(sizeof (ACPI_HID_DEVICE_PATH) >> 8) + } + }, + EISA_PNP_ID (0x0A08), // PCI Express + PCI_SEG0_NUM + }, + + { + END_DEVICE_PATH_TYPE, + END_ENTIRE_DEVICE_PATH_SUBTYPE, + { + END_DEVICE_PATH_LENGTH, + 0 + } + } + }, + { + { + { + ACPI_DEVICE_PATH, + ACPI_DP, + { + (UINT8)(sizeof (ACPI_HID_DEVICE_PATH)), + (UINT8)(sizeof (ACPI_HID_DEVICE_PATH) >> 8) + } + }, + EISA_PNP_ID (0x0A08), // PCI Express + PCI_SEG1_NUM + }, + + { + END_DEVICE_PATH_TYPE, + END_ENTIRE_DEVICE_PATH_SUBTYPE, + { + END_DEVICE_PATH_LENGTH, + 0 + } + } + }, + { + { + { + ACPI_DEVICE_PATH, + ACPI_DP, + { + (UINT8)(sizeof (ACPI_HID_DEVICE_PATH)), + (UINT8)(sizeof (ACPI_HID_DEVICE_PATH) >> 8) + } + }, + EISA_PNP_ID (0x0A08), // PCI Express + PCI_SEG2_NUM + }, + + { + END_DEVICE_PATH_TYPE, + END_ENTIRE_DEVICE_PATH_SUBTYPE, + { + END_DEVICE_PATH_LENGTH, + 0 + } + } + }, + { + { + { + ACPI_DEVICE_PATH, + ACPI_DP, + { + (UINT8)(sizeof (ACPI_HID_DEVICE_PATH)), + (UINT8)(sizeof (ACPI_HID_DEVICE_PATH) >> 8) + } + }, + EISA_PNP_ID (0x0A08), // PCI Express + PCI_SEG3_NUM + }, + + { + END_DEVICE_PATH_TYPE, + END_ENTIRE_DEVICE_PATH_SUBTYPE, + { + END_DEVICE_PATH_LENGTH, + 0 + } + } + } +}; + +STATIC +GLOBAL_REMOVE_IF_UNREFERENCED +CHAR16 *mPciHostBridgeLibAcpiAddressSpaceTypeStr[] = { + L"Mem", L"I/O", L"Bus" +}; + +#define PCI_ALLOCATION_ATTRIBUTES EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM | \ + EFI_PCI_HOST_BRIDGE_MEM64_DECODE + +#define PCI_SUPPORT_ATTRIBUTES EFI_PCI_ATTRIBUTE_ISA_IO_16 | \ + EFI_PCI_ATTRIBUTE_ISA_MOTHERBOARD_IO | \ + EFI_PCI_ATTRIBUTE_VGA_MEMORY | \ + EFI_PCI_ATTRIBUTE_VGA_IO_16 | \ + EFI_PCI_ATTRIBUTE_VGA_PALETTE_IO_16 + +PCI_ROOT_BRIDGE mPciRootBridges[] = { + { + PCI_SEG0_NUM, // Segment + PCI_SUPPORT_ATTRIBUTES, // Supports + PCI_SUPPORT_ATTRIBUTES, // Attributes + FALSE, // DmaAbove4G + FALSE, // NoExtendedConfigSpace + FALSE, // ResourceAssigned + PCI_ALLOCATION_ATTRIBUTES, // AllocationAttributes + { PCI_SEG0_BUSNUM_MIN, + PCI_SEG0_BUSNUM_MAX }, // Bus + { PCI_SEG0_PORTIO_MIN, + PCI_SEG0_PORTIO_MAX }, // Io + { PCI_SEG0_MMIO32_MIN, + PCI_SEG0_MMIO32_MAX }, // Mem + { PCI_SEG0_MMIO64_MIN, + PCI_SEG0_MMIO64_MAX }, // MemAbove4G + { MAX_UINT64, 0x0 }, // PMem + { MAX_UINT64, 0x0 }, // PMemAbove4G + (EFI_DEVICE_PATH_PROTOCOL *)&mEfiPciRootBridgeDevicePath[PCI_SEG0_NUM] + }, { + PCI_SEG1_NUM, // Segment + PCI_SUPPORT_ATTRIBUTES, // Supports + PCI_SUPPORT_ATTRIBUTES, // Attributes + FALSE, // DmaAbove4G + FALSE, // NoExtendedConfigSpace + FALSE, // ResourceAssigned + PCI_ALLOCATION_ATTRIBUTES, // AllocationAttributes + { PCI_SEG1_BUSNUM_MIN, + PCI_SEG1_BUSNUM_MAX }, // Bus + { PCI_SEG1_PORTIO_MIN, + PCI_SEG1_PORTIO_MAX }, // Io + { PCI_SEG1_MMIO32_MIN, + PCI_SEG1_MMIO32_MAX }, // Mem + { PCI_SEG1_MMIO64_MIN, + PCI_SEG1_MMIO64_MAX }, // MemAbove4G + { MAX_UINT64, 0x0 }, // PMem + { MAX_UINT64, 0x0 }, // PMemAbove4G + (EFI_DEVICE_PATH_PROTOCOL *)&mEfiPciRootBridgeDevicePath[PCI_SEG1_NUM] + }, { + PCI_SEG2_NUM, // Segment + PCI_SUPPORT_ATTRIBUTES, // Supports + PCI_SUPPORT_ATTRIBUTES, // Attributes + FALSE, // DmaAbove4G + FALSE, // NoExtendedConfigSpace + FALSE, // ResourceAssigned + PCI_ALLOCATION_ATTRIBUTES, // AllocationAttributes + { PCI_SEG2_BUSNUM_MIN, + PCI_SEG2_BUSNUM_MAX }, // Bus + { PCI_SEG2_PORTIO_MIN, + PCI_SEG2_PORTIO_MAX }, // Io + { PCI_SEG2_MMIO32_MIN, + PCI_SEG2_MMIO32_MAX }, // Mem + { PCI_SEG2_MMIO64_MIN, + PCI_SEG2_MMIO64_MAX }, // MemAbove4G + { MAX_UINT64, 0x0 }, // PMem + { MAX_UINT64, 0x0 }, // PMemAbove4G + (EFI_DEVICE_PATH_PROTOCOL *)&mEfiPciRootBridgeDevicePath[PCI_SEG2_NUM] + }, { + PCI_SEG3_NUM, // Segment + PCI_SUPPORT_ATTRIBUTES, // Supports + PCI_SUPPORT_ATTRIBUTES, // Attributes + FALSE, // DmaAbove4G + FALSE, // NoExtendedConfigSpace + FALSE, // ResourceAssigned + PCI_ALLOCATION_ATTRIBUTES, // AllocationAttributes + { PCI_SEG3_BUSNUM_MIN, + PCI_SEG3_BUSNUM_MAX }, // Bus + { PCI_SEG3_PORTIO_MIN, + PCI_SEG3_PORTIO_MAX }, // Io + { PCI_SEG3_MMIO32_MIN, + PCI_SEG3_MMIO32_MAX }, // Mem + { PCI_SEG3_MMIO64_MIN, + PCI_SEG3_MMIO64_MAX }, // MemAbove4G + { MAX_UINT64, 0x0 }, // PMem + { MAX_UINT64, 0x0 }, // PMemAbove4G + (EFI_DEVICE_PATH_PROTOCOL *)&mEfiPciRootBridgeDevicePath[PCI_SEG3_NUM] + } +}; + +/** + Function to set-up iATU outbound window for PCIe controller + + @param Dbi Address of PCIe host controller. + @param Idx Index of iATU outbound window. + @param Type Type(Cfg0/Cfg1/Mem/IO) of iATU outbound window. + @param Phys PCIe controller phy address for outbound window. + @param BusAdr PCIe controller bus address for outbound window. + @param Pcie Size of PCIe controller space(Cfg0/Cfg1/Mem/IO). + +**/ +STATIC +VOID +PcieIatuOutboundSet ( + IN EFI_PHYSICAL_ADDRESS Dbi, + IN UINT32 Idx, + IN UINT32 Type, + IN UINT64 Phys, + IN UINT64 BusAddr, + IN UINT64 Size + ) +{ + MmioWrite32 (Dbi + IATU_VIEWPORT_OFF, + (UINT32)(IATU_VIEWPORT_OUTBOUND | Idx)); + MmioWrite32 (Dbi + IATU_LWR_BASE_ADDR_OFF_OUTBOUND_0, + (UINT32)Phys); + MmioWrite32 (Dbi + IATU_UPPER_BASE_ADDR_OFF_OUTBOUND_0, + (UINT32)(Phys >> 32)); + MmioWrite32 (Dbi + IATU_LIMIT_ADDR_OFF_OUTBOUND_0, + (UINT32)(Phys + Size - BIT0)); + MmioWrite32 (Dbi + IATU_LWR_TARGET_ADDR_OFF_OUTBOUND_0, + (UINT32)BusAddr); + MmioWrite32 (Dbi + IATU_UPPER_TARGET_ADDR_OFF_OUTBOUND_0, + (UINT32)(BusAddr >> 32)); + MmioWrite32 (Dbi + IATU_REGION_CTRL_1_OFF_OUTBOUND_0, + (UINT32)Type); + MmioWrite32 (Dbi + IATU_REGION_CTRL_2_OFF_OUTBOUND_0, + IATU_REGION_CTRL_2_OFF_OUTBOUND_0_REGION_EN); +} + +/** + Function to check PCIe controller LTSSM state + + @param Pcie Address of PCIe host controller. + +**/ +STATIC +INTN +PcieLinkState ( + IN EFI_PHYSICAL_ADDRESS Pcie + ) +{ + UINT32 State; + + // + // Reading PCIe controller LTSSM state + // + if (FeaturePcdGet (PcdPciLutBigEndian)) { + State = BeMmioRead32 ((UINTN)Pcie + PCI_LUT_BASE + PCI_LUT_DBG) & + LTSSM_STATE_MASK; + } else { + State = MmioRead32 ((UINTN)Pcie + PCI_LUT_BASE + PCI_LUT_DBG) & + LTSSM_STATE_MASK; + } + + if (State < LTSSM_PCIE_L0) { + DEBUG ((DEBUG_INFO," Pcie Link error. LTSSM=0x%2x\n", State)); + return EFI_SUCCESS; + } + + return EFI_UNSUPPORTED; +} + +/** + Helper function to check PCIe link state + + @param Pcie Address of PCIe host controller. + +**/ +STATIC +INTN +PcieLinkUp ( + IN EFI_PHYSICAL_ADDRESS Pcie + ) +{ + INTN State; + UINT32 Cap; + + State = PcieLinkState (Pcie); + if (State) { + return State; + } + + // + // Try to download speed to gen1 + // + Cap = MmioRead32 ((UINTN)Pcie + PCI_LINK_CAP); + MmioWrite32 ((UINTN)Pcie + PCI_LINK_CAP, (UINT32)(Cap & (~PCI_LINK_SPEED_MASK)) | BIT0); + State = PcieLinkState (Pcie); + if (State) { + return State; + } + + MmioWrite32 ((UINTN)Pcie + PCI_LINK_CAP, Cap); + + return EFI_SUCCESS; +} + +/** + This function checks whether PCIe is enabled or not + depending upon SoC serdes protocol map + + @param PcieNum PCIe number. + + @return The PCIe number enabled in map. + @return FALSE PCIe number is disabled in map. + +**/ +STATIC +BOOLEAN +IsPcieNumEnabled( + IN UINTN PcieNum + ) +{ + UINT64 SerDes1ProtocolMap; + + SerDes1ProtocolMap = 0x0; + + // + // Reading serdes map + // + GetSerdesProtocolMaps (&SerDes1ProtocolMap); + + // + // Verify serdes line is configured in the map + // + if (PcieNum < NUM_PCIE_CONTROLLER) { + return IsSerDesLaneProtocolConfigured (SerDes1ProtocolMap, (PcieNum + BIT0)); + } else { + DEBUG ((DEBUG_ERROR, "Device not supported\n")); + } + + return FALSE; +} + +/** + Function to set-up iATU outbound window for PCIe controller + + @param Pcie Address of PCIe host controller + @param Cfg0Base PCIe controller phy address Type0 Configuration Space. + @param Cfg1Base PCIe controller phy address Type1 Configuration Space. + @param MemBase PCIe controller phy address Memory Space. + @param IoBase PCIe controller phy address IO Space. +**/ +STATIC +VOID +PcieSetupAtu ( + IN EFI_PHYSICAL_ADDRESS Pcie, + IN EFI_PHYSICAL_ADDRESS Cfg0Base, + IN EFI_PHYSICAL_ADDRESS Cfg1Base, + IN EFI_PHYSICAL_ADDRESS MemBase, + IN EFI_PHYSICAL_ADDRESS IoBase + ) +{ + + // + // iATU : OUTBOUND WINDOW 0 : CFG0 + // + PcieIatuOutboundSet (Pcie, IATU_REGION_INDEX0, + IATU_REGION_CTRL_1_OFF_OUTBOUND_0_TYPE_CFG0, + Cfg0Base, + SEG_CFG_BUS, + SEG_CFG_SIZE); + + // + // iATU : OUTBOUND WINDOW 1 : CFG1 + PcieIatuOutboundSet (Pcie, IATU_REGION_INDEX1, + IATU_REGION_CTRL_1_OFF_OUTBOUND_0_TYPE_CFG1, + Cfg1Base, + SEG_CFG_BUS, + SEG_CFG_SIZE); + // + // iATU 2 : OUTBOUND WINDOW 2 : MEM + // + PcieIatuOutboundSet (Pcie, IATU_REGION_INDEX2, + IATU_REGION_CTRL_1_OFF_OUTBOUND_0_TYPE_MEM, + MemBase, + SEG_MEM_BUS, + SEG_MEM_SIZE); + + // + // iATU 3 : OUTBOUND WINDOW 3: IO + // + PcieIatuOutboundSet (Pcie, IATU_REGION_INDEX3, + IATU_REGION_CTRL_1_OFF_OUTBOUND_0_TYPE_IO, + IoBase, + SEG_IO_BUS, + SEG_IO_SIZE); + +} + +/** + Helper function to set-up PCIe controller + + @param Pcie Address of PCIe host controller + @param Cfg0Base PCIe controller phy address Type0 Configuration Space. + @param Cfg1Base PCIe controller phy address Type1 Configuration Space. + @param MemBase PCIe controller phy address Memory Space. + @param IoBase PCIe controller phy address IO Space. + +**/ +STATIC +VOID +PcieSetupCntrl ( + IN EFI_PHYSICAL_ADDRESS Pcie, + IN EFI_PHYSICAL_ADDRESS Cfg0Base, + IN EFI_PHYSICAL_ADDRESS Cfg1Base, + IN EFI_PHYSICAL_ADDRESS MemBase, + IN EFI_PHYSICAL_ADDRESS IoBase + ) +{ + // + // iATU outbound set-up + // + PcieSetupAtu (Pcie, Cfg0Base, Cfg1Base, MemBase, IoBase); + + // + // program correct class for RC + // + MmioWrite32 ((UINTN)Pcie + PCI_BASE_ADDRESS_0, (BIT0 - BIT0)); + MmioWrite32 ((UINTN)Pcie + PCI_DBI_RO_WR_EN, (UINT32)BIT0); + MmioWrite32 ((UINTN)Pcie + PCI_CLASS_DEVICE, (UINT32)PCI_CLASS_BRIDGE_PCI); + MmioWrite32 ((UINTN)Pcie + PCI_DBI_RO_WR_EN, (UINT32)(BIT0 - BIT0)); +} + +/** + Return all the root bridge instances in an array. + + @param Count Return the count of root bridge instances. + + @return All the root bridge instances in an array. + +**/ +PCI_ROOT_BRIDGE * +EFIAPI +PciHostBridgeGetRootBridges ( + OUT UINTN *Count + ) +{ + UINTN Idx; + INTN LinkUp; + UINT64 PciPhyMemAddr[NUM_PCIE_CONTROLLER]; + UINT64 PciPhyCfg0Addr[NUM_PCIE_CONTROLLER]; + UINT64 PciPhyCfg1Addr[NUM_PCIE_CONTROLLER]; + UINT64 PciPhyIoAddr[NUM_PCIE_CONTROLLER]; + UINT64 Regs[NUM_PCIE_CONTROLLER]; + + *Count = 0; + + // + // Filling local array for + // PCIe controller Physical address space for Cfg0,Cfg1,Mem,IO + // Host Contoller address + // + for (Idx = 0; Idx < NUM_PCIE_CONTROLLER; Idx++) { + PciPhyMemAddr[Idx] = PCI_SEG0_PHY_MEM_BASE + (PCI_BASE_DIFF * Idx); + PciPhyCfg0Addr[Idx] = PCI_SEG0_PHY_CFG0_BASE + (PCI_BASE_DIFF * Idx); + PciPhyCfg1Addr[Idx] = PCI_SEG0_PHY_CFG1_BASE + (PCI_BASE_DIFF * Idx); + PciPhyIoAddr [Idx] = PCI_SEG0_PHY_IO_BASE + (PCI_BASE_DIFF * Idx); + Regs[Idx] = PCI_SEG0_DBI_BASE + (PCI_DBI_SIZE_DIFF * Idx); + } + + for (Idx = 0; Idx < NUM_PCIE_CONTROLLER; Idx++) { + // + // Verify PCIe controller is enabled in Soc Serdes Map + // + if (!IsPcieNumEnabled (Idx)) { + DEBUG ((DEBUG_ERROR, "PCIE%d is disabled\n", (Idx + BIT0))); + // + // Continue with other PCIe controller + // + continue; + } + DEBUG ((DEBUG_INFO, "PCIE%d is Enabled\n", Idx + BIT0)); + + // + // Verify PCIe controller LTSSM state + // + LinkUp = PcieLinkUp(Regs[Idx]); + if (!LinkUp) { + // + // Let the user know there's no PCIe link + // + DEBUG ((DEBUG_INFO,"no link, regs @ 0x%lx\n", Regs[Idx])); + // + // Continue with other PCIe controller + // + continue; + } + DEBUG ((DEBUG_INFO, "PCIE%d Passed Linkup Phase\n", Idx + BIT0)); + + // + // Function to set up address translation unit outbound window for + // PCIe Controller + // + PcieSetupCntrl (Regs[Idx], + PciPhyCfg0Addr[Idx], + PciPhyCfg1Addr[Idx], + PciPhyMemAddr[Idx], + PciPhyIoAddr[Idx]); + *Count += BIT0; + break; + } + + if (*Count == 0) { + return NULL; + } else { + return &mPciRootBridges[Idx]; + } +} + +/** + Free the root bridge instances array returned from PciHostBridgeGetRootBridges(). + + @param Bridges The root bridge instances array. + @param Count The count of the array. +**/ +VOID +EFIAPI +PciHostBridgeFreeRootBridges ( + PCI_ROOT_BRIDGE *Bridges, + UINTN Count + ) +{ +} + +/** + Inform the platform that the resource conflict happens. + + @param HostBridgeHandle Handle of the Host Bridge. + @param Configuration Pointer to PCI I/O and PCI memory resource + descriptors. The Configuration contains the resources + for all the root bridges. The resource for each root + bridge is terminated with END descriptor and an + additional END is appended indicating the end of the + entire resources. The resource descriptor field + values follow the description in + EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL + .SubmitResources(). + +**/ +VOID +EFIAPI +PciHostBridgeResourceConflict ( + EFI_HANDLE HostBridgeHandle, + VOID *Configuration + ) +{ + EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Descriptor; + UINTN RootBridgeIndex; + DEBUG ((DEBUG_ERROR, "PciHostBridge: Resource conflict happens!\n")); + + RootBridgeIndex = 0; + Descriptor = (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *) Configuration; + while (Descriptor->Desc == ACPI_ADDRESS_SPACE_DESCRIPTOR) { + DEBUG ((DEBUG_ERROR, "RootBridge[%d]:\n", RootBridgeIndex++)); + for (; Descriptor->Desc == ACPI_ADDRESS_SPACE_DESCRIPTOR; Descriptor++) { + ASSERT (Descriptor->ResType < + ARRAY_SIZE (mPciHostBridgeLibAcpiAddressSpaceTypeStr)); + DEBUG ((DEBUG_ERROR, " %s: Length/Alignment = 0x%lx / 0x%lx\n", + mPciHostBridgeLibAcpiAddressSpaceTypeStr[Descriptor->ResType], + Descriptor->AddrLen, Descriptor->AddrRangeMax + )); + if (Descriptor->ResType == ACPI_ADDRESS_SPACE_TYPE_MEM) { + DEBUG ((DEBUG_ERROR, " Granularity/SpecificFlag = %ld / %02x%s\n", + Descriptor->AddrSpaceGranularity, Descriptor->SpecificFlag, + ((Descriptor->SpecificFlag & + EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_CACHEABLE_PREFETCHABLE + ) != 0) ? L" (Prefetchable)" : L"" + )); + } + } + // + // Skip the END descriptor for root bridge + // + ASSERT (Descriptor->Desc == ACPI_END_TAG_DESCRIPTOR); + Descriptor = (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *)( + (EFI_ACPI_END_TAG_DESCRIPTOR *)Descriptor + 1 + ); + } + + return; +} diff --git a/Silicon/NXP/Library/PciHostBridgeLib/PciHostBridgeLib.inf b/Silicon/NXP/Library/PciHostBridgeLib/PciHostBridgeLib.inf new file mode 100644 index 0000000..f08ac60 --- /dev/null +++ b/Silicon/NXP/Library/PciHostBridgeLib/PciHostBridgeLib.inf @@ -0,0 +1,50 @@ +## @file +# PCI Host Bridge Library instance for NXP ARM SOC +# +# Copyright 2018 NXP +# +# This program and the accompanying materials are licensed and made available +# under the terms and conditions of the BSD License which accompanies this +# distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR +# IMPLIED. +# +# +## + +[Defines] + INF_VERSION = 0x0001001A + BASE_NAME = PciHostBridgeLib + FILE_GUID = f4c99bcc-5c95-49ad-b0f3-fc5b611dc9c1 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = PciHostBridgeLib + +[Sources] + PciHostBridgeLib.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + Silicon/NXP/NxpQoriqLs.dec + Silicon/NXP/Chassis/Chassis2/Chassis2.dec + +[LibraryClasses] + DebugLib + DevicePathLib + MemoryAllocationLib + PcdLib + SocLib + UefiBootServicesTableLib + +[Pcd] + gNxpQoriqLsTokenSpaceGuid.PcdPciLutBigEndian + gNxpQoriqLsTokenSpaceGuid.PcdNumPciController + gNxpQoriqLsTokenSpaceGuid.PcdPcieLutBase + gNxpQoriqLsTokenSpaceGuid.PcdPcieLutDbg + gNxpQoriqLsTokenSpaceGuid.PcdPciExp1BaseAddr + gNxpQoriqLsTokenSpaceGuid.PcdPciExp2BaseAddr + gNxpQoriqLsTokenSpaceGuid.PcdPciExp3BaseAddr + gNxpQoriqLsTokenSpaceGuid.PcdPciExp4BaseAddr -- 1.9.1