From patchwork Fri Oct 19 11:37:51 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Artem Senichev X-Patchwork-Id: 986695 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [203.11.71.2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 42c3nf5FjWz9sCW for ; Fri, 19 Oct 2018 22:38:14 +1100 (AEDT) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=yadro.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=yadro.com header.i=@yadro.com header.b="TgVfFXr8"; dkim-atps=neutral Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 42c3nf2rL6zF3bB for ; Fri, 19 Oct 2018 22:38:14 +1100 (AEDT) Authentication-Results: lists.ozlabs.org; dmarc=pass (p=none dis=none) header.from=yadro.com Authentication-Results: lists.ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=yadro.com header.i=@yadro.com header.b="TgVfFXr8"; dkim-atps=neutral X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=yadro.com (client-ip=89.207.88.251; helo=mta-01.yadro.com; envelope-from=a.senichev@yadro.com; receiver=) Authentication-Results: lists.ozlabs.org; dmarc=pass (p=none dis=none) header.from=yadro.com Authentication-Results: lists.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=yadro.com header.i=@yadro.com header.b="TgVfFXr8"; dkim-atps=neutral Received: from mta-01.yadro.com (mta-01.yadro.com [89.207.88.251]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 42c3nR3sKRzF3Zk for ; Fri, 19 Oct 2018 22:37:57 +1100 (AEDT) Received: from localhost (unknown [127.0.0.1]) by mta-01.yadro.com (Postfix) with ESMTP id CDCD9411D9 for ; Fri, 19 Oct 2018 11:37:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=yadro.com; h= user-agent:content-disposition:content-type:content-type :mime-version:message-id:subject:subject:from:from:date:date :received:received:received; s=mta-01; t=1539949072; x= 1541763473; bh=21gIL2YbzdH3AZRcxu69S3C54xi9nScjhdLN/DGL97I=; b=T gVfFXr8NYk/XQgMGqtVO1WcmVSKcu5/SAHcFJ8O6Rz/JhJSXJQJ1T9wpXP55uiyE YCLy+KV2Wv53lPPwpk4qkrWV/6do2rOvO1u8folKwMLCCWNN0nBiHFt6p461+wxA UW/4pNnP9CZae6O/Ml676KxM7aO5s9gtOK5iBcEQuQ= X-Virus-Scanned: amavisd-new at yadro.com Received: from mta-01.yadro.com ([127.0.0.1]) by localhost (mta-01.yadro.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id RE_Q9M7g_gZs for ; Fri, 19 Oct 2018 14:37:52 +0300 (MSK) Received: from T-EXCH-02.corp.yadro.com (t-exch-02.corp.yadro.com [172.17.10.102]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mta-01.yadro.com (Postfix) with ESMTPS id D04D04118F for ; Fri, 19 Oct 2018 14:37:52 +0300 (MSK) Received: from yadro.com (172.17.14.166) by T-EXCH-02.corp.yadro.com (172.17.10.102) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.669.32; Fri, 19 Oct 2018 14:37:52 +0300 Date: Fri, 19 Oct 2018 14:37:51 +0300 From: Artem Senichev To: Message-ID: <20181019113751.GB15617@yadro.com> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.9.4 (2018-02-28) X-Originating-IP: [172.17.14.166] X-ClientProxiedBy: T-EXCH-01.corp.yadro.com (172.17.10.101) To T-EXCH-02.corp.yadro.com (172.17.10.102) Subject: [Skiboot] [PATCH] platforms/astbmc/vesnin: Send list of PCI devices to BMC through IPMI X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" Implements sending a list of installed PCI devices through IPMI protocol. Each PCI device description is sent as a standalone IPMI message. A list of devices can be gathered from separate messages using the session identifier. The session Id is an incremental counter that is updated at the start of synchronization session. Signed-off-by: Artem Senichev --- platforms/astbmc/vesnin.c | 103 +++++++++++++++++++++++++++++++++++++- 1 file changed, 101 insertions(+), 2 deletions(-) diff --git a/platforms/astbmc/vesnin.c b/platforms/astbmc/vesnin.c index 62eb3403..fb3425f8 100644 --- a/platforms/astbmc/vesnin.c +++ b/platforms/astbmc/vesnin.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2018 YADRO (KNS Group LLC) + * Copyright (c) 2018 YADRO * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,8 @@ #include #include #include +#include +#include #include "astbmc.h" @@ -27,6 +29,51 @@ #define CHIP_ID_CPU2 0x10 #define CHIP_ID_CPU3 0x18 +/* Current version of the PCI inventory synchronization packet. */ +#define PCI_INV_VERSION 1 + +/* IPMI message identifier (IBM OEM) for PCI inventory. */ +#define IPMI_PCI_INV IPMI_CODE(0x3a, 0x2a) + +/* Id of the current PCI inventory synchronization session. */ +static uint8_t pci_inv_session_id; + +/** + * struct pciinv_device - PCI device inventory description. + * @domain_num: Domain number. + * @bus_num: Bus number. + * @device_num: Device number. + * @func_num: Function number. + * @vendor_id: Vendor Id. + * @device_id: Device Id. + * @class_code: Device class code. + * @revision: Revision number. + * + * All fields have Big Endian byte order. + */ +struct pciinv_device { + uint16_t domain_num; + uint8_t bus_num; + uint8_t device_num; + uint8_t func_num; + uint16_t vendor_id; + uint16_t device_id; + uint32_t class_code; + uint8_t revision; +} __packed; + +/** + * struct pciinv_packet - IPMI message packet data. + * @version: Packet version, must be set to %PCI_INVENTORY_VERSION. + * @session: Sync session Id. + * @device: PCI device description. + */ +struct pciinv_packet { + uint8_t version; + uint8_t session; + struct pciinv_device device; +} __packed; + static const struct slot_table_entry vesnin_phb0_0_slot[] = { { @@ -233,6 +280,58 @@ static const struct slot_table_entry vesnin_phb_table[] = { { .etype = st_end } }; +/** + * pciinv_walk() - Callback from PCI enumerator, see :c:func:`pci_walk_dev`. + */ +static int pciinv_walk(struct phb *phb, struct pci_device *pd, void *data __unused) +{ + struct ipmi_msg *msg; + struct pciinv_packet pack = { + .version = PCI_INV_VERSION, + .session = pci_inv_session_id + }; + + /* PCI device filter: Skip non-EP devices */ + if (pci_has_cap(pd, PCI_CFG_CAP_ID_EXP, false)) { + if (pd->dev_type != PCIE_TYPE_ENDPOINT) + return OPAL_SUCCESS; + } + else if (pd->is_bridge) + return OPAL_SUCCESS; + + /* Fill the PCI device inventory description */ + pack.device.domain_num = cpu_to_be16(phb->opal_id & 0xffff); + pack.device.bus_num = (pd->bdfn >> 8) & 0xff; + pack.device.device_num = (pd->bdfn >> 3) & 0x1f; + pack.device.func_num = pd->bdfn & 0x7; + pack.device.vendor_id = cpu_to_be16(PCI_VENDOR_ID(pd->vdid)); + pack.device.device_id = cpu_to_be16(PCI_DEVICE_ID(pd->vdid)); + pack.device.class_code = cpu_to_be32(pd->class & 0xffffff); + pci_cfg_read8(phb, pd->bdfn, PCI_CFG_REV_ID, &pack.device.revision); + + msg = ipmi_mkmsg_simple(IPMI_PCI_INV, &pack, sizeof(pack)); + if (!msg) + return OPAL_HARDWARE; + + /* Synchronously send the IPMI message, the queue is too small */ + ipmi_queue_msg_sync(msg); + + return OPAL_SUCCESS; +} + +static void vesnin_pci_probe_complete(void) +{ + struct phb *phb; + + check_all_slot_table(); + + /* Send PCI device list to the BMC */ + ++pci_inv_session_id; + for_each_phb(phb) { + pci_walk_dev(phb, NULL, &pciinv_walk, NULL); + } +} + static bool vesnin_probe(void) { if (!dt_node_is_compatible(dt_root, "YADRO,vesnin")) @@ -251,7 +350,7 @@ DECLARE_PLATFORM(vesnin) = { .probe = vesnin_probe, .init = astbmc_init, .pci_get_slot_info = slot_table_get_slot_info, - .pci_probe_complete = check_all_slot_table, + .pci_probe_complete = vesnin_pci_probe_complete, .external_irq = astbmc_ext_irq_serirq_cpld, .cec_power_down = astbmc_ipmi_power_down, .cec_reboot = astbmc_ipmi_reboot,