All of lore.kernel.org
 help / color / mirror / Atom feed
* [Xen-devel]  [PATCH v5] ns16550: Add ACPI support for ARM only
@ 2020-02-24  1:17 Wei Xu
  2020-02-24 10:09 ` Julien Grall
  0 siblings, 1 reply; 3+ messages in thread
From: Wei Xu @ 2020-02-24  1:17 UTC (permalink / raw)
  To: xen-devel@lists.xenproject.org
  Cc: Stefano Stabellini, Julien Grall, Zengtao (B), Wei Liu,
	Konrad Rzeszutek Wilk, George Dunlap, Andrew Cooper, Ian Jackson,
	Linuxarm, xuwei5, Shameerali Kolothum Thodi, Jan Beulich

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 <xuwei5@hisilicon.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Julien Grall <julien@xen.org>

---
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 <xen/acpi.h>
+
+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
-- 
2.8.1


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [Xen-devel] [PATCH v5] ns16550: Add ACPI support for ARM only
  2020-02-24  1:17 [Xen-devel] [PATCH v5] ns16550: Add ACPI support for ARM only Wei Xu
@ 2020-02-24 10:09 ` Julien Grall
  2020-02-24 11:07   ` Wei Xu
  0 siblings, 1 reply; 3+ messages in thread
From: Julien Grall @ 2020-02-24 10:09 UTC (permalink / raw)
  To: Wei Xu, xen-devel@lists.xenproject.org
  Cc: Stefano Stabellini, Zengtao (B), Wei Liu, Konrad Rzeszutek Wilk,
	George Dunlap, Andrew Cooper, Ian Jackson, Linuxarm,
	Shameerali Kolothum Thodi, Jan Beulich

Hi Wei,

On 24/02/2020 01:17, Wei Xu wrote:
> 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 <xuwei5@hisilicon.com>
> Reviewed-by: Jan Beulich <jbeulich@suse.com>

I don't think Jan gave an explicit reviewed-by for this patch. However...

> Acked-by: Julien Grall <julien@xen.org>
> 
> ---
> Changes in v5:
> - check the serial port address space before checking the address

... version 4 of this patch has already been merged. So can you send a 
follow-up to re-order the check?

Best regards,

-- 
Julien Grall

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [Xen-devel] [PATCH v5] ns16550: Add ACPI support for ARM only
  2020-02-24 10:09 ` Julien Grall
@ 2020-02-24 11:07   ` Wei Xu
  0 siblings, 0 replies; 3+ messages in thread
From: Wei Xu @ 2020-02-24 11:07 UTC (permalink / raw)
  To: Julien Grall, xen-devel@lists.xenproject.org
  Cc: Stefano Stabellini, Zengtao (B), Wei Liu, Konrad Rzeszutek Wilk,
	George Dunlap, Andrew Cooper, Ian Jackson, Linuxarm,
	Shameerali Kolothum Thodi, Jan Beulich

Hi Julien,

On 2020/2/24 18:09, Julien Grall wrote:
> Hi Wei,
> 
> On 24/02/2020 01:17, Wei Xu wrote:
>> 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 <xuwei5@hisilicon.com>
>> Reviewed-by: Jan Beulich <jbeulich@suse.com>
> 
> I don't think Jan gave an explicit reviewed-by for this patch. However...

Sorry, I misunderstood it.

> 
>> Acked-by: Julien Grall <julien@xen.org>
>>
>> ---
>> Changes in v5:
>> - check the serial port address space before checking the address
> 
> ... version 4 of this patch has already been merged. So can you send a follow-up to re-order the check?

I will send a follow-up to re-order it.
Thanks!

Best Regards,
Wei

> 
> Best regards,
> 


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2020-02-24 11:08 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-02-24  1:17 [Xen-devel] [PATCH v5] ns16550: Add ACPI support for ARM only Wei Xu
2020-02-24 10:09 ` Julien Grall
2020-02-24 11:07   ` Wei Xu

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.