Re: [PATCH 2/2] x86_64/console: Add NS16550 polled console driver

2018-07-12 Thread Amaan Cheval
Thanks a lot for the kind words! It definitely wouldn't have come even
this far without this brilliant community, so I really can't take most
of the credit. Thanks for all the help!

P.S. - For those interested, documentation on running is coming soon!

On Thu, Jul 12, 2018 at 2:14 AM, Joel Sherrill  wrote:
> After discussion with Chris and a confirmation from Amaan, I have pushed
> this patch set which means we now have x86_64 and the amd64 BSP.
> Amaan would be the first to tell you that it needs more love but it
> does run hello world and is far enough along where others can
> begin to experiment with and enhance it.
>
> Thanks Amaan. We all look forward to you guiding this port and
> BSP to maturity.  :)
>
> --joel
>
> On Mon, Jul 9, 2018 at 6:12 AM, Amaan Cheval  wrote:
>>
>> This addition allows us to successfully run the sample hello.exe test.
>>
>> Updates #2898.
>> ---
>>  bsps/x86_64/amd64/console/console.c| 123
>> +
>>  c/src/lib/libbsp/x86_64/amd64/Makefile.am  |   2 +
>>  .../score/cpu/x86_64/include/rtems/score/cpuimpl.h |  14 +++
>>  .../score/cpu/x86_64/include/rtems/score/x86_64.h  |   3 +
>>  4 files changed, 49 insertions(+), 93 deletions(-)
>>
>> diff --git a/bsps/x86_64/amd64/console/console.c
>> b/bsps/x86_64/amd64/console/console.c
>> index b272b679d7..5408c57fe7 100644
>> --- a/bsps/x86_64/amd64/console/console.c
>> +++ b/bsps/x86_64/amd64/console/console.c
>> @@ -24,112 +24,49 @@
>>   * SUCH DAMAGE.
>>   */
>>
>> -#include 
>> +#include 
>>  #include 
>> -#include 
>> -
>> -/*  console_initialize
>> - *
>> - *  This routine initializes the console IO driver.
>> - *
>> - *  Input parameters: NONE
>> - *
>> - *  Output parameters:  NONE
>> - *
>> - *  Return values:
>> - */
>> +#include 
>> +#include 
>> +#include 
>>
>> -rtems_device_driver console_initialize(
>> -  rtems_device_major_number  major,
>> -  rtems_device_minor_number  minor,
>> -  void  *arg
>> -)
>> +static uint8_t amd64_uart_get_register(uintptr_t addr, uint8_t i)
>>  {
>> -  (void) major;
>> -  (void) minor;
>> -  (void) arg;
>> -  return RTEMS_SUCCESSFUL;
>> +  return inport_byte(addr + i);
>>  }
>>
>> -/*
>> - *  Open entry point
>> - */
>> -
>> -rtems_device_driver console_open(
>> -  rtems_device_major_number major,
>> -  rtems_device_minor_number minor,
>> -  void* arg
>> -)
>> +static void amd64_uart_set_register(uintptr_t addr, uint8_t i, uint8_t
>> val)
>>  {
>> -  (void) major;
>> -  (void) minor;
>> -  (void) arg;
>> -  return RTEMS_SUCCESSFUL;
>> +  outport_byte(addr + i, val);
>>  }
>>
>> -/*
>> - *  Close entry point
>> - */
>> -
>> -rtems_device_driver console_close(
>> -  rtems_device_major_number major,
>> -  rtems_device_minor_number minor,
>> -  void* arg
>> -)
>> -{
>> -  (void) major;
>> -  (void) minor;
>> -  (void) arg;
>> -  return RTEMS_SUCCESSFUL;
>> -}
>> +static ns16550_context amd64_uart_context = {
>> +  .base = RTEMS_TERMIOS_DEVICE_CONTEXT_INITIALIZER("UART"),
>> +  .get_reg = amd64_uart_get_register,
>> +  .set_reg = amd64_uart_set_register,
>> +  .port = (uintptr_t) COM1_BASE_IO,
>> +  .initial_baud = COM1_CLOCK_RATE
>> +};
>>
>>  /*
>> - * read bytes from the serial port. We only have stdin.
>> + * XXX: We should use the interrupt based handler once interrupts are
>> supported
>>   */
>> +const console_device console_device_table[] = {
>> +  {
>> +.device_file = "/dev/console",
>> +.probe = console_device_probe_default,
>> +.handler = _handler_polled,
>> +.context = _uart_context.base
>> +  }
>> +};
>> +const size_t console_device_count =
>> RTEMS_ARRAY_SIZE(console_device_table);
>>
>> -rtems_device_driver console_read(
>> -  rtems_device_major_number major,
>> -  rtems_device_minor_number minor,
>> -  void* arg
>> -)
>> +static void output_char(char c)
>>  {
>> -  (void) major;
>> -  (void) minor;
>> -  (void) arg;
>> -  return RTEMS_SUCCESSFUL;
>> -}
>> +  rtems_termios_device_context *ctx = console_device_table[0].context;
>>
>> -/*
>> - * write bytes to the serial port. Stdout and stderr are the same.
>> - */
>> -
>> -rtems_device_driver console_write(
>> -  rtems_device_major_number major,
>> -  rtems_device_minor_number minor,
>> -  void* arg
>> -)
>> -{
>> -  (void) major;
>> -  (void) minor;
>> -  (void) arg;
>> -  return 0;
>> -}
>> -
>> -/*
>> - *  IO Control entry point
>> - */
>> -
>> -rtems_device_driver console_control(
>> -  rtems_device_major_number major,
>> -  rtems_device_minor_number minor,
>> -  void* arg
>> -)
>> -{
>> -  (void) major;
>> -  (void) minor;
>> -  (void) arg;
>> -  return RTEMS_SUCCESSFUL;
>> +  ns16550_polled_putchar(ctx, c);
>>  }
>>
>> -BSP_output_char_function_type BSP_output_char = NULL;
>> -BSP_polling_getchar_function_type BSP_poll_char   = NULL;
>> +BSP_output_char_function_type BSP_output_char   = output_char;
>> +BSP_polling_getchar_function_type 

