From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934731AbcAZPjJ (ORCPT ); Tue, 26 Jan 2016 10:39:09 -0500 Received: from mail-bl2on0061.outbound.protection.outlook.com ([65.55.169.61]:11824 "EHLO na01-bl2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1756940AbcAZPgz (ORCPT ); Tue, 26 Jan 2016 10:36:55 -0500 Authentication-Results: spf=none (sender IP is 165.204.84.221) smtp.mailfrom=amd.com; 8bytes.org; dkim=none (message not signed) header.d=none;8bytes.org; dmarc=permerror action=none header.from=amd.com; X-WSS-ID: 0O1KGPE-07-8T7-02 X-M-MSG: From: Wan Zongshun To: Joerg Roedel , CC: Suravee Suthikulpanit , Borislav Petkov , Ray Huang , , , , , "Wan Zongshun" Subject: [PATCH V2 3/8] iommu/amd: Add new map for storing IVHD dev entry type HID Date: Tue, 26 Jan 2016 18:14:32 -0500 Message-ID: <1453850077-2539-4-git-send-email-vincent.wan@amd.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1453850077-2539-1-git-send-email-vincent.wan@amd.com> References: <1453850077-2539-1-git-send-email-vincent.wan@amd.com> MIME-Version: 1.0 Content-Type: text/plain X-EOPAttributedMessage: 0 X-Forefront-Antispam-Report: CIP:165.204.84.221;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(2980300002)(428002)(189002)(199003)(106466001)(2950100001)(1220700001)(1096002)(77096005)(229853001)(586003)(50986999)(5008740100001)(101416001)(76176999)(105586002)(5003600100002)(48376002)(19580395003)(47776003)(36756003)(5003940100001)(189998001)(97736004)(87936001)(2906002)(50466002)(53416004)(19580405001)(5001770100001)(4326007)(50226001)(33646002)(86362001)(92566002)(575784001);DIR:OUT;SFP:1101;SCL:1;SRVR:CY1PR12MB0713;H:atltwp01.amd.com;FPR:;SPF:None;PTR:InfoDomainNonexistent;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;CY1PR12MB0713;2:zHQxqHovR4GbV/jD6eJ1nKyiEECfHBo5Cvf/L/kLYos1/4eJ5YglBUaJRirRfMesTTeVfOp0/rTSV219zT5zhuGoR/DuuND9itpHbrc2I9Vy20GrKYJ66KSXI5WVhKfz8Muu2haefCF6iOhZYQYSLQ==;3:kHq5eny818P/EYcle9DFIiYgKpDBjSuiJxwDnTbrOVwoCX6bmBmUlaNY59aX03wfDoYDPwaEfAJpoQUcbCweAh6QwWtTtx31TCZyw7VRFG2H+HS6rD5HOcoZaipXRMhoud3Afo/9qCXNEprkVoYs6X6PPvLg5BWwHowHgcVjsGKxpmsAL+gPJkNDSUqXWao3E2mj3ongY8gIQaNeAJcSzZvllWqxqy/RAzqX0rKjqX0=;25:6Fvhr/gQpqfX5nXP6hu+R++QNdtN70DMsag740gjo55YGK5hsf52xyzMT3on0+/H4GpLYOEt5ZDEmA1qTs1gktTS8uzRGdJpnCjzS19D3M/KsRJts7u8H59x6WFumPuOiO2rpNpZc3YNCjtNEli8xmksfbH3vde5cLttgC0B0ExaDHhhHzI6x91OFY0s70E65+CCGEh4F+xj27hBiFiwUXJ91qeQP/OexbfGUdNsfwbX7HKkRM/3jOc5IHIhUoMx X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR12MB0713; X-MS-Office365-Filtering-Correlation-Id: c9e7def7-f3b7-4211-69d3-08d32666834f X-Microsoft-Exchange-Diagnostics: 1;CY1PR12MB0713;20:MxeG6vfkEIWyPQF5OkQZ5vmEOICjd/EXI0fjgsV+Fp6H9DlWYqWSM20Dgv4i7hipWHdUjSm8aJ04rTNQ2N5Hcn0ZIgRPK3URlJ0G/8iFcVKCQce/SkZ4YtQdbEnPbTbicPTJBqe62sQh1EyiUOYMD77vSEpB5mCMJuwDYt7yDID4e9ooiDppnxNMyA+FURtaRO1FMQYKLEX/za3rmm5J4IEPnEVh9W+SQEBT9+U6P0IwewAZg6c5IZCBH678CmHvQJ3EVEUm0nkIMIwKgjncz1VBkC92PNkhhzZKHWrejY9+lxN4oSLxqe3jMpr7uk56HiXD+GO4/Ktev9jp+jLbKxh95kHlIhQvweyOyrHhKVL44JPby8JTjDwL8ySbZvsEG3FKgav7KfV3OYAObuDzz7af8/AnzBXPzGujxdUxglfkXMd3Q+wLEBWUerJjTE1LKwCfYJ9zJfdVZJd9yl/xUYRItcqP/7Xoy7yuOHuVUhiAKsOaYJpSPIv9LL6MMooK X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(123027)(601004)(2401047)(8121501046)(13015025)(13024025)(13017025)(13018025)(520078)(5005006)(13023025)(10201501046)(3002001);SRVR:CY1PR12MB0713;BCL:0;PCL:0;RULEID:;SRVR:CY1PR12MB0713; X-Microsoft-Exchange-Diagnostics: 1;CY1PR12MB0713;4:MSKHFJUwMqzs26Aaru2VLwgDsQMvtiD6mAO1hFGkEB+3kp9Ma17nNeoi/cOO+nSIzGlBBG8nrADdnH+4iqyLh3ye/A1pCoicJ3cZSY+M12SXGz0NuiONKmvrKnJNxyQGgpueYykT50o6thLpIER8h5E6RNpA+IgqEfxfgSsy1cUXcSe6SLngJnb30cpKOd/Jk7ulFYSSTZg+AR67awhYU4Y0BKL3kfv+BAOH9LgZHK499aY5bimYUlvCTJKTOEwVm2BOvx3VtSnH6fF2ygRalsAw5nHiDC592DUYpAwaxDHNWUYJ5GOLJRRNRp2gyAVc62C2hMOOEqegiME59tWxQ++LuVFBasaGXjDljZ/AQsKoQx4bNrzFvcFr3kuk4K5LFbfqJHWP3bmWp/vPaDVlpe4aWpI0D5iG+PH6BxMCvNDY0mwpPvHVyqqovLaY9TZA8oktD9Vnw+M8WwJrMSdZ6sO/lJKSZCO6DPfXxCMfgVmc7jLsmjHtEjQ+xm3LoAKakW88WkLXjlampoSJ2sUaaQ== X-Forefront-PRVS: 08331F819E X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;CY1PR12MB0713;23:bLG5vmJU6AgNgqiuxz9eCeGL4mFTzFAH2cdoQsnj1?= =?us-ascii?Q?gJ+We9zcBBU2Apyi81Hida047qfrpSKMCCqlBzk+7+4C4pHo8Trj6qgMUFBs?= =?us-ascii?Q?Q0DaoUWMxP3qTCD8tPwpnHxtnMpS5FFb+T+NwKnyVLBlGztdyj23van3Wn8o?= =?us-ascii?Q?8emcZT6D5psnRvK/I5E2n3dIu7D5e1s3T1kBRVN9aKDiSy2WZSG4Yh6fCfFp?= =?us-ascii?Q?i7FnF5sDa7Hx8aeL7MLJQ9ud/rSByRKI9Zuy4abNx6yAP+6jI29ZrT/J7yJK?= =?us-ascii?Q?9hHXvoy6JMkPw6PdG4I1g6Jnfe2rRpTne6fXQYmwKxByVUAFGew4+I9zk8Bv?= =?us-ascii?Q?siEttp3KzPlsal3GEeV2CMO8jFcaU7mhfzE8OuQbem0P2xsVUPqfsaZYlrA2?= =?us-ascii?Q?DwGeJjTEnF7Bt5/6ARXMi5O9MRrPbUhl/KMPXSFrgrlz+oFZiqb2JhMQtSc+?= =?us-ascii?Q?dEFRNslLBYw1+Qfdi8YLc2ffIgGloNyIXhZTVGGmjFiRVuVkMqxtwnFrd+lh?= =?us-ascii?Q?0AZGsdeemPxeKSNIUgfGMoMRt0kLSSHCMbollqL2wEBzVwb/dLTZDc/a6AAo?= =?us-ascii?Q?AsWNrvqtoTmKL79R7snJomn2gVKNxAl7EejXiOx4SVZTUdGUzzMEQngJvzTh?= =?us-ascii?Q?xcNqKo19jcNGgccug3JqTXvoqwopsevbyivSz6KOtgl4k6RDeXdLy9jGgzz1?= =?us-ascii?Q?eZ9ezvbpWv2yl9FSP/FUNwPQ6uSkiWq6gH80ubIbH72e5id1X3faKC3IPwsD?= =?us-ascii?Q?n8EKNXEqziYMwtdHpBPvWuSOqlTIuy1K8fHiTCcpqcI+DiPR+uw2SkWvWDfH?= =?us-ascii?Q?vcgZQKvebvxbBl0sNV/raPSy7BT0h5QM8xpFmGzqKQVen2WDM+R80V3+oB3R?= =?us-ascii?Q?c0NFW/6kMVLa1XrLpQ6pzk/Tr5qAwagZic4S/j6rIHpV0INzmMuvYXCO9qm2?= =?us-ascii?Q?e5+mfsAcYVLT/R+L/Mge+p6OsyWrPwN0t31UXc1W+0Zl4jaq04xLFZvo/cTi?= =?us-ascii?Q?fcuHzfwukwdzULn7ifCPyUO?= X-Microsoft-Exchange-Diagnostics: 1;CY1PR12MB0713;5:+pZapzN+rDlYmsvaLA8MukgiIsewXNlVXh1ecdee5poADMDP+rNaAuATLTNISJnWhwwEciGGUQK8TPb7qtSOofudEA+t1uNIwHjaLdhIc61leqfjrYAx3WRGzd3TDG/wu9U9Yu9Ja9gNpr80S1wFBg==;24:Latc9AewPtfMmj+NU4dj67PUQt1ypCJDnSUE4BRKoKXxQcoGQPTz0CAcWtp6IawzlQkHAuGIJERkPhiekuUHMBuuB7QfL2Vx0440DtpjL+k=;20:iZBZANSqGiVclekYZoHu1p4wBAG1Sc7veJp/8h5Lehxi5x6n1mLjmKMpfo5SsvSie/kVnFIP3GoydMrL1oUc9/jjbj9819rgh8EyEK7iXFIOPyDPcXKmH+BQn6ozgmcMe4o2RQms/UM4cMoMlD0QhHDK3kl1hdrGFbMeB/2XNmp/8/oy6T/NVD4nMSvk19/Uc8Fd2KdC8qGdzTiAgouwuaglMy1HK7ctFkaq1DX4VGKVLmJzd5lcCVE4pJ93jV0i SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Jan 2016 15:36:51.2629 (UTC) X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.221];Helo=[atltwp01.amd.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR12MB0713 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Wan Zongshun This patch introduces acpihid_map, which is used to store the new IVHD device entry extracted from BIOS IVRS table. It also provides a utility function add_acpi_hid_device(), to add this types of devices to the map. Signed-off-by: Wan Zongshun Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd_iommu.c | 1 + drivers/iommu/amd_iommu_init.c | 122 ++++++++++++++++++++++++++++++++++++++++ drivers/iommu/amd_iommu_types.h | 14 +++++ 3 files changed, 137 insertions(+) diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c index 539b0de..8063ab2 100644 --- a/drivers/iommu/amd_iommu.c +++ b/drivers/iommu/amd_iommu.c @@ -72,6 +72,7 @@ static DEFINE_SPINLOCK(dev_data_list_lock); LIST_HEAD(ioapic_map); LIST_HEAD(hpet_map); +LIST_HEAD(acpihid_map); /* * Domain for untranslated devices - only allocated diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c index 146f3ee..0a8e033 100644 --- a/drivers/iommu/amd_iommu_init.c +++ b/drivers/iommu/amd_iommu_init.c @@ -60,6 +60,10 @@ #define IVHD_DEV_SPECIAL 0x48 #define IVHD_DEV_ACPI_HID 0xf0 +#define UID_NOT_PRESENT 0 +#define UID_IS_INTEGER 1 +#define UID_IS_CHARACTER 2 + #define IVHD_SPECIAL_IOAPIC 1 #define IVHD_SPECIAL_HPET 2 @@ -116,6 +120,11 @@ struct ivhd_entry { u16 devid; u8 flags; u32 ext; + u32 hidh; + u64 cid; + u8 uidf; + u8 uidl; + u8 uid; } __attribute__((packed)); /* @@ -224,8 +233,12 @@ enum iommu_init_state { #define EARLY_MAP_SIZE 4 static struct devid_map __initdata early_ioapic_map[EARLY_MAP_SIZE]; static struct devid_map __initdata early_hpet_map[EARLY_MAP_SIZE]; +static struct acpihid_map_entry __initdata early_acpihid_map[EARLY_MAP_SIZE]; + static int __initdata early_ioapic_map_size; static int __initdata early_hpet_map_size; +static int __initdata early_acpihid_map_size; + static bool __initdata cmdline_maps; static enum iommu_init_state init_state = IOMMU_START_STATE; @@ -760,6 +773,42 @@ static int __init add_special_device(u8 type, u8 id, u16 *devid, bool cmd_line) return 0; } +static int __init add_acpi_hid_device(u8 *hid, u8 *uid, u16 *devid, + bool cmd_line) +{ + struct acpihid_map_entry *entry; + struct list_head *list = &acpihid_map; + + list_for_each_entry(entry, list, list) { + if (strcmp(entry->hid, hid) || + (*uid && *entry->uid && strcmp(entry->uid, uid)) || + !entry->cmd_line) + continue; + + pr_info("AMD-Vi: Command-line override for hid:%s uid:%s\n", + hid, uid); + *devid = entry->devid; + return 0; + } + + entry = kzalloc(sizeof(*entry), GFP_KERNEL); + if (!entry) + return -ENOMEM; + + memcpy(entry->uid, uid, strlen(uid)); + memcpy(entry->hid, hid, strlen(hid)); + entry->devid = *devid; + entry->cmd_line = cmd_line; + entry->root_devid = (entry->devid & (~0x7)); + + pr_info("AMD-Vi:%s, add hid:%s, uid:%s, rdevid:%d\n", + entry->cmd_line ? "cmd" : "ivrs", + entry->hid, entry->uid, entry->root_devid); + + list_add_tail(&entry->list, list); + return 0; +} + static int __init add_early_maps(void) { int i, ret; @@ -782,6 +831,15 @@ static int __init add_early_maps(void) return ret; } + for (i = 0; i < early_acpihid_map_size; ++i) { + ret = add_acpi_hid_device(early_acpihid_map[i].hid, + early_acpihid_map[i].uid, + &early_acpihid_map[i].devid, + early_acpihid_map[i].cmd_line); + if (ret) + return ret; + } + return 0; } @@ -1001,6 +1059,70 @@ static int __init init_iommu_from_acpi(struct amd_iommu *iommu, break; } + case IVHD_DEV_ACPI_HID: { + u16 devid; + u8 hid[ACPIHID_HID_LEN] = {0}; + u8 uid[ACPIHID_UID_LEN] = {0}; + int ret; + + if (h->type != 0x40) { + pr_err(FW_BUG "Invalid IVHD device type %#x\n", + e->type); + break; + } + + memcpy(hid, (u8 *)(&e->ext), ACPIHID_HID_LEN - 1); + hid[ACPIHID_HID_LEN - 1] = '\0'; + + if (!(*hid)) { + pr_err(FW_BUG "Invalid HID.\n"); + break; + } + + switch (e->uidf) { + case UID_NOT_PRESENT: + + if (e->uidl != 0) + pr_warn(FW_BUG "Invalid UID length.\n"); + + break; + case UID_IS_INTEGER: + + sprintf(uid, "%d", e->uid); + + break; + case UID_IS_CHARACTER: + + memcpy(uid, (u8 *)(&e->uid), ACPIHID_UID_LEN - 1); + uid[ACPIHID_UID_LEN - 1] = '\0'; + + break; + default: + break; + } + + DUMP_printk(" DEV_ACPI_HID(%s[%s])\t\tdevid: %02x:%02x.%x\n", + hid, uid, + PCI_BUS_NUM(devid), + PCI_SLOT(devid), + PCI_FUNC(devid)); + + devid = e->devid; + flags = e->flags; + + ret = add_acpi_hid_device(hid, uid, &devid, false); + if (ret) + return ret; + + /* + * add_special_device might update the devid in case a + * command-line override is present. So call + * set_dev_entry_from_acpi after add_special_device. + */ + set_dev_entry_from_acpi(iommu, devid, e->flags, 0); + + break; + } default: break; } diff --git a/drivers/iommu/amd_iommu_types.h b/drivers/iommu/amd_iommu_types.h index 9d32b20..b6b14d2 100644 --- a/drivers/iommu/amd_iommu_types.h +++ b/drivers/iommu/amd_iommu_types.h @@ -527,6 +527,19 @@ struct amd_iommu { #endif }; +#define ACPIHID_UID_LEN 256 +#define ACPIHID_HID_LEN 9 + +struct acpihid_map_entry { + struct list_head list; + u8 uid[ACPIHID_UID_LEN]; + u8 hid[ACPIHID_HID_LEN]; + u16 devid; + u16 root_devid; + bool cmd_line; + struct iommu_group *group; +}; + struct devid_map { struct list_head list; u8 id; @@ -537,6 +550,7 @@ struct devid_map { /* Map HPET and IOAPIC ids to the devid used by the IOMMU */ extern struct list_head ioapic_map; extern struct list_head hpet_map; +extern struct list_head acpihid_map; /* * List with all IOMMUs in the system. This list is not locked because it is -- 1.9.1