Re: [PATCH 1/6] MIPS: BMIPS: Disable pref 30 for buggy CPUs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Feb 9, 2016 at 1:01 PM, Florian Fainelli <f.fainelli@xxxxxxxxx> wrote:
> On 09/02/16 12:55, Florian Fainelli wrote:
>> Disable pref 30 by utilizing the standard quirk method and matching the
>> affected SoCs: 7344, 7436, 7425.
>>
>> Signed-off-by: Florian Fainelli <f.fainelli@xxxxxxxxx>
>> ---
>>  arch/mips/bmips/setup.c | 16 ++++++++++++++++
>>  1 file changed, 16 insertions(+)
>>
>> diff --git a/arch/mips/bmips/setup.c b/arch/mips/bmips/setup.c
>> index 35535284b39e..9c8f15daf5e9 100644
>> --- a/arch/mips/bmips/setup.c
>> +++ b/arch/mips/bmips/setup.c
>> @@ -100,12 +100,28 @@ static void bcm6368_quirks(void)
>>       bcm63xx_fixup_cpu1();
>>  }
>>
>> +static void bmips5000_pref30_quirk(void)
>> +{
>> +     __asm__ __volatile__(
>> +     "       .word   0x4008b008\n"   /* mfc0 $8, $22, 8 */
>> +     "       lui     $9, 0x0100\n"
>> +     "       or      $8, $9\n"
>> +     /* disable "pref 30" on buggy CPUs */
>> +     "       lui     $9, 0x0800\n"
>> +     "       or      $8, $9\n"
>> +     "       .word   0x4088b008\n"   /* mtc0 $8, $22, 8 */
>> +     : : : "$8", "$9");
>
> We are missing an additional load here to $8, I will respin this patch,
> but would appreciate feedback on the other patches of the series so I
> can address everything at once. Thanks!
>

In our codebase, we currently have the following workarounds:
LEAF(set_zephyr)
        .set    noreorder

        /* enable read/write of CP0 #22 sel. 8 */
        li      t0, 0x5a455048
        .word   0x4088b00f      /* mtc0    t0, $22, 15 */

        .word   0x4008b008      /* mfc0    t0, $22, 8 */
        li      t1, 0x09000000  /* turn off pref */
        or      t0, t0, t1
        .word   0x4088b008      /* mtc0    t0, $22, 8 */
        sync

        /* disable read/write of CP0 #22 sel 8 */
        li      t0, 0x0
        .word   0x4088b00f      /* mtc0    t0, $22, 15 */


        jr      ra
        nop
        .set reorder

END(set_zephyr)


/* enable MIPS32R2 ROR instruction for XI TLB handlers */
        __asm__ __volatile__(
        "       li      $8, 0x5a455048\n"
        "       .word   0x4088b00f\n"   /* mtc0 $8, $22, 15 */
        "       nop; nop; nop\n"
        "       .word   0x4008b008\n"   /* mfc0 $8, $22, 8 */
        "       lui     $9, 0x0100\n"
        "       or      $8, $9\n"
        "       .word   0x4088b008\n"   /* mtc0 $8, $22, 8 */
        "       sync\n"
        "       li      $8, 0x0\n"
        "       .word   0x4088b00f\n"
        "       nop; nop; nop\n"
        : : : "$8", "$9");

#if defined(CONFIG_BCM7425)
        /* Disable PREF 30 */
        __asm__ __volatile__(
        "       li      $8, 0x5a455048\n"
        "       .word   0x4088b00f\n"
        "       nop; nop; nop\n"
        "       .word   0x4008b008\n"
        "       lui     $9, 0x0800\n"
        "       or      $8, $8, $9\n"
        "       .word   0x4088b008\n"
        "       sync\n"
        "       li      $8, 0x0\n"
        "       .word   0x4088b00f\n"
        "       nop; nop; nop\n"
        : : : "$8", "$9");
#endif

#if defined(CONFIG_BCM7425) || defined(CONFIG_BCM7429)
        /* Disable JTB and CRS */
        __asm__ __volatile__(
        "       li      $8, 0x5a455048\n"
        "       .word   0x4088b00f\n"
        "       nop; nop; nop\n"
        "       .word   0x4008b008\n"
        "       li      $9, 0xfbffffff\n"
        "       and     $8, $8, $9\n"
        "       li      $9, 0x0400c000\n"
        "       or      $8, $8, $9\n"
        "       .word   0x4088b008\n"
        "       sync\n"
        "       li      $8, 0x0\n"
        "       .word   0x4088b00f\n"
        "       nop; nop; nop\n"
        : : : "$8", "$9");
#endif


It looks like set_zephyr() does the same as the next two ("enable
MIPS32R2 ROR instruction for XI TLB handlers" + "Disable PREF 30")
combined?

Are you planning to add the JTB and CRS workaround?


>> +}
>> +
>>  static const struct bmips_quirk bmips_quirk_list[] = {
>>       { "brcm,bcm3384-viper",         &bcm3384_viper_quirks           },
>>       { "brcm,bcm33843-viper",        &bcm3384_viper_quirks           },
>>       { "brcm,bcm6328",               &bcm6328_quirks                 },
>>       { "brcm,bcm6368",               &bcm6368_quirks                 },
>>       { "brcm,bcm63168",              &bcm6368_quirks                 },
>> +     { "brcm,bcm7344",               &bmips5000_pref30_quirk         },
>> +     { "brcm,bcm7346",               &bmips5000_pref30_quirk         },
>> +     { "brcm,bcm7425",               &bmips5000_pref30_quirk         },
>>       { },
>>  };
>>
>>
>
>
> --
> Florian




[Index of Archives]     [Linux MIPS Home]     [LKML Archive]     [Linux ARM Kernel]     [Linux ARM]     [Linux]     [Git]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

  Powered by Linux