Re: [PATCH 2/2] x86_64/console: Add NS16550 polled console driver

2018-07-11 Thread Joel Sherrill
After discussion with Chris and a confirmation from Amaan, I have pushed
this patch set which means we now have x86_64 and the amd64 BSP.
Amaan would be the first to tell you that it needs more love but it
does run hello world and is far enough along where others can
begin to experiment with and enhance it.

Thanks Amaan. We all look forward to you guiding this port and
BSP to maturity.  :)

--joel

On Mon, Jul 9, 2018 at 6:12 AM, Amaan Cheval  wrote:

> This addition allows us to successfully run the sample hello.exe test.
>
> Updates #2898.
> ---
>  bsps/x86_64/amd64/console/console.c| 123
> +
>  c/src/lib/libbsp/x86_64/amd64/Makefile.am  |   2 +
>  .../score/cpu/x86_64/include/rtems/score/cpuimpl.h |  14 +++
>  .../score/cpu/x86_64/include/rtems/score/x86_64.h  |   3 +
>  4 files changed, 49 insertions(+), 93 deletions(-)
>
> diff --git a/bsps/x86_64/amd64/console/console.c
> b/bsps/x86_64/amd64/console/console.c
> index b272b679d7..5408c57fe7 100644
> --- a/bsps/x86_64/amd64/console/console.c
> +++ b/bsps/x86_64/amd64/console/console.c
> @@ -24,112 +24,49 @@
>   * SUCH DAMAGE.
>   */
>
> -#include 
> +#include 
>  #include 
> -#include 
> -
> -/*  console_initialize
> - *
> - *  This routine initializes the console IO driver.
> - *
> - *  Input parameters: NONE
> - *
> - *  Output parameters:  NONE
> - *
> - *  Return values:
> - */
> +#include 
> +#include 
> +#include 
>
> -rtems_device_driver console_initialize(
> -  rtems_device_major_number  major,
> -  rtems_device_minor_number  minor,
> -  void  *arg
> -)
> +static uint8_t amd64_uart_get_register(uintptr_t addr, uint8_t i)
>  {
> -  (void) major;
> -  (void) minor;
> -  (void) arg;
> -  return RTEMS_SUCCESSFUL;
> +  return inport_byte(addr + i);
>  }
>
> -/*
> - *  Open entry point
> - */
> -
> -rtems_device_driver console_open(
> -  rtems_device_major_number major,
> -  rtems_device_minor_number minor,
> -  void* arg
> -)
> +static void amd64_uart_set_register(uintptr_t addr, uint8_t i, uint8_t
> val)
>  {
> -  (void) major;
> -  (void) minor;
> -  (void) arg;
> -  return RTEMS_SUCCESSFUL;
> +  outport_byte(addr + i, val);
>  }
>
> -/*
> - *  Close entry point
> - */
> -
> -rtems_device_driver console_close(
> -  rtems_device_major_number major,
> -  rtems_device_minor_number minor,
> -  void* arg
> -)
> -{
> -  (void) major;
> -  (void) minor;
> -  (void) arg;
> -  return RTEMS_SUCCESSFUL;
> -}
> +static ns16550_context amd64_uart_context = {
> +  .base = RTEMS_TERMIOS_DEVICE_CONTEXT_INITIALIZER("UART"),
> +  .get_reg = amd64_uart_get_register,
> +  .set_reg = amd64_uart_set_register,
> +  .port = (uintptr_t) COM1_BASE_IO,
> +  .initial_baud = COM1_CLOCK_RATE
> +};
>
>  /*
> - * read bytes from the serial port. We only have stdin.
> + * XXX: We should use the interrupt based handler once interrupts are
> supported
>   */
> +const console_device console_device_table[] = {
> +  {
> +.device_file = "/dev/console",
> +.probe = console_device_probe_default,
> +.handler = _handler_polled,
> +.context = _uart_context.base
> +  }
> +};
> +const size_t console_device_count = RTEMS_ARRAY_SIZE(console_
> device_table);
>
> -rtems_device_driver console_read(
> -  rtems_device_major_number major,
> -  rtems_device_minor_number minor,
> -  void* arg
> -)
> +static void output_char(char c)
>  {
> -  (void) major;
> -  (void) minor;
> -  (void) arg;
> -  return RTEMS_SUCCESSFUL;
> -}
> +  rtems_termios_device_context *ctx = console_device_table[0].context;
>
> -/*
> - * write bytes to the serial port. Stdout and stderr are the same.
> - */
> -
> -rtems_device_driver console_write(
> -  rtems_device_major_number major,
> -  rtems_device_minor_number minor,
> -  void* arg
> -)
> -{
> -  (void) major;
> -  (void) minor;
> -  (void) arg;
> -  return 0;
> -}
> -
> -/*
> - *  IO Control entry point
> - */
> -
> -rtems_device_driver console_control(
> -  rtems_device_major_number major,
> -  rtems_device_minor_number minor,
> -  void* arg
> -)
> -{
> -  (void) major;
> -  (void) minor;
> -  (void) arg;
> -  return RTEMS_SUCCESSFUL;
> +  ns16550_polled_putchar(ctx, c);
>  }
>
> -BSP_output_char_function_type BSP_output_char = NULL;
> -BSP_polling_getchar_function_type BSP_poll_char   = NULL;
> +BSP_output_char_function_type BSP_output_char   = output_char;
> +BSP_polling_getchar_function_type BSP_poll_char = NULL;
> diff --git a/c/src/lib/libbsp/x86_64/amd64/Makefile.am
> b/c/src/lib/libbsp/x86_64/amd64/Makefile.am
> index f05b40f3f9..aa40f6224f 100644
> --- a/c/src/lib/libbsp/x86_64/amd64/Makefile.am
> +++ b/c/src/lib/libbsp/x86_64/amd64/Makefile.am
> @@ -29,6 +29,8 @@ librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/
> start/bspreset-empty.c
>  # clock
>  librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/
> dev/clock/clock-simidle.c
>  # console
> +librtemsbsp_a_SOURCES += 

