From patchwork Mon Feb 24 01:17:54 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wei Xu X-Patchwork-Id: 183761 Delivered-To: patch@linaro.org Received: by 2002:a92:1f12:0:0:0:0:0 with SMTP id i18csp4764215ile; Sun, 23 Feb 2020 17:19:34 -0800 (PST) X-Google-Smtp-Source: APXvYqyWi5I/Gk/JmY48escp5Hz8bK6neH0OhSnHSyIuhPrjG0HxWGvnk0Iaop0P42v1ptmyyzBx X-Received: by 2002:a5d:9b12:: with SMTP id y18mr23604746ion.176.1582507174668; Sun, 23 Feb 2020 17:19:34 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1582507174; cv=none; d=google.com; s=arc-20160816; b=T7/leteZhpKCk/A5U3zO5AISC5+vmlIrTyIPyrYWE0yD/EM8qGJBGlDWO2lFw7T2nI 3v0/pLgHZa69qXcBoAqLxMab8S0I/Y9Qvh+lQ1/XcaBBdHINB3eB6T7wTLvZxhEV5Z06 /Oa0Dntg8ZeRsp+6iepjrmsUrOShtC5bZGg2KsgoDrWhUsmFtrmkxuzqEAO11c/l6yNQ cm73bgeKM5HvpOjJaVssboAA70XrlYWCqvINQWk5PTo/tqxj00vx9Sf7Oh3hN6qgEGRs DBBrihNHAylGVVLU26yjqKNh0qiSoxEoUuSWatiXFZB2ivzV9TqDpzmfslO8x++9jfAX 3OhQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:list-subscribe :list-help:list-post:list-unsubscribe:list-id:precedence:subject :mime-version:user-agent:date:message-id:from:to; bh=IpOoMtdam5O1mGWje5QXsaFKMyY+x0RUR4Z2SSpvWMc=; b=j5bbctnXDVmLXj3m0JvEpQ3e+flL4ltP5381/B48qzc8jEKfrYPDwGWLcOm7gfzajy t2WC5iLhpPTs4zuhuuFq7UmZamwTVxzS2H4/xmU+edPEujjxvqgwOhzSf93hQntnSeVm zreLRkRcxo0XJHki8pMyZZQXo/luFbjcc3uefymcTrxtYh1Oz939WdV6fEy7946PYn6v Jrau/zelzwrKSPRkTzJZLb6eMeVqUsi6I4t5BNmUPizfRWWX/ZkGRog8C33vmE2DE+zo c3JpLNaycyKb6wc0lrpstCf4sr2AmnO5NZEmd3Pfc6CaFZ14GbL11jSEZbjWVIXePNKE 0yqg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of xen-devel-bounces@lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org. [192.237.175.120]) by mx.google.com with ESMTPS id z18si6775639ioj.114.2020.02.23.17.19.34 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sun, 23 Feb 2020 17:19:34 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of xen-devel-bounces@lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of xen-devel-bounces@lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1j62Nt-0003Jv-0U; Mon, 24 Feb 2020 01:18:09 +0000 Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1j62Nr-0003Jq-RZ for xen-devel@lists.xenproject.org; Mon, 24 Feb 2020 01:18:07 +0000 X-Inumbo-ID: 813a801a-56a3-11ea-8a90-12813bfff9fa Received: from huawei.com (unknown [45.249.212.191]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTPS id 813a801a-56a3-11ea-8a90-12813bfff9fa; Mon, 24 Feb 2020 01:18:04 +0000 (UTC) Received: from DGGEMS414-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id 7E92E6194054AA64F5F3; Mon, 24 Feb 2020 09:18:02 +0800 (CST) Received: from [127.0.0.1] (10.57.101.250) by DGGEMS414-HUB.china.huawei.com (10.3.19.214) with Microsoft SMTP Server id 14.3.439.0; Mon, 24 Feb 2020 09:17:55 +0800 To: "xen-devel@lists.xenproject.org" From: Wei Xu Message-ID: <5E532442.1040401@hisilicon.com> Date: Mon, 24 Feb 2020 09:17:54 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.2.0 MIME-Version: 1.0 X-Originating-IP: [10.57.101.250] X-CFilter-Loop: Reflected Subject: [Xen-devel] [PATCH v5] ns16550: Add ACPI support for ARM only X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Stefano Stabellini , Julien Grall , "Zengtao \(B\)" , Wei Liu , Konrad Rzeszutek Wilk , George Dunlap , Andrew Cooper , Ian Jackson , Linuxarm , xuwei5@hisilicon.com, Shameerali Kolothum Thodi , Jan Beulich Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" Parse the ACPI SPCR table and initialize the 16550 compatible serial port for ARM only. Currently we only support one UART on ARM. Some fields which we do not care yet on ARM are ignored. Signed-off-by: Wei Xu Reviewed-by: Jan Beulich Acked-by: Julien Grall --- Changes in v5: - check the serial port address space before checking the address Changes in v4: - change the print when the serial port address is 0 - check the serial port address space id before initializing - change the comment for the ignored PCIe fields Changes in v3: - address the code style comments from Jan - use container_of to do cast - list all fields we ignored - check the console redirection is disabled or not before init the uart - init the uart io_size and width via spcr->serial_port Changes in v2: - improve commit message - remove the spcr initialization - add comments for the uart initialization and configuration - adjust the code style issue - limit the code only built on ACPI and ARM --- xen/drivers/char/ns16550.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/xen/drivers/char/ns16550.c b/xen/drivers/char/ns16550.c index aa87c57..425e044 100644 --- a/xen/drivers/char/ns16550.c +++ b/xen/drivers/char/ns16550.c @@ -1620,6 +1620,85 @@ DT_DEVICE_START(ns16550, "NS16550 UART", DEVICE_SERIAL) DT_DEVICE_END #endif /* HAS_DEVICE_TREE */ + +#if defined(CONFIG_ACPI) && defined(CONFIG_ARM) +#include + +static int __init ns16550_acpi_uart_init(const void *data) +{ + struct acpi_table_header *table; + struct acpi_table_spcr *spcr; + acpi_status status; + /* + * Same as the DT part. + * Only support one UART on ARM which happen to be ns16550_com[0]. + */ + struct ns16550 *uart = &ns16550_com[0]; + + status = acpi_get_table(ACPI_SIG_SPCR, 0, &table); + if ( ACPI_FAILURE(status) ) + { + printk("ns16550: Failed to get SPCR table\n"); + return -EINVAL; + } + + spcr = container_of(table, struct acpi_table_spcr, header); + + if ( unlikely(spcr->serial_port.space_id != ACPI_ADR_SPACE_SYSTEM_MEMORY) ) + { + printk("ns16550: Address space type is not mmio\n"); + return -EINVAL; + } + + /* + * The serial port address may be 0 for example + * if the console redirection is disabled. + */ + if ( unlikely(!spcr->serial_port.address) ) + { + printk("ns16550: Console redirection is disabled\n"); + return -EINVAL; + } + + ns16550_init_common(uart); + + /* + * The baud rate is pre-configured by the firmware. + * And currently the ACPI part is only targeting ARM so the flow_control + * field and all PCI related ones which we do not care yet are ignored. + */ + uart->baud = BAUD_AUTO; + uart->data_bits = 8; + uart->parity = spcr->parity; + uart->stop_bits = spcr->stop_bits; + uart->io_base = spcr->serial_port.address; + uart->io_size = spcr->serial_port.bit_width; + uart->reg_shift = spcr->serial_port.bit_offset; + uart->reg_width = spcr->serial_port.access_width; + + /* The trigger/polarity information is not available in spcr. */ + irq_set_type(spcr->interrupt, IRQ_TYPE_LEVEL_HIGH); + uart->irq = spcr->interrupt; + + uart->vuart.base_addr = uart->io_base; + uart->vuart.size = uart->io_size; + uart->vuart.data_off = UART_THR << uart->reg_shift; + uart->vuart.status_off = UART_LSR << uart->reg_shift; + uart->vuart.status = UART_LSR_THRE | UART_LSR_TEMT; + + /* Register with generic serial driver. */ + serial_register_uart(SERHND_DTUART, &ns16550_driver, uart); + + return 0; +} + +ACPI_DEVICE_START(ans16550, "NS16550 UART", DEVICE_SERIAL) + .class_type = ACPI_DBG2_16550_COMPATIBLE, + .init = ns16550_acpi_uart_init, +ACPI_DEVICE_END + +#endif /* CONFIG_ACPI && CONFIG_ARM */ + /* * Local variables: * mode: C