-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
yaml --- r: 28782 b: refs/heads/master c: acf7d76 h: refs/heads/master v: v3
- Loading branch information
Benjamin Herrenschmidt
authored and
Paul Mackerras
committed
Jun 21, 2006
1 parent
38e2c38
commit f14cd32
Showing
16 changed files
with
506 additions
and
147 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
--- | ||
refs/heads/master: ef82a306b46dbedaecbb154b24d05dfab937df35 | ||
refs/heads/master: acf7d76827a577059636e949079021e6af6dd702 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -133,6 +133,7 @@ CONFIG_CELL_IIC=y | |
# | ||
CONFIG_SPU_FS=m | ||
CONFIG_SPUFS_MMAP=y | ||
CONFIG_CBE_RAS=y | ||
|
||
# | ||
# Kernel options | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,128 @@ | ||
/* | ||
* cbe_regs.c | ||
* | ||
* Accessor routines for the various MMIO register blocks of the CBE | ||
* | ||
* (c) 2006 Benjamin Herrenschmidt <benh@kernel.crashing.org>, IBM Corp. | ||
*/ | ||
|
||
|
||
#include <linux/config.h> | ||
#include <linux/percpu.h> | ||
#include <linux/types.h> | ||
|
||
#include <asm/io.h> | ||
#include <asm/pgtable.h> | ||
#include <asm/prom.h> | ||
#include <asm/ptrace.h> | ||
|
||
#include "cbe_regs.h" | ||
|
||
#define MAX_CBE 2 | ||
|
||
/* | ||
* Current implementation uses "cpu" nodes. We build our own mapping | ||
* array of cpu numbers to cpu nodes locally for now to allow interrupt | ||
* time code to have a fast path rather than call of_get_cpu_node(). If | ||
* we implement cpu hotplug, we'll have to install an appropriate norifier | ||
* in order to release references to the cpu going away | ||
*/ | ||
static struct cbe_regs_map | ||
{ | ||
struct device_node *cpu_node; | ||
struct cbe_pmd_regs __iomem *pmd_regs; | ||
struct cbe_iic_regs __iomem *iic_regs; | ||
} cbe_regs_maps[MAX_CBE]; | ||
static int cbe_regs_map_count; | ||
|
||
static struct cbe_thread_map | ||
{ | ||
struct device_node *cpu_node; | ||
struct cbe_regs_map *regs; | ||
} cbe_thread_map[NR_CPUS]; | ||
|
||
static struct cbe_regs_map *cbe_find_map(struct device_node *np) | ||
{ | ||
int i; | ||
|
||
for (i = 0; i < cbe_regs_map_count; i++) | ||
if (cbe_regs_maps[i].cpu_node == np) | ||
return &cbe_regs_maps[i]; | ||
return NULL; | ||
} | ||
|
||
struct cbe_pmd_regs __iomem *cbe_get_pmd_regs(struct device_node *np) | ||
{ | ||
struct cbe_regs_map *map = cbe_find_map(np); | ||
if (map == NULL) | ||
return NULL; | ||
return map->pmd_regs; | ||
} | ||
|
||
struct cbe_pmd_regs __iomem *cbe_get_cpu_pmd_regs(int cpu) | ||
{ | ||
struct cbe_regs_map *map = cbe_thread_map[cpu].regs; | ||
if (map == NULL) | ||
return NULL; | ||
return map->pmd_regs; | ||
} | ||
|
||
|
||
struct cbe_iic_regs __iomem *cbe_get_iic_regs(struct device_node *np) | ||
{ | ||
struct cbe_regs_map *map = cbe_find_map(np); | ||
if (map == NULL) | ||
return NULL; | ||
return map->iic_regs; | ||
} | ||
struct cbe_iic_regs __iomem *cbe_get_cpu_iic_regs(int cpu) | ||
{ | ||
struct cbe_regs_map *map = cbe_thread_map[cpu].regs; | ||
if (map == NULL) | ||
return NULL; | ||
return map->iic_regs; | ||
} | ||
|
||
void __init cbe_regs_init(void) | ||
{ | ||
int i; | ||
struct device_node *cpu; | ||
|
||
/* Build local fast map of CPUs */ | ||
for_each_cpu(i) | ||
cbe_thread_map[i].cpu_node = of_get_cpu_node(i, NULL); | ||
|
||
/* Find maps for each device tree CPU */ | ||
for_each_node_by_type(cpu, "cpu") { | ||
struct cbe_regs_map *map = &cbe_regs_maps[cbe_regs_map_count++]; | ||
|
||
/* That hack must die die die ! */ | ||
struct address_prop { | ||
unsigned long address; | ||
unsigned int len; | ||
} __attribute__((packed)) *prop; | ||
|
||
|
||
if (cbe_regs_map_count > MAX_CBE) { | ||
printk(KERN_ERR "cbe_regs: More BE chips than supported" | ||
"!\n"); | ||
cbe_regs_map_count--; | ||
return; | ||
} | ||
map->cpu_node = cpu; | ||
for_each_cpu(i) | ||
if (cbe_thread_map[i].cpu_node == cpu) | ||
cbe_thread_map[i].regs = map; | ||
|
||
prop = (struct address_prop *)get_property(cpu, "pervasive", | ||
NULL); | ||
if (prop != NULL) | ||
map->pmd_regs = ioremap(prop->address, prop->len); | ||
|
||
prop = (struct address_prop *)get_property(cpu, "iic", | ||
NULL); | ||
if (prop != NULL) | ||
map->iic_regs = ioremap(prop->address, prop->len); | ||
} | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,129 @@ | ||
/* | ||
* cbe_regs.h | ||
* | ||
* This file is intended to hold the various register definitions for CBE | ||
* on-chip system devices (memory controller, IO controller, etc...) | ||
* | ||
* (c) 2006 Benjamin Herrenschmidt <benh@kernel.crashing.org>, IBM Corp. | ||
*/ | ||
|
||
#ifndef CBE_REGS_H | ||
#define CBE_REGS_H | ||
|
||
/* | ||
* | ||
* Some HID register definitions | ||
* | ||
*/ | ||
|
||
/* CBE specific HID0 bits */ | ||
#define HID0_CBE_THERM_WAKEUP 0x0000020000000000ul | ||
#define HID0_CBE_SYSERR_WAKEUP 0x0000008000000000ul | ||
#define HID0_CBE_THERM_INT_EN 0x0000000400000000ul | ||
#define HID0_CBE_SYSERR_INT_EN 0x0000000200000000ul | ||
|
||
|
||
/* | ||
* | ||
* Pervasive unit register definitions | ||
* | ||
*/ | ||
|
||
struct cbe_pmd_regs { | ||
u8 pad_0x0000_0x0800[0x0800 - 0x0000]; /* 0x0000 */ | ||
|
||
/* Thermal Sensor Registers */ | ||
u64 ts_ctsr1; /* 0x0800 */ | ||
u64 ts_ctsr2; /* 0x0808 */ | ||
u64 ts_mtsr1; /* 0x0810 */ | ||
u64 ts_mtsr2; /* 0x0818 */ | ||
u64 ts_itr1; /* 0x0820 */ | ||
u64 ts_itr2; /* 0x0828 */ | ||
u64 ts_gitr; /* 0x0830 */ | ||
u64 ts_isr; /* 0x0838 */ | ||
u64 ts_imr; /* 0x0840 */ | ||
u64 tm_cr1; /* 0x0848 */ | ||
u64 tm_cr2; /* 0x0850 */ | ||
u64 tm_simr; /* 0x0858 */ | ||
u64 tm_tpr; /* 0x0860 */ | ||
u64 tm_str1; /* 0x0868 */ | ||
u64 tm_str2; /* 0x0870 */ | ||
u64 tm_tsr; /* 0x0878 */ | ||
|
||
/* Power Management */ | ||
u64 pm_control; /* 0x0880 */ | ||
#define CBE_PMD_PAUSE_ZERO_CONTROL 0x10000 | ||
u64 pm_status; /* 0x0888 */ | ||
|
||
/* Time Base Register */ | ||
u64 tbr; /* 0x0890 */ | ||
|
||
u8 pad_0x0898_0x0c00 [0x0c00 - 0x0898]; /* 0x0898 */ | ||
|
||
/* Fault Isolation Registers */ | ||
u64 checkstop_fir; /* 0x0c00 */ | ||
u64 recoverable_fir; | ||
u64 spec_att_mchk_fir; | ||
u64 fir_mode_reg; | ||
u64 fir_enable_mask; | ||
|
||
u8 pad_0x0c28_0x1000 [0x1000 - 0x0c28]; /* 0x0c28 */ | ||
}; | ||
|
||
extern struct cbe_pmd_regs __iomem *cbe_get_pmd_regs(struct device_node *np); | ||
extern struct cbe_pmd_regs __iomem *cbe_get_cpu_pmd_regs(int cpu); | ||
|
||
/* | ||
* | ||
* IIC unit register definitions | ||
* | ||
*/ | ||
|
||
struct cbe_iic_pending_bits { | ||
u32 data; | ||
u8 flags; | ||
u8 class; | ||
u8 source; | ||
u8 prio; | ||
}; | ||
|
||
#define CBE_IIC_IRQ_VALID 0x80 | ||
#define CBE_IIC_IRQ_IPI 0x40 | ||
|
||
struct cbe_iic_thread_regs { | ||
struct cbe_iic_pending_bits pending; | ||
struct cbe_iic_pending_bits pending_destr; | ||
u64 generate; | ||
u64 prio; | ||
}; | ||
|
||
struct cbe_iic_regs { | ||
u8 pad_0x0000_0x0400[0x0400 - 0x0000]; /* 0x0000 */ | ||
|
||
/* IIC interrupt registers */ | ||
struct cbe_iic_thread_regs thread[2]; /* 0x0400 */ | ||
u64 iic_ir; /* 0x0440 */ | ||
u64 iic_is; /* 0x0448 */ | ||
|
||
u8 pad_0x0450_0x0500[0x0500 - 0x0450]; /* 0x0450 */ | ||
|
||
/* IOC FIR */ | ||
u64 ioc_fir_reset; /* 0x0500 */ | ||
u64 ioc_fir_set; | ||
u64 ioc_checkstop_enable; | ||
u64 ioc_fir_error_mask; | ||
u64 ioc_syserr_enable; | ||
u64 ioc_fir; | ||
|
||
u8 pad_0x0530_0x1000[0x1000 - 0x0530]; /* 0x0530 */ | ||
}; | ||
|
||
extern struct cbe_iic_regs __iomem *cbe_get_iic_regs(struct device_node *np); | ||
extern struct cbe_iic_regs __iomem *cbe_get_cpu_iic_regs(int cpu); | ||
|
||
|
||
/* Init this module early */ | ||
extern void cbe_regs_init(void); | ||
|
||
|
||
#endif /* CBE_REGS_H */ |
Oops, something went wrong.