[PATCH 2/2] x86_64/console: Add NS16550 polled console driver

2018-07-09 Thread Amaan Cheval
This addition allows us to successfully run the sample hello.exe test.

Updates #2898.
---
 bsps/x86_64/amd64/console/console.c| 123 +
 c/src/lib/libbsp/x86_64/amd64/Makefile.am  |   2 +
 .../score/cpu/x86_64/include/rtems/score/cpuimpl.h |  14 +++
 .../score/cpu/x86_64/include/rtems/score/x86_64.h  |   3 +
 4 files changed, 49 insertions(+), 93 deletions(-)

diff --git a/bsps/x86_64/amd64/console/console.c 
b/bsps/x86_64/amd64/console/console.c
index b272b679d7..5408c57fe7 100644
--- a/bsps/x86_64/amd64/console/console.c
+++ b/bsps/x86_64/amd64/console/console.c
@@ -24,112 +24,49 @@
  * SUCH DAMAGE.
  */
 
-#include 
+#include 
 #include 
-#include 
-
-/*  console_initialize
- *
- *  This routine initializes the console IO driver.
- *
- *  Input parameters: NONE
- *
- *  Output parameters:  NONE
- *
- *  Return values:
- */
+#include 
+#include 
+#include 
 
-rtems_device_driver console_initialize(
-  rtems_device_major_number  major,
-  rtems_device_minor_number  minor,
-  void  *arg
-)
+static uint8_t amd64_uart_get_register(uintptr_t addr, uint8_t i)
 {
-  (void) major;
-  (void) minor;
-  (void) arg;
-  return RTEMS_SUCCESSFUL;
+  return inport_byte(addr + i);
 }
 
-/*
- *  Open entry point
- */
-
-rtems_device_driver console_open(
-  rtems_device_major_number major,
-  rtems_device_minor_number minor,
-  void* arg
-)
+static void amd64_uart_set_register(uintptr_t addr, uint8_t i, uint8_t val)
 {
-  (void) major;
-  (void) minor;
-  (void) arg;
-  return RTEMS_SUCCESSFUL;
+  outport_byte(addr + i, val);
 }
 
-/*
- *  Close entry point
- */
-
-rtems_device_driver console_close(
-  rtems_device_major_number major,
-  rtems_device_minor_number minor,
-  void* arg
-)
-{
-  (void) major;
-  (void) minor;
-  (void) arg;
-  return RTEMS_SUCCESSFUL;
-}
+static ns16550_context amd64_uart_context = {
+  .base = RTEMS_TERMIOS_DEVICE_CONTEXT_INITIALIZER("UART"),
+  .get_reg = amd64_uart_get_register,
+  .set_reg = amd64_uart_set_register,
+  .port = (uintptr_t) COM1_BASE_IO,
+  .initial_baud = COM1_CLOCK_RATE
+};
 
 /*
- * read bytes from the serial port. We only have stdin.
+ * XXX: We should use the interrupt based handler once interrupts are supported
  */
+const console_device console_device_table[] = {
+  {
+.device_file = "/dev/console",
+.probe = console_device_probe_default,
+.handler = _handler_polled,
+.context = _uart_context.base
+  }
+};
+const size_t console_device_count = RTEMS_ARRAY_SIZE(console_device_table);
 
-rtems_device_driver console_read(
-  rtems_device_major_number major,
-  rtems_device_minor_number minor,
-  void* arg
-)
+static void output_char(char c)
 {
-  (void) major;
-  (void) minor;
-  (void) arg;
-  return RTEMS_SUCCESSFUL;
-}
+  rtems_termios_device_context *ctx = console_device_table[0].context;
 
-/*
- * write bytes to the serial port. Stdout and stderr are the same.
- */
-
-rtems_device_driver console_write(
-  rtems_device_major_number major,
-  rtems_device_minor_number minor,
-  void* arg
-)
-{
-  (void) major;
-  (void) minor;
-  (void) arg;
-  return 0;
-}
-
-/*
- *  IO Control entry point
- */
-
-rtems_device_driver console_control(
-  rtems_device_major_number major,
-  rtems_device_minor_number minor,
-  void* arg
-)
-{
-  (void) major;
-  (void) minor;
-  (void) arg;
-  return RTEMS_SUCCESSFUL;
+  ns16550_polled_putchar(ctx, c);
 }
 
-BSP_output_char_function_type BSP_output_char = NULL;
-BSP_polling_getchar_function_type BSP_poll_char   = NULL;
+BSP_output_char_function_type BSP_output_char   = output_char;
+BSP_polling_getchar_function_type BSP_poll_char = NULL;
diff --git a/c/src/lib/libbsp/x86_64/amd64/Makefile.am 
b/c/src/lib/libbsp/x86_64/amd64/Makefile.am
index f05b40f3f9..aa40f6224f 100644
--- a/c/src/lib/libbsp/x86_64/amd64/Makefile.am
+++ b/c/src/lib/libbsp/x86_64/amd64/Makefile.am
@@ -29,6 +29,8 @@ librtemsbsp_a_SOURCES += 
../../../../../../bsps/shared/start/bspreset-empty.c
 # clock
 librtemsbsp_a_SOURCES += 
../../../../../../bsps/shared/dev/clock/clock-simidle.c
 # console
+librtemsbsp_a_SOURCES += 
../../../../../../bsps/shared/dev/serial/console-termios-init.c
+librtemsbsp_a_SOURCES += 
../../../../../../bsps/shared/dev/serial/console-termios.c
 librtemsbsp_a_SOURCES += ../../../../../../bsps/x86_64/amd64/console/console.c
 # timer
 librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/btimer/btimer-stub.c
diff --git a/cpukit/score/cpu/x86_64/include/rtems/score/cpuimpl.h 
b/cpukit/score/cpu/x86_64/include/rtems/score/cpuimpl.h
index bac092c320..67fe712a32 100644
--- a/cpukit/score/cpu/x86_64/include/rtems/score/cpuimpl.h
+++ b/cpukit/score/cpu/x86_64/include/rtems/score/cpuimpl.h
@@ -28,6 +28,20 @@
 extern "C" {
 #endif
 
+static inline uint8_t inport_byte(uint16_t port)
+{
+  uint8_t ret;
+  __asm__ volatile ( "inb %1, %0"
+ : "=a" (ret)
+