lkml.org 
[lkml]   [2020]   [May]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 13/20] mips: early_printk_8250: Use offset-sized IO-mem accessors
    Date
    From: Serge Semin <Sergey.Semin@baikalelectronics.ru>

    Some platforms may prohibit to access the IO-memory with instructions
    of certain memory widths. For instance Bailal-T1 has devices placed
    behind memory OCP port (which also the reason of DMA accesses being
    incoherent) and can't be accessed through CCA uncacheable memory with
    other than 4-bytes aligned (LW/SW) instructions. Ignoring this rule
    will cause the APB EHB error with 0xFFs returned on read operations.
    In order to fix the issue for this platform and for others, which may
    have similar problems, lets recode serial_in()/serial_out() to call
    a certain memory accessors in accordance with the UART registers shift
    setting.

    Signed-off-by: Serge Semin <Sergey.Semin@baikalelectronics.ru>
    Cc: Alexey Malahov <Alexey.Malahov@baikalelectronics.ru>
    Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Cc: Paul Burton <paulburton@kernel.org>
    Cc: Ralf Baechle <ralf@linux-mips.org>
    Cc: Arnd Bergmann <arnd@arndb.de>
    Cc: Rob Herring <robh+dt@kernel.org>
    Cc: linux-pm@vger.kernel.org
    Cc: devicetree@vger.kernel.org
    ---
    arch/mips/kernel/early_printk_8250.c | 34 ++++++++++++++++++++++++++--
    1 file changed, 32 insertions(+), 2 deletions(-)

    diff --git a/arch/mips/kernel/early_printk_8250.c b/arch/mips/kernel/early_printk_8250.c
    index 567c6ec0cfae..e2c2405cff62 100644
    --- a/arch/mips/kernel/early_printk_8250.c
    +++ b/arch/mips/kernel/early_printk_8250.c
    @@ -23,12 +23,42 @@ void setup_8250_early_printk_port(unsigned long base, unsigned int reg_shift,

    static inline u8 serial_in(int offset)
    {
    - return readb(serial8250_base + (offset << serial8250_reg_shift));
    + u8 ret = 0xFF;
    +
    + offset <<= serial8250_reg_shift;
    + switch (serial8250_reg_shift) {
    + case 0:
    + ret = readb(serial8250_base + offset);
    + break;
    + case 1:
    + ret = readw(serial8250_base + offset);
    + break;
    + case 2:
    + ret = readl(serial8250_base + offset);
    + break;
    + default:
    + break;
    + }
    +
    + return ret;
    }

    static inline void serial_out(int offset, char value)
    {
    - writeb(value, serial8250_base + (offset << serial8250_reg_shift));
    + offset <<= serial8250_reg_shift;
    + switch (serial8250_reg_shift) {
    + case 0:
    + writeb(value, serial8250_base + offset);
    + break;
    + case 1:
    + writew(value, serial8250_base + offset);
    + break;
    + case 2:
    + writel(value, serial8250_base + offset);
    + break;
    + default:
    + break;
    + }
    }

    void prom_putchar(char c)
    --
    2.25.1
    \
     
     \ /
      Last update: 2020-05-06 19:45    [W:4.262 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site