lkml.org 
[lkml]   [2016]   [Oct]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.7 055/141] MIPS: Malta: Fix IOCU disable switch read for MIPS64
    Date
    4.7-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Paul Burton <paul.burton@imgtec.com>

    commit 305723ab439e14debc1d339aa04e835d488b8253 upstream.

    Malta boards used with CPU emulators feature a switch to disable use of
    an IOCU. Software has to check this switch & ignore any present IOCU if
    the switch is closed. The read used to do this was unsafe for 64 bit
    kernels, as it simply casted the address 0xbf403000 to a pointer &
    dereferenced it. Whilst in a 32 bit kernel this would access kseg1, in a
    64 bit kernel this attempts to access xuseg & results in an address
    error exception.

    Fix by accessing a correctly formed ckseg1 address generated using the
    CKSEG1ADDR macro.

    Whilst modifying this code, define the name of the register and the bit
    we care about within it, which indicates whether PCI DMA is routed to
    the IOCU or straight to DRAM. The code previously checked that bit 0 was
    also set, but the least significant 7 bits of the CONFIG_GEN0 register
    contain the value of the MReqInfo signal provided to the IOCU OCP bus,
    so singling out bit 0 makes little sense & that part of the check is
    dropped.

    Signed-off-by: Paul Burton <paul.burton@imgtec.com>
    Fixes: b6d92b4a6bdb ("MIPS: Add option to disable software I/O coherency.")
    Cc: Matt Redfearn <matt.redfearn@imgtec.com>
    Cc: Masahiro Yamada <yamada.masahiro@socionext.com>
    Cc: Kees Cook <keescook@chromium.org>
    Cc: linux-mips@linux-mips.org
    Cc: linux-kernel@vger.kernel.org
    Patchwork: https://patchwork.linux-mips.org/patch/14187/
    Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    arch/mips/mti-malta/malta-setup.c | 8 +++++++-
    1 file changed, 7 insertions(+), 1 deletion(-)

    --- a/arch/mips/mti-malta/malta-setup.c
    +++ b/arch/mips/mti-malta/malta-setup.c
    @@ -39,6 +39,9 @@
    #include <linux/console.h>
    #endif

    +#define ROCIT_CONFIG_GEN0 0x1f403000
    +#define ROCIT_CONFIG_GEN0_PCI_IOCU BIT(7)
    +
    extern void malta_be_init(void);
    extern int malta_be_handler(struct pt_regs *regs, int is_fixup);

    @@ -107,6 +110,8 @@ static void __init fd_activate(void)
    static int __init plat_enable_iocoherency(void)
    {
    int supported = 0;
    + u32 cfg;
    +
    if (mips_revision_sconid == MIPS_REVISION_SCON_BONITO) {
    if (BONITO_PCICACHECTRL & BONITO_PCICACHECTRL_CPUCOH_PRES) {
    BONITO_PCICACHECTRL |= BONITO_PCICACHECTRL_CPUCOH_EN;
    @@ -129,7 +134,8 @@ static int __init plat_enable_iocoherenc
    } else if (mips_cm_numiocu() != 0) {
    /* Nothing special needs to be done to enable coherency */
    pr_info("CMP IOCU detected\n");
    - if ((*(unsigned int *)0xbf403000 & 0x81) != 0x81) {
    + cfg = __raw_readl((u32 *)CKSEG1ADDR(ROCIT_CONFIG_GEN0));
    + if (!(cfg & ROCIT_CONFIG_GEN0_PCI_IOCU)) {
    pr_crit("IOCU OPERATION DISABLED BY SWITCH - DEFAULTING TO SW IO COHERENCY\n");
    return 0;
    }

    \
     
     \ /
      Last update: 2016-10-06 11:52    [W:4.171 / U:0.348 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site