1cb9c377fSPaolo Bonzini #ifndef HW_PPC_H 2cb9c377fSPaolo Bonzini #define HW_PPC_H 1 3cb9c377fSPaolo Bonzini 47058581aSAndreas Färber void ppc_set_irq(PowerPCCPU *cpu, int n_IRQ, int level); 5ddd1055bSFabien Chouteau 687ecb68bSpbrook /* PowerPC hardware exceptions management helpers */ 787ecb68bSpbrook typedef void (*clk_setup_cb)(void *opaque, uint32_t freq); 8c227f099SAnthony Liguori typedef struct clk_setup_t clk_setup_t; 9c227f099SAnthony Liguori struct clk_setup_t { 1087ecb68bSpbrook clk_setup_cb cb; 1187ecb68bSpbrook void *opaque; 1287ecb68bSpbrook }; 13c227f099SAnthony Liguori static inline void clk_setup (clk_setup_t *clk, uint32_t freq) 1487ecb68bSpbrook { 1587ecb68bSpbrook if (clk->cb != NULL) 1687ecb68bSpbrook (*clk->cb)(clk->opaque, freq); 1787ecb68bSpbrook } 1887ecb68bSpbrook 19ddd1055bSFabien Chouteau struct ppc_tb_t { 20ddd1055bSFabien Chouteau /* Time base management */ 21ddd1055bSFabien Chouteau int64_t tb_offset; /* Compensation */ 22ddd1055bSFabien Chouteau int64_t atb_offset; /* Compensation */ 23ddd1055bSFabien Chouteau uint32_t tb_freq; /* TB frequency */ 24ddd1055bSFabien Chouteau /* Decrementer management */ 25ddd1055bSFabien Chouteau uint64_t decr_next; /* Tick for next decr interrupt */ 26ddd1055bSFabien Chouteau uint32_t decr_freq; /* decrementer frequency */ 271246b259SStefan Weil QEMUTimer *decr_timer; 28ddd1055bSFabien Chouteau /* Hypervisor decrementer management */ 29ddd1055bSFabien Chouteau uint64_t hdecr_next; /* Tick for next hdecr interrupt */ 301246b259SStefan Weil QEMUTimer *hdecr_timer; 31ddd1055bSFabien Chouteau uint64_t purr_load; 32ddd1055bSFabien Chouteau uint64_t purr_start; 33ddd1055bSFabien Chouteau void *opaque; 34ddd1055bSFabien Chouteau uint32_t flags; 35ddd1055bSFabien Chouteau }; 36ddd1055bSFabien Chouteau 37ddd1055bSFabien Chouteau /* PPC Timers flags */ 38ddd1055bSFabien Chouteau #define PPC_TIMER_BOOKE (1 << 0) /* Enable Booke support */ 39ddd1055bSFabien Chouteau #define PPC_TIMER_E500 (1 << 1) /* Enable e500 support */ 40ddd1055bSFabien Chouteau #define PPC_DECR_UNDERFLOW_TRIGGERED (1 << 2) /* Decr interrupt triggered when 41ddd1055bSFabien Chouteau * the most significant bit 42ddd1055bSFabien Chouteau * changes from 0 to 1. 43ddd1055bSFabien Chouteau */ 44ddd1055bSFabien Chouteau #define PPC_DECR_ZERO_TRIGGERED (1 << 3) /* Decr interrupt triggered when 45ddd1055bSFabien Chouteau * the decrementer reaches zero. 46ddd1055bSFabien Chouteau */ 47e81a982aSAlexander Graf #define PPC_DECR_UNDERFLOW_LEVEL (1 << 4) /* Decr interrupt active when 48e81a982aSAlexander Graf * the most significant bit is 1. 49e81a982aSAlexander Graf */ 50ddd1055bSFabien Chouteau 51ddd1055bSFabien Chouteau uint64_t cpu_ppc_get_tb(ppc_tb_t *tb_env, uint64_t vmclk, int64_t tb_offset); 52e2684c0bSAndreas Färber clk_setup_cb cpu_ppc_tb_init (CPUPPCState *env, uint32_t freq); 5387ecb68bSpbrook /* Embedded PowerPC DCR management */ 5473b01960SAlexander Graf typedef uint32_t (*dcr_read_cb)(void *opaque, int dcrn); 5573b01960SAlexander Graf typedef void (*dcr_write_cb)(void *opaque, int dcrn, uint32_t val); 56e2684c0bSAndreas Färber int ppc_dcr_init (CPUPPCState *env, int (*dcr_read_error)(int dcrn), 5787ecb68bSpbrook int (*dcr_write_error)(int dcrn)); 58e2684c0bSAndreas Färber int ppc_dcr_register (CPUPPCState *env, int dcrn, void *opaque, 5987ecb68bSpbrook dcr_read_cb drc_read, dcr_write_cb dcr_write); 60e2684c0bSAndreas Färber clk_setup_cb ppc_40x_timers_init (CPUPPCState *env, uint32_t freq, 61d63cb48dSEdgar E. Iglesias unsigned int decr_excp); 62d63cb48dSEdgar E. Iglesias 6387ecb68bSpbrook /* Embedded PowerPC reset */ 64f3273ba6SAndreas Färber void ppc40x_core_reset(PowerPCCPU *cpu); 65f3273ba6SAndreas Färber void ppc40x_chip_reset(PowerPCCPU *cpu); 66f3273ba6SAndreas Färber void ppc40x_system_reset(PowerPCCPU *cpu); 6787ecb68bSpbrook void PREP_debug_write (void *opaque, uint32_t addr, uint32_t val); 6887ecb68bSpbrook 69d60efc6bSBlue Swirl extern CPUWriteMemoryFunc * const PPC_io_write[]; 70d60efc6bSBlue Swirl extern CPUReadMemoryFunc * const PPC_io_read[]; 7187ecb68bSpbrook void PPC_debug_write (void *opaque, uint32_t addr, uint32_t val); 72b1d8e52eSblueswir1 73e2684c0bSAndreas Färber void ppc40x_irq_init (CPUPPCState *env); 74e2684c0bSAndreas Färber void ppce500_irq_init (CPUPPCState *env); 75e2684c0bSAndreas Färber void ppc6xx_irq_init (CPUPPCState *env); 76e2684c0bSAndreas Färber void ppc970_irq_init (CPUPPCState *env); 77e2684c0bSAndreas Färber void ppcPOWER7_irq_init (CPUPPCState *env); 785ce4aafdSaurel32 795ce4aafdSaurel32 /* PPC machines for OpenBIOS */ 805ce4aafdSaurel32 enum { 815ce4aafdSaurel32 ARCH_PREP = 0, 825ce4aafdSaurel32 ARCH_MAC99, 835ce4aafdSaurel32 ARCH_HEATHROW, 840f921197SAlexander Graf ARCH_MAC99_U3, 855ce4aafdSaurel32 }; 865ce4aafdSaurel32 877f1aec5fSLaurent Vivier #define FW_CFG_PPC_WIDTH (FW_CFG_ARCH_LOCAL + 0x00) 887f1aec5fSLaurent Vivier #define FW_CFG_PPC_HEIGHT (FW_CFG_ARCH_LOCAL + 0x01) 897f1aec5fSLaurent Vivier #define FW_CFG_PPC_DEPTH (FW_CFG_ARCH_LOCAL + 0x02) 90dc333cd6SAlexander Graf #define FW_CFG_PPC_TBFREQ (FW_CFG_ARCH_LOCAL + 0x03) 91a1014f25SAlexander Graf #define FW_CFG_PPC_CLOCKFREQ (FW_CFG_ARCH_LOCAL + 0x04) 9245024f09SAlexander Graf #define FW_CFG_PPC_IS_KVM (FW_CFG_ARCH_LOCAL + 0x05) 9345024f09SAlexander Graf #define FW_CFG_PPC_KVM_HC (FW_CFG_ARCH_LOCAL + 0x06) 9445024f09SAlexander Graf #define FW_CFG_PPC_KVM_PID (FW_CFG_ARCH_LOCAL + 0x07) 95*261265ccSAlexander Graf #define FW_CFG_PPC_NVRAM_ADDR (FW_CFG_ARCH_LOCAL + 0x08) 969d1c1283SBALATON Zoltan #define FW_CFG_PPC_BUSFREQ (FW_CFG_ARCH_LOCAL + 0x09) 97802670e6SBlue Swirl 98802670e6SBlue Swirl #define PPC_SERIAL_MM_BAUDBASE 399193 99ddd1055bSFabien Chouteau 100ddd1055bSFabien Chouteau /* ppc_booke.c */ 101a34a92b9SAndreas Färber void ppc_booke_timers_init(PowerPCCPU *cpu, uint32_t freq, uint32_t flags); 102cb9c377fSPaolo Bonzini 103cb9c377fSPaolo Bonzini #endif 104