root / hw / ppc.h @ 8e9f18b6
History | View | Annotate | Download (3.6 kB)
1 | e2684c0b | Andreas Färber | void ppc_set_irq (CPUPPCState *env, int n_IRQ, int level); |
---|---|---|---|
2 | ddd1055b | Fabien Chouteau | |
3 | 87ecb68b | pbrook | /* PowerPC hardware exceptions management helpers */
|
4 | 87ecb68b | pbrook | typedef void (*clk_setup_cb)(void *opaque, uint32_t freq); |
5 | c227f099 | Anthony Liguori | typedef struct clk_setup_t clk_setup_t; |
6 | c227f099 | Anthony Liguori | struct clk_setup_t {
|
7 | 87ecb68b | pbrook | clk_setup_cb cb; |
8 | 87ecb68b | pbrook | void *opaque;
|
9 | 87ecb68b | pbrook | }; |
10 | c227f099 | Anthony Liguori | static inline void clk_setup (clk_setup_t *clk, uint32_t freq) |
11 | 87ecb68b | pbrook | { |
12 | 87ecb68b | pbrook | if (clk->cb != NULL) |
13 | 87ecb68b | pbrook | (*clk->cb)(clk->opaque, freq); |
14 | 87ecb68b | pbrook | } |
15 | 87ecb68b | pbrook | |
16 | ddd1055b | Fabien Chouteau | struct ppc_tb_t {
|
17 | ddd1055b | Fabien Chouteau | /* Time base management */
|
18 | ddd1055b | Fabien Chouteau | int64_t tb_offset; /* Compensation */
|
19 | ddd1055b | Fabien Chouteau | int64_t atb_offset; /* Compensation */
|
20 | ddd1055b | Fabien Chouteau | uint32_t tb_freq; /* TB frequency */
|
21 | ddd1055b | Fabien Chouteau | /* Decrementer management */
|
22 | ddd1055b | Fabien Chouteau | uint64_t decr_next; /* Tick for next decr interrupt */
|
23 | ddd1055b | Fabien Chouteau | uint32_t decr_freq; /* decrementer frequency */
|
24 | ddd1055b | Fabien Chouteau | struct QEMUTimer *decr_timer;
|
25 | ddd1055b | Fabien Chouteau | /* Hypervisor decrementer management */
|
26 | ddd1055b | Fabien Chouteau | uint64_t hdecr_next; /* Tick for next hdecr interrupt */
|
27 | ddd1055b | Fabien Chouteau | struct QEMUTimer *hdecr_timer;
|
28 | ddd1055b | Fabien Chouteau | uint64_t purr_load; |
29 | ddd1055b | Fabien Chouteau | uint64_t purr_start; |
30 | ddd1055b | Fabien Chouteau | void *opaque;
|
31 | ddd1055b | Fabien Chouteau | uint32_t flags; |
32 | ddd1055b | Fabien Chouteau | }; |
33 | ddd1055b | Fabien Chouteau | |
34 | ddd1055b | Fabien Chouteau | /* PPC Timers flags */
|
35 | ddd1055b | Fabien Chouteau | #define PPC_TIMER_BOOKE (1 << 0) /* Enable Booke support */ |
36 | ddd1055b | Fabien Chouteau | #define PPC_TIMER_E500 (1 << 1) /* Enable e500 support */ |
37 | ddd1055b | Fabien Chouteau | #define PPC_DECR_UNDERFLOW_TRIGGERED (1 << 2) /* Decr interrupt triggered when |
38 | ddd1055b | Fabien Chouteau | * the most significant bit
|
39 | ddd1055b | Fabien Chouteau | * changes from 0 to 1.
|
40 | ddd1055b | Fabien Chouteau | */
|
41 | ddd1055b | Fabien Chouteau | #define PPC_DECR_ZERO_TRIGGERED (1 << 3) /* Decr interrupt triggered when |
42 | ddd1055b | Fabien Chouteau | * the decrementer reaches zero.
|
43 | ddd1055b | Fabien Chouteau | */
|
44 | ddd1055b | Fabien Chouteau | |
45 | ddd1055b | Fabien Chouteau | uint64_t cpu_ppc_get_tb(ppc_tb_t *tb_env, uint64_t vmclk, int64_t tb_offset); |
46 | e2684c0b | Andreas Färber | clk_setup_cb cpu_ppc_tb_init (CPUPPCState *env, uint32_t freq); |
47 | 87ecb68b | pbrook | /* Embedded PowerPC DCR management */
|
48 | 73b01960 | Alexander Graf | typedef uint32_t (*dcr_read_cb)(void *opaque, int dcrn); |
49 | 73b01960 | Alexander Graf | typedef void (*dcr_write_cb)(void *opaque, int dcrn, uint32_t val); |
50 | e2684c0b | Andreas Färber | int ppc_dcr_init (CPUPPCState *env, int (*dcr_read_error)(int dcrn), |
51 | 87ecb68b | pbrook | int (*dcr_write_error)(int dcrn)); |
52 | e2684c0b | Andreas Färber | int ppc_dcr_register (CPUPPCState *env, int dcrn, void *opaque, |
53 | 87ecb68b | pbrook | dcr_read_cb drc_read, dcr_write_cb dcr_write); |
54 | e2684c0b | Andreas Färber | clk_setup_cb ppc_40x_timers_init (CPUPPCState *env, uint32_t freq, |
55 | d63cb48d | Edgar E. Iglesias | unsigned int decr_excp); |
56 | d63cb48d | Edgar E. Iglesias | |
57 | 87ecb68b | pbrook | /* Embedded PowerPC reset */
|
58 | e2684c0b | Andreas Färber | void ppc40x_core_reset (CPUPPCState *env);
|
59 | e2684c0b | Andreas Färber | void ppc40x_chip_reset (CPUPPCState *env);
|
60 | e2684c0b | Andreas Färber | void ppc40x_system_reset (CPUPPCState *env);
|
61 | 87ecb68b | pbrook | void PREP_debug_write (void *opaque, uint32_t addr, uint32_t val); |
62 | 87ecb68b | pbrook | |
63 | d60efc6b | Blue Swirl | extern CPUWriteMemoryFunc * const PPC_io_write[]; |
64 | d60efc6b | Blue Swirl | extern CPUReadMemoryFunc * const PPC_io_read[]; |
65 | 87ecb68b | pbrook | void PPC_debug_write (void *opaque, uint32_t addr, uint32_t val); |
66 | b1d8e52e | blueswir1 | |
67 | e2684c0b | Andreas Färber | void ppc40x_irq_init (CPUPPCState *env);
|
68 | e2684c0b | Andreas Färber | void ppce500_irq_init (CPUPPCState *env);
|
69 | e2684c0b | Andreas Färber | void ppc6xx_irq_init (CPUPPCState *env);
|
70 | e2684c0b | Andreas Färber | void ppc970_irq_init (CPUPPCState *env);
|
71 | e2684c0b | Andreas Färber | void ppcPOWER7_irq_init (CPUPPCState *env);
|
72 | 5ce4aafd | aurel32 | |
73 | 5ce4aafd | aurel32 | /* PPC machines for OpenBIOS */
|
74 | 5ce4aafd | aurel32 | enum {
|
75 | 5ce4aafd | aurel32 | ARCH_PREP = 0,
|
76 | 5ce4aafd | aurel32 | ARCH_MAC99, |
77 | 5ce4aafd | aurel32 | ARCH_HEATHROW, |
78 | 0f921197 | Alexander Graf | ARCH_MAC99_U3, |
79 | 5ce4aafd | aurel32 | }; |
80 | 5ce4aafd | aurel32 | |
81 | 7f1aec5f | Laurent Vivier | #define FW_CFG_PPC_WIDTH (FW_CFG_ARCH_LOCAL + 0x00) |
82 | 7f1aec5f | Laurent Vivier | #define FW_CFG_PPC_HEIGHT (FW_CFG_ARCH_LOCAL + 0x01) |
83 | 7f1aec5f | Laurent Vivier | #define FW_CFG_PPC_DEPTH (FW_CFG_ARCH_LOCAL + 0x02) |
84 | dc333cd6 | Alexander Graf | #define FW_CFG_PPC_TBFREQ (FW_CFG_ARCH_LOCAL + 0x03) |
85 | 45024f09 | Alexander Graf | #define FW_CFG_PPC_IS_KVM (FW_CFG_ARCH_LOCAL + 0x05) |
86 | 45024f09 | Alexander Graf | #define FW_CFG_PPC_KVM_HC (FW_CFG_ARCH_LOCAL + 0x06) |
87 | 45024f09 | Alexander Graf | #define FW_CFG_PPC_KVM_PID (FW_CFG_ARCH_LOCAL + 0x07) |
88 | 802670e6 | Blue Swirl | |
89 | 802670e6 | Blue Swirl | #define PPC_SERIAL_MM_BAUDBASE 399193 |
90 | ddd1055b | Fabien Chouteau | |
91 | ddd1055b | Fabien Chouteau | /* ppc_booke.c */
|
92 | e2684c0b | Andreas Färber | void ppc_booke_timers_init(CPUPPCState *env, uint32_t freq, uint32_t flags); |