Metag architecture changes for v3.13

- A change to remove the last dependence on bootloader exception
   handlers so that QEMU can more easily boot an SMP Linux/Meta kernel
   image directly.
 - A fix for a minor off by one error in a BUG_ON condition found by Dan
   Carpenter.
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1.4.13 (GNU/Linux)
 
 iQIcBAABAgAGBQJSgMoOAAoJEKHZs+irPybfBykQAJTyboZx95WLtpbCRr6kWvg3
 gTtx0wTuxyzPB8HuxFs/p3WLq4dGLxnZboMwSO0p0kus2epwQvi4lksEeb/xc69M
 vuaLaFBGx5n8LxKy5TudqSLjrM97w6WRKwniYp6qE/vM+imoquylEfWLb7txpxbv
 0BruNK6+UhBXt1vOE5J2kETTzAtYK5GtO9vt5qhkRsUBWGNv/V/pjtQHk90PSBaT
 unE6+mRH4SFSUSYM3RcVjEzWf46Rot09qlLY+kQlt4ANriP44n9RMafEFag2oTZQ
 8MdKh6ExNuzJUcvbBHP8y0drmEzzOuymjr18A1UMqR6qJZbwl+35+s7WxhBjceZG
 Nb2VgUIMAE/OIjb9heyaejxJ6FAyrQUWOGbZRweyA/pNOZfxqVwq2MPYP24nq3jm
 gY4bcCfHYqssehL/H4zWXkYiLF0Qb2GHNpKlsQlzkolpf2FVaEezgQWoh9ecaaOH
 w9V/1flbNvBLyGWp57LKpZ9F0S7fHhPSSqe9U3JEcvjuTOfNjprA7mwnyKsZe2rV
 /v0l7tAh53GbzbPJUecPzf/sgK1y6xeSh5mgirZ8lZlzV105/7WN2bKT4Ulz5oj3
 I/+dDPw+U1d3MZKnvMWRWuBi3IPZYmymGzs/rSw2V0QtnklWeFdSwAcf+jQNBGpf
 +fteZgsKTdC1gG+qKRbx
 =9jJ8
 -----END PGP SIGNATURE-----

Merge tag 'metag-for-v3.13' of git://git.kernel.org/pub/scm/linux/kernel/git/jhogan/metag

Pull metag architecture changes from James Hogan:
 - A change to remove the last dependence on bootloader exception
   handlers so that QEMU can more easily boot an SMP Linux/Meta kernel
   image directly.
 - A fix for a minor off by one error in a BUG_ON condition found by Dan
   Carpenter.

* tag 'metag-for-v3.13' of git://git.kernel.org/pub/scm/linux/kernel/git/jhogan/metag:
  metag: off by one in setup_bootmem_node()
  metag: handle low level kicks directly
This commit is contained in:
Linus Torvalds 2013-11-12 14:25:33 +09:00
commit 0993537bff
5 changed files with 12 additions and 22 deletions

View File

@ -150,11 +150,9 @@
#else #else
/* Reserved 0x04-0x09 */ /* Reserved 0x04-0x09 */
#endif #endif
#define TBID_SIGNUM_SWS 0x0A /* KICK received with SigMask != 0 */ /* Reserved 0x0A-0x0F */
#define TBID_SIGNUM_SWK 0x0B /* KICK received with SigMask == 0 */
/* Reserved 0x0C-0x0F */
#define TBID_SIGNUM_TRT 0x10 /* Timer trigger */ #define TBID_SIGNUM_TRT 0x10 /* Timer trigger */
#define TBID_SIGNUM_LWK 0x11 /* Low level kick (handler provided by TBI) */ #define TBID_SIGNUM_LWK 0x11 /* Low level kick */
#define TBID_SIGNUM_XXF 0x12 /* Fault handler - receives ALL _xxF sigs */ #define TBID_SIGNUM_XXF 0x12 /* Fault handler - receives ALL _xxF sigs */
#ifdef TBI_1_4 #ifdef TBI_1_4
#define TBID_SIGNUM_DFR 0x13 /* Deferred Exception handler */ #define TBID_SIGNUM_DFR 0x13 /* Deferred Exception handler */
@ -183,8 +181,7 @@
each hardware signal, sometimes this is a many-to-one relationship. */ each hardware signal, sometimes this is a many-to-one relationship. */
#define TBI_TRIG_BIT(SigNum) (\ #define TBI_TRIG_BIT(SigNum) (\
((SigNum) >= TBID_SIGNUM_TRT) ? 1<<((SigNum)-TBID_SIGNUM_TRT) :\ ((SigNum) >= TBID_SIGNUM_TRT) ? 1<<((SigNum)-TBID_SIGNUM_TRT) :\
( ((SigNum) == TBID_SIGNUM_SWS) || \ ((SigNum) == TBID_SIGNUM_LWK) ? \
((SigNum) == TBID_SIGNUM_SWK) ) ? \
TXSTAT_KICK_BIT : TXSTATI_BGNDHALT_BIT ) TXSTAT_KICK_BIT : TXSTATI_BGNDHALT_BIT )
/* Return the hardware trigger vector number for entries in the /* Return the hardware trigger vector number for entries in the
@ -687,10 +684,8 @@ typedef union _tbires_tag_ {
Triggers will indicate the status of TXSTAT or TXSTATI sampled by the Triggers will indicate the status of TXSTAT or TXSTATI sampled by the
code that called the handler. code that called the handler.
InstOrSWSId is defined firstly as 'Inst' if the SigNum is TBID_SIGNUM_SWx Inst is defined as 'Inst' if the SigNum is TBID_SIGNUM_SWx and holds the
and hold the actual SWITCH instruction detected, secondly if SigNum actual SWITCH instruction detected, in other cases the value of this
is TBID_SIGNUM_SWS the 'SWSId' is defined to hold the Id of the
software signal detected, in other cases the value of this
parameter is undefined. parameter is undefined.
pTBI points at the PTBI structure related to the thread and processing pTBI points at the PTBI structure related to the thread and processing
@ -709,7 +704,7 @@ typedef union _tbires_tag_ {
*/ */
typedef TBIRES (*PTBIAPIFN)( TBIRES State, int SigNum, typedef TBIRES (*PTBIAPIFN)( TBIRES State, int SigNum,
int Triggers, int InstOrSWSId, int Triggers, int Inst,
volatile struct _tbi_tag_ *pTBI ); volatile struct _tbi_tag_ *pTBI );
#endif /* ifndef __ASSEMBLY__ */ #endif /* ifndef __ASSEMBLY__ */
@ -757,7 +752,7 @@ typedef volatile struct _tbi_tag_ {
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
/* This handler should be used for TBID_SIGNUM_DFR */ /* This handler should be used for TBID_SIGNUM_DFR */
extern TBIRES __TBIHandleDFR ( TBIRES State, int SigNum, extern TBIRES __TBIHandleDFR ( TBIRES State, int SigNum,
int Triggers, int InstOrSWSId, int Triggers, int Inst,
volatile struct _tbi_tag_ *pTBI ); volatile struct _tbi_tag_ *pTBI );
#endif #endif
#endif #endif

View File

@ -302,12 +302,8 @@ void __init setup_arch(char **cmdline_p)
* rather than the version from the bootloader. This makes call * rather than the version from the bootloader. This makes call
* stacks easier to understand and may allow us to unmap the * stacks easier to understand and may allow us to unmap the
* bootloader at some point. * bootloader at some point.
*
* We need to keep the LWK handler that TBI installed in order to
* be able to do inter-thread comms.
*/ */
for (i = 0; i <= TBID_SIGNUM_MAX; i++) for (i = 0; i <= TBID_SIGNUM_MAX; i++)
if (i != TBID_SIGNUM_LWK)
_pTBI->fnSigs[i] = __TBIUnExpXXX; _pTBI->fnSigs[i] = __TBIUnExpXXX;
/* A Meta requirement is that the kernel is loaded (virtually) /* A Meta requirement is that the kernel is loaded (virtually)

View File

@ -819,8 +819,7 @@ void per_cpu_trap_init(unsigned long cpu)
set_trigger_mask(TBI_INTS_INIT(thread) | /* interrupts */ set_trigger_mask(TBI_INTS_INIT(thread) | /* interrupts */
TBI_TRIG_BIT(TBID_SIGNUM_LWK) | /* low level kick */ TBI_TRIG_BIT(TBID_SIGNUM_LWK) | /* low level kick */
TBI_TRIG_BIT(TBID_SIGNUM_SW1) | TBI_TRIG_BIT(TBID_SIGNUM_SW1));
TBI_TRIG_BIT(TBID_SIGNUM_SWS));
/* non-priv - use current stack */ /* non-priv - use current stack */
int_context.Sig.pCtx = NULL; int_context.Sig.pCtx = NULL;
@ -842,7 +841,7 @@ void __init trap_init(void)
_pTBI->fnSigs[TBID_SIGNUM_SW1] = switch1_handler; _pTBI->fnSigs[TBID_SIGNUM_SW1] = switch1_handler;
_pTBI->fnSigs[TBID_SIGNUM_SW2] = switchx_handler; _pTBI->fnSigs[TBID_SIGNUM_SW2] = switchx_handler;
_pTBI->fnSigs[TBID_SIGNUM_SW3] = switchx_handler; _pTBI->fnSigs[TBID_SIGNUM_SW3] = switchx_handler;
_pTBI->fnSigs[TBID_SIGNUM_SWK] = kick_handler; _pTBI->fnSigs[TBID_SIGNUM_LWK] = kick_handler;
#ifdef CONFIG_METAG_META21 #ifdef CONFIG_METAG_META21
_pTBI->fnSigs[TBID_SIGNUM_DFR] = __TBIHandleDFR; _pTBI->fnSigs[TBID_SIGNUM_DFR] = __TBIHandleDFR;

View File

@ -34,7 +34,7 @@ void __init setup_bootmem_node(int nid, unsigned long start, unsigned long end)
unsigned long pgdat_paddr; unsigned long pgdat_paddr;
/* Don't allow bogus node assignment */ /* Don't allow bogus node assignment */
BUG_ON(nid > MAX_NUMNODES || nid <= 0); BUG_ON(nid >= MAX_NUMNODES || nid <= 0);
start_pfn = start >> PAGE_SHIFT; start_pfn = start >> PAGE_SHIFT;
end_pfn = end >> PAGE_SHIFT; end_pfn = end >> PAGE_SHIFT;

View File

@ -20,7 +20,7 @@
/* D1Ar1:D0Ar2 -- State /* D1Ar1:D0Ar2 -- State
* D0Ar3 -- SigNum * D0Ar3 -- SigNum
* D0Ar4 -- Triggers * D0Ar4 -- Triggers
* D1Ar5 -- InstOrSWSId * D1Ar5 -- Inst
* D0Ar6 -- pTBI (volatile) * D0Ar6 -- pTBI (volatile)
*/ */
___TBIHandleDFR: ___TBIHandleDFR: