1cb9c377fSPaolo Bonzini #ifndef HW_PPC_H 2175de524SMarkus Armbruster #define HW_PPC_H 3cb9c377fSPaolo Bonzini 4f3cb3325SPhilippe Mathieu-Daudé #include "target/ppc/cpu.h" 5aa5a9e24SPaolo Bonzini 67058581aSAndreas Färber void ppc_set_irq(PowerPCCPU *cpu, int n_IRQ, int level); 7051e2973SCédric Le Goater PowerPCCPU *ppc_get_vcpu_by_pir(int pir); 84a89e204SCédric Le Goater int ppc_cpu_pir(PowerPCCPU *cpu); 9d24e80b2SNicholas Piggin int ppc_cpu_tir(PowerPCCPU *cpu); 10ddd1055bSFabien Chouteau 1187ecb68bSpbrook /* PowerPC hardware exceptions management helpers */ 1287ecb68bSpbrook typedef void (*clk_setup_cb)(void *opaque, uint32_t freq); 13c227f099SAnthony Liguori typedef struct clk_setup_t clk_setup_t; 14c227f099SAnthony Liguori struct clk_setup_t { 1587ecb68bSpbrook clk_setup_cb cb; 1687ecb68bSpbrook void *opaque; 1787ecb68bSpbrook }; 18c227f099SAnthony Liguori static inline void clk_setup (clk_setup_t *clk, uint32_t freq) 1987ecb68bSpbrook { 2087ecb68bSpbrook if (clk->cb != NULL) 2187ecb68bSpbrook (*clk->cb)(clk->opaque, freq); 2287ecb68bSpbrook } 2387ecb68bSpbrook 24ddd1055bSFabien Chouteau struct ppc_tb_t { 25ddd1055bSFabien Chouteau /* Time base management */ 26ddd1055bSFabien Chouteau int64_t tb_offset; /* Compensation */ 27ddd1055bSFabien Chouteau int64_t atb_offset; /* Compensation */ 285d62725bSSuraj Jitindar Singh int64_t vtb_offset; 29ddd1055bSFabien Chouteau uint32_t tb_freq; /* TB frequency */ 30ddd1055bSFabien Chouteau /* Decrementer management */ 31ddd1055bSFabien Chouteau uint64_t decr_next; /* Tick for next decr interrupt */ 32ddd1055bSFabien Chouteau uint32_t decr_freq; /* decrementer frequency */ 331246b259SStefan Weil QEMUTimer *decr_timer; 34ddd1055bSFabien Chouteau /* Hypervisor decrementer management */ 35ddd1055bSFabien Chouteau uint64_t hdecr_next; /* Tick for next hdecr interrupt */ 361246b259SStefan Weil QEMUTimer *hdecr_timer; 375cc7e69fSSuraj Jitindar Singh int64_t purr_offset; 38ddd1055bSFabien Chouteau void *opaque; 39ddd1055bSFabien Chouteau uint32_t flags; 40ddd1055bSFabien Chouteau }; 41ddd1055bSFabien Chouteau 42ddd1055bSFabien Chouteau /* PPC Timers flags */ 43ddd1055bSFabien Chouteau #define PPC_TIMER_BOOKE (1 << 0) /* Enable Booke support */ 44ddd1055bSFabien Chouteau #define PPC_TIMER_E500 (1 << 1) /* Enable e500 support */ 45ddd1055bSFabien Chouteau #define PPC_DECR_UNDERFLOW_TRIGGERED (1 << 2) /* Decr interrupt triggered when 46ddd1055bSFabien Chouteau * the most significant bit 47ddd1055bSFabien Chouteau * changes from 0 to 1. 48ddd1055bSFabien Chouteau */ 49ddd1055bSFabien Chouteau #define PPC_DECR_ZERO_TRIGGERED (1 << 3) /* Decr interrupt triggered when 50ddd1055bSFabien Chouteau * the decrementer reaches zero. 51ddd1055bSFabien Chouteau */ 52e81a982aSAlexander Graf #define PPC_DECR_UNDERFLOW_LEVEL (1 << 4) /* Decr interrupt active when 53e81a982aSAlexander Graf * the most significant bit is 1. 54e81a982aSAlexander Graf */ 55ddd1055bSFabien Chouteau 56ddd1055bSFabien Chouteau uint64_t cpu_ppc_get_tb(ppc_tb_t *tb_env, uint64_t vmclk, int64_t tb_offset); 5730d0647bSNicholas Piggin void cpu_ppc_tb_init(CPUPPCState *env, uint32_t freq); 5830d0647bSNicholas Piggin void cpu_ppc_tb_reset(CPUPPCState *env); 59ef95a244SDaniel Henrique Barboza void cpu_ppc_tb_free(CPUPPCState *env); 6093aeb702SNicholas Piggin void cpu_ppc_hdecr_init(CPUPPCState *env); 6193aeb702SNicholas Piggin void cpu_ppc_hdecr_exit(CPUPPCState *env); 6293aeb702SNicholas Piggin 6387ecb68bSpbrook /* Embedded PowerPC DCR management */ 6473b01960SAlexander Graf typedef uint32_t (*dcr_read_cb)(void *opaque, int dcrn); 6573b01960SAlexander Graf typedef void (*dcr_write_cb)(void *opaque, int dcrn, uint32_t val); 66e2684c0bSAndreas Färber int ppc_dcr_init (CPUPPCState *env, int (*dcr_read_error)(int dcrn), 6787ecb68bSpbrook int (*dcr_write_error)(int dcrn)); 68e2684c0bSAndreas Färber int ppc_dcr_register (CPUPPCState *env, int dcrn, void *opaque, 6987ecb68bSpbrook dcr_read_cb drc_read, dcr_write_cb dcr_write); 70e2684c0bSAndreas Färber clk_setup_cb ppc_40x_timers_init (CPUPPCState *env, uint32_t freq, 71d63cb48dSEdgar E. Iglesias unsigned int decr_excp); 72d63cb48dSEdgar E. Iglesias 7387ecb68bSpbrook /* Embedded PowerPC reset */ 74f3273ba6SAndreas Färber void ppc40x_core_reset(PowerPCCPU *cpu); 75f3273ba6SAndreas Färber void ppc40x_chip_reset(PowerPCCPU *cpu); 76f3273ba6SAndreas Färber void ppc40x_system_reset(PowerPCCPU *cpu); 77b1d8e52eSblueswir1 78aa5a9e24SPaolo Bonzini #if defined(CONFIG_USER_ONLY) 79aa5a9e24SPaolo Bonzini static inline void ppc40x_irq_init(PowerPCCPU *cpu) {} 80aa5a9e24SPaolo Bonzini static inline void ppc6xx_irq_init(PowerPCCPU *cpu) {} 81aa5a9e24SPaolo Bonzini static inline void ppc970_irq_init(PowerPCCPU *cpu) {} 82aa5a9e24SPaolo Bonzini static inline void ppcPOWER7_irq_init(PowerPCCPU *cpu) {} 8367afe775SBenjamin Herrenschmidt static inline void ppcPOWER9_irq_init(PowerPCCPU *cpu) {} 84aa5a9e24SPaolo Bonzini static inline void ppce500_irq_init(PowerPCCPU *cpu) {} 8540177438SGreg Kurz static inline void ppc_irq_reset(PowerPCCPU *cpu) {} 86aa5a9e24SPaolo Bonzini #else 87aa5a9e24SPaolo Bonzini void ppc40x_irq_init(PowerPCCPU *cpu); 88aa5a9e24SPaolo Bonzini void ppce500_irq_init(PowerPCCPU *cpu); 89aa5a9e24SPaolo Bonzini void ppc6xx_irq_init(PowerPCCPU *cpu); 90aa5a9e24SPaolo Bonzini void ppc970_irq_init(PowerPCCPU *cpu); 91aa5a9e24SPaolo Bonzini void ppcPOWER7_irq_init(PowerPCCPU *cpu); 9267afe775SBenjamin Herrenschmidt void ppcPOWER9_irq_init(PowerPCCPU *cpu); 9340177438SGreg Kurz void ppc_irq_reset(PowerPCCPU *cpu); 94aa5a9e24SPaolo Bonzini #endif 955ce4aafdSaurel32 965ce4aafdSaurel32 /* PPC machines for OpenBIOS */ 975ce4aafdSaurel32 enum { 985ce4aafdSaurel32 ARCH_PREP = 0, 995ce4aafdSaurel32 ARCH_MAC99, 1005ce4aafdSaurel32 ARCH_HEATHROW, 1010f921197SAlexander Graf ARCH_MAC99_U3, 1025ce4aafdSaurel32 }; 1035ce4aafdSaurel32 1047f1aec5fSLaurent Vivier #define FW_CFG_PPC_WIDTH (FW_CFG_ARCH_LOCAL + 0x00) 1057f1aec5fSLaurent Vivier #define FW_CFG_PPC_HEIGHT (FW_CFG_ARCH_LOCAL + 0x01) 1067f1aec5fSLaurent Vivier #define FW_CFG_PPC_DEPTH (FW_CFG_ARCH_LOCAL + 0x02) 107dc333cd6SAlexander Graf #define FW_CFG_PPC_TBFREQ (FW_CFG_ARCH_LOCAL + 0x03) 108a1014f25SAlexander Graf #define FW_CFG_PPC_CLOCKFREQ (FW_CFG_ARCH_LOCAL + 0x04) 10945024f09SAlexander Graf #define FW_CFG_PPC_IS_KVM (FW_CFG_ARCH_LOCAL + 0x05) 11045024f09SAlexander Graf #define FW_CFG_PPC_KVM_HC (FW_CFG_ARCH_LOCAL + 0x06) 11145024f09SAlexander Graf #define FW_CFG_PPC_KVM_PID (FW_CFG_ARCH_LOCAL + 0x07) 112261265ccSAlexander Graf #define FW_CFG_PPC_NVRAM_ADDR (FW_CFG_ARCH_LOCAL + 0x08) 1139d1c1283SBALATON Zoltan #define FW_CFG_PPC_BUSFREQ (FW_CFG_ARCH_LOCAL + 0x09) 1145b64db97SMark Cave-Ayland #define FW_CFG_PPC_NVRAM_FLAT (FW_CFG_ARCH_LOCAL + 0x0a) 115f1114c17SMark Cave-Ayland #define FW_CFG_PPC_VIACONFIG (FW_CFG_ARCH_LOCAL + 0x0b) 116802670e6SBlue Swirl 117802670e6SBlue Swirl #define PPC_SERIAL_MM_BAUDBASE 399193 118ddd1055bSFabien Chouteau 119779a30dfSBALATON Zoltan #ifndef CONFIG_USER_ONLY 120779a30dfSBALATON Zoltan void booke206_set_tlb(ppcmas_tlb_t *tlb, target_ulong va, hwaddr pa, 121779a30dfSBALATON Zoltan hwaddr len); 122*afff8800SBALATON Zoltan void booke_set_tlb(ppcemb_tlb_t *tlb, target_ulong va, hwaddr pa, 123*afff8800SBALATON Zoltan target_ulong size); 124779a30dfSBALATON Zoltan #endif 125779a30dfSBALATON Zoltan 126ddd1055bSFabien Chouteau /* ppc_booke.c */ 127a34a92b9SAndreas Färber void ppc_booke_timers_init(PowerPCCPU *cpu, uint32_t freq, uint32_t flags); 128cb9c377fSPaolo Bonzini #endif 129