1*cf63aa77SMarouene Boubakri // SPDX-License-Identifier: BSD-2-Clause
2*cf63aa77SMarouene Boubakri /*
3*cf63aa77SMarouene Boubakri * Copyright 2022 NXP
4*cf63aa77SMarouene Boubakri */
5*cf63aa77SMarouene Boubakri
6*cf63aa77SMarouene Boubakri #include <compiler.h>
7*cf63aa77SMarouene Boubakri #include <io.h>
8*cf63aa77SMarouene Boubakri #include <kernel/spinlock.h>
9*cf63aa77SMarouene Boubakri #include <stdint.h>
10*cf63aa77SMarouene Boubakri #include <util.h>
11*cf63aa77SMarouene Boubakri
12*cf63aa77SMarouene Boubakri #include "htif.h"
13*cf63aa77SMarouene Boubakri
14*cf63aa77SMarouene Boubakri static unsigned int htif_global_lock __nex_bss = SPINLOCK_UNLOCK;
15*cf63aa77SMarouene Boubakri
16*cf63aa77SMarouene Boubakri #ifdef HTIF_BASE
17*cf63aa77SMarouene Boubakri register_phys_mem(MEM_AREA_IO_NSEC, HTIF_BASE,
18*cf63aa77SMarouene Boubakri ROUNDUP(HTIF_REG_SIZE, CORE_MMU_PGDIR_SIZE));
19*cf63aa77SMarouene Boubakri #endif
20*cf63aa77SMarouene Boubakri
htif_lock_global(void)21*cf63aa77SMarouene Boubakri void htif_lock_global(void)
22*cf63aa77SMarouene Boubakri {
23*cf63aa77SMarouene Boubakri cpu_spin_lock(&htif_global_lock);
24*cf63aa77SMarouene Boubakri }
25*cf63aa77SMarouene Boubakri
htif_unlock_global(void)26*cf63aa77SMarouene Boubakri void htif_unlock_global(void)
27*cf63aa77SMarouene Boubakri {
28*cf63aa77SMarouene Boubakri cpu_spin_unlock(&htif_global_lock);
29*cf63aa77SMarouene Boubakri }
30*cf63aa77SMarouene Boubakri
chip_to_base(struct serial_chip * chip)31*cf63aa77SMarouene Boubakri static vaddr_t chip_to_base(struct serial_chip *chip)
32*cf63aa77SMarouene Boubakri {
33*cf63aa77SMarouene Boubakri struct htif_console_data *pd =
34*cf63aa77SMarouene Boubakri container_of(chip, struct htif_console_data, chip);
35*cf63aa77SMarouene Boubakri
36*cf63aa77SMarouene Boubakri return io_pa_or_va(&pd->base, HTIF_REG_SIZE);
37*cf63aa77SMarouene Boubakri }
38*cf63aa77SMarouene Boubakri
tohost_cmd(vaddr_t base,uint64_t dev,uint64_t cmd,uint64_t data)39*cf63aa77SMarouene Boubakri static void __maybe_unused tohost_cmd(vaddr_t base, uint64_t dev,
40*cf63aa77SMarouene Boubakri uint64_t cmd, uint64_t data)
41*cf63aa77SMarouene Boubakri {
42*cf63aa77SMarouene Boubakri while (io_read64(base))
43*cf63aa77SMarouene Boubakri barrier();
44*cf63aa77SMarouene Boubakri
45*cf63aa77SMarouene Boubakri io_write64(base, SHIFT_U64(dev, 56) | SHIFT_U64(cmd, 48) | data);
46*cf63aa77SMarouene Boubakri }
47*cf63aa77SMarouene Boubakri
htif_console_putc(struct serial_chip * chip,int ch __maybe_unused)48*cf63aa77SMarouene Boubakri static void htif_console_putc(struct serial_chip *chip,
49*cf63aa77SMarouene Boubakri int ch __maybe_unused)
50*cf63aa77SMarouene Boubakri {
51*cf63aa77SMarouene Boubakri #ifdef RV64
52*cf63aa77SMarouene Boubakri vaddr_t base = 0;
53*cf63aa77SMarouene Boubakri
54*cf63aa77SMarouene Boubakri htif_lock_global();
55*cf63aa77SMarouene Boubakri base = chip_to_base(chip);
56*cf63aa77SMarouene Boubakri tohost_cmd(base, HTIF_DEV_CONSOLE, HTIF_CMD_WRITE, ch);
57*cf63aa77SMarouene Boubakri htif_unlock_global();
58*cf63aa77SMarouene Boubakri #else
59*cf63aa77SMarouene Boubakri #warning HTIF is not supported on RV32
60*cf63aa77SMarouene Boubakri #endif
61*cf63aa77SMarouene Boubakri }
62*cf63aa77SMarouene Boubakri
htif_console_flush(struct serial_chip * chip __unused)63*cf63aa77SMarouene Boubakri static void htif_console_flush(struct serial_chip *chip __unused)
64*cf63aa77SMarouene Boubakri {
65*cf63aa77SMarouene Boubakri }
66*cf63aa77SMarouene Boubakri
67*cf63aa77SMarouene Boubakri static const struct serial_ops htif_console_ops = {
68*cf63aa77SMarouene Boubakri .flush = htif_console_flush,
69*cf63aa77SMarouene Boubakri .putc = htif_console_putc,
70*cf63aa77SMarouene Boubakri };
71*cf63aa77SMarouene Boubakri DECLARE_KEEP_PAGER(htif_console_ops);
72*cf63aa77SMarouene Boubakri
htif_console_init(struct htif_console_data * pd,paddr_t pbase)73*cf63aa77SMarouene Boubakri void htif_console_init(struct htif_console_data *pd, paddr_t pbase)
74*cf63aa77SMarouene Boubakri {
75*cf63aa77SMarouene Boubakri pd->base.pa = pbase;
76*cf63aa77SMarouene Boubakri pd->chip.ops = &htif_console_ops;
77*cf63aa77SMarouene Boubakri }
78