Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc
* 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc: powerpc/pci: Fix MODPOST warning powerpc/oprofile: Add ppc750 CL as supported by oprofile powerpc: warning: allocated section `.data_nosave' not in segment powerpc/kgdb: Fix build failure caused by "kgdb.c: unused variable 'acc'" powerpc: Fix hypervisor TLB batching powerpc/mm: Fix hang accessing top of vmalloc space powerpc: Fix memory leak in axon_msi.c powerpc/pmac: Fix issues with sleep on some powerbooks powerpc64/ftrace: use PACA to retrieve TOC in mod_return_to_handler powerpc/ftrace: show real return addresses in modules
This commit is contained in:
Коммит
37a08b13eb
|
@ -37,7 +37,7 @@
|
||||||
#define FW_FEATURE_VIO ASM_CONST(0x0000000000004000)
|
#define FW_FEATURE_VIO ASM_CONST(0x0000000000004000)
|
||||||
#define FW_FEATURE_RDMA ASM_CONST(0x0000000000008000)
|
#define FW_FEATURE_RDMA ASM_CONST(0x0000000000008000)
|
||||||
#define FW_FEATURE_LLAN ASM_CONST(0x0000000000010000)
|
#define FW_FEATURE_LLAN ASM_CONST(0x0000000000010000)
|
||||||
#define FW_FEATURE_BULK ASM_CONST(0x0000000000020000)
|
#define FW_FEATURE_BULK_REMOVE ASM_CONST(0x0000000000020000)
|
||||||
#define FW_FEATURE_XDABR ASM_CONST(0x0000000000040000)
|
#define FW_FEATURE_XDABR ASM_CONST(0x0000000000040000)
|
||||||
#define FW_FEATURE_MULTITCE ASM_CONST(0x0000000000080000)
|
#define FW_FEATURE_MULTITCE ASM_CONST(0x0000000000080000)
|
||||||
#define FW_FEATURE_SPLPAR ASM_CONST(0x0000000000100000)
|
#define FW_FEATURE_SPLPAR ASM_CONST(0x0000000000100000)
|
||||||
|
@ -45,8 +45,7 @@
|
||||||
#define FW_FEATURE_LPAR ASM_CONST(0x0000000000400000)
|
#define FW_FEATURE_LPAR ASM_CONST(0x0000000000400000)
|
||||||
#define FW_FEATURE_PS3_LV1 ASM_CONST(0x0000000000800000)
|
#define FW_FEATURE_PS3_LV1 ASM_CONST(0x0000000000800000)
|
||||||
#define FW_FEATURE_BEAT ASM_CONST(0x0000000001000000)
|
#define FW_FEATURE_BEAT ASM_CONST(0x0000000001000000)
|
||||||
#define FW_FEATURE_BULK_REMOVE ASM_CONST(0x0000000002000000)
|
#define FW_FEATURE_CMO ASM_CONST(0x0000000002000000)
|
||||||
#define FW_FEATURE_CMO ASM_CONST(0x0000000004000000)
|
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
|
@ -58,8 +57,9 @@ enum {
|
||||||
FW_FEATURE_PERF | FW_FEATURE_DUMP | FW_FEATURE_INTERRUPT |
|
FW_FEATURE_PERF | FW_FEATURE_DUMP | FW_FEATURE_INTERRUPT |
|
||||||
FW_FEATURE_MIGRATE | FW_FEATURE_PERFMON | FW_FEATURE_CRQ |
|
FW_FEATURE_MIGRATE | FW_FEATURE_PERFMON | FW_FEATURE_CRQ |
|
||||||
FW_FEATURE_VIO | FW_FEATURE_RDMA | FW_FEATURE_LLAN |
|
FW_FEATURE_VIO | FW_FEATURE_RDMA | FW_FEATURE_LLAN |
|
||||||
FW_FEATURE_BULK | FW_FEATURE_XDABR | FW_FEATURE_MULTITCE |
|
FW_FEATURE_BULK_REMOVE | FW_FEATURE_XDABR |
|
||||||
FW_FEATURE_SPLPAR | FW_FEATURE_LPAR | FW_FEATURE_CMO,
|
FW_FEATURE_MULTITCE | FW_FEATURE_SPLPAR | FW_FEATURE_LPAR |
|
||||||
|
FW_FEATURE_CMO,
|
||||||
FW_FEATURE_PSERIES_ALWAYS = 0,
|
FW_FEATURE_PSERIES_ALWAYS = 0,
|
||||||
FW_FEATURE_ISERIES_POSSIBLE = FW_FEATURE_ISERIES | FW_FEATURE_LPAR,
|
FW_FEATURE_ISERIES_POSSIBLE = FW_FEATURE_ISERIES | FW_FEATURE_LPAR,
|
||||||
FW_FEATURE_ISERIES_ALWAYS = FW_FEATURE_ISERIES | FW_FEATURE_LPAR,
|
FW_FEATURE_ISERIES_ALWAYS = FW_FEATURE_ISERIES | FW_FEATURE_LPAR,
|
||||||
|
|
|
@ -711,6 +711,8 @@ static struct cpu_spec __initdata cpu_specs[] = {
|
||||||
.cpu_setup = __setup_cpu_750,
|
.cpu_setup = __setup_cpu_750,
|
||||||
.machine_check = machine_check_generic,
|
.machine_check = machine_check_generic,
|
||||||
.platform = "ppc750",
|
.platform = "ppc750",
|
||||||
|
.oprofile_cpu_type = "ppc/750",
|
||||||
|
.oprofile_type = PPC_OPROFILE_G4,
|
||||||
},
|
},
|
||||||
{ /* 745/755 */
|
{ /* 745/755 */
|
||||||
.pvr_mask = 0xfffff000,
|
.pvr_mask = 0xfffff000,
|
||||||
|
|
|
@ -1038,8 +1038,7 @@ _GLOBAL(mod_return_to_handler)
|
||||||
* We are in a module using the module's TOC.
|
* We are in a module using the module's TOC.
|
||||||
* Switch to our TOC to run inside the core kernel.
|
* Switch to our TOC to run inside the core kernel.
|
||||||
*/
|
*/
|
||||||
LOAD_REG_IMMEDIATE(r4,ftrace_return_to_handler)
|
ld r2, PACATOC(r13)
|
||||||
ld r2, 8(r4)
|
|
||||||
|
|
||||||
bl .ftrace_return_to_handler
|
bl .ftrace_return_to_handler
|
||||||
nop
|
nop
|
||||||
|
|
|
@ -282,12 +282,6 @@ void gdb_regs_to_pt_regs(unsigned long *gdb_regs, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
unsigned long *ptr = gdb_regs;
|
unsigned long *ptr = gdb_regs;
|
||||||
int reg;
|
int reg;
|
||||||
#ifdef CONFIG_SPE
|
|
||||||
union {
|
|
||||||
u32 v32[2];
|
|
||||||
u64 v64;
|
|
||||||
} acc;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (reg = 0; reg < 32; reg++)
|
for (reg = 0; reg < 32; reg++)
|
||||||
UNPACK64(regs->gpr[reg], ptr);
|
UNPACK64(regs->gpr[reg], ptr);
|
||||||
|
|
|
@ -1190,7 +1190,7 @@ EXPORT_SYMBOL(pcibios_align_resource);
|
||||||
* Reparent resource children of pr that conflict with res
|
* Reparent resource children of pr that conflict with res
|
||||||
* under res, and make res replace those children.
|
* under res, and make res replace those children.
|
||||||
*/
|
*/
|
||||||
static int __init reparent_resources(struct resource *parent,
|
static int reparent_resources(struct resource *parent,
|
||||||
struct resource *res)
|
struct resource *res)
|
||||||
{
|
{
|
||||||
struct resource *p, **pp;
|
struct resource *p, **pp;
|
||||||
|
|
|
@ -1016,9 +1016,13 @@ void show_stack(struct task_struct *tsk, unsigned long *stack)
|
||||||
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
||||||
int curr_frame = current->curr_ret_stack;
|
int curr_frame = current->curr_ret_stack;
|
||||||
extern void return_to_handler(void);
|
extern void return_to_handler(void);
|
||||||
unsigned long addr = (unsigned long)return_to_handler;
|
unsigned long rth = (unsigned long)return_to_handler;
|
||||||
|
unsigned long mrth = -1;
|
||||||
#ifdef CONFIG_PPC64
|
#ifdef CONFIG_PPC64
|
||||||
addr = *(unsigned long*)addr;
|
extern void mod_return_to_handler(void);
|
||||||
|
rth = *(unsigned long *)rth;
|
||||||
|
mrth = (unsigned long)mod_return_to_handler;
|
||||||
|
mrth = *(unsigned long *)mrth;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1044,7 +1048,7 @@ void show_stack(struct task_struct *tsk, unsigned long *stack)
|
||||||
if (!firstframe || ip != lr) {
|
if (!firstframe || ip != lr) {
|
||||||
printk("["REG"] ["REG"] %pS", sp, ip, (void *)ip);
|
printk("["REG"] ["REG"] %pS", sp, ip, (void *)ip);
|
||||||
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
||||||
if (ip == addr && curr_frame >= 0) {
|
if ((ip == rth || ip == mrth) && curr_frame >= 0) {
|
||||||
printk(" (%pS)",
|
printk(" (%pS)",
|
||||||
(void *)current->ret_stack[curr_frame].ret);
|
(void *)current->ret_stack[curr_frame].ret);
|
||||||
curr_frame--;
|
curr_frame--;
|
||||||
|
|
|
@ -236,6 +236,7 @@ SECTIONS
|
||||||
READ_MOSTLY_DATA(L1_CACHE_BYTES)
|
READ_MOSTLY_DATA(L1_CACHE_BYTES)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
. = ALIGN(PAGE_SIZE);
|
||||||
.data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) {
|
.data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) {
|
||||||
NOSAVE_DATA
|
NOSAVE_DATA
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,19 +72,17 @@ _GLOBAL(slb_miss_kernel_load_vmemmap)
|
||||||
1:
|
1:
|
||||||
#endif /* CONFIG_SPARSEMEM_VMEMMAP */
|
#endif /* CONFIG_SPARSEMEM_VMEMMAP */
|
||||||
|
|
||||||
/* vmalloc/ioremap mapping encoding bits, the "li" instructions below
|
/* vmalloc mapping gets the encoding from the PACA as the mapping
|
||||||
* will be patched by the kernel at boot
|
* can be demoted from 64K -> 4K dynamically on some machines
|
||||||
*/
|
*/
|
||||||
BEGIN_FTR_SECTION
|
|
||||||
/* check whether this is in vmalloc or ioremap space */
|
|
||||||
clrldi r11,r10,48
|
clrldi r11,r10,48
|
||||||
cmpldi r11,(VMALLOC_SIZE >> 28) - 1
|
cmpldi r11,(VMALLOC_SIZE >> 28) - 1
|
||||||
bgt 5f
|
bgt 5f
|
||||||
lhz r11,PACAVMALLOCSLLP(r13)
|
lhz r11,PACAVMALLOCSLLP(r13)
|
||||||
b 6f
|
b 6f
|
||||||
5:
|
5:
|
||||||
END_FTR_SECTION_IFCLR(CPU_FTR_CI_LARGE_PAGE)
|
/* IO mapping */
|
||||||
_GLOBAL(slb_miss_kernel_load_io)
|
_GLOBAL(slb_miss_kernel_load_io)
|
||||||
li r11,0
|
li r11,0
|
||||||
6:
|
6:
|
||||||
BEGIN_FTR_SECTION
|
BEGIN_FTR_SECTION
|
||||||
|
|
|
@ -365,7 +365,7 @@ static int axon_msi_probe(struct of_device *device,
|
||||||
printk(KERN_ERR
|
printk(KERN_ERR
|
||||||
"axon_msi: couldn't parse dcr properties on %s\n",
|
"axon_msi: couldn't parse dcr properties on %s\n",
|
||||||
dn->full_name);
|
dn->full_name);
|
||||||
goto out;
|
goto out_free_msic;
|
||||||
}
|
}
|
||||||
|
|
||||||
msic->dcr_host = dcr_map(dn, dcr_base, dcr_len);
|
msic->dcr_host = dcr_map(dn, dcr_base, dcr_len);
|
||||||
|
|
|
@ -540,8 +540,11 @@ static struct pmac_i2c_host_kw *__init kw_i2c_host_init(struct device_node *np)
|
||||||
/* Make sure IRQ is disabled */
|
/* Make sure IRQ is disabled */
|
||||||
kw_write_reg(reg_ier, 0);
|
kw_write_reg(reg_ier, 0);
|
||||||
|
|
||||||
/* Request chip interrupt */
|
/* Request chip interrupt. We set IRQF_TIMER because we don't
|
||||||
if (request_irq(host->irq, kw_i2c_irq, 0, "keywest i2c", host))
|
* want that interrupt disabled between the 2 passes of driver
|
||||||
|
* suspend or we'll have issues running the pfuncs
|
||||||
|
*/
|
||||||
|
if (request_irq(host->irq, kw_i2c_irq, IRQF_TIMER, "keywest i2c", host))
|
||||||
host->irq = NO_IRQ;
|
host->irq = NO_IRQ;
|
||||||
|
|
||||||
printk(KERN_INFO "KeyWest i2c @0x%08x irq %d %s\n",
|
printk(KERN_INFO "KeyWest i2c @0x%08x irq %d %s\n",
|
||||||
|
|
|
@ -51,11 +51,10 @@ firmware_features_table[FIRMWARE_MAX_FEATURES] = {
|
||||||
{FW_FEATURE_VIO, "hcall-vio"},
|
{FW_FEATURE_VIO, "hcall-vio"},
|
||||||
{FW_FEATURE_RDMA, "hcall-rdma"},
|
{FW_FEATURE_RDMA, "hcall-rdma"},
|
||||||
{FW_FEATURE_LLAN, "hcall-lLAN"},
|
{FW_FEATURE_LLAN, "hcall-lLAN"},
|
||||||
{FW_FEATURE_BULK, "hcall-bulk"},
|
{FW_FEATURE_BULK_REMOVE, "hcall-bulk"},
|
||||||
{FW_FEATURE_XDABR, "hcall-xdabr"},
|
{FW_FEATURE_XDABR, "hcall-xdabr"},
|
||||||
{FW_FEATURE_MULTITCE, "hcall-multi-tce"},
|
{FW_FEATURE_MULTITCE, "hcall-multi-tce"},
|
||||||
{FW_FEATURE_SPLPAR, "hcall-splpar"},
|
{FW_FEATURE_SPLPAR, "hcall-splpar"},
|
||||||
{FW_FEATURE_BULK_REMOVE, "hcall-bulk"},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Build up the firmware features bitmask using the contents of
|
/* Build up the firmware features bitmask using the contents of
|
||||||
|
|
|
@ -405,7 +405,11 @@ static int __init via_pmu_start(void)
|
||||||
printk(KERN_ERR "via-pmu: can't map interrupt\n");
|
printk(KERN_ERR "via-pmu: can't map interrupt\n");
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
if (request_irq(irq, via_pmu_interrupt, 0, "VIA-PMU", (void *)0)) {
|
/* We set IRQF_TIMER because we don't want the interrupt to be disabled
|
||||||
|
* between the 2 passes of driver suspend, we control our own disabling
|
||||||
|
* for that one
|
||||||
|
*/
|
||||||
|
if (request_irq(irq, via_pmu_interrupt, IRQF_TIMER, "VIA-PMU", (void *)0)) {
|
||||||
printk(KERN_ERR "via-pmu: can't request irq %d\n", irq);
|
printk(KERN_ERR "via-pmu: can't request irq %d\n", irq);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
@ -419,7 +423,7 @@ static int __init via_pmu_start(void)
|
||||||
gpio_irq = irq_of_parse_and_map(gpio_node, 0);
|
gpio_irq = irq_of_parse_and_map(gpio_node, 0);
|
||||||
|
|
||||||
if (gpio_irq != NO_IRQ) {
|
if (gpio_irq != NO_IRQ) {
|
||||||
if (request_irq(gpio_irq, gpio1_interrupt, 0,
|
if (request_irq(gpio_irq, gpio1_interrupt, IRQF_TIMER,
|
||||||
"GPIO1 ADB", (void *)0))
|
"GPIO1 ADB", (void *)0))
|
||||||
printk(KERN_ERR "pmu: can't get irq %d"
|
printk(KERN_ERR "pmu: can't get irq %d"
|
||||||
" (GPIO1)\n", gpio_irq);
|
" (GPIO1)\n", gpio_irq);
|
||||||
|
@ -925,8 +929,7 @@ proc_write_options(struct file *file, const char __user *buffer,
|
||||||
|
|
||||||
#ifdef CONFIG_ADB
|
#ifdef CONFIG_ADB
|
||||||
/* Send an ADB command */
|
/* Send an ADB command */
|
||||||
static int
|
static int pmu_send_request(struct adb_request *req, int sync)
|
||||||
pmu_send_request(struct adb_request *req, int sync)
|
|
||||||
{
|
{
|
||||||
int i, ret;
|
int i, ret;
|
||||||
|
|
||||||
|
@ -1005,16 +1008,11 @@ pmu_send_request(struct adb_request *req, int sync)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Enable/disable autopolling */
|
/* Enable/disable autopolling */
|
||||||
static int
|
static int __pmu_adb_autopoll(int devs)
|
||||||
pmu_adb_autopoll(int devs)
|
|
||||||
{
|
{
|
||||||
struct adb_request req;
|
struct adb_request req;
|
||||||
|
|
||||||
if ((vias == NULL) || (!pmu_fully_inited) || !pmu_has_adb)
|
|
||||||
return -ENXIO;
|
|
||||||
|
|
||||||
if (devs) {
|
if (devs) {
|
||||||
adb_dev_map = devs;
|
|
||||||
pmu_request(&req, NULL, 5, PMU_ADB_CMD, 0, 0x86,
|
pmu_request(&req, NULL, 5, PMU_ADB_CMD, 0, 0x86,
|
||||||
adb_dev_map >> 8, adb_dev_map);
|
adb_dev_map >> 8, adb_dev_map);
|
||||||
pmu_adb_flags = 2;
|
pmu_adb_flags = 2;
|
||||||
|
@ -1027,9 +1025,17 @@ pmu_adb_autopoll(int devs)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int pmu_adb_autopoll(int devs)
|
||||||
|
{
|
||||||
|
if ((vias == NULL) || (!pmu_fully_inited) || !pmu_has_adb)
|
||||||
|
return -ENXIO;
|
||||||
|
|
||||||
|
adb_dev_map = devs;
|
||||||
|
return __pmu_adb_autopoll(devs);
|
||||||
|
}
|
||||||
|
|
||||||
/* Reset the ADB bus */
|
/* Reset the ADB bus */
|
||||||
static int
|
static int pmu_adb_reset_bus(void)
|
||||||
pmu_adb_reset_bus(void)
|
|
||||||
{
|
{
|
||||||
struct adb_request req;
|
struct adb_request req;
|
||||||
int save_autopoll = adb_dev_map;
|
int save_autopoll = adb_dev_map;
|
||||||
|
@ -1038,13 +1044,13 @@ pmu_adb_reset_bus(void)
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
|
|
||||||
/* anyone got a better idea?? */
|
/* anyone got a better idea?? */
|
||||||
pmu_adb_autopoll(0);
|
__pmu_adb_autopoll(0);
|
||||||
|
|
||||||
req.nbytes = 5;
|
req.nbytes = 4;
|
||||||
req.done = NULL;
|
req.done = NULL;
|
||||||
req.data[0] = PMU_ADB_CMD;
|
req.data[0] = PMU_ADB_CMD;
|
||||||
req.data[1] = 0;
|
req.data[1] = ADB_BUSRESET;
|
||||||
req.data[2] = ADB_BUSRESET;
|
req.data[2] = 0;
|
||||||
req.data[3] = 0;
|
req.data[3] = 0;
|
||||||
req.data[4] = 0;
|
req.data[4] = 0;
|
||||||
req.reply_len = 0;
|
req.reply_len = 0;
|
||||||
|
@ -1056,7 +1062,7 @@ pmu_adb_reset_bus(void)
|
||||||
pmu_wait_complete(&req);
|
pmu_wait_complete(&req);
|
||||||
|
|
||||||
if (save_autopoll != 0)
|
if (save_autopoll != 0)
|
||||||
pmu_adb_autopoll(save_autopoll);
|
__pmu_adb_autopoll(save_autopoll);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче