On 2016-11-21 14:04, Ralf Ramsauer wrote:
> This patch exchanges the type of the debug_console.
> 
> So far, the jailhouse debug console has been a simple
> jailhouse_memory_region. This makes it hard to differentiate between
> different kinds of debug outputs.
> 
> This patch introduces the new struct jailhouse_debug_console which makes
> the debug_console much more extensible.
> 
> Signed-off-by: Ralf Ramsauer <[email protected]>
> ---
>  Documentation/vga-console.txt              |  4 ++--
>  configs/amd-seattle.c                      |  6 ++++--
>  configs/bananapi.c                         |  6 ++++--
>  configs/f2a88xm-hd3.c                      |  5 ++++-
>  configs/foundation-v8.c                    |  6 ++++--
>  configs/h87i.c                             |  5 ++++-
>  configs/hikey.c                            |  6 ++++--
>  configs/imb-a180.c                         |  5 ++++-
>  configs/jetson-tk1.c                       |  6 ++++--
>  configs/qemu-vm.c                          |  5 ++++-
>  configs/vexpress.c                         |  6 ++++--
>  driver/main.c                              |  6 +++---
>  hypervisor/arch/arm64/asm-defines.c        |  2 +-
>  hypervisor/arch/x86/uart.c                 | 12 +++++++-----
>  hypervisor/arch/x86/vga.c                  |  2 +-
>  hypervisor/include/jailhouse/cell-config.h | 26 +++++++++++++++++++++++++-
>  hypervisor/paging.c                        |  4 ++--
>  tools/root-cell-config.c.tmpl              |  4 +++-
>  18 files changed, 84 insertions(+), 32 deletions(-)
> 
> diff --git a/Documentation/vga-console.txt b/Documentation/vga-console.txt
> index 64506fadfd5f..3157aef01b6d 100644
> --- a/Documentation/vga-console.txt
> +++ b/Documentation/vga-console.txt
> @@ -18,9 +18,9 @@ Usage
>  Add the following to the header section of your root cell's config:
>  
>  .debug_console = {
> -        .phys_start = 0xb8000,
> +        .address = 0xb8000,
>          .size = 0x1000,
> -        .flags = JAILHOUSE_MEM_IO,
> +        .flags = JAILHOUSE_DBG_TYPE_VGA | JAILHOUSE_DBG_FLAG_MMIO,
>  },
>  
>  Boot using the following kernel parameters:
> diff --git a/configs/amd-seattle.c b/configs/amd-seattle.c
> index 7298bec0c34f..1b70d80103af 100644
> --- a/configs/amd-seattle.c
> +++ b/configs/amd-seattle.c
> @@ -28,9 +28,11 @@ struct {
>                       .size =          0x4000000,
>               },
>               .debug_console = {
> -                     .phys_start = 0xe1010000,
> +                     .address = 0xe1010000,
>                       .size = 0x1000,
> -                     .flags = JAILHOUSE_MEM_IO,
> +                     .flags = JAILHOUSE_DBG_TYPE_UART_ARM |
> +                              JAILHOUSE_DBG_FLAG_MMIO |
> +                              JAILHOUSE_DBG_FLAG_REG_WIDTH_32,

Let's limit explicit register distance specifications to default
deviations. 32 bit is the default for MMIO.

>               },
>               .platform_info.arm = {
>                       .gicd_base = 0xe1110000,
> diff --git a/configs/bananapi.c b/configs/bananapi.c
> index 6f1103faf4fd..95424588f814 100644
> --- a/configs/bananapi.c
> +++ b/configs/bananapi.c
> @@ -30,9 +30,11 @@ struct {
>                       .size = 0x4000000,
>               },
>               .debug_console = {
> -                     .phys_start = 0x01c28000,
> +                     .address = 0x01c28000,
>                       .size = 0x1000,
> -                     .flags = JAILHOUSE_MEM_IO,
> +                     .flags = JAILHOUSE_DBG_TYPE_UART_ARM |
> +                              JAILHOUSE_DBG_FLAG_MMIO |
> +                              JAILHOUSE_DBG_FLAG_REG_WIDTH_32,
>               },
>               .platform_info.arm = {
>                       .gicd_base = 0x01c81000,
> diff --git a/configs/f2a88xm-hd3.c b/configs/f2a88xm-hd3.c
> index b7926bc41222..ba1e2f0d8b85 100644
> --- a/configs/f2a88xm-hd3.c
> +++ b/configs/f2a88xm-hd3.c
> @@ -38,7 +38,10 @@ struct {
>                       .size = 0x4000000,
>               },
>               .debug_console = {
> -                     .phys_start = 0x3f8,
> +                     .address = 0x3f8,
> +                     .flags = JAILHOUSE_DBG_TYPE_UART_X86 |
> +                              JAILHOUSE_DBG_FLAG_PIO |
> +                              JAILHOUSE_DBG_FLAG_REG_WIDTH_8,

...and 8 bit for PIO.

>               },
>               .platform_info.x86 = {
>                       .mmconfig_base = 0xe0000000,
> diff --git a/configs/foundation-v8.c b/configs/foundation-v8.c
> index a7f402169e16..479021fe0167 100644
> --- a/configs/foundation-v8.c
> +++ b/configs/foundation-v8.c
> @@ -28,9 +28,11 @@ struct {
>                       .size = 0x4000000,
>               },
>               .debug_console = {
> -                     .phys_start = 0x1c090000,
> +                     .address = 0x1c090000,
>                       .size = 0x1000,
> -                     .flags = JAILHOUSE_MEM_IO,
> +                     .flags = JAILHOUSE_DBG_TYPE_UART_ARM |
> +                              JAILHOUSE_DBG_FLAG_MMIO |
> +                              JAILHOUSE_DBG_FLAG_REG_WIDTH_32,
>               },
>               .platform_info.arm = {
>  #ifdef CONFIG_ARM_GIC_V3
> diff --git a/configs/h87i.c b/configs/h87i.c
> index 7f0407cc9ca9..1cbdc33113dc 100644
> --- a/configs/h87i.c
> +++ b/configs/h87i.c
> @@ -33,7 +33,10 @@ struct {
>                       .size = 0x4000000,
>               },
>               .debug_console = {
> -                     .phys_start = 0xe010,
> +                     .address = 0xe010,
> +                     .flags = JAILHOUSE_DBG_TYPE_UART_X86 |
> +                              JAILHOUSE_DBG_FLAG_PIO |
> +                              JAILHOUSE_DBG_FLAG_REG_WIDTH_8,
>               },
>               .platform_info.x86 = {
>                       .mmconfig_base = 0xf8000000,
> diff --git a/configs/hikey.c b/configs/hikey.c
> index 3c16c25a5f38..8da01d55a2b8 100644
> --- a/configs/hikey.c
> +++ b/configs/hikey.c
> @@ -28,9 +28,11 @@ struct {
>                       .size =       0x04000000,
>               },
>               .debug_console = {
> -                     .phys_start = 0xf7113000,
> +                     .address = 0xf7113000,
>                       .size = 0x1000,
> -                     .flags = JAILHOUSE_MEM_IO,
> +                     .flags = JAILHOUSE_DBG_TYPE_UART_ARM |
> +                              JAILHOUSE_DBG_FLAG_MMIO |
> +                              JAILHOUSE_DBG_FLAG_REG_WIDTH_32,
>               },
>               .platform_info.arm = {
>                       .gicd_base = 0xf6801000,
> diff --git a/configs/imb-a180.c b/configs/imb-a180.c
> index 0b23dae7e35c..f944fe35a6d8 100644
> --- a/configs/imb-a180.c
> +++ b/configs/imb-a180.c
> @@ -37,7 +37,10 @@ struct {
>                       .size = 0x4000000,
>               },
>               .debug_console = {
> -                     .phys_start = 0x3f8,
> +                     .address = 0x3f8,
> +                     .flags = JAILHOUSE_DBG_TYPE_UART_X86 |
> +                              JAILHOUSE_DBG_FLAG_PIO |
> +                              JAILHOUSE_DBG_FLAG_REG_WIDTH_8,
>               },
>               .platform_info.x86 = {
>                       .mmconfig_base = 0xe0000000,
> diff --git a/configs/jetson-tk1.c b/configs/jetson-tk1.c
> index 37fc46ea573d..cc24ad0cc05b 100644
> --- a/configs/jetson-tk1.c
> +++ b/configs/jetson-tk1.c
> @@ -33,9 +33,11 @@ struct {
>                       .size = 0x4000000 - 0x100000, /* -1MB (PSCI) */
>               },
>               .debug_console = {
> -                     .phys_start = 0x70006000,
> +                     .address = 0x70006000,
>                       .size = 0x1000,
> -                     .flags = JAILHOUSE_MEM_IO,
> +                     .flags = JAILHOUSE_DBG_TYPE_UART_ARM |
> +                              JAILHOUSE_DBG_FLAG_MMIO |
> +                              JAILHOUSE_DBG_FLAG_REG_WIDTH_32,
>               },
>               .platform_info.arm = {
>                       .gicd_base = 0x50041000,
> diff --git a/configs/qemu-vm.c b/configs/qemu-vm.c
> index 5f5b0b6a1852..532aa3d07720 100644
> --- a/configs/qemu-vm.c
> +++ b/configs/qemu-vm.c
> @@ -47,7 +47,10 @@ struct {
>                       .size = 0x600000,
>               },
>               .debug_console = {
> -                     .phys_start = 0x3f8,
> +                     .address = 0x3f8,
> +                     .flags = JAILHOUSE_DBG_TYPE_UART_X86 |
> +                              JAILHOUSE_DBG_FLAG_PIO |
> +                              JAILHOUSE_DBG_FLAG_REG_WIDTH_8,
>               },
>               .platform_info.x86 = {
>                       .mmconfig_base = 0xb0000000,
> diff --git a/configs/vexpress.c b/configs/vexpress.c
> index 319bb58e7977..b407ca6cfe79 100644
> --- a/configs/vexpress.c
> +++ b/configs/vexpress.c
> @@ -28,9 +28,11 @@ struct {
>                       .size = 0x4000000,
>               },
>               .debug_console = {
> -                     .phys_start = 0x1c090000,
> +                     .address = 0x1c090000,
>                       .size = 0x1000,
> -                     .flags = JAILHOUSE_MEM_IO,
> +                     .flags = JAILHOUSE_DBG_TYPE_UART_ARM |
> +                              JAILHOUSE_DBG_FLAG_MMIO |
> +                              JAILHOUSE_DBG_FLAG_REG_WIDTH_32,
>               },
>               .platform_info.arm = {
>  #ifdef CONFIG_ARM_GIC_V3
> diff --git a/driver/main.c b/driver/main.c
> index d6834ef507d2..15294f954139 100644
> --- a/driver/main.c
> +++ b/driver/main.c
> @@ -297,14 +297,14 @@ static int jailhouse_cmd_enable(struct jailhouse_system 
> __user *arg)
>       }
>  
>  #ifdef JAILHOUSE_BORROW_ROOT_PT
> -     if (config->debug_console.flags & JAILHOUSE_MEM_IO) {
> -             console = ioremap(config->debug_console.phys_start,
> +     if (DBG_IS_MMIO(config->debug_console.flags)) {
> +             console = ioremap(config->debug_console.address,
>                                 config->debug_console.size);
>               if (!console) {
>                       err = -EINVAL;
>                       pr_err("jailhouse: Unable to map hypervisor debug "
>                              "console at %08lx\n",
> -                            (unsigned long)config->debug_console.phys_start);
> +                            (unsigned long)config->debug_console.address);
>                       goto error_unmap;
>               }
>               /* The hypervisor has no notion of address spaces, so we need
> diff --git a/hypervisor/arch/arm64/asm-defines.c 
> b/hypervisor/arch/arm64/asm-defines.c
> index 2e9373de73d5..5a92b00a6ab8 100644
> --- a/hypervisor/arch/arm64/asm-defines.c
> +++ b/hypervisor/arch/arm64/asm-defines.c
> @@ -23,7 +23,7 @@ void common(void)
>       OFFSET(HEADER_MAX_CPUS, jailhouse_header, max_cpus);
>       OFFSET(HEADER_DEBUG_CONSOLE_VIRT, jailhouse_header, debug_console_base);
>       OFFSET(SYSCONFIG_DEBUG_CONSOLE_PHYS, jailhouse_system,
> -            debug_console.phys_start);
> +            debug_console.address);
>       OFFSET(SYSCONFIG_HYPERVISOR_PHYS, jailhouse_system,
>              hypervisor_memory.phys_start);
>       BLANK();
> diff --git a/hypervisor/arch/x86/uart.c b/hypervisor/arch/x86/uart.c
> index 09c66f01a7c3..0913d2b4a1e8 100644
> --- a/hypervisor/arch/x86/uart.c
> +++ b/hypervisor/arch/x86/uart.c
> @@ -66,14 +66,16 @@ void uart_init(void)
>  {
>       u64 flags = system_config->debug_console.flags;
>  
> -     if (system_config->debug_console.phys_start == 0)
> +     if (system_config->debug_console.address == 0)
>               return;
>  
> -     if (flags & JAILHOUSE_MEM_IO) {
> -             if (system_config->debug_console.phys_start < VGA_LIMIT)
> +     if (DBG_IS_MMIO(flags)) {
> +             if (system_config->debug_console.address < VGA_LIMIT)
>                       return; /* VGA memory */
>  
> -             if (flags & JAILHOUSE_MEM_IO_32) {
> +             /* Use 32-bit MMIO access width if desired, and 8-bit MMIO
> +              * access width by default */

Register distance - not access width. And we should use 32-bit distance
for MMIO irrespective of the arch.

> +             if (flags & JAILHOUSE_DBG_FLAG_REG_WIDTH_32) {
>                       uart_reg_out = uart_mmio32_out;
>                       uart_reg_in = uart_mmio32_in;
>               } else {
> @@ -82,7 +84,7 @@ void uart_init(void)
>               }
>               uart_base = (u64)hypervisor_header.debug_console_base;
>       } else {
> -             uart_base = system_config->debug_console.phys_start;
> +             uart_base = system_config->debug_console.address;
>       }
>  
>       uart_reg_out(UART_LCR, UART_LCR_DLAB);
> diff --git a/hypervisor/arch/x86/vga.c b/hypervisor/arch/x86/vga.c
> index 53a2f8e00c93..e784448c5d2b 100644
> --- a/hypervisor/arch/x86/vga.c
> +++ b/hypervisor/arch/x86/vga.c
> @@ -30,7 +30,7 @@ u16 *vga_mem;
>  
>  void vga_init(void)
>  {
> -     if (system_config->debug_console.phys_start < VGA_LIMIT)
> +     if (system_config->debug_console.address < VGA_LIMIT)
>               vga_mem = hypervisor_header.debug_console_base;
>  }
>  
> diff --git a/hypervisor/include/jailhouse/cell-config.h 
> b/hypervisor/include/jailhouse/cell-config.h
> index a139f97a7397..82c29495deaa 100644
> --- a/hypervisor/include/jailhouse/cell-config.h
> +++ b/hypervisor/include/jailhouse/cell-config.h
> @@ -164,6 +164,30 @@ struct jailhouse_iommu {
>       __u32 amd_features;
>  } __attribute__((packed));
>  
> +/* Bits 0..3 are used to select the particular driver */
> +#define JAILHOUSE_DBG_TYPE_UART_X86  0x0001
> +#define JAILHOUSE_DBG_TYPE_UART_ARM  0x0002
> +#define JAILHOUSE_DBG_TYPE_VGA               0x0003
> +#define JAILHOUSE_DBG_TYPE_MASK              0x000f
> +
> +#define DBG_TYPE(flags) ((flags) & JAILHOUSE_DBG_TYPE_MASK)
> +
> +/* We use bit 4..5 to differentiate between PIO and MMIO access */
> +#define JAILHOUSE_DBG_FLAG_PIO               0x0010
> +#define JAILHOUSE_DBG_FLAG_MMIO              0x0020
> +
> +#define DBG_IS_MMIO(flags) ((flags) & JAILHOUSE_DBG_FLAG_MMIO)
> +
> +/* Bits 8..9 select the MMIO access width */
> +#define JAILHOUSE_DBG_FLAG_REG_WIDTH_8       0x0100
> +#define JAILHOUSE_DBG_FLAG_REG_WIDTH_32      0x0200

Sorry, send you down the wrong road: As said above, we actually specify
the register distance here. The access width is specific to the UART and
encoded into the driver. So, ...REG_DIST_1 and ...REG_DIST_4 would be an
option, encoding things in bytes now as that is more natural for addresses.

> +
> +struct jailhouse_debug_console {
> +     __u64 address;
> +     __u32 size;
> +     __u32 flags;
> +} __attribute__((packed));
> +
>  #define JAILHOUSE_SYSTEM_SIGNATURE   "JAILSYST"
>  
>  /**
> @@ -174,7 +198,7 @@ struct jailhouse_system {
>  
>       /** Jailhouse's location in memory */
>       struct jailhouse_memory hypervisor_memory;
> -     struct jailhouse_memory debug_console;
> +     struct jailhouse_debug_console debug_console;
>       union {
>               struct {
>                       __u64 mmconfig_base;
> diff --git a/hypervisor/paging.c b/hypervisor/paging.c
> index 5ecee52881c9..3b030d6b1089 100644
> --- a/hypervisor/paging.c
> +++ b/hypervisor/paging.c
> @@ -595,7 +595,7 @@ int paging_init(void)
>       if (err)
>               return err;
>  
> -     if (system_config->debug_console.flags & JAILHOUSE_MEM_IO) {
> +     if (DBG_IS_MMIO(system_config->debug_console.flags)) {
>               vaddr = (unsigned long)hypervisor_header.debug_console_base;
>               /* check if console overlaps remapping region */
>               if (vaddr + system_config->debug_console.size >= REMAP_BASE &&
> @@ -603,7 +603,7 @@ int paging_init(void)
>                       return trace_error(-EINVAL);
>  
>               err = paging_create(&hv_paging_structs,
> -                                 system_config->debug_console.phys_start,
> +                                 system_config->debug_console.address,
>                                   system_config->debug_console.size, vaddr,
>                                   PAGE_DEFAULT_FLAGS | PAGE_FLAG_DEVICE,
>                                   PAGING_NON_COHERENT);
> diff --git a/tools/root-cell-config.c.tmpl b/tools/root-cell-config.c.tmpl
> index b4522efd7377..3e668273e091 100644
> --- a/tools/root-cell-config.c.tmpl
> +++ b/tools/root-cell-config.c.tmpl
> @@ -60,7 +60,9 @@ struct {
>                       .size = ${hex(hvmem[1])},
>               },
>               .debug_console = {
> -                     .phys_start = 0x3f8,
> +                     .address = 0x3f8,
> +                     .flags = JAILHOUSE_DBG_TYPE_UART_X86 | \
> +                              JAILHOUSE_DBG_FLAG_PIO
>               },
>               .platform_info.x86 = {
>                       .mmconfig_base = ${hex(mmconfig.base)},
> 

Patches 1-3 look fine.

Thanks,
Jan

-- 
Siemens AG, Corporate Technology, CT RDA ITP SES-DE
Corporate Competence Center Embedded Linux

-- 
You received this message because you are subscribed to the Google Groups 
"Jailhouse" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to