diff options
Diffstat (limited to 'src/include')
-rw-r--r-- | src/include/console/console.h | 49 | ||||
-rw-r--r-- | src/include/cpu/p6/apic.h | 46 | ||||
-rw-r--r-- | src/include/cpu/p6/msr.h | 126 | ||||
-rw-r--r-- | src/include/delay.h | 9 | ||||
-rw-r--r-- | src/include/device/pnp.h | 58 | ||||
-rw-r--r-- | src/include/smp/start_stop.h | 2 |
6 files changed, 241 insertions, 49 deletions
diff --git a/src/include/console/console.h b/src/include/console/console.h index 57ba9da268..2a9f38896a 100644 --- a/src/include/console/console.h +++ b/src/include/console/console.h @@ -72,5 +72,54 @@ int do_printk(int msg_level, const char *fmt, ...); #define printk_spew(fmt, arg...) do {} while(0) #endif +#define print_emerg(STR) printk_emerg ("%s", (STR)) +#define print_alert(STR) printk_alert ("%s", (STR)) +#define print_crit(STR) printk_crit ("%s", (STR)) +#define print_err(STR) printk_err ("%s", (STR)) +#define print_warning(STR) printk_warning("%s", (STR)) +#define print_notice(STR) printk_notice ("%s", (STR)) +#define print_info(STR) printk_info ("%s", (STR)) +#define print_debug(STR) printk_debug ("%s", (STR)) +#define print_spew(STR) printk_spew ("%s", (STR)) + +#define print_emerg_char(CH) printk_emerg ("%c", (CH)) +#define print_alert_char(CH) printk_alert ("%c", (CH)) +#define print_crit_char(CH) printk_crit ("%c", (CH)) +#define print_err_char(CH) printk_err ("%c", (CH)) +#define print_warning_char(CH) printk_warning("%c", (CH)) +#define print_notice_char(CH) printk_notice ("%c", (CH)) +#define print_info_char(CH) printk_info ("%c", (CH)) +#define print_debug_char(CH) printk_debug ("%c", (CH)) +#define print_spew_char(CH) printk_spew ("%c", (CH)) + +#define print_emerg_hex8(HEX) printk_emerg ("%08x", (HEX)) +#define print_alert_hex8(HEX) printk_alert ("%08x", (HEX)) +#define print_crit_hex8(HEX) printk_crit ("%08x", (HEX)) +#define print_err_hex8(HEX) printk_err ("%08x", (HEX)) +#define print_warning_hex8(HEX) printk_warning("%08x", (HEX)) +#define print_notice_hex8(HEX) printk_notice ("%08x", (HEX)) +#define print_info_hex8(HEX) printk_info ("%08x", (HEX)) +#define print_debug_hex8(HEX) printk_debug ("%08x", (HEX)) +#define print_spew_hex8(HEX) printk_spew ("%08x", (HEX)) + +#define print_emerg_hex16(HEX) printk_emerg ("%016x", (HEX)) +#define print_alert_hex16(HEX) printk_alert ("%016x", (HEX)) +#define print_crit_hex16(HEX) printk_crit ("%016x", (HEX)) +#define print_err_hex16(HEX) printk_err ("%016x", (HEX)) +#define print_warning_hex16(HEX) printk_warning("%016x", (HEX)) +#define print_notice_hex16(HEX) printk_notice ("%016x", (HEX)) +#define print_info_hex16(HEX) printk_info ("%016x", (HEX)) +#define print_debug_hex16(HEX) printk_debug ("%016x", (HEX)) +#define print_spew_hex16(HEX) printk_spew ("%016x", (HEX)) + +#define print_emerg_hex32(HEX) printk_emerg ("%032x", (HEX)) +#define print_alert_hex32(HEX) printk_alert ("%032x", (HEX)) +#define print_crit_hex32(HEX) printk_crit ("%032x", (HEX)) +#define print_err_hex32(HEX) printk_err ("%032x", (HEX)) +#define print_warning_hex32(HEX) printk_warning("%032x", (HEX)) +#define print_notice_hex32(HEX) printk_notice ("%032x", (HEX)) +#define print_info_hex32(HEX) printk_info ("%032x", (HEX)) +#define print_debug_hex32(HEX) printk_debug ("%032x", (HEX)) +#define print_spew_hex32(HEX) printk_spew ("%032x", (HEX)) #endif /* CONSOLE_CONSOLE_H_ */ diff --git a/src/include/cpu/p6/apic.h b/src/include/cpu/p6/apic.h index 65a14603f5..7e8b2f4938 100644 --- a/src/include/cpu/p6/apic.h +++ b/src/include/cpu/p6/apic.h @@ -76,12 +76,40 @@ #define APIC_MODE_EXINT 0x7 #define APIC_LVT1 0x360 #define APIC_LVTERR 0x370 +#define APIC_TMICT 0x380 +#define APIC_TMCCT 0x390 +#define APIC_TDCR 0x3E0 +#define APIC_TDR_DIV_TMBASE (1<<2) +#define APIC_TDR_DIV_1 0xB +#define APIC_TDR_DIV_2 0x0 +#define APIC_TDR_DIV_4 0x1 +#define APIC_TDR_DIV_8 0x2 +#define APIC_TDR_DIV_16 0x3 +#define APIC_TDR_DIV_32 0x8 +#define APIC_TDR_DIV_64 0x9 +#define APIC_TDR_DIV_128 0xA + +#if defined(__ROMCC__) || !defined(ASSEMBLY) +static inline unsigned long apic_read(unsigned long reg) +{ + return *((volatile unsigned long *)(APIC_DEFAULT_BASE+reg)); +} -#if !defined(ASSEMBLY) +static inline void apic_write(unsigned long reg, unsigned long v) +{ + *((volatile unsigned long *)(APIC_DEFAULT_BASE+reg)) = v; +} + +static inline void apic_wait_icr_idle(void) +{ + do { } while ( apic_read( APIC_ICR ) & APIC_ICR_BUSY ); +} -#include <console/console.h> +#endif + +#if !defined(ASSEMBLY) #define xchg(ptr,v) ((__typeof__(*(ptr)))__xchg((unsigned long)(v),(ptr),sizeof(*(ptr)))) @@ -119,25 +147,11 @@ static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int siz } -static inline unsigned long apic_read(unsigned long reg) -{ - return *((volatile unsigned long *)(APIC_DEFAULT_BASE+reg)); -} - extern inline void apic_write_atomic(unsigned long reg, unsigned long v) { xchg((volatile unsigned long *)(APIC_DEFAULT_BASE+reg), v); } -static inline void apic_write(unsigned long reg, unsigned long v) -{ - *((volatile unsigned long *)(APIC_DEFAULT_BASE+reg)) = v; -} - -static inline void apic_wait_icr_idle(void) -{ - do { } while ( apic_read( APIC_ICR ) & APIC_ICR_BUSY ); -} #ifdef CONFIG_X86_GOOD_APIC # define FORCE_READ_AROUND_WRITE 0 diff --git a/src/include/cpu/p6/msr.h b/src/include/cpu/p6/msr.h index 4977b0201d..d7632ba6de 100644 --- a/src/include/cpu/p6/msr.h +++ b/src/include/cpu/p6/msr.h @@ -1,33 +1,101 @@ #ifndef CPU_P6_MSR_H #define CPU_P6_MSR_H -/* - * Access to machine-specific registers (available on 586 and better only) - * Note: the rd* operations modify the parameters directly (without using - * pointer indirection), this allows gcc to optimize better - */ - -#define rdmsr(msr,val1,val2) \ - __asm__ __volatile__("rdmsr" \ - : "=a" (val1), "=d" (val2) \ - : "c" (msr)) - -#define wrmsr(msr,val1,val2) \ - __asm__ __volatile__("wrmsr" \ - : /* no outputs */ \ - : "c" (msr), "a" (val1), "d" (val2)) - -#define rdtsc(low,high) \ - __asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high)) - -#define rdtscl(low) \ - __asm__ __volatile__ ("rdtsc" : "=a" (low) : : "edx") - -#define rdtscll(val) \ - __asm__ __volatile__ ("rdtsc" : "=A" (val)) - -#define rdpmc(counter,low,high) \ - __asm__ __volatile__("rdpmc" \ - : "=a" (low), "=d" (high) \ - : "c" (counter)) + +#ifdef __ROMCC__ + +typedef __builtin_msr_t msr_t; + +static msr_t rdmsr(unsigned long index) +{ + return __builtin_rdmsr(index); +} + +static void wrmsr(unsigned long index, msr_t msr) +{ + __builtin_wrmsr(index, msr.lo, msr.hi); +} + + +struct tsc_struct { + unsigned lo; + unsigned hi; +}; +typedef struct tsc_struct tsc_t; + +static tsc_t rdtsc(void) +{ + tsc_t res; + asm ("rdtsc" + : "=a" (res.lo), "=d"(res.hi) /* outputs */ + : /* inputs */ + : /* Clobbers */ + ); + return res; +} +#endif + +#ifdef __GNUC__ + +typedef struct msr_struct +{ + unsigned lo; + unsigned hi; +} msr_t; + +static inline msr_t rdmsr(unsigned index) +{ + msr_t result; + __asm__ __volatile__ ( + "rdmsr" + : "=a" (result.lo), "=d" (result.hi) + : "c" (index) + ); + return result; +} + +static inline void wrmsr(unsigned index, msr_t msr) +{ + __asm__ __volatile__ ( + "wrmsr" + : /* No outputs */ + : "c" (index), "a" (msr.lo), "d" (msr.hi) + ); +} + +typedef struct tsc_struct +{ + unsigned lo; + unsigned hi; +} tsc_t; + +static inline tsc_t rdtsc(void) +{ + tsc_t result; + __asm__ __volatile__( + "rdtsc" + : "=a" (result.lo), "=d" (result.hi) + ); + return result; +} + +typedef struct pmc_struct +{ + unsigned lo; + unsigned hi; +} pmc_t; + +static inline pmc_t rdpmc(unsigned counter) +{ + pmc_t result; + __asm__ __volatile__( + "rdpmc" + : "=a" (result.lo), "=d" (result.hi) + : "c" (counter) + ); + return result; +} + +#endif + #endif /* CPU_P6_MSR_H */ diff --git a/src/include/delay.h b/src/include/delay.h index bffb719a55..57bff0b637 100644 --- a/src/include/delay.h +++ b/src/include/delay.h @@ -1,8 +1,11 @@ #ifndef DELAY_H #define DELAY_H +#ifndef __ROMCC__ -void udelay(int usecs); -void mdelay(int msecs); -void delay(int secs); +void init_timer(void); +void udelay(unsigned usecs); +void mdelay(unsigned msecs); +void delay(unsigned secs); +#endif #endif /* DELAY_H */ diff --git a/src/include/device/pnp.h b/src/include/device/pnp.h new file mode 100644 index 0000000000..0d39fc1663 --- /dev/null +++ b/src/include/device/pnp.h @@ -0,0 +1,58 @@ +#ifndef DEVICE_PNP_H +#define DEVICE_PNP_H + +static inline void pnp_write_config(unsigned char port, unsigned char value, unsigned char reg) +{ + outb(reg, port); + outb(value, port +1); +} + +static inline unsigned char pnp_read_config(unsigned char port, unsigned char reg) +{ + outb(reg, port); + return inb(port +1); +} + +static inline void pnp_set_logical_device(unsigned char port, int device) +{ + pnp_write_config(port, device, 0x07); +} + +static inline void pnp_set_enable(unsigned char port, int enable) +{ + pnp_write_config(port, enable?0x1:0x0, 0x30); +} + +static inline int pnp_read_enable(unsigned char port) +{ + return !!pnp_read_config(port, 0x30); +} + +static inline void pnp_set_iobase0(unsigned char port, unsigned iobase) +{ + pnp_write_config(port, (iobase >> 8) & 0xff, 0x60); + pnp_write_config(port, iobase & 0xff, 0x61); +} + +static inline void pnp_set_iobase1(unsigned char port, unsigned iobase) +{ + pnp_write_config(port, (iobase >> 8) & 0xff, 0x62); + pnp_write_config(port, iobase & 0xff, 0x63); +} + +static inline void pnp_set_irq0(unsigned char port, unsigned irq) +{ + pnp_write_config(port, irq, 0x70); +} + +static inline void pnp_set_irq1(unsigned char port, unsigned irq) +{ + pnp_write_config(port, irq, 0x72); +} + +static inline void pnp_set_drq(unsigned char port, unsigned drq) +{ + pnp_write_config(port, drq & 0xff, 0x74); +} + +#endif /* DEVICE_PNP_H */ diff --git a/src/include/smp/start_stop.h b/src/include/smp/start_stop.h index c0eebd0e2c..84fd331ccc 100644 --- a/src/include/smp/start_stop.h +++ b/src/include/smp/start_stop.h @@ -1,7 +1,7 @@ #ifndef SMP_START_STOP_H #define SMP_START_STOP_H -#if SMP == 1 +#if CONFIG_SMP == 1 #include <smp/atomic.h> unsigned long this_processors_id(void); int processor_index(unsigned long processor_id); |