From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754066AbcAEC3Q (ORCPT ); Mon, 4 Jan 2016 21:29:16 -0500 Received: from mail-bn1on0080.outbound.protection.outlook.com ([157.56.110.80]:23296 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753961AbcAEC3D (ORCPT ); Mon, 4 Jan 2016 21:29:03 -0500 Authentication-Results: spf=none (sender IP is 165.204.84.222) 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: 0O0GK89-08-CZ5-02 X-M-MSG: From: Wan Zongshun To: Joerg Roedel , CC: Suravee Suthikulpanit , Borislav Petkov , Ray Huang , , , Wan Zongshun Subject: [PATCH 3/6] iommu/amd: Add new map for storing IVHD dev entry type HID Date: Tue, 5 Jan 2016 05:07:21 -0500 Message-ID: <1451988444-4694-4-git-send-email-vincent.wan@amd.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1451988444-4694-1-git-send-email-vincent.wan@amd.com> References: <1451988444-4694-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.222;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(2980300002)(428002)(189002)(199003)(105586002)(53416004)(106466001)(1220700001)(19580405001)(5003600100002)(5003940100001)(19580395003)(586003)(33646002)(229853001)(36756003)(47776003)(50986999)(87936001)(101416001)(2950100001)(11100500001)(92566002)(76176999)(48376002)(5008740100001)(50226001)(4326007)(5001770100001)(86362001)(1096002)(189998001)(77096005)(50466002)(97736004);DIR:OUT;SFP:1101;SCL:1;SRVR:SN1PR12MB0862;H:atltwp02.amd.com;FPR:;SPF:None;PTR:InfoDomainNonexistent;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0862;2:7ss9vt4FO5CPJOsCjeXwBbECYF/eXt7K28kTWjRjconLy1K6icvzYxF+TTxlCjaJGJ0KxZYdWf6itPJf0kDEazeWELoc5iqxReeTqlk5NvxC8wJ/Xu5+95FMp0rmNMlrWLU7nfKVesLP8x868j44Sw==;3:NZ9S+nm0LD8xiq3HAFeSIYuwJvqgpeOzhTE6tXIAUKimh1GoBcagQFYe4eus9FgH0P4Cp/hay1T6cbbIkerz6tcWJAwQZ1HomaPPhIhD/MuXQJVvpuRhYAR2PXIJdf8DT9WMFPTFJzzLkqnqQhjoj8xEGSmVjZTRgGwynSpEg0SBgchfI0VLAJrXE7im+4VtPFllm6vHiqVjgMYM6koi6yQQgU75/fwVBHLcvbZS97s=;25:6xh8j58Z7Fpta99uP32BNWYg23OZgKSDRPrkt/2SBDQJ3PJk97q5Kl7MeldeZJTfL1tmuuSTe5xowkCy3UcdHYjJ9TRskqnK56hPIzh3y4pDc26bfdoNOvNamxbC1E3lH7jIfQCKClXQ3f6N+iexan5JcHErVeyWqICKKPRT/J9HhOLonj+QzdJ1Vjvve+ikjQWukZ8CTd81XnlYtOC1Qy10UWQ3061sbYUt4NRXqxazl3TiOGWPW3C5N4W9bBMO3KXwKk3dXkIAxFyZ23w+Vg== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:SN1PR12MB0862; X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0862;20:8o1AIdiytjZ9pOmDp+0zWJTgbWT3EGi/qQZtUCQbCJxLXdFtnmnIflnGTw7DmsHe4ru9NcH7iSrcFxl1TlHkQvePG+dmviBFsxb+VNwntjAerelE80quWBMN+rzF1InsUcWjGN2qWk8s8unK+szZIE+ku0FZKv33rQDAhretyojctGQU7mhTCD/MG/xXEMVg7LKjJRggPYSskw9k8h9BGOcuCIveoI1ctcH3vCyyiciOQA/e4D6lIR8tQ9+aNZ9P5CHsluzaAy6OfJI6hRaDXX+elJiQGcaGnyJ9wlxFG9GM6eLtjxbisw5LFj9tBHvWmM3R0pFhMhzVdnzDCm9rqLE1lJ6Xux/VhIAOgQYuXGF/sXE0FckpKCr0bRGD+DdhQ4w59BEOCBzHEP/fZbq83Saz7DBvRb4MJcME3lJLZa3Pg5BEwsY5dIn1VwSBhKCMN3aV5SeRhtBnAxchZj1e3NazXr7GJX22WvbMjiJJVR3ou5VBIFI/Yy01zlNcZcLp;4:hILQ+LSt5CjMCxm3TzGv/Lc8Za/wIjGRyLeo4D2gesrC+hl7/LjwnHSck3tlE2K+8/AdaaObdtwn8MbipQqVlknqxre6yYj1tN/iHplhBvLLnJPtmgixcRViqloM4oqF+QB9+Igl5vosJQe9vL9XCWTnq2ZIfOOlXvVYsKCe1xBfMz3LjK743GcQcjrRf8MMOSF7Di3KgvOwyUr5pWOAZzl2/mG4sa5RxZZGupkGQTNjmbEaWSLQp3+Z4WptykYRUvVxSQRgrll3UzsUmmesCUbJ8XxxICkUTYvqLMwYei8ssHfi5wfPZCxGCR7PPH0dYNdruS1Nkq3ntPIfxqkRIN1h8s08ADCpmAJXAmKhcGA13HEtizEgfRL3fVLeeKLMge9GJ9WF8GKwqIuYGRbAmloio2Pnu2HXkN5SSBC1AUA= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(520078)(5005006)(8121501046)(10201501046)(3002001);SRVR:SN1PR12MB0862;BCL:0;PCL:0;RULEID:;SRVR:SN1PR12MB0862; X-Forefront-PRVS: 0812095267 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;SN1PR12MB0862;23:i0BfbNZ36/1UwIJi+lupnyUnpomcGWqwKlcRujofi?= =?us-ascii?Q?6ORm9z0cudeJpqBddVRGDlCRHaOQNsVDBOmS3bdclCLaoeKgQYtgEN8eDq1x?= =?us-ascii?Q?jnAUOUixGb+qc+/x6bjuSWgwLJA9M7PZo6lo9W/Hk8LtkoIEG8fU0/VMJ4kc?= =?us-ascii?Q?pspL4Jm3xTPFMOlTcy52Gx3xkjgtde4UgDPlapNdJpi+GNq1GvpIVEGyMUlf?= =?us-ascii?Q?bnh3qIRiy/C43TZI5EGVUSq6kNas0ZVNZw96CxqcG+ktFpiRq736cCjDJrBb?= =?us-ascii?Q?G6f3ZhsskDpdB7jsS4Dl9kwwqNEnqx49yTFQtSd1TOY3x4Fofx6MV1ibPWHs?= =?us-ascii?Q?3uIsq6lVP/6h2gcLfhLe/mVFo2eLwZ2m9yKbseKWu8qwmT67toBA7vUsMTvV?= =?us-ascii?Q?sdYquTpb2jaNEz+K+YGN9rP2eCrTsb1EHrGU8ByJYoTcP534zTD+LV3+zPZN?= =?us-ascii?Q?yOecckpOr7PKJcOObqNZO7ae8rwDgLXo9Pu0InA32sjGguUsKfJPXxIClX+H?= =?us-ascii?Q?DnSiMVZAvyh7PDileXEkaSdV6creUB/spSjIzXqHRqhhalCw1TDL5rE88h60?= =?us-ascii?Q?5eb2q5Fiy9aHLps+MInt8VfSWRDEp3RD7H6p1mmI19eTfkYKYV5v7vY7yF/r?= =?us-ascii?Q?32wiQxO+pK1xVMc9wtBzmmVfOvZ15MTWIAZAETwhYVSV+DV7Mk9LPEyBapJl?= =?us-ascii?Q?O+tbbeW+0+VeOZmWMdiJI0KEcKEy4qLlFKsbCjQJJvebJAxYKXFpMP2SEOGi?= =?us-ascii?Q?e8YlNEKYQ6ERgNFBI/Oyjkt0oetlE1QizRsdO7tuOfNm5DhQCJ4iQGH9pbf4?= =?us-ascii?Q?znYWUcEAWhfEEPENqQXtoiEZr6K1K7zwhRKleLyLSZOanYYy+0PeWW3yxILE?= =?us-ascii?Q?FE8PZGrDxt24AvHdUz4DZBTN+HtFUDfltkeX5Vj4c8WUsgkXxhD06gd/JvIo?= =?us-ascii?Q?Lh5ULvAxGoIrPZ+1a/ePic0ZAxuOcgRgNXuBlW2j6SJfniNxfb72p3eCpoUw?= =?us-ascii?Q?OE=3D?= X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0862;5:Ye96/btU47f0yHUq6sBEbmbBuwMbI1nNZSU2+xMnDbDhQmEJ0koj20waiqdHDpgCtvTr3IWXX57FyeG+x2BOhwdgSxQ4rye1QjjpZGsQAx1+3tG+VxX330IHrdXUl/tVGDeRmwte/QstGC3+imMrwg==;24:5LKQDbCr7dF5poBs+OSx77+meJqTjcHVzNsueem8etWYd3S/5aVi5pcR8c1ZG8YRfTuY6EkJ/GKDqyiXOCNYcGAqzlpefz5B7SzqqKz9cUI=;20:J1E9WWGusmdD5hT/ffo254Hf47+uy4xCaUKA1fQfzJEVtPusgXxBR2hLJnNrq+uysAbPQU0tjo2Tv+jDCe4afYp4ekD41rcZ6L8JLFvWM3HnoOnscQl1JlAmPd42Cv/5rhzzCIbqCh7gIEahtBFFoK5bKkXfscQPQnb2QdkxD40/Bpkk1IdcEjysya6bXsQkmW+zzLw753Xx9f1qvhfbLdTJMxVusr2Iks/d0StJ5GDAAamNAi/QsUPMLeb+ja3P SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Jan 2016 02:29:00.2028 (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.222];Helo=[atltwp02.amd.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN1PR12MB0862 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 9097b11..98acb89 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 b08cf57..e7c58ec 100644 --- a/drivers/iommu/amd_iommu_types.h +++ b/drivers/iommu/amd_iommu_types.h @@ -567,6 +567,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; @@ -577,6 +590,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