From patchwork Wed May 17 19:56:21 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Corey Minyard X-Patchwork-Id: 100011 Delivered-To: patch@linaro.org Received: by 10.140.96.100 with SMTP id j91csp392317qge; Wed, 17 May 2017 12:57:37 -0700 (PDT) X-Received: by 10.98.58.83 with SMTP id h80mr518606pfa.27.1495051057199; Wed, 17 May 2017 12:57:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1495051057; cv=none; d=google.com; s=arc-20160816; b=asWjzxta4Tkqzp4btiPpBk0nkX4h1Yv2zxn1i2fJujYgcu31vRwX7ikeUGGgKoc2Px PTGk2Y4RvRg57LHWVjyqzO8JLbxKShv3RGL3VJZFFDAICz6fHZoWAzjWh16GDzDfvmb5 Qf0dd5CjAfe58O1MsvoqmueP7tGOuBI7S0Q86+51ApDNY5qY7xyvmTiwidR6OlnaqfOz WOb7lII0HjJTiISdoyVzHXoC3CXrvGH0FRoZiRu7hai4wsBwQIdM/ozOeD+aHFxFBvX1 No3XYOpRhMXxnnffgM+4s0ond6UT6lppZm5V0sVzZNHUz6hlW/dugLJrDzxWg/3a3Xli T7FQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=lFgF2Pkt/zHwWh3/L5pLuh4VdJqZl28fszh+z/gx6JM=; b=jhzdHIb7d2aPIID/S9CtfloX744L1DboEt7D8fDv+FQptQBQv9z0DvT7CY0Jhjp+g7 sGsgBugbqBkGnqhi7mgGsx/WG2Y897IP/nkYzwG9FwMtVTAeyQnVbxduB6bwq++mQl7W QGsNsCNyJTUyOi2HNUJlXF7CJ6xYf6pYDBhAUba3MIe5Gf8pe1ES38N9zlLPYxQdXbQG bUg1fqh4saIsOps6j5+LpsCrB89Bg7LeamWKALg9b7KlQIb6Klbsc/dmMaLbXRXEV6iy Jgi6OrsF0cJmg8hlk9jNwFs0bJpAAHsE7o68ItW2BAziJasX5XgqbVGu+Ql7C+KQEaWk Kqcw== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@gmail.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id m86si2941529pfi.202.2017.05.17.12.57.36; Wed, 17 May 2017 12:57:37 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=fail header.i=@gmail.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754164AbdEQT52 (ORCPT + 25 others); Wed, 17 May 2017 15:57:28 -0400 Received: from mail-oi0-f66.google.com ([209.85.218.66]:35399 "EHLO mail-oi0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752921AbdEQT4f (ORCPT ); Wed, 17 May 2017 15:56:35 -0400 Received: by mail-oi0-f66.google.com with SMTP id m17so3900024oik.2 for ; Wed, 17 May 2017 12:56:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=lFgF2Pkt/zHwWh3/L5pLuh4VdJqZl28fszh+z/gx6JM=; b=oeH4AIJkAuM1OQpiA4vM4ADsj6q/P6VV/0DYtvJJSFjENENqnFV+cYd6u0ryg6M6pK MJ5guKxS0pJBoPc91m32tUzbrR/vOqgRITcGIh2b/t5M8Lv7uHYm6yzc7beLlwRIOm38 /MA2jqsqPUWiAgLyvKFpjyUrX2tAxMJ9zVZdtsb1yEbZ8vNjTnJ/gCDDzf+f/Ee9Q1co fLdZCT7o01W7yhnnjiFYVgquKUZZ1SOZOcrwExayLcP7XUUEMgLGb0UDEbBrxoZMH4hP AJ/3PtfwFaHD/5bqImcoqHvkViVotWceRbzQk4kXL36aqI5hbu6AgfAomLOtB0Q722jn tFIg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=lFgF2Pkt/zHwWh3/L5pLuh4VdJqZl28fszh+z/gx6JM=; b=LBy+iq9spQP97154GvP3bdYTUfsf29Yg8RLBXrGpc0BjiAhberZigzRK33jX5FXkRx DHzTe1LElI5NYnWOTTrL/waQdfDQyK4NTbmyMJEzd0KO8tlWqh5/WPUDfYKBusKCnoWQ 89+q7YWl1RnaxgMSNZRyt9Vn5YS4DFiAS/8qNtlUMLw0UMbksnyvv4zndzAKTzcE9z4B qwnLtFN4u57hASCspQFkd13ux8hvYgijkjEPssUTwOUXflgXvX0VgItC3jC6jbw2Oehy +XQPujvJWqVZ5KMoWMzzjrGLBnKsBedxuDWd6rleiIt7sqwvw7LhvER1Cp501Qd2kcNz VYcg== X-Gm-Message-State: AODbwcDmG3Y7c6tfWSVDTQQ5bBYPACxE1mAJWZXj+IFW/HlSo+ceonTV KxKMSKqSeJ+0uA== X-Received: by 10.202.92.65 with SMTP id q62mr307925oib.28.1495050995109; Wed, 17 May 2017 12:56:35 -0700 (PDT) Received: from serve.minyard.net ([47.184.154.34]) by smtp.gmail.com with ESMTPSA id z74sm1510390oia.2.2017.05.17.12.56.32 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 17 May 2017 12:56:33 -0700 (PDT) Received: from t430.minyard.net (t430m.minyard.net [192.168.27.3]) by serve.minyard.net (Postfix) with ESMTPA id 4F739941; Wed, 17 May 2017 14:56:30 -0500 (CDT) Received: by t430.minyard.net (Postfix, from userid 1000) id 07F583029B0; Wed, 17 May 2017 14:56:28 -0500 (CDT) From: minyard@acm.org To: Jean Delvare Cc: openipmi-developer@lists.sourceforge.net, linux-kernel@vger.kernel.org, Andy Lutomirski , Corey Minyard Subject: [PATCH v5 2/5] dmi: Add a DMI firmware node and handling Date: Wed, 17 May 2017 14:56:21 -0500 Message-Id: <1495050984-5602-3-git-send-email-minyard@acm.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1495050984-5602-1-git-send-email-minyard@acm.org> References: <1495050984-5602-1-git-send-email-minyard@acm.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Corey Minyard This is so that an IPMI platform device can be created from a DMI firmware entry. Signed-off-by: Corey Minyard Cc: Jean Delvare Cc: Andy Lutomirski Tested-by: Andy Lutomirski --- drivers/firmware/dmi_scan.c | 16 ++++++++++------ include/linux/dmi.h | 14 ++++++++++++++ include/linux/fwnode.h | 3 ++- 3 files changed, 26 insertions(+), 7 deletions(-) -- 2.7.4 diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c index a29e96a..78ef357 100644 --- a/drivers/firmware/dmi_scan.c +++ b/drivers/firmware/dmi_scan.c @@ -242,6 +242,12 @@ static void __init dmi_save_type(const struct dmi_header *dm, int slot, dmi_ident[slot] = s; } +static void __init dmi_devices_list_add(struct dmi_device *dev) +{ + dev->fwnode.type = FWNODE_DMI; + list_add(&dev->list, &dmi_devices); +} + static void __init dmi_save_one_device(int type, const char *name) { struct dmi_device *dev; @@ -257,8 +263,7 @@ static void __init dmi_save_one_device(int type, const char *name) dev->type = type; strcpy((char *)(dev + 1), name); dev->name = (char *)(dev + 1); - dev->device_data = NULL; - list_add(&dev->list, &dmi_devices); + dmi_devices_list_add(dev); } static void __init dmi_save_devices(const struct dmi_header *dm) @@ -293,9 +298,8 @@ static void __init dmi_save_oem_strings_devices(const struct dmi_header *dm) dev->type = DMI_DEV_TYPE_OEM_STRING; dev->name = devname; - dev->device_data = NULL; - list_add(&dev->list, &dmi_devices); + dmi_devices_list_add(dev); } } @@ -318,7 +322,7 @@ static void __init dmi_save_ipmi_device(const struct dmi_header *dm) dev->name = "IPMI controller"; dev->device_data = data; - list_add_tail(&dev->list, &dmi_devices); + dmi_devices_list_add(dev); } static void __init dmi_save_dev_pciaddr(int instance, int segment, int bus, @@ -345,7 +349,7 @@ static void __init dmi_save_dev_pciaddr(int instance, int segment, int bus, dev->dev.name = (char *)&dev[1]; dev->dev.device_data = dev; - list_add(&dev->dev.list, &dmi_devices); + dmi_devices_list_add(&dev->dev); } static void __init dmi_save_extended_devices(const struct dmi_header *dm) diff --git a/include/linux/dmi.h b/include/linux/dmi.h index a930a4d..c8dd5b8 100644 --- a/include/linux/dmi.h +++ b/include/linux/dmi.h @@ -4,6 +4,7 @@ #include #include #include +#include /* enum dmi_field is in mod_devicetable.h */ @@ -80,6 +81,7 @@ struct dmi_header { struct dmi_device { struct list_head list; + struct fwnode_handle fwnode; int type; const char *name; void *device_data; /* Type specific data */ @@ -113,6 +115,18 @@ extern int dmi_walk(void (*decode)(const struct dmi_header *, void *), extern bool dmi_match(enum dmi_field f, const char *str); extern void dmi_memdev_name(u16 handle, const char **bank, const char **device); +static inline bool is_dmi_fwnode(struct fwnode_handle *fwnode) +{ + return fwnode && fwnode->type == FWNODE_DMI; +} + +static inline struct dmi_device *to_dmi_device(struct fwnode_handle *fwnode) +{ + if (is_dmi_fwnode(fwnode)) + return container_of(fwnode, struct dmi_device, fwnode); + return NULL; +} + #else static inline int dmi_check_system(const struct dmi_system_id *list) { return 0; } diff --git a/include/linux/fwnode.h b/include/linux/fwnode.h index 3dff239..630c1ef 100644 --- a/include/linux/fwnode.h +++ b/include/linux/fwnode.h @@ -19,7 +19,8 @@ enum fwnode_type { FWNODE_ACPI_DATA, FWNODE_ACPI_STATIC, FWNODE_PDATA, - FWNODE_IRQCHIP + FWNODE_IRQCHIP, + FWNODE_DMI }; struct fwnode_handle {