Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc
* 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc: (209 commits) [POWERPC] Create add_rtc() function to enable the RTC CMOS driver [POWERPC] Add H_ILLAN_ATTRIBUTES hcall number [POWERPC] xilinxfb: Parameterize xilinxfb platform device registration [POWERPC] Oprofile support for Power 5++ [POWERPC] Enable arbitary speed tty ioctls and split input/output speed [POWERPC] Make drivers/char/hvc_console.c:khvcd() static [POWERPC] Remove dead code for preventing pread() and pwrite() calls [POWERPC] Remove unnecessary #undef printk from prom.c [POWERPC] Fix typo in Ebony default DTS [POWERPC] Check for NULL ppc_md.init_IRQ() before calling [POWERPC] Remove extra return statement [POWERPC] pasemi: Don't auto-select CONFIG_EMBEDDED [POWERPC] pasemi: Rename platform [POWERPC] arch/powerpc/kernel/sysfs.c: Move NUMA exports [POWERPC] Add __read_mostly support for powerpc [POWERPC] Modify sched_clock() to make CONFIG_PRINTK_TIME more sane [POWERPC] Create a dummy zImage if no valid platform has been selected [POWERPC] PS3: Bootwrapper support. [POWERPC] powermac i2c: Use mutex [POWERPC] Schedule removal of arch/ppc ... Fixed up conflicts manually in: Documentation/feature-removal-schedule.txt arch/powerpc/kernel/pci_32.c arch/powerpc/kernel/pci_64.c include/asm-powerpc/pci.h and asked the powerpc people to double-check the result..
This commit is contained in:
@@ -34,5 +34,9 @@ struct ppc64_caches {
|
||||
extern struct ppc64_caches ppc64_caches;
|
||||
#endif /* __powerpc64__ && ! __ASSEMBLY__ */
|
||||
|
||||
#if !defined(__ASSEMBLY__)
|
||||
#define __read_mostly __attribute__((__section__(".data.read_mostly")))
|
||||
#endif
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _ASM_POWERPC_CACHE_H */
|
||||
|
||||
@@ -111,7 +111,7 @@ extern void do_feature_fixups(unsigned long value, void *fixup_start,
|
||||
/* CPU kernel features */
|
||||
|
||||
/* Retain the 32b definitions all use bottom half of word */
|
||||
#define CPU_FTR_SPLIT_ID_CACHE ASM_CONST(0x0000000000000001)
|
||||
#define CPU_FTR_COHERENT_ICACHE ASM_CONST(0x0000000000000001)
|
||||
#define CPU_FTR_L2CR ASM_CONST(0x0000000000000002)
|
||||
#define CPU_FTR_SPEC7450 ASM_CONST(0x0000000000000004)
|
||||
#define CPU_FTR_ALTIVEC ASM_CONST(0x0000000000000008)
|
||||
@@ -135,6 +135,7 @@ extern void do_feature_fixups(unsigned long value, void *fixup_start,
|
||||
#define CPU_FTR_PPC_LE ASM_CONST(0x0000000000200000)
|
||||
#define CPU_FTR_REAL_LE ASM_CONST(0x0000000000400000)
|
||||
#define CPU_FTR_FPU_UNAVAILABLE ASM_CONST(0x0000000000800000)
|
||||
#define CPU_FTR_UNIFIED_ID_CACHE ASM_CONST(0x0000000001000000)
|
||||
|
||||
/*
|
||||
* Add the 64-bit processor unique features in the top half of the word;
|
||||
@@ -154,7 +155,6 @@ extern void do_feature_fixups(unsigned long value, void *fixup_start,
|
||||
#define CPU_FTR_MMCRA LONG_ASM_CONST(0x0000004000000000)
|
||||
#define CPU_FTR_CTRL LONG_ASM_CONST(0x0000008000000000)
|
||||
#define CPU_FTR_SMT LONG_ASM_CONST(0x0000010000000000)
|
||||
#define CPU_FTR_COHERENT_ICACHE LONG_ASM_CONST(0x0000020000000000)
|
||||
#define CPU_FTR_LOCKLESS_TLBIE LONG_ASM_CONST(0x0000040000000000)
|
||||
#define CPU_FTR_CI_LARGE_PAGE LONG_ASM_CONST(0x0000100000000000)
|
||||
#define CPU_FTR_PAUSE_ZERO LONG_ASM_CONST(0x0000200000000000)
|
||||
@@ -206,164 +206,149 @@ extern void do_feature_fixups(unsigned long value, void *fixup_start,
|
||||
!defined(CONFIG_POWER3) && !defined(CONFIG_POWER4) && \
|
||||
!defined(CONFIG_BOOKE))
|
||||
|
||||
#define CPU_FTRS_PPC601 (CPU_FTR_COMMON | CPU_FTR_601 | CPU_FTR_HPTE_TABLE)
|
||||
#define CPU_FTRS_603 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \
|
||||
#define CPU_FTRS_PPC601 (CPU_FTR_COMMON | CPU_FTR_601 | CPU_FTR_HPTE_TABLE | \
|
||||
CPU_FTR_COHERENT_ICACHE | CPU_FTR_UNIFIED_ID_CACHE)
|
||||
#define CPU_FTRS_603 (CPU_FTR_COMMON | \
|
||||
CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | \
|
||||
CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_PPC_LE)
|
||||
#define CPU_FTRS_604 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \
|
||||
#define CPU_FTRS_604 (CPU_FTR_COMMON | \
|
||||
CPU_FTR_USE_TB | CPU_FTR_604_PERF_MON | CPU_FTR_HPTE_TABLE | \
|
||||
CPU_FTR_PPC_LE)
|
||||
#define CPU_FTRS_740_NOTAU (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \
|
||||
#define CPU_FTRS_740_NOTAU (CPU_FTR_COMMON | \
|
||||
CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR | \
|
||||
CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_PPC_LE)
|
||||
#define CPU_FTRS_740 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \
|
||||
#define CPU_FTRS_740 (CPU_FTR_COMMON | \
|
||||
CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR | \
|
||||
CPU_FTR_TAU | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP | \
|
||||
CPU_FTR_PPC_LE)
|
||||
#define CPU_FTRS_750 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \
|
||||
#define CPU_FTRS_750 (CPU_FTR_COMMON | \
|
||||
CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR | \
|
||||
CPU_FTR_TAU | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP | \
|
||||
CPU_FTR_PPC_LE)
|
||||
#define CPU_FTRS_750CL (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \
|
||||
CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR | \
|
||||
CPU_FTR_TAU | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP | \
|
||||
CPU_FTR_HAS_HIGH_BATS | CPU_FTR_PPC_LE)
|
||||
#define CPU_FTRS_750FX1 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \
|
||||
CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR | \
|
||||
CPU_FTR_TAU | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP | \
|
||||
CPU_FTR_DUAL_PLL_750FX | CPU_FTR_NO_DPM | CPU_FTR_PPC_LE)
|
||||
#define CPU_FTRS_750FX2 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \
|
||||
CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR | \
|
||||
CPU_FTR_TAU | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP | \
|
||||
CPU_FTR_NO_DPM | CPU_FTR_PPC_LE)
|
||||
#define CPU_FTRS_750FX (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \
|
||||
CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR | \
|
||||
CPU_FTR_TAU | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP | \
|
||||
CPU_FTR_DUAL_PLL_750FX | CPU_FTR_HAS_HIGH_BATS | CPU_FTR_PPC_LE)
|
||||
#define CPU_FTRS_750GX (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \
|
||||
CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR | \
|
||||
CPU_FTR_TAU | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP | \
|
||||
CPU_FTR_DUAL_PLL_750FX | CPU_FTR_HAS_HIGH_BATS | CPU_FTR_PPC_LE)
|
||||
#define CPU_FTRS_7400_NOTAU (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \
|
||||
#define CPU_FTRS_750CL (CPU_FTRS_750 | CPU_FTR_HAS_HIGH_BATS)
|
||||
#define CPU_FTRS_750FX1 (CPU_FTRS_750 | CPU_FTR_DUAL_PLL_750FX | CPU_FTR_NO_DPM)
|
||||
#define CPU_FTRS_750FX2 (CPU_FTRS_750 | CPU_FTR_NO_DPM)
|
||||
#define CPU_FTRS_750FX (CPU_FTRS_750 | CPU_FTR_DUAL_PLL_750FX | \
|
||||
CPU_FTR_HAS_HIGH_BATS)
|
||||
#define CPU_FTRS_750GX (CPU_FTRS_750FX)
|
||||
#define CPU_FTRS_7400_NOTAU (CPU_FTR_COMMON | \
|
||||
CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR | \
|
||||
CPU_FTR_ALTIVEC_COMP | CPU_FTR_HPTE_TABLE | \
|
||||
CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_PPC_LE)
|
||||
#define CPU_FTRS_7400 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \
|
||||
#define CPU_FTRS_7400 (CPU_FTR_COMMON | \
|
||||
CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR | \
|
||||
CPU_FTR_TAU | CPU_FTR_ALTIVEC_COMP | CPU_FTR_HPTE_TABLE | \
|
||||
CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_PPC_LE)
|
||||
#define CPU_FTRS_7450_20 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \
|
||||
#define CPU_FTRS_7450_20 (CPU_FTR_COMMON | \
|
||||
CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | \
|
||||
CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | \
|
||||
CPU_FTR_NEED_COHERENT | CPU_FTR_PPC_LE)
|
||||
#define CPU_FTRS_7450_21 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \
|
||||
#define CPU_FTRS_7450_21 (CPU_FTR_COMMON | \
|
||||
CPU_FTR_USE_TB | \
|
||||
CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | \
|
||||
CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | \
|
||||
CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_L3_DISABLE_NAP | \
|
||||
CPU_FTR_NEED_COHERENT | CPU_FTR_PPC_LE)
|
||||
#define CPU_FTRS_7450_23 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \
|
||||
#define CPU_FTRS_7450_23 (CPU_FTR_COMMON | \
|
||||
CPU_FTR_USE_TB | \
|
||||
CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | \
|
||||
CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | \
|
||||
CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_NEED_COHERENT | CPU_FTR_PPC_LE)
|
||||
#define CPU_FTRS_7455_1 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \
|
||||
#define CPU_FTRS_7455_1 (CPU_FTR_COMMON | \
|
||||
CPU_FTR_USE_TB | \
|
||||
CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | CPU_FTR_L3CR | \
|
||||
CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | CPU_FTR_HAS_HIGH_BATS | \
|
||||
CPU_FTR_NEED_COHERENT | CPU_FTR_PPC_LE)
|
||||
#define CPU_FTRS_7455_20 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \
|
||||
#define CPU_FTRS_7455_20 (CPU_FTR_COMMON | \
|
||||
CPU_FTR_USE_TB | \
|
||||
CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | \
|
||||
CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | \
|
||||
CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_L3_DISABLE_NAP | \
|
||||
CPU_FTR_NEED_COHERENT | CPU_FTR_HAS_HIGH_BATS | CPU_FTR_PPC_LE)
|
||||
#define CPU_FTRS_7455 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \
|
||||
#define CPU_FTRS_7455 (CPU_FTR_COMMON | \
|
||||
CPU_FTR_USE_TB | \
|
||||
CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | \
|
||||
CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | \
|
||||
CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_HAS_HIGH_BATS | \
|
||||
CPU_FTR_NEED_COHERENT | CPU_FTR_PPC_LE)
|
||||
#define CPU_FTRS_7447_10 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \
|
||||
#define CPU_FTRS_7447_10 (CPU_FTR_COMMON | \
|
||||
CPU_FTR_USE_TB | \
|
||||
CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | \
|
||||
CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | \
|
||||
CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_HAS_HIGH_BATS | \
|
||||
CPU_FTR_NEED_COHERENT | CPU_FTR_NO_BTIC | CPU_FTR_PPC_LE)
|
||||
#define CPU_FTRS_7447 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \
|
||||
#define CPU_FTRS_7447 (CPU_FTR_COMMON | \
|
||||
CPU_FTR_USE_TB | \
|
||||
CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | \
|
||||
CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | \
|
||||
CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_HAS_HIGH_BATS | \
|
||||
CPU_FTR_NEED_COHERENT | CPU_FTR_PPC_LE)
|
||||
#define CPU_FTRS_7447A (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \
|
||||
#define CPU_FTRS_7447A (CPU_FTR_COMMON | \
|
||||
CPU_FTR_USE_TB | \
|
||||
CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | \
|
||||
CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | \
|
||||
CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_HAS_HIGH_BATS | \
|
||||
CPU_FTR_NEED_COHERENT | CPU_FTR_PPC_LE)
|
||||
#define CPU_FTRS_7448 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \
|
||||
#define CPU_FTRS_7448 (CPU_FTR_COMMON | \
|
||||
CPU_FTR_USE_TB | \
|
||||
CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | \
|
||||
CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | \
|
||||
CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_HAS_HIGH_BATS | \
|
||||
CPU_FTR_PPC_LE)
|
||||
#define CPU_FTRS_82XX (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \
|
||||
#define CPU_FTRS_82XX (CPU_FTR_COMMON | \
|
||||
CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB)
|
||||
#define CPU_FTRS_G2_LE (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE | \
|
||||
#define CPU_FTRS_G2_LE (CPU_FTR_MAYBE_CAN_DOZE | \
|
||||
CPU_FTR_USE_TB | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_HAS_HIGH_BATS)
|
||||
#define CPU_FTRS_E300 (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE | \
|
||||
#define CPU_FTRS_E300 (CPU_FTR_MAYBE_CAN_DOZE | \
|
||||
CPU_FTR_USE_TB | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_HAS_HIGH_BATS | \
|
||||
CPU_FTR_COMMON)
|
||||
#define CPU_FTRS_E300C2 (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE | \
|
||||
#define CPU_FTRS_E300C2 (CPU_FTR_MAYBE_CAN_DOZE | \
|
||||
CPU_FTR_USE_TB | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_HAS_HIGH_BATS | \
|
||||
CPU_FTR_COMMON | CPU_FTR_FPU_UNAVAILABLE)
|
||||
#define CPU_FTRS_CLASSIC32 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \
|
||||
#define CPU_FTRS_CLASSIC32 (CPU_FTR_COMMON | \
|
||||
CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE)
|
||||
#define CPU_FTRS_8XX (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB)
|
||||
#define CPU_FTRS_40X (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \
|
||||
CPU_FTR_NODSISRALIGN)
|
||||
#define CPU_FTRS_44X (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \
|
||||
CPU_FTR_NODSISRALIGN)
|
||||
#define CPU_FTRS_E200 (CPU_FTR_USE_TB | CPU_FTR_NODSISRALIGN)
|
||||
#define CPU_FTRS_E500 (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \
|
||||
CPU_FTR_NODSISRALIGN)
|
||||
#define CPU_FTRS_E500_2 (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \
|
||||
#define CPU_FTRS_8XX (CPU_FTR_USE_TB)
|
||||
#define CPU_FTRS_40X (CPU_FTR_USE_TB | CPU_FTR_NODSISRALIGN)
|
||||
#define CPU_FTRS_44X (CPU_FTR_USE_TB | CPU_FTR_NODSISRALIGN)
|
||||
#define CPU_FTRS_E200 (CPU_FTR_USE_TB | CPU_FTR_NODSISRALIGN | \
|
||||
CPU_FTR_COHERENT_ICACHE | CPU_FTR_UNIFIED_ID_CACHE)
|
||||
#define CPU_FTRS_E500 (CPU_FTR_USE_TB | CPU_FTR_NODSISRALIGN)
|
||||
#define CPU_FTRS_E500_2 (CPU_FTR_USE_TB | \
|
||||
CPU_FTR_BIG_PHYS | CPU_FTR_NODSISRALIGN)
|
||||
#define CPU_FTRS_GENERIC_32 (CPU_FTR_COMMON | CPU_FTR_NODSISRALIGN)
|
||||
|
||||
/* 64-bit CPUs */
|
||||
#define CPU_FTRS_POWER3 (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \
|
||||
#define CPU_FTRS_POWER3 (CPU_FTR_USE_TB | \
|
||||
CPU_FTR_HPTE_TABLE | CPU_FTR_IABR | CPU_FTR_PPC_LE)
|
||||
#define CPU_FTRS_RS64 (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \
|
||||
#define CPU_FTRS_RS64 (CPU_FTR_USE_TB | \
|
||||
CPU_FTR_HPTE_TABLE | CPU_FTR_IABR | \
|
||||
CPU_FTR_MMCRA | CPU_FTR_CTRL)
|
||||
#define CPU_FTRS_POWER4 (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \
|
||||
#define CPU_FTRS_POWER4 (CPU_FTR_USE_TB | \
|
||||
CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \
|
||||
CPU_FTR_MMCRA)
|
||||
#define CPU_FTRS_PPC970 (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \
|
||||
#define CPU_FTRS_PPC970 (CPU_FTR_USE_TB | \
|
||||
CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \
|
||||
CPU_FTR_ALTIVEC_COMP | CPU_FTR_CAN_NAP | CPU_FTR_MMCRA)
|
||||
#define CPU_FTRS_POWER5 (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \
|
||||
#define CPU_FTRS_POWER5 (CPU_FTR_USE_TB | \
|
||||
CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \
|
||||
CPU_FTR_MMCRA | CPU_FTR_SMT | \
|
||||
CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE | \
|
||||
CPU_FTR_PURR)
|
||||
#define CPU_FTRS_POWER6 (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \
|
||||
#define CPU_FTRS_POWER6 (CPU_FTR_USE_TB | \
|
||||
CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \
|
||||
CPU_FTR_MMCRA | CPU_FTR_SMT | \
|
||||
CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE | \
|
||||
CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \
|
||||
CPU_FTR_DSCR)
|
||||
#define CPU_FTRS_CELL (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \
|
||||
#define CPU_FTRS_CELL (CPU_FTR_USE_TB | \
|
||||
CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \
|
||||
CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT | \
|
||||
CPU_FTR_PAUSE_ZERO | CPU_FTR_CI_LARGE_PAGE | CPU_FTR_CELL_TB_BUG)
|
||||
#define CPU_FTRS_PA6T (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \
|
||||
#define CPU_FTRS_PA6T (CPU_FTR_USE_TB | \
|
||||
CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | \
|
||||
CPU_FTR_ALTIVEC_COMP | CPU_FTR_CI_LARGE_PAGE | \
|
||||
CPU_FTR_PURR | CPU_FTR_REAL_LE)
|
||||
#define CPU_FTRS_COMPATIBLE (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \
|
||||
#define CPU_FTRS_COMPATIBLE (CPU_FTR_USE_TB | \
|
||||
CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2)
|
||||
|
||||
#ifdef __powerpc64__
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
#define fd_free_irq() free_irq(FLOPPY_IRQ, NULL);
|
||||
|
||||
#include <linux/pci.h>
|
||||
#include <asm/ppc-pci.h> /* for ppc64_isabridge_dev */
|
||||
#include <asm/ppc-pci.h> /* for isa_bridge_pcidev */
|
||||
|
||||
#define fd_dma_setup(addr,size,mode,io) fd_ops->_dma_setup(addr,size,mode,io)
|
||||
|
||||
@@ -139,12 +139,12 @@ static int hard_dma_setup(char *addr, unsigned long size, int mode, int io)
|
||||
if (bus_addr
|
||||
&& (addr != prev_addr || size != prev_size || dir != prev_dir)) {
|
||||
/* different from last time -- unmap prev */
|
||||
pci_unmap_single(ppc64_isabridge_dev, bus_addr, prev_size, prev_dir);
|
||||
pci_unmap_single(isa_bridge_pcidev, bus_addr, prev_size, prev_dir);
|
||||
bus_addr = 0;
|
||||
}
|
||||
|
||||
if (!bus_addr) /* need to map it */
|
||||
bus_addr = pci_map_single(ppc64_isabridge_dev, addr, size, dir);
|
||||
bus_addr = pci_map_single(isa_bridge_pcidev, addr, size, dir);
|
||||
|
||||
/* remember this one as prev */
|
||||
prev_addr = addr;
|
||||
|
||||
@@ -206,6 +206,7 @@
|
||||
#define H_FREE_LOGICAL_LAN_BUFFER 0x1D4
|
||||
#define H_QUERY_INT_STATE 0x1E4
|
||||
#define H_POLL_PENDING 0x1D8
|
||||
#define H_ILLAN_ATTRIBUTES 0x244
|
||||
#define H_JOIN 0x298
|
||||
#define H_VASI_STATE 0x2A4
|
||||
#define H_ENABLE_CRQ 0x2B0
|
||||
|
||||
@@ -607,9 +607,9 @@ static inline void iosync(void)
|
||||
*
|
||||
* * iounmap undoes such a mapping and can be hooked
|
||||
*
|
||||
* * __ioremap_explicit (and the pending __iounmap_explicit) are low level
|
||||
* functions to create hand-made mappings for use only by the PCI code
|
||||
* and cannot currently be hooked.
|
||||
* * __ioremap_at (and the pending __iounmap_at) are low level functions to
|
||||
* create hand-made mappings for use only by the PCI code and cannot
|
||||
* currently be hooked. Must be page aligned.
|
||||
*
|
||||
* * __ioremap is the low level implementation used by ioremap and
|
||||
* ioremap_flags and cannot be hooked (but can be used by a hook on one
|
||||
@@ -629,19 +629,9 @@ extern void __iomem *__ioremap(phys_addr_t, unsigned long size,
|
||||
unsigned long flags);
|
||||
extern void __iounmap(volatile void __iomem *addr);
|
||||
|
||||
extern int __ioremap_explicit(phys_addr_t p_addr, unsigned long v_addr,
|
||||
unsigned long size, unsigned long flags);
|
||||
extern int __iounmap_explicit(volatile void __iomem *start,
|
||||
unsigned long size);
|
||||
|
||||
extern void __iomem * reserve_phb_iospace(unsigned long size);
|
||||
|
||||
/* Those are more 32 bits only functions */
|
||||
extern unsigned long iopa(unsigned long addr);
|
||||
extern unsigned long mm_ptov(unsigned long addr) __attribute_const__;
|
||||
extern void io_block_mapping(unsigned long virt, phys_addr_t phys,
|
||||
unsigned int size, int flags);
|
||||
|
||||
extern void __iomem * __ioremap_at(phys_addr_t pa, void *ea,
|
||||
unsigned long size, unsigned long flags);
|
||||
extern void __iounmap_at(void *ea, unsigned long size);
|
||||
|
||||
/*
|
||||
* When CONFIG_PPC_INDIRECT_IO is set, we use the generic iomap implementation
|
||||
@@ -651,8 +641,8 @@ extern void io_block_mapping(unsigned long virt, phys_addr_t phys,
|
||||
*/
|
||||
#define HAVE_ARCH_PIO_SIZE 1
|
||||
#define PIO_OFFSET 0x00000000UL
|
||||
#define PIO_MASK 0x3fffffffUL
|
||||
#define PIO_RESERVED 0x40000000UL
|
||||
#define PIO_MASK (FULL_IO_SIZE - 1)
|
||||
#define PIO_RESERVED (FULL_IO_SIZE)
|
||||
|
||||
#define mmio_read16be(addr) readw_be(addr)
|
||||
#define mmio_read32be(addr) readl_be(addr)
|
||||
|
||||
@@ -223,6 +223,15 @@ extern void irq_dispose_mapping(unsigned int virq);
|
||||
extern unsigned int irq_find_mapping(struct irq_host *host,
|
||||
irq_hw_number_t hwirq);
|
||||
|
||||
/**
|
||||
* irq_create_direct_mapping - Allocate a virq for direct mapping
|
||||
* @host: host to allocate the virq for or NULL for default host
|
||||
*
|
||||
* This routine is used for irq controllers which can choose the hardware
|
||||
* interrupt numbers they generate. In such a case it's simplest to use
|
||||
* the linux virq as the hardware interrupt number.
|
||||
*/
|
||||
extern unsigned int irq_create_direct_mapping(struct irq_host *host);
|
||||
|
||||
/**
|
||||
* irq_radix_revmap - Find a linux virq from a hw irq number.
|
||||
|
||||
@@ -98,7 +98,7 @@ struct lppaca {
|
||||
u64 saved_gpr5; // Saved GPR5 x30-x37
|
||||
|
||||
u8 reserved4; // Reserved x38-x38
|
||||
u8 cpuctls_task_attrs; // Task attributes for cpuctls x39-x39
|
||||
u8 donate_dedicated_cpu; // Donate dedicated CPU cycles x39-x39
|
||||
u8 fpregs_in_use; // FP regs in use x3A-x3A
|
||||
u8 pmcregs_in_use; // PMC regs in use x3B-x3B
|
||||
volatile u32 saved_decr; // Saved Decr Value x3C-x3F
|
||||
|
||||
@@ -238,6 +238,7 @@ LV1_CALL(destruct_virtual_address_space, 1, 0, 10 )
|
||||
LV1_CALL(configure_irq_state_bitmap, 3, 0, 11 )
|
||||
LV1_CALL(connect_irq_plug_ext, 5, 0, 12 )
|
||||
LV1_CALL(release_memory, 1, 0, 13 )
|
||||
LV1_CALL(put_iopte, 5, 0, 15 )
|
||||
LV1_CALL(disconnect_irq_plug_ext, 3, 0, 17 )
|
||||
LV1_CALL(construct_event_receive_port, 0, 1, 18 )
|
||||
LV1_CALL(destruct_event_receive_port, 1, 0, 19 )
|
||||
@@ -268,6 +269,8 @@ LV1_CALL(remove_repository_node, 4, 0, 93 )
|
||||
LV1_CALL(read_htab_entries, 2, 5, 95 )
|
||||
LV1_CALL(set_dabr, 2, 0, 96 )
|
||||
LV1_CALL(get_total_execution_time, 2, 1, 103 )
|
||||
LV1_CALL(allocate_io_segment, 3, 1, 116 )
|
||||
LV1_CALL(release_io_segment, 2, 0, 117 )
|
||||
LV1_CALL(construct_io_irq_outlet, 1, 1, 120 )
|
||||
LV1_CALL(destruct_io_irq_outlet, 1, 0, 121 )
|
||||
LV1_CALL(map_htab, 1, 1, 122 )
|
||||
|
||||
@@ -218,7 +218,7 @@ struct machdep_calls {
|
||||
int (*pcibios_enable_device_hook)(struct pci_dev *, int initial);
|
||||
|
||||
/* Called in indirect_* to avoid touching devices */
|
||||
int (*pci_exclude_device)(unsigned char, unsigned char);
|
||||
int (*pci_exclude_device)(struct pci_controller *, unsigned char, unsigned char);
|
||||
|
||||
/* Called at then very end of pcibios_init() */
|
||||
void (*pcibios_after_init)(void);
|
||||
|
||||
147
include/asm-powerpc/mmu-8xx.h
Normal file
147
include/asm-powerpc/mmu-8xx.h
Normal file
@@ -0,0 +1,147 @@
|
||||
#ifndef _ASM_POWERPC_MMU_8XX_H_
|
||||
#define _ASM_POWERPC_MMU_8XX_H_
|
||||
/*
|
||||
* PPC8xx support
|
||||
*/
|
||||
|
||||
/* Control/status registers for the MPC8xx.
|
||||
* A write operation to these registers causes serialized access.
|
||||
* During software tablewalk, the registers used perform mask/shift-add
|
||||
* operations when written/read. A TLB entry is created when the Mx_RPN
|
||||
* is written, and the contents of several registers are used to
|
||||
* create the entry.
|
||||
*/
|
||||
#define SPRN_MI_CTR 784 /* Instruction TLB control register */
|
||||
#define MI_GPM 0x80000000 /* Set domain manager mode */
|
||||
#define MI_PPM 0x40000000 /* Set subpage protection */
|
||||
#define MI_CIDEF 0x20000000 /* Set cache inhibit when MMU dis */
|
||||
#define MI_RSV4I 0x08000000 /* Reserve 4 TLB entries */
|
||||
#define MI_PPCS 0x02000000 /* Use MI_RPN prob/priv state */
|
||||
#define MI_IDXMASK 0x00001f00 /* TLB index to be loaded */
|
||||
#define MI_RESETVAL 0x00000000 /* Value of register at reset */
|
||||
|
||||
/* These are the Ks and Kp from the PowerPC books. For proper operation,
|
||||
* Ks = 0, Kp = 1.
|
||||
*/
|
||||
#define SPRN_MI_AP 786
|
||||
#define MI_Ks 0x80000000 /* Should not be set */
|
||||
#define MI_Kp 0x40000000 /* Should always be set */
|
||||
|
||||
/* The effective page number register. When read, contains the information
|
||||
* about the last instruction TLB miss. When MI_RPN is written, bits in
|
||||
* this register are used to create the TLB entry.
|
||||
*/
|
||||
#define SPRN_MI_EPN 787
|
||||
#define MI_EPNMASK 0xfffff000 /* Effective page number for entry */
|
||||
#define MI_EVALID 0x00000200 /* Entry is valid */
|
||||
#define MI_ASIDMASK 0x0000000f /* ASID match value */
|
||||
/* Reset value is undefined */
|
||||
|
||||
/* A "level 1" or "segment" or whatever you want to call it register.
|
||||
* For the instruction TLB, it contains bits that get loaded into the
|
||||
* TLB entry when the MI_RPN is written.
|
||||
*/
|
||||
#define SPRN_MI_TWC 789
|
||||
#define MI_APG 0x000001e0 /* Access protection group (0) */
|
||||
#define MI_GUARDED 0x00000010 /* Guarded storage */
|
||||
#define MI_PSMASK 0x0000000c /* Mask of page size bits */
|
||||
#define MI_PS8MEG 0x0000000c /* 8M page size */
|
||||
#define MI_PS512K 0x00000004 /* 512K page size */
|
||||
#define MI_PS4K_16K 0x00000000 /* 4K or 16K page size */
|
||||
#define MI_SVALID 0x00000001 /* Segment entry is valid */
|
||||
/* Reset value is undefined */
|
||||
|
||||
/* Real page number. Defined by the pte. Writing this register
|
||||
* causes a TLB entry to be created for the instruction TLB, using
|
||||
* additional information from the MI_EPN, and MI_TWC registers.
|
||||
*/
|
||||
#define SPRN_MI_RPN 790
|
||||
|
||||
/* Define an RPN value for mapping kernel memory to large virtual
|
||||
* pages for boot initialization. This has real page number of 0,
|
||||
* large page size, shared page, cache enabled, and valid.
|
||||
* Also mark all subpages valid and write access.
|
||||
*/
|
||||
#define MI_BOOTINIT 0x000001fd
|
||||
|
||||
#define SPRN_MD_CTR 792 /* Data TLB control register */
|
||||
#define MD_GPM 0x80000000 /* Set domain manager mode */
|
||||
#define MD_PPM 0x40000000 /* Set subpage protection */
|
||||
#define MD_CIDEF 0x20000000 /* Set cache inhibit when MMU dis */
|
||||
#define MD_WTDEF 0x10000000 /* Set writethrough when MMU dis */
|
||||
#define MD_RSV4I 0x08000000 /* Reserve 4 TLB entries */
|
||||
#define MD_TWAM 0x04000000 /* Use 4K page hardware assist */
|
||||
#define MD_PPCS 0x02000000 /* Use MI_RPN prob/priv state */
|
||||
#define MD_IDXMASK 0x00001f00 /* TLB index to be loaded */
|
||||
#define MD_RESETVAL 0x04000000 /* Value of register at reset */
|
||||
|
||||
#define SPRN_M_CASID 793 /* Address space ID (context) to match */
|
||||
#define MC_ASIDMASK 0x0000000f /* Bits used for ASID value */
|
||||
|
||||
|
||||
/* These are the Ks and Kp from the PowerPC books. For proper operation,
|
||||
* Ks = 0, Kp = 1.
|
||||
*/
|
||||
#define SPRN_MD_AP 794
|
||||
#define MD_Ks 0x80000000 /* Should not be set */
|
||||
#define MD_Kp 0x40000000 /* Should always be set */
|
||||
|
||||
/* The effective page number register. When read, contains the information
|
||||
* about the last instruction TLB miss. When MD_RPN is written, bits in
|
||||
* this register are used to create the TLB entry.
|
||||
*/
|
||||
#define SPRN_MD_EPN 795
|
||||
#define MD_EPNMASK 0xfffff000 /* Effective page number for entry */
|
||||
#define MD_EVALID 0x00000200 /* Entry is valid */
|
||||
#define MD_ASIDMASK 0x0000000f /* ASID match value */
|
||||
/* Reset value is undefined */
|
||||
|
||||
/* The pointer to the base address of the first level page table.
|
||||
* During a software tablewalk, reading this register provides the address
|
||||
* of the entry associated with MD_EPN.
|
||||
*/
|
||||
#define SPRN_M_TWB 796
|
||||
#define M_L1TB 0xfffff000 /* Level 1 table base address */
|
||||
#define M_L1INDX 0x00000ffc /* Level 1 index, when read */
|
||||
/* Reset value is undefined */
|
||||
|
||||
/* A "level 1" or "segment" or whatever you want to call it register.
|
||||
* For the data TLB, it contains bits that get loaded into the TLB entry
|
||||
* when the MD_RPN is written. It is also provides the hardware assist
|
||||
* for finding the PTE address during software tablewalk.
|
||||
*/
|
||||
#define SPRN_MD_TWC 797
|
||||
#define MD_L2TB 0xfffff000 /* Level 2 table base address */
|
||||
#define MD_L2INDX 0xfffffe00 /* Level 2 index (*pte), when read */
|
||||
#define MD_APG 0x000001e0 /* Access protection group (0) */
|
||||
#define MD_GUARDED 0x00000010 /* Guarded storage */
|
||||
#define MD_PSMASK 0x0000000c /* Mask of page size bits */
|
||||
#define MD_PS8MEG 0x0000000c /* 8M page size */
|
||||
#define MD_PS512K 0x00000004 /* 512K page size */
|
||||
#define MD_PS4K_16K 0x00000000 /* 4K or 16K page size */
|
||||
#define MD_WT 0x00000002 /* Use writethrough page attribute */
|
||||
#define MD_SVALID 0x00000001 /* Segment entry is valid */
|
||||
/* Reset value is undefined */
|
||||
|
||||
|
||||
/* Real page number. Defined by the pte. Writing this register
|
||||
* causes a TLB entry to be created for the data TLB, using
|
||||
* additional information from the MD_EPN, and MD_TWC registers.
|
||||
*/
|
||||
#define SPRN_MD_RPN 798
|
||||
|
||||
/* This is a temporary storage register that could be used to save
|
||||
* a processor working register during a tablewalk.
|
||||
*/
|
||||
#define SPRN_M_TW 799
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
typedef unsigned long phys_addr_t;
|
||||
|
||||
typedef struct {
|
||||
unsigned long id;
|
||||
unsigned long vdso_base;
|
||||
} mm_context_t;
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
|
||||
#endif /* _ASM_POWERPC_MMU_8XX_H_ */
|
||||
88
include/asm-powerpc/mmu-fsl-booke.h
Normal file
88
include/asm-powerpc/mmu-fsl-booke.h
Normal file
@@ -0,0 +1,88 @@
|
||||
#ifndef _ASM_POWERPC_MMU_FSL_BOOKE_H_
|
||||
#define _ASM_POWERPC_MMU_FSL_BOOKE_H_
|
||||
/*
|
||||
* Freescale Book-E MMU support
|
||||
*/
|
||||
|
||||
/* Book-E defined page sizes */
|
||||
#define BOOKE_PAGESZ_1K 0
|
||||
#define BOOKE_PAGESZ_4K 1
|
||||
#define BOOKE_PAGESZ_16K 2
|
||||
#define BOOKE_PAGESZ_64K 3
|
||||
#define BOOKE_PAGESZ_256K 4
|
||||
#define BOOKE_PAGESZ_1M 5
|
||||
#define BOOKE_PAGESZ_4M 6
|
||||
#define BOOKE_PAGESZ_16M 7
|
||||
#define BOOKE_PAGESZ_64M 8
|
||||
#define BOOKE_PAGESZ_256M 9
|
||||
#define BOOKE_PAGESZ_1GB 10
|
||||
#define BOOKE_PAGESZ_4GB 11
|
||||
#define BOOKE_PAGESZ_16GB 12
|
||||
#define BOOKE_PAGESZ_64GB 13
|
||||
#define BOOKE_PAGESZ_256GB 14
|
||||
#define BOOKE_PAGESZ_1TB 15
|
||||
|
||||
#define MAS0_TLBSEL(x) ((x << 28) & 0x30000000)
|
||||
#define MAS0_ESEL(x) ((x << 16) & 0x0FFF0000)
|
||||
#define MAS0_NV(x) ((x) & 0x00000FFF)
|
||||
|
||||
#define MAS1_VALID 0x80000000
|
||||
#define MAS1_IPROT 0x40000000
|
||||
#define MAS1_TID(x) ((x << 16) & 0x3FFF0000)
|
||||
#define MAS1_TS 0x00001000
|
||||
#define MAS1_TSIZE(x) ((x << 8) & 0x00000F00)
|
||||
|
||||
#define MAS2_EPN 0xFFFFF000
|
||||
#define MAS2_X0 0x00000040
|
||||
#define MAS2_X1 0x00000020
|
||||
#define MAS2_W 0x00000010
|
||||
#define MAS2_I 0x00000008
|
||||
#define MAS2_M 0x00000004
|
||||
#define MAS2_G 0x00000002
|
||||
#define MAS2_E 0x00000001
|
||||
|
||||
#define MAS3_RPN 0xFFFFF000
|
||||
#define MAS3_U0 0x00000200
|
||||
#define MAS3_U1 0x00000100
|
||||
#define MAS3_U2 0x00000080
|
||||
#define MAS3_U3 0x00000040
|
||||
#define MAS3_UX 0x00000020
|
||||
#define MAS3_SX 0x00000010
|
||||
#define MAS3_UW 0x00000008
|
||||
#define MAS3_SW 0x00000004
|
||||
#define MAS3_UR 0x00000002
|
||||
#define MAS3_SR 0x00000001
|
||||
|
||||
#define MAS4_TLBSELD(x) MAS0_TLBSEL(x)
|
||||
#define MAS4_TIDDSEL 0x000F0000
|
||||
#define MAS4_TSIZED(x) MAS1_TSIZE(x)
|
||||
#define MAS4_X0D 0x00000040
|
||||
#define MAS4_X1D 0x00000020
|
||||
#define MAS4_WD 0x00000010
|
||||
#define MAS4_ID 0x00000008
|
||||
#define MAS4_MD 0x00000004
|
||||
#define MAS4_GD 0x00000002
|
||||
#define MAS4_ED 0x00000001
|
||||
|
||||
#define MAS6_SPID0 0x3FFF0000
|
||||
#define MAS6_SPID1 0x00007FFE
|
||||
#define MAS6_SAS 0x00000001
|
||||
#define MAS6_SPID MAS6_SPID0
|
||||
|
||||
#define MAS7_RPN 0xFFFFFFFF
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#ifndef CONFIG_PHYS_64BIT
|
||||
typedef unsigned long phys_addr_t;
|
||||
#else
|
||||
typedef unsigned long long phys_addr_t;
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
unsigned long id;
|
||||
unsigned long vdso_base;
|
||||
} mm_context_t;
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
|
||||
#endif /* _ASM_POWERPC_MMU_FSL_BOOKE_H_ */
|
||||
91
include/asm-powerpc/mmu-hash32.h
Normal file
91
include/asm-powerpc/mmu-hash32.h
Normal file
@@ -0,0 +1,91 @@
|
||||
#ifndef _ASM_POWERPC_MMU_HASH32_H_
|
||||
#define _ASM_POWERPC_MMU_HASH32_H_
|
||||
/*
|
||||
* 32-bit hash table MMU support
|
||||
*/
|
||||
|
||||
/*
|
||||
* BATs
|
||||
*/
|
||||
|
||||
/* Block size masks */
|
||||
#define BL_128K 0x000
|
||||
#define BL_256K 0x001
|
||||
#define BL_512K 0x003
|
||||
#define BL_1M 0x007
|
||||
#define BL_2M 0x00F
|
||||
#define BL_4M 0x01F
|
||||
#define BL_8M 0x03F
|
||||
#define BL_16M 0x07F
|
||||
#define BL_32M 0x0FF
|
||||
#define BL_64M 0x1FF
|
||||
#define BL_128M 0x3FF
|
||||
#define BL_256M 0x7FF
|
||||
|
||||
/* BAT Access Protection */
|
||||
#define BPP_XX 0x00 /* No access */
|
||||
#define BPP_RX 0x01 /* Read only */
|
||||
#define BPP_RW 0x02 /* Read/write */
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
struct ppc_bat {
|
||||
struct {
|
||||
unsigned long bepi:15; /* Effective page index (virtual address) */
|
||||
unsigned long :4; /* Unused */
|
||||
unsigned long bl:11; /* Block size mask */
|
||||
unsigned long vs:1; /* Supervisor valid */
|
||||
unsigned long vp:1; /* User valid */
|
||||
} batu; /* Upper register */
|
||||
struct {
|
||||
unsigned long brpn:15; /* Real page index (physical address) */
|
||||
unsigned long :10; /* Unused */
|
||||
unsigned long w:1; /* Write-thru cache */
|
||||
unsigned long i:1; /* Cache inhibit */
|
||||
unsigned long m:1; /* Memory coherence */
|
||||
unsigned long g:1; /* Guarded (MBZ in IBAT) */
|
||||
unsigned long :1; /* Unused */
|
||||
unsigned long pp:2; /* Page access protections */
|
||||
} batl; /* Lower register */
|
||||
};
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
|
||||
/*
|
||||
* Hash table
|
||||
*/
|
||||
|
||||
/* Values for PP (assumes Ks=0, Kp=1) */
|
||||
#define PP_RWXX 0 /* Supervisor read/write, User none */
|
||||
#define PP_RWRX 1 /* Supervisor read/write, User read */
|
||||
#define PP_RWRW 2 /* Supervisor read/write, User read/write */
|
||||
#define PP_RXRX 3 /* Supervisor read, User read */
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
/* Hardware Page Table Entry */
|
||||
struct hash_pte {
|
||||
unsigned long v:1; /* Entry is valid */
|
||||
unsigned long vsid:24; /* Virtual segment identifier */
|
||||
unsigned long h:1; /* Hash algorithm indicator */
|
||||
unsigned long api:6; /* Abbreviated page index */
|
||||
unsigned long rpn:20; /* Real (physical) page number */
|
||||
unsigned long :3; /* Unused */
|
||||
unsigned long r:1; /* Referenced */
|
||||
unsigned long c:1; /* Changed */
|
||||
unsigned long w:1; /* Write-thru cache mode */
|
||||
unsigned long i:1; /* Cache inhibited */
|
||||
unsigned long m:1; /* Memory coherence */
|
||||
unsigned long g:1; /* Guarded */
|
||||
unsigned long :1; /* Unused */
|
||||
unsigned long pp:2; /* Page protection */
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
unsigned long id;
|
||||
unsigned long vdso_base;
|
||||
} mm_context_t;
|
||||
|
||||
typedef unsigned long phys_addr_t;
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
|
||||
#endif /* _ASM_POWERPC_MMU_HASH32_H_ */
|
||||
@@ -94,6 +94,9 @@ extern char initial_stab[];
|
||||
#define HPTE_R_C ASM_CONST(0x0000000000000080)
|
||||
#define HPTE_R_R ASM_CONST(0x0000000000000100)
|
||||
|
||||
#define HPTE_V_1TB_SEG ASM_CONST(0x4000000000000000)
|
||||
#define HPTE_V_VRMA_MASK ASM_CONST(0x4001ffffff000000)
|
||||
|
||||
/* Values for PP (assumes Ks=0, Kp=1) */
|
||||
/* pp0 will always be 0 for linux */
|
||||
#define PP_RWXX 0 /* Supervisor read/write, User none */
|
||||
@@ -103,12 +106,12 @@ extern char initial_stab[];
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
typedef struct {
|
||||
struct hash_pte {
|
||||
unsigned long v;
|
||||
unsigned long r;
|
||||
} hpte_t;
|
||||
};
|
||||
|
||||
extern hpte_t *htab_address;
|
||||
extern struct hash_pte *htab_address;
|
||||
extern unsigned long htab_size_bytes;
|
||||
extern unsigned long htab_hash_mask;
|
||||
|
||||
|
||||
@@ -5,13 +5,18 @@
|
||||
#ifdef CONFIG_PPC64
|
||||
/* 64-bit classic hash table MMU */
|
||||
# include <asm/mmu-hash64.h>
|
||||
#elif defined(CONFIG_PPC_STD_MMU)
|
||||
/* 32-bit classic hash table MMU */
|
||||
# include <asm/mmu-hash32.h>
|
||||
#elif defined(CONFIG_44x)
|
||||
/* 44x-style software loaded TLB */
|
||||
# include <asm/mmu-44x.h>
|
||||
#else
|
||||
/* Other 32-bit. FIXME: split up the other 32-bit MMU types, and
|
||||
* revise for arch/powerpc */
|
||||
# include <asm-ppc/mmu.h>
|
||||
#elif defined(CONFIG_FSL_BOOKE)
|
||||
/* Freescale Book-E software loaded TLB */
|
||||
# include <asm/mmu-fsl-booke.h>
|
||||
#elif defined (CONFIG_PPC_8xx)
|
||||
/* Motorola/Freescale 8xx software loaded TLB */
|
||||
# include <asm/mmu-8xx.h>
|
||||
#endif
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
@@ -2,16 +2,210 @@
|
||||
#define __ASM_POWERPC_MMU_CONTEXT_H
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#include <asm/mmu.h>
|
||||
#include <asm/cputable.h>
|
||||
#include <asm-generic/mm_hooks.h>
|
||||
|
||||
#ifndef CONFIG_PPC64
|
||||
#include <asm-ppc/mmu_context.h>
|
||||
#include <asm/atomic.h>
|
||||
#include <asm/bitops.h>
|
||||
|
||||
/*
|
||||
* On 32-bit PowerPC 6xx/7xx/7xxx CPUs, we use a set of 16 VSIDs
|
||||
* (virtual segment identifiers) for each context. Although the
|
||||
* hardware supports 24-bit VSIDs, and thus >1 million contexts,
|
||||
* we only use 32,768 of them. That is ample, since there can be
|
||||
* at most around 30,000 tasks in the system anyway, and it means
|
||||
* that we can use a bitmap to indicate which contexts are in use.
|
||||
* Using a bitmap means that we entirely avoid all of the problems
|
||||
* that we used to have when the context number overflowed,
|
||||
* particularly on SMP systems.
|
||||
* -- paulus.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This function defines the mapping from contexts to VSIDs (virtual
|
||||
* segment IDs). We use a skew on both the context and the high 4 bits
|
||||
* of the 32-bit virtual address (the "effective segment ID") in order
|
||||
* to spread out the entries in the MMU hash table. Note, if this
|
||||
* function is changed then arch/ppc/mm/hashtable.S will have to be
|
||||
* changed to correspond.
|
||||
*/
|
||||
#define CTX_TO_VSID(ctx, va) (((ctx) * (897 * 16) + ((va) >> 28) * 0x111) \
|
||||
& 0xffffff)
|
||||
|
||||
/*
|
||||
The MPC8xx has only 16 contexts. We rotate through them on each
|
||||
task switch. A better way would be to keep track of tasks that
|
||||
own contexts, and implement an LRU usage. That way very active
|
||||
tasks don't always have to pay the TLB reload overhead. The
|
||||
kernel pages are mapped shared, so the kernel can run on behalf
|
||||
of any task that makes a kernel entry. Shared does not mean they
|
||||
are not protected, just that the ASID comparison is not performed.
|
||||
-- Dan
|
||||
|
||||
The IBM4xx has 256 contexts, so we can just rotate through these
|
||||
as a way of "switching" contexts. If the TID of the TLB is zero,
|
||||
the PID/TID comparison is disabled, so we can use a TID of zero
|
||||
to represent all kernel pages as shared among all contexts.
|
||||
-- Dan
|
||||
*/
|
||||
|
||||
static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk)
|
||||
{
|
||||
}
|
||||
|
||||
#ifdef CONFIG_8xx
|
||||
#define NO_CONTEXT 16
|
||||
#define LAST_CONTEXT 15
|
||||
#define FIRST_CONTEXT 0
|
||||
|
||||
#elif defined(CONFIG_4xx)
|
||||
#define NO_CONTEXT 256
|
||||
#define LAST_CONTEXT 255
|
||||
#define FIRST_CONTEXT 1
|
||||
|
||||
#elif defined(CONFIG_E200) || defined(CONFIG_E500)
|
||||
#define NO_CONTEXT 256
|
||||
#define LAST_CONTEXT 255
|
||||
#define FIRST_CONTEXT 1
|
||||
|
||||
#else
|
||||
|
||||
/* PPC 6xx, 7xx CPUs */
|
||||
#define NO_CONTEXT ((unsigned long) -1)
|
||||
#define LAST_CONTEXT 32767
|
||||
#define FIRST_CONTEXT 1
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Set the current MMU context.
|
||||
* On 32-bit PowerPCs (other than the 8xx embedded chips), this is done by
|
||||
* loading up the segment registers for the user part of the address space.
|
||||
*
|
||||
* Since the PGD is immediately available, it is much faster to simply
|
||||
* pass this along as a second parameter, which is required for 8xx and
|
||||
* can be used for debugging on all processors (if you happen to have
|
||||
* an Abatron).
|
||||
*/
|
||||
extern void set_context(unsigned long contextid, pgd_t *pgd);
|
||||
|
||||
/*
|
||||
* Bitmap of contexts in use.
|
||||
* The size of this bitmap is LAST_CONTEXT + 1 bits.
|
||||
*/
|
||||
extern unsigned long context_map[];
|
||||
|
||||
/*
|
||||
* This caches the next context number that we expect to be free.
|
||||
* Its use is an optimization only, we can't rely on this context
|
||||
* number to be free, but it usually will be.
|
||||
*/
|
||||
extern unsigned long next_mmu_context;
|
||||
|
||||
/*
|
||||
* If we don't have sufficient contexts to give one to every task
|
||||
* that could be in the system, we need to be able to steal contexts.
|
||||
* These variables support that.
|
||||
*/
|
||||
#if LAST_CONTEXT < 30000
|
||||
#define FEW_CONTEXTS 1
|
||||
extern atomic_t nr_free_contexts;
|
||||
extern struct mm_struct *context_mm[LAST_CONTEXT+1];
|
||||
extern void steal_context(void);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Get a new mmu context for the address space described by `mm'.
|
||||
*/
|
||||
static inline void get_mmu_context(struct mm_struct *mm)
|
||||
{
|
||||
unsigned long ctx;
|
||||
|
||||
if (mm->context.id != NO_CONTEXT)
|
||||
return;
|
||||
#ifdef FEW_CONTEXTS
|
||||
while (atomic_dec_if_positive(&nr_free_contexts) < 0)
|
||||
steal_context();
|
||||
#endif
|
||||
ctx = next_mmu_context;
|
||||
while (test_and_set_bit(ctx, context_map)) {
|
||||
ctx = find_next_zero_bit(context_map, LAST_CONTEXT+1, ctx);
|
||||
if (ctx > LAST_CONTEXT)
|
||||
ctx = 0;
|
||||
}
|
||||
next_mmu_context = (ctx + 1) & LAST_CONTEXT;
|
||||
mm->context.id = ctx;
|
||||
#ifdef FEW_CONTEXTS
|
||||
context_mm[ctx] = mm;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* Set up the context for a new address space.
|
||||
*/
|
||||
static inline int init_new_context(struct task_struct *t, struct mm_struct *mm)
|
||||
{
|
||||
mm->context.id = NO_CONTEXT;
|
||||
mm->context.vdso_base = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* We're finished using the context for an address space.
|
||||
*/
|
||||
static inline void destroy_context(struct mm_struct *mm)
|
||||
{
|
||||
preempt_disable();
|
||||
if (mm->context.id != NO_CONTEXT) {
|
||||
clear_bit(mm->context.id, context_map);
|
||||
mm->context.id = NO_CONTEXT;
|
||||
#ifdef FEW_CONTEXTS
|
||||
atomic_inc(&nr_free_contexts);
|
||||
#endif
|
||||
}
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
|
||||
struct task_struct *tsk)
|
||||
{
|
||||
#ifdef CONFIG_ALTIVEC
|
||||
if (cpu_has_feature(CPU_FTR_ALTIVEC))
|
||||
asm volatile ("dssall;\n"
|
||||
#ifndef CONFIG_POWER4
|
||||
"sync;\n" /* G4 needs a sync here, G5 apparently not */
|
||||
#endif
|
||||
: : );
|
||||
#endif /* CONFIG_ALTIVEC */
|
||||
|
||||
tsk->thread.pgdir = next->pgd;
|
||||
|
||||
/* No need to flush userspace segments if the mm doesnt change */
|
||||
if (prev == next)
|
||||
return;
|
||||
|
||||
/* Setup new userspace context */
|
||||
get_mmu_context(next);
|
||||
set_context(next->context.id, next->pgd);
|
||||
}
|
||||
|
||||
#define deactivate_mm(tsk,mm) do { } while (0)
|
||||
|
||||
/*
|
||||
* After we have set current->mm to a new value, this activates
|
||||
* the context for the new mm so we see the new mappings.
|
||||
*/
|
||||
#define activate_mm(active_mm, mm) switch_mm(active_mm, mm, current)
|
||||
|
||||
extern void mmu_context_init(void);
|
||||
|
||||
|
||||
#else
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/sched.h>
|
||||
#include <asm/mmu.h>
|
||||
#include <asm/cputable.h>
|
||||
#include <asm-generic/mm_hooks.h>
|
||||
|
||||
/*
|
||||
* Copyright (C) 2001 PPC 64 Team, IBM Corp
|
||||
|
||||
@@ -19,12 +19,6 @@
|
||||
|
||||
#ifdef CONFIG_PPC_86xx
|
||||
|
||||
#define _IO_BASE isa_io_base
|
||||
#define _ISA_MEM_BASE isa_mem_base
|
||||
#ifdef CONFIG_PCI
|
||||
#define PCI_DRAM_OFFSET pci_dram_offset
|
||||
#endif
|
||||
|
||||
#define CPU0_BOOT_RELEASE 0x01000000
|
||||
#define CPU1_BOOT_RELEASE 0x02000000
|
||||
#define CPU_ALL_RELEASED (CPU0_BOOT_RELEASE | CPU1_BOOT_RELEASE)
|
||||
|
||||
@@ -23,6 +23,10 @@
|
||||
#include <platforms/8xx/mpc885ads.h>
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PCMCIA_M8XX
|
||||
extern struct mpc8xx_pcmcia_ops m8xx_pcmcia_ops;
|
||||
#endif
|
||||
|
||||
#endif /* CONFIG_8xx */
|
||||
#endif /* __CONFIG_8xx_DEFS */
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
@@ -2,12 +2,91 @@
|
||||
#define _ASM_POWERPC_PCI_BRIDGE_H
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#ifndef CONFIG_PPC64
|
||||
#include <asm-ppc/pci-bridge.h>
|
||||
#else
|
||||
|
||||
#include <linux/pci.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/ioport.h>
|
||||
|
||||
#ifndef CONFIG_PPC64
|
||||
|
||||
struct device_node;
|
||||
struct pci_controller;
|
||||
|
||||
/*
|
||||
* Structure of a PCI controller (host bridge)
|
||||
*/
|
||||
struct pci_controller {
|
||||
struct pci_bus *bus;
|
||||
char is_dynamic;
|
||||
void *arch_data;
|
||||
struct list_head list_node;
|
||||
struct device *parent;
|
||||
|
||||
int first_busno;
|
||||
int last_busno;
|
||||
int self_busno;
|
||||
|
||||
void __iomem *io_base_virt;
|
||||
resource_size_t io_base_phys;
|
||||
|
||||
/* Some machines (PReP) have a non 1:1 mapping of
|
||||
* the PCI memory space in the CPU bus space
|
||||
*/
|
||||
resource_size_t pci_mem_offset;
|
||||
|
||||
struct pci_ops *ops;
|
||||
volatile unsigned int __iomem *cfg_addr;
|
||||
volatile void __iomem *cfg_data;
|
||||
|
||||
/*
|
||||
* Used for variants of PCI indirect handling and possible quirks:
|
||||
* SET_CFG_TYPE - used on 4xx or any PHB that does explicit type0/1
|
||||
* EXT_REG - provides access to PCI-e extended registers
|
||||
* SURPRESS_PRIMARY_BUS - we surpress the setting of PCI_PRIMARY_BUS
|
||||
* on Freescale PCI-e controllers since they used the PCI_PRIMARY_BUS
|
||||
* to determine which bus number to match on when generating type0
|
||||
* config cycles
|
||||
*/
|
||||
#define PPC_INDIRECT_TYPE_SET_CFG_TYPE (0x00000001)
|
||||
#define PPC_INDIRECT_TYPE_EXT_REG (0x00000002)
|
||||
#define PPC_INDIRECT_TYPE_SURPRESS_PRIMARY_BUS (0x00000004)
|
||||
u32 indirect_type;
|
||||
|
||||
/* Currently, we limit ourselves to 1 IO range and 3 mem
|
||||
* ranges since the common pci_bus structure can't handle more
|
||||
*/
|
||||
struct resource io_resource;
|
||||
struct resource mem_resources[3];
|
||||
int global_number; /* PCI domain number */
|
||||
};
|
||||
|
||||
static inline struct pci_controller *pci_bus_to_host(struct pci_bus *bus)
|
||||
{
|
||||
return bus->sysdata;
|
||||
}
|
||||
|
||||
/* These are used for config access before all the PCI probing
|
||||
has been done. */
|
||||
int early_read_config_byte(struct pci_controller *hose, int bus, int dev_fn,
|
||||
int where, u8 *val);
|
||||
int early_read_config_word(struct pci_controller *hose, int bus, int dev_fn,
|
||||
int where, u16 *val);
|
||||
int early_read_config_dword(struct pci_controller *hose, int bus, int dev_fn,
|
||||
int where, u32 *val);
|
||||
int early_write_config_byte(struct pci_controller *hose, int bus, int dev_fn,
|
||||
int where, u8 val);
|
||||
int early_write_config_word(struct pci_controller *hose, int bus, int dev_fn,
|
||||
int where, u16 val);
|
||||
int early_write_config_dword(struct pci_controller *hose, int bus, int dev_fn,
|
||||
int where, u32 val);
|
||||
|
||||
extern void setup_indirect_pci_nomap(struct pci_controller* hose,
|
||||
void __iomem *cfg_addr, void __iomem *cfg_data);
|
||||
extern void setup_indirect_pci(struct pci_controller* hose,
|
||||
u32 cfg_addr, u32 cfg_data);
|
||||
extern void setup_grackle(struct pci_controller *hose);
|
||||
|
||||
#else
|
||||
|
||||
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
@@ -31,6 +110,7 @@ struct pci_controller {
|
||||
int last_busno;
|
||||
|
||||
void __iomem *io_base_virt;
|
||||
void *io_base_alloc;
|
||||
resource_size_t io_base_phys;
|
||||
|
||||
/* Some machines have a non 1:1 mapping of
|
||||
@@ -48,8 +128,7 @@ struct pci_controller {
|
||||
*/
|
||||
struct resource io_resource;
|
||||
struct resource mem_resources[3];
|
||||
int global_number;
|
||||
int local_number;
|
||||
int global_number;
|
||||
unsigned long buid;
|
||||
unsigned long dma_window_base_cur;
|
||||
unsigned long dma_window_size;
|
||||
@@ -70,19 +149,22 @@ struct pci_dn {
|
||||
int devfn; /* pci device and function number */
|
||||
int class_code; /* pci device class */
|
||||
|
||||
#ifdef CONFIG_PPC_PSERIES
|
||||
struct pci_controller *phb; /* for pci devices */
|
||||
struct iommu_table *iommu_table; /* for phb's or bridges */
|
||||
struct pci_dev *pcidev; /* back-pointer to the pci device */
|
||||
struct device_node *node; /* back-pointer to the device_node */
|
||||
|
||||
int pci_ext_config_space; /* for pci devices */
|
||||
|
||||
#ifdef CONFIG_EEH
|
||||
int eeh_mode; /* See eeh.h for possible EEH_MODEs */
|
||||
int eeh_config_addr;
|
||||
int eeh_pe_config_addr; /* new-style partition endpoint address */
|
||||
int eeh_check_count; /* # times driver ignored error */
|
||||
int eeh_freeze_count; /* # times this device froze up. */
|
||||
#endif
|
||||
int pci_ext_config_space; /* for pci devices */
|
||||
struct pci_controller *phb; /* for pci devices */
|
||||
struct iommu_table *iommu_table; /* for phb's or bridges */
|
||||
struct pci_dev *pcidev; /* back-pointer to the pci device */
|
||||
struct device_node *node; /* back-pointer to the device_node */
|
||||
int eeh_false_positives; /* # times this device reported #ff's */
|
||||
u32 config_space[16]; /* saved PCI config space */
|
||||
#endif
|
||||
};
|
||||
|
||||
/* Get the pointer to a device_node's pci_dn */
|
||||
@@ -128,9 +210,6 @@ static inline struct device_node *pci_bus_to_OF_node(struct pci_bus *bus)
|
||||
/** Find the bus corresponding to the indicated device node */
|
||||
struct pci_bus * pcibios_find_pci_bus(struct device_node *dn);
|
||||
|
||||
extern void pci_process_bridge_OF_ranges(struct pci_controller *hose,
|
||||
struct device_node *dev, int primary);
|
||||
|
||||
/** Remove all of the PCI devices under this bus */
|
||||
void pcibios_remove_pci_devices(struct pci_bus *bus);
|
||||
|
||||
@@ -148,21 +227,12 @@ static inline struct pci_controller *pci_bus_to_host(struct pci_bus *bus)
|
||||
return PCI_DN(busdn)->phb;
|
||||
}
|
||||
|
||||
extern struct pci_controller*
|
||||
pci_find_hose_for_OF_device(struct device_node* node);
|
||||
|
||||
extern struct pci_controller *
|
||||
pcibios_alloc_controller(struct device_node *dev);
|
||||
extern void pcibios_free_controller(struct pci_controller *phb);
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
extern unsigned long pci_address_to_pio(phys_addr_t address);
|
||||
#else
|
||||
static inline unsigned long pci_address_to_pio(phys_addr_t address)
|
||||
{
|
||||
return (unsigned long)-1;
|
||||
}
|
||||
#endif
|
||||
extern void isa_bridge_find_early(struct pci_controller *hose);
|
||||
|
||||
extern int pcibios_unmap_io_space(struct pci_bus *bus);
|
||||
extern int pcibios_map_io_space(struct pci_bus *bus);
|
||||
|
||||
/* Return values for ppc_md.pci_probe_mode function */
|
||||
#define PCI_PROBE_NONE -1 /* Don't look at this bus at all */
|
||||
@@ -176,5 +246,29 @@ static inline unsigned long pci_address_to_pio(phys_addr_t address)
|
||||
#endif
|
||||
|
||||
#endif /* CONFIG_PPC64 */
|
||||
|
||||
/* Get the PCI host controller for an OF device */
|
||||
extern struct pci_controller*
|
||||
pci_find_hose_for_OF_device(struct device_node* node);
|
||||
|
||||
/* Fill up host controller resources from the OF node */
|
||||
extern void
|
||||
pci_process_bridge_OF_ranges(struct pci_controller *hose,
|
||||
struct device_node *dev, int primary);
|
||||
|
||||
/* Allocate a new PCI host bridge structure */
|
||||
extern struct pci_controller *
|
||||
pcibios_alloc_controller(struct device_node *dev);
|
||||
#ifdef CONFIG_PCI
|
||||
extern unsigned long pci_address_to_pio(phys_addr_t address);
|
||||
#else
|
||||
static inline unsigned long pci_address_to_pio(phys_addr_t address)
|
||||
{
|
||||
return (unsigned long)-1;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif
|
||||
|
||||
@@ -95,8 +95,6 @@ static inline void pci_dma_burst_advice(struct pci_dev *pdev,
|
||||
#define get_pci_dma_ops() NULL
|
||||
#endif
|
||||
|
||||
extern int pci_domain_nr(struct pci_bus *bus);
|
||||
|
||||
/* Decide whether to display the domain number in /proc */
|
||||
extern int pci_proc_domain(struct pci_bus *bus);
|
||||
|
||||
@@ -112,9 +110,6 @@ static inline void pci_dma_burst_advice(struct pci_dev *pdev,
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Return the index of the PCI controller for device PDEV. */
|
||||
#define pci_domain_nr(bus) ((struct pci_controller *)(bus)->sysdata)->index
|
||||
|
||||
/* Set the name of the bus as it appears in /proc/bus/pci */
|
||||
static inline int pci_proc_domain(struct pci_bus *bus)
|
||||
{
|
||||
@@ -123,6 +118,8 @@ static inline int pci_proc_domain(struct pci_bus *bus)
|
||||
|
||||
#endif /* CONFIG_PPC64 */
|
||||
|
||||
extern int pci_domain_nr(struct pci_bus *bus);
|
||||
|
||||
struct vm_area_struct;
|
||||
/* Map a range of PCI memory or I/O space for a device into user space */
|
||||
int pci_mmap_page_range(struct pci_dev *pdev, struct vm_area_struct *vma,
|
||||
@@ -202,10 +199,6 @@ static inline struct resource *pcibios_select_root(struct pci_dev *pdev,
|
||||
return root;
|
||||
}
|
||||
|
||||
extern int unmap_bus_range(struct pci_bus *bus);
|
||||
|
||||
extern int remap_bus_range(struct pci_bus *bus);
|
||||
|
||||
extern void pcibios_fixup_device_resources(struct pci_dev *dev,
|
||||
struct pci_bus *bus);
|
||||
|
||||
|
||||
@@ -6,11 +6,7 @@
|
||||
#ifndef __ASSEMBLY__
|
||||
#include <linux/sched.h>
|
||||
#include <linux/threads.h>
|
||||
#include <asm/processor.h> /* For TASK_SIZE */
|
||||
#include <asm/mmu.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/io.h> /* For sub-arch specific PPC_PIN_SIZE */
|
||||
struct mm_struct;
|
||||
|
||||
extern unsigned long va_to_phys(unsigned long address);
|
||||
extern pte_t *va_to_pte(unsigned long address);
|
||||
@@ -488,14 +484,6 @@ extern unsigned long bad_call_to_PMD_PAGE_SIZE(void);
|
||||
#define pfn_pte(pfn, prot) __pte(((pte_basic_t)(pfn) << PFN_SHIFT_OFFSET) |\
|
||||
pgprot_val(prot))
|
||||
#define mk_pte(page, prot) pfn_pte(page_to_pfn(page), prot)
|
||||
|
||||
/*
|
||||
* ZERO_PAGE is a global shared page that is always zero: used
|
||||
* for zero-mapped memory areas etc..
|
||||
*/
|
||||
extern unsigned long empty_zero_page[1024];
|
||||
#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#define pte_none(pte) ((pte_val(pte) & ~_PTE_NONE_MASK) == 0)
|
||||
@@ -724,10 +712,6 @@ extern pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn,
|
||||
#define pte_unmap(pte) kunmap_atomic(pte, KM_PTE0)
|
||||
#define pte_unmap_nested(pte) kunmap_atomic(pte, KM_PTE1)
|
||||
|
||||
extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
|
||||
|
||||
extern void paging_init(void);
|
||||
|
||||
/*
|
||||
* Encode and decode a swap entry.
|
||||
* Note that the bits we use in a PTE for representing a swap entry
|
||||
@@ -745,40 +729,6 @@ extern void paging_init(void);
|
||||
#define pte_to_pgoff(pte) (pte_val(pte) >> 3)
|
||||
#define pgoff_to_pte(off) ((pte_t) { ((off) << 3) | _PAGE_FILE })
|
||||
|
||||
/* CONFIG_APUS */
|
||||
/* For virtual address to physical address conversion */
|
||||
extern void cache_clear(__u32 addr, int length);
|
||||
extern void cache_push(__u32 addr, int length);
|
||||
extern int mm_end_of_chunk (unsigned long addr, int len);
|
||||
extern unsigned long iopa(unsigned long addr);
|
||||
extern unsigned long mm_ptov(unsigned long addr) __attribute_const__;
|
||||
|
||||
/* Values for nocacheflag and cmode */
|
||||
/* These are not used by the APUS kernel_map, but prevents
|
||||
compilation errors. */
|
||||
#define KERNELMAP_FULL_CACHING 0
|
||||
#define KERNELMAP_NOCACHE_SER 1
|
||||
#define KERNELMAP_NOCACHE_NONSER 2
|
||||
#define KERNELMAP_NO_COPYBACK 3
|
||||
|
||||
/*
|
||||
* Map some physical address range into the kernel address space.
|
||||
*/
|
||||
extern unsigned long kernel_map(unsigned long paddr, unsigned long size,
|
||||
int nocacheflag, unsigned long *memavailp );
|
||||
|
||||
/*
|
||||
* Set cache mode of (kernel space) address range.
|
||||
*/
|
||||
extern void kernel_set_cachemode (unsigned long address, unsigned long size,
|
||||
unsigned int cmode);
|
||||
|
||||
/* Needs to be defined here and not in linux/mm.h, as it is arch dependent */
|
||||
#define kern_addr_valid(addr) (1)
|
||||
|
||||
#define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \
|
||||
remap_pfn_range(vma, vaddr, pfn, size, prot)
|
||||
|
||||
/*
|
||||
* No page table caches to initialise
|
||||
*/
|
||||
|
||||
@@ -7,11 +7,7 @@
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#include <linux/stddef.h>
|
||||
#include <asm/processor.h> /* For TASK_SIZE */
|
||||
#include <asm/mmu.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/tlbflush.h>
|
||||
struct mm_struct;
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#ifdef CONFIG_PPC_64K_PAGES
|
||||
@@ -27,7 +23,7 @@ struct mm_struct;
|
||||
*/
|
||||
#define PGTABLE_EADDR_SIZE (PTE_INDEX_SIZE + PMD_INDEX_SIZE + \
|
||||
PUD_INDEX_SIZE + PGD_INDEX_SIZE + PAGE_SHIFT)
|
||||
#define PGTABLE_RANGE (1UL << PGTABLE_EADDR_SIZE)
|
||||
#define PGTABLE_RANGE (ASM_CONST(1) << PGTABLE_EADDR_SIZE)
|
||||
|
||||
#if TASK_SIZE_USER64 > PGTABLE_RANGE
|
||||
#error TASK_SIZE_USER64 exceeds pagetable range
|
||||
@@ -37,19 +33,28 @@ struct mm_struct;
|
||||
#error TASK_SIZE_USER64 exceeds user VSID range
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Define the address range of the vmalloc VM area.
|
||||
*/
|
||||
#define VMALLOC_START ASM_CONST(0xD000000000000000)
|
||||
#define VMALLOC_SIZE ASM_CONST(0x80000000000)
|
||||
#define VMALLOC_SIZE (PGTABLE_RANGE >> 1)
|
||||
#define VMALLOC_END (VMALLOC_START + VMALLOC_SIZE)
|
||||
|
||||
/*
|
||||
* Define the address range of the imalloc VM area.
|
||||
* Define the address ranges for MMIO and IO space :
|
||||
*
|
||||
* ISA_IO_BASE = VMALLOC_END, 64K reserved area
|
||||
* PHB_IO_BASE = ISA_IO_BASE + 64K to ISA_IO_BASE + 2G, PHB IO spaces
|
||||
* IOREMAP_BASE = ISA_IO_BASE + 2G to VMALLOC_START + PGTABLE_RANGE
|
||||
*/
|
||||
#define PHBS_IO_BASE VMALLOC_END
|
||||
#define IMALLOC_BASE (PHBS_IO_BASE + 0x80000000ul) /* Reserve 2 gigs for PHBs */
|
||||
#define IMALLOC_END (VMALLOC_START + PGTABLE_RANGE)
|
||||
#define FULL_IO_SIZE 0x80000000ul
|
||||
#define ISA_IO_BASE (VMALLOC_END)
|
||||
#define ISA_IO_END (VMALLOC_END + 0x10000ul)
|
||||
#define PHB_IO_BASE (ISA_IO_END)
|
||||
#define PHB_IO_END (VMALLOC_END + FULL_IO_SIZE)
|
||||
#define IOREMAP_BASE (PHB_IO_END)
|
||||
#define IOREMAP_END (VMALLOC_START + PGTABLE_RANGE)
|
||||
|
||||
/*
|
||||
* Region IDs
|
||||
@@ -134,16 +139,6 @@ struct mm_struct;
|
||||
#define __S110 PAGE_SHARED_X
|
||||
#define __S111 PAGE_SHARED_X
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
/*
|
||||
* ZERO_PAGE is a global shared page that is always zero: used
|
||||
* for zero-mapped memory areas etc..
|
||||
*/
|
||||
extern unsigned long empty_zero_page[PAGE_SIZE/sizeof(unsigned long)];
|
||||
#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#ifdef CONFIG_HUGETLB_PAGE
|
||||
|
||||
#define HAVE_ARCH_UNMAPPED_AREA
|
||||
@@ -432,10 +427,6 @@ extern pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn,
|
||||
#define pgd_ERROR(e) \
|
||||
printk("%s:%d: bad pgd %08lx.\n", __FILE__, __LINE__, pgd_val(e))
|
||||
|
||||
extern pgd_t swapper_pg_dir[];
|
||||
|
||||
extern void paging_init(void);
|
||||
|
||||
/* Encode and de-code a swap entry */
|
||||
#define __swp_type(entry) (((entry).val >> 1) & 0x3f)
|
||||
#define __swp_offset(entry) ((entry).val >> 8)
|
||||
@@ -446,17 +437,6 @@ extern void paging_init(void);
|
||||
#define pgoff_to_pte(off) ((pte_t) {((off) << PTE_RPN_SHIFT)|_PAGE_FILE})
|
||||
#define PTE_FILE_MAX_BITS (BITS_PER_LONG - PTE_RPN_SHIFT)
|
||||
|
||||
/*
|
||||
* kern_addr_valid is intended to indicate whether an address is a valid
|
||||
* kernel address. Most 32-bit archs define it as always true (like this)
|
||||
* but most 64-bit archs actually perform a test. What should we do here?
|
||||
* The only use is in fs/ncpfs/dir.c
|
||||
*/
|
||||
#define kern_addr_valid(addr) (1)
|
||||
|
||||
#define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \
|
||||
remap_pfn_range(vma, vaddr, pfn, size, prot)
|
||||
|
||||
void pgtable_cache_init(void);
|
||||
|
||||
/*
|
||||
|
||||
@@ -2,6 +2,13 @@
|
||||
#define _ASM_POWERPC_PGTABLE_H
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#include <asm/processor.h> /* For TASK_SIZE */
|
||||
#include <asm/mmu.h>
|
||||
#include <asm/page.h>
|
||||
struct mm_struct;
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
|
||||
#if defined(CONFIG_PPC64)
|
||||
# include <asm/pgtable-ppc64.h>
|
||||
#else
|
||||
@@ -9,6 +16,27 @@
|
||||
#endif
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
/*
|
||||
* ZERO_PAGE is a global shared page that is always zero: used
|
||||
* for zero-mapped memory areas etc..
|
||||
*/
|
||||
extern unsigned long empty_zero_page[];
|
||||
#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))
|
||||
|
||||
extern pgd_t swapper_pg_dir[];
|
||||
|
||||
extern void paging_init(void);
|
||||
|
||||
/*
|
||||
* kern_addr_valid is intended to indicate whether an address is a valid
|
||||
* kernel address. Most 32-bit archs define it as always true (like this)
|
||||
* but most 64-bit archs actually perform a test. What should we do here?
|
||||
*/
|
||||
#define kern_addr_valid(addr) (1)
|
||||
|
||||
#define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \
|
||||
remap_pfn_range(vma, vaddr, pfn, size, prot)
|
||||
|
||||
#include <asm-generic/pgtable.h>
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ extern int global_phb_number;
|
||||
|
||||
extern void find_and_init_phbs(void);
|
||||
|
||||
extern struct pci_dev *ppc64_isabridge_dev; /* may be NULL if no ISA bus */
|
||||
extern struct pci_dev *isa_bridge_pcidev; /* may be NULL if no ISA bus */
|
||||
|
||||
/** Bus Unit ID macros; get low and hi 32-bits of the 64-bit BUID */
|
||||
#define BUID_HI(buid) ((buid) >> 32)
|
||||
@@ -47,8 +47,8 @@ extern void init_pci_config_tokens (void);
|
||||
extern unsigned long get_phb_buid (struct device_node *);
|
||||
extern int rtas_setup_phb(struct pci_controller *phb);
|
||||
|
||||
/* From pSeries_pci.h */
|
||||
extern void pSeries_final_fixup(void);
|
||||
/* From iSeries PCI */
|
||||
extern void iSeries_pcibios_init(void);
|
||||
|
||||
extern unsigned long pci_probe_only;
|
||||
|
||||
@@ -139,6 +139,9 @@ void eeh_clear_slot (struct device_node *dn, int mode_flag);
|
||||
*/
|
||||
struct device_node * find_device_pe(struct device_node *dn);
|
||||
|
||||
void eeh_sysfs_add_device(struct pci_dev *pdev);
|
||||
void eeh_sysfs_remove_device(struct pci_dev *pdev);
|
||||
|
||||
#endif /* CONFIG_EEH */
|
||||
|
||||
#else /* CONFIG_PCI */
|
||||
|
||||
@@ -43,14 +43,6 @@ extern int _chrp_type;
|
||||
/* what kind of prep workstation we are */
|
||||
extern int _prep_type;
|
||||
|
||||
/*
|
||||
* This is used to identify the board type from a given PReP board
|
||||
* vendor. Board revision is also made available. This will be moved
|
||||
* elsewhere soon
|
||||
*/
|
||||
extern unsigned char ucBoardRev;
|
||||
extern unsigned char ucBoardRevMaj, ucBoardRevMin;
|
||||
|
||||
#endif /* CONFIG_PPC_PREP */
|
||||
|
||||
#endif /* defined(__KERNEL__) && defined(CONFIG_PPC32) */
|
||||
|
||||
@@ -98,10 +98,19 @@ struct device_node {
|
||||
extern struct device_node *of_chosen;
|
||||
|
||||
/* flag descriptions */
|
||||
#define OF_DYNAMIC 1 /* node and properties were allocated via kmalloc */
|
||||
#define OF_DYNAMIC 1 /* node and properties were allocated via kmalloc */
|
||||
#define OF_DETACHED 2 /* node has been detached from the device tree */
|
||||
|
||||
static inline int of_node_check_flag(struct device_node *n, unsigned long flag)
|
||||
{
|
||||
return test_bit(flag, &n->_flags);
|
||||
}
|
||||
|
||||
static inline void of_node_set_flag(struct device_node *n, unsigned long flag)
|
||||
{
|
||||
set_bit(flag, &n->_flags);
|
||||
}
|
||||
|
||||
#define OF_IS_DYNAMIC(x) test_bit(OF_DYNAMIC, &x->_flags)
|
||||
#define OF_MARK_DYNAMIC(x) set_bit(OF_DYNAMIC, &x->_flags)
|
||||
|
||||
#define HAVE_ARCH_DEVTREE_FIXUPS
|
||||
|
||||
@@ -124,6 +133,9 @@ extern struct device_node *of_find_node_by_type(struct device_node *from,
|
||||
dn = of_find_node_by_type(dn, type))
|
||||
extern struct device_node *of_find_compatible_node(struct device_node *from,
|
||||
const char *type, const char *compat);
|
||||
#define for_each_compatible_node(dn, type, compatible) \
|
||||
for (dn = of_find_compatible_node(NULL, type, compatible); dn; \
|
||||
dn = of_find_compatible_node(dn, type, compatible))
|
||||
extern struct device_node *of_find_node_by_path(const char *path);
|
||||
extern struct device_node *of_find_node_by_phandle(phandle handle);
|
||||
extern struct device_node *of_find_all_nodes(struct device_node *prev);
|
||||
|
||||
@@ -35,7 +35,8 @@ union ps3_firmware_version {
|
||||
};
|
||||
};
|
||||
|
||||
int ps3_get_firmware_version(union ps3_firmware_version *v);
|
||||
void ps3_get_firmware_version(union ps3_firmware_version *v);
|
||||
int ps3_compare_firmware_version(u16 major, u16 minor, u16 rev);
|
||||
|
||||
/* 'Other OS' area */
|
||||
|
||||
@@ -48,18 +49,6 @@ enum ps3_param_av_multi_out {
|
||||
|
||||
enum ps3_param_av_multi_out ps3_os_area_get_av_multi_out(void);
|
||||
|
||||
/**
|
||||
* struct ps3_device_id - HV bus device identifier from the system repository
|
||||
* @bus_id: HV bus id, {1..} (zero invalid)
|
||||
* @dev_id: HV device id, {0..}
|
||||
*/
|
||||
|
||||
struct ps3_device_id {
|
||||
unsigned int bus_id;
|
||||
unsigned int dev_id;
|
||||
};
|
||||
|
||||
|
||||
/* dma routines */
|
||||
|
||||
enum ps3_dma_page_size {
|
||||
@@ -74,6 +63,8 @@ enum ps3_dma_region_type {
|
||||
PS3_DMA_INTERNAL = 2,
|
||||
};
|
||||
|
||||
struct ps3_dma_region_ops;
|
||||
|
||||
/**
|
||||
* struct ps3_dma_region - A per device dma state variables structure
|
||||
* @did: The HV device id.
|
||||
@@ -81,21 +72,42 @@ enum ps3_dma_region_type {
|
||||
* @region_type: The HV region type.
|
||||
* @bus_addr: The 'translated' bus address of the region.
|
||||
* @len: The length in bytes of the region.
|
||||
* @offset: The offset from the start of memory of the region.
|
||||
* @ioid: The IOID of the device who owns this region
|
||||
* @chunk_list: Opaque variable used by the ioc page manager.
|
||||
* @region_ops: struct ps3_dma_region_ops - dma region operations
|
||||
*/
|
||||
|
||||
struct ps3_dma_region {
|
||||
struct ps3_device_id did;
|
||||
struct ps3_system_bus_device *dev;
|
||||
/* device variables */
|
||||
const struct ps3_dma_region_ops *region_ops;
|
||||
unsigned char ioid;
|
||||
enum ps3_dma_page_size page_size;
|
||||
enum ps3_dma_region_type region_type;
|
||||
unsigned long bus_addr;
|
||||
unsigned long len;
|
||||
unsigned long offset;
|
||||
|
||||
/* driver variables (set by ps3_dma_region_create) */
|
||||
unsigned long bus_addr;
|
||||
struct {
|
||||
spinlock_t lock;
|
||||
struct list_head head;
|
||||
} chunk_list;
|
||||
};
|
||||
|
||||
struct ps3_dma_region_ops {
|
||||
int (*create)(struct ps3_dma_region *);
|
||||
int (*free)(struct ps3_dma_region *);
|
||||
int (*map)(struct ps3_dma_region *,
|
||||
unsigned long virt_addr,
|
||||
unsigned long len,
|
||||
unsigned long *bus_addr,
|
||||
u64 iopte_pp);
|
||||
int (*unmap)(struct ps3_dma_region *,
|
||||
unsigned long bus_addr,
|
||||
unsigned long len);
|
||||
};
|
||||
/**
|
||||
* struct ps3_dma_region_init - Helper to initialize structure variables
|
||||
*
|
||||
@@ -103,18 +115,16 @@ struct ps3_dma_region {
|
||||
* ps3_system_bus_device_register.
|
||||
*/
|
||||
|
||||
static inline void ps3_dma_region_init(struct ps3_dma_region *r,
|
||||
const struct ps3_device_id* did, enum ps3_dma_page_size page_size,
|
||||
enum ps3_dma_region_type region_type)
|
||||
{
|
||||
r->did = *did;
|
||||
r->page_size = page_size;
|
||||
r->region_type = region_type;
|
||||
}
|
||||
struct ps3_system_bus_device;
|
||||
|
||||
int ps3_dma_region_init(struct ps3_system_bus_device *dev,
|
||||
struct ps3_dma_region *r, enum ps3_dma_page_size page_size,
|
||||
enum ps3_dma_region_type region_type, void *addr, unsigned long len);
|
||||
int ps3_dma_region_create(struct ps3_dma_region *r);
|
||||
int ps3_dma_region_free(struct ps3_dma_region *r);
|
||||
int ps3_dma_map(struct ps3_dma_region *r, unsigned long virt_addr,
|
||||
unsigned long len, unsigned long *bus_addr);
|
||||
unsigned long len, unsigned long *bus_addr,
|
||||
u64 iopte_pp);
|
||||
int ps3_dma_unmap(struct ps3_dma_region *r, unsigned long bus_addr,
|
||||
unsigned long len);
|
||||
|
||||
@@ -125,6 +135,7 @@ enum ps3_mmio_page_size {
|
||||
PS3_MMIO_64K = 16U
|
||||
};
|
||||
|
||||
struct ps3_mmio_region_ops;
|
||||
/**
|
||||
* struct ps3_mmio_region - a per device mmio state variables structure
|
||||
*
|
||||
@@ -132,13 +143,18 @@ enum ps3_mmio_page_size {
|
||||
*/
|
||||
|
||||
struct ps3_mmio_region {
|
||||
struct ps3_device_id did;
|
||||
struct ps3_system_bus_device *dev;
|
||||
const struct ps3_mmio_region_ops *mmio_ops;
|
||||
unsigned long bus_addr;
|
||||
unsigned long len;
|
||||
enum ps3_mmio_page_size page_size;
|
||||
unsigned long lpar_addr;
|
||||
};
|
||||
|
||||
struct ps3_mmio_region_ops {
|
||||
int (*create)(struct ps3_mmio_region *);
|
||||
int (*free)(struct ps3_mmio_region *);
|
||||
};
|
||||
/**
|
||||
* struct ps3_mmio_region_init - Helper to initialize structure variables
|
||||
*
|
||||
@@ -146,15 +162,9 @@ struct ps3_mmio_region {
|
||||
* ps3_system_bus_device_register.
|
||||
*/
|
||||
|
||||
static inline void ps3_mmio_region_init(struct ps3_mmio_region *r,
|
||||
const struct ps3_device_id* did, unsigned long bus_addr,
|
||||
unsigned long len, enum ps3_mmio_page_size page_size)
|
||||
{
|
||||
r->did = *did;
|
||||
r->bus_addr = bus_addr;
|
||||
r->len = len;
|
||||
r->page_size = page_size;
|
||||
}
|
||||
int ps3_mmio_region_init(struct ps3_system_bus_device *dev,
|
||||
struct ps3_mmio_region *r, unsigned long bus_addr, unsigned long len,
|
||||
enum ps3_mmio_page_size page_size);
|
||||
int ps3_mmio_region_create(struct ps3_mmio_region *r);
|
||||
int ps3_free_mmio_region(struct ps3_mmio_region *r);
|
||||
unsigned long ps3_mm_phys_to_lpar(unsigned long phys_addr);
|
||||
@@ -187,11 +197,10 @@ int ps3_spe_irq_setup(enum ps3_cpu_binding cpu, unsigned long spe_id,
|
||||
unsigned int class, unsigned int *virq);
|
||||
int ps3_spe_irq_destroy(unsigned int virq);
|
||||
|
||||
int ps3_sb_event_receive_port_setup(enum ps3_cpu_binding cpu,
|
||||
const struct ps3_device_id *did, unsigned int interrupt_id,
|
||||
unsigned int *virq);
|
||||
int ps3_sb_event_receive_port_destroy(const struct ps3_device_id *did,
|
||||
unsigned int interrupt_id, unsigned int virq);
|
||||
int ps3_sb_event_receive_port_setup(struct ps3_system_bus_device *dev,
|
||||
enum ps3_cpu_binding cpu, unsigned int *virq);
|
||||
int ps3_sb_event_receive_port_destroy(struct ps3_system_bus_device *dev,
|
||||
unsigned int virq);
|
||||
|
||||
/* lv1 result codes */
|
||||
|
||||
@@ -289,11 +298,33 @@ static inline const char* ps3_result(int result)
|
||||
/* system bus routines */
|
||||
|
||||
enum ps3_match_id {
|
||||
PS3_MATCH_ID_EHCI = 1,
|
||||
PS3_MATCH_ID_OHCI,
|
||||
PS3_MATCH_ID_GELIC,
|
||||
PS3_MATCH_ID_AV_SETTINGS,
|
||||
PS3_MATCH_ID_SYSTEM_MANAGER,
|
||||
PS3_MATCH_ID_EHCI = 1,
|
||||
PS3_MATCH_ID_OHCI = 2,
|
||||
PS3_MATCH_ID_GELIC = 3,
|
||||
PS3_MATCH_ID_AV_SETTINGS = 4,
|
||||
PS3_MATCH_ID_SYSTEM_MANAGER = 5,
|
||||
PS3_MATCH_ID_STOR_DISK = 6,
|
||||
PS3_MATCH_ID_STOR_ROM = 7,
|
||||
PS3_MATCH_ID_STOR_FLASH = 8,
|
||||
PS3_MATCH_ID_SOUND = 9,
|
||||
PS3_MATCH_ID_GRAPHICS = 10,
|
||||
};
|
||||
|
||||
#define PS3_MODULE_ALIAS_EHCI "ps3:1"
|
||||
#define PS3_MODULE_ALIAS_OHCI "ps3:2"
|
||||
#define PS3_MODULE_ALIAS_GELIC "ps3:3"
|
||||
#define PS3_MODULE_ALIAS_AV_SETTINGS "ps3:4"
|
||||
#define PS3_MODULE_ALIAS_SYSTEM_MANAGER "ps3:5"
|
||||
#define PS3_MODULE_ALIAS_STOR_DISK "ps3:6"
|
||||
#define PS3_MODULE_ALIAS_STOR_ROM "ps3:7"
|
||||
#define PS3_MODULE_ALIAS_STOR_FLASH "ps3:8"
|
||||
#define PS3_MODULE_ALIAS_SOUND "ps3:9"
|
||||
#define PS3_MODULE_ALIAS_GRAPHICS "ps3:10"
|
||||
|
||||
enum ps3_system_bus_device_type {
|
||||
PS3_DEVICE_TYPE_IOC0 = 1,
|
||||
PS3_DEVICE_TYPE_SB,
|
||||
PS3_DEVICE_TYPE_VUART,
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -302,14 +333,23 @@ enum ps3_match_id {
|
||||
|
||||
struct ps3_system_bus_device {
|
||||
enum ps3_match_id match_id;
|
||||
struct ps3_device_id did;
|
||||
unsigned int interrupt_id;
|
||||
/* struct iommu_table *iommu_table; -- waiting for Ben's cleanups */
|
||||
struct ps3_dma_region *d_region;
|
||||
struct ps3_mmio_region *m_region;
|
||||
enum ps3_system_bus_device_type dev_type;
|
||||
|
||||
unsigned int bus_id; /* SB */
|
||||
unsigned int dev_id; /* SB */
|
||||
unsigned int interrupt_id; /* SB */
|
||||
struct ps3_dma_region *d_region; /* SB, IOC0 */
|
||||
struct ps3_mmio_region *m_region; /* SB, IOC0*/
|
||||
unsigned int port_number; /* VUART */
|
||||
|
||||
/* struct iommu_table *iommu_table; -- waiting for BenH's cleanups */
|
||||
struct device core;
|
||||
void *driver_priv; /* private driver variables */
|
||||
};
|
||||
|
||||
int ps3_open_hv_device(struct ps3_system_bus_device *dev);
|
||||
int ps3_close_hv_device(struct ps3_system_bus_device *dev);
|
||||
|
||||
/**
|
||||
* struct ps3_system_bus_driver - a driver for a device on the system bus
|
||||
*/
|
||||
@@ -319,6 +359,7 @@ struct ps3_system_bus_driver {
|
||||
struct device_driver core;
|
||||
int (*probe)(struct ps3_system_bus_device *);
|
||||
int (*remove)(struct ps3_system_bus_device *);
|
||||
int (*shutdown)(struct ps3_system_bus_device *);
|
||||
/* int (*suspend)(struct ps3_system_bus_device *, pm_message_t); */
|
||||
/* int (*resume)(struct ps3_system_bus_device *); */
|
||||
};
|
||||
@@ -326,16 +367,24 @@ struct ps3_system_bus_driver {
|
||||
int ps3_system_bus_device_register(struct ps3_system_bus_device *dev);
|
||||
int ps3_system_bus_driver_register(struct ps3_system_bus_driver *drv);
|
||||
void ps3_system_bus_driver_unregister(struct ps3_system_bus_driver *drv);
|
||||
static inline struct ps3_system_bus_driver *to_ps3_system_bus_driver(
|
||||
|
||||
static inline struct ps3_system_bus_driver *ps3_drv_to_system_bus_drv(
|
||||
struct device_driver *_drv)
|
||||
{
|
||||
return container_of(_drv, struct ps3_system_bus_driver, core);
|
||||
}
|
||||
static inline struct ps3_system_bus_device *to_ps3_system_bus_device(
|
||||
static inline struct ps3_system_bus_device *ps3_dev_to_system_bus_dev(
|
||||
struct device *_dev)
|
||||
{
|
||||
return container_of(_dev, struct ps3_system_bus_device, core);
|
||||
}
|
||||
static inline struct ps3_system_bus_driver *
|
||||
ps3_system_bus_dev_to_system_bus_drv(struct ps3_system_bus_device *_dev)
|
||||
{
|
||||
BUG_ON(!_dev);
|
||||
BUG_ON(!_dev->core.driver);
|
||||
return ps3_drv_to_system_bus_drv(_dev->core.driver);
|
||||
}
|
||||
|
||||
/**
|
||||
* ps3_system_bus_set_drvdata -
|
||||
@@ -358,32 +407,17 @@ static inline void *ps3_system_bus_get_driver_data(
|
||||
|
||||
extern struct bus_type ps3_system_bus_type;
|
||||
|
||||
/* vuart routines */
|
||||
|
||||
struct ps3_vuart_port_priv;
|
||||
|
||||
/**
|
||||
* struct ps3_vuart_port_device - a device on a vuart port
|
||||
*/
|
||||
|
||||
struct ps3_vuart_port_device {
|
||||
enum ps3_match_id match_id;
|
||||
struct device core;
|
||||
struct ps3_vuart_port_priv* priv; /* private driver variables */
|
||||
|
||||
};
|
||||
|
||||
int ps3_vuart_port_device_register(struct ps3_vuart_port_device *dev);
|
||||
|
||||
/* system manager */
|
||||
|
||||
#ifdef CONFIG_PS3_SYS_MANAGER
|
||||
void ps3_sys_manager_restart(void);
|
||||
struct ps3_sys_manager_ops {
|
||||
struct ps3_system_bus_device *dev;
|
||||
void (*power_off)(struct ps3_system_bus_device *dev);
|
||||
void (*restart)(struct ps3_system_bus_device *dev);
|
||||
};
|
||||
|
||||
void ps3_sys_manager_register_ops(const struct ps3_sys_manager_ops *ops);
|
||||
void ps3_sys_manager_power_off(void);
|
||||
#else
|
||||
static inline void ps3_sys_manager_restart(void) {}
|
||||
static inline void ps3_sys_manager_power_off(void) {}
|
||||
#endif
|
||||
void ps3_sys_manager_restart(void);
|
||||
|
||||
struct ps3_prealloc {
|
||||
const char *name;
|
||||
@@ -393,5 +427,7 @@ struct ps3_prealloc {
|
||||
};
|
||||
|
||||
extern struct ps3_prealloc ps3fb_videomemory;
|
||||
extern struct ps3_prealloc ps3flash_bounce_buffer;
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,20 +1,23 @@
|
||||
/*
|
||||
* Copyright (C) 2006 Sony Computer Entertainment Inc.
|
||||
* Copyright 2006, 2007 Sony Corporation
|
||||
* PS3 AV backend support.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published
|
||||
* by the Free Software Foundation; version 2 of the License.
|
||||
* Copyright (C) 2007 Sony Computer Entertainment Inc.
|
||||
* Copyright 2007 Sony Corp.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef _ASM_POWERPC_PS3AV_H_
|
||||
#define _ASM_POWERPC_PS3AV_H_
|
||||
|
||||
@@ -159,6 +162,9 @@
|
||||
#define PS3AV_CMD_VIDEO_FMT_X8R8G8B8 0x0000
|
||||
/* video_out_format */
|
||||
#define PS3AV_CMD_VIDEO_OUT_FORMAT_RGB_12BIT 0x0000
|
||||
/* video_cl_cnv */
|
||||
#define PS3AV_CMD_VIDEO_CL_CNV_ENABLE_LUT 0x0000
|
||||
#define PS3AV_CMD_VIDEO_CL_CNV_DISABLE_LUT 0x0010
|
||||
/* video_sync */
|
||||
#define PS3AV_CMD_VIDEO_SYNC_VSYNC 0x0001
|
||||
#define PS3AV_CMD_VIDEO_SYNC_CSYNC 0x0004
|
||||
@@ -311,6 +317,8 @@
|
||||
#define PS3AV_MODE_MASK 0x000F
|
||||
#define PS3AV_MODE_HDCP_OFF 0x1000 /* Retail PS3 product doesn't support this */
|
||||
#define PS3AV_MODE_DITHER 0x0800
|
||||
#define PS3AV_MODE_COLOR 0x0400
|
||||
#define PS3AV_MODE_WHITE 0x0200
|
||||
#define PS3AV_MODE_FULL 0x0080
|
||||
#define PS3AV_MODE_DVI 0x0040
|
||||
#define PS3AV_MODE_RGB 0x0020
|
||||
@@ -529,9 +537,9 @@ struct ps3av_pkt_video_mode {
|
||||
u32 video_out_format; /* in: out format */
|
||||
u32 video_format; /* in: input frame buffer format */
|
||||
u8 reserved3;
|
||||
u8 reserved4;
|
||||
u8 video_cl_cnv; /* in: color conversion */
|
||||
u16 video_order; /* in: input RGB order */
|
||||
u32 reserved5;
|
||||
u32 reserved4;
|
||||
};
|
||||
|
||||
/* video: format */
|
||||
@@ -539,7 +547,8 @@ struct ps3av_pkt_video_format {
|
||||
struct ps3av_send_hdr send_hdr;
|
||||
u32 video_head; /* in: head */
|
||||
u32 video_format; /* in: frame buffer format */
|
||||
u16 reserved;
|
||||
u8 reserved;
|
||||
u8 video_cl_cnv; /* in: color conversion */
|
||||
u16 video_order; /* in: input RGB order */
|
||||
};
|
||||
|
||||
@@ -698,12 +707,6 @@ static inline void ps3av_cmd_av_monitor_info_dump(const struct ps3av_pkt_av_get_
|
||||
extern int ps3av_cmd_video_get_monitor_info(struct ps3av_pkt_av_get_monitor_info *,
|
||||
u32);
|
||||
|
||||
struct ps3_vuart_port_device;
|
||||
extern int ps3av_vuart_write(struct ps3_vuart_port_device *dev,
|
||||
const void *buf, unsigned long size);
|
||||
extern int ps3av_vuart_read(struct ps3_vuart_port_device *dev, void *buf,
|
||||
unsigned long size, int timeout);
|
||||
|
||||
extern int ps3av_set_video_mode(u32, int);
|
||||
extern int ps3av_set_audio_mode(u32, u32, u32, u32, u32);
|
||||
extern int ps3av_get_auto_mode(int);
|
||||
@@ -716,5 +719,8 @@ extern int ps3av_video_mute(int);
|
||||
extern int ps3av_audio_mute(int);
|
||||
extern int ps3av_dev_open(void);
|
||||
extern int ps3av_dev_close(void);
|
||||
extern void ps3av_register_flip_ctl(void (*flip_ctl)(int on, void *data),
|
||||
void *flip_data);
|
||||
extern void ps3av_flip_ctl(int on);
|
||||
|
||||
#endif /* _ASM_POWERPC_PS3AV_H_ */
|
||||
|
||||
@@ -41,16 +41,4 @@ struct ps3fb_ioctl_res {
|
||||
__u32 num_frames; /* num of frame buffers */
|
||||
};
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#ifdef CONFIG_FB_PS3
|
||||
extern void ps3fb_flip_ctl(int on);
|
||||
extern void ps3fb_cleanup(void);
|
||||
#else
|
||||
static inline void ps3fb_flip_ctl(int on) {}
|
||||
static inline void ps3fb_cleanup(void) {}
|
||||
#endif
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#endif /* _ASM_POWERPC_PS3FB_H_ */
|
||||
|
||||
71
include/asm-powerpc/ps3stor.h
Normal file
71
include/asm-powerpc/ps3stor.h
Normal file
@@ -0,0 +1,71 @@
|
||||
/*
|
||||
* PS3 Storage Devices
|
||||
*
|
||||
* Copyright (C) 2007 Sony Computer Entertainment Inc.
|
||||
* Copyright 2007 Sony Corp.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published
|
||||
* by the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#ifndef _ASM_POWERPC_PS3STOR_H_
|
||||
#define _ASM_POWERPC_PS3STOR_H_
|
||||
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
#include <asm/ps3.h>
|
||||
|
||||
|
||||
struct ps3_storage_region {
|
||||
unsigned int id;
|
||||
u64 start;
|
||||
u64 size;
|
||||
};
|
||||
|
||||
struct ps3_storage_device {
|
||||
struct ps3_system_bus_device sbd;
|
||||
|
||||
struct ps3_dma_region dma_region;
|
||||
unsigned int irq;
|
||||
u64 blk_size;
|
||||
|
||||
u64 tag;
|
||||
u64 lv1_status;
|
||||
struct completion done;
|
||||
|
||||
unsigned long bounce_size;
|
||||
void *bounce_buf;
|
||||
u64 bounce_lpar;
|
||||
dma_addr_t bounce_dma;
|
||||
|
||||
unsigned int num_regions;
|
||||
unsigned long accessible_regions;
|
||||
unsigned int region_idx; /* first accessible region */
|
||||
struct ps3_storage_region regions[0]; /* Must be last */
|
||||
};
|
||||
|
||||
static inline struct ps3_storage_device *to_ps3_storage_device(struct device *dev)
|
||||
{
|
||||
return container_of(dev, struct ps3_storage_device, sbd.core);
|
||||
}
|
||||
|
||||
extern int ps3stor_setup(struct ps3_storage_device *dev,
|
||||
irq_handler_t handler);
|
||||
extern void ps3stor_teardown(struct ps3_storage_device *dev);
|
||||
extern u64 ps3stor_read_write_sectors(struct ps3_storage_device *dev, u64 lpar,
|
||||
u64 start_sector, u64 sectors,
|
||||
int write);
|
||||
extern u64 ps3stor_send_command(struct ps3_storage_device *dev, u64 cmd,
|
||||
u64 arg1, u64 arg2, u64 arg3, u64 arg4);
|
||||
|
||||
#endif /* _ASM_POWERPC_PS3STOR_H_ */
|
||||
@@ -92,6 +92,11 @@ extern unsigned long profile_pc(struct pt_regs *regs);
|
||||
set_thread_flag(TIF_NOERROR); \
|
||||
} while(0)
|
||||
|
||||
struct task_struct;
|
||||
extern unsigned long ptrace_get_reg(struct task_struct *task, int regno);
|
||||
extern int ptrace_put_reg(struct task_struct *task, int regno,
|
||||
unsigned long data);
|
||||
|
||||
/*
|
||||
* We use the least-significant bit of the trap field to indicate
|
||||
* whether we have saved the full set of registers, or only a
|
||||
@@ -158,9 +163,7 @@ do { \
|
||||
|
||||
#define PT_NIP 32
|
||||
#define PT_MSR 33
|
||||
#ifdef __KERNEL__
|
||||
#define PT_ORIG_R3 34
|
||||
#endif
|
||||
#define PT_CTR 35
|
||||
#define PT_LNK 36
|
||||
#define PT_XER 37
|
||||
@@ -169,11 +172,12 @@ do { \
|
||||
#define PT_MQ 39
|
||||
#else
|
||||
#define PT_SOFTE 39
|
||||
#endif
|
||||
#define PT_TRAP 40
|
||||
#define PT_DAR 41
|
||||
#define PT_DSISR 42
|
||||
#define PT_RESULT 43
|
||||
#endif
|
||||
#define PT_REGS_COUNT 44
|
||||
|
||||
#define PT_FPR0 48 /* each FP reg occupies 2 slots in this space */
|
||||
|
||||
@@ -229,7 +233,17 @@ do { \
|
||||
#define PTRACE_GET_DEBUGREG 25
|
||||
#define PTRACE_SET_DEBUGREG 26
|
||||
|
||||
/* Additional PTRACE requests implemented on PowerPC. */
|
||||
/* (new) PTRACE requests using the same numbers as x86 and the same
|
||||
* argument ordering. Additionally, they support more registers too
|
||||
*/
|
||||
#define PTRACE_GETREGS 12
|
||||
#define PTRACE_SETREGS 13
|
||||
#define PTRACE_GETFPREGS 14
|
||||
#define PTRACE_SETFPREGS 15
|
||||
#define PTRACE_GETREGS64 22
|
||||
#define PTRACE_SETREGS64 23
|
||||
|
||||
/* (old) PTRACE requests with inverted arguments */
|
||||
#define PPC_PTRACE_GETREGS 0x99 /* Get GPRs 0 - 31 */
|
||||
#define PPC_PTRACE_SETREGS 0x98 /* Set GPRs 0 - 31 */
|
||||
#define PPC_PTRACE_GETFPREGS 0x97 /* Get FPRs 0 - 31 */
|
||||
|
||||
@@ -453,6 +453,8 @@
|
||||
#define SPRN_MMCRA 0x312
|
||||
#define MMCRA_SIHV 0x10000000UL /* state of MSR HV when SIAR set */
|
||||
#define MMCRA_SIPR 0x08000000UL /* state of MSR PR when SIAR set */
|
||||
#define MMCRA_SLOT 0x07000000UL /* SLOT bits (37-39) */
|
||||
#define MMCRA_SLOT_SHIFT 24
|
||||
#define MMCRA_SAMPLE_ENABLE 0x00000001UL /* enable sampling */
|
||||
#define POWER6_MMCRA_SIHV 0x0000040000000000ULL
|
||||
#define POWER6_MMCRA_SIPR 0x0000020000000000ULL
|
||||
|
||||
@@ -106,6 +106,14 @@ struct spu_context;
|
||||
struct spu_runqueue;
|
||||
struct device_node;
|
||||
|
||||
enum spu_utilization_state {
|
||||
SPU_UTIL_SYSTEM,
|
||||
SPU_UTIL_USER,
|
||||
SPU_UTIL_IOWAIT,
|
||||
SPU_UTIL_IDLE,
|
||||
SPU_UTIL_MAX
|
||||
};
|
||||
|
||||
struct spu {
|
||||
const char *name;
|
||||
unsigned long local_store_phys;
|
||||
@@ -156,6 +164,21 @@ struct spu {
|
||||
u64 shadow_int_mask_RW[3];
|
||||
|
||||
struct sys_device sysdev;
|
||||
|
||||
struct {
|
||||
/* protected by interrupt reentrancy */
|
||||
enum spu_utilization_state utilization_state;
|
||||
unsigned long tstamp; /* time of last ctx switch */
|
||||
unsigned long times[SPU_UTIL_MAX];
|
||||
unsigned long long vol_ctx_switch;
|
||||
unsigned long long invol_ctx_switch;
|
||||
unsigned long long min_flt;
|
||||
unsigned long long maj_flt;
|
||||
unsigned long long hash_flt;
|
||||
unsigned long long slb_flt;
|
||||
unsigned long long class2_intr;
|
||||
unsigned long long libassist;
|
||||
} stats;
|
||||
};
|
||||
|
||||
struct spu *spu_alloc(void);
|
||||
@@ -448,6 +471,7 @@ struct spu_priv1 {
|
||||
#define MFC_STATE1_PROBLEM_STATE_MASK 0x08ull
|
||||
#define MFC_STATE1_RELOCATE_MASK 0x10ull
|
||||
#define MFC_STATE1_MASTER_RUN_CONTROL_MASK 0x20ull
|
||||
#define MFC_STATE1_TABLE_SEARCH_MASK 0x40ull
|
||||
u64 mfc_lpid_RW; /* 0x008 */
|
||||
u64 spu_idr_RW; /* 0x010 */
|
||||
u64 mfc_vr_RO; /* 0x018 */
|
||||
|
||||
@@ -43,16 +43,9 @@ asmlinkage long ppc_newuname(struct new_utsname __user * name);
|
||||
|
||||
asmlinkage long sys_rt_sigsuspend(sigset_t __user *unewset,
|
||||
size_t sigsetsize);
|
||||
|
||||
#ifndef __powerpc64__
|
||||
asmlinkage long sys_sigaltstack(const stack_t __user *uss,
|
||||
stack_t __user *uoss, int r5, int r6, int r7, int r8,
|
||||
struct pt_regs *regs);
|
||||
#else /* __powerpc64__ */
|
||||
asmlinkage long sys_sigaltstack(const stack_t __user *uss,
|
||||
stack_t __user *uoss, unsigned long r5, unsigned long r6,
|
||||
unsigned long r7, unsigned long r8, struct pt_regs *regs);
|
||||
#endif /* __powerpc64__ */
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* __ASM_POWERPC_SYSCALLS_H */
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
#ifdef CONFIG_SMP
|
||||
#define smp_mb() mb()
|
||||
#define smp_rmb() rmb()
|
||||
#define smp_wmb() __asm__ __volatile__ ("eieio" : : : "memory")
|
||||
#define smp_wmb() eieio()
|
||||
#define smp_read_barrier_depends() read_barrier_depends()
|
||||
#else
|
||||
#define smp_mb() barrier()
|
||||
@@ -559,5 +559,7 @@ static inline void create_function_call(unsigned long addr, void * func)
|
||||
extern void account_system_vtime(struct task_struct *);
|
||||
#endif
|
||||
|
||||
extern struct dentry *powerpc_debugfs_root;
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _ASM_POWERPC_SYSTEM_H */
|
||||
|
||||
@@ -152,6 +152,10 @@ struct ktermios {
|
||||
#define B3000000 00034
|
||||
#define B3500000 00035
|
||||
#define B4000000 00036
|
||||
#define BOTHER 00037
|
||||
|
||||
#define CIBAUD 077600000
|
||||
#define IBSHIFT 16 /* Shift from CBAUD to CIBAUD */
|
||||
|
||||
#define CSIZE 00001400
|
||||
#define CS5 00000000
|
||||
|
||||
@@ -113,8 +113,8 @@ static inline struct thread_info *current_thread_info(void)
|
||||
#define TIF_POLLING_NRFLAG 4 /* true if poll_idle() is polling
|
||||
TIF_NEED_RESCHED */
|
||||
#define TIF_32BIT 5 /* 32 bit binary */
|
||||
#define TIF_RUNLATCH 6 /* Is the runlatch enabled? */
|
||||
#define TIF_ABI_PENDING 7 /* 32/64 bit switch needed */
|
||||
#define TIF_PERFMON_WORK 6 /* work for pfm_handle_work() */
|
||||
#define TIF_PERFMON_CTXSW 7 /* perfmon needs ctxsw calls */
|
||||
#define TIF_SYSCALL_AUDIT 8 /* syscall auditing active */
|
||||
#define TIF_SINGLESTEP 9 /* singlestepping active */
|
||||
#define TIF_MEMDIE 10
|
||||
@@ -123,6 +123,8 @@ static inline struct thread_info *current_thread_info(void)
|
||||
#define TIF_NOERROR 14 /* Force successful syscall return */
|
||||
#define TIF_RESTORE_SIGMASK 15 /* Restore signal mask in do_signal */
|
||||
#define TIF_FREEZE 16 /* Freezing for suspend */
|
||||
#define TIF_RUNLATCH 17 /* Is the runlatch enabled? */
|
||||
#define TIF_ABI_PENDING 18 /* 32/64 bit switch needed */
|
||||
|
||||
/* as above, but as bit values */
|
||||
#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
|
||||
@@ -131,8 +133,8 @@ static inline struct thread_info *current_thread_info(void)
|
||||
#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED)
|
||||
#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG)
|
||||
#define _TIF_32BIT (1<<TIF_32BIT)
|
||||
#define _TIF_RUNLATCH (1<<TIF_RUNLATCH)
|
||||
#define _TIF_ABI_PENDING (1<<TIF_ABI_PENDING)
|
||||
#define _TIF_PERFMON_WORK (1<<TIF_PERFMON_WORK)
|
||||
#define _TIF_PERFMON_CTXSW (1<<TIF_PERFMON_CTXSW)
|
||||
#define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT)
|
||||
#define _TIF_SINGLESTEP (1<<TIF_SINGLESTEP)
|
||||
#define _TIF_SECCOMP (1<<TIF_SECCOMP)
|
||||
@@ -140,6 +142,8 @@ static inline struct thread_info *current_thread_info(void)
|
||||
#define _TIF_NOERROR (1<<TIF_NOERROR)
|
||||
#define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK)
|
||||
#define _TIF_FREEZE (1<<TIF_FREEZE)
|
||||
#define _TIF_RUNLATCH (1<<TIF_RUNLATCH)
|
||||
#define _TIF_ABI_PENDING (1<<TIF_ABI_PENDING)
|
||||
#define _TIF_SYSCALL_T_OR_A (_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP)
|
||||
|
||||
#define _TIF_USER_WORK_MASK (_TIF_NOTIFY_RESUME | _TIF_SIGPENDING | \
|
||||
|
||||
@@ -232,7 +232,7 @@ extern void account_process_vtime(struct task_struct *tsk);
|
||||
#define account_process_vtime(tsk) do { } while (0)
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_VIRT_CPU_ACCOUNTING) && defined(CONFIG_PPC_SPLPAR)
|
||||
#if defined(CONFIG_VIRT_CPU_ACCOUNTING)
|
||||
extern void calculate_steal_time(void);
|
||||
extern void snapshot_timebases(void);
|
||||
#else
|
||||
@@ -240,5 +240,7 @@ extern void snapshot_timebases(void);
|
||||
#define snapshot_timebases() do { } while (0)
|
||||
#endif
|
||||
|
||||
extern void iSeries_time_init_early(void);
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* __POWERPC_TIME_H */
|
||||
|
||||
@@ -155,6 +155,11 @@ static inline void flush_tlb_kernel_range(unsigned long start,
|
||||
{
|
||||
}
|
||||
|
||||
/* Private function for use by PCI IO mapping code */
|
||||
extern void __flush_hash_table_range(struct mm_struct *mm, unsigned long start,
|
||||
unsigned long end);
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
||||
@@ -120,5 +120,10 @@ struct fsl_spi_platform_data {
|
||||
u32 sysclk;
|
||||
};
|
||||
|
||||
struct mpc8xx_pcmcia_ops {
|
||||
void(*hw_ctrl)(int slot, int enable);
|
||||
int(*voltage_set)(int slot, int vcc, int vpp);
|
||||
};
|
||||
|
||||
#endif /* _FSL_DEVICE_H_ */
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
@@ -65,9 +65,10 @@ extern struct vm_struct *get_vm_area_node(unsigned long size,
|
||||
unsigned long flags, int node,
|
||||
gfp_t gfp_mask);
|
||||
extern struct vm_struct *remove_vm_area(void *addr);
|
||||
|
||||
extern int map_vm_area(struct vm_struct *area, pgprot_t prot,
|
||||
struct page ***pages);
|
||||
extern void unmap_vm_area(struct vm_struct *area);
|
||||
extern void unmap_kernel_range(unsigned long addr, unsigned long size);
|
||||
|
||||
/*
|
||||
* Internals. Dont't use..
|
||||
|
||||
Reference in New Issue
Block a user