Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
2b83a8d6
Commit
2b83a8d6
authored
Jun 24, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://kernel.bkbits.net/davem/net-2.6
into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents
74c23b08
1443a2ec
Changes
45
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
45 changed files
with
990 additions
and
820 deletions
+990
-820
Documentation/pci.txt
Documentation/pci.txt
+3
-2
Documentation/power/pci.txt
Documentation/power/pci.txt
+4
-4
arch/arm/common/Makefile
arch/arm/common/Makefile
+0
-1
arch/arm/common/platform.c
arch/arm/common/platform.c
+0
-35
arch/arm/configs/mainstone_defconfig
arch/arm/configs/mainstone_defconfig
+27
-56
arch/arm/mach-ebsa110/core.c
arch/arm/mach-ebsa110/core.c
+2
-1
arch/arm/mach-ebsa110/time.c
arch/arm/mach-ebsa110/time.c
+0
-118
arch/arm/mach-footbridge/time.c
arch/arm/mach-footbridge/time.c
+3
-3
arch/arm/mach-integrator/core.c
arch/arm/mach-integrator/core.c
+139
-0
arch/arm/mach-integrator/integrator_ap.c
arch/arm/mach-integrator/integrator_ap.c
+1
-1
arch/arm/mach-integrator/integrator_cp.c
arch/arm/mach-integrator/integrator_cp.c
+2
-0
arch/arm/mach-integrator/time.c
arch/arm/mach-integrator/time.c
+0
-144
arch/arm/mach-omap/bus.c
arch/arm/mach-omap/bus.c
+0
-39
arch/arm/mach-omap/time.c
arch/arm/mach-omap/time.c
+5
-0
arch/arm/mach-pxa/mainstone.c
arch/arm/mach-pxa/mainstone.c
+59
-0
arch/arm/mach-versatile/core.c
arch/arm/mach-versatile/core.c
+2
-2
arch/i386/kernel/dmi_scan.c
arch/i386/kernel/dmi_scan.c
+30
-0
arch/i386/kernel/smpboot.c
arch/i386/kernel/smpboot.c
+6
-2
arch/i386/pci/irq.c
arch/i386/pci/irq.c
+9
-0
arch/ppc64/kernel/bitops.c
arch/ppc64/kernel/bitops.c
+6
-6
drivers/pci/hotplug/pciehp_ctrl.c
drivers/pci/hotplug/pciehp_ctrl.c
+49
-98
drivers/pci/hotplug/pciehp_hpc.c
drivers/pci/hotplug/pciehp_hpc.c
+3
-1
drivers/pci/hotplug/pciehprm_acpi.c
drivers/pci/hotplug/pciehprm_acpi.c
+17
-5
drivers/pci/hotplug/pciehprm_nonacpi.c
drivers/pci/hotplug/pciehprm_nonacpi.c
+13
-5
drivers/pci/hotplug/rpadlpar_core.c
drivers/pci/hotplug/rpadlpar_core.c
+5
-23
drivers/pci/hotplug/rpaphp.h
drivers/pci/hotplug/rpaphp.h
+22
-6
drivers/pci/hotplug/rpaphp_core.c
drivers/pci/hotplug/rpaphp_core.c
+137
-62
drivers/pci/hotplug/rpaphp_pci.c
drivers/pci/hotplug/rpaphp_pci.c
+228
-100
drivers/pci/hotplug/rpaphp_slot.c
drivers/pci/hotplug/rpaphp_slot.c
+113
-23
drivers/pci/hotplug/rpaphp_vio.c
drivers/pci/hotplug/rpaphp_vio.c
+3
-3
drivers/pci/hotplug/shpchp.h
drivers/pci/hotplug/shpchp.h
+1
-0
drivers/pci/hotplug/shpchp_ctrl.c
drivers/pci/hotplug/shpchp_ctrl.c
+23
-37
drivers/pci/hotplug/shpchp_pci.c
drivers/pci/hotplug/shpchp_pci.c
+1
-0
drivers/pci/hotplug/shpchprm_acpi.c
drivers/pci/hotplug/shpchprm_acpi.c
+17
-5
drivers/pci/hotplug/shpchprm_nonacpi.c
drivers/pci/hotplug/shpchprm_nonacpi.c
+13
-5
drivers/pci/msi.c
drivers/pci/msi.c
+5
-5
drivers/pci/pci.c
drivers/pci/pci.c
+1
-1
drivers/pci/quirks.c
drivers/pci/quirks.c
+1
-0
drivers/video/acornfb.c
drivers/video/acornfb.c
+3
-1
fs/namei.c
fs/namei.c
+3
-1
include/asm-ppc64/bitops.h
include/asm-ppc64/bitops.h
+3
-3
include/asm-s390/byteorder.h
include/asm-s390/byteorder.h
+3
-3
include/linux/byteorder/swab.h
include/linux/byteorder/swab.h
+3
-3
include/linux/cpumask.h
include/linux/cpumask.h
+7
-7
include/linux/pci_ids.h
include/linux/pci_ids.h
+18
-9
No files found.
Documentation/pci.txt
View file @
2b83a8d6
...
...
@@ -166,8 +166,9 @@ count on these devices by calling pci_dev_put().
~~~~~~~~~~~~~~~~~~~
Before you do anything with the device you've found, you need to enable
it by calling pci_enable_device() which enables I/O and memory regions of
the device, assigns missing resources if needed and wakes up the device
if it was in suspended state. Please note that this function can fail.
the device, allocates an IRQ if necessary, assigns missing resources if
needed and wakes up the device if it was in suspended state. Please note
that this function can fail.
If you want to use the device in bus mastering mode, call pci_set_master()
which enables the bus master bit in PCI_COMMAND register and also fixes
...
...
Documentation/power/pci.txt
View file @
2b83a8d6
...
...
@@ -286,11 +286,11 @@ wake event from:
+------------------+
| Bit | State |
+------------------+
| 1
5
| D0 |
| 1
4
| D1 |
| 1
1
| D0 |
| 1
2
| D1 |
| 13 | D2 |
| 1
2
| D3hot |
| 1
1
| D3cold |
| 1
4
| D3hot |
| 1
5
| D3cold |
+------------------+
A device can use this to enable wake events:
...
...
arch/arm/common/Makefile
View file @
2b83a8d6
...
...
@@ -2,7 +2,6 @@
# Makefile for the linux kernel.
#
obj-y
+=
platform.o
obj-$(CONFIG_ARM_AMBA)
+=
amba.o
obj-$(CONFIG_ICST525)
+=
icst525.o
obj-$(CONFIG_SA1111)
+=
sa1111.o
...
...
arch/arm/common/platform.c
deleted
100644 → 0
View file @
74c23b08
#include <linux/ioport.h>
#include <linux/device.h>
#include <linux/init.h>
int
__init
platform_add_device
(
struct
platform_device
*
dev
)
{
int
i
;
for
(
i
=
0
;
i
<
dev
->
num_resources
;
i
++
)
{
struct
resource
*
r
=
&
dev
->
resource
[
i
];
r
->
name
=
dev
->
dev
.
bus_id
;
if
(
r
->
flags
&
IORESOURCE_MEM
&&
request_resource
(
&
iomem_resource
,
r
))
{
printk
(
KERN_ERR
"%s%d: failed to claim resource %d
\n
"
,
dev
->
name
,
dev
->
id
,
i
);
break
;
}
}
if
(
i
==
dev
->
num_resources
)
platform_device_register
(
dev
);
return
0
;
}
int
__init
platform_add_devices
(
struct
platform_device
**
devs
,
int
num
)
{
int
i
;
for
(
i
=
0
;
i
<
num
;
i
++
)
platform_add_device
(
devs
[
i
]);
return
0
;
}
arch/arm/configs/mainstone_defconfig
View file @
2b83a8d6
...
...
@@ -28,6 +28,7 @@ CONFIG_HOTPLUG=y
# CONFIG_IKCONFIG is not set
# CONFIG_EMBEDDED is not set
CONFIG_KALLSYMS=y
# CONFIG_KALLSYMS_ALL is not set
CONFIG_FUTEX=y
CONFIG_EPOLL=y
CONFIG_IOSCHED_NOOP=y
...
...
@@ -52,43 +53,22 @@ CONFIG_OBSOLETE_MODPARM=y
# CONFIG_ARCH_CLPS7500 is not set
# CONFIG_ARCH_CLPS711X is not set
# CONFIG_ARCH_CO285 is not set
CONFIG_ARCH_PXA=y
# CONFIG_ARCH_EBSA110 is not set
# CONFIG_ARCH_CAMELOT is not set
# CONFIG_ARCH_FOOTBRIDGE is not set
# CONFIG_ARCH_INTEGRATOR is not set
# CONFIG_ARCH_IOP3XX is not set
# CONFIG_ARCH_IXP4XX is not set
# CONFIG_ARCH_L7200 is not set
CONFIG_ARCH_PXA=y
# CONFIG_ARCH_RPC is not set
# CONFIG_ARCH_SA1100 is not set
# CONFIG_ARCH_SHARK is not set
# CONFIG_ARCH_S3C2410 is not set
# CONFIG_ARCH_
OMAP
is not set
# CONFIG_ARCH_
SHARK
is not set
# CONFIG_ARCH_LH7A40X is not set
# CONFIG_ARCH_OMAP is not set
# CONFIG_ARCH_VERSATILE_PB is not set
#
# CLPS711X/EP721X Implementations
#
#
# Epxa10db
#
#
# Footbridge Implementations
#
#
# IOP3xx Implementation Options
#
# CONFIG_ARCH_IOP310 is not set
# CONFIG_ARCH_IOP321 is not set
#
# IOP3xx Chipset Features
#
#
# Intel PXA2xx Implementations
#
...
...
@@ -98,34 +78,6 @@ CONFIG_MACH_MAINSTONE=y
CONFIG_PXA27x=y
CONFIG_IWMMXT=y
#
# SA11x0 Implementations
#
#
# TI OMAP Implementations
#
#
# OMAP Core Type
#
#
# OMAP Board Type
#
#
# OMAP Feature Selections
#
#
# S3C2410 Implementations
#
#
# LH7A40X Implementations
#
#
# Processor Type
#
...
...
@@ -163,6 +115,7 @@ CONFIG_PCMCIA_PXA2XX=y
CONFIG_FPE_NWFPE=y
# CONFIG_FPE_NWFPE_XP is not set
# CONFIG_FPE_FASTFPE is not set
# CONFIG_VFP is not set
CONFIG_BINFMT_ELF=y
# CONFIG_BINFMT_AOUT is not set
# CONFIG_BINFMT_MISC is not set
...
...
@@ -170,6 +123,7 @@ CONFIG_BINFMT_ELF=y
#
# Generic Driver Options
#
CONFIG_PREVENT_FIRMWARE_BUILD=y
# CONFIG_FW_LOADER is not set
# CONFIG_DEBUG_DRIVER is not set
# CONFIG_PM is not set
...
...
@@ -394,7 +348,6 @@ CONFIG_BLK_DEV_IDE=y
#
CONFIG_BLK_DEV_IDEDISK=y
# CONFIG_IDEDISK_MULTI_MODE is not set
# CONFIG_IDEDISK_STROKE is not set
CONFIG_BLK_DEV_IDECS=y
# CONFIG_BLK_DEV_IDECD is not set
# CONFIG_BLK_DEV_IDETAPE is not set
...
...
@@ -406,6 +359,7 @@ CONFIG_BLK_DEV_IDECS=y
# IDE chipset support/bugfixes
#
# CONFIG_IDE_GENERIC is not set
# CONFIG_IDE_ARM is not set
# CONFIG_BLK_DEV_IDEDMA is not set
# CONFIG_IDEDMA_AUTO is not set
# CONFIG_BLK_DEV_HD is not set
...
...
@@ -571,6 +525,7 @@ CONFIG_EXT2_FS=y
CONFIG_FAT_FS=y
CONFIG_MSDOS_FS=y
# CONFIG_VFAT_FS is not set
CONFIG_FAT_DEFAULT_CODEPAGE=437
# CONFIG_NTFS_FS is not set
#
...
...
@@ -622,7 +577,6 @@ CONFIG_SUNRPC=y
# CONFIG_CIFS is not set
# CONFIG_NCP_FS is not set
# CONFIG_CODA_FS is not set
# CONFIG_INTERMEZZO_FS is not set
# CONFIG_AFS_FS is not set
#
...
...
@@ -658,6 +612,7 @@ CONFIG_NLS_DEFAULT="iso8859-1"
# CONFIG_NLS_ISO8859_8 is not set
# CONFIG_NLS_CODEPAGE_1250 is not set
# CONFIG_NLS_CODEPAGE_1251 is not set
# CONFIG_NLS_ASCII is not set
CONFIG_NLS_ISO8859_1=y
# CONFIG_NLS_ISO8859_2 is not set
# CONFIG_NLS_ISO8859_3 is not set
...
...
@@ -681,7 +636,10 @@ CONFIG_NLS_ISO8859_1=y
#
# Graphics support
#
# CONFIG_FB is not set
CONFIG_FB=y
CONFIG_FB_PXA=y
# CONFIG_FB_PXA_PARAMETERS is not set
# CONFIG_FB_VIRTUAL is not set
#
# Console display driver support
...
...
@@ -689,6 +647,19 @@ CONFIG_NLS_ISO8859_1=y
# CONFIG_VGA_CONSOLE is not set
# CONFIG_MDA_CONSOLE is not set
CONFIG_DUMMY_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_PCI_CONSOLE=y
# CONFIG_FONTS is not set
CONFIG_FONT_8x8=y
CONFIG_FONT_8x16=y
#
# Logo configuration
#
CONFIG_LOGO=y
CONFIG_LOGO_LINUX_MONO=y
CONFIG_LOGO_LINUX_VGA16=y
CONFIG_LOGO_LINUX_CLUT224=y
#
# Sound
...
...
arch/arm/mach-ebsa110/core.c
View file @
2b83a8d6
...
...
@@ -11,6 +11,7 @@
*/
#include <linux/kernel.h>
#include <linux/mm.h>
#include <linux/interrupt.h>
#include <linux/init.h>
#include <asm/hardware.h>
...
...
@@ -174,7 +175,7 @@ static struct irqaction ebsa110_timer_irq = {
/*
* Set up timer interrupt.
*/
void
__init
ebsa110_time_init
(
void
)
static
void
__init
ebsa110_init_time
(
void
)
{
/*
* Timer 1, mode 2, LSB/MSB
...
...
arch/arm/mach-ebsa110/time.c
deleted
100644 → 0
View file @
74c23b08
/*
* linux/include/asm-arm/arch-ebsa110/time.h
*
* Copyright (C) 1996,1997,1998 Russell King.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* No real time clock on the evalulation board!
*
* Changelog:
* 10-Oct-1996 RMK Created
* 04-Dec-1997 RMK Updated for new arch/arm/kernel/time.c
* 07-Aug-1998 RMK Updated for arch/arm/kernel/leds.c
* 28-Dec-1998 APH Made leds code optional
*/
#include <asm/leds.h>
#include <asm/io.h>
extern
unsigned
long
(
*
gettimeoffset
)(
void
);
#define PIT_CTRL (PIT_BASE + 0x0d)
#define PIT_T2 (PIT_BASE + 0x09)
#define PIT_T1 (PIT_BASE + 0x05)
#define PIT_T0 (PIT_BASE + 0x01)
/*
* This is the rate at which your MCLK signal toggles (in Hz)
* This was measured on a 10 digit frequency counter sampling
* over 1 second.
*/
#define MCLK 47894000
/*
* This is the rate at which the PIT timers get clocked
*/
#define CLKBY7 (MCLK / 7)
/*
* This is the counter value. We tick at 200Hz on this platform.
*/
#define COUNT ((CLKBY7 + (HZ / 2)) / HZ)
/*
* Get the time offset from the system PIT. Note that if we have missed an
* interrupt, then the PIT counter will roll over (ie, be negative).
* This actually works out to be convenient.
*/
static
unsigned
long
ebsa110_gettimeoffset
(
void
)
{
unsigned
long
offset
,
count
;
__raw_writeb
(
0x40
,
PIT_CTRL
);
count
=
__raw_readb
(
PIT_T1
);
count
|=
__raw_readb
(
PIT_T1
)
<<
8
;
/*
* If count > COUNT, make the number negative.
*/
if
(
count
>
COUNT
)
count
|=
0xffff0000
;
offset
=
COUNT
;
offset
-=
count
;
/*
* `offset' is in units of timer counts. Convert
* offset to units of microseconds.
*/
offset
=
offset
*
(
1000000
/
HZ
)
/
COUNT
;
return
offset
;
}
static
irqreturn_t
timer_interrupt
(
int
irq
,
void
*
dev_id
,
struct
pt_regs
*
regs
)
{
u32
count
;
/* latch and read timer 1 */
__raw_writeb
(
0x40
,
PIT_CTRL
);
count
=
__raw_readb
(
PIT_T1
);
count
|=
__raw_readb
(
PIT_T1
)
<<
8
;
count
+=
COUNT
;
__raw_writeb
(
count
&
0xff
,
PIT_T1
);
__raw_writeb
(
count
>>
8
,
PIT_T1
);
do_leds
();
do_timer
(
regs
);
do_profile
(
regs
);
return
IRQ_HANDLED
;
}
/*
* Set up timer interrupt.
*/
void
__init
time_init
(
void
)
{
/*
* Timer 1, mode 2, LSB/MSB
*/
__raw_writeb
(
0x70
,
PIT_CTRL
);
__raw_writeb
(
COUNT
&
0xff
,
PIT_T1
);
__raw_writeb
(
COUNT
>>
8
,
PIT_T1
);
gettimeoffset
=
ebsa110_gettimeoffset
;
timer_irq
.
handler
=
timer_interrupt
;
setup_irq
(
IRQ_EBSA110_TIMER0
,
&
timer_irq
);
}
arch/arm/mach-footbridge/time.c
View file @
2b83a8d6
...
...
@@ -275,7 +275,7 @@ void __init footbridge_init_time(void)
*
CSR_TIMER1_CNTL
=
TIMER_CNTL_ENABLE
|
TIMER_CNTL_AUTORELOAD
|
TIMER_CNTL_DIV16
;
footbridge_timer_irq
.
name
=
"Timer1 Timer Tick"
;
footbr
di
ge_timer_irq
.
handler
=
timer1_interrupt
;
footbr
id
ge_timer_irq
.
handler
=
timer1_interrupt
;
setup_irq
(
IRQ_TIMER1
,
&
footbridge_timer_irq
);
...
...
@@ -289,8 +289,8 @@ void __init footbridge_init_time(void)
gettimeoffset
=
isa_gettimeoffset
;
footbridge_timer_irq
.
name
=
"ISA Timer Tick"
;
footbr
di
ge_timer_irq
.
handler
=
isa_timer_interrupt
;
footbr
id
ge_timer_irq
.
handler
=
isa_timer_interrupt
;
setup_irq
(
IRQ_ISA
,
&
footbridge_timer_irq
);
setup_irq
(
IRQ_ISA
_TIMER
,
&
footbridge_timer_irq
);
}
}
arch/arm/mach-integrator/core.c
View file @
2b83a8d6
...
...
@@ -12,12 +12,17 @@
#include <linux/init.h>
#include <linux/device.h>
#include <linux/spinlock.h>
#include <linux/interrupt.h>
#include <linux/sched.h>
#include <asm/hardware.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <asm/hardware/amba.h>
#include <asm/arch/cm.h>
#include <asm/system.h>
#include <asm/leds.h>
#include <asm/mach/time.h>
static
struct
amba_device
rtc_device
=
{
.
dev
=
{
...
...
@@ -127,3 +132,137 @@ void cm_control(u32 mask, u32 set)
}
EXPORT_SYMBOL
(
cm_control
);
/*
* Where is the timer (VA)?
*/
#define TIMER0_VA_BASE (IO_ADDRESS(INTEGRATOR_CT_BASE)+0x00000000)
#define TIMER1_VA_BASE (IO_ADDRESS(INTEGRATOR_CT_BASE)+0x00000100)
#define TIMER2_VA_BASE (IO_ADDRESS(INTEGRATOR_CT_BASE)+0x00000200)
#define VA_IC_BASE IO_ADDRESS(INTEGRATOR_IC_BASE)
/*
* How long is the timer interval?
*/
#define TIMER_INTERVAL (TICKS_PER_uSEC * mSEC_10)
#if TIMER_INTERVAL >= 0x100000
#define TICKS2USECS(x) (256 * (x) / TICKS_PER_uSEC)
#elif TIMER_INTERVAL >= 0x10000
#define TICKS2USECS(x) (16 * (x) / TICKS_PER_uSEC)
#else
#define TICKS2USECS(x) ((x) / TICKS_PER_uSEC)
#endif
/*
* What does it look like?
*/
typedef
struct
TimerStruct
{
unsigned
long
TimerLoad
;
unsigned
long
TimerValue
;
unsigned
long
TimerControl
;
unsigned
long
TimerClear
;
}
TimerStruct_t
;
extern
unsigned
long
(
*
gettimeoffset
)(
void
);
static
unsigned
long
timer_reload
;
/*
* Returns number of ms since last clock interrupt. Note that interrupts
* will have been disabled by do_gettimeoffset()
*/
static
unsigned
long
integrator_gettimeoffset
(
void
)
{
volatile
TimerStruct_t
*
timer1
=
(
TimerStruct_t
*
)
TIMER1_VA_BASE
;
unsigned
long
ticks1
,
ticks2
,
status
;
/*
* Get the current number of ticks. Note that there is a race
* condition between us reading the timer and checking for
* an interrupt. We get around this by ensuring that the
* counter has not reloaded between our two reads.
*/
ticks2
=
timer1
->
TimerValue
&
0xffff
;
do
{
ticks1
=
ticks2
;
status
=
__raw_readl
(
VA_IC_BASE
+
IRQ_RAW_STATUS
);
ticks2
=
timer1
->
TimerValue
&
0xffff
;
}
while
(
ticks2
>
ticks1
);
/*
* Number of ticks since last interrupt.
*/
ticks1
=
timer_reload
-
ticks2
;
/*
* Interrupt pending? If so, we've reloaded once already.
*/
if
(
status
&
(
1
<<
IRQ_TIMERINT1
))
ticks1
+=
timer_reload
;
/*
* Convert the ticks to usecs
*/
return
TICKS2USECS
(
ticks1
);
}
/*
* IRQ handler for the timer
*/
static
irqreturn_t
integrator_timer_interrupt
(
int
irq
,
void
*
dev_id
,
struct
pt_regs
*
regs
)
{
volatile
TimerStruct_t
*
timer1
=
(
volatile
TimerStruct_t
*
)
TIMER1_VA_BASE
;
// ...clear the interrupt
timer1
->
TimerClear
=
1
;
timer_tick
(
regs
);
return
IRQ_HANDLED
;
}
static
struct
irqaction
integrator_timer_irq
=
{
.
name
=
"Integrator Timer Tick"
,
.
flags
=
SA_INTERRUPT
,
.
handler
=
integrator_timer_interrupt
};
/*
* Set up timer interrupt, and return the current time in seconds.
*/
void
__init
integrator_time_init
(
unsigned
long
reload
,
unsigned
int
ctrl
)
{
volatile
TimerStruct_t
*
timer0
=
(
volatile
TimerStruct_t
*
)
TIMER0_VA_BASE
;
volatile
TimerStruct_t
*
timer1
=
(
volatile
TimerStruct_t
*
)
TIMER1_VA_BASE
;
volatile
TimerStruct_t
*
timer2
=
(
volatile
TimerStruct_t
*
)
TIMER2_VA_BASE
;
unsigned
int
timer_ctrl
=
0x80
|
0x40
;
/* periodic */
timer_reload
=
reload
;
timer_ctrl
|=
ctrl
;
if
(
timer_reload
>
0x100000
)
{
timer_reload
>>=
8
;
timer_ctrl
|=
0x08
;
/* /256 */
}
else
if
(
timer_reload
>
0x010000
)
{
timer_reload
>>=
4
;
timer_ctrl
|=
0x04
;
/* /16 */
}
/*
* Initialise to a known state (all timers off)
*/
timer0
->
TimerControl
=
0
;
timer1
->
TimerControl
=
0
;
timer2
->
TimerControl
=
0
;
timer1
->
TimerLoad
=
timer_reload
;
timer1
->
TimerValue
=
timer_reload
;
timer1
->
TimerControl
=
timer_ctrl
;
/*
* Make irqs happen for the system timer
*/
setup_irq
(
IRQ_TIMERINT1
,
&
integrator_timer_irq
);
gettimeoffset
=
integrator_gettimeoffset
;
}
arch/arm/mach-integrator/integrator_ap.c
View file @
2b83a8d6
...
...
@@ -256,7 +256,7 @@ static void __init ap_init(void)
unsigned
long
sc_dec
;
int
i
;
platform_
add_device
(
&
cfi_flash_device
);
platform_
device_register
(
&
cfi_flash_device
);
sc_dec
=
readl
(
VA_SC_BASE
+
INTEGRATOR_SC_DEC_OFFSET
);
for
(
i
=
0
;
i
<
4
;
i
++
)
{
...
...
arch/arm/mach-integrator/integrator_cp.c
View file @
2b83a8d6
...
...
@@ -419,6 +419,8 @@ static void __init intcp_init(void)
}
}
#define TIMER_CTRL_IE (1 << 5)
/* Interrupt Enable */
static
void
__init
intcp_init_time
(
void
)
{
integrator_time_init
(
1000000
/
HZ
,
TIMER_CTRL_IE
);
...
...
arch/arm/mach-integrator/time.c
View file @
2b83a8d6
...
...
@@ -10,16 +10,9 @@
#include <linux/kernel.h>
#include <linux/time.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/sched.h>
#include <asm/hardware.h>
#include <asm/io.h>
#include <asm/system.h>
#include <asm/leds.h>
#include <asm/mach-types.h>
#include <asm/mach/time.h>
#define RTC_DR (IO_ADDRESS(INTEGRATOR_RTC_BASE) + 0)
#define RTC_MR (IO_ADDRESS(INTEGRATOR_RTC_BASE) + 4)
...
...
@@ -51,140 +44,3 @@ static int integrator_rtc_init(void)
}
__initcall
(
integrator_rtc_init
);
/*
* Where is the timer (VA)?
*/
#define TIMER0_VA_BASE (IO_ADDRESS(INTEGRATOR_CT_BASE)+0x00000000)
#define TIMER1_VA_BASE (IO_ADDRESS(INTEGRATOR_CT_BASE)+0x00000100)
#define TIMER2_VA_BASE (IO_ADDRESS(INTEGRATOR_CT_BASE)+0x00000200)
#define VA_IC_BASE IO_ADDRESS(INTEGRATOR_IC_BASE)
/*
* How long is the timer interval?
*/
#define TIMER_INTERVAL (TICKS_PER_uSEC * mSEC_10)
#if TIMER_INTERVAL >= 0x100000
#define TICKS2USECS(x) (256 * (x) / TICKS_PER_uSEC)
#elif TIMER_INTERVAL >= 0x10000
#define TICKS2USECS(x) (16 * (x) / TICKS_PER_uSEC)
#else
#define TICKS2USECS(x) ((x) / TICKS_PER_uSEC)
#endif
#define TIMER_CTRL_IE (1 << 5)
/* Interrupt Enable */
/*
* What does it look like?
*/
typedef
struct
TimerStruct
{
unsigned
long
TimerLoad
;
unsigned
long
TimerValue
;
unsigned
long
TimerControl
;
unsigned
long
TimerClear
;
}
TimerStruct_t
;
extern
unsigned
long
(
*
gettimeoffset
)(
void
);
static
unsigned
long
timer_reload
;
/*
* Returns number of ms since last clock interrupt. Note that interrupts
* will have been disabled by do_gettimeoffset()
*/
static
unsigned
long
integrator_gettimeoffset
(
void
)
{
volatile
TimerStruct_t
*
timer1
=
(
TimerStruct_t
*
)
TIMER1_VA_BASE
;
unsigned
long
ticks1
,
ticks2
,
status
;
/*
* Get the current number of ticks. Note that there is a race
* condition between us reading the timer and checking for
* an interrupt. We get around this by ensuring that the
* counter has not reloaded between our two reads.
*/
ticks2
=
timer1
->
TimerValue
&
0xffff
;
do
{
ticks1
=
ticks2
;
status
=
__raw_readl
(
VA_IC_BASE
+
IRQ_RAW_STATUS
);
ticks2
=
timer1
->
TimerValue
&
0xffff
;
}
while
(
ticks2
>
ticks1
);
/*
* Number of ticks since last interrupt.
*/
ticks1
=
timer_reload
-
ticks2
;
/*
* Interrupt pending? If so, we've reloaded once already.
*/
if
(
status
&
(
1
<<
IRQ_TIMERINT1
))
ticks1
+=
timer_reload
;
/*
* Convert the ticks to usecs
*/
return
TICKS2USECS
(
ticks1
);
}
/*
* IRQ handler for the timer
*/
static
irqreturn_t
integrator_timer_interrupt
(
int
irq
,
void
*
dev_id
,
struct
pt_regs
*
regs
)
{
volatile
TimerStruct_t
*
timer1
=
(
volatile
TimerStruct_t
*
)
TIMER1_VA_BASE
;
// ...clear the interrupt
timer1
->
TimerClear
=
1
;
timer_tick
(
regs
);
return
IRQ_HANDLED
;
}
static
struct
irqaction
integrator_timer_irq
=
{
.
name
=
"Integrator Timer Tick"
,
.
flags
=
SA_INTERRUPT
,
.
handler
=
integrator_timer_interrupt
};
/*
* Set up timer interrupt, and return the current time in seconds.
*/
void
__init
integrator_time_init
(
unsigned
long
reload
,
unsigned
int
ctrl
)
{
volatile
TimerStruct_t
*
timer0
=
(
volatile
TimerStruct_t
*
)
TIMER0_VA_BASE
;
volatile
TimerStruct_t
*
timer1
=
(
volatile
TimerStruct_t
*
)
TIMER1_VA_BASE
;
volatile
TimerStruct_t
*
timer2
=
(
volatile
TimerStruct_t
*
)
TIMER2_VA_BASE
;
unsigned
int
timer_ctrl
=
0x80
|
0x40
;
/* periodic */
timer_reload
=
reload
;
timer_ctrl
|=
ctrl
;
if
(
timer_reload
>
0x100000
)
{
timer_reload
>>=
8
;
timer_ctrl
|=
0x08
;
/* /256 */
}
else
if
(
timer_reload
>
0x010000
)
{
timer_reload
>>=
4
;
timer_ctrl
|=
0x04
;
/* /16 */
}
/*
* Initialise to a known state (all timers off)
*/
timer0
->
TimerControl
=
0
;
timer1
->
TimerControl
=
0
;
timer2
->
TimerControl
=
0
;
timer1
->
TimerLoad
=
timer_reload
;
timer1
->
TimerValue
=
timer_reload
;
timer1
->
TimerControl
=
timer_ctrl
;
/*
* Make irqs happen for the system timer
*/
setup_irq
(
IRQ_TIMERINT1
,
&
integrator_timer_irq
);
gettimeoffset
=
integrator_gettimeoffset
;
}
arch/arm/mach-omap/bus.c
View file @
2b83a8d6
...
...
@@ -81,40 +81,6 @@ static struct bus_type omap_bus_types[OMAP_NR_BUSES] = {
},
};
#ifdef CONFIG_ARCH_OMAP1510
/*
* NOTE: This code _should_ go somewhere else. But let's wait for the
* dma-mapping code to settle down first.
*/
/*
* Test for Local Bus device in order to do address translation between
* dma_handle and Local Bus address.
*/
inline
int
dmadev_uses_omap_lbus
(
struct
device
*
dev
)
{
if
(
dev
==
NULL
||
!
cpu_is_omap1510
())
return
0
;
return
dev
->
bus
==
&
omap_bus_types
[
OMAP_BUS_LBUS
]
?
1
:
0
;
}
/*
* Translate bus address to Local Bus address for dma-mapping
*/
inline
int
dmadev_to_lbus
(
dma_addr_t
addr
)
{
return
bus_to_lbus
(
addr
);
}
/*
* Translate Local Bus address to bus address for dma-mapping
*/
inline
int
lbus_to_dmadev
(
dma_addr_t
addr
)
{
return
lbus_to_bus
(
addr
);
}
#endif
static
int
omap_bus_match
(
struct
device
*
dev
,
struct
device_driver
*
drv
)
{
struct
omap_dev
*
omapdev
=
OMAP_DEV
(
dev
);
...
...
@@ -278,8 +244,3 @@ EXPORT_SYMBOL(omap_driver_unregister);
EXPORT_SYMBOL
(
omap_device_register
);
EXPORT_SYMBOL
(
omap_device_unregister
);
#ifdef CONFIG_ARCH_OMAP1510
EXPORT_SYMBOL
(
dmadev_uses_omap_lbus
);
EXPORT_SYMBOL
(
dmadev_to_lbus
);
EXPORT_SYMBOL
(
lbus_to_dmadev
);
#endif
arch/arm/mach-omap/time.c
View file @
2b83a8d6
...
...
@@ -28,7 +28,12 @@
*/
#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/interrupt.h>
#include <linux/sched.h>
#include <asm/system.h>
#include <asm/hardware.h>
#include <asm/io.h>
...
...
arch/arm/mach-pxa/mainstone.c
View file @
2b83a8d6
...
...
@@ -18,6 +18,7 @@
#include <linux/interrupt.h>
#include <linux/sched.h>
#include <linux/bitops.h>
#include <linux/fb.h>
#include <asm/types.h>
#include <asm/setup.h>
...
...
@@ -31,6 +32,7 @@
#include <asm/mach/irq.h>
#include <asm/arch/mainstone.h>
#include <asm/arch/pxafb.h>
#include "generic.h"
...
...
@@ -116,9 +118,66 @@ static struct platform_device smc91x_device = {
.
resource
=
smc91x_resources
,
};
static
void
mainstone_backlight_power
(
int
on
)
{
if
(
on
)
{
pxa_gpio_mode
(
GPIO16_PWM0_MD
);
pxa_set_cken
(
CKEN0_PWM0
,
1
);
PWM_CTRL0
=
0
;
PWM_PWDUTY0
=
0x3ff
;
PWM_PERVAL0
=
0x3ff
;
}
else
{
PWM_CTRL0
=
0
;
PWM_PWDUTY0
=
0x0
;
PWM_PERVAL0
=
0x3FF
;
pxa_set_cken
(
CKEN0_PWM0
,
0
);
}
}
static
struct
pxafb_mach_info
toshiba_ltm04c380k
__initdata
=
{
.
pixclock
=
50000
,
.
xres
=
640
,
.
yres
=
480
,
.
bpp
=
16
,
.
hsync_len
=
1
,
.
left_margin
=
0x9f
,
.
right_margin
=
1
,
.
vsync_len
=
44
,
.
upper_margin
=
0
,
.
lower_margin
=
0
,
.
sync
=
FB_SYNC_HOR_HIGH_ACT
|
FB_SYNC_VERT_HIGH_ACT
,
.
lccr0
=
LCCR0_Act
,
.
lccr3
=
LCCR3_PCP
,
.
pxafb_backlight_power
=
mainstone_backlight_power
,
};
static
struct
pxafb_mach_info
toshiba_ltm035a776c
__initdata
=
{
.
pixclock
=
110000
,
.
xres
=
240
,
.
yres
=
320
,
.
bpp
=
16
,
.
hsync_len
=
4
,
.
left_margin
=
8
,
.
right_margin
=
20
,
.
vsync_len
=
3
,
.
upper_margin
=
1
,
.
lower_margin
=
10
,
.
sync
=
FB_SYNC_HOR_HIGH_ACT
|
FB_SYNC_VERT_HIGH_ACT
,
.
lccr0
=
LCCR0_Act
,
.
lccr3
=
LCCR3_PCP
,
.
pxafb_backlight_power
=
mainstone_backlight_power
,
};
static
void
__init
mainstone_init
(
void
)
{
platform_add_device
(
&
smc91x_device
);
/* reading the BSR might be handy to select LCD type here */
if
(
0
)
set_pxa_fb_info
(
&
toshiba_ltm04c380k
);
else
set_pxa_fb_info
(
&
toshiba_ltm035a776c
);
}
...
...
arch/arm/mach-versatile/core.c
View file @
2b83a8d6
...
...
@@ -503,8 +503,8 @@ static void __init versatile_init(void)
{
int
i
;
platform_
add_device
(
&
versatile_flash_device
);
platform_
add_device
(
&
smc91x_device
);
platform_
device_register
(
&
versatile_flash_device
);
platform_
device_register
(
&
smc91x_device
);
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
amba_devs
);
i
++
)
{
struct
amba_device
*
d
=
amba_devs
[
i
];
...
...
arch/i386/kernel/dmi_scan.c
View file @
2b83a8d6
...
...
@@ -313,6 +313,22 @@ static __init int disable_smbus(struct dmi_blacklist *d)
return
0
;
}
/*
* Work around broken Acer TravelMate 360 Notebooks which assign Cardbus to
* IRQ 11 even though it is actually wired to IRQ 10
*/
static
__init
int
fix_acer_tm360_irqrouting
(
struct
dmi_blacklist
*
d
)
{
#ifdef CONFIG_PCI
extern
int
acer_tm360_irqrouting
;
if
(
acer_tm360_irqrouting
==
0
)
{
acer_tm360_irqrouting
=
1
;
printk
(
KERN_INFO
"%s detected - fixing broken IRQ routing
\n
"
,
d
->
ident
);
}
#endif
return
0
;
}
/*
* Check for clue free BIOS implementations who use
* the following QA technique
...
...
@@ -799,6 +815,13 @@ static __initdata struct dmi_blacklist dmi_blacklist[]={
NO_MATCH
,
NO_MATCH
}
},
{
fix_acer_tm360_irqrouting
,
"Acer TravelMate 36x Laptop"
,
{
MATCH
(
DMI_SYS_VENDOR
,
"Acer"
),
MATCH
(
DMI_PRODUCT_NAME
,
"TravelMate 360"
),
NO_MATCH
,
NO_MATCH
}
},
/*
* Generic per vendor APM settings
*/
...
...
@@ -986,6 +1009,13 @@ static __initdata struct dmi_blacklist dmi_blacklist[]={
MATCH
(
DMI_BOARD_NAME
,
"PR-DLS"
),
MATCH
(
DMI_BIOS_VERSION
,
"ASUS PR-DLS ACPI BIOS Revision 1010"
),
MATCH
(
DMI_BIOS_DATE
,
"03/21/2003"
)
}},
{
disable_acpi_pci
,
"Acer TravelMate 36x Laptop"
,
{
MATCH
(
DMI_SYS_VENDOR
,
"Acer"
),
MATCH
(
DMI_PRODUCT_NAME
,
"TravelMate 360"
),
NO_MATCH
,
NO_MATCH
}
},
#endif
{
NULL
,
}
...
...
arch/i386/kernel/smpboot.c
View file @
2b83a8d6
...
...
@@ -1192,7 +1192,9 @@ __init void arch_init_sched_domains(void)
int
j
;
cpumask_t
nodemask
;
struct
sched_group
*
node
=
&
sched_group_nodes
[
i
];
cpus_and
(
nodemask
,
node_to_cpumask
(
i
),
cpu_possible_map
);
cpumask_t
node_cpumask
=
node_to_cpumask
(
i
);
cpus_and
(
nodemask
,
node_cpumask
,
cpu_possible_map
);
if
(
cpus_empty
(
nodemask
))
continue
;
...
...
@@ -1228,7 +1230,9 @@ __init void arch_init_sched_domains(void)
for
(
i
=
0
;
i
<
MAX_NUMNODES
;
i
++
)
{
struct
sched_group
*
cpu
=
&
sched_group_nodes
[
i
];
cpumask_t
nodemask
;
cpus_and
(
nodemask
,
node_to_cpumask
(
i
),
cpu_possible_map
);
cpumask_t
node_cpumask
=
node_to_cpumask
(
i
);
cpus_and
(
nodemask
,
node_cpumask
,
cpu_possible_map
);
if
(
cpus_empty
(
nodemask
))
continue
;
...
...
arch/i386/pci/irq.c
View file @
2b83a8d6
...
...
@@ -24,6 +24,7 @@
#define PIRQ_VERSION 0x0100
static
int
broken_hp_bios_irq9
;
int
acer_tm360_irqrouting
;
static
struct
irq_routing_table
*
pirq_table
;
...
...
@@ -746,6 +747,14 @@ static int pcibios_lookup_irq(struct pci_dev *dev, int assign)
r
->
set
(
pirq_router_dev
,
dev
,
pirq
,
11
);
}
/* same for Acer Travelmate 360, but with CB and irq 11 -> 10 */
if
(
acer_tm360_irqrouting
&&
dev
->
irq
==
11
&&
dev
->
vendor
==
PCI_VENDOR_ID_O2
)
{
pirq
=
0x68
;
mask
=
0x400
;
dev
->
irq
=
r
->
get
(
pirq_router_dev
,
dev
,
pirq
);
pci_write_config_byte
(
dev
,
PCI_INTERRUPT_LINE
,
dev
->
irq
);
}
/*
* Find the best IRQ to assign: use the one
* reported by the device if possible.
...
...
arch/ppc64/kernel/bitops.c
View file @
2b83a8d6
...
...
@@ -7,10 +7,10 @@
#include <asm/bitops.h>
#include <asm/byteorder.h>
unsigned
long
find_next_zero_bit
(
unsigned
long
*
addr
,
unsigned
long
size
,
unsigned
long
find_next_zero_bit
(
const
unsigned
long
*
addr
,
unsigned
long
size
,
unsigned
long
offset
)
{
unsigned
long
*
p
=
addr
+
(
offset
>>
6
);
const
unsigned
long
*
p
=
addr
+
(
offset
>>
6
);
unsigned
long
result
=
offset
&
~
63UL
;
unsigned
long
tmp
;
...
...
@@ -48,10 +48,10 @@ unsigned long find_next_zero_bit(unsigned long *addr, unsigned long size,
EXPORT_SYMBOL
(
find_next_zero_bit
);
unsigned
long
find_next_bit
(
unsigned
long
*
addr
,
unsigned
long
size
,
unsigned
long
find_next_bit
(
const
unsigned
long
*
addr
,
unsigned
long
size
,
unsigned
long
offset
)
{
unsigned
long
*
p
=
addr
+
(
offset
>>
6
);
const
unsigned
long
*
p
=
addr
+
(
offset
>>
6
);
unsigned
long
result
=
offset
&
~
63UL
;
unsigned
long
tmp
;
...
...
@@ -106,10 +106,10 @@ static inline unsigned int ext2_ffz(unsigned int x)
return
rc
;
}
unsigned
long
find_next_zero_le_bit
(
unsigned
long
*
addr
,
unsigned
long
size
,
unsigned
long
find_next_zero_le_bit
(
const
unsigned
long
*
addr
,
unsigned
long
size
,
unsigned
long
offset
)
{
unsigned
int
*
p
=
((
unsigned
int
*
)
addr
)
+
(
offset
>>
5
);
const
unsigned
int
*
p
=
((
const
unsigned
int
*
)
addr
)
+
(
offset
>>
5
);
unsigned
int
result
=
offset
&
~
31
;
unsigned
int
tmp
;
...
...
drivers/pci/hotplug/pciehp_ctrl.c
View file @
2b83a8d6
...
...
@@ -1058,6 +1058,34 @@ static int is_bridge(struct pci_func * func)
hotplug controller logic
*/
static
void
set_slot_off
(
struct
controller
*
ctrl
,
struct
slot
*
pslot
)
{
/* Wait for exclusive access to hardware */
down
(
&
ctrl
->
crit_sect
);
/* turn off slot, turn on Amber LED, turn off Green LED */
if
(
pslot
->
hpc_ops
->
power_off_slot
(
pslot
))
{
err
(
"%s: Issue of Slot Power Off command failed
\n
"
,
__FUNCTION__
);
up
(
&
ctrl
->
crit_sect
);
return
;
}
wait_for_ctrl_irq
(
ctrl
);
pslot
->
hpc_ops
->
green_led_off
(
pslot
);
wait_for_ctrl_irq
(
ctrl
);
/* turn on Amber LED */
if
(
pslot
->
hpc_ops
->
set_attention_status
(
pslot
,
1
))
{
err
(
"%s: Issue of Set Attention Led command failed
\n
"
,
__FUNCTION__
);
up
(
&
ctrl
->
crit_sect
);
return
;
}
wait_for_ctrl_irq
(
ctrl
);
/* Done with exclusive hardware access */
up
(
&
ctrl
->
crit_sect
);
}
/**
* board_added - Called after a board has been added to the system.
...
...
@@ -1071,7 +1099,7 @@ static u32 board_added(struct pci_func * func, struct controller * ctrl)
u8
hp_slot
;
int
index
;
u32
temp_register
=
0xFFFFFFFF
;
u32
r
etval
,
r
c
=
0
;
u32
rc
=
0
;
struct
pci_func
*
new_func
=
NULL
;
struct
slot
*
p_slot
;
struct
resource_lists
res_lists
;
...
...
@@ -1086,8 +1114,10 @@ static u32 board_added(struct pci_func * func, struct controller * ctrl)
/* Power on slot */
rc
=
p_slot
->
hpc_ops
->
power_on_slot
(
p_slot
);
if
(
rc
)
if
(
rc
)
{
up
(
&
ctrl
->
crit_sect
);
return
-
1
;
}
/* Wait for the command to complete */
wait_for_ctrl_irq
(
ctrl
);
...
...
@@ -1105,11 +1135,12 @@ static u32 board_added(struct pci_func * func, struct controller * ctrl)
wait_for_ctrl_irq
(
ctrl
);
dbg
(
"%s: afterlong_delay
\n
"
,
__FUNCTION__
);
/*
Make this to check for
link training status */
/*
Check
link training status */
rc
=
p_slot
->
hpc_ops
->
check_lnk_status
(
ctrl
);
if
(
rc
)
{
err
(
"%s: Failed to check link status
\n
"
,
__FUNCTION__
);
return
-
1
;
set_slot_off
(
ctrl
,
p_slot
);
return
rc
;
}
dbg
(
"%s: func status = %x
\n
"
,
__FUNCTION__
,
func
->
status
);
...
...
@@ -1159,36 +1190,7 @@ static u32 board_added(struct pci_func * func, struct controller * ctrl)
pciehp_resource_sort_and_combine
(
&
(
ctrl
->
bus_head
));
if
(
rc
)
{
/* Wait for exclusive access to hardware */
down
(
&
ctrl
->
crit_sect
);
/* turn off slot, turn on Amber LED, turn off Green LED */
retval
=
p_slot
->
hpc_ops
->
power_off_slot
(
p_slot
);
/* In PCI Express, just power off slot */
if
(
retval
)
{
err
(
"%s: Issue of Slot Power Off command failed
\n
"
,
__FUNCTION__
);
return
retval
;
}
/* Wait for the command to complete */
wait_for_ctrl_irq
(
ctrl
);
p_slot
->
hpc_ops
->
green_led_off
(
p_slot
);
/* Wait for the command to complete */
wait_for_ctrl_irq
(
ctrl
);
/* turn on Amber LED */
retval
=
p_slot
->
hpc_ops
->
set_attention_status
(
p_slot
,
1
);
if
(
retval
)
{
err
(
"%s: Issue of Set Attention Led command failed
\n
"
,
__FUNCTION__
);
return
retval
;
}
/* Wait for the command to complete */
wait_for_ctrl_irq
(
ctrl
);
/* Done with exclusive hardware access */
up
(
&
ctrl
->
crit_sect
);
set_slot_off
(
ctrl
,
p_slot
);
return
rc
;
}
pciehp_save_slot_config
(
ctrl
,
func
);
...
...
@@ -1223,37 +1225,8 @@ static u32 board_added(struct pci_func * func, struct controller * ctrl)
up
(
&
ctrl
->
crit_sect
);
}
else
{
/* Wait for exclusive access to hardware */
down
(
&
ctrl
->
crit_sect
);
/* turn off slot, turn on Amber LED, turn off Green LED */
retval
=
p_slot
->
hpc_ops
->
power_off_slot
(
p_slot
);
/* In PCI Express, just power off slot */
if
(
retval
)
{
err
(
"%s: Issue of Slot Power Off command failed
\n
"
,
__FUNCTION__
);
return
retval
;
}
/* Wait for the command to complete */
wait_for_ctrl_irq
(
ctrl
);
p_slot
->
hpc_ops
->
green_led_off
(
p_slot
);
/* Wait for the command to complete */
wait_for_ctrl_irq
(
ctrl
);
/* turn on Amber LED */
retval
=
p_slot
->
hpc_ops
->
set_attention_status
(
p_slot
,
1
);
if
(
retval
)
{
err
(
"%s: Issue of Set Attention Led command failed
\n
"
,
__FUNCTION__
);
return
retval
;
}
/* Wait for the command to complete */
wait_for_ctrl_irq
(
ctrl
);
/* Done with exclusive hardware access */
up
(
&
ctrl
->
crit_sect
);
return
rc
;
set_slot_off
(
ctrl
,
p_slot
);
return
-
1
;
}
return
0
;
}
...
...
@@ -1320,6 +1293,7 @@ static u32 remove_board(struct pci_func *func, struct controller *ctrl)
rc
=
p_slot
->
hpc_ops
->
power_off_slot
(
p_slot
);
if
(
rc
)
{
err
(
"%s: Issue of Slot Disable command failed
\n
"
,
__FUNCTION__
);
up
(
&
ctrl
->
crit_sect
);
return
rc
;
}
/* Wait for the command to complete */
...
...
@@ -1406,7 +1380,6 @@ static void pciehp_pushbutton_thread(unsigned long slot)
{
struct
slot
*
p_slot
=
(
struct
slot
*
)
slot
;
u8
getstatus
;
int
rc
;
pushbutton_pending
=
0
;
...
...
@@ -1420,23 +1393,7 @@ static void pciehp_pushbutton_thread(unsigned long slot)
p_slot
->
state
=
POWEROFF_STATE
;
dbg
(
"In power_down_board, b:d(%x:%x)
\n
"
,
p_slot
->
bus
,
p_slot
->
device
);
if
(
pciehp_disable_slot
(
p_slot
))
{
/* Wait for exclusive access to hardware */
down
(
&
p_slot
->
ctrl
->
crit_sect
);
/* Turn on the Attention LED */
rc
=
p_slot
->
hpc_ops
->
set_attention_status
(
p_slot
,
1
);
if
(
rc
)
{
err
(
"%s: Issue of Set Atten Indicator On command failed
\n
"
,
__FUNCTION__
);
return
;
}
/* Wait for the command to complete */
wait_for_ctrl_irq
(
p_slot
->
ctrl
);
/* Done with exclusive hardware access */
up
(
&
p_slot
->
ctrl
->
crit_sect
);
}
pciehp_disable_slot
(
p_slot
);
p_slot
->
state
=
STATIC_STATE
;
}
else
{
p_slot
->
state
=
POWERON_STATE
;
...
...
@@ -1446,15 +1403,6 @@ static void pciehp_pushbutton_thread(unsigned long slot)
/* Wait for exclusive access to hardware */
down
(
&
p_slot
->
ctrl
->
crit_sect
);
/* Turn off the green LED */
rc
=
p_slot
->
hpc_ops
->
set_attention_status
(
p_slot
,
1
);
if
(
rc
)
{
err
(
"%s: Issue of Set Atten Indicator On command failed
\n
"
,
__FUNCTION__
);
return
;
}
/* Wait for the command to complete */
wait_for_ctrl_irq
(
p_slot
->
ctrl
);
p_slot
->
hpc_ops
->
green_led_off
(
p_slot
);
/* Wait for the command to complete */
...
...
@@ -1664,7 +1612,10 @@ static void interrupt_event_handler(struct controller *ctrl)
down
(
&
ctrl
->
crit_sect
);
p_slot
->
hpc_ops
->
set_attention_status
(
p_slot
,
1
);
wait_for_ctrl_irq
(
ctrl
);
p_slot
->
hpc_ops
->
green_led_off
(
p_slot
);
wait_for_ctrl_irq
(
ctrl
);
/* Done with exclusive hardware access */
up
(
&
ctrl
->
crit_sect
);
...
...
@@ -1701,21 +1652,21 @@ int pciehp_enable_slot(struct slot *p_slot)
if
(
rc
||
!
getstatus
)
{
info
(
"%s: no adapter on slot(%x)
\n
"
,
__FUNCTION__
,
p_slot
->
number
);
up
(
&
p_slot
->
ctrl
->
crit_sect
);
return
0
;
return
1
;
}
rc
=
p_slot
->
hpc_ops
->
get_latch_status
(
p_slot
,
&
getstatus
);
if
(
rc
||
getstatus
)
{
info
(
"%s: latch open on slot(%x)
\n
"
,
__FUNCTION__
,
p_slot
->
number
);
up
(
&
p_slot
->
ctrl
->
crit_sect
);
return
0
;
return
1
;
}
rc
=
p_slot
->
hpc_ops
->
get_power_status
(
p_slot
,
&
getstatus
);
if
(
rc
||
getstatus
)
{
info
(
"%s: already enabled on slot(%x)
\n
"
,
__FUNCTION__
,
p_slot
->
number
);
up
(
&
p_slot
->
ctrl
->
crit_sect
);
return
0
;
return
1
;
}
up
(
&
p_slot
->
ctrl
->
crit_sect
);
...
...
@@ -1788,21 +1739,21 @@ int pciehp_disable_slot(struct slot *p_slot)
if
(
ret
||
!
getstatus
)
{
info
(
"%s: no adapter on slot(%x)
\n
"
,
__FUNCTION__
,
p_slot
->
number
);
up
(
&
p_slot
->
ctrl
->
crit_sect
);
return
0
;
return
1
;
}
ret
=
p_slot
->
hpc_ops
->
get_latch_status
(
p_slot
,
&
getstatus
);
if
(
ret
||
getstatus
)
{
info
(
"%s: latch open on slot(%x)
\n
"
,
__FUNCTION__
,
p_slot
->
number
);
up
(
&
p_slot
->
ctrl
->
crit_sect
);
return
0
;
return
1
;
}
ret
=
p_slot
->
hpc_ops
->
get_power_status
(
p_slot
,
&
getstatus
);
if
(
ret
||
!
getstatus
)
{
info
(
"%s: already disabled slot(%x)
\n
"
,
__FUNCTION__
,
p_slot
->
number
);
up
(
&
p_slot
->
ctrl
->
crit_sect
);
return
0
;
return
1
;
}
up
(
&
p_slot
->
ctrl
->
crit_sect
);
...
...
drivers/pci/hotplug/pciehp_hpc.c
View file @
2b83a8d6
...
...
@@ -349,7 +349,9 @@ static int hpc_check_lnk_status(struct controller *ctrl)
return
retval
;
}
if
(
(
lnk_status
&
(
LNK_TRN
|
LNK_TRN_ERR
))
==
0x0C00
)
{
dbg
(
"%s: lnk_status = %x
\n
"
,
__FUNCTION__
,
lnk_status
);
if
(
(
lnk_status
&
LNK_TRN
)
||
(
lnk_status
&
LNK_TRN_ERR
)
||
!
(
lnk_status
&
NEG_LINK_WD
))
{
err
(
"%s : Link Training Error occurs
\n
"
,
__FUNCTION__
);
retval
=
-
1
;
return
retval
;
...
...
drivers/pci/hotplug/pciehprm_acpi.c
View file @
2b83a8d6
...
...
@@ -218,6 +218,10 @@ static void acpi_get__hpp ( struct acpi_bridge *ab)
}
ab
->
_hpp
=
kmalloc
(
sizeof
(
struct
acpi__hpp
),
GFP_KERNEL
);
if
(
!
ab
->
_hpp
)
{
err
(
"acpi_pciehprm:%s alloc for _HPP failed
\n
"
,
path_name
);
goto
free_and_return
;
}
memset
(
ab
->
_hpp
,
0
,
sizeof
(
struct
acpi__hpp
));
ab
->
_hpp
->
cache_line_size
=
nui
[
0
];
...
...
@@ -1393,7 +1397,7 @@ static int configure_existing_function(
static
int
bind_pci_resources_to_slots
(
struct
controller
*
ctrl
)
{
struct
pci_func
*
func
;
struct
pci_func
*
func
,
new_func
;
int
busn
=
ctrl
->
slot_bus
;
int
devn
,
funn
;
u32
vid
;
...
...
@@ -1411,11 +1415,19 @@ static int bind_pci_resources_to_slots ( struct controller *ctrl)
if
(
vid
!=
0xFFFFFFFF
)
{
dbg
(
"%s: vid = %x
\n
"
,
__FUNCTION__
,
vid
);
func
=
pciehp_slot_find
(
busn
,
devn
,
funn
);
if
(
!
func
)
continue
;
configure_existing_function
(
ctrl
,
func
);
if
(
!
func
)
{
memset
(
&
new_func
,
0
,
sizeof
(
struct
pci_func
));
new_func
.
bus
=
busn
;
new_func
.
device
=
devn
;
new_func
.
function
=
funn
;
new_func
.
is_a_board
=
1
;
configure_existing_function
(
ctrl
,
&
new_func
);
pciehprm_dump_func_res
(
&
new_func
);
}
else
{
configure_existing_function
(
ctrl
,
func
);
pciehprm_dump_func_res
(
func
);
}
dbg
(
"aCCF:existing PCI 0x%x Func ResourceDump
\n
"
,
ctrl
->
bus
);
pciehprm_dump_func_res
(
func
);
}
}
}
...
...
drivers/pci/hotplug/pciehprm_nonacpi.c
View file @
2b83a8d6
...
...
@@ -276,7 +276,7 @@ static int pciehprm_delete_resource(
static
int
bind_pci_resources_to_slots
(
struct
controller
*
ctrl
)
{
struct
pci_func
*
func
;
struct
pci_func
*
func
,
new_func
;
int
busn
=
ctrl
->
slot_bus
;
int
devn
,
funn
;
u32
vid
;
...
...
@@ -297,11 +297,19 @@ static int bind_pci_resources_to_slots ( struct controller *ctrl)
vid
,
busn
,
devn
,
funn
);
func
=
pciehp_slot_find
(
busn
,
devn
,
funn
);
dbg
(
"%s: func = %p
\n
"
,
__FUNCTION__
,
func
);
if
(
!
func
)
continue
;
configure_existing_function
(
ctrl
,
func
);
if
(
!
func
)
{
memset
(
&
new_func
,
0
,
sizeof
(
struct
pci_func
));
new_func
.
bus
=
busn
;
new_func
.
device
=
devn
;
new_func
.
function
=
funn
;
new_func
.
is_a_board
=
1
;
configure_existing_function
(
ctrl
,
&
new_func
);
phprm_dump_func_res
(
&
new_func
);
}
else
{
configure_existing_function
(
ctrl
,
func
);
phprm_dump_func_res
(
func
);
}
dbg
(
"aCCF:existing PCI 0x%x Func ResourceDump
\n
"
,
ctrl
->
bus
);
phprm_dump_func_res
(
func
);
}
}
}
...
...
drivers/pci/hotplug/rpadlpar_core.c
View file @
2b83a8d6
...
...
@@ -24,25 +24,6 @@
static
DECLARE_MUTEX
(
rpadlpar_sem
);
static
inline
int
is_hotplug_capable
(
struct
device_node
*
dn
)
{
unsigned
char
*
ptr
=
get_property
(
dn
,
"ibm,fw-pci-hot-plug-ctrl"
,
NULL
);
return
(
int
)
(
ptr
!=
NULL
);
}
static
char
*
get_node_drc_name
(
struct
device_node
*
dn
)
{
char
*
ptr
=
NULL
;
int
*
drc_names
;
drc_names
=
(
int
*
)
get_property
(
dn
,
"ibm,drc-names"
,
NULL
);
if
(
drc_names
)
ptr
=
(
char
*
)
&
drc_names
[
1
];
return
ptr
;
}
static
struct
device_node
*
find_php_slot_vio_node
(
char
*
drc_name
)
{
struct
device_node
*
child
;
...
...
@@ -53,9 +34,9 @@ static struct device_node *find_php_slot_vio_node(char *drc_name)
return
NULL
;
for
(
child
=
of_get_next_child
(
parent
,
NULL
);
child
;
child
=
of_get_next_child
(
parent
,
child
))
{
child
;
child
=
of_get_next_child
(
parent
,
child
))
{
loc_code
=
get_property
(
child
,
"ibm,loc-code"
,
NULL
);
if
(
loc_code
&&
!
str
cmp
(
loc_code
,
drc_name
))
if
(
loc_code
&&
!
str
ncmp
(
loc_code
,
drc_name
,
strlen
(
drc_name
)
))
return
child
;
}
...
...
@@ -69,7 +50,7 @@ static struct device_node *find_php_slot_pci_node(char *drc_name)
while
((
np
=
of_find_node_by_type
(
np
,
"pci"
)))
if
(
is_hotplug_capable
(
np
))
{
name
=
get_node
_drc_name
(
np
);
name
=
rpaphp_get
_drc_name
(
np
);
if
(
name
&&
(
!
strcmp
(
drc_name
,
name
)))
break
;
}
...
...
@@ -324,6 +305,7 @@ int dlpar_remove_pci_slot(struct slot *slot, char *drc_name)
}
/* Remove pci bus */
if
(
dlpar_pci_remove_bus
(
bridge_dev
))
{
printk
(
KERN_ERR
"%s: unable to remove pci bus %s
\n
"
,
__FUNCTION__
,
drc_name
);
...
...
@@ -364,7 +346,7 @@ int dlpar_remove_slot(char *drc_name)
rc
=
-
EINVAL
;
goto
exit
;
}
switch
(
slot
->
dev_type
)
{
case
PCI_DEV
:
rc
=
dlpar_remove_pci_slot
(
slot
,
drc_name
);
...
...
drivers/pci/hotplug/rpaphp.h
View file @
2b83a8d6
...
...
@@ -30,6 +30,9 @@
#include <linux/pci.h>
#include "pci_hotplug.h"
#define HOTPLUG 1
#define EMBEDDED 0
#define DR_INDICATOR 9002
#define DR_ENTITY_SENSE 9003
...
...
@@ -73,6 +76,11 @@ extern int debug;
#define CONFIGURED 1
#define EMPTY 0
struct
rpaphp_pci_func
{
struct
pci_dev
*
pci_dev
;
struct
list_head
sibling
;
};
/*
* struct slot - slot information for each *physical* slot
*/
...
...
@@ -83,14 +91,13 @@ struct slot {
u32
power_domain
;
char
*
name
;
char
*
location
;
u8
removable
;
struct
device_node
*
dn
;
/* slot's device_node in OFDT */
/* dn has phb info */
/* dn has phb info */
struct
pci_dev
*
bridge
;
/* slot's pci_dev in pci_devices */
union
{
struct
pci_dev
*
pci_dev
;
/* pci_dev of device in this slot */
/* it will be used for unconfig */
/* NULL if slot is empty */
struct
vio_dev
*
vio_dev
;
/* vio_dev of the device in this slot */
struct
list_head
pci_funcs
;
/* pci_devs in PCI slot */
struct
vio_dev
*
vio_dev
;
/* vio_dev in VIO slot */
}
dev
;
u8
dev_type
;
/* VIO or PCI */
struct
hotplug_slot
*
hotplug_slot
;
...
...
@@ -101,6 +108,13 @@ extern struct hotplug_slot_ops rpaphp_hotplug_slot_ops;
extern
struct
list_head
rpaphp_slot_head
;
extern
int
num_slots
;
static
inline
int
is_hotplug_capable
(
struct
device_node
*
dn
)
{
unsigned
char
*
ptr
=
get_property
(
dn
,
"ibm,fw-pci-hot-plug-ctrl"
,
NULL
);
return
(
int
)
(
ptr
!=
NULL
);
}
/* function prototypes */
/* rpaphp_pci.c */
...
...
@@ -110,10 +124,12 @@ extern int rpaphp_enable_pci_slot(struct slot *slot);
extern
int
register_pci_slot
(
struct
slot
*
slot
);
extern
int
rpaphp_unconfig_pci_adapter
(
struct
slot
*
slot
);
extern
int
rpaphp_get_pci_adapter_status
(
struct
slot
*
slot
,
int
is_init
,
u8
*
value
);
extern
struct
hotplug_slot
*
rpaphp_find_hotplug_slot
(
struct
pci_dev
*
dev
);
/* rpaphp_core.c */
extern
int
rpaphp_add_slot
(
struct
device_node
*
dn
);
extern
int
rpaphp_remove_slot
(
struct
slot
*
slot
);
extern
char
*
rpaphp_get_drc_name
(
struct
device_node
*
dn
);
/* rpaphp_vio.c */
extern
int
rpaphp_get_vio_adapter_status
(
struct
slot
*
slot
,
int
is_init
,
u8
*
value
);
...
...
@@ -125,8 +141,8 @@ extern int rpaphp_enable_vio_slot(struct slot *slot);
extern
void
dealloc_slot_struct
(
struct
slot
*
slot
);
extern
struct
slot
*
alloc_slot_struct
(
struct
device_node
*
dn
,
int
drc_index
,
char
*
drc_name
,
int
power_domain
);
extern
int
register_slot
(
struct
slot
*
slot
);
extern
int
deregister_slot
(
struct
slot
*
slot
);
extern
int
rpaphp_get_power_status
(
struct
slot
*
slot
,
u8
*
value
);
extern
int
rpaphp_set_attention_status
(
struct
slot
*
slot
,
u8
status
);
extern
void
rpaphp_sysfs_remove_attr_location
(
struct
hotplug_slot
*
slot
);
#endif
/* _PPC64PHP_H */
drivers/pci/hotplug/rpaphp_core.c
View file @
2b83a8d6
...
...
@@ -54,6 +54,8 @@ MODULE_AUTHOR(DRIVER_AUTHOR);
MODULE_DESCRIPTION
(
DRIVER_DESC
);
MODULE_LICENSE
(
"GPL"
);
void
eeh_register_disable_func
(
int
(
*
)(
struct
pci_dev
*
));
module_param
(
debug
,
bool
,
0644
);
static
int
enable_slot
(
struct
hotplug_slot
*
slot
);
...
...
@@ -63,6 +65,7 @@ static int get_power_status(struct hotplug_slot *slot, u8 * value);
static
int
get_attention_status
(
struct
hotplug_slot
*
slot
,
u8
*
value
);
static
int
get_adapter_status
(
struct
hotplug_slot
*
slot
,
u8
*
value
);
static
int
get_max_bus_speed
(
struct
hotplug_slot
*
hotplug_slot
,
enum
pci_bus_speed
*
value
);
static
int
rpaphp_disable_slot
(
struct
pci_dev
*
dev
);
struct
hotplug_slot_ops
rpaphp_hotplug_slot_ops
=
{
.
owner
=
THIS_MODULE
,
...
...
@@ -89,7 +92,7 @@ static int rpaphp_get_attention_status(struct slot *slot)
*/
static
int
set_attention_status
(
struct
hotplug_slot
*
hotplug_slot
,
u8
value
)
{
int
retval
;
int
retval
=
0
;
struct
slot
*
slot
=
(
struct
slot
*
)
hotplug_slot
->
private
;
down
(
&
rpaphp_sem
);
...
...
@@ -208,47 +211,53 @@ static int get_max_bus_speed(struct hotplug_slot *hotplug_slot, enum pci_bus_spe
int
rpaphp_remove_slot
(
struct
slot
*
slot
)
{
int
retval
=
0
;
struct
hotplug_slot
*
php_slot
=
slot
->
hotplug_slot
;
list_del
(
&
slot
->
rpaphp_slot_list
);
/* remove "php_location" file */
rpaphp_sysfs_remove_attr_location
(
php_slot
);
retval
=
pci_hp_deregister
(
php_slot
);
if
(
retval
)
err
(
"Problem unregistering a slot %s
\n
"
,
slot
->
name
);
num_slots
--
;
dbg
(
"%s - Exit: rc[%d]
\n
"
,
__FUNCTION__
,
retval
);
return
retval
;
return
deregister_slot
(
slot
);
}
static
int
is_php_dn
(
struct
device_node
*
dn
,
int
**
indexes
,
int
**
names
,
int
**
types
,
int
**
power_domains
)
static
int
get_dn_properties
(
struct
device_node
*
dn
,
int
**
indexes
,
int
**
names
,
int
**
types
,
int
**
power_domains
)
{
*
indexes
=
(
int
*
)
get_property
(
dn
,
"ibm,drc-indexes"
,
NULL
);
if
(
!*
indexes
)
return
0
;
/* &names[1] contains NULL terminated slot names */
*
names
=
(
int
*
)
get_property
(
dn
,
"ibm,drc-names"
,
NULL
);
if
(
!*
names
)
return
0
;
/* &types[1] contains NULL terminated slot types */
*
types
=
(
int
*
)
get_property
(
dn
,
"ibm,drc-types"
,
NULL
);
if
(
!*
types
)
return
0
;
/* power_domains[1...n] are the slot power domains */
*
power_domains
=
(
int
*
)
get_property
(
dn
,
"ibm,drc-power-domains"
,
NULL
);
if
(
!*
power_domains
)
return
0
;
if
(
strcmp
(
dn
->
name
,
"pci"
)
==
0
&&
!
get_property
(
dn
,
"ibm,fw-pci-hot-plug-ctrl"
,
NULL
))
return
0
;
return
1
;
*
power_domains
=
(
int
*
)
get_property
(
dn
,
"ibm,drc-power-domains"
,
NULL
);
if
(
*
indexes
&&
*
names
&&
*
types
&&
*
power_domains
)
return
(
1
);
return
(
0
);
}
static
int
is_php_dn
(
struct
device_node
*
dn
,
int
**
indexes
,
int
**
names
,
int
**
types
,
int
**
power_domains
)
{
if
(
!
is_hotplug_capable
(
dn
))
return
(
0
);
if
(
!
get_dn_properties
(
dn
,
indexes
,
names
,
types
,
power_domains
))
return
(
0
);
return
(
1
);
}
static
int
is_dr_dn
(
struct
device_node
*
dn
,
int
**
indexes
,
int
**
names
,
int
**
types
,
int
**
power_domains
,
int
**
my_drc_index
)
{
if
(
!
is_hotplug_capable
(
dn
))
return
(
0
);
*
my_drc_index
=
(
int
*
)
get_property
(
dn
,
"ibm,my-drc-index"
,
NULL
);
if
(
!*
my_drc_index
)
return
(
0
);
if
(
!
dn
->
parent
)
return
(
0
);
return
get_dn_properties
(
dn
->
parent
,
indexes
,
names
,
types
,
power_domains
);
}
static
inline
int
is_vdevice_root
(
struct
device_node
*
dn
)
...
...
@@ -256,15 +265,48 @@ static inline int is_vdevice_root(struct device_node *dn)
return
!
strcmp
(
dn
->
name
,
"vdevice"
);
}
/**
* rpaphp_add_slot: Add Hot Plug slot(s) to sysfs
*
*/
char
*
rpaphp_get_drc_name
(
struct
device_node
*
dn
)
{
char
*
name
,
*
ptr
=
NULL
;
int
*
drc_names
,
*
drc_indexes
,
i
;
struct
device_node
*
parent
=
dn
->
parent
;
u32
*
my_drc_index
;
if
(
!
parent
)
return
NULL
;
my_drc_index
=
(
u32
*
)
get_property
(
dn
,
"ibm,my-drc-index"
,
NULL
);
if
(
!
my_drc_index
)
return
NULL
;
drc_names
=
(
int
*
)
get_property
(
parent
,
"ibm,drc-names"
,
NULL
);
drc_indexes
=
(
int
*
)
get_property
(
parent
,
"ibm,drc-indexes"
,
NULL
);
if
(
!
drc_names
||
!
drc_indexes
)
return
NULL
;
name
=
(
char
*
)
&
drc_names
[
1
];
for
(
i
=
0
;
i
<
drc_indexes
[
0
];
i
++
,
name
+=
(
strlen
(
name
)
+
1
))
{
if
(
drc_indexes
[
i
+
1
]
==
*
my_drc_index
)
{
ptr
=
(
char
*
)
name
;
break
;
}
}
return
ptr
;
}
/****************************************************************
* rpaphp not only registers PCI hotplug slots(HOTPLUG),
* but also logical DR slots(EMBEDDED).
* HOTPLUG slot: An adapter can be physically added/removed.
* EMBEDDED slot: An adapter can be logically removed/added
* from/to a partition with the slot.
***************************************************************/
int
rpaphp_add_slot
(
struct
device_node
*
dn
)
{
struct
slot
*
slot
;
int
retval
=
0
;
int
i
;
int
i
,
*
my_drc_index
,
slot_type
;
int
*
indexes
,
*
names
,
*
types
,
*
power_domains
;
char
*
name
,
*
type
;
...
...
@@ -277,42 +319,65 @@ int rpaphp_add_slot(struct device_node *dn)
}
/* register PCI devices */
if
(
dn
->
name
!=
0
&&
strcmp
(
dn
->
name
,
"pci"
)
==
0
&&
is_php_dn
(
dn
,
&
indexes
,
&
names
,
&
types
,
&
power_domains
))
{
if
(
dn
->
name
!=
0
&&
strcmp
(
dn
->
name
,
"pci"
)
==
0
)
{
if
(
is_php_dn
(
dn
,
&
indexes
,
&
names
,
&
types
,
&
power_domains
))
slot_type
=
HOTPLUG
;
else
if
(
is_dr_dn
(
dn
,
&
indexes
,
&
names
,
&
types
,
&
power_domains
,
&
my_drc_index
))
slot_type
=
EMBEDDED
;
else
goto
exit
;
name
=
(
char
*
)
&
names
[
1
];
type
=
(
char
*
)
&
types
[
1
];
for
(
i
=
0
;
i
<
indexes
[
0
];
i
++
,
name
+=
(
strlen
(
name
)
+
1
),
type
+=
(
strlen
(
type
)
+
1
))
{
if
(
!
(
slot
=
alloc_slot_struct
(
dn
,
indexes
[
i
+
1
],
name
,
power_domains
[
i
+
1
])))
{
retval
=
-
ENOMEM
;
goto
exit
;
for
(
i
=
0
;
i
<
indexes
[
0
];
i
++
,
name
+=
(
strlen
(
name
)
+
1
),
type
+=
(
strlen
(
type
)
+
1
))
{
if
(
slot_type
==
HOTPLUG
||
(
slot_type
==
EMBEDDED
&&
indexes
[
i
+
1
]
==
my_drc_index
[
0
]))
{
if
(
!
(
slot
=
alloc_slot_struct
(
dn
,
indexes
[
i
+
1
],
name
,
power_domains
[
i
+
1
])))
{
retval
=
-
ENOMEM
;
goto
exit
;
}
if
(
slot_type
==
EMBEDDED
)
slot
->
type
=
EMBEDDED
;
else
slot
->
type
=
simple_strtoul
(
type
,
NULL
,
10
);
dbg
(
" Found drc-index:0x%x drc-name:%s drc-type:%s
\n
"
,
indexes
[
i
+
1
],
name
,
type
);
retval
=
register_pci_slot
(
slot
);
if
(
slot_type
==
EMBEDDED
)
goto
exit
;
}
slot
->
type
=
simple_strtoul
(
type
,
NULL
,
10
);
if
(
slot
->
type
<
1
||
slot
->
type
>
16
)
slot
->
type
=
0
;
retval
=
register_pci_slot
(
slot
);
}
/* for indexes */
}
/* end of PCI device_node */
}
}
exit:
dbg
(
"%s - Exit: num_slots=%d rc[%d]
\n
"
,
__FUNCTION__
,
num_slots
,
retval
);
return
retval
;
}
static
int
__init
init_rpa
(
void
)
/*
* init_slots - initialize 'struct slot' structures for each slot
*
*/
static
void
init_slots
(
void
)
{
struct
device_node
*
dn
;
for
(
dn
=
find_all_nodes
();
dn
;
dn
=
dn
->
next
)
rpaphp_add_slot
(
dn
);
}
static
int
__init
init_rpa
(
void
)
{
init_MUTEX
(
&
rpaphp_sem
);
/* initialize internal data structure etc. */
for
(
dn
=
find_all_nodes
();
dn
;
dn
=
dn
->
next
)
rpaphp_add_slot
(
dn
);
init_slots
();
if
(
!
num_slots
)
return
-
ENODEV
;
...
...
@@ -342,12 +407,18 @@ static int __init rpaphp_init(void)
{
info
(
DRIVER_DESC
" version: "
DRIVER_VERSION
"
\n
"
);
/* let EEH know they can use hotplug */
eeh_register_disable_func
(
&
rpaphp_disable_slot
);
/* read all the PRA info from the system */
return
init_rpa
();
}
static
void
__exit
rpaphp_exit
(
void
)
{
/* let EEH know we are going away */
eeh_register_disable_func
(
NULL
);
cleanup_slots
();
}
...
...
@@ -374,11 +445,16 @@ static int enable_slot(struct hotplug_slot *hotplug_slot)
retval
=
-
EINVAL
;
}
up
(
&
rpaphp_sem
);
exit:
exit:
dbg
(
"%s - Exit: rc[%d]
\n
"
,
__FUNCTION__
,
retval
);
return
retval
;
}
static
int
rpaphp_disable_slot
(
struct
pci_dev
*
dev
)
{
return
disable_slot
(
rpaphp_find_hotplug_slot
(
dev
));
}
static
int
disable_slot
(
struct
hotplug_slot
*
hotplug_slot
)
{
int
retval
;
...
...
@@ -395,9 +471,7 @@ static int disable_slot(struct hotplug_slot *hotplug_slot)
down
(
&
rpaphp_sem
);
switch
(
slot
->
dev_type
)
{
case
PCI_DEV
:
rpaphp_set_attention_status
(
slot
,
LED_ID
);
retval
=
rpaphp_unconfig_pci_adapter
(
slot
);
rpaphp_set_attention_status
(
slot
,
LED_OFF
);
break
;
case
VIO_DEV
:
retval
=
rpaphp_unconfig_vio_adapter
(
slot
);
...
...
@@ -406,7 +480,7 @@ static int disable_slot(struct hotplug_slot *hotplug_slot)
retval
=
-
ENODEV
;
}
up
(
&
rpaphp_sem
);
exit:
exit:
dbg
(
"%s - Exit: rc[%d]
\n
"
,
__FUNCTION__
,
retval
);
return
retval
;
}
...
...
@@ -417,3 +491,4 @@ module_exit(rpaphp_exit);
EXPORT_SYMBOL_GPL
(
rpaphp_add_slot
);
EXPORT_SYMBOL_GPL
(
rpaphp_remove_slot
);
EXPORT_SYMBOL_GPL
(
rpaphp_slot_head
);
EXPORT_SYMBOL_GPL
(
rpaphp_get_drc_name
);
drivers/pci/hotplug/rpaphp_pci.c
View file @
2b83a8d6
This diff is collapsed.
Click to expand it.
drivers/pci/hotplug/rpaphp_slot.c
View file @
2b83a8d6
...
...
@@ -29,6 +29,35 @@
#include <linux/pci.h>
#include "rpaphp.h"
static
ssize_t
removable_read_file
(
struct
hotplug_slot
*
php_slot
,
char
*
buf
)
{
u8
value
;
int
retval
=
-
ENOENT
;
struct
slot
*
slot
=
(
struct
slot
*
)
php_slot
->
private
;
if
(
!
slot
)
return
retval
;
value
=
slot
->
removable
;
retval
=
sprintf
(
buf
,
"%d
\n
"
,
value
);
return
retval
;
}
static
struct
hotplug_slot_attribute
hotplug_slot_attr_removable
=
{
.
attr
=
{.
name
=
"phy_removable"
,
.
mode
=
S_IFREG
|
S_IRUGO
},
.
show
=
removable_read_file
,
};
static
void
rpaphp_sysfs_add_attr_removable
(
struct
hotplug_slot
*
slot
)
{
sysfs_create_file
(
&
slot
->
kobj
,
&
hotplug_slot_attr_removable
.
attr
);
}
static
void
rpaphp_sysfs_remove_attr_removable
(
struct
hotplug_slot
*
slot
)
{
sysfs_remove_file
(
&
slot
->
kobj
,
&
hotplug_slot_attr_removable
.
attr
);
}
static
ssize_t
location_read_file
(
struct
hotplug_slot
*
php_slot
,
char
*
buf
)
{
char
*
value
;
...
...
@@ -53,7 +82,7 @@ static void rpaphp_sysfs_add_attr_location (struct hotplug_slot *slot)
sysfs_create_file
(
&
slot
->
kobj
,
&
hotplug_slot_attr_location
.
attr
);
}
void
rpaphp_sysfs_remove_attr_location
(
struct
hotplug_slot
*
slot
)
static
void
rpaphp_sysfs_remove_attr_location
(
struct
hotplug_slot
*
slot
)
{
sysfs_remove_file
(
&
slot
->
kobj
,
&
hotplug_slot_attr_location
.
attr
);
}
...
...
@@ -68,6 +97,17 @@ static void rpaphp_release_slot(struct hotplug_slot *hotplug_slot)
void
dealloc_slot_struct
(
struct
slot
*
slot
)
{
struct
list_head
*
ln
,
*
n
;
if
(
slot
->
dev_type
==
PCI_DEV
)
{
list_for_each_safe
(
ln
,
n
,
&
slot
->
dev
.
pci_funcs
)
{
struct
rpaphp_pci_func
*
func
;
func
=
list_entry
(
ln
,
struct
rpaphp_pci_func
,
sibling
);
kfree
(
func
);
}
}
kfree
(
slot
->
hotplug_slot
->
info
);
kfree
(
slot
->
hotplug_slot
->
name
);
kfree
(
slot
->
hotplug_slot
);
...
...
@@ -86,7 +126,7 @@ struct slot *alloc_slot_struct(struct device_node *dn, int drc_index, char *drc_
memset
(
slot
,
0
,
sizeof
(
struct
slot
));
slot
->
hotplug_slot
=
kmalloc
(
sizeof
(
struct
hotplug_slot
),
GFP_KERNEL
);
if
(
!
slot
->
hotplug_slot
)
goto
error_slot
;
goto
error_slot
;
memset
(
slot
->
hotplug_slot
,
0
,
sizeof
(
struct
hotplug_slot
));
slot
->
hotplug_slot
->
info
=
kmalloc
(
sizeof
(
struct
hotplug_slot_info
),
GFP_KERNEL
);
...
...
@@ -95,7 +135,7 @@ struct slot *alloc_slot_struct(struct device_node *dn, int drc_index, char *drc_
memset
(
slot
->
hotplug_slot
->
info
,
0
,
sizeof
(
struct
hotplug_slot_info
));
slot
->
hotplug_slot
->
name
=
kmalloc
(
BUS_ID_SIZE
+
1
,
GFP_KERNEL
);
if
(
!
slot
->
hotplug_slot
->
name
)
goto
error_info
;
goto
error_info
;
slot
->
location
=
kmalloc
(
strlen
(
drc_name
)
+
1
,
GFP_KERNEL
);
if
(
!
slot
->
location
)
goto
error_name
;
...
...
@@ -107,9 +147,8 @@ struct slot *alloc_slot_struct(struct device_node *dn, int drc_index, char *drc_
slot
->
hotplug_slot
->
private
=
slot
;
slot
->
hotplug_slot
->
ops
=
&
rpaphp_hotplug_slot_ops
;
slot
->
hotplug_slot
->
release
=
&
rpaphp_release_slot
;
slot
->
hotplug_slot
->
info
->
cur_bus_speed
=
PCI_SPEED_UNKNOWN
;
return
slot
;
return
(
slot
);
error_name:
kfree
(
slot
->
hotplug_slot
->
name
);
...
...
@@ -123,15 +162,56 @@ struct slot *alloc_slot_struct(struct device_node *dn, int drc_index, char *drc_
return
NULL
;
}
static
int
is_registered
(
struct
slot
*
slot
)
{
struct
slot
*
tmp_slot
;
list_for_each_entry
(
tmp_slot
,
&
rpaphp_slot_head
,
rpaphp_slot_list
)
{
if
(
!
strcmp
(
tmp_slot
->
name
,
slot
->
name
))
return
1
;
}
return
0
;
}
int
deregister_slot
(
struct
slot
*
slot
)
{
int
retval
=
0
;
struct
hotplug_slot
*
php_slot
=
slot
->
hotplug_slot
;
dbg
(
"%s - Entry: deregistering slot=%s
\n
"
,
__FUNCTION__
,
slot
->
name
);
list_del
(
&
slot
->
rpaphp_slot_list
);
/* remove "phy_location" file */
rpaphp_sysfs_remove_attr_location
(
php_slot
);
/* remove "phy_removable" file */
rpaphp_sysfs_remove_attr_removable
(
php_slot
);
retval
=
pci_hp_deregister
(
php_slot
);
if
(
retval
)
err
(
"Problem unregistering a slot %s
\n
"
,
slot
->
name
);
else
num_slots
--
;
dbg
(
"%s - Exit: rc[%d]
\n
"
,
__FUNCTION__
,
retval
);
return
retval
;
}
int
register_slot
(
struct
slot
*
slot
)
{
int
retval
;
char
*
vio_uni_addr
=
NULL
;
dbg
(
"%s registering slot:path[%s] index[%x], name[%s] pdomain[%x] type[%d]
\n
"
,
__FUNCTION__
,
slot
->
dn
->
full_name
,
slot
->
index
,
slot
->
name
,
dbg
(
"%s registering slot:path[%s] index[%x], name[%s] pdomain[%x] type[%d]
\n
"
,
__FUNCTION__
,
slot
->
dn
->
full_name
,
slot
->
index
,
slot
->
name
,
slot
->
power_domain
,
slot
->
type
);
/* should not try to register the same slot twice */
if
(
is_registered
(
slot
))
{
/* should't be here */
err
(
"register_slot: slot[%s] is already registered
\n
"
,
slot
->
name
);
rpaphp_release_slot
(
slot
->
hotplug_slot
);
return
1
;
}
retval
=
pci_hp_register
(
slot
->
hotplug_slot
);
if
(
retval
)
{
err
(
"pci_hp_register failed with error %d
\n
"
,
retval
);
...
...
@@ -142,30 +222,40 @@ int register_slot(struct slot *slot)
/* create "phy_locatoin" file */
rpaphp_sysfs_add_attr_location
(
slot
->
hotplug_slot
);
/* create "phy_removable" file */
rpaphp_sysfs_add_attr_removable
(
slot
->
hotplug_slot
);
/* add slot to our internal list */
dbg
(
"%s adding slot[%s] to rpaphp_slot_list
\n
"
,
__FUNCTION__
,
slot
->
name
);
list_add
(
&
slot
->
rpaphp_slot_list
,
&
rpaphp_slot_head
);
if
(
vio_uni_addr
)
info
(
"Slot [%s](
vio_uni_addr
=%s) registered
\n
"
,
slot
->
name
,
vio_uni_addr
);
if
(
slot
->
dev_type
==
VIO_DEV
)
info
(
"Slot [%s](
VIO location
=%s) registered
\n
"
,
slot
->
name
,
slot
->
location
);
else
info
(
"Slot [%s](
bus_id
=%s) registered
\n
"
,
slot
->
name
,
pci_name
(
slot
->
bridge
)
);
info
(
"Slot [%s](
PCI location
=%s) registered
\n
"
,
slot
->
name
,
slot
->
location
);
num_slots
++
;
return
0
;
}
int
rpaphp_get_power_status
(
struct
slot
*
slot
,
u8
*
value
)
{
int
rc
;
rc
=
rtas_get_power_level
(
slot
->
power_domain
,
(
int
*
)
value
);
if
(
rc
)
err
(
"failed to get power-level for slot(%s), rc=0x%x
\n
"
,
slot
->
name
,
rc
);
int
rc
=
0
;
if
(
slot
->
type
==
EMBEDDED
)
{
dbg
(
"%s set to POWER_ON for EMBEDDED slot %s
\n
"
,
__FUNCTION__
,
slot
->
location
);
*
value
=
POWER_ON
;
}
else
{
rc
=
rtas_get_power_level
(
slot
->
power_domain
,
(
int
*
)
value
);
if
(
rc
)
err
(
"failed to get power-level for slot(%s), rc=0x%x
\n
"
,
slot
->
location
,
rc
);
}
return
rc
;
}
...
...
@@ -177,8 +267,8 @@ int rpaphp_set_attention_status(struct slot *slot, u8 status)
/* status: LED_OFF or LED_ON */
rc
=
rtas_set_indicator
(
DR_INDICATOR
,
slot
->
index
,
status
);
if
(
rc
)
err
(
"slot(
%s
) set attention-status(%d) failed! rc=0x%x
\n
"
,
slot
->
name
,
status
,
rc
);
err
(
"slot(
name=%s location=%s index=0x%x
) set attention-status(%d) failed! rc=0x%x
\n
"
,
slot
->
name
,
s
lot
->
location
,
slot
->
index
,
s
tatus
,
rc
);
return
rc
;
}
drivers/pci/hotplug/rpaphp_vio.c
View file @
2b83a8d6
...
...
@@ -74,12 +74,12 @@ int register_vio_slot(struct device_node *dn)
int
rc
=
1
;
struct
slot
*
slot
=
NULL
;
name
=
rpaphp_get_drc_name
(
dn
);
if
(
!
name
)
goto
exit_rc
;
index
=
(
u32
*
)
get_property
(
dn
,
"ibm,my-drc-index"
,
NULL
);
if
(
!
index
)
goto
exit_rc
;
name
=
get_property
(
dn
,
"ibm,loc-code"
,
NULL
);
if
(
!
name
)
goto
exit_rc
;
if
(
!
(
slot
=
alloc_slot_struct
(
dn
,
*
index
,
name
,
0
)))
{
rc
=
-
ENOMEM
;
goto
exit_rc
;
...
...
drivers/pci/hotplug/shpchp.h
View file @
2b83a8d6
...
...
@@ -61,6 +61,7 @@ struct pci_func {
u8
configured
;
u8
switch_save
;
u8
presence_save
;
u8
pwr_save
;
u32
base_length
[
0x06
];
u8
base_type
[
0x06
];
u16
reserved2
;
...
...
drivers/pci/hotplug/shpchp_ctrl.c
View file @
2b83a8d6
...
...
@@ -137,6 +137,8 @@ u8 shpchp_handle_switch_change(u8 hp_slot, void *inst_id)
p_slot
=
shpchp_find_slot
(
ctrl
,
hp_slot
+
ctrl
->
slot_device_offset
);
p_slot
->
hpc_ops
->
get_adapter_status
(
p_slot
,
&
(
func
->
presence_save
));
p_slot
->
hpc_ops
->
get_latch_status
(
p_slot
,
&
getstatus
);
dbg
(
"%s: Card present %x Power status %x
\n
"
,
__FUNCTION__
,
func
->
presence_save
,
func
->
pwr_save
);
if
(
getstatus
)
{
/*
...
...
@@ -145,6 +147,10 @@ u8 shpchp_handle_switch_change(u8 hp_slot, void *inst_id)
info
(
"Latch open on Slot(%d)
\n
"
,
ctrl
->
first_slot
+
hp_slot
);
func
->
switch_save
=
0
;
taskInfo
->
event_type
=
INT_SWITCH_OPEN
;
if
(
func
->
pwr_save
&&
func
->
presence_save
)
{
taskInfo
->
event_type
=
INT_POWER_FAULT
;
err
(
"Surprise Removal of card
\n
"
);
}
}
else
{
/*
* Switch closed
...
...
@@ -1427,6 +1433,7 @@ static u32 board_added(struct pci_func * func, struct controller * ctrl)
rc
=
p_slot
->
hpc_ops
->
set_bus_speed_mode
(
p_slot
,
adapter_speed
);
if
(
rc
)
{
err
(
"%s: Issue of set bus speed mode command failed
\n
"
,
__FUNCTION__
);
up
(
&
ctrl
->
crit_sect
);
return
WRONG_BUS_FREQUENCY
;
}
...
...
@@ -1438,6 +1445,7 @@ static u32 board_added(struct pci_func * func, struct controller * ctrl)
err
(
"%s: Can't set bus speed/mode in the case of adapter & bus mismatch
\n
"
,
__FUNCTION__
);
err
(
"%s: Error code (%d)
\n
"
,
__FUNCTION__
,
rc
);
up
(
&
ctrl
->
crit_sect
);
return
WRONG_BUS_FREQUENCY
;
}
/* Done with exclusive hardware access */
...
...
@@ -1589,8 +1597,9 @@ static u32 board_added(struct pci_func * func, struct controller * ctrl)
func
->
status
=
0
;
func
->
switch_save
=
0x10
;
func
->
is_a_board
=
0x01
;
func
->
pwr_save
=
1
;
/*
n
ext, we will instantiate the linux pci_dev structures
/*
N
ext, we will instantiate the linux pci_dev structures
* (with appropriate driver notification, if already present)
*/
index
=
0
;
...
...
@@ -1781,6 +1790,7 @@ static u32 remove_board(struct pci_func *func, struct controller *ctrl)
func
->
function
=
0
;
func
->
configured
=
0
;
func
->
switch_save
=
0x10
;
func
->
pwr_save
=
0
;
func
->
is_a_board
=
0
;
}
...
...
@@ -1807,7 +1817,6 @@ static void shpchp_pushbutton_thread (unsigned long slot)
{
struct
slot
*
p_slot
=
(
struct
slot
*
)
slot
;
u8
getstatus
;
int
rc
;
pushbutton_pending
=
0
;
...
...
@@ -1821,23 +1830,7 @@ static void shpchp_pushbutton_thread (unsigned long slot)
p_slot
->
state
=
POWEROFF_STATE
;
dbg
(
"In power_down_board, b:d(%x:%x)
\n
"
,
p_slot
->
bus
,
p_slot
->
device
);
if
(
shpchp_disable_slot
(
p_slot
))
{
/* Wait for exclusive access to hardware */
down
(
&
p_slot
->
ctrl
->
crit_sect
);
/* Turn on the Attention LED */
rc
=
p_slot
->
hpc_ops
->
set_attention_status
(
p_slot
,
1
);
if
(
rc
)
{
err
(
"%s: Issue of Set Atten Indicator On command failed
\n
"
,
__FUNCTION__
);
return
;
}
/* Wait for the command to complete */
wait_for_ctrl_irq
(
p_slot
->
ctrl
);
/* Done with exclusive hardware access */
up
(
&
p_slot
->
ctrl
->
crit_sect
);
}
shpchp_disable_slot
(
p_slot
);
p_slot
->
state
=
STATIC_STATE
;
}
else
{
p_slot
->
state
=
POWERON_STATE
;
...
...
@@ -1847,15 +1840,6 @@ static void shpchp_pushbutton_thread (unsigned long slot)
/* Wait for exclusive access to hardware */
down
(
&
p_slot
->
ctrl
->
crit_sect
);
/* Turn off the green LED */
rc
=
p_slot
->
hpc_ops
->
set_attention_status
(
p_slot
,
1
);
if
(
rc
)
{
err
(
"%s: Issue of Set Atten Indicator On command failed
\n
"
,
__FUNCTION__
);
return
;
}
/* Wait for the command to complete */
wait_for_ctrl_irq
(
p_slot
->
ctrl
);
p_slot
->
hpc_ops
->
green_led_off
(
p_slot
);
/* Wait for the command to complete */
...
...
@@ -2096,7 +2080,7 @@ int shpchp_enable_slot (struct slot *p_slot)
func
=
shpchp_slot_find
(
p_slot
->
bus
,
p_slot
->
device
,
0
);
if
(
!
func
)
{
dbg
(
"%s: Error! slot NULL
\n
"
,
__FUNCTION__
);
return
(
1
)
;
return
1
;
}
/* Check to see if (latch closed, card present, power off) */
...
...
@@ -2105,19 +2089,19 @@ int shpchp_enable_slot (struct slot *p_slot)
if
(
rc
||
!
getstatus
)
{
info
(
"%s: no adapter on slot(%x)
\n
"
,
__FUNCTION__
,
p_slot
->
number
);
up
(
&
p_slot
->
ctrl
->
crit_sect
);
return
(
0
)
;
return
1
;
}
rc
=
p_slot
->
hpc_ops
->
get_latch_status
(
p_slot
,
&
getstatus
);
if
(
rc
||
getstatus
)
{
info
(
"%s: latch open on slot(%x)
\n
"
,
__FUNCTION__
,
p_slot
->
number
);
up
(
&
p_slot
->
ctrl
->
crit_sect
);
return
(
0
)
;
return
1
;
}
rc
=
p_slot
->
hpc_ops
->
get_power_status
(
p_slot
,
&
getstatus
);
if
(
rc
||
getstatus
)
{
info
(
"%s: already enabled on slot(%x)
\n
"
,
__FUNCTION__
,
p_slot
->
number
);
up
(
&
p_slot
->
ctrl
->
crit_sect
);
return
(
0
)
;
return
1
;
}
up
(
&
p_slot
->
ctrl
->
crit_sect
);
...
...
@@ -2125,7 +2109,7 @@ int shpchp_enable_slot (struct slot *p_slot)
func
=
shpchp_slot_create
(
p_slot
->
bus
);
if
(
func
==
NULL
)
return
(
1
)
;
return
1
;
func
->
bus
=
p_slot
->
bus
;
func
->
device
=
p_slot
->
device
;
...
...
@@ -2135,6 +2119,8 @@ int shpchp_enable_slot (struct slot *p_slot)
/* We have to save the presence info for these slots */
p_slot
->
hpc_ops
->
get_adapter_status
(
p_slot
,
&
(
func
->
presence_save
));
p_slot
->
hpc_ops
->
get_power_status
(
p_slot
,
&
(
func
->
pwr_save
));
dbg
(
"%s: func->pwr_save %x
\n
"
,
__FUNCTION__
,
func
->
pwr_save
);
p_slot
->
hpc_ops
->
get_latch_status
(
p_slot
,
&
getstatus
);
func
->
switch_save
=
!
getstatus
?
0x10
:
0
;
...
...
@@ -2181,7 +2167,7 @@ int shpchp_disable_slot (struct slot *p_slot)
struct
pci_func
*
func
;
if
(
!
p_slot
->
ctrl
)
return
(
1
)
;
return
1
;
/* Check to see if (latch closed, card present, power on) */
down
(
&
p_slot
->
ctrl
->
crit_sect
);
...
...
@@ -2190,19 +2176,19 @@ int shpchp_disable_slot (struct slot *p_slot)
if
(
ret
||
!
getstatus
)
{
info
(
"%s: no adapter on slot(%x)
\n
"
,
__FUNCTION__
,
p_slot
->
number
);
up
(
&
p_slot
->
ctrl
->
crit_sect
);
return
(
0
)
;
return
1
;
}
ret
=
p_slot
->
hpc_ops
->
get_latch_status
(
p_slot
,
&
getstatus
);
if
(
ret
||
getstatus
)
{
info
(
"%s: latch open on slot(%x)
\n
"
,
__FUNCTION__
,
p_slot
->
number
);
up
(
&
p_slot
->
ctrl
->
crit_sect
);
return
(
0
)
;
return
1
;
}
ret
=
p_slot
->
hpc_ops
->
get_power_status
(
p_slot
,
&
getstatus
);
if
(
ret
||
!
getstatus
)
{
info
(
"%s: already disabled slot(%x)
\n
"
,
__FUNCTION__
,
p_slot
->
number
);
up
(
&
p_slot
->
ctrl
->
crit_sect
);
return
(
0
)
;
return
1
;
}
up
(
&
p_slot
->
ctrl
->
crit_sect
);
...
...
drivers/pci/hotplug/shpchp_pci.c
View file @
2b83a8d6
...
...
@@ -263,6 +263,7 @@ int shpchp_save_config(struct controller *ctrl, int busnumber, int num_ctlr_slot
new_slot
->
function
=
(
u8
)
function
;
new_slot
->
is_a_board
=
1
;
new_slot
->
switch_save
=
0x10
;
new_slot
->
pwr_save
=
1
;
/* In case of unsupported board */
new_slot
->
status
=
DevError
;
new_slot
->
pci_dev
=
pci_find_slot
(
new_slot
->
bus
,
...
...
drivers/pci/hotplug/shpchprm_acpi.c
View file @
2b83a8d6
...
...
@@ -218,6 +218,10 @@ static void acpi_get__hpp ( struct acpi_bridge *ab)
}
ab
->
_hpp
=
kmalloc
(
sizeof
(
struct
acpi__hpp
),
GFP_KERNEL
);
if
(
!
ab
->
_hpp
)
{
err
(
"acpi_shpchprm:%s alloc for _HPP failed
\n
"
,
path_name
);
goto
free_and_return
;
}
memset
(
ab
->
_hpp
,
0
,
sizeof
(
struct
acpi__hpp
));
ab
->
_hpp
->
cache_line_size
=
nui
[
0
];
...
...
@@ -1391,7 +1395,7 @@ static int configure_existing_function(
static
int
bind_pci_resources_to_slots
(
struct
controller
*
ctrl
)
{
struct
pci_func
*
func
;
struct
pci_func
*
func
,
new_func
;
int
busn
=
ctrl
->
bus
;
int
devn
,
funn
;
u32
vid
;
...
...
@@ -1406,11 +1410,19 @@ static int bind_pci_resources_to_slots ( struct controller *ctrl)
if
(
vid
!=
0xFFFFFFFF
)
{
func
=
shpchp_slot_find
(
busn
,
devn
,
funn
);
if
(
!
func
)
continue
;
configure_existing_function
(
ctrl
,
func
);
if
(
!
func
)
{
memset
(
&
new_func
,
0
,
sizeof
(
struct
pci_func
));
new_func
.
bus
=
busn
;
new_func
.
device
=
devn
;
new_func
.
function
=
funn
;
new_func
.
is_a_board
=
1
;
configure_existing_function
(
ctrl
,
&
new_func
);
shpchprm_dump_func_res
(
&
new_func
);
}
else
{
configure_existing_function
(
ctrl
,
func
);
shpchprm_dump_func_res
(
func
);
}
dbg
(
"aCCF:existing PCI 0x%x Func ResourceDump
\n
"
,
ctrl
->
bus
);
shpchprm_dump_func_res
(
func
);
}
}
}
...
...
drivers/pci/hotplug/shpchprm_nonacpi.c
View file @
2b83a8d6
...
...
@@ -208,7 +208,7 @@ static int configure_existing_function(
static
int
bind_pci_resources_to_slots
(
struct
controller
*
ctrl
)
{
struct
pci_func
*
func
;
struct
pci_func
*
func
,
new_func
;
int
busn
=
ctrl
->
slot_bus
;
int
devn
,
funn
;
u32
vid
;
...
...
@@ -226,11 +226,19 @@ static int bind_pci_resources_to_slots ( struct controller *ctrl)
if
(
vid
!=
0xFFFFFFFF
)
{
func
=
shpchp_slot_find
(
busn
,
devn
,
funn
);
if
(
!
func
)
continue
;
configure_existing_function
(
ctrl
,
func
);
if
(
!
func
)
{
memset
(
&
new_func
,
0
,
sizeof
(
struct
pci_func
));
new_func
.
bus
=
busn
;
new_func
.
device
=
devn
;
new_func
.
function
=
funn
;
new_func
.
is_a_board
=
1
;
configure_existing_function
(
ctrl
,
&
new_func
);
phprm_dump_func_res
(
&
new_func
);
}
else
{
configure_existing_function
(
ctrl
,
func
);
phprm_dump_func_res
(
func
);
}
dbg
(
"aCCF:existing PCI 0x%x Func ResourceDump
\n
"
,
ctrl
->
bus
);
phprm_dump_func_res
(
func
);
}
}
}
...
...
drivers/pci/msi.c
View file @
2b83a8d6
...
...
@@ -569,7 +569,7 @@ static int msix_capability_init(struct pci_dev *dev)
struct
msi_desc
*
entry
;
struct
msg_address
address
;
struct
msg_data
data
;
int
vector
=
0
,
pos
,
dev_msi_cap
;
int
vector
=
0
,
pos
,
dev_msi_cap
,
i
;
u32
phys_addr
,
table_offset
;
u32
control
;
u8
bir
;
...
...
@@ -629,12 +629,12 @@ static int msix_capability_init(struct pci_dev *dev)
writel
(
address
.
hi_address
,
base
+
PCI_MSIX_ENTRY_UPPER_ADDR_OFFSET
);
writel
(
*
(
u32
*
)
&
data
,
base
+
PCI_MSIX_ENTRY_DATA_OFFSET
);
/* Initialize all entries from 1 up to 0 */
for
(
pos
=
1
;
pos
<
dev_msi_cap
;
pos
++
)
{
writel
(
0
,
base
+
pos
*
PCI_MSIX_ENTRY_SIZE
+
for
(
i
=
1
;
i
<
dev_msi_cap
;
i
++
)
{
writel
(
0
,
base
+
i
*
PCI_MSIX_ENTRY_SIZE
+
PCI_MSIX_ENTRY_LOWER_ADDR_OFFSET
);
writel
(
0
,
base
+
pos
*
PCI_MSIX_ENTRY_SIZE
+
writel
(
0
,
base
+
i
*
PCI_MSIX_ENTRY_SIZE
+
PCI_MSIX_ENTRY_UPPER_ADDR_OFFSET
);
writel
(
0
,
base
+
pos
*
PCI_MSIX_ENTRY_SIZE
+
writel
(
0
,
base
+
i
*
PCI_MSIX_ENTRY_SIZE
+
PCI_MSIX_ENTRY_DATA_OFFSET
);
}
attach_msi_entry
(
entry
,
vector
);
...
...
drivers/pci/pci.c
View file @
2b83a8d6
...
...
@@ -442,7 +442,7 @@ int pci_enable_wake(struct pci_dev *dev, u32 state, int enable)
pci_read_config_word
(
dev
,
pm
+
PCI_PM_PMC
,
&
value
);
value
&=
PCI_PM_CAP_PME_MASK
;
value
>>=
ffs
(
value
)
;
/* First bit of mask */
value
>>=
ffs
(
PCI_PM_CAP_PME_MASK
)
-
1
;
/* First bit of mask */
/* Check if it can generate PME# from requested state. */
if
(
!
value
||
!
(
value
&
(
1
<<
state
)))
...
...
drivers/pci/quirks.c
View file @
2b83a8d6
...
...
@@ -705,6 +705,7 @@ static void __init asus_hides_smbus_hostbridge(struct pci_dev *dev)
}
if
(
dev
->
device
==
PCI_DEVICE_ID_INTEL_82845G_HB
)
switch
(
dev
->
subsystem_device
)
{
case
0x80b1
:
/* P4GE-V */
case
0x80b2
:
/* P4PE */
case
0x8093
:
/* P4B533-V */
asus_hides_smbus
=
1
;
...
...
drivers/video/acornfb.c
View file @
2b83a8d6
...
...
@@ -1246,6 +1246,8 @@ acornfb_detect_monitortype(void)
/*
* This enables the unused memory to be freed on older Acorn machines.
* We are freeing memory on behalf of the architecture initialisation
* code here.
*/
static
inline
void
free_unused_pages
(
unsigned
int
virtual_start
,
unsigned
int
virtual_end
)
...
...
@@ -1268,7 +1270,7 @@ free_unused_pages(unsigned int virtual_start, unsigned int virtual_end)
*/
page
=
virt_to_page
(
virtual_start
);
ClearPageReserved
(
page
);
atomic_set
(
&
page
->
count
,
1
);
set_page_count
(
page
,
1
);
free_page
(
virtual_start
);
virtual_start
+=
PAGE_SIZE
;
...
...
fs/namei.c
View file @
2b83a8d6
...
...
@@ -2197,7 +2197,9 @@ int vfs_readlink(struct dentry *dentry, char __user *buffer, int buflen, const c
int
generic_readlink
(
struct
dentry
*
dentry
,
char
__user
*
buffer
,
int
buflen
)
{
struct
nameidata
nd
;
int
res
=
dentry
->
d_inode
->
i_op
->
follow_link
(
dentry
,
&
nd
);
int
res
;
nd
.
depth
=
0
;
res
=
dentry
->
d_inode
->
i_op
->
follow_link
(
dentry
,
&
nd
);
if
(
!
res
)
{
res
=
vfs_readlink
(
dentry
,
buffer
,
buflen
,
nd_get_link
(
&
nd
));
if
(
dentry
->
d_inode
->
i_op
->
put_link
)
...
...
include/asm-ppc64/bitops.h
View file @
2b83a8d6
...
...
@@ -288,15 +288,15 @@ static __inline__ int ffs(int x)
#define hweight16(x) generic_hweight16(x)
#define hweight8(x) generic_hweight8(x)
extern
unsigned
long
find_next_zero_bit
(
unsigned
long
*
addr
,
unsigned
long
size
,
unsigned
long
offset
);
extern
unsigned
long
find_next_zero_bit
(
const
unsigned
long
*
addr
,
unsigned
long
size
,
unsigned
long
offset
);
#define find_first_zero_bit(addr, size) \
find_next_zero_bit((addr), (size), 0)
extern
unsigned
long
find_next_bit
(
unsigned
long
*
addr
,
unsigned
long
size
,
unsigned
long
offset
);
extern
unsigned
long
find_next_bit
(
const
unsigned
long
*
addr
,
unsigned
long
size
,
unsigned
long
offset
);
#define find_first_bit(addr, size) \
find_next_bit((addr), (size), 0)
extern
unsigned
long
find_next_zero_le_bit
(
unsigned
long
*
addr
,
unsigned
long
size
,
unsigned
long
offset
);
extern
unsigned
long
find_next_zero_le_bit
(
const
unsigned
long
*
addr
,
unsigned
long
size
,
unsigned
long
offset
);
#define find_first_zero_le_bit(addr, size) \
find_next_zero_le_bit((addr), (size), 0)
...
...
include/asm-s390/byteorder.h
View file @
2b83a8d6
...
...
@@ -14,7 +14,7 @@
#ifdef __GNUC__
#ifdef __s390x__
static
__inline__
__u64
___arch__swab64p
(
__u64
*
x
)
static
__inline__
__u64
___arch__swab64p
(
const
__u64
*
x
)
{
__u64
result
;
...
...
@@ -40,7 +40,7 @@ static __inline__ void ___arch__swab64s(__u64 *x)
}
#endif
/* __s390x__ */
static
__inline__
__u32
___arch__swab32p
(
__u32
*
x
)
static
__inline__
__u32
___arch__swab32p
(
const
__u32
*
x
)
{
__u32
result
;
...
...
@@ -77,7 +77,7 @@ static __inline__ void ___arch__swab32s(__u32 *x)
*
x
=
___arch__swab32p
(
x
);
}
static
__inline__
__u16
___arch__swab16p
(
__u16
*
x
)
static
__inline__
__u16
___arch__swab16p
(
const
__u16
*
x
)
{
__u16
result
;
...
...
include/linux/byteorder/swab.h
View file @
2b83a8d6
...
...
@@ -134,7 +134,7 @@ static __inline__ __attribute_const__ __u16 __fswab16(__u16 x)
{
return
__arch__swab16
(
x
);
}
static
__inline__
__u16
__swab16p
(
__u16
*
x
)
static
__inline__
__u16
__swab16p
(
const
__u16
*
x
)
{
return
__arch__swab16p
(
x
);
}
...
...
@@ -147,7 +147,7 @@ static __inline__ __attribute_const__ __u32 __fswab32(__u32 x)
{
return
__arch__swab32
(
x
);
}
static
__inline__
__u32
__swab32p
(
__u32
*
x
)
static
__inline__
__u32
__swab32p
(
const
__u32
*
x
)
{
return
__arch__swab32p
(
x
);
}
...
...
@@ -167,7 +167,7 @@ static __inline__ __attribute_const__ __u64 __fswab64(__u64 x)
return
__arch__swab64
(
x
);
# endif
}
static
__inline__
__u64
__swab64p
(
__u64
*
x
)
static
__inline__
__u64
__swab64p
(
const
__u64
*
x
)
{
return
__arch__swab64p
(
x
);
}
...
...
include/linux/cpumask.h
View file @
2b83a8d6
...
...
@@ -171,19 +171,19 @@ static inline int __cpus_subset(cpumask_t *src1p,
}
#define cpus_empty(src) __cpus_empty(&(src), NR_CPUS)
static
inline
int
__cpus_empty
(
cpumask_t
*
srcp
,
int
nbits
)
static
inline
int
__cpus_empty
(
c
onst
c
pumask_t
*
srcp
,
int
nbits
)
{
return
bitmap_empty
(
srcp
->
bits
,
nbits
);
}
#define cpus_full(cpumask) __cpus_full(&(cpumask), NR_CPUS)
static
inline
int
__cpus_full
(
cpumask_t
*
srcp
,
int
nbits
)
static
inline
int
__cpus_full
(
c
onst
c
pumask_t
*
srcp
,
int
nbits
)
{
return
bitmap_full
(
srcp
->
bits
,
nbits
);
}
#define cpus_weight(cpumask) __cpus_weight(&(cpumask), NR_CPUS)
static
inline
int
__cpus_weight
(
cpumask_t
*
srcp
,
int
nbits
)
static
inline
int
__cpus_weight
(
c
onst
c
pumask_t
*
srcp
,
int
nbits
)
{
return
bitmap_weight
(
srcp
->
bits
,
nbits
);
}
...
...
@@ -191,7 +191,7 @@ static inline int __cpus_weight(cpumask_t *srcp, int nbits)
#define cpus_shift_right(dst, src, n) \
__cpus_shift_right(&(dst), &(src), (n), NR_CPUS)
static
inline
void
__cpus_shift_right
(
cpumask_t
*
dstp
,
cpumask_t
*
srcp
,
int
n
,
int
nbits
)
c
onst
c
pumask_t
*
srcp
,
int
n
,
int
nbits
)
{
bitmap_shift_right
(
dstp
->
bits
,
srcp
->
bits
,
n
,
nbits
);
}
...
...
@@ -199,19 +199,19 @@ static inline void __cpus_shift_right(cpumask_t *dstp,
#define cpus_shift_left(dst, src, n) \
__cpus_shift_left(&(dst), &(src), (n), NR_CPUS)
static
inline
void
__cpus_shift_left
(
cpumask_t
*
dstp
,
cpumask_t
*
srcp
,
int
n
,
int
nbits
)
c
onst
c
pumask_t
*
srcp
,
int
n
,
int
nbits
)
{
bitmap_shift_left
(
dstp
->
bits
,
srcp
->
bits
,
n
,
nbits
);
}
#define first_cpu(src) __first_cpu(&(src), NR_CPUS)
static
inline
int
__first_cpu
(
cpumask_t
*
srcp
,
int
nbits
)
static
inline
int
__first_cpu
(
c
onst
c
pumask_t
*
srcp
,
int
nbits
)
{
return
find_first_bit
(
srcp
->
bits
,
nbits
);
}
#define next_cpu(n, src) __next_cpu((n), &(src), NR_CPUS)
static
inline
int
__next_cpu
(
int
n
,
cpumask_t
*
srcp
,
int
nbits
)
static
inline
int
__next_cpu
(
int
n
,
c
onst
c
pumask_t
*
srcp
,
int
nbits
)
{
return
find_next_bit
(
srcp
->
bits
,
nbits
,
n
+
1
);
}
...
...
include/linux/pci_ids.h
View file @
2b83a8d6
...
...
@@ -967,12 +967,14 @@
#define PCI_VENDOR_ID_3COM 0x10b7
#define PCI_DEVICE_ID_3COM_3C985 0x0001
#define PCI_DEVICE_ID_3COM_3C940 0x1700
#define PCI_DEVICE_ID_3COM_3C339 0x3390
#define PCI_DEVICE_ID_3COM_3C359 0x3590
#define PCI_DEVICE_ID_3COM_3C590 0x5900
#define PCI_DEVICE_ID_3COM_3C595TX 0x5950
#define PCI_DEVICE_ID_3COM_3C595T4 0x5951
#define PCI_DEVICE_ID_3COM_3C595MII 0x5952
#define PCI_DEVICE_ID_3COM_3C940B 0x80eb
#define PCI_DEVICE_ID_3COM_3C900TPO 0x9000
#define PCI_DEVICE_ID_3COM_3C900COMBO 0x9001
#define PCI_DEVICE_ID_3COM_3C905TX 0x9050
...
...
@@ -1420,6 +1422,9 @@
#define PCI_DEVICE_ID_RICOH_RL5C476 0x0476
#define PCI_DEVICE_ID_RICOH_RL5C478 0x0478
#define PCI_VENDOR_ID_DLINK 0x1186
#define PCI_DEVICE_ID_DLINK_DGE510T 0x4c00
#define PCI_VENDOR_ID_ARTOP 0x1191
#define PCI_DEVICE_ID_ARTOP_ATP8400 0x0004
#define PCI_DEVICE_ID_ARTOP_ATP850UF 0x0005
...
...
@@ -1735,6 +1740,9 @@
#define PCI_VENDOR_ID_KAWASAKI 0x136b
#define PCI_DEVICE_ID_MCHIP_KL5A72002 0xff01
#define PCI_VENDOR_ID_CNET 0x1371
#define PCI_DEVICE_ID_CNET_GIGACARD 0x434e
#define PCI_VENDOR_ID_LMC 0x1376
#define PCI_DEVICE_ID_LMC_HSSI 0x0003
#define PCI_DEVICE_ID_LMC_DS3 0x0004
...
...
@@ -1769,6 +1777,12 @@
#define PCI_DEVICE_ID_CCD_B00C 0xb00c
#define PCI_DEVICE_ID_CCD_B100 0xb100
#define PCI_VENDOR_ID_MICROGATE 0x13c0
#define PCI_DEVICE_ID_MICROGATE_USC 0x0010
#define PCI_DEVICE_ID_MICROGATE_SCC 0x0020
#define PCI_DEVICE_ID_MICROGATE_SCA 0x0030
#define PCI_DEVICE_ID_MICROGATE_USC2 0x0210
#define PCI_VENDOR_ID_3WARE 0x13C1
#define PCI_DEVICE_ID_3WARE_1000 0x1000
#define PCI_DEVICE_ID_3WARE_7000 0x1001
...
...
@@ -1913,6 +1927,10 @@
#define PCI_DEVICE_ID_FARSITE_TE1 0x1610
#define PCI_DEVICE_ID_FARSITE_TE1C 0x1612
#define PCI_VENDOR_ID_LINKSYS 0x1737
#define PCI_DEVICE_ID_LINKSYS_EG1032 0x1032
#define PCI_DEVICE_ID_LINKSYS_EG1064 0x1064
#define PCI_VENDOR_ID_ALTIMA 0x173b
#define PCI_DEVICE_ID_ALTIMA_AC1000 0x03e8
#define PCI_DEVICE_ID_ALTIMA_AC1001 0x03e9
...
...
@@ -2270,12 +2288,3 @@
#define PCI_DEVICE_ID_ARK_STING 0xa091
#define PCI_DEVICE_ID_ARK_STINGARK 0xa099
#define PCI_DEVICE_ID_ARK_2000MT 0xa0a1
#define PCI_VENDOR_ID_MICROGATE 0x13c0
#define PCI_DEVICE_ID_MICROGATE_USC 0x0010
#define PCI_DEVICE_ID_MICROGATE_SCC 0x0020
#define PCI_DEVICE_ID_MICROGATE_SCA 0x0030
#define PCI_DEVICE_ID_MICROGATE_USC2 0x0210
#define PCI_VENDOR_ID_HINT 0x3388
#define PCI_DEVICE_ID_HINT_VXPROII_IDE 0x8013
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment