summaryrefslogtreecommitdiffstats
path: root/pk/ppe/ppe_common.h
blob: bc8519ea7696e5e4f1bdddd1fb8c2b0da9c53f55 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#ifndef __PPE_COMMON_H__
#define __PPE_COMMON_H__

//-----------------------------------------------------------------------------
// *! (C) Copyright International Business Machines Corp. 2014
// *! All Rights Reserved -- Property of IBM
// *! *** IBM Confidential ***
//-----------------------------------------------------------------------------

/// \file ppe_common.h
/// \brief Common header for PPE
///
/// This header is maintained as part of the PK port for PPE, but needs to be
/// physically present in the PMX area to allow dropping PMX code as a whole
/// to other teams.

// -*- WARNING: This file is maintained as part of PK.  Do not edit in -*-
// -*- the PMX area as your edits will be lost.                         -*-

#ifndef __ASSEMBLER__
#include <stdint.h>
#endif

/// This constant is used to define the size of the table of interrupt handler
/// structures as well as a limit for error checking. 
/// NOTE: This can be specific to each PPE type (SBE, PPE, GPE)
#define EXTERNAL_IRQS 64

#ifdef __ASSEMBLER__
/// This macro contains PPE specific code for determining what IRQ caused the
/// external exception handler to be invoked by the PPE

/// Load noncritical status 0 and the handler array base address.  Check
/// for interrupts pending in status register 0 while the IRQ is
/// computed.  The IRQ is expected to be stored in r3.
    .macro hwmacro_get_ext_irq
        
#_lwzi       %r4, %r4, OCB_ONISR0
        cntlzw      %r3, %r4
        cmpwible    %r3, 31, external_irq_found   #branch if irq is lt or eq to 31
        
        ## No IRQ pending in interrupt set 0.  Try set 1.
        
#_lwzi   %r4, %r4, OCB_ONISR1
        cntlzw  %r3, %r4
        addi    %r3, %r3, 32

    .endm

/// Redirect the .hwmacro_irq_cfg_bitmaps macro to call our ppe specific implementation
/// This is called from the ppe42_exceptions.S file.
/// NOTE: The standalone version of PPE doesn't support external interrupts so this
///       does nothing.
    .macro .hwmacro_irq_cfg_bitmaps
    .endm


#endif /* __ASSEMBLER__ */

#endif  /* __PPE_COMMON_H__ */
OpenPOWER on IntegriCloud