From patchwork Sat May 19 20:03:21 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sam Ravnborg X-Patchwork-Id: 160202 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 21850B6FAF for ; Sun, 20 May 2012 06:03:39 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754643Ab2ESUDZ (ORCPT ); Sat, 19 May 2012 16:03:25 -0400 Received: from smtp.snhosting.dk ([87.238.248.203]:38008 "EHLO smtp.domainteam.dk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754147Ab2ESUDY (ORCPT ); Sat, 19 May 2012 16:03:24 -0400 Received: from merkur.ravnborg.org (unknown [188.228.89.252]) by smtp.domainteam.dk (Postfix) with ESMTPA id 62879F1A13; Sat, 19 May 2012 22:03:22 +0200 (CEST) Date: Sat, 19 May 2012 22:03:21 +0200 From: Sam Ravnborg To: "David S. Miller" , sparclinux , Konrad Eisele Subject: [RFC PATCH] sparc32: make srmmu helpers leon compatible Message-ID: <20120519200321.GA7617@merkur.ravnborg.org> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.18 (2008-05-17) Sender: sparclinux-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: sparclinux@vger.kernel.org I am trying to make the saprc32 kernel compatible with leon and sun4m, sun4d boxes at the same time. The stuff in arch/sparc/mm/ looked like the simplest to fix so I looked at that first. Some of the helper functions used ASI_M_MMUREGS which is redefiend to 0x19 in the LEON case - so these functions needs some special care. I was originally planning to use the cpuid_patch support to deal with the differences - but this is only in place _after_ we have initialised the mmu. But sparc_cpu_model is set before we initialize the mmu, so we could use that. I came up with the following that I am not too happy with... Some of the functions are really not used by leon, but I converted all to be complete. Any better ideas? Could we call per_cpu_patch() before paging_init() maybe? The patch below depends on other changes I only have in my tree - to be submitted if/when ready. Sam --- To unsubscribe from this list: send the line "unsubscribe sparclinux" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/arch/sparc/include/asm/cpu_type.h b/arch/sparc/include/asm/cpu_type.h index 84d7d83..5a8b206 100644 --- a/arch/sparc/include/asm/cpu_type.h +++ b/arch/sparc/include/asm/cpu_type.h @@ -1,6 +1,7 @@ #ifndef __ASM_CPU_TYPE_H #define __ASM_CPU_TYPE_H +#ifndef __ASSEMBLY__ /* * Sparc (general) CPU types */ @@ -25,4 +26,5 @@ extern enum sparc_cpu sparc_cpu_model; #endif +#endif /* __ASSEMBLY__ */ #endif /* __ASM_CPU_TYPE_H */ diff --git a/arch/sparc/include/asm/pgtsrmmu.h b/arch/sparc/include/asm/pgtsrmmu.h index cb82870..4b50085 100644 --- a/arch/sparc/include/asm/pgtsrmmu.h +++ b/arch/sparc/include/asm/pgtsrmmu.h @@ -7,6 +7,7 @@ #ifndef _SPARC_PGTSRMMU_H #define _SPARC_PGTSRMMU_H +#include #include #ifdef __ASSEMBLY__ @@ -151,42 +152,81 @@ extern void *srmmu_nocache_pool; static inline unsigned int srmmu_get_mmureg(void) { unsigned int retval; - __asm__ __volatile__("lda [%%g0] %1, %0\n\t" : - "=r" (retval) : - "i" (ASI_M_MMUREGS)); + if (sparc_cpu_model != sparc_leon) { + __asm__ __volatile__("lda [%%g0] %1, %0\n\t" : + "=r" (retval) : + "i" (ASI_M_MMUREGS)); + } else { + __asm__ __volatile__("lda [%%g0] %1, %0\n\t" : + "=r" (retval) : + "i" (ASI_LEON_MMUREGS)); + } + return retval; } static inline void srmmu_set_mmureg(unsigned long regval) { - __asm__ __volatile__("sta %0, [%%g0] %1\n\t" : : - "r" (regval), "i" (ASI_M_MMUREGS) : "memory"); + if (sparc_cpu_model != sparc_leon) { + __asm__ __volatile__("sta %0, [%%g0] %1\n\t" : : + "r" (regval), + "i" (ASI_M_MMUREGS) : + "memory"); + } else { + __asm__ __volatile__("sta %0, [%%g0] %1\n\t" : : + "r" (regval), + "i" (ASI_LEON_MMUREGS) : + "memory"); + } } static inline void srmmu_set_ctable_ptr(unsigned long paddr) { paddr = ((paddr >> 4) & SRMMU_CTX_PMASK); - __asm__ __volatile__("sta %0, [%1] %2\n\t" : : - "r" (paddr), "r" (SRMMU_CTXTBL_PTR), - "i" (ASI_M_MMUREGS) : - "memory"); + + if (sparc_cpu_model != sparc_leon) { + __asm__ __volatile__("sta %0, [%1] %2\n\t" : : + "r" (paddr), "r" (SRMMU_CTXTBL_PTR), + "i" (ASI_M_MMUREGS) : + "memory"); + } else { + __asm__ __volatile__("sta %0, [%1] %2\n\t" : : + "r" (paddr), "r" (SRMMU_CTXTBL_PTR), + "i" (ASI_LEON_MMUREGS) : + "memory"); + } } static inline void srmmu_set_context(int context) { - __asm__ __volatile__("sta %0, [%1] %2\n\t" : : - "r" (context), "r" (SRMMU_CTX_REG), - "i" (ASI_M_MMUREGS) : "memory"); + if (sparc_cpu_model != sparc_leon) { + __asm__ __volatile__("sta %0, [%1] %2\n\t" : : + "r" (context), "r" (SRMMU_CTX_REG), + "i" (ASI_M_MMUREGS) : "memory"); + } else { + __asm__ __volatile__("sta %0, [%1] %2\n\t" : : + "r" (context), "r" (SRMMU_CTX_REG), + "i" (ASI_LEON_MMUREGS) : "memory"); + } } static inline int srmmu_get_context(void) { register int retval; - __asm__ __volatile__("lda [%1] %2, %0\n\t" : - "=r" (retval) : - "r" (SRMMU_CTX_REG), - "i" (ASI_M_MMUREGS)); + + if (sparc_cpu_model != sparc_leon) { + __asm__ __volatile__("lda [%1] %2, %0\n\t" : + "=r" (retval) : + "r" (SRMMU_CTX_REG), + "i" (ASI_M_MMUREGS)); + } else { + __asm__ __volatile__("lda [%1] %2, %0\n\t" : + "=r" (retval) : + "r" (SRMMU_CTX_REG), + "i" (ASI_LEON_MMUREGS)); + } + return retval; } @@ -194,9 +234,15 @@ static inline unsigned int srmmu_get_fstatus(void) { unsigned int retval; - __asm__ __volatile__("lda [%1] %2, %0\n\t" : - "=r" (retval) : - "r" (SRMMU_FAULT_STATUS), "i" (ASI_M_MMUREGS)); + if (sparc_cpu_model != sparc_leon) { + __asm__ __volatile__("lda [%1] %2, %0\n\t" : + "=r" (retval) : + "r" (SRMMU_FAULT_STATUS), "i" (ASI_M_MMUREGS)); + } else { + __asm__ __volatile__("lda [%1] %2, %0\n\t" : + "=r" (retval) : + "r" (SRMMU_FAULT_STATUS), "i" (ASI_LEON_MMUREGS)); + } return retval; } @@ -204,9 +250,15 @@ static inline unsigned int srmmu_get_faddr(void) { unsigned int retval; - __asm__ __volatile__("lda [%1] %2, %0\n\t" : - "=r" (retval) : - "r" (SRMMU_FAULT_ADDR), "i" (ASI_M_MMUREGS)); + if (sparc_cpu_model != sparc_leon) { + __asm__ __volatile__("lda [%1] %2, %0\n\t" : + "=r" (retval) : + "r" (SRMMU_FAULT_ADDR), "i" (ASI_M_MMUREGS)); + } else { + __asm__ __volatile__("lda [%1] %2, %0\n\t" : + "=r" (retval) : + "r" (SRMMU_FAULT_ADDR), "i" (ASI_LEON_MMUREGS)); + } return retval; }