>> -#ifdef CONFIG_64BIT >> +#if defined(CONFIG_64BIT) || defined(CONFIG_CPU_CAVIUM_OCTEON) >> + /* >> + * Note: We always set ST0_KX on Octeon since IO addresses are at >> + * 64bit addresses. Keep in mind this also moves the TLB handler. >> + */ >> setup_c0_status ST0_KX 0 > > That's a bit odd - on 64-bit kernels KX would be set anyway and on 32-bit > kernels would be corrupted by exceptions or interrupts, so 64-bit > addresses are not safe to use on 32-bit kernels for most part. > > 32-bit virtual addresses mapped to a non-compat address otoh will work fine > without KX set. > > Ralf The Octeon IO space regions are significantly larger than a 32bit kernel could tlb map easily. The entire range takes 49 bits to address. As a not particularly clean, but working alternative, we enable 64bit addressing in the kernel and used XKPHYS to access IO. Every access was surrounded by a local_irq_save/local_irq_restore. Since this is ugly to the extreme, maybe we should drop being able to boot a 32bit kernel on Octeon until something better is worked out. Chad