[OpenBIOS] [PATCH 3/5] ppc: add ESCC legacy support

Alexander Graf agraf at suse.de
Wed Aug 26 08:51:46 CET 2015



On 21.08.15 00:45, Cormac O'Brien wrote:
> Mac OS 9 requires that the host provide escc-legacy serial ports, so we add
> them here to get further in the boot process.
> 
> Signed-off-by: Cormac O'Brien <cormac at c-obrien.org>
> ---
>  drivers/escc.c | 88 ++++++++++++++++++++++++++++++++++++++++++++++------------
>  drivers/escc.h |  2 ++
>  drivers/pci.c  |  6 ++++
>  3 files changed, 79 insertions(+), 17 deletions(-)
> 
> diff --git a/drivers/escc.c b/drivers/escc.c
> index 240043b..afb97fa 100644
> --- a/drivers/escc.c
> +++ b/drivers/escc.c
> @@ -380,12 +380,22 @@ ob_zs_init(phys_addr_t base, uint64_t offset, int intr, int slave, int keyboard)
>  
>  static void
>  escc_add_channel(const char *path, const char *node, phys_addr_t addr,
> -                 uint32_t offset)
> +                 int esnum)
>  {
>      char buf[64], tty[32];
>      phandle_t dnode, aliases;
> -    int len;
> -    cell props[2];
> +
> +    cell props[10];
> +    int offset;
> +    int legacy;
> +
> +    switch (esnum) {
> +    case 2: offset = 1; legacy = 0; break;
> +    case 3: offset = 0; legacy = 0; break;
> +    case 4: offset = 1; legacy = 1; break;
> +    case 5: offset = 0; legacy = 1; break;
> +    default: return;
> +    }
>  
>      /* add device */
>  
> @@ -411,16 +421,28 @@ escc_add_channel(const char *path, const char *node, phys_addr_t addr,
>      set_property(dnode, "device_type", "serial",
>                   strlen("serial") + 1);
>  
> -    snprintf(buf, sizeof(buf), "ch-%s", node);
> -    len = strlen(buf) + 1;
> -    snprintf(buf + len, sizeof(buf) - len, "CHRP,es2");
> -    set_property(dnode, "compatible", buf, len + 9);
> -
> -    props[0] = IO_ESCC_OFFSET + offset * 0x20;
> -    props[1] = 0x00000020;
> -    set_property(dnode, "reg", (char *)&props, 2 * sizeof(cell));
> +    snprintf(buf, sizeof(buf), "chrp,es%d", esnum);
> +    set_property(dnode, "compatible", buf, 9);
> +
> +    if (legacy) {
> +        props[0] = IO_ESCC_LEGACY_OFFSET + offset * 0x4;
> +        props[1] = 0x00000001;
> +        props[2] = IO_ESCC_LEGACY_OFFSET + offset * 0x4 + 2;
> +        props[3] = 0x00000001;
> +        props[4] = IO_ESCC_LEGACY_OFFSET + offset * 0x4 + 6;
> +        props[5] = 0x00000001;
> +        set_property(dnode, "reg", (char *)&props, 6 * sizeof(cell));
> +    } else {
> +        props[0] = IO_ESCC_OFFSET + offset * 0x20;
> +        props[1] = 0x00000020;
> +        set_property(dnode, "reg", (char *)&props, 2 * sizeof(cell));
> +    }
>  
> -    props[0] = addr + IO_ESCC_OFFSET + offset * 0x20;
> +    if (legacy) {
> +        props[0] = addr + IO_ESCC_LEGACY_OFFSET + offset * 0x4;
> +    } else {
> +        props[0] = addr + IO_ESCC_OFFSET + offset * 0x20;
> +    }
>      OLDWORLD(set_property(dnode, "AAPL,address",
>              (char *)&props, 1 * sizeof(cell)));
>  
> @@ -430,13 +452,21 @@ escc_add_channel(const char *path, const char *node, phys_addr_t addr,
>  
>      props[0] = (0x24) + offset;
>      props[1] = 0;
> +    props[2] = 0;
>      NEWWORLD(set_property(dnode, "interrupts",
> -             (char *)&props, 2 * sizeof(cell)));
> +             (char *)&props, 3 * sizeof(cell)));
>  
>      device_end();
>  
> -    uart_init_line((unsigned char*)addr + IO_ESCC_OFFSET + offset * 0x20,
> -                   CONFIG_SERIAL_SPEED);
> +    if (legacy) {
> +        uart_init_line(
> +                (unsigned char*)addr + IO_ESCC_LEGACY_OFFSET + offset * 0x4,
> +                CONFIG_SERIAL_SPEED);
> +    } else {
> +        uart_init_line(
> +                (unsigned char*)addr + IO_ESCC_OFFSET + offset * 0x20,
> +                CONFIG_SERIAL_SPEED);
> +    }
>  }
>  
>  void
> @@ -467,10 +497,34 @@ escc_init(const char *path, phys_addr_t addr)
>  
>      fword("finish-device");
>  
> -    escc_add_channel(buf, "a", addr, 1);
> -    escc_add_channel(buf, "b", addr, 0);
> +    escc_add_channel(buf, "a", addr, 2);
> +    escc_add_channel(buf, "b", addr, 3);
>  
>      escc_serial_dev = (unsigned char *)addr + IO_ESCC_OFFSET +
>                   (CONFIG_SERIAL_PORT ? 0 : 0x20);
> +
> +    push_str(path);
> +    fword("find-device");
> +    fword("new-device");
> +
> +    push_str("escc-legacy");
> +    fword("device-name");
> +
> +    snprintf(buf, sizeof(buf), "%s/escc-legacy", path);
> +
> +    dnode = find_dev(buf);
> +
> +    set_int_property(dnode, "#address-cells", 1);
> +    props[0] = __cpu_to_be32(IO_ESCC_LEGACY_OFFSET);
> +    props[1] = __cpu_to_be32(IO_ESCC_LEGACY_SIZE);
> +    set_property(dnode, "reg", (char *)&props, sizeof(props));
> +    set_property(dnode, "device_type", "escc-legacy",
> +                 strlen("escc-legacy") + 1);

Same comment about the string helper. Otherwise looks good.


Alex



More information about the OpenBIOS mailing list