mirror of
https://github.com/joel16/android_kernel_sony_msm8994_rework.git
synced 2025-01-01 09:08:55 +00:00
Merge branch 'master' into upstream
Conflicts: drivers/net/netxen/netxen_nic.h drivers/net/netxen/netxen_nic_main.c
This commit is contained in:
commit
8d1413b280
@ -190,9 +190,13 @@ quiet_cmd_fig2png = FIG2PNG $@
|
||||
###
|
||||
# Help targets as used by the top-level makefile
|
||||
dochelp:
|
||||
@echo ' Linux kernel internal documentation in different formats:'
|
||||
@echo ' xmldocs (XML DocBook), psdocs (Postscript), pdfdocs (PDF)'
|
||||
@echo ' htmldocs (HTML), mandocs (man pages, use installmandocs to install)'
|
||||
@echo ' Linux kernel internal documentation in different formats:'
|
||||
@echo ' htmldocs - HTML'
|
||||
@echo ' installmandocs - install man pages generated by mandocs'
|
||||
@echo ' mandocs - man pages'
|
||||
@echo ' pdfdocs - PDF'
|
||||
@echo ' psdocs - Postscript'
|
||||
@echo ' xmldocs - XML DocBook'
|
||||
|
||||
###
|
||||
# Temporary files left by various tools
|
||||
|
@ -1416,6 +1416,11 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
|
||||
scsi_logging= [SCSI]
|
||||
|
||||
scsi_mod.scan= [SCSI] sync (default) scans SCSI busses as they are
|
||||
discovered. async scans them in kernel threads,
|
||||
allowing boot to proceed. none ignores them, expecting
|
||||
user space to do the scan.
|
||||
|
||||
selinux [SELINUX] Disable or enable SELinux at boot time.
|
||||
Format: { "0" | "1" }
|
||||
See security/selinux/Kconfig help text.
|
||||
|
@ -6,6 +6,8 @@
|
||||
IBM Corp.
|
||||
(c) 2005 Becky Bruce <becky.bruce at freescale.com>,
|
||||
Freescale Semiconductor, FSL SOC and 32-bit additions
|
||||
(c) 2006 MontaVista Software, Inc.
|
||||
Flash chip node definition
|
||||
|
||||
May 18, 2005: Rev 0.1 - Initial draft, no chapter III yet.
|
||||
|
||||
@ -1693,6 +1695,43 @@ platforms are moved over to use the flattened-device-tree model.
|
||||
};
|
||||
};
|
||||
|
||||
g) Flash chip nodes
|
||||
|
||||
Flash chips (Memory Technology Devices) are often used for solid state
|
||||
file systems on embedded devices.
|
||||
|
||||
Required properties:
|
||||
|
||||
- device_type : has to be "rom"
|
||||
- compatible : Should specify what this ROM device is compatible with
|
||||
(i.e. "onenand"). Currently, this is most likely to be "direct-mapped"
|
||||
(which corresponds to the MTD physmap mapping driver).
|
||||
- regs : Offset and length of the register set (or memory mapping) for
|
||||
the device.
|
||||
|
||||
Recommended properties :
|
||||
|
||||
- bank-width : Width of the flash data bus in bytes. Required
|
||||
for the NOR flashes (compatible == "direct-mapped" and others) ONLY.
|
||||
- partitions : Several pairs of 32-bit values where the first value is
|
||||
partition's offset from the start of the device and the second one is
|
||||
partition size in bytes with LSB used to signify a read only
|
||||
partititon (so, the parition size should always be an even number).
|
||||
- partition-names : The list of concatenated zero terminated strings
|
||||
representing the partition names.
|
||||
|
||||
Example:
|
||||
|
||||
flash@ff000000 {
|
||||
device_type = "rom";
|
||||
compatible = "direct-mapped";
|
||||
regs = <ff000000 01000000>;
|
||||
bank-width = <4>;
|
||||
partitions = <00000000 00f80000
|
||||
00f80000 00080001>;
|
||||
partition-names = "fs\0firmware";
|
||||
};
|
||||
|
||||
More devices will be defined as this spec matures.
|
||||
|
||||
|
||||
|
189
Documentation/powerpc/mpc52xx-device-tree-bindings.txt
Normal file
189
Documentation/powerpc/mpc52xx-device-tree-bindings.txt
Normal file
@ -0,0 +1,189 @@
|
||||
MPC52xx Device Tree Bindings
|
||||
----------------------------
|
||||
|
||||
(c) 2006 Secret Lab Technologies Ltd
|
||||
Grant Likely <grant.likely at secretlab.ca>
|
||||
|
||||
I - Introduction
|
||||
================
|
||||
Boards supported by the arch/powerpc architecture require device tree be
|
||||
passed by the boot loader to the kernel at boot time. The device tree
|
||||
describes what devices are present on the board and how they are
|
||||
connected. The device tree can either be passed as a binary blob (as
|
||||
described in Documentation/powerpc/booting-without-of.txt), or passed
|
||||
by Open Firmare (IEEE 1275) compatible firmware using an OF compatible
|
||||
client interface API.
|
||||
|
||||
This document specifies the requirements on the device-tree for mpc52xx
|
||||
based boards. These requirements are above and beyond the details
|
||||
specified in either the OpenFirmware spec or booting-without-of.txt
|
||||
|
||||
All new mpc52xx-based boards are expected to match this document. In
|
||||
cases where this document is not sufficient to support a new board port,
|
||||
this document should be updated as part of adding the new board support.
|
||||
|
||||
II - Philosophy
|
||||
===============
|
||||
The core of this document is naming convention. The whole point of
|
||||
defining this convention is to reduce or eliminate the number of
|
||||
special cases required to support a 52xx board. If all 52xx boards
|
||||
follow the same convention, then generic 52xx support code will work
|
||||
rather than coding special cases for each new board.
|
||||
|
||||
This section tries to capture the thought process behind why the naming
|
||||
convention is what it is.
|
||||
|
||||
1. Node names
|
||||
-------------
|
||||
There is strong convention/requirements already established for children
|
||||
of the root node. 'cpus' describes the processor cores, 'memory'
|
||||
describes memory, and 'chosen' provides boot configuration. Other nodes
|
||||
are added to describe devices attached to the processor local bus.
|
||||
Following convention already established with other system-on-chip
|
||||
processors, MPC52xx boards must have an 'soc5200' node as a child of the
|
||||
root node.
|
||||
|
||||
The soc5200 node holds child nodes for all on chip devices. Child nodes
|
||||
are typically named after the configured function. ie. the FEC node is
|
||||
named 'ethernet', and a PSC in uart mode is named 'serial'.
|
||||
|
||||
2. device_type property
|
||||
-----------------------
|
||||
similar to the node name convention above; the device_type reflects the
|
||||
configured function of a device. ie. 'serial' for a uart and 'spi' for
|
||||
an spi controller. However, while node names *should* reflect the
|
||||
configured function, device_type *must* match the configured function
|
||||
exactly.
|
||||
|
||||
3. compatible property
|
||||
----------------------
|
||||
Since device_type isn't enough to match devices to drivers, there also
|
||||
needs to be a naming convention for the compatible property. Compatible
|
||||
is an list of device descriptions sorted from specific to generic. For
|
||||
the mpc52xx, the required format for each compatible value is
|
||||
<chip>-<device>[-<mode>]. At the minimum, the list shall contain two
|
||||
items; the first specifying the exact chip, and the second specifying
|
||||
mpc52xx for the chip.
|
||||
|
||||
ie. ethernet on mpc5200b: compatible = "mpc5200b-ethernet\0mpc52xx-ethernet"
|
||||
|
||||
The idea here is that most drivers will match to the most generic field
|
||||
in the compatible list (mpc52xx-*), but can also test the more specific
|
||||
field for enabling bug fixes or extra features.
|
||||
|
||||
Modal devices, like PSCs, also append the configured function to the
|
||||
end of the compatible field. ie. A PSC in i2s mode would specify
|
||||
"mpc52xx-psc-i2s", not "mpc52xx-i2s". This convention is chosen to
|
||||
avoid naming conflicts with non-psc devices providing the same
|
||||
function. For example, "mpc52xx-spi" and "mpc52xx-psc-spi" describe
|
||||
the mpc5200 simple spi device and a PSC spi mode respectively.
|
||||
|
||||
If the soc device is more generic and present on other SOCs, the
|
||||
compatible property can specify the more generic device type also.
|
||||
|
||||
ie. mscan: compatible = "mpc5200-mscan\0mpc52xx-mscan\0fsl,mscan";
|
||||
|
||||
At the time of writing, exact chip may be either 'mpc5200' or
|
||||
'mpc5200b'.
|
||||
|
||||
Device drivers should always try to match as generically as possible.
|
||||
|
||||
III - Structure
|
||||
===============
|
||||
The device tree for an mpc52xx board follows the structure defined in
|
||||
booting-without-of.txt with the following additional notes:
|
||||
|
||||
0) the root node
|
||||
----------------
|
||||
Typical root description node; see booting-without-of
|
||||
|
||||
1) The cpus node
|
||||
----------------
|
||||
The cpus node follows the basic layout described in booting-without-of.
|
||||
The bus-frequency property holds the XLB bus frequency
|
||||
The clock-frequency property holds the core frequency
|
||||
|
||||
2) The memory node
|
||||
------------------
|
||||
Typical memory description node; see booting-without-of.
|
||||
|
||||
3) The soc5200 node
|
||||
-------------------
|
||||
This node describes the on chip SOC peripherals. Every mpc52xx based
|
||||
board will have this node, and as such there is a common naming
|
||||
convention for SOC devices.
|
||||
|
||||
Required properties:
|
||||
name type description
|
||||
---- ---- -----------
|
||||
device_type string must be "soc"
|
||||
ranges int should be <0 baseaddr baseaddr+10000>
|
||||
reg int must be <baseaddr 10000>
|
||||
|
||||
Recommended properties:
|
||||
name type description
|
||||
---- ---- -----------
|
||||
compatible string should be "<chip>-soc\0mpc52xx-soc"
|
||||
ie. "mpc5200b-soc\0mpc52xx-soc"
|
||||
#interrupt-cells int must be <3>. If it is not defined
|
||||
here then it must be defined in every
|
||||
soc device node.
|
||||
bus-frequency int IPB bus frequency in HZ. Clock rate
|
||||
used by most of the soc devices.
|
||||
Defining it here avoids needing it
|
||||
added to every device node.
|
||||
|
||||
4) soc5200 child nodes
|
||||
----------------------
|
||||
Any on chip SOC devices available to Linux must appear as soc5200 child nodes.
|
||||
|
||||
Note: in the tables below, '*' matches all <chip> values. ie.
|
||||
*-pic would translate to "mpc5200-pic\0mpc52xx-pic"
|
||||
|
||||
Required soc5200 child nodes:
|
||||
name device_type compatible Description
|
||||
---- ----------- ---------- -----------
|
||||
cdm@<addr> cdm *-cmd Clock Distribution
|
||||
pic@<addr> interrupt-controller *-pic need an interrupt
|
||||
controller to boot
|
||||
bestcomm@<addr> dma-controller *-bestcomm 52xx pic also requires
|
||||
the bestcomm device
|
||||
|
||||
Recommended soc5200 child nodes; populate as needed for your board
|
||||
name device_type compatible Description
|
||||
---- ----------- ---------- -----------
|
||||
gpt@<addr> gpt *-gpt General purpose timers
|
||||
rtc@<addr> rtc *-rtc Real time clock
|
||||
mscan@<addr> mscan *-mscan CAN bus controller
|
||||
pci@<addr> pci *-pci PCI bridge
|
||||
serial@<addr> serial *-psc-uart PSC in serial mode
|
||||
i2s@<addr> i2s *-psc-i2s PSC in i2s mode
|
||||
ac97@<addr> ac97 *-psc-ac97 PSC in ac97 mode
|
||||
spi@<addr> spi *-psc-spi PSC in spi mode
|
||||
irda@<addr> irda *-psc-irda PSC in IrDA mode
|
||||
spi@<addr> spi *-spi MPC52xx spi device
|
||||
ethernet@<addr> network *-fec MPC52xx ethernet device
|
||||
ata@<addr> ata *-ata IDE ATA interface
|
||||
i2c@<addr> i2c *-i2c I2C controller
|
||||
usb@<addr> usb-ohci-be *-ohci,ohci-be USB controller
|
||||
xlb@<addr> xlb *-xlb XLB arbritrator
|
||||
|
||||
IV - Extra Notes
|
||||
================
|
||||
|
||||
1. Interrupt mapping
|
||||
--------------------
|
||||
The mpc52xx pic driver splits hardware IRQ numbers into two levels. The
|
||||
split reflects the layout of the PIC hardware itself, which groups
|
||||
interrupts into one of three groups; CRIT, MAIN or PERP. Also, the
|
||||
Bestcomm dma engine has it's own set of interrupt sources which are
|
||||
cascaded off of peripheral interrupt 0, which the driver interprets as a
|
||||
fourth group, SDMA.
|
||||
|
||||
The interrupts property for device nodes using the mpc52xx pic consists
|
||||
of three cells; <L1 L2 level>
|
||||
|
||||
L1 := [CRIT=0, MAIN=1, PERP=2, SDMA=3]
|
||||
L2 := interrupt number; directly mapped from the value in the
|
||||
"ICTL PerStat, MainStat, CritStat Encoded Register"
|
||||
level := [LEVEL_HIGH=0, EDGE_RISING=1, EDGE_FALLING=2, LEVEL_LOW=3]
|
@ -375,7 +375,6 @@ Summary:
|
||||
scsi_add_device - creates new scsi device (lu) instance
|
||||
scsi_add_host - perform sysfs registration and set up transport class
|
||||
scsi_adjust_queue_depth - change the queue depth on a SCSI device
|
||||
scsi_assign_lock - replace default host_lock with given lock
|
||||
scsi_bios_ptable - return copy of block device's partition table
|
||||
scsi_block_requests - prevent further commands being queued to given host
|
||||
scsi_deactivate_tcq - turn off tag command queueing
|
||||
@ -488,20 +487,6 @@ void scsi_adjust_queue_depth(struct scsi_device * sdev, int tagged,
|
||||
int tags)
|
||||
|
||||
|
||||
/**
|
||||
* scsi_assign_lock - replace default host_lock with given lock
|
||||
* @shost: a pointer to a scsi host instance
|
||||
* @lock: pointer to lock to replace host_lock for this host
|
||||
*
|
||||
* Returns nothing
|
||||
*
|
||||
* Might block: no
|
||||
*
|
||||
* Defined in: include/scsi/scsi_host.h .
|
||||
**/
|
||||
void scsi_assign_lock(struct Scsi_Host *shost, spinlock_t *lock)
|
||||
|
||||
|
||||
/**
|
||||
* scsi_bios_ptable - return copy of block device's partition table
|
||||
* @dev: pointer to block device
|
||||
@ -1366,17 +1351,11 @@ Locks
|
||||
Each struct Scsi_Host instance has a spin_lock called struct
|
||||
Scsi_Host::default_lock which is initialized in scsi_host_alloc() [found in
|
||||
hosts.c]. Within the same function the struct Scsi_Host::host_lock pointer
|
||||
is initialized to point at default_lock with the scsi_assign_lock() function.
|
||||
Thereafter lock and unlock operations performed by the mid level use the
|
||||
struct Scsi_Host::host_lock pointer.
|
||||
is initialized to point at default_lock. Thereafter lock and unlock
|
||||
operations performed by the mid level use the struct Scsi_Host::host_lock
|
||||
pointer. Previously drivers could override the host_lock pointer but
|
||||
this is not allowed anymore.
|
||||
|
||||
LLDs can override the use of struct Scsi_Host::default_lock by
|
||||
using scsi_assign_lock(). The earliest opportunity to do this would
|
||||
be in the detect() function after it has invoked scsi_register(). It
|
||||
could be replaced by a coarser grain lock (e.g. per driver) or a
|
||||
lock of equal granularity (i.e. per host). Using finer grain locks
|
||||
(e.g. per SCSI device) may be possible by juggling locks in
|
||||
queuecommand().
|
||||
|
||||
Autosense
|
||||
=========
|
||||
|
@ -2438,6 +2438,13 @@ M: promise@pnd-pc.demon.co.uk
|
||||
W: http://www.pnd-pc.demon.co.uk/promise/
|
||||
S: Maintained
|
||||
|
||||
PS3 PLATFORM SUPPORT
|
||||
P: Geoff Levand
|
||||
M: geoffrey.levand@am.sony.com
|
||||
L: linuxppc-dev@ozlabs.org
|
||||
L: cbe-oss-dev@ozlabs.org
|
||||
S: Supported
|
||||
|
||||
PVRUSB2 VIDEO4LINUX DRIVER
|
||||
P: Mike Isely
|
||||
M: isely@pobox.com
|
||||
|
17
README
17
README
@ -1,4 +1,4 @@
|
||||
Linux kernel release 2.6.xx <http://kernel.org>
|
||||
Linux kernel release 2.6.xx <http://kernel.org/>
|
||||
|
||||
These are the release notes for Linux version 2.6. Read them carefully,
|
||||
as they tell you what this is all about, explain how to install the
|
||||
@ -22,15 +22,17 @@ ON WHAT HARDWARE DOES IT RUN?
|
||||
|
||||
Although originally developed first for 32-bit x86-based PCs (386 or higher),
|
||||
today Linux also runs on (at least) the Compaq Alpha AXP, Sun SPARC and
|
||||
UltraSPARC, Motorola 68000, PowerPC, PowerPC64, ARM, Hitachi SuperH,
|
||||
UltraSPARC, Motorola 68000, PowerPC, PowerPC64, ARM, Hitachi SuperH, Cell,
|
||||
IBM S/390, MIPS, HP PA-RISC, Intel IA-64, DEC VAX, AMD x86-64, AXIS CRIS,
|
||||
and Renesas M32R architectures.
|
||||
Cris, Xtensa, AVR32 and Renesas M32R architectures.
|
||||
|
||||
Linux is easily portable to most general-purpose 32- or 64-bit architectures
|
||||
as long as they have a paged memory management unit (PMMU) and a port of the
|
||||
GNU C compiler (gcc) (part of The GNU Compiler Collection, GCC). Linux has
|
||||
also been ported to a number of architectures without a PMMU, although
|
||||
functionality is then obviously somewhat limited.
|
||||
Linux has also been ported to itself. You can now run the kernel as a
|
||||
userspace application - this is called UserMode Linux (UML).
|
||||
|
||||
DOCUMENTATION:
|
||||
|
||||
@ -113,6 +115,7 @@ INSTALLING the kernel:
|
||||
version 2.6.12.2 and want to jump to 2.6.12.3, you must first
|
||||
reverse the 2.6.12.2 patch (that is, patch -R) _before_ applying
|
||||
the 2.6.12.3 patch.
|
||||
You can read more on this in Documentation/applying-patches.txt
|
||||
|
||||
- Make sure you have no stale .o files and dependencies lying around:
|
||||
|
||||
@ -161,6 +164,7 @@ CONFIGURING the kernel:
|
||||
only ask you for the answers to new questions.
|
||||
|
||||
- Alternate configuration commands are:
|
||||
"make config" Plain text interface.
|
||||
"make menuconfig" Text based color menus, radiolists & dialogs.
|
||||
"make xconfig" X windows (Qt) based configuration tool.
|
||||
"make gconfig" X windows (Gtk) based configuration tool.
|
||||
@ -303,8 +307,9 @@ IF SOMETHING GOES WRONG:
|
||||
|
||||
- If you compiled the kernel with CONFIG_KALLSYMS you can send the dump
|
||||
as is, otherwise you will have to use the "ksymoops" program to make
|
||||
sense of the dump. This utility can be downloaded from
|
||||
ftp://ftp.<country>.kernel.org/pub/linux/utils/kernel/ksymoops.
|
||||
sense of the dump (but compiling with CONFIG_KALLSYMS is usually preferred).
|
||||
This utility can be downloaded from
|
||||
ftp://ftp.<country>.kernel.org/pub/linux/utils/kernel/ksymoops/ .
|
||||
Alternately you can do the dump lookup by hand:
|
||||
|
||||
- In debugging dumps like the above, it helps enormously if you can
|
||||
@ -336,7 +341,7 @@ IF SOMETHING GOES WRONG:
|
||||
|
||||
If you for some reason cannot do the above (you have a pre-compiled
|
||||
kernel image or similar), telling me as much about your setup as
|
||||
possible will help.
|
||||
possible will help. Please read the REPORTING-BUGS document for details.
|
||||
|
||||
- Alternately, you can use gdb on a running kernel. (read-only; i.e. you
|
||||
cannot change values or set break points.) To do this, first compile the
|
||||
|
@ -60,16 +60,16 @@ static int sharpsl_ac_check(void);
|
||||
static int sharpsl_fatal_check(void);
|
||||
static int sharpsl_average_value(int ad);
|
||||
static void sharpsl_average_clear(void);
|
||||
static void sharpsl_charge_toggle(void *private_);
|
||||
static void sharpsl_battery_thread(void *private_);
|
||||
static void sharpsl_charge_toggle(struct work_struct *private_);
|
||||
static void sharpsl_battery_thread(struct work_struct *private_);
|
||||
|
||||
|
||||
/*
|
||||
* Variables
|
||||
*/
|
||||
struct sharpsl_pm_status sharpsl_pm;
|
||||
DECLARE_WORK(toggle_charger, sharpsl_charge_toggle, NULL);
|
||||
DECLARE_WORK(sharpsl_bat, sharpsl_battery_thread, NULL);
|
||||
DECLARE_DELAYED_WORK(toggle_charger, sharpsl_charge_toggle);
|
||||
DECLARE_DELAYED_WORK(sharpsl_bat, sharpsl_battery_thread);
|
||||
DEFINE_LED_TRIGGER(sharpsl_charge_led_trigger);
|
||||
|
||||
|
||||
@ -116,7 +116,7 @@ void sharpsl_battery_kick(void)
|
||||
EXPORT_SYMBOL(sharpsl_battery_kick);
|
||||
|
||||
|
||||
static void sharpsl_battery_thread(void *private_)
|
||||
static void sharpsl_battery_thread(struct work_struct *private_)
|
||||
{
|
||||
int voltage, percent, apm_status, i = 0;
|
||||
|
||||
@ -128,7 +128,7 @@ static void sharpsl_battery_thread(void *private_)
|
||||
/* Corgi cannot confirm when battery fully charged so periodically kick! */
|
||||
if (!sharpsl_pm.machinfo->batfull_irq && (sharpsl_pm.charge_mode == CHRG_ON)
|
||||
&& time_after(jiffies, sharpsl_pm.charge_start_time + SHARPSL_CHARGE_ON_TIME_INTERVAL))
|
||||
schedule_work(&toggle_charger);
|
||||
schedule_delayed_work(&toggle_charger, 0);
|
||||
|
||||
while(1) {
|
||||
voltage = sharpsl_pm.machinfo->read_devdata(SHARPSL_BATT_VOLT);
|
||||
@ -212,7 +212,7 @@ static void sharpsl_charge_off(void)
|
||||
sharpsl_pm_led(SHARPSL_LED_OFF);
|
||||
sharpsl_pm.charge_mode = CHRG_OFF;
|
||||
|
||||
schedule_work(&sharpsl_bat);
|
||||
schedule_delayed_work(&sharpsl_bat, 0);
|
||||
}
|
||||
|
||||
static void sharpsl_charge_error(void)
|
||||
@ -222,7 +222,7 @@ static void sharpsl_charge_error(void)
|
||||
sharpsl_pm.charge_mode = CHRG_ERROR;
|
||||
}
|
||||
|
||||
static void sharpsl_charge_toggle(void *private_)
|
||||
static void sharpsl_charge_toggle(struct work_struct *private_)
|
||||
{
|
||||
dev_dbg(sharpsl_pm.dev, "Toogling Charger at time: %lx\n", jiffies);
|
||||
|
||||
@ -254,7 +254,7 @@ static void sharpsl_ac_timer(unsigned long data)
|
||||
else if (sharpsl_pm.charge_mode == CHRG_ON)
|
||||
sharpsl_charge_off();
|
||||
|
||||
schedule_work(&sharpsl_bat);
|
||||
schedule_delayed_work(&sharpsl_bat, 0);
|
||||
}
|
||||
|
||||
|
||||
@ -279,10 +279,10 @@ static void sharpsl_chrg_full_timer(unsigned long data)
|
||||
sharpsl_charge_off();
|
||||
} else if (sharpsl_pm.full_count < 2) {
|
||||
dev_dbg(sharpsl_pm.dev, "Charge Full: Count too low\n");
|
||||
schedule_work(&toggle_charger);
|
||||
schedule_delayed_work(&toggle_charger, 0);
|
||||
} else if (time_after(jiffies, sharpsl_pm.charge_start_time + SHARPSL_CHARGE_FINISH_TIME)) {
|
||||
dev_dbg(sharpsl_pm.dev, "Charge Full: Interrupt generated too slowly - retry.\n");
|
||||
schedule_work(&toggle_charger);
|
||||
schedule_delayed_work(&toggle_charger, 0);
|
||||
} else {
|
||||
sharpsl_charge_off();
|
||||
sharpsl_pm.charge_mode = CHRG_DONE;
|
||||
|
@ -323,7 +323,8 @@ static int h3_transceiver_mode(struct device *dev, int mode)
|
||||
|
||||
cancel_delayed_work(&irda_config->gpio_expa);
|
||||
PREPARE_WORK(&irda_config->gpio_expa, set_trans_mode, &mode);
|
||||
schedule_work(&irda_config->gpio_expa);
|
||||
#error this is not permitted - mode is an argument variable
|
||||
schedule_delayed_work(&irda_config->gpio_expa, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -74,7 +74,7 @@ static struct omap_kp_platform_data nokia770_kp_data = {
|
||||
.rows = 8,
|
||||
.cols = 8,
|
||||
.keymap = nokia770_keymap,
|
||||
.keymapsize = ARRAY_SIZE(nokia770_keymap)
|
||||
.keymapsize = ARRAY_SIZE(nokia770_keymap),
|
||||
.delay = 4,
|
||||
};
|
||||
|
||||
@ -191,7 +191,7 @@ static void nokia770_audio_pwr_up(void)
|
||||
printk("HP connected\n");
|
||||
}
|
||||
|
||||
static void codec_delayed_power_down(void *arg)
|
||||
static void codec_delayed_power_down(struct work_struct *work)
|
||||
{
|
||||
down(&audio_pwr_sem);
|
||||
if (audio_pwr_state == -1)
|
||||
@ -200,7 +200,7 @@ static void codec_delayed_power_down(void *arg)
|
||||
up(&audio_pwr_sem);
|
||||
}
|
||||
|
||||
static DECLARE_WORK(codec_power_down_work, codec_delayed_power_down, NULL);
|
||||
static DECLARE_DELAYED_WORK(codec_power_down_work, codec_delayed_power_down);
|
||||
|
||||
static void nokia770_audio_pwr_down(void)
|
||||
{
|
||||
|
@ -35,7 +35,7 @@ static u8 hw_led_state;
|
||||
|
||||
static u8 tps_leds_change;
|
||||
|
||||
static void tps_work(void *unused)
|
||||
static void tps_work(struct work_struct *unused)
|
||||
{
|
||||
for (;;) {
|
||||
u8 leds;
|
||||
@ -61,7 +61,7 @@ static void tps_work(void *unused)
|
||||
}
|
||||
}
|
||||
|
||||
static DECLARE_WORK(work, tps_work, NULL);
|
||||
static DECLARE_WORK(work, tps_work);
|
||||
|
||||
#ifdef CONFIG_OMAP_OSK_MISTRAL
|
||||
|
||||
|
@ -206,7 +206,8 @@ static int h4_transceiver_mode(struct device *dev, int mode)
|
||||
|
||||
cancel_delayed_work(&irda_config->gpio_expa);
|
||||
PREPARE_WORK(&irda_config->gpio_expa, set_trans_mode, &mode);
|
||||
schedule_work(&irda_config->gpio_expa);
|
||||
#error this is not permitted - mode is an argument variable
|
||||
schedule_delayed_work(&irda_config->gpio_expa, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -36,11 +36,11 @@ I2C_CLIENT_INSMOD;
|
||||
|
||||
static int max7310_write(struct i2c_client *client, int address, int data);
|
||||
static struct i2c_client max7310_template;
|
||||
static void akita_ioexp_work(void *private_);
|
||||
static void akita_ioexp_work(struct work_struct *private_);
|
||||
|
||||
static struct device *akita_ioexp_device;
|
||||
static unsigned char ioexp_output_value = AKITA_IOEXP_IO_OUT;
|
||||
DECLARE_WORK(akita_ioexp, akita_ioexp_work, NULL);
|
||||
DECLARE_WORK(akita_ioexp, akita_ioexp_work);
|
||||
|
||||
|
||||
/*
|
||||
@ -158,7 +158,7 @@ void akita_reset_ioexp(struct device *dev, unsigned char bit)
|
||||
EXPORT_SYMBOL(akita_set_ioexp);
|
||||
EXPORT_SYMBOL(akita_reset_ioexp);
|
||||
|
||||
static void akita_ioexp_work(void *private_)
|
||||
static void akita_ioexp_work(struct work_struct *private_)
|
||||
{
|
||||
if (akita_ioexp_device)
|
||||
max7310_set_ouputs(akita_ioexp_device, ioexp_output_value);
|
||||
|
@ -51,10 +51,10 @@ static void mce_checkregs (void *info)
|
||||
}
|
||||
}
|
||||
|
||||
static void mce_work_fn(void *data);
|
||||
static DECLARE_WORK(mce_work, mce_work_fn, NULL);
|
||||
static void mce_work_fn(struct work_struct *work);
|
||||
static DECLARE_DELAYED_WORK(mce_work, mce_work_fn);
|
||||
|
||||
static void mce_work_fn(void *data)
|
||||
static void mce_work_fn(struct work_struct *work)
|
||||
{
|
||||
on_each_cpu(mce_checkregs, NULL, 1, 1);
|
||||
schedule_delayed_work(&mce_work, MCE_RATE);
|
||||
|
@ -1049,13 +1049,15 @@ void cpu_exit_clear(void)
|
||||
|
||||
struct warm_boot_cpu_info {
|
||||
struct completion *complete;
|
||||
struct work_struct task;
|
||||
int apicid;
|
||||
int cpu;
|
||||
};
|
||||
|
||||
static void __cpuinit do_warm_boot_cpu(void *p)
|
||||
static void __cpuinit do_warm_boot_cpu(struct work_struct *work)
|
||||
{
|
||||
struct warm_boot_cpu_info *info = p;
|
||||
struct warm_boot_cpu_info *info =
|
||||
container_of(work, struct warm_boot_cpu_info, task);
|
||||
do_boot_cpu(info->apicid, info->cpu);
|
||||
complete(info->complete);
|
||||
}
|
||||
@ -1064,7 +1066,6 @@ static int __cpuinit __smp_prepare_cpu(int cpu)
|
||||
{
|
||||
DECLARE_COMPLETION_ONSTACK(done);
|
||||
struct warm_boot_cpu_info info;
|
||||
struct work_struct task;
|
||||
int apicid, ret;
|
||||
struct Xgt_desc_struct *cpu_gdt_descr = &per_cpu(cpu_gdt_descr, cpu);
|
||||
|
||||
@ -1089,7 +1090,7 @@ static int __cpuinit __smp_prepare_cpu(int cpu)
|
||||
info.complete = &done;
|
||||
info.apicid = apicid;
|
||||
info.cpu = cpu;
|
||||
INIT_WORK(&task, do_warm_boot_cpu, &info);
|
||||
INIT_WORK(&info.task, do_warm_boot_cpu);
|
||||
|
||||
tsc_sync_disabled = 1;
|
||||
|
||||
@ -1097,7 +1098,7 @@ static int __cpuinit __smp_prepare_cpu(int cpu)
|
||||
clone_pgd_range(swapper_pg_dir, swapper_pg_dir + USER_PGD_PTRS,
|
||||
KERNEL_PGD_PTRS);
|
||||
flush_tlb_all();
|
||||
schedule_work(&task);
|
||||
schedule_work(&info.task);
|
||||
wait_for_completion(&done);
|
||||
|
||||
tsc_sync_disabled = 0;
|
||||
|
@ -217,7 +217,7 @@ static unsigned int cpufreq_delayed_issched = 0;
|
||||
static unsigned int cpufreq_init = 0;
|
||||
static struct work_struct cpufreq_delayed_get_work;
|
||||
|
||||
static void handle_cpufreq_delayed_get(void *v)
|
||||
static void handle_cpufreq_delayed_get(struct work_struct *work)
|
||||
{
|
||||
unsigned int cpu;
|
||||
|
||||
@ -306,7 +306,7 @@ static int __init cpufreq_tsc(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
INIT_WORK(&cpufreq_delayed_get_work, handle_cpufreq_delayed_get, NULL);
|
||||
INIT_WORK(&cpufreq_delayed_get_work, handle_cpufreq_delayed_get);
|
||||
ret = cpufreq_register_notifier(&time_cpufreq_notifier_block,
|
||||
CPUFREQ_TRANSITION_NOTIFIER);
|
||||
if (!ret)
|
||||
|
@ -209,7 +209,7 @@ static void do_serial_bh(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
static void do_softint(void *private_)
|
||||
static void do_softint(struct work_struct *private_)
|
||||
{
|
||||
printk(KERN_ERR "simserial: do_softint called\n");
|
||||
}
|
||||
@ -698,7 +698,7 @@ static int get_async_struct(int line, struct async_struct **ret_info)
|
||||
info->flags = sstate->flags;
|
||||
info->xmit_fifo_size = sstate->xmit_fifo_size;
|
||||
info->line = line;
|
||||
INIT_WORK(&info->work, do_softint, info);
|
||||
INIT_WORK(&info->work, do_softint);
|
||||
info->state = sstate;
|
||||
if (sstate->info) {
|
||||
kfree(info);
|
||||
|
@ -678,7 +678,7 @@ ia64_mca_cmc_vector_enable (void *dummy)
|
||||
* disable the cmc interrupt vector.
|
||||
*/
|
||||
static void
|
||||
ia64_mca_cmc_vector_disable_keventd(void *unused)
|
||||
ia64_mca_cmc_vector_disable_keventd(struct work_struct *unused)
|
||||
{
|
||||
on_each_cpu(ia64_mca_cmc_vector_disable, NULL, 1, 0);
|
||||
}
|
||||
@ -690,7 +690,7 @@ ia64_mca_cmc_vector_disable_keventd(void *unused)
|
||||
* enable the cmc interrupt vector.
|
||||
*/
|
||||
static void
|
||||
ia64_mca_cmc_vector_enable_keventd(void *unused)
|
||||
ia64_mca_cmc_vector_enable_keventd(struct work_struct *unused)
|
||||
{
|
||||
on_each_cpu(ia64_mca_cmc_vector_enable, NULL, 1, 0);
|
||||
}
|
||||
@ -1247,8 +1247,8 @@ ia64_mca_handler(struct pt_regs *regs, struct switch_stack *sw,
|
||||
monarch_cpu = -1;
|
||||
}
|
||||
|
||||
static DECLARE_WORK(cmc_disable_work, ia64_mca_cmc_vector_disable_keventd, NULL);
|
||||
static DECLARE_WORK(cmc_enable_work, ia64_mca_cmc_vector_enable_keventd, NULL);
|
||||
static DECLARE_WORK(cmc_disable_work, ia64_mca_cmc_vector_disable_keventd);
|
||||
static DECLARE_WORK(cmc_enable_work, ia64_mca_cmc_vector_enable_keventd);
|
||||
|
||||
/*
|
||||
* ia64_mca_cmc_int_handler
|
||||
|
@ -463,15 +463,17 @@ struct pt_regs * __devinit idle_regs(struct pt_regs *regs)
|
||||
}
|
||||
|
||||
struct create_idle {
|
||||
struct work_struct work;
|
||||
struct task_struct *idle;
|
||||
struct completion done;
|
||||
int cpu;
|
||||
};
|
||||
|
||||
void
|
||||
do_fork_idle(void *_c_idle)
|
||||
do_fork_idle(struct work_struct *work)
|
||||
{
|
||||
struct create_idle *c_idle = _c_idle;
|
||||
struct create_idle *c_idle =
|
||||
container_of(work, struct create_idle, work);
|
||||
|
||||
c_idle->idle = fork_idle(c_idle->cpu);
|
||||
complete(&c_idle->done);
|
||||
@ -482,10 +484,10 @@ do_boot_cpu (int sapicid, int cpu)
|
||||
{
|
||||
int timeout;
|
||||
struct create_idle c_idle = {
|
||||
.work = __WORK_INITIALIZER(c_idle.work, do_fork_idle),
|
||||
.cpu = cpu,
|
||||
.done = COMPLETION_INITIALIZER(c_idle.done),
|
||||
};
|
||||
DECLARE_WORK(work, do_fork_idle, &c_idle);
|
||||
|
||||
c_idle.idle = get_idle_for_cpu(cpu);
|
||||
if (c_idle.idle) {
|
||||
@ -497,9 +499,9 @@ do_boot_cpu (int sapicid, int cpu)
|
||||
* We can't use kernel_thread since we must avoid to reschedule the child.
|
||||
*/
|
||||
if (!keventd_up() || current_is_keventd())
|
||||
work.func(work.data);
|
||||
c_idle.work.func(&c_idle.work);
|
||||
else {
|
||||
schedule_work(&work);
|
||||
schedule_work(&c_idle.work);
|
||||
wait_for_completion(&c_idle.done);
|
||||
}
|
||||
|
||||
|
@ -564,8 +564,8 @@ pcibios_enable_device (struct pci_dev *dev, int mask)
|
||||
void
|
||||
pcibios_disable_device (struct pci_dev *dev)
|
||||
{
|
||||
if (dev->is_enabled)
|
||||
acpi_pci_irq_disable(dev);
|
||||
BUG_ON(atomic_read(&dev->enable_cnt));
|
||||
acpi_pci_irq_disable(dev);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -3,7 +3,7 @@
|
||||
/*
|
||||
* timers.c -- generic ColdFire hardware timer support.
|
||||
*
|
||||
* Copyright (C) 1999-2003, Greg Ungerer (gerg@snapgear.com)
|
||||
* Copyright (C) 1999-2006, Greg Ungerer (gerg@snapgear.com)
|
||||
*/
|
||||
|
||||
/***************************************************************************/
|
||||
@ -44,6 +44,14 @@ unsigned int mcf_timerlevel = 5;
|
||||
extern void mcf_settimericr(int timer, int level);
|
||||
extern int mcf_timerirqpending(int timer);
|
||||
|
||||
#if defined(CONFIG_M532x)
|
||||
#define __raw_readtrr __raw_readl
|
||||
#define __raw_writetrr __raw_writel
|
||||
#else
|
||||
#define __raw_readtrr __raw_readw
|
||||
#define __raw_writetrr __raw_writew
|
||||
#endif
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
void coldfire_tick(void)
|
||||
@ -57,7 +65,7 @@ void coldfire_tick(void)
|
||||
void coldfire_timer_init(irqreturn_t (*handler)(int, void *, struct pt_regs *))
|
||||
{
|
||||
__raw_writew(MCFTIMER_TMR_DISABLE, TA(MCFTIMER_TMR));
|
||||
__raw_writew(((MCF_BUSCLK / 16) / HZ), TA(MCFTIMER_TRR));
|
||||
__raw_writetrr(((MCF_BUSCLK / 16) / HZ), TA(MCFTIMER_TRR));
|
||||
__raw_writew(MCFTIMER_TMR_ENORI | MCFTIMER_TMR_CLK16 |
|
||||
MCFTIMER_TMR_RESTART | MCFTIMER_TMR_ENABLE, TA(MCFTIMER_TMR));
|
||||
|
||||
@ -76,7 +84,7 @@ unsigned long coldfire_timer_offset(void)
|
||||
unsigned long trr, tcn, offset;
|
||||
|
||||
tcn = __raw_readw(TA(MCFTIMER_TCN));
|
||||
trr = __raw_readw(TA(MCFTIMER_TRR));
|
||||
trr = __raw_readtrr(TA(MCFTIMER_TRR));
|
||||
offset = (tcn * (1000000 / HZ)) / trr;
|
||||
|
||||
/* Check if we just wrapped the counters and maybe missed a tick */
|
||||
@ -120,7 +128,7 @@ void coldfire_profile_init(void)
|
||||
/* Set up TIMER 2 as high speed profile clock */
|
||||
__raw_writew(MCFTIMER_TMR_DISABLE, PA(MCFTIMER_TMR));
|
||||
|
||||
__raw_writew(((MCF_CLK / 16) / PROFILEHZ), PA(MCFTIMER_TRR));
|
||||
__raw_writetrr(((MCF_CLK / 16) / PROFILEHZ), PA(MCFTIMER_TRR));
|
||||
__raw_writew(MCFTIMER_TMR_ENORI | MCFTIMER_TMR_CLK16 |
|
||||
MCFTIMER_TMR_RESTART | MCFTIMER_TMR_ENABLE, PA(MCFTIMER_TMR));
|
||||
|
||||
|
@ -114,7 +114,7 @@ void BSP_gettod (int *yearp, int *monp, int *dayp,
|
||||
{
|
||||
}
|
||||
|
||||
int BSP_hwclk(int op, struct hwclk_time *t)
|
||||
int BSP_hwclk(int op, struct rtc_time *t)
|
||||
{
|
||||
if (!op) {
|
||||
/* read */
|
||||
|
@ -16,6 +16,7 @@ config MIPS_MTX1
|
||||
bool "4G Systems MTX-1 board"
|
||||
select DMA_NONCOHERENT
|
||||
select HW_HAS_PCI
|
||||
select RESOURCES_64BIT if PCI
|
||||
select SOC_AU1500
|
||||
select SYS_HAS_CPU_MIPS32_R1
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
@ -32,6 +33,7 @@ config MIPS_PB1000
|
||||
select SOC_AU1000
|
||||
select DMA_NONCOHERENT
|
||||
select HW_HAS_PCI
|
||||
select RESOURCES_64BIT if PCI
|
||||
select SWAP_IO_SPACE
|
||||
select SYS_HAS_CPU_MIPS32_R1
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
@ -41,6 +43,7 @@ config MIPS_PB1100
|
||||
select SOC_AU1100
|
||||
select DMA_NONCOHERENT
|
||||
select HW_HAS_PCI
|
||||
select RESOURCES_64BIT if PCI
|
||||
select SWAP_IO_SPACE
|
||||
select SYS_HAS_CPU_MIPS32_R1
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
@ -50,6 +53,7 @@ config MIPS_PB1500
|
||||
select SOC_AU1500
|
||||
select DMA_NONCOHERENT
|
||||
select HW_HAS_PCI
|
||||
select RESOURCES_64BIT if PCI
|
||||
select SYS_HAS_CPU_MIPS32_R1
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
|
||||
@ -59,6 +63,7 @@ config MIPS_PB1550
|
||||
select DMA_NONCOHERENT
|
||||
select HW_HAS_PCI
|
||||
select MIPS_DISABLE_OBSOLETE_IDE
|
||||
select RESOURCES_64BIT if PCI
|
||||
select SYS_HAS_CPU_MIPS32_R1
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
|
||||
@ -67,6 +72,7 @@ config MIPS_PB1200
|
||||
select SOC_AU1200
|
||||
select DMA_NONCOHERENT
|
||||
select MIPS_DISABLE_OBSOLETE_IDE
|
||||
select RESOURCES_64BIT if PCI
|
||||
select SYS_HAS_CPU_MIPS32_R1
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
|
||||
@ -75,6 +81,7 @@ config MIPS_DB1000
|
||||
select SOC_AU1000
|
||||
select DMA_NONCOHERENT
|
||||
select HW_HAS_PCI
|
||||
select RESOURCES_64BIT if PCI
|
||||
select SYS_HAS_CPU_MIPS32_R1
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
|
||||
@ -91,6 +98,7 @@ config MIPS_DB1500
|
||||
select DMA_NONCOHERENT
|
||||
select HW_HAS_PCI
|
||||
select MIPS_DISABLE_OBSOLETE_IDE
|
||||
select RESOURCES_64BIT if PCI
|
||||
select SYS_HAS_CPU_MIPS32_R1
|
||||
select SYS_SUPPORTS_BIG_ENDIAN
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
@ -101,6 +109,7 @@ config MIPS_DB1550
|
||||
select HW_HAS_PCI
|
||||
select DMA_NONCOHERENT
|
||||
select MIPS_DISABLE_OBSOLETE_IDE
|
||||
select RESOURCES_64BIT if PCI
|
||||
select SYS_HAS_CPU_MIPS32_R1
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
|
||||
@ -233,6 +242,7 @@ config LASAT
|
||||
select SYS_SUPPORTS_32BIT_KERNEL
|
||||
select SYS_SUPPORTS_64BIT_KERNEL if EXPERIMENTAL
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
select GENERIC_HARDIRQS_NO__DO_IRQ
|
||||
|
||||
config MIPS_ATLAS
|
||||
bool "MIPS Atlas board"
|
||||
@ -256,6 +266,7 @@ config MIPS_ATLAS
|
||||
select SYS_SUPPORTS_BIG_ENDIAN
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
select SYS_SUPPORTS_MULTITHREADING if EXPERIMENTAL
|
||||
select GENERIC_HARDIRQS_NO__DO_IRQ
|
||||
help
|
||||
This enables support for the MIPS Technologies Atlas evaluation
|
||||
board.
|
||||
@ -410,6 +421,7 @@ config MOMENCO_OCELOT_C
|
||||
select SYS_SUPPORTS_32BIT_KERNEL
|
||||
select SYS_SUPPORTS_64BIT_KERNEL
|
||||
select SYS_SUPPORTS_BIG_ENDIAN
|
||||
select GENERIC_HARDIRQS_NO__DO_IRQ
|
||||
help
|
||||
The Ocelot is a MIPS-based Single Board Computer (SBC) made by
|
||||
Momentum Computer <http://www.momenco.com/>.
|
||||
@ -560,6 +572,7 @@ config SGI_IP27
|
||||
select SYS_SUPPORTS_BIG_ENDIAN
|
||||
select SYS_SUPPORTS_NUMA
|
||||
select SYS_SUPPORTS_SMP
|
||||
select GENERIC_HARDIRQS_NO__DO_IRQ
|
||||
help
|
||||
This are the SGI Origin 200, Origin 2000 and Onyx 2 Graphics
|
||||
workstations. To compile a Linux kernel that runs on these, say Y
|
||||
@ -826,6 +839,10 @@ config SCHED_NO_NO_OMIT_FRAME_POINTER
|
||||
bool
|
||||
default y
|
||||
|
||||
config GENERIC_HARDIRQS_NO__DO_IRQ
|
||||
bool
|
||||
default n
|
||||
|
||||
#
|
||||
# Select some configuration options automatically based on user selections.
|
||||
#
|
||||
@ -987,6 +1004,7 @@ config SOC_PNX8550
|
||||
select HW_HAS_PCI
|
||||
select SYS_HAS_CPU_MIPS32_R1
|
||||
select SYS_SUPPORTS_32BIT_KERNEL
|
||||
select GENERIC_HARDIRQS_NO__DO_IRQ
|
||||
|
||||
config SWAP_IO_SPACE
|
||||
bool
|
||||
@ -1268,6 +1286,7 @@ config CPU_RM9000
|
||||
select CPU_SUPPORTS_32BIT_KERNEL
|
||||
select CPU_SUPPORTS_64BIT_KERNEL
|
||||
select CPU_SUPPORTS_HIGHMEM
|
||||
select WEAK_ORDERING
|
||||
|
||||
config CPU_SB1
|
||||
bool "SB1"
|
||||
@ -1276,6 +1295,7 @@ config CPU_SB1
|
||||
select CPU_SUPPORTS_32BIT_KERNEL
|
||||
select CPU_SUPPORTS_64BIT_KERNEL
|
||||
select CPU_SUPPORTS_HIGHMEM
|
||||
select WEAK_ORDERING
|
||||
|
||||
endchoice
|
||||
|
||||
@ -1336,6 +1356,8 @@ config SYS_HAS_CPU_RM9000
|
||||
config SYS_HAS_CPU_SB1
|
||||
bool
|
||||
|
||||
config WEAK_ORDERING
|
||||
bool
|
||||
endmenu
|
||||
|
||||
#
|
||||
@ -1940,6 +1962,11 @@ config COMPAT
|
||||
depends on MIPS32_COMPAT
|
||||
default y
|
||||
|
||||
config SYSVIPC_COMPAT
|
||||
bool
|
||||
depends on COMPAT && SYSVIPC
|
||||
default y
|
||||
|
||||
config MIPS32_O32
|
||||
bool "Kernel support for o32 binaries"
|
||||
depends on MIPS32_COMPAT
|
||||
|
@ -25,6 +25,7 @@
|
||||
#include <asm/cpu.h>
|
||||
#include <asm/irq_regs.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/traps.h>
|
||||
|
||||
|
@ -67,7 +67,6 @@ static struct irq_chip ioasic_irq_type = {
|
||||
.mask = mask_ioasic_irq,
|
||||
.mask_ack = ack_ioasic_irq,
|
||||
.unmask = unmask_ioasic_irq,
|
||||
.end = end_ioasic_irq,
|
||||
};
|
||||
|
||||
|
||||
@ -106,8 +105,7 @@ void __init init_ioasic_irqs(int base)
|
||||
set_irq_chip_and_handler(i, &ioasic_irq_type,
|
||||
handle_level_irq);
|
||||
for (; i < base + IO_IRQ_LINES; i++)
|
||||
set_irq_chip_and_handler(i, &ioasic_dma_irq_type,
|
||||
handle_level_irq);
|
||||
set_irq_chip(i, &ioasic_dma_irq_type);
|
||||
|
||||
ioasic_irq_base = base;
|
||||
}
|
||||
|
@ -20,8 +20,10 @@
|
||||
#include <linux/types.h>
|
||||
|
||||
#include <asm/inst.h>
|
||||
#include <asm/irq_regs.h>
|
||||
#include <asm/mipsregs.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/traps.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
@ -57,19 +57,12 @@ static void ack_kn02_irq(unsigned int irq)
|
||||
iob();
|
||||
}
|
||||
|
||||
static void end_kn02_irq(unsigned int irq)
|
||||
{
|
||||
if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS)))
|
||||
unmask_kn02_irq(irq);
|
||||
}
|
||||
|
||||
static struct irq_chip kn02_irq_type = {
|
||||
.typename = "KN02-CSR",
|
||||
.ack = ack_kn02_irq,
|
||||
.mask = mask_kn02_irq,
|
||||
.mask_ack = ack_kn02_irq,
|
||||
.unmask = unmask_kn02_irq,
|
||||
.end = end_kn02_irq,
|
||||
};
|
||||
|
||||
|
||||
|
@ -56,19 +56,12 @@ static void emma2rh_irq_disable(unsigned int irq)
|
||||
ll_emma2rh_irq_disable(irq - emma2rh_irq_base);
|
||||
}
|
||||
|
||||
static void emma2rh_irq_end(unsigned int irq)
|
||||
{
|
||||
if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS)))
|
||||
ll_emma2rh_irq_enable(irq - emma2rh_irq_base);
|
||||
}
|
||||
|
||||
struct irq_chip emma2rh_irq_controller = {
|
||||
.typename = "emma2rh_irq",
|
||||
.ack = emma2rh_irq_disable,
|
||||
.mask = emma2rh_irq_disable,
|
||||
.mask_ack = emma2rh_irq_disable,
|
||||
.unmask = emma2rh_irq_enable,
|
||||
.end = emma2rh_irq_end,
|
||||
};
|
||||
|
||||
void emma2rh_irq_init(u32 irq_base)
|
||||
|
@ -48,19 +48,12 @@ static void emma2rh_sw_irq_disable(unsigned int irq)
|
||||
ll_emma2rh_sw_irq_disable(irq - emma2rh_sw_irq_base);
|
||||
}
|
||||
|
||||
static void emma2rh_sw_irq_end(unsigned int irq)
|
||||
{
|
||||
if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS)))
|
||||
ll_emma2rh_sw_irq_enable(irq - emma2rh_sw_irq_base);
|
||||
}
|
||||
|
||||
struct irq_chip emma2rh_sw_irq_controller = {
|
||||
.typename = "emma2rh_sw_irq",
|
||||
.ack = emma2rh_sw_irq_disable,
|
||||
.mask = emma2rh_sw_irq_disable,
|
||||
.mask_ack = emma2rh_sw_irq_disable,
|
||||
.unmask = emma2rh_sw_irq_enable,
|
||||
.end = emma2rh_sw_irq_end,
|
||||
};
|
||||
|
||||
void emma2rh_sw_irq_init(u32 irq_base)
|
||||
|
@ -39,19 +39,12 @@ void disable_r4030_irq(unsigned int irq)
|
||||
spin_unlock_irqrestore(&r4030_lock, flags);
|
||||
}
|
||||
|
||||
static void end_r4030_irq(unsigned int irq)
|
||||
{
|
||||
if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
|
||||
enable_r4030_irq(irq);
|
||||
}
|
||||
|
||||
static struct irq_chip r4030_irq_type = {
|
||||
.typename = "R4030",
|
||||
.ack = disable_r4030_irq,
|
||||
.mask = disable_r4030_irq,
|
||||
.mask_ack = disable_r4030_irq,
|
||||
.unmask = enable_r4030_irq,
|
||||
.end = end_r4030_irq,
|
||||
};
|
||||
|
||||
void __init init_r4030_ints(void)
|
||||
|
@ -19,9 +19,6 @@
|
||||
#include <asm/i8259.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
void enable_8259A_irq(unsigned int irq);
|
||||
void disable_8259A_irq(unsigned int irq);
|
||||
|
||||
/*
|
||||
* This is the 'legacy' 8259A Programmable Interrupt Controller,
|
||||
* present in the majority of PC/AT boxes.
|
||||
@ -31,23 +28,16 @@ void disable_8259A_irq(unsigned int irq);
|
||||
* moves to arch independent land
|
||||
*/
|
||||
|
||||
static int i8259A_auto_eoi;
|
||||
DEFINE_SPINLOCK(i8259A_lock);
|
||||
|
||||
static void end_8259A_irq (unsigned int irq)
|
||||
{
|
||||
if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)) &&
|
||||
irq_desc[irq].action)
|
||||
enable_8259A_irq(irq);
|
||||
}
|
||||
|
||||
/* some platforms call this... */
|
||||
void mask_and_ack_8259A(unsigned int);
|
||||
|
||||
static struct irq_chip i8259A_irq_type = {
|
||||
.typename = "XT-PIC",
|
||||
.enable = enable_8259A_irq,
|
||||
.disable = disable_8259A_irq,
|
||||
.ack = mask_and_ack_8259A,
|
||||
.end = end_8259A_irq,
|
||||
static struct irq_chip i8259A_chip = {
|
||||
.name = "XT-PIC",
|
||||
.mask = disable_8259A_irq,
|
||||
.unmask = enable_8259A_irq,
|
||||
.mask_ack = mask_and_ack_8259A,
|
||||
};
|
||||
|
||||
/*
|
||||
@ -59,8 +49,8 @@ static struct irq_chip i8259A_irq_type = {
|
||||
*/
|
||||
static unsigned int cached_irq_mask = 0xffff;
|
||||
|
||||
#define cached_21 (cached_irq_mask)
|
||||
#define cached_A1 (cached_irq_mask >> 8)
|
||||
#define cached_master_mask (cached_irq_mask)
|
||||
#define cached_slave_mask (cached_irq_mask >> 8)
|
||||
|
||||
void disable_8259A_irq(unsigned int irq)
|
||||
{
|
||||
@ -70,9 +60,9 @@ void disable_8259A_irq(unsigned int irq)
|
||||
spin_lock_irqsave(&i8259A_lock, flags);
|
||||
cached_irq_mask |= mask;
|
||||
if (irq & 8)
|
||||
outb(cached_A1,0xA1);
|
||||
outb(cached_slave_mask, PIC_SLAVE_IMR);
|
||||
else
|
||||
outb(cached_21,0x21);
|
||||
outb(cached_master_mask, PIC_MASTER_IMR);
|
||||
spin_unlock_irqrestore(&i8259A_lock, flags);
|
||||
}
|
||||
|
||||
@ -84,9 +74,9 @@ void enable_8259A_irq(unsigned int irq)
|
||||
spin_lock_irqsave(&i8259A_lock, flags);
|
||||
cached_irq_mask &= mask;
|
||||
if (irq & 8)
|
||||
outb(cached_A1,0xA1);
|
||||
outb(cached_slave_mask, PIC_SLAVE_IMR);
|
||||
else
|
||||
outb(cached_21,0x21);
|
||||
outb(cached_master_mask, PIC_MASTER_IMR);
|
||||
spin_unlock_irqrestore(&i8259A_lock, flags);
|
||||
}
|
||||
|
||||
@ -98,9 +88,9 @@ int i8259A_irq_pending(unsigned int irq)
|
||||
|
||||
spin_lock_irqsave(&i8259A_lock, flags);
|
||||
if (irq < 8)
|
||||
ret = inb(0x20) & mask;
|
||||
ret = inb(PIC_MASTER_CMD) & mask;
|
||||
else
|
||||
ret = inb(0xA0) & (mask >> 8);
|
||||
ret = inb(PIC_SLAVE_CMD) & (mask >> 8);
|
||||
spin_unlock_irqrestore(&i8259A_lock, flags);
|
||||
|
||||
return ret;
|
||||
@ -109,7 +99,7 @@ int i8259A_irq_pending(unsigned int irq)
|
||||
void make_8259A_irq(unsigned int irq)
|
||||
{
|
||||
disable_irq_nosync(irq);
|
||||
set_irq_chip(irq, &i8259A_irq_type);
|
||||
set_irq_chip_and_handler(irq, &i8259A_chip, handle_level_irq);
|
||||
enable_irq(irq);
|
||||
}
|
||||
|
||||
@ -125,14 +115,14 @@ static inline int i8259A_irq_real(unsigned int irq)
|
||||
int irqmask = 1 << irq;
|
||||
|
||||
if (irq < 8) {
|
||||
outb(0x0B,0x20); /* ISR register */
|
||||
value = inb(0x20) & irqmask;
|
||||
outb(0x0A,0x20); /* back to the IRR register */
|
||||
outb(0x0B,PIC_MASTER_CMD); /* ISR register */
|
||||
value = inb(PIC_MASTER_CMD) & irqmask;
|
||||
outb(0x0A,PIC_MASTER_CMD); /* back to the IRR register */
|
||||
return value;
|
||||
}
|
||||
outb(0x0B,0xA0); /* ISR register */
|
||||
value = inb(0xA0) & (irqmask >> 8);
|
||||
outb(0x0A,0xA0); /* back to the IRR register */
|
||||
outb(0x0B,PIC_SLAVE_CMD); /* ISR register */
|
||||
value = inb(PIC_SLAVE_CMD) & (irqmask >> 8);
|
||||
outb(0x0A,PIC_SLAVE_CMD); /* back to the IRR register */
|
||||
return value;
|
||||
}
|
||||
|
||||
@ -149,17 +139,19 @@ void mask_and_ack_8259A(unsigned int irq)
|
||||
|
||||
spin_lock_irqsave(&i8259A_lock, flags);
|
||||
/*
|
||||
* Lightweight spurious IRQ detection. We do not want to overdo
|
||||
* spurious IRQ handling - it's usually a sign of hardware problems, so
|
||||
* we only do the checks we can do without slowing down good hardware
|
||||
* nnecesserily.
|
||||
* Lightweight spurious IRQ detection. We do not want
|
||||
* to overdo spurious IRQ handling - it's usually a sign
|
||||
* of hardware problems, so we only do the checks we can
|
||||
* do without slowing down good hardware unnecessarily.
|
||||
*
|
||||
* Note that IRQ7 and IRQ15 (the two spurious IRQs usually resulting
|
||||
* rom the 8259A-1|2 PICs) occur even if the IRQ is masked in the 8259A.
|
||||
* Thus we can check spurious 8259A IRQs without doing the quite slow
|
||||
* i8259A_irq_real() call for every IRQ. This does not cover 100% of
|
||||
* spurious interrupts, but should be enough to warn the user that
|
||||
* there is something bad going on ...
|
||||
* Note that IRQ7 and IRQ15 (the two spurious IRQs
|
||||
* usually resulting from the 8259A-1|2 PICs) occur
|
||||
* even if the IRQ is masked in the 8259A. Thus we
|
||||
* can check spurious 8259A IRQs without doing the
|
||||
* quite slow i8259A_irq_real() call for every IRQ.
|
||||
* This does not cover 100% of spurious interrupts,
|
||||
* but should be enough to warn the user that there
|
||||
* is something bad going on ...
|
||||
*/
|
||||
if (cached_irq_mask & irqmask)
|
||||
goto spurious_8259A_irq;
|
||||
@ -167,14 +159,14 @@ void mask_and_ack_8259A(unsigned int irq)
|
||||
|
||||
handle_real_irq:
|
||||
if (irq & 8) {
|
||||
inb(0xA1); /* DUMMY - (do we need this?) */
|
||||
outb(cached_A1,0xA1);
|
||||
outb(0x60+(irq&7),0xA0);/* 'Specific EOI' to slave */
|
||||
outb(0x62,0x20); /* 'Specific EOI' to master-IRQ2 */
|
||||
inb(PIC_SLAVE_IMR); /* DUMMY - (do we need this?) */
|
||||
outb(cached_slave_mask, PIC_SLAVE_IMR);
|
||||
outb(0x60+(irq&7),PIC_SLAVE_CMD);/* 'Specific EOI' to slave */
|
||||
outb(0x60+PIC_CASCADE_IR,PIC_MASTER_CMD); /* 'Specific EOI' to master-IRQ2 */
|
||||
} else {
|
||||
inb(0x21); /* DUMMY - (do we need this?) */
|
||||
outb(cached_21,0x21);
|
||||
outb(0x60+irq,0x20); /* 'Specific EOI' to master */
|
||||
inb(PIC_MASTER_IMR); /* DUMMY - (do we need this?) */
|
||||
outb(cached_master_mask, PIC_MASTER_IMR);
|
||||
outb(0x60+irq,PIC_MASTER_CMD); /* 'Specific EOI to master */
|
||||
}
|
||||
#ifdef CONFIG_MIPS_MT_SMTC
|
||||
if (irq_hwmask[irq] & ST0_IM)
|
||||
@ -195,7 +187,7 @@ spurious_8259A_irq:
|
||||
goto handle_real_irq;
|
||||
|
||||
{
|
||||
static int spurious_irq_mask = 0;
|
||||
static int spurious_irq_mask;
|
||||
/*
|
||||
* At this point we can be sure the IRQ is spurious,
|
||||
* lets ACK and report it. [once per IRQ]
|
||||
@ -216,13 +208,25 @@ spurious_8259A_irq:
|
||||
|
||||
static int i8259A_resume(struct sys_device *dev)
|
||||
{
|
||||
init_8259A(0);
|
||||
init_8259A(i8259A_auto_eoi);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int i8259A_shutdown(struct sys_device *dev)
|
||||
{
|
||||
/* Put the i8259A into a quiescent state that
|
||||
* the kernel initialization code can get it
|
||||
* out of.
|
||||
*/
|
||||
outb(0xff, PIC_MASTER_IMR); /* mask all of 8259A-1 */
|
||||
outb(0xff, PIC_SLAVE_IMR); /* mask all of 8259A-1 */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct sysdev_class i8259_sysdev_class = {
|
||||
set_kset_name("i8259"),
|
||||
.resume = i8259A_resume,
|
||||
.shutdown = i8259A_shutdown,
|
||||
};
|
||||
|
||||
static struct sys_device device_i8259A = {
|
||||
@ -244,41 +248,41 @@ void __init init_8259A(int auto_eoi)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
i8259A_auto_eoi = auto_eoi;
|
||||
|
||||
spin_lock_irqsave(&i8259A_lock, flags);
|
||||
|
||||
outb(0xff, 0x21); /* mask all of 8259A-1 */
|
||||
outb(0xff, 0xA1); /* mask all of 8259A-2 */
|
||||
outb(0xff, PIC_MASTER_IMR); /* mask all of 8259A-1 */
|
||||
outb(0xff, PIC_SLAVE_IMR); /* mask all of 8259A-2 */
|
||||
|
||||
/*
|
||||
* outb_p - this has to work on a wide range of PC hardware.
|
||||
*/
|
||||
outb_p(0x11, 0x20); /* ICW1: select 8259A-1 init */
|
||||
outb_p(0x00, 0x21); /* ICW2: 8259A-1 IR0-7 mapped to 0x00-0x07 */
|
||||
outb_p(0x04, 0x21); /* 8259A-1 (the master) has a slave on IR2 */
|
||||
if (auto_eoi)
|
||||
outb_p(0x03, 0x21); /* master does Auto EOI */
|
||||
else
|
||||
outb_p(0x01, 0x21); /* master expects normal EOI */
|
||||
|
||||
outb_p(0x11, 0xA0); /* ICW1: select 8259A-2 init */
|
||||
outb_p(0x08, 0xA1); /* ICW2: 8259A-2 IR0-7 mapped to 0x08-0x0f */
|
||||
outb_p(0x02, 0xA1); /* 8259A-2 is a slave on master's IR2 */
|
||||
outb_p(0x01, 0xA1); /* (slave's support for AEOI in flat mode
|
||||
is to be investigated) */
|
||||
outb_p(0x11, PIC_MASTER_CMD); /* ICW1: select 8259A-1 init */
|
||||
outb_p(I8259A_IRQ_BASE + 0, PIC_MASTER_IMR); /* ICW2: 8259A-1 IR0 mapped to I8259A_IRQ_BASE + 0x00 */
|
||||
outb_p(1U << PIC_CASCADE_IR, PIC_MASTER_IMR); /* 8259A-1 (the master) has a slave on IR2 */
|
||||
if (auto_eoi) /* master does Auto EOI */
|
||||
outb_p(MASTER_ICW4_DEFAULT | PIC_ICW4_AEOI, PIC_MASTER_IMR);
|
||||
else /* master expects normal EOI */
|
||||
outb_p(MASTER_ICW4_DEFAULT, PIC_MASTER_IMR);
|
||||
|
||||
outb_p(0x11, PIC_SLAVE_CMD); /* ICW1: select 8259A-2 init */
|
||||
outb_p(I8259A_IRQ_BASE + 8, PIC_SLAVE_IMR); /* ICW2: 8259A-2 IR0 mapped to I8259A_IRQ_BASE + 0x08 */
|
||||
outb_p(PIC_CASCADE_IR, PIC_SLAVE_IMR); /* 8259A-2 is a slave on master's IR2 */
|
||||
outb_p(SLAVE_ICW4_DEFAULT, PIC_SLAVE_IMR); /* (slave's support for AEOI in flat mode is to be investigated) */
|
||||
if (auto_eoi)
|
||||
/*
|
||||
* in AEOI mode we just have to mask the interrupt
|
||||
* In AEOI mode we just have to mask the interrupt
|
||||
* when acking.
|
||||
*/
|
||||
i8259A_irq_type.ack = disable_8259A_irq;
|
||||
i8259A_chip.mask_ack = disable_8259A_irq;
|
||||
else
|
||||
i8259A_irq_type.ack = mask_and_ack_8259A;
|
||||
i8259A_chip.mask_ack = mask_and_ack_8259A;
|
||||
|
||||
udelay(100); /* wait for 8259A to initialize */
|
||||
|
||||
outb(cached_21, 0x21); /* restore master IRQ mask */
|
||||
outb(cached_A1, 0xA1); /* restore slave IRQ mask */
|
||||
outb(cached_master_mask, PIC_MASTER_IMR); /* restore master IRQ mask */
|
||||
outb(cached_slave_mask, PIC_SLAVE_IMR); /* restore slave IRQ mask */
|
||||
|
||||
spin_unlock_irqrestore(&i8259A_lock, flags);
|
||||
}
|
||||
@ -291,11 +295,17 @@ static struct irqaction irq2 = {
|
||||
};
|
||||
|
||||
static struct resource pic1_io_resource = {
|
||||
.name = "pic1", .start = 0x20, .end = 0x21, .flags = IORESOURCE_BUSY
|
||||
.name = "pic1",
|
||||
.start = PIC_MASTER_CMD,
|
||||
.end = PIC_MASTER_IMR,
|
||||
.flags = IORESOURCE_BUSY
|
||||
};
|
||||
|
||||
static struct resource pic2_io_resource = {
|
||||
.name = "pic2", .start = 0xa0, .end = 0xa1, .flags = IORESOURCE_BUSY
|
||||
.name = "pic2",
|
||||
.start = PIC_SLAVE_CMD,
|
||||
.end = PIC_SLAVE_IMR,
|
||||
.flags = IORESOURCE_BUSY
|
||||
};
|
||||
|
||||
/*
|
||||
@ -313,7 +323,7 @@ void __init init_i8259_irqs (void)
|
||||
init_8259A(0);
|
||||
|
||||
for (i = 0; i < 16; i++)
|
||||
set_irq_chip(i, &i8259A_irq_type);
|
||||
set_irq_chip_and_handler(i, &i8259A_chip, handle_level_irq);
|
||||
|
||||
setup_irq(2, &irq2);
|
||||
setup_irq(PIC_CASCADE_IR, &irq2);
|
||||
}
|
||||
|
@ -66,15 +66,6 @@ static inline void unmask_mv64340_irq(unsigned int irq)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* End IRQ processing
|
||||
*/
|
||||
static void end_mv64340_irq(unsigned int irq)
|
||||
{
|
||||
if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
|
||||
unmask_mv64340_irq(irq);
|
||||
}
|
||||
|
||||
/*
|
||||
* Interrupt handler for interrupts coming from the Marvell chip.
|
||||
* It could be built in ethernet ports etc...
|
||||
@ -106,7 +97,6 @@ struct irq_chip mv64340_irq_type = {
|
||||
.mask = mask_mv64340_irq,
|
||||
.mask_ack = mask_mv64340_irq,
|
||||
.unmask = unmask_mv64340_irq,
|
||||
.end = end_mv64340_irq,
|
||||
};
|
||||
|
||||
void __init mv64340_irq_init(unsigned int base)
|
||||
|
@ -29,19 +29,12 @@ static inline void mask_rm7k_irq(unsigned int irq)
|
||||
clear_c0_intcontrol(0x100 << (irq - irq_base));
|
||||
}
|
||||
|
||||
static void rm7k_cpu_irq_end(unsigned int irq)
|
||||
{
|
||||
if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS)))
|
||||
unmask_rm7k_irq(irq);
|
||||
}
|
||||
|
||||
static struct irq_chip rm7k_irq_controller = {
|
||||
.typename = "RM7000",
|
||||
.ack = mask_rm7k_irq,
|
||||
.mask = mask_rm7k_irq,
|
||||
.mask_ack = mask_rm7k_irq,
|
||||
.unmask = unmask_rm7k_irq,
|
||||
.end = rm7k_cpu_irq_end,
|
||||
};
|
||||
|
||||
void __init rm7k_cpu_irq_init(int base)
|
||||
|
@ -80,19 +80,12 @@ static void rm9k_perfcounter_irq_shutdown(unsigned int irq)
|
||||
on_each_cpu(local_rm9k_perfcounter_irq_shutdown, (void *) irq, 0, 1);
|
||||
}
|
||||
|
||||
static void rm9k_cpu_irq_end(unsigned int irq)
|
||||
{
|
||||
if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS)))
|
||||
unmask_rm9k_irq(irq);
|
||||
}
|
||||
|
||||
static struct irq_chip rm9k_irq_controller = {
|
||||
.typename = "RM9000",
|
||||
.ack = mask_rm9k_irq,
|
||||
.mask = mask_rm9k_irq,
|
||||
.mask_ack = mask_rm9k_irq,
|
||||
.unmask = unmask_rm9k_irq,
|
||||
.end = rm9k_cpu_irq_end,
|
||||
};
|
||||
|
||||
static struct irq_chip rm9k_perfcounter_irq = {
|
||||
@ -103,7 +96,6 @@ static struct irq_chip rm9k_perfcounter_irq = {
|
||||
.mask = mask_rm9k_irq,
|
||||
.mask_ack = mask_rm9k_irq,
|
||||
.unmask = unmask_rm9k_irq,
|
||||
.end = rm9k_cpu_irq_end,
|
||||
};
|
||||
|
||||
unsigned int rm9000_perfcount_irq;
|
||||
|
@ -117,7 +117,7 @@ int show_interrupts(struct seq_file *p, void *v)
|
||||
for_each_online_cpu(j)
|
||||
seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
|
||||
#endif
|
||||
seq_printf(p, " %14s", irq_desc[i].chip->typename);
|
||||
seq_printf(p, " %14s", irq_desc[i].chip->name);
|
||||
seq_printf(p, " %s", action->name);
|
||||
|
||||
for (action=action->next; action; action = action->next)
|
||||
|
@ -50,12 +50,6 @@ static inline void mask_mips_irq(unsigned int irq)
|
||||
irq_disable_hazard();
|
||||
}
|
||||
|
||||
static void mips_cpu_irq_end(unsigned int irq)
|
||||
{
|
||||
if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS)))
|
||||
unmask_mips_irq(irq);
|
||||
}
|
||||
|
||||
static struct irq_chip mips_cpu_irq_controller = {
|
||||
.typename = "MIPS",
|
||||
.ack = mask_mips_irq,
|
||||
@ -63,7 +57,6 @@ static struct irq_chip mips_cpu_irq_controller = {
|
||||
.mask_ack = mask_mips_irq,
|
||||
.unmask = unmask_mips_irq,
|
||||
.eoi = unmask_mips_irq,
|
||||
.end = mips_cpu_irq_end,
|
||||
};
|
||||
|
||||
/*
|
||||
@ -96,8 +89,6 @@ static void mips_mt_cpu_irq_ack(unsigned int irq)
|
||||
mask_mips_mt_irq(irq);
|
||||
}
|
||||
|
||||
#define mips_mt_cpu_irq_end mips_cpu_irq_end
|
||||
|
||||
static struct irq_chip mips_mt_cpu_irq_controller = {
|
||||
.typename = "MIPS",
|
||||
.startup = mips_mt_cpu_irq_startup,
|
||||
@ -106,7 +97,6 @@ static struct irq_chip mips_mt_cpu_irq_controller = {
|
||||
.mask_ack = mips_mt_cpu_irq_ack,
|
||||
.unmask = unmask_mips_mt_irq,
|
||||
.eoi = unmask_mips_mt_irq,
|
||||
.end = mips_mt_cpu_irq_end,
|
||||
};
|
||||
|
||||
void __init mips_cpu_irq_init(int irq_base)
|
||||
|
@ -319,7 +319,7 @@ static void sp_cleanup(void)
|
||||
static int channel_open = 0;
|
||||
|
||||
/* the work handler */
|
||||
static void sp_work(void *data)
|
||||
static void sp_work(struct work_struct *unused)
|
||||
{
|
||||
if (!channel_open) {
|
||||
if( rtlx_open(RTLX_CHANNEL_SYSIO, 1) != 0) {
|
||||
@ -354,7 +354,7 @@ static void startwork(int vpe)
|
||||
return;
|
||||
}
|
||||
|
||||
INIT_WORK(&work, sp_work, NULL);
|
||||
INIT_WORK(&work, sp_work);
|
||||
queue_work(workqueue, &work);
|
||||
} else
|
||||
queue_work(workqueue, &work);
|
||||
|
@ -382,531 +382,6 @@ asmlinkage int sys32_sched_rr_get_interval(compat_pid_t pid,
|
||||
return ret;
|
||||
}
|
||||
|
||||
struct msgbuf32 { s32 mtype; char mtext[1]; };
|
||||
|
||||
struct ipc_perm32
|
||||
{
|
||||
key_t key;
|
||||
__compat_uid_t uid;
|
||||
__compat_gid_t gid;
|
||||
__compat_uid_t cuid;
|
||||
__compat_gid_t cgid;
|
||||
compat_mode_t mode;
|
||||
unsigned short seq;
|
||||
};
|
||||
|
||||
struct ipc64_perm32 {
|
||||
key_t key;
|
||||
__compat_uid_t uid;
|
||||
__compat_gid_t gid;
|
||||
__compat_uid_t cuid;
|
||||
__compat_gid_t cgid;
|
||||
compat_mode_t mode;
|
||||
unsigned short seq;
|
||||
unsigned short __pad1;
|
||||
unsigned int __unused1;
|
||||
unsigned int __unused2;
|
||||
};
|
||||
|
||||
struct semid_ds32 {
|
||||
struct ipc_perm32 sem_perm; /* permissions .. see ipc.h */
|
||||
compat_time_t sem_otime; /* last semop time */
|
||||
compat_time_t sem_ctime; /* last change time */
|
||||
u32 sem_base; /* ptr to first semaphore in array */
|
||||
u32 sem_pending; /* pending operations to be processed */
|
||||
u32 sem_pending_last; /* last pending operation */
|
||||
u32 undo; /* undo requests on this array */
|
||||
unsigned short sem_nsems; /* no. of semaphores in array */
|
||||
};
|
||||
|
||||
struct semid64_ds32 {
|
||||
struct ipc64_perm32 sem_perm;
|
||||
compat_time_t sem_otime;
|
||||
compat_time_t sem_ctime;
|
||||
unsigned int sem_nsems;
|
||||
unsigned int __unused1;
|
||||
unsigned int __unused2;
|
||||
};
|
||||
|
||||
struct msqid_ds32
|
||||
{
|
||||
struct ipc_perm32 msg_perm;
|
||||
u32 msg_first;
|
||||
u32 msg_last;
|
||||
compat_time_t msg_stime;
|
||||
compat_time_t msg_rtime;
|
||||
compat_time_t msg_ctime;
|
||||
u32 wwait;
|
||||
u32 rwait;
|
||||
unsigned short msg_cbytes;
|
||||
unsigned short msg_qnum;
|
||||
unsigned short msg_qbytes;
|
||||
compat_ipc_pid_t msg_lspid;
|
||||
compat_ipc_pid_t msg_lrpid;
|
||||
};
|
||||
|
||||
struct msqid64_ds32 {
|
||||
struct ipc64_perm32 msg_perm;
|
||||
compat_time_t msg_stime;
|
||||
unsigned int __unused1;
|
||||
compat_time_t msg_rtime;
|
||||
unsigned int __unused2;
|
||||
compat_time_t msg_ctime;
|
||||
unsigned int __unused3;
|
||||
unsigned int msg_cbytes;
|
||||
unsigned int msg_qnum;
|
||||
unsigned int msg_qbytes;
|
||||
compat_pid_t msg_lspid;
|
||||
compat_pid_t msg_lrpid;
|
||||
unsigned int __unused4;
|
||||
unsigned int __unused5;
|
||||
};
|
||||
|
||||
struct shmid_ds32 {
|
||||
struct ipc_perm32 shm_perm;
|
||||
int shm_segsz;
|
||||
compat_time_t shm_atime;
|
||||
compat_time_t shm_dtime;
|
||||
compat_time_t shm_ctime;
|
||||
compat_ipc_pid_t shm_cpid;
|
||||
compat_ipc_pid_t shm_lpid;
|
||||
unsigned short shm_nattch;
|
||||
};
|
||||
|
||||
struct shmid64_ds32 {
|
||||
struct ipc64_perm32 shm_perm;
|
||||
compat_size_t shm_segsz;
|
||||
compat_time_t shm_atime;
|
||||
compat_time_t shm_dtime;
|
||||
compat_time_t shm_ctime;
|
||||
compat_pid_t shm_cpid;
|
||||
compat_pid_t shm_lpid;
|
||||
unsigned int shm_nattch;
|
||||
unsigned int __unused1;
|
||||
unsigned int __unused2;
|
||||
};
|
||||
|
||||
struct ipc_kludge32 {
|
||||
u32 msgp;
|
||||
s32 msgtyp;
|
||||
};
|
||||
|
||||
static int
|
||||
do_sys32_semctl(int first, int second, int third, void __user *uptr)
|
||||
{
|
||||
union semun fourth;
|
||||
u32 pad;
|
||||
int err, err2;
|
||||
struct semid64_ds s;
|
||||
mm_segment_t old_fs;
|
||||
|
||||
if (!uptr)
|
||||
return -EINVAL;
|
||||
err = -EFAULT;
|
||||
if (get_user (pad, (u32 __user *)uptr))
|
||||
return err;
|
||||
if ((third & ~IPC_64) == SETVAL)
|
||||
fourth.val = (int)pad;
|
||||
else
|
||||
fourth.__pad = (void __user *)A(pad);
|
||||
switch (third & ~IPC_64) {
|
||||
case IPC_INFO:
|
||||
case IPC_RMID:
|
||||
case IPC_SET:
|
||||
case SEM_INFO:
|
||||
case GETVAL:
|
||||
case GETPID:
|
||||
case GETNCNT:
|
||||
case GETZCNT:
|
||||
case GETALL:
|
||||
case SETVAL:
|
||||
case SETALL:
|
||||
err = sys_semctl (first, second, third, fourth);
|
||||
break;
|
||||
|
||||
case IPC_STAT:
|
||||
case SEM_STAT:
|
||||
fourth.__pad = (struct semid64_ds __user *)&s;
|
||||
old_fs = get_fs();
|
||||
set_fs(KERNEL_DS);
|
||||
err = sys_semctl(first, second, third | IPC_64, fourth);
|
||||
set_fs(old_fs);
|
||||
|
||||
if (third & IPC_64) {
|
||||
struct semid64_ds32 __user *usp64 = (struct semid64_ds32 __user *) A(pad);
|
||||
|
||||
if (!access_ok(VERIFY_WRITE, usp64, sizeof(*usp64))) {
|
||||
err = -EFAULT;
|
||||
break;
|
||||
}
|
||||
err2 = __put_user(s.sem_perm.key, &usp64->sem_perm.key);
|
||||
err2 |= __put_user(s.sem_perm.uid, &usp64->sem_perm.uid);
|
||||
err2 |= __put_user(s.sem_perm.gid, &usp64->sem_perm.gid);
|
||||
err2 |= __put_user(s.sem_perm.cuid, &usp64->sem_perm.cuid);
|
||||
err2 |= __put_user(s.sem_perm.cgid, &usp64->sem_perm.cgid);
|
||||
err2 |= __put_user(s.sem_perm.mode, &usp64->sem_perm.mode);
|
||||
err2 |= __put_user(s.sem_perm.seq, &usp64->sem_perm.seq);
|
||||
err2 |= __put_user(s.sem_otime, &usp64->sem_otime);
|
||||
err2 |= __put_user(s.sem_ctime, &usp64->sem_ctime);
|
||||
err2 |= __put_user(s.sem_nsems, &usp64->sem_nsems);
|
||||
} else {
|
||||
struct semid_ds32 __user *usp32 = (struct semid_ds32 __user *) A(pad);
|
||||
|
||||
if (!access_ok(VERIFY_WRITE, usp32, sizeof(*usp32))) {
|
||||
err = -EFAULT;
|
||||
break;
|
||||
}
|
||||
err2 = __put_user(s.sem_perm.key, &usp32->sem_perm.key);
|
||||
err2 |= __put_user(s.sem_perm.uid, &usp32->sem_perm.uid);
|
||||
err2 |= __put_user(s.sem_perm.gid, &usp32->sem_perm.gid);
|
||||
err2 |= __put_user(s.sem_perm.cuid, &usp32->sem_perm.cuid);
|
||||
err2 |= __put_user(s.sem_perm.cgid, &usp32->sem_perm.cgid);
|
||||
err2 |= __put_user(s.sem_perm.mode, &usp32->sem_perm.mode);
|
||||
err2 |= __put_user(s.sem_perm.seq, &usp32->sem_perm.seq);
|
||||
err2 |= __put_user(s.sem_otime, &usp32->sem_otime);
|
||||
err2 |= __put_user(s.sem_ctime, &usp32->sem_ctime);
|
||||
err2 |= __put_user(s.sem_nsems, &usp32->sem_nsems);
|
||||
}
|
||||
if (err2)
|
||||
err = -EFAULT;
|
||||
break;
|
||||
|
||||
default:
|
||||
err = - EINVAL;
|
||||
break;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int
|
||||
do_sys32_msgsnd (int first, int second, int third, void __user *uptr)
|
||||
{
|
||||
struct msgbuf32 __user *up = (struct msgbuf32 __user *)uptr;
|
||||
struct msgbuf *p;
|
||||
mm_segment_t old_fs;
|
||||
int err;
|
||||
|
||||
if (second < 0)
|
||||
return -EINVAL;
|
||||
p = kmalloc (second + sizeof (struct msgbuf)
|
||||
+ 4, GFP_USER);
|
||||
if (!p)
|
||||
return -ENOMEM;
|
||||
err = get_user (p->mtype, &up->mtype);
|
||||
if (err)
|
||||
goto out;
|
||||
err |= __copy_from_user (p->mtext, &up->mtext, second);
|
||||
if (err)
|
||||
goto out;
|
||||
old_fs = get_fs ();
|
||||
set_fs (KERNEL_DS);
|
||||
err = sys_msgsnd (first, (struct msgbuf __user *)p, second, third);
|
||||
set_fs (old_fs);
|
||||
out:
|
||||
kfree (p);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int
|
||||
do_sys32_msgrcv (int first, int second, int msgtyp, int third,
|
||||
int version, void __user *uptr)
|
||||
{
|
||||
struct msgbuf32 __user *up;
|
||||
struct msgbuf *p;
|
||||
mm_segment_t old_fs;
|
||||
int err;
|
||||
|
||||
if (!version) {
|
||||
struct ipc_kludge32 __user *uipck = (struct ipc_kludge32 __user *)uptr;
|
||||
struct ipc_kludge32 ipck;
|
||||
|
||||
err = -EINVAL;
|
||||
if (!uptr)
|
||||
goto out;
|
||||
err = -EFAULT;
|
||||
if (copy_from_user (&ipck, uipck, sizeof (struct ipc_kludge32)))
|
||||
goto out;
|
||||
uptr = (void __user *)AA(ipck.msgp);
|
||||
msgtyp = ipck.msgtyp;
|
||||
}
|
||||
|
||||
if (second < 0)
|
||||
return -EINVAL;
|
||||
err = -ENOMEM;
|
||||
p = kmalloc (second + sizeof (struct msgbuf) + 4, GFP_USER);
|
||||
if (!p)
|
||||
goto out;
|
||||
old_fs = get_fs ();
|
||||
set_fs (KERNEL_DS);
|
||||
err = sys_msgrcv (first, (struct msgbuf __user *)p, second + 4, msgtyp, third);
|
||||
set_fs (old_fs);
|
||||
if (err < 0)
|
||||
goto free_then_out;
|
||||
up = (struct msgbuf32 __user *)uptr;
|
||||
if (put_user (p->mtype, &up->mtype) ||
|
||||
__copy_to_user (&up->mtext, p->mtext, err))
|
||||
err = -EFAULT;
|
||||
free_then_out:
|
||||
kfree (p);
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int
|
||||
do_sys32_msgctl (int first, int second, void __user *uptr)
|
||||
{
|
||||
int err = -EINVAL, err2;
|
||||
struct msqid64_ds m;
|
||||
struct msqid_ds32 __user *up32 = (struct msqid_ds32 __user *)uptr;
|
||||
struct msqid64_ds32 __user *up64 = (struct msqid64_ds32 __user *)uptr;
|
||||
mm_segment_t old_fs;
|
||||
|
||||
switch (second & ~IPC_64) {
|
||||
case IPC_INFO:
|
||||
case IPC_RMID:
|
||||
case MSG_INFO:
|
||||
err = sys_msgctl (first, second, (struct msqid_ds __user *)uptr);
|
||||
break;
|
||||
|
||||
case IPC_SET:
|
||||
if (second & IPC_64) {
|
||||
if (!access_ok(VERIFY_READ, up64, sizeof(*up64))) {
|
||||
err = -EFAULT;
|
||||
break;
|
||||
}
|
||||
err = __get_user(m.msg_perm.uid, &up64->msg_perm.uid);
|
||||
err |= __get_user(m.msg_perm.gid, &up64->msg_perm.gid);
|
||||
err |= __get_user(m.msg_perm.mode, &up64->msg_perm.mode);
|
||||
err |= __get_user(m.msg_qbytes, &up64->msg_qbytes);
|
||||
} else {
|
||||
if (!access_ok(VERIFY_READ, up32, sizeof(*up32))) {
|
||||
err = -EFAULT;
|
||||
break;
|
||||
}
|
||||
err = __get_user(m.msg_perm.uid, &up32->msg_perm.uid);
|
||||
err |= __get_user(m.msg_perm.gid, &up32->msg_perm.gid);
|
||||
err |= __get_user(m.msg_perm.mode, &up32->msg_perm.mode);
|
||||
err |= __get_user(m.msg_qbytes, &up32->msg_qbytes);
|
||||
}
|
||||
if (err)
|
||||
break;
|
||||
old_fs = get_fs();
|
||||
set_fs(KERNEL_DS);
|
||||
err = sys_msgctl(first, second | IPC_64, (struct msqid_ds __user *)&m);
|
||||
set_fs(old_fs);
|
||||
break;
|
||||
|
||||
case IPC_STAT:
|
||||
case MSG_STAT:
|
||||
old_fs = get_fs();
|
||||
set_fs(KERNEL_DS);
|
||||
err = sys_msgctl(first, second | IPC_64, (struct msqid_ds __user *)&m);
|
||||
set_fs(old_fs);
|
||||
if (second & IPC_64) {
|
||||
if (!access_ok(VERIFY_WRITE, up64, sizeof(*up64))) {
|
||||
err = -EFAULT;
|
||||
break;
|
||||
}
|
||||
err2 = __put_user(m.msg_perm.key, &up64->msg_perm.key);
|
||||
err2 |= __put_user(m.msg_perm.uid, &up64->msg_perm.uid);
|
||||
err2 |= __put_user(m.msg_perm.gid, &up64->msg_perm.gid);
|
||||
err2 |= __put_user(m.msg_perm.cuid, &up64->msg_perm.cuid);
|
||||
err2 |= __put_user(m.msg_perm.cgid, &up64->msg_perm.cgid);
|
||||
err2 |= __put_user(m.msg_perm.mode, &up64->msg_perm.mode);
|
||||
err2 |= __put_user(m.msg_perm.seq, &up64->msg_perm.seq);
|
||||
err2 |= __put_user(m.msg_stime, &up64->msg_stime);
|
||||
err2 |= __put_user(m.msg_rtime, &up64->msg_rtime);
|
||||
err2 |= __put_user(m.msg_ctime, &up64->msg_ctime);
|
||||
err2 |= __put_user(m.msg_cbytes, &up64->msg_cbytes);
|
||||
err2 |= __put_user(m.msg_qnum, &up64->msg_qnum);
|
||||
err2 |= __put_user(m.msg_qbytes, &up64->msg_qbytes);
|
||||
err2 |= __put_user(m.msg_lspid, &up64->msg_lspid);
|
||||
err2 |= __put_user(m.msg_lrpid, &up64->msg_lrpid);
|
||||
if (err2)
|
||||
err = -EFAULT;
|
||||
} else {
|
||||
if (!access_ok(VERIFY_WRITE, up32, sizeof(*up32))) {
|
||||
err = -EFAULT;
|
||||
break;
|
||||
}
|
||||
err2 = __put_user(m.msg_perm.key, &up32->msg_perm.key);
|
||||
err2 |= __put_user(m.msg_perm.uid, &up32->msg_perm.uid);
|
||||
err2 |= __put_user(m.msg_perm.gid, &up32->msg_perm.gid);
|
||||
err2 |= __put_user(m.msg_perm.cuid, &up32->msg_perm.cuid);
|
||||
err2 |= __put_user(m.msg_perm.cgid, &up32->msg_perm.cgid);
|
||||
err2 |= __put_user(m.msg_perm.mode, &up32->msg_perm.mode);
|
||||
err2 |= __put_user(m.msg_perm.seq, &up32->msg_perm.seq);
|
||||
err2 |= __put_user(m.msg_stime, &up32->msg_stime);
|
||||
err2 |= __put_user(m.msg_rtime, &up32->msg_rtime);
|
||||
err2 |= __put_user(m.msg_ctime, &up32->msg_ctime);
|
||||
err2 |= __put_user(m.msg_cbytes, &up32->msg_cbytes);
|
||||
err2 |= __put_user(m.msg_qnum, &up32->msg_qnum);
|
||||
err2 |= __put_user(m.msg_qbytes, &up32->msg_qbytes);
|
||||
err2 |= __put_user(m.msg_lspid, &up32->msg_lspid);
|
||||
err2 |= __put_user(m.msg_lrpid, &up32->msg_lrpid);
|
||||
if (err2)
|
||||
err = -EFAULT;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int
|
||||
do_sys32_shmat (int first, int second, int third, int version, void __user *uptr)
|
||||
{
|
||||
unsigned long raddr;
|
||||
u32 __user *uaddr = (u32 __user *)A((u32)third);
|
||||
int err = -EINVAL;
|
||||
|
||||
if (version == 1)
|
||||
return err;
|
||||
err = do_shmat (first, uptr, second, &raddr);
|
||||
if (err)
|
||||
return err;
|
||||
err = put_user (raddr, uaddr);
|
||||
return err;
|
||||
}
|
||||
|
||||
struct shm_info32 {
|
||||
int used_ids;
|
||||
u32 shm_tot, shm_rss, shm_swp;
|
||||
u32 swap_attempts, swap_successes;
|
||||
};
|
||||
|
||||
static int
|
||||
do_sys32_shmctl (int first, int second, void __user *uptr)
|
||||
{
|
||||
struct shmid64_ds32 __user *up64 = (struct shmid64_ds32 __user *)uptr;
|
||||
struct shmid_ds32 __user *up32 = (struct shmid_ds32 __user *)uptr;
|
||||
struct shm_info32 __user *uip = (struct shm_info32 __user *)uptr;
|
||||
int err = -EFAULT, err2;
|
||||
struct shmid64_ds s64;
|
||||
mm_segment_t old_fs;
|
||||
struct shm_info si;
|
||||
struct shmid_ds s;
|
||||
|
||||
switch (second & ~IPC_64) {
|
||||
case IPC_INFO:
|
||||
second = IPC_INFO; /* So that we don't have to translate it */
|
||||
case IPC_RMID:
|
||||
case SHM_LOCK:
|
||||
case SHM_UNLOCK:
|
||||
err = sys_shmctl(first, second, (struct shmid_ds __user *)uptr);
|
||||
break;
|
||||
case IPC_SET:
|
||||
if (second & IPC_64) {
|
||||
err = get_user(s.shm_perm.uid, &up64->shm_perm.uid);
|
||||
err |= get_user(s.shm_perm.gid, &up64->shm_perm.gid);
|
||||
err |= get_user(s.shm_perm.mode, &up64->shm_perm.mode);
|
||||
} else {
|
||||
err = get_user(s.shm_perm.uid, &up32->shm_perm.uid);
|
||||
err |= get_user(s.shm_perm.gid, &up32->shm_perm.gid);
|
||||
err |= get_user(s.shm_perm.mode, &up32->shm_perm.mode);
|
||||
}
|
||||
if (err)
|
||||
break;
|
||||
old_fs = get_fs();
|
||||
set_fs(KERNEL_DS);
|
||||
err = sys_shmctl(first, second & ~IPC_64, (struct shmid_ds __user *)&s);
|
||||
set_fs(old_fs);
|
||||
break;
|
||||
|
||||
case IPC_STAT:
|
||||
case SHM_STAT:
|
||||
old_fs = get_fs();
|
||||
set_fs(KERNEL_DS);
|
||||
err = sys_shmctl(first, second | IPC_64, (void __user *) &s64);
|
||||
set_fs(old_fs);
|
||||
if (err < 0)
|
||||
break;
|
||||
if (second & IPC_64) {
|
||||
if (!access_ok(VERIFY_WRITE, up64, sizeof(*up64))) {
|
||||
err = -EFAULT;
|
||||
break;
|
||||
}
|
||||
err2 = __put_user(s64.shm_perm.key, &up64->shm_perm.key);
|
||||
err2 |= __put_user(s64.shm_perm.uid, &up64->shm_perm.uid);
|
||||
err2 |= __put_user(s64.shm_perm.gid, &up64->shm_perm.gid);
|
||||
err2 |= __put_user(s64.shm_perm.cuid, &up64->shm_perm.cuid);
|
||||
err2 |= __put_user(s64.shm_perm.cgid, &up64->shm_perm.cgid);
|
||||
err2 |= __put_user(s64.shm_perm.mode, &up64->shm_perm.mode);
|
||||
err2 |= __put_user(s64.shm_perm.seq, &up64->shm_perm.seq);
|
||||
err2 |= __put_user(s64.shm_atime, &up64->shm_atime);
|
||||
err2 |= __put_user(s64.shm_dtime, &up64->shm_dtime);
|
||||
err2 |= __put_user(s64.shm_ctime, &up64->shm_ctime);
|
||||
err2 |= __put_user(s64.shm_segsz, &up64->shm_segsz);
|
||||
err2 |= __put_user(s64.shm_nattch, &up64->shm_nattch);
|
||||
err2 |= __put_user(s64.shm_cpid, &up64->shm_cpid);
|
||||
err2 |= __put_user(s64.shm_lpid, &up64->shm_lpid);
|
||||
} else {
|
||||
if (!access_ok(VERIFY_WRITE, up32, sizeof(*up32))) {
|
||||
err = -EFAULT;
|
||||
break;
|
||||
}
|
||||
err2 = __put_user(s64.shm_perm.key, &up32->shm_perm.key);
|
||||
err2 |= __put_user(s64.shm_perm.uid, &up32->shm_perm.uid);
|
||||
err2 |= __put_user(s64.shm_perm.gid, &up32->shm_perm.gid);
|
||||
err2 |= __put_user(s64.shm_perm.cuid, &up32->shm_perm.cuid);
|
||||
err2 |= __put_user(s64.shm_perm.cgid, &up32->shm_perm.cgid);
|
||||
err2 |= __put_user(s64.shm_perm.mode, &up32->shm_perm.mode);
|
||||
err2 |= __put_user(s64.shm_perm.seq, &up32->shm_perm.seq);
|
||||
err2 |= __put_user(s64.shm_atime, &up32->shm_atime);
|
||||
err2 |= __put_user(s64.shm_dtime, &up32->shm_dtime);
|
||||
err2 |= __put_user(s64.shm_ctime, &up32->shm_ctime);
|
||||
err2 |= __put_user(s64.shm_segsz, &up32->shm_segsz);
|
||||
err2 |= __put_user(s64.shm_nattch, &up32->shm_nattch);
|
||||
err2 |= __put_user(s64.shm_cpid, &up32->shm_cpid);
|
||||
err2 |= __put_user(s64.shm_lpid, &up32->shm_lpid);
|
||||
}
|
||||
if (err2)
|
||||
err = -EFAULT;
|
||||
break;
|
||||
|
||||
case SHM_INFO:
|
||||
old_fs = get_fs();
|
||||
set_fs(KERNEL_DS);
|
||||
err = sys_shmctl(first, second, (void __user *)&si);
|
||||
set_fs(old_fs);
|
||||
if (err < 0)
|
||||
break;
|
||||
err2 = put_user(si.used_ids, &uip->used_ids);
|
||||
err2 |= __put_user(si.shm_tot, &uip->shm_tot);
|
||||
err2 |= __put_user(si.shm_rss, &uip->shm_rss);
|
||||
err2 |= __put_user(si.shm_swp, &uip->shm_swp);
|
||||
err2 |= __put_user(si.swap_attempts, &uip->swap_attempts);
|
||||
err2 |= __put_user (si.swap_successes, &uip->swap_successes);
|
||||
if (err2)
|
||||
err = -EFAULT;
|
||||
break;
|
||||
|
||||
default:
|
||||
err = -EINVAL;
|
||||
break;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int sys32_semtimedop(int semid, struct sembuf __user *tsems, int nsems,
|
||||
const struct compat_timespec __user *timeout32)
|
||||
{
|
||||
struct compat_timespec t32;
|
||||
struct timespec __user *t64 = compat_alloc_user_space(sizeof(*t64));
|
||||
|
||||
if (copy_from_user(&t32, timeout32, sizeof(t32)))
|
||||
return -EFAULT;
|
||||
|
||||
if (put_user(t32.tv_sec, &t64->tv_sec) ||
|
||||
put_user(t32.tv_nsec, &t64->tv_nsec))
|
||||
return -EFAULT;
|
||||
|
||||
return sys_semtimedop(semid, tsems, nsems, t64);
|
||||
}
|
||||
|
||||
asmlinkage long
|
||||
sys32_ipc (u32 call, int first, int second, int third, u32 ptr, u32 fifth)
|
||||
{
|
||||
@ -918,48 +393,43 @@ sys32_ipc (u32 call, int first, int second, int third, u32 ptr, u32 fifth)
|
||||
switch (call) {
|
||||
case SEMOP:
|
||||
/* struct sembuf is the same on 32 and 64bit :)) */
|
||||
err = sys_semtimedop (first, (struct sembuf __user *)AA(ptr), second,
|
||||
NULL);
|
||||
err = sys_semtimedop(first, compat_ptr(ptr), second, NULL);
|
||||
break;
|
||||
case SEMTIMEDOP:
|
||||
err = sys32_semtimedop (first, (struct sembuf __user *)AA(ptr), second,
|
||||
(const struct compat_timespec __user *)AA(fifth));
|
||||
err = compat_sys_semtimedop(first, compat_ptr(ptr), second,
|
||||
compat_ptr(fifth));
|
||||
break;
|
||||
case SEMGET:
|
||||
err = sys_semget (first, second, third);
|
||||
err = sys_semget(first, second, third);
|
||||
break;
|
||||
case SEMCTL:
|
||||
err = do_sys32_semctl (first, second, third,
|
||||
(void __user *)AA(ptr));
|
||||
err = compat_sys_semctl(first, second, third, compat_ptr(ptr));
|
||||
break;
|
||||
|
||||
case MSGSND:
|
||||
err = do_sys32_msgsnd (first, second, third,
|
||||
(void __user *)AA(ptr));
|
||||
err = compat_sys_msgsnd(first, second, third, compat_ptr(ptr));
|
||||
break;
|
||||
case MSGRCV:
|
||||
err = do_sys32_msgrcv (first, second, fifth, third,
|
||||
version, (void __user *)AA(ptr));
|
||||
err = compat_sys_msgrcv(first, second, fifth, third,
|
||||
version, compat_ptr(ptr));
|
||||
break;
|
||||
case MSGGET:
|
||||
err = sys_msgget ((key_t) first, second);
|
||||
err = sys_msgget((key_t) first, second);
|
||||
break;
|
||||
case MSGCTL:
|
||||
err = do_sys32_msgctl (first, second, (void __user *)AA(ptr));
|
||||
err = compat_sys_msgctl(first, second, compat_ptr(ptr));
|
||||
break;
|
||||
|
||||
case SHMAT:
|
||||
err = do_sys32_shmat (first, second, third,
|
||||
version, (void __user *)AA(ptr));
|
||||
err = compat_sys_shmat(first, second, third, version,
|
||||
compat_ptr(ptr));
|
||||
break;
|
||||
case SHMDT:
|
||||
err = sys_shmdt ((char __user *)A(ptr));
|
||||
err = sys_shmdt(compat_ptr(ptr));
|
||||
break;
|
||||
case SHMGET:
|
||||
err = sys_shmget (first, (unsigned)second, third);
|
||||
err = sys_shmget(first, (unsigned)second, third);
|
||||
break;
|
||||
case SHMCTL:
|
||||
err = do_sys32_shmctl (first, second, (void __user *)AA(ptr));
|
||||
err = compat_sys_shmctl(first, second, compat_ptr(ptr));
|
||||
break;
|
||||
default:
|
||||
err = -EINVAL;
|
||||
@ -969,18 +439,16 @@ sys32_ipc (u32 call, int first, int second, int third, u32 ptr, u32 fifth)
|
||||
return err;
|
||||
}
|
||||
|
||||
asmlinkage long sys32_shmat(int shmid, char __user *shmaddr,
|
||||
int shmflg, int32_t __user *addr)
|
||||
#ifdef CONFIG_MIPS32_N32
|
||||
asmlinkage long sysn32_semctl(int semid, int semnum, int cmd, union semun arg)
|
||||
{
|
||||
unsigned long raddr;
|
||||
int err;
|
||||
|
||||
err = do_shmat(shmid, shmaddr, shmflg, &raddr);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return put_user(raddr, addr);
|
||||
/* compat_sys_semctl expects a pointer to union semun */
|
||||
u32 __user *uptr = compat_alloc_user_space(sizeof(u32));
|
||||
if (put_user(ptr_to_compat(arg.__pad), uptr))
|
||||
return -EFAULT;
|
||||
return compat_sys_semctl(semid, semnum, cmd, uptr);
|
||||
}
|
||||
#endif
|
||||
|
||||
struct sysctl_args32
|
||||
{
|
||||
|
@ -149,8 +149,8 @@ EXPORT(sysn32_call_table)
|
||||
PTR sys_mincore
|
||||
PTR sys_madvise
|
||||
PTR sys_shmget
|
||||
PTR sys32_shmat
|
||||
PTR sys_shmctl /* 6030 */
|
||||
PTR sys_shmat
|
||||
PTR compat_sys_shmctl /* 6030 */
|
||||
PTR sys_dup
|
||||
PTR sys_dup2
|
||||
PTR sys_pause
|
||||
@ -184,12 +184,12 @@ EXPORT(sysn32_call_table)
|
||||
PTR sys32_newuname
|
||||
PTR sys_semget
|
||||
PTR sys_semop
|
||||
PTR sys_semctl
|
||||
PTR sysn32_semctl
|
||||
PTR sys_shmdt /* 6065 */
|
||||
PTR sys_msgget
|
||||
PTR sys_msgsnd
|
||||
PTR sys_msgrcv
|
||||
PTR sys_msgctl
|
||||
PTR compat_sys_msgsnd
|
||||
PTR compat_sys_msgrcv
|
||||
PTR compat_sys_msgctl
|
||||
PTR compat_sys_fcntl /* 6070 */
|
||||
PTR sys_flock
|
||||
PTR sys_fsync
|
||||
@ -335,7 +335,7 @@ EXPORT(sysn32_call_table)
|
||||
PTR compat_sys_fcntl64
|
||||
PTR sys_set_tid_address
|
||||
PTR sys_restart_syscall
|
||||
PTR sys_semtimedop /* 6215 */
|
||||
PTR compat_sys_semtimedop /* 6215 */
|
||||
PTR sys_fadvise64_64
|
||||
PTR compat_sys_statfs64
|
||||
PTR compat_sys_fstatfs64
|
||||
|
@ -172,7 +172,7 @@ int smp_call_function (void (*func) (void *info), void *info, int retry,
|
||||
|
||||
spin_lock(&smp_call_lock);
|
||||
call_data = &data;
|
||||
mb();
|
||||
smp_mb();
|
||||
|
||||
/* Send a message to all other CPUs and wait for them to respond */
|
||||
for_each_online_cpu(i)
|
||||
@ -204,7 +204,7 @@ void smp_call_function_interrupt(void)
|
||||
* Notify initiating CPU that I've grabbed the data and am
|
||||
* about to execute the function.
|
||||
*/
|
||||
mb();
|
||||
smp_mb();
|
||||
atomic_inc(&call_data->started);
|
||||
|
||||
/*
|
||||
@ -215,7 +215,7 @@ void smp_call_function_interrupt(void)
|
||||
irq_exit();
|
||||
|
||||
if (wait) {
|
||||
mb();
|
||||
smp_mb();
|
||||
atomic_inc(&call_data->finished);
|
||||
}
|
||||
}
|
||||
|
@ -44,19 +44,12 @@ void enable_lasat_irq(unsigned int irq_nr)
|
||||
*lasat_int_mask |= (1 << irq_nr) << lasat_int_mask_shift;
|
||||
}
|
||||
|
||||
static void end_lasat_irq(unsigned int irq)
|
||||
{
|
||||
if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
|
||||
enable_lasat_irq(irq);
|
||||
}
|
||||
|
||||
static struct irq_chip lasat_irq_type = {
|
||||
.typename = "Lasat",
|
||||
.ack = disable_lasat_irq,
|
||||
.mask = disable_lasat_irq,
|
||||
.mask_ack = disable_lasat_irq,
|
||||
.unmask = enable_lasat_irq,
|
||||
.end = end_lasat_irq,
|
||||
};
|
||||
|
||||
static inline int ls1bit32(unsigned int x)
|
||||
|
@ -2,7 +2,7 @@
|
||||
# Makefile for MIPS-specific library files..
|
||||
#
|
||||
|
||||
lib-y += csum_partial.o memset.o watch.o
|
||||
lib-y += memset.o watch.o
|
||||
|
||||
obj-$(CONFIG_CPU_MIPS32) += dump_tlb.o
|
||||
obj-$(CONFIG_CPU_MIPS64) += dump_tlb.o
|
||||
|
@ -1,240 +0,0 @@
|
||||
/*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*
|
||||
* Copyright (C) 1998 Ralf Baechle
|
||||
*/
|
||||
#include <asm/asm.h>
|
||||
#include <asm/regdef.h>
|
||||
|
||||
#define ADDC(sum,reg) \
|
||||
addu sum, reg; \
|
||||
sltu v1, sum, reg; \
|
||||
addu sum, v1
|
||||
|
||||
#define CSUM_BIGCHUNK(src, offset, sum, t0, t1, t2, t3) \
|
||||
lw t0, (offset + 0x00)(src); \
|
||||
lw t1, (offset + 0x04)(src); \
|
||||
lw t2, (offset + 0x08)(src); \
|
||||
lw t3, (offset + 0x0c)(src); \
|
||||
ADDC(sum, t0); \
|
||||
ADDC(sum, t1); \
|
||||
ADDC(sum, t2); \
|
||||
ADDC(sum, t3); \
|
||||
lw t0, (offset + 0x10)(src); \
|
||||
lw t1, (offset + 0x14)(src); \
|
||||
lw t2, (offset + 0x18)(src); \
|
||||
lw t3, (offset + 0x1c)(src); \
|
||||
ADDC(sum, t0); \
|
||||
ADDC(sum, t1); \
|
||||
ADDC(sum, t2); \
|
||||
ADDC(sum, t3); \
|
||||
|
||||
/*
|
||||
* a0: source address
|
||||
* a1: length of the area to checksum
|
||||
* a2: partial checksum
|
||||
*/
|
||||
|
||||
#define src a0
|
||||
#define dest a1
|
||||
#define sum v0
|
||||
|
||||
.text
|
||||
.set noreorder
|
||||
|
||||
/* unknown src alignment and < 8 bytes to go */
|
||||
small_csumcpy:
|
||||
move a1, t2
|
||||
|
||||
andi t0, a1, 4
|
||||
beqz t0, 1f
|
||||
andi t0, a1, 2
|
||||
|
||||
/* Still a full word to go */
|
||||
ulw t1, (src)
|
||||
addiu src, 4
|
||||
ADDC(sum, t1)
|
||||
|
||||
1: move t1, zero
|
||||
beqz t0, 1f
|
||||
andi t0, a1, 1
|
||||
|
||||
/* Still a halfword to go */
|
||||
ulhu t1, (src)
|
||||
addiu src, 2
|
||||
|
||||
1: beqz t0, 1f
|
||||
sll t1, t1, 16
|
||||
|
||||
lbu t2, (src)
|
||||
nop
|
||||
|
||||
#ifdef __MIPSEB__
|
||||
sll t2, t2, 8
|
||||
#endif
|
||||
or t1, t2
|
||||
|
||||
1: ADDC(sum, t1)
|
||||
|
||||
/* fold checksum */
|
||||
sll v1, sum, 16
|
||||
addu sum, v1
|
||||
sltu v1, sum, v1
|
||||
srl sum, sum, 16
|
||||
addu sum, v1
|
||||
|
||||
/* odd buffer alignment? */
|
||||
beqz t7, 1f
|
||||
nop
|
||||
sll v1, sum, 8
|
||||
srl sum, sum, 8
|
||||
or sum, v1
|
||||
andi sum, 0xffff
|
||||
1:
|
||||
.set reorder
|
||||
/* Add the passed partial csum. */
|
||||
ADDC(sum, a2)
|
||||
jr ra
|
||||
.set noreorder
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
.align 5
|
||||
LEAF(csum_partial)
|
||||
move sum, zero
|
||||
move t7, zero
|
||||
|
||||
sltiu t8, a1, 0x8
|
||||
bnez t8, small_csumcpy /* < 8 bytes to copy */
|
||||
move t2, a1
|
||||
|
||||
beqz a1, out
|
||||
andi t7, src, 0x1 /* odd buffer? */
|
||||
|
||||
hword_align:
|
||||
beqz t7, word_align
|
||||
andi t8, src, 0x2
|
||||
|
||||
lbu t0, (src)
|
||||
subu a1, a1, 0x1
|
||||
#ifdef __MIPSEL__
|
||||
sll t0, t0, 8
|
||||
#endif
|
||||
ADDC(sum, t0)
|
||||
addu src, src, 0x1
|
||||
andi t8, src, 0x2
|
||||
|
||||
word_align:
|
||||
beqz t8, dword_align
|
||||
sltiu t8, a1, 56
|
||||
|
||||
lhu t0, (src)
|
||||
subu a1, a1, 0x2
|
||||
ADDC(sum, t0)
|
||||
sltiu t8, a1, 56
|
||||
addu src, src, 0x2
|
||||
|
||||
dword_align:
|
||||
bnez t8, do_end_words
|
||||
move t8, a1
|
||||
|
||||
andi t8, src, 0x4
|
||||
beqz t8, qword_align
|
||||
andi t8, src, 0x8
|
||||
|
||||
lw t0, 0x00(src)
|
||||
subu a1, a1, 0x4
|
||||
ADDC(sum, t0)
|
||||
addu src, src, 0x4
|
||||
andi t8, src, 0x8
|
||||
|
||||
qword_align:
|
||||
beqz t8, oword_align
|
||||
andi t8, src, 0x10
|
||||
|
||||
lw t0, 0x00(src)
|
||||
lw t1, 0x04(src)
|
||||
subu a1, a1, 0x8
|
||||
ADDC(sum, t0)
|
||||
ADDC(sum, t1)
|
||||
addu src, src, 0x8
|
||||
andi t8, src, 0x10
|
||||
|
||||
oword_align:
|
||||
beqz t8, begin_movement
|
||||
srl t8, a1, 0x7
|
||||
|
||||
lw t3, 0x08(src)
|
||||
lw t4, 0x0c(src)
|
||||
lw t0, 0x00(src)
|
||||
lw t1, 0x04(src)
|
||||
ADDC(sum, t3)
|
||||
ADDC(sum, t4)
|
||||
ADDC(sum, t0)
|
||||
ADDC(sum, t1)
|
||||
subu a1, a1, 0x10
|
||||
addu src, src, 0x10
|
||||
srl t8, a1, 0x7
|
||||
|
||||
begin_movement:
|
||||
beqz t8, 1f
|
||||
andi t2, a1, 0x40
|
||||
|
||||
move_128bytes:
|
||||
CSUM_BIGCHUNK(src, 0x00, sum, t0, t1, t3, t4)
|
||||
CSUM_BIGCHUNK(src, 0x20, sum, t0, t1, t3, t4)
|
||||
CSUM_BIGCHUNK(src, 0x40, sum, t0, t1, t3, t4)
|
||||
CSUM_BIGCHUNK(src, 0x60, sum, t0, t1, t3, t4)
|
||||
subu t8, t8, 0x01
|
||||
bnez t8, move_128bytes
|
||||
addu src, src, 0x80
|
||||
|
||||
1:
|
||||
beqz t2, 1f
|
||||
andi t2, a1, 0x20
|
||||
|
||||
move_64bytes:
|
||||
CSUM_BIGCHUNK(src, 0x00, sum, t0, t1, t3, t4)
|
||||
CSUM_BIGCHUNK(src, 0x20, sum, t0, t1, t3, t4)
|
||||
addu src, src, 0x40
|
||||
|
||||
1:
|
||||
beqz t2, do_end_words
|
||||
andi t8, a1, 0x1c
|
||||
|
||||
move_32bytes:
|
||||
CSUM_BIGCHUNK(src, 0x00, sum, t0, t1, t3, t4)
|
||||
andi t8, a1, 0x1c
|
||||
addu src, src, 0x20
|
||||
|
||||
do_end_words:
|
||||
beqz t8, maybe_end_cruft
|
||||
srl t8, t8, 0x2
|
||||
|
||||
end_words:
|
||||
lw t0, (src)
|
||||
subu t8, t8, 0x1
|
||||
ADDC(sum, t0)
|
||||
bnez t8, end_words
|
||||
addu src, src, 0x4
|
||||
|
||||
maybe_end_cruft:
|
||||
andi t2, a1, 0x3
|
||||
|
||||
small_memcpy:
|
||||
j small_csumcpy; move a1, t2
|
||||
beqz t2, out
|
||||
move a1, t2
|
||||
|
||||
end_bytes:
|
||||
lb t0, (src)
|
||||
subu a1, a1, 0x1
|
||||
bnez a2, end_bytes
|
||||
addu src, src, 0x1
|
||||
|
||||
out:
|
||||
jr ra
|
||||
move v0, sum
|
||||
END(csum_partial)
|
@ -2,7 +2,7 @@
|
||||
# Makefile for MIPS-specific library files..
|
||||
#
|
||||
|
||||
lib-y += csum_partial.o memset.o watch.o
|
||||
lib-y += memset.o watch.o
|
||||
|
||||
obj-$(CONFIG_CPU_MIPS32) += dump_tlb.o
|
||||
obj-$(CONFIG_CPU_MIPS64) += dump_tlb.o
|
||||
|
@ -1,242 +0,0 @@
|
||||
/*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*
|
||||
* Quick'n'dirty IP checksum ...
|
||||
*
|
||||
* Copyright (C) 1998, 1999 Ralf Baechle
|
||||
* Copyright (C) 1999 Silicon Graphics, Inc.
|
||||
*/
|
||||
#include <asm/asm.h>
|
||||
#include <asm/regdef.h>
|
||||
|
||||
#define ADDC(sum,reg) \
|
||||
addu sum, reg; \
|
||||
sltu v1, sum, reg; \
|
||||
addu sum, v1
|
||||
|
||||
#define CSUM_BIGCHUNK(src, offset, sum, t0, t1, t2, t3) \
|
||||
lw t0, (offset + 0x00)(src); \
|
||||
lw t1, (offset + 0x04)(src); \
|
||||
lw t2, (offset + 0x08)(src); \
|
||||
lw t3, (offset + 0x0c)(src); \
|
||||
ADDC(sum, t0); \
|
||||
ADDC(sum, t1); \
|
||||
ADDC(sum, t2); \
|
||||
ADDC(sum, t3); \
|
||||
lw t0, (offset + 0x10)(src); \
|
||||
lw t1, (offset + 0x14)(src); \
|
||||
lw t2, (offset + 0x18)(src); \
|
||||
lw t3, (offset + 0x1c)(src); \
|
||||
ADDC(sum, t0); \
|
||||
ADDC(sum, t1); \
|
||||
ADDC(sum, t2); \
|
||||
ADDC(sum, t3); \
|
||||
|
||||
/*
|
||||
* a0: source address
|
||||
* a1: length of the area to checksum
|
||||
* a2: partial checksum
|
||||
*/
|
||||
|
||||
#define src a0
|
||||
#define sum v0
|
||||
|
||||
.text
|
||||
.set noreorder
|
||||
|
||||
/* unknown src alignment and < 8 bytes to go */
|
||||
small_csumcpy:
|
||||
move a1, ta2
|
||||
|
||||
andi ta0, a1, 4
|
||||
beqz ta0, 1f
|
||||
andi ta0, a1, 2
|
||||
|
||||
/* Still a full word to go */
|
||||
ulw ta1, (src)
|
||||
daddiu src, 4
|
||||
ADDC(sum, ta1)
|
||||
|
||||
1: move ta1, zero
|
||||
beqz ta0, 1f
|
||||
andi ta0, a1, 1
|
||||
|
||||
/* Still a halfword to go */
|
||||
ulhu ta1, (src)
|
||||
daddiu src, 2
|
||||
|
||||
1: beqz ta0, 1f
|
||||
sll ta1, ta1, 16
|
||||
|
||||
lbu ta2, (src)
|
||||
nop
|
||||
|
||||
#ifdef __MIPSEB__
|
||||
sll ta2, ta2, 8
|
||||
#endif
|
||||
or ta1, ta2
|
||||
|
||||
1: ADDC(sum, ta1)
|
||||
|
||||
/* fold checksum */
|
||||
sll v1, sum, 16
|
||||
addu sum, v1
|
||||
sltu v1, sum, v1
|
||||
srl sum, sum, 16
|
||||
addu sum, v1
|
||||
|
||||
/* odd buffer alignment? */
|
||||
beqz t3, 1f
|
||||
nop
|
||||
sll v1, sum, 8
|
||||
srl sum, sum, 8
|
||||
or sum, v1
|
||||
andi sum, 0xffff
|
||||
1:
|
||||
.set reorder
|
||||
/* Add the passed partial csum. */
|
||||
ADDC(sum, a2)
|
||||
jr ra
|
||||
.set noreorder
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
.align 5
|
||||
LEAF(csum_partial)
|
||||
move sum, zero
|
||||
move t3, zero
|
||||
|
||||
sltiu t8, a1, 0x8
|
||||
bnez t8, small_csumcpy /* < 8 bytes to copy */
|
||||
move ta2, a1
|
||||
|
||||
beqz a1, out
|
||||
andi t3, src, 0x1 /* odd buffer? */
|
||||
|
||||
hword_align:
|
||||
beqz t3, word_align
|
||||
andi t8, src, 0x2
|
||||
|
||||
lbu ta0, (src)
|
||||
dsubu a1, a1, 0x1
|
||||
#ifdef __MIPSEL__
|
||||
sll ta0, ta0, 8
|
||||
#endif
|
||||
ADDC(sum, ta0)
|
||||
daddu src, src, 0x1
|
||||
andi t8, src, 0x2
|
||||
|
||||
word_align:
|
||||
beqz t8, dword_align
|
||||
sltiu t8, a1, 56
|
||||
|
||||
lhu ta0, (src)
|
||||
dsubu a1, a1, 0x2
|
||||
ADDC(sum, ta0)
|
||||
sltiu t8, a1, 56
|
||||
daddu src, src, 0x2
|
||||
|
||||
dword_align:
|
||||
bnez t8, do_end_words
|
||||
move t8, a1
|
||||
|
||||
andi t8, src, 0x4
|
||||
beqz t8, qword_align
|
||||
andi t8, src, 0x8
|
||||
|
||||
lw ta0, 0x00(src)
|
||||
dsubu a1, a1, 0x4
|
||||
ADDC(sum, ta0)
|
||||
daddu src, src, 0x4
|
||||
andi t8, src, 0x8
|
||||
|
||||
qword_align:
|
||||
beqz t8, oword_align
|
||||
andi t8, src, 0x10
|
||||
|
||||
lw ta0, 0x00(src)
|
||||
lw ta1, 0x04(src)
|
||||
dsubu a1, a1, 0x8
|
||||
ADDC(sum, ta0)
|
||||
ADDC(sum, ta1)
|
||||
daddu src, src, 0x8
|
||||
andi t8, src, 0x10
|
||||
|
||||
oword_align:
|
||||
beqz t8, begin_movement
|
||||
dsrl t8, a1, 0x7
|
||||
|
||||
lw ta3, 0x08(src)
|
||||
lw t0, 0x0c(src)
|
||||
lw ta0, 0x00(src)
|
||||
lw ta1, 0x04(src)
|
||||
ADDC(sum, ta3)
|
||||
ADDC(sum, t0)
|
||||
ADDC(sum, ta0)
|
||||
ADDC(sum, ta1)
|
||||
dsubu a1, a1, 0x10
|
||||
daddu src, src, 0x10
|
||||
dsrl t8, a1, 0x7
|
||||
|
||||
begin_movement:
|
||||
beqz t8, 1f
|
||||
andi ta2, a1, 0x40
|
||||
|
||||
move_128bytes:
|
||||
CSUM_BIGCHUNK(src, 0x00, sum, ta0, ta1, ta3, t0)
|
||||
CSUM_BIGCHUNK(src, 0x20, sum, ta0, ta1, ta3, t0)
|
||||
CSUM_BIGCHUNK(src, 0x40, sum, ta0, ta1, ta3, t0)
|
||||
CSUM_BIGCHUNK(src, 0x60, sum, ta0, ta1, ta3, t0)
|
||||
dsubu t8, t8, 0x01
|
||||
bnez t8, move_128bytes
|
||||
daddu src, src, 0x80
|
||||
|
||||
1:
|
||||
beqz ta2, 1f
|
||||
andi ta2, a1, 0x20
|
||||
|
||||
move_64bytes:
|
||||
CSUM_BIGCHUNK(src, 0x00, sum, ta0, ta1, ta3, t0)
|
||||
CSUM_BIGCHUNK(src, 0x20, sum, ta0, ta1, ta3, t0)
|
||||
daddu src, src, 0x40
|
||||
|
||||
1:
|
||||
beqz ta2, do_end_words
|
||||
andi t8, a1, 0x1c
|
||||
|
||||
move_32bytes:
|
||||
CSUM_BIGCHUNK(src, 0x00, sum, ta0, ta1, ta3, t0)
|
||||
andi t8, a1, 0x1c
|
||||
daddu src, src, 0x20
|
||||
|
||||
do_end_words:
|
||||
beqz t8, maybe_end_cruft
|
||||
dsrl t8, t8, 0x2
|
||||
|
||||
end_words:
|
||||
lw ta0, (src)
|
||||
dsubu t8, t8, 0x1
|
||||
ADDC(sum, ta0)
|
||||
bnez t8, end_words
|
||||
daddu src, src, 0x4
|
||||
|
||||
maybe_end_cruft:
|
||||
andi ta2, a1, 0x3
|
||||
|
||||
small_memcpy:
|
||||
j small_csumcpy; move a1, ta2 /* XXX ??? */
|
||||
beqz t2, out
|
||||
move a1, ta2
|
||||
|
||||
end_bytes:
|
||||
lb ta0, (src)
|
||||
dsubu a1, a1, 0x1
|
||||
bnez a2, end_bytes
|
||||
daddu src, src, 0x1
|
||||
|
||||
out:
|
||||
jr ra
|
||||
move v0, sum
|
||||
END(csum_partial)
|
@ -2,8 +2,8 @@
|
||||
# Makefile for MIPS-specific library files..
|
||||
#
|
||||
|
||||
lib-y += csum_partial_copy.o memcpy.o promlib.o strlen_user.o strncpy_user.o \
|
||||
strnlen_user.o uncached.o
|
||||
lib-y += csum_partial.o csum_partial_copy.o memcpy.o promlib.o \
|
||||
strlen_user.o strncpy_user.o strnlen_user.o uncached.o
|
||||
|
||||
obj-y += iomap.o
|
||||
|
||||
|
258
arch/mips/lib/csum_partial.S
Normal file
258
arch/mips/lib/csum_partial.S
Normal file
@ -0,0 +1,258 @@
|
||||
/*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*
|
||||
* Quick'n'dirty IP checksum ...
|
||||
*
|
||||
* Copyright (C) 1998, 1999 Ralf Baechle
|
||||
* Copyright (C) 1999 Silicon Graphics, Inc.
|
||||
*/
|
||||
#include <asm/asm.h>
|
||||
#include <asm/regdef.h>
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
#define T0 ta0
|
||||
#define T1 ta1
|
||||
#define T2 ta2
|
||||
#define T3 ta3
|
||||
#define T4 t0
|
||||
#define T7 t3
|
||||
#else
|
||||
#define T0 t0
|
||||
#define T1 t1
|
||||
#define T2 t2
|
||||
#define T3 t3
|
||||
#define T4 t4
|
||||
#define T7 t7
|
||||
#endif
|
||||
|
||||
#define ADDC(sum,reg) \
|
||||
addu sum, reg; \
|
||||
sltu v1, sum, reg; \
|
||||
addu sum, v1
|
||||
|
||||
#define CSUM_BIGCHUNK(src, offset, sum, _t0, _t1, _t2, _t3) \
|
||||
lw _t0, (offset + 0x00)(src); \
|
||||
lw _t1, (offset + 0x04)(src); \
|
||||
lw _t2, (offset + 0x08)(src); \
|
||||
lw _t3, (offset + 0x0c)(src); \
|
||||
ADDC(sum, _t0); \
|
||||
ADDC(sum, _t1); \
|
||||
ADDC(sum, _t2); \
|
||||
ADDC(sum, _t3); \
|
||||
lw _t0, (offset + 0x10)(src); \
|
||||
lw _t1, (offset + 0x14)(src); \
|
||||
lw _t2, (offset + 0x18)(src); \
|
||||
lw _t3, (offset + 0x1c)(src); \
|
||||
ADDC(sum, _t0); \
|
||||
ADDC(sum, _t1); \
|
||||
ADDC(sum, _t2); \
|
||||
ADDC(sum, _t3); \
|
||||
|
||||
/*
|
||||
* a0: source address
|
||||
* a1: length of the area to checksum
|
||||
* a2: partial checksum
|
||||
*/
|
||||
|
||||
#define src a0
|
||||
#define sum v0
|
||||
|
||||
.text
|
||||
.set noreorder
|
||||
|
||||
/* unknown src alignment and < 8 bytes to go */
|
||||
small_csumcpy:
|
||||
move a1, T2
|
||||
|
||||
andi T0, a1, 4
|
||||
beqz T0, 1f
|
||||
andi T0, a1, 2
|
||||
|
||||
/* Still a full word to go */
|
||||
ulw T1, (src)
|
||||
PTR_ADDIU src, 4
|
||||
ADDC(sum, T1)
|
||||
|
||||
1: move T1, zero
|
||||
beqz T0, 1f
|
||||
andi T0, a1, 1
|
||||
|
||||
/* Still a halfword to go */
|
||||
ulhu T1, (src)
|
||||
PTR_ADDIU src, 2
|
||||
|
||||
1: beqz T0, 1f
|
||||
sll T1, T1, 16
|
||||
|
||||
lbu T2, (src)
|
||||
nop
|
||||
|
||||
#ifdef __MIPSEB__
|
||||
sll T2, T2, 8
|
||||
#endif
|
||||
or T1, T2
|
||||
|
||||
1: ADDC(sum, T1)
|
||||
|
||||
/* fold checksum */
|
||||
sll v1, sum, 16
|
||||
addu sum, v1
|
||||
sltu v1, sum, v1
|
||||
srl sum, sum, 16
|
||||
addu sum, v1
|
||||
|
||||
/* odd buffer alignment? */
|
||||
beqz T7, 1f
|
||||
nop
|
||||
sll v1, sum, 8
|
||||
srl sum, sum, 8
|
||||
or sum, v1
|
||||
andi sum, 0xffff
|
||||
1:
|
||||
.set reorder
|
||||
/* Add the passed partial csum. */
|
||||
ADDC(sum, a2)
|
||||
jr ra
|
||||
.set noreorder
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
.align 5
|
||||
LEAF(csum_partial)
|
||||
move sum, zero
|
||||
move T7, zero
|
||||
|
||||
sltiu t8, a1, 0x8
|
||||
bnez t8, small_csumcpy /* < 8 bytes to copy */
|
||||
move T2, a1
|
||||
|
||||
beqz a1, out
|
||||
andi T7, src, 0x1 /* odd buffer? */
|
||||
|
||||
hword_align:
|
||||
beqz T7, word_align
|
||||
andi t8, src, 0x2
|
||||
|
||||
lbu T0, (src)
|
||||
LONG_SUBU a1, a1, 0x1
|
||||
#ifdef __MIPSEL__
|
||||
sll T0, T0, 8
|
||||
#endif
|
||||
ADDC(sum, T0)
|
||||
PTR_ADDU src, src, 0x1
|
||||
andi t8, src, 0x2
|
||||
|
||||
word_align:
|
||||
beqz t8, dword_align
|
||||
sltiu t8, a1, 56
|
||||
|
||||
lhu T0, (src)
|
||||
LONG_SUBU a1, a1, 0x2
|
||||
ADDC(sum, T0)
|
||||
sltiu t8, a1, 56
|
||||
PTR_ADDU src, src, 0x2
|
||||
|
||||
dword_align:
|
||||
bnez t8, do_end_words
|
||||
move t8, a1
|
||||
|
||||
andi t8, src, 0x4
|
||||
beqz t8, qword_align
|
||||
andi t8, src, 0x8
|
||||
|
||||
lw T0, 0x00(src)
|
||||
LONG_SUBU a1, a1, 0x4
|
||||
ADDC(sum, T0)
|
||||
PTR_ADDU src, src, 0x4
|
||||
andi t8, src, 0x8
|
||||
|
||||
qword_align:
|
||||
beqz t8, oword_align
|
||||
andi t8, src, 0x10
|
||||
|
||||
lw T0, 0x00(src)
|
||||
lw T1, 0x04(src)
|
||||
LONG_SUBU a1, a1, 0x8
|
||||
ADDC(sum, T0)
|
||||
ADDC(sum, T1)
|
||||
PTR_ADDU src, src, 0x8
|
||||
andi t8, src, 0x10
|
||||
|
||||
oword_align:
|
||||
beqz t8, begin_movement
|
||||
LONG_SRL t8, a1, 0x7
|
||||
|
||||
lw T3, 0x08(src)
|
||||
lw T4, 0x0c(src)
|
||||
lw T0, 0x00(src)
|
||||
lw T1, 0x04(src)
|
||||
ADDC(sum, T3)
|
||||
ADDC(sum, T4)
|
||||
ADDC(sum, T0)
|
||||
ADDC(sum, T1)
|
||||
LONG_SUBU a1, a1, 0x10
|
||||
PTR_ADDU src, src, 0x10
|
||||
LONG_SRL t8, a1, 0x7
|
||||
|
||||
begin_movement:
|
||||
beqz t8, 1f
|
||||
andi T2, a1, 0x40
|
||||
|
||||
move_128bytes:
|
||||
CSUM_BIGCHUNK(src, 0x00, sum, T0, T1, T3, T4)
|
||||
CSUM_BIGCHUNK(src, 0x20, sum, T0, T1, T3, T4)
|
||||
CSUM_BIGCHUNK(src, 0x40, sum, T0, T1, T3, T4)
|
||||
CSUM_BIGCHUNK(src, 0x60, sum, T0, T1, T3, T4)
|
||||
LONG_SUBU t8, t8, 0x01
|
||||
bnez t8, move_128bytes
|
||||
PTR_ADDU src, src, 0x80
|
||||
|
||||
1:
|
||||
beqz T2, 1f
|
||||
andi T2, a1, 0x20
|
||||
|
||||
move_64bytes:
|
||||
CSUM_BIGCHUNK(src, 0x00, sum, T0, T1, T3, T4)
|
||||
CSUM_BIGCHUNK(src, 0x20, sum, T0, T1, T3, T4)
|
||||
PTR_ADDU src, src, 0x40
|
||||
|
||||
1:
|
||||
beqz T2, do_end_words
|
||||
andi t8, a1, 0x1c
|
||||
|
||||
move_32bytes:
|
||||
CSUM_BIGCHUNK(src, 0x00, sum, T0, T1, T3, T4)
|
||||
andi t8, a1, 0x1c
|
||||
PTR_ADDU src, src, 0x20
|
||||
|
||||
do_end_words:
|
||||
beqz t8, maybe_end_cruft
|
||||
LONG_SRL t8, t8, 0x2
|
||||
|
||||
end_words:
|
||||
lw T0, (src)
|
||||
LONG_SUBU t8, t8, 0x1
|
||||
ADDC(sum, T0)
|
||||
bnez t8, end_words
|
||||
PTR_ADDU src, src, 0x4
|
||||
|
||||
maybe_end_cruft:
|
||||
andi T2, a1, 0x3
|
||||
|
||||
small_memcpy:
|
||||
j small_csumcpy; move a1, T2 /* XXX ??? */
|
||||
beqz t2, out
|
||||
move a1, T2
|
||||
|
||||
end_bytes:
|
||||
lb T0, (src)
|
||||
LONG_SUBU a1, a1, 0x1
|
||||
bnez a2, end_bytes
|
||||
PTR_ADDU src, src, 0x1
|
||||
|
||||
out:
|
||||
jr ra
|
||||
move v0, sum
|
||||
END(csum_partial)
|
@ -65,15 +65,6 @@ static inline void unmask_cpci_irq(unsigned int irq)
|
||||
value = OCELOT_FPGA_READ(INTMASK);
|
||||
}
|
||||
|
||||
/*
|
||||
* End IRQ processing
|
||||
*/
|
||||
static void end_cpci_irq(unsigned int irq)
|
||||
{
|
||||
if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
|
||||
unmask_cpci_irq(irq);
|
||||
}
|
||||
|
||||
/*
|
||||
* Interrupt handler for interrupts coming from the FPGA chip.
|
||||
* It could be built in ethernet ports etc...
|
||||
@ -98,7 +89,6 @@ struct irq_chip cpci_irq_type = {
|
||||
.mask = mask_cpci_irq,
|
||||
.mask_ack = mask_cpci_irq,
|
||||
.unmask = unmask_cpci_irq,
|
||||
.end = end_cpci_irq,
|
||||
};
|
||||
|
||||
void cpci_irq_init(void)
|
||||
|
@ -59,15 +59,6 @@ static inline void unmask_uart_irq(unsigned int irq)
|
||||
value = OCELOT_FPGA_READ(UART_INTMASK);
|
||||
}
|
||||
|
||||
/*
|
||||
* End IRQ processing
|
||||
*/
|
||||
static void end_uart_irq(unsigned int irq)
|
||||
{
|
||||
if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
|
||||
unmask_uart_irq(irq);
|
||||
}
|
||||
|
||||
/*
|
||||
* Interrupt handler for interrupts coming from the FPGA chip.
|
||||
*/
|
||||
@ -91,7 +82,6 @@ struct irq_chip uart_irq_type = {
|
||||
.mask = mask_uart_irq,
|
||||
.mask_ack = mask_uart_irq,
|
||||
.unmask = unmask_uart_irq,
|
||||
.end = end_uart_irq,
|
||||
};
|
||||
|
||||
void uart_irq_init(void)
|
||||
|
@ -158,20 +158,12 @@ int pnx8550_set_gic_priority(int irq, int priority)
|
||||
return prev_priority;
|
||||
}
|
||||
|
||||
static void end_irq(unsigned int irq)
|
||||
{
|
||||
if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) {
|
||||
unmask_irq(irq);
|
||||
}
|
||||
}
|
||||
|
||||
static struct irq_chip level_irq_type = {
|
||||
.typename = "PNX Level IRQ",
|
||||
.ack = mask_irq,
|
||||
.mask = mask_irq,
|
||||
.mask_ack = mask_irq,
|
||||
.unmask = unmask_irq,
|
||||
.end = end_irq,
|
||||
};
|
||||
|
||||
static struct irqaction gic_action = {
|
||||
|
@ -51,19 +51,12 @@ static void disable_local0_irq(unsigned int irq)
|
||||
sgint->imask0 &= ~(1 << (irq - SGINT_LOCAL0));
|
||||
}
|
||||
|
||||
static void end_local0_irq (unsigned int irq)
|
||||
{
|
||||
if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
|
||||
enable_local0_irq(irq);
|
||||
}
|
||||
|
||||
static struct irq_chip ip22_local0_irq_type = {
|
||||
.typename = "IP22 local 0",
|
||||
.ack = disable_local0_irq,
|
||||
.mask = disable_local0_irq,
|
||||
.mask_ack = disable_local0_irq,
|
||||
.unmask = enable_local0_irq,
|
||||
.end = end_local0_irq,
|
||||
};
|
||||
|
||||
static void enable_local1_irq(unsigned int irq)
|
||||
@ -79,19 +72,12 @@ void disable_local1_irq(unsigned int irq)
|
||||
sgint->imask1 &= ~(1 << (irq - SGINT_LOCAL1));
|
||||
}
|
||||
|
||||
static void end_local1_irq (unsigned int irq)
|
||||
{
|
||||
if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
|
||||
enable_local1_irq(irq);
|
||||
}
|
||||
|
||||
static struct irq_chip ip22_local1_irq_type = {
|
||||
.typename = "IP22 local 1",
|
||||
.ack = disable_local1_irq,
|
||||
.mask = disable_local1_irq,
|
||||
.mask_ack = disable_local1_irq,
|
||||
.unmask = enable_local1_irq,
|
||||
.end = end_local1_irq,
|
||||
};
|
||||
|
||||
static void enable_local2_irq(unsigned int irq)
|
||||
@ -107,19 +93,12 @@ void disable_local2_irq(unsigned int irq)
|
||||
sgint->imask0 &= ~(1 << (SGI_MAP_0_IRQ - SGINT_LOCAL0));
|
||||
}
|
||||
|
||||
static void end_local2_irq (unsigned int irq)
|
||||
{
|
||||
if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
|
||||
enable_local2_irq(irq);
|
||||
}
|
||||
|
||||
static struct irq_chip ip22_local2_irq_type = {
|
||||
.typename = "IP22 local 2",
|
||||
.ack = disable_local2_irq,
|
||||
.mask = disable_local2_irq,
|
||||
.mask_ack = disable_local2_irq,
|
||||
.unmask = enable_local2_irq,
|
||||
.end = end_local2_irq,
|
||||
};
|
||||
|
||||
static void enable_local3_irq(unsigned int irq)
|
||||
@ -135,19 +114,12 @@ void disable_local3_irq(unsigned int irq)
|
||||
sgint->imask1 &= ~(1 << (SGI_MAP_1_IRQ - SGINT_LOCAL1));
|
||||
}
|
||||
|
||||
static void end_local3_irq (unsigned int irq)
|
||||
{
|
||||
if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
|
||||
enable_local3_irq(irq);
|
||||
}
|
||||
|
||||
static struct irq_chip ip22_local3_irq_type = {
|
||||
.typename = "IP22 local 3",
|
||||
.ack = disable_local3_irq,
|
||||
.mask = disable_local3_irq,
|
||||
.mask_ack = disable_local3_irq,
|
||||
.unmask = enable_local3_irq,
|
||||
.end = end_local3_irq,
|
||||
};
|
||||
|
||||
static void indy_local0_irqdispatch(void)
|
||||
|
@ -332,13 +332,6 @@ static inline void disable_bridge_irq(unsigned int irq)
|
||||
intr_disconnect_level(cpu, swlevel);
|
||||
}
|
||||
|
||||
static void end_bridge_irq(unsigned int irq)
|
||||
{
|
||||
if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)) &&
|
||||
irq_desc[irq].action)
|
||||
enable_bridge_irq(irq);
|
||||
}
|
||||
|
||||
static struct irq_chip bridge_irq_type = {
|
||||
.typename = "bridge",
|
||||
.startup = startup_bridge_irq,
|
||||
@ -347,7 +340,6 @@ static struct irq_chip bridge_irq_type = {
|
||||
.mask = disable_bridge_irq,
|
||||
.mask_ack = disable_bridge_irq,
|
||||
.unmask = enable_bridge_irq,
|
||||
.end = end_bridge_irq,
|
||||
};
|
||||
|
||||
void __devinit register_bridge_irq(unsigned int irq)
|
||||
|
@ -180,10 +180,6 @@ static void disable_rt_irq(unsigned int irq)
|
||||
{
|
||||
}
|
||||
|
||||
static void end_rt_irq(unsigned int irq)
|
||||
{
|
||||
}
|
||||
|
||||
static struct irq_chip rt_irq_type = {
|
||||
.typename = "SN HUB RT timer",
|
||||
.ack = disable_rt_irq,
|
||||
@ -191,7 +187,6 @@ static struct irq_chip rt_irq_type = {
|
||||
.mask_ack = disable_rt_irq,
|
||||
.unmask = enable_rt_irq,
|
||||
.eoi = enable_rt_irq,
|
||||
.end = end_rt_irq,
|
||||
};
|
||||
|
||||
static struct irqaction rt_irqaction = {
|
||||
|
@ -43,7 +43,7 @@
|
||||
#elif defined(CONFIG_SIBYTE_SB1250) || defined(CONFIG_SIBYTE_BCM112X)
|
||||
#include <asm/sibyte/sb1250_regs.h>
|
||||
#else
|
||||
#error invalid SiByte board configuation
|
||||
#error invalid SiByte board configuration
|
||||
#endif
|
||||
#include <asm/sibyte/sb1250_genbus.h>
|
||||
#include <asm/sibyte/board.h>
|
||||
@ -53,7 +53,7 @@ extern void bcm1480_setup(void);
|
||||
#elif defined(CONFIG_SIBYTE_SB1250) || defined(CONFIG_SIBYTE_BCM112X)
|
||||
extern void sb1250_setup(void);
|
||||
#else
|
||||
#error invalid SiByte board configuation
|
||||
#error invalid SiByte board configuration
|
||||
#endif
|
||||
|
||||
extern int xicor_probe(void);
|
||||
@ -90,7 +90,7 @@ void __init plat_timer_setup(struct irqaction *irq)
|
||||
#elif defined(CONFIG_SIBYTE_SB1250) || defined(CONFIG_SIBYTE_BCM112X)
|
||||
sb1250_time_init();
|
||||
#else
|
||||
#error invalid SiByte board configuation
|
||||
#error invalid SiByte board configuration
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -111,7 +111,7 @@ void __init plat_mem_setup(void)
|
||||
#elif defined(CONFIG_SIBYTE_SB1250) || defined(CONFIG_SIBYTE_BCM112X)
|
||||
sb1250_setup();
|
||||
#else
|
||||
#error invalid SiByte board configuation
|
||||
#error invalid SiByte board configuration
|
||||
#endif
|
||||
|
||||
panic_timeout = 5; /* For debug. */
|
||||
|
@ -66,12 +66,10 @@
|
||||
#define TX4927_IRQ_CP0_INIT ( 1 << 10 )
|
||||
#define TX4927_IRQ_CP0_ENABLE ( 1 << 13 )
|
||||
#define TX4927_IRQ_CP0_DISABLE ( 1 << 14 )
|
||||
#define TX4927_IRQ_CP0_ENDIRQ ( 1 << 16 )
|
||||
|
||||
#define TX4927_IRQ_PIC_INIT ( 1 << 20 )
|
||||
#define TX4927_IRQ_PIC_ENABLE ( 1 << 23 )
|
||||
#define TX4927_IRQ_PIC_DISABLE ( 1 << 24 )
|
||||
#define TX4927_IRQ_PIC_ENDIRQ ( 1 << 26 )
|
||||
|
||||
#define TX4927_IRQ_ALL 0xffffffff
|
||||
#endif
|
||||
@ -82,12 +80,10 @@ static const u32 tx4927_irq_debug_flag = (TX4927_IRQ_NONE
|
||||
| TX4927_IRQ_WARN | TX4927_IRQ_EROR
|
||||
// | TX4927_IRQ_CP0_INIT
|
||||
// | TX4927_IRQ_CP0_ENABLE
|
||||
// | TX4927_IRQ_CP0_DISABLE
|
||||
// | TX4927_IRQ_CP0_ENDIRQ
|
||||
// | TX4927_IRQ_PIC_INIT
|
||||
// | TX4927_IRQ_PIC_ENABLE
|
||||
// | TX4927_IRQ_PIC_DISABLE
|
||||
// | TX4927_IRQ_PIC_ENDIRQ
|
||||
// | TX4927_IRQ_INIT
|
||||
// | TX4927_IRQ_NEST1
|
||||
// | TX4927_IRQ_NEST2
|
||||
@ -114,11 +110,9 @@ static const u32 tx4927_irq_debug_flag = (TX4927_IRQ_NONE
|
||||
|
||||
static void tx4927_irq_cp0_enable(unsigned int irq);
|
||||
static void tx4927_irq_cp0_disable(unsigned int irq);
|
||||
static void tx4927_irq_cp0_end(unsigned int irq);
|
||||
|
||||
static void tx4927_irq_pic_enable(unsigned int irq);
|
||||
static void tx4927_irq_pic_disable(unsigned int irq);
|
||||
static void tx4927_irq_pic_end(unsigned int irq);
|
||||
|
||||
/*
|
||||
* Kernel structs for all pic's
|
||||
@ -131,7 +125,6 @@ static struct irq_chip tx4927_irq_cp0_type = {
|
||||
.mask = tx4927_irq_cp0_disable,
|
||||
.mask_ack = tx4927_irq_cp0_disable,
|
||||
.unmask = tx4927_irq_cp0_enable,
|
||||
.end = tx4927_irq_cp0_end,
|
||||
};
|
||||
|
||||
#define TX4927_PIC_NAME "TX4927-PIC"
|
||||
@ -141,7 +134,6 @@ static struct irq_chip tx4927_irq_pic_type = {
|
||||
.mask = tx4927_irq_pic_disable,
|
||||
.mask_ack = tx4927_irq_pic_disable,
|
||||
.unmask = tx4927_irq_pic_enable,
|
||||
.end = tx4927_irq_pic_end,
|
||||
};
|
||||
|
||||
#define TX4927_PIC_ACTION(s) { no_action, 0, CPU_MASK_NONE, s, NULL, NULL }
|
||||
@ -214,15 +206,6 @@ static void tx4927_irq_cp0_disable(unsigned int irq)
|
||||
tx4927_irq_cp0_modify(CCP0_STATUS, tx4927_irq_cp0_mask(irq), 0);
|
||||
}
|
||||
|
||||
static void tx4927_irq_cp0_end(unsigned int irq)
|
||||
{
|
||||
TX4927_IRQ_DPRINTK(TX4927_IRQ_CP0_ENDIRQ, "irq=%d \n", irq);
|
||||
|
||||
if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) {
|
||||
tx4927_irq_cp0_enable(irq);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Functions for pic
|
||||
*/
|
||||
@ -376,15 +359,6 @@ static void tx4927_irq_pic_disable(unsigned int irq)
|
||||
tx4927_irq_pic_mask(irq), 0);
|
||||
}
|
||||
|
||||
static void tx4927_irq_pic_end(unsigned int irq)
|
||||
{
|
||||
TX4927_IRQ_DPRINTK(TX4927_IRQ_PIC_ENDIRQ, "irq=%d\n", irq);
|
||||
|
||||
if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) {
|
||||
tx4927_irq_pic_enable(irq);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Main init functions
|
||||
*/
|
||||
|
@ -153,7 +153,6 @@ JP7 is not bus master -- do NOT use -- only 4 pci bus master's allowed -- SouthB
|
||||
#define TOSHIBA_RBTX4927_IRQ_IOC_INIT ( 1 << 10 )
|
||||
#define TOSHIBA_RBTX4927_IRQ_IOC_ENABLE ( 1 << 13 )
|
||||
#define TOSHIBA_RBTX4927_IRQ_IOC_DISABLE ( 1 << 14 )
|
||||
#define TOSHIBA_RBTX4927_IRQ_IOC_ENDIRQ ( 1 << 16 )
|
||||
|
||||
#define TOSHIBA_RBTX4927_IRQ_ISA_INIT ( 1 << 20 )
|
||||
#define TOSHIBA_RBTX4927_IRQ_ISA_ENABLE ( 1 << 23 )
|
||||
@ -172,7 +171,6 @@ static const u32 toshiba_rbtx4927_irq_debug_flag =
|
||||
// | TOSHIBA_RBTX4927_IRQ_IOC_INIT
|
||||
// | TOSHIBA_RBTX4927_IRQ_IOC_ENABLE
|
||||
// | TOSHIBA_RBTX4927_IRQ_IOC_DISABLE
|
||||
// | TOSHIBA_RBTX4927_IRQ_IOC_ENDIRQ
|
||||
// | TOSHIBA_RBTX4927_IRQ_ISA_INIT
|
||||
// | TOSHIBA_RBTX4927_IRQ_ISA_ENABLE
|
||||
// | TOSHIBA_RBTX4927_IRQ_ISA_DISABLE
|
||||
@ -223,7 +221,6 @@ extern void mask_and_ack_8259A(unsigned int irq);
|
||||
|
||||
static void toshiba_rbtx4927_irq_ioc_enable(unsigned int irq);
|
||||
static void toshiba_rbtx4927_irq_ioc_disable(unsigned int irq);
|
||||
static void toshiba_rbtx4927_irq_ioc_end(unsigned int irq);
|
||||
|
||||
#ifdef CONFIG_TOSHIBA_FPCIB0
|
||||
static void toshiba_rbtx4927_irq_isa_enable(unsigned int irq);
|
||||
@ -239,7 +236,6 @@ static struct irq_chip toshiba_rbtx4927_irq_ioc_type = {
|
||||
.mask = toshiba_rbtx4927_irq_ioc_disable,
|
||||
.mask_ack = toshiba_rbtx4927_irq_ioc_disable,
|
||||
.unmask = toshiba_rbtx4927_irq_ioc_enable,
|
||||
.end = toshiba_rbtx4927_irq_ioc_end,
|
||||
};
|
||||
#define TOSHIBA_RBTX4927_IOC_INTR_ENAB 0xbc002000
|
||||
#define TOSHIBA_RBTX4927_IOC_INTR_STAT 0xbc002006
|
||||
@ -388,23 +384,6 @@ static void toshiba_rbtx4927_irq_ioc_disable(unsigned int irq)
|
||||
TOSHIBA_RBTX4927_WR08(TOSHIBA_RBTX4927_IOC_INTR_ENAB, v);
|
||||
}
|
||||
|
||||
static void toshiba_rbtx4927_irq_ioc_end(unsigned int irq)
|
||||
{
|
||||
TOSHIBA_RBTX4927_IRQ_DPRINTK(TOSHIBA_RBTX4927_IRQ_IOC_ENDIRQ,
|
||||
"irq=%d\n", irq);
|
||||
|
||||
if (irq < TOSHIBA_RBTX4927_IRQ_IOC_BEG
|
||||
|| irq > TOSHIBA_RBTX4927_IRQ_IOC_END) {
|
||||
TOSHIBA_RBTX4927_IRQ_DPRINTK(TOSHIBA_RBTX4927_IRQ_EROR,
|
||||
"bad irq=%d\n", irq);
|
||||
panic("\n");
|
||||
}
|
||||
|
||||
if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) {
|
||||
toshiba_rbtx4927_irq_ioc_enable(irq);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**********************************************************************************/
|
||||
/* Functions for isa */
|
||||
|
@ -39,11 +39,9 @@
|
||||
|
||||
static void tx4938_irq_cp0_enable(unsigned int irq);
|
||||
static void tx4938_irq_cp0_disable(unsigned int irq);
|
||||
static void tx4938_irq_cp0_end(unsigned int irq);
|
||||
|
||||
static void tx4938_irq_pic_enable(unsigned int irq);
|
||||
static void tx4938_irq_pic_disable(unsigned int irq);
|
||||
static void tx4938_irq_pic_end(unsigned int irq);
|
||||
|
||||
/**********************************************************************************/
|
||||
/* Kernel structs for all pic's */
|
||||
@ -56,7 +54,6 @@ static struct irq_chip tx4938_irq_cp0_type = {
|
||||
.mask = tx4938_irq_cp0_disable,
|
||||
.mask_ack = tx4938_irq_cp0_disable,
|
||||
.unmask = tx4938_irq_cp0_enable,
|
||||
.end = tx4938_irq_cp0_end,
|
||||
};
|
||||
|
||||
#define TX4938_PIC_NAME "TX4938-PIC"
|
||||
@ -66,7 +63,6 @@ static struct irq_chip tx4938_irq_pic_type = {
|
||||
.mask = tx4938_irq_pic_disable,
|
||||
.mask_ack = tx4938_irq_pic_disable,
|
||||
.unmask = tx4938_irq_pic_enable,
|
||||
.end = tx4938_irq_pic_end,
|
||||
};
|
||||
|
||||
static struct irqaction tx4938_irq_pic_action = {
|
||||
@ -104,14 +100,6 @@ tx4938_irq_cp0_disable(unsigned int irq)
|
||||
clear_c0_status(tx4938_irq_cp0_mask(irq));
|
||||
}
|
||||
|
||||
static void
|
||||
tx4938_irq_cp0_end(unsigned int irq)
|
||||
{
|
||||
if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) {
|
||||
tx4938_irq_cp0_enable(irq);
|
||||
}
|
||||
}
|
||||
|
||||
/**********************************************************************************/
|
||||
/* Functions for pic */
|
||||
/**********************************************************************************/
|
||||
@ -269,14 +257,6 @@ tx4938_irq_pic_disable(unsigned int irq)
|
||||
tx4938_irq_pic_mask(irq), 0);
|
||||
}
|
||||
|
||||
static void
|
||||
tx4938_irq_pic_end(unsigned int irq)
|
||||
{
|
||||
if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) {
|
||||
tx4938_irq_pic_enable(irq);
|
||||
}
|
||||
}
|
||||
|
||||
/**********************************************************************************/
|
||||
/* Main init functions */
|
||||
/**********************************************************************************/
|
||||
|
@ -89,7 +89,6 @@ IRQ Device
|
||||
|
||||
static void toshiba_rbtx4938_irq_ioc_enable(unsigned int irq);
|
||||
static void toshiba_rbtx4938_irq_ioc_disable(unsigned int irq);
|
||||
static void toshiba_rbtx4938_irq_ioc_end(unsigned int irq);
|
||||
|
||||
#define TOSHIBA_RBTX4938_IOC_NAME "RBTX4938-IOC"
|
||||
static struct irq_chip toshiba_rbtx4938_irq_ioc_type = {
|
||||
@ -98,7 +97,6 @@ static struct irq_chip toshiba_rbtx4938_irq_ioc_type = {
|
||||
.mask = toshiba_rbtx4938_irq_ioc_disable,
|
||||
.mask_ack = toshiba_rbtx4938_irq_ioc_disable,
|
||||
.unmask = toshiba_rbtx4938_irq_ioc_enable,
|
||||
.end = toshiba_rbtx4938_irq_ioc_end,
|
||||
};
|
||||
|
||||
#define TOSHIBA_RBTX4938_IOC_INTR_ENAB 0xb7f02000
|
||||
@ -167,14 +165,6 @@ toshiba_rbtx4938_irq_ioc_disable(unsigned int irq)
|
||||
TX4938_RD08(TOSHIBA_RBTX4938_IOC_INTR_ENAB);
|
||||
}
|
||||
|
||||
static void
|
||||
toshiba_rbtx4938_irq_ioc_end(unsigned int irq)
|
||||
{
|
||||
if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) {
|
||||
toshiba_rbtx4938_irq_ioc_enable(irq);
|
||||
}
|
||||
}
|
||||
|
||||
extern void __init txx9_spi_irqinit(int irc_irq);
|
||||
|
||||
void __init arch_init_irq(void)
|
||||
|
@ -6,6 +6,7 @@ config CASIO_E55
|
||||
select ISA
|
||||
select SYS_SUPPORTS_32BIT_KERNEL
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
select GENERIC_HARDIRQS_NO__DO_IRQ
|
||||
|
||||
config IBM_WORKPAD
|
||||
bool "Support for IBM WorkPad z50"
|
||||
@ -15,6 +16,7 @@ config IBM_WORKPAD
|
||||
select ISA
|
||||
select SYS_SUPPORTS_32BIT_KERNEL
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
select GENERIC_HARDIRQS_NO__DO_IRQ
|
||||
|
||||
config NEC_CMBVR4133
|
||||
bool "Support for NEC CMB-VR4133"
|
||||
@ -39,6 +41,7 @@ config TANBAC_TB022X
|
||||
select IRQ_CPU
|
||||
select SYS_SUPPORTS_32BIT_KERNEL
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
select GENERIC_HARDIRQS_NO__DO_IRQ
|
||||
help
|
||||
The TANBAC VR4131 multichip module(TB0225) and
|
||||
the TANBAC VR4131DIMM(TB0229) are MIPS-based platforms
|
||||
@ -71,6 +74,7 @@ config VICTOR_MPC30X
|
||||
select IRQ_CPU
|
||||
select SYS_SUPPORTS_32BIT_KERNEL
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
select GENERIC_HARDIRQS_NO__DO_IRQ
|
||||
|
||||
config ZAO_CAPCELLA
|
||||
bool "Support for ZAO Networks Capcella"
|
||||
@ -80,6 +84,7 @@ config ZAO_CAPCELLA
|
||||
select IRQ_CPU
|
||||
select SYS_SUPPORTS_32BIT_KERNEL
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
select GENERIC_HARDIRQS_NO__DO_IRQ
|
||||
|
||||
config PCI_VR41XX
|
||||
bool "Add PCI control unit support of NEC VR4100 series"
|
||||
|
@ -427,19 +427,12 @@ static void enable_sysint1_irq(unsigned int irq)
|
||||
icu1_set(MSYSINT1REG, 1 << SYSINT1_IRQ_TO_PIN(irq));
|
||||
}
|
||||
|
||||
static void end_sysint1_irq(unsigned int irq)
|
||||
{
|
||||
if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS)))
|
||||
icu1_set(MSYSINT1REG, 1 << SYSINT1_IRQ_TO_PIN(irq));
|
||||
}
|
||||
|
||||
static struct irq_chip sysint1_irq_type = {
|
||||
.typename = "SYSINT1",
|
||||
.ack = disable_sysint1_irq,
|
||||
.mask = disable_sysint1_irq,
|
||||
.mask_ack = disable_sysint1_irq,
|
||||
.unmask = enable_sysint1_irq,
|
||||
.end = end_sysint1_irq,
|
||||
};
|
||||
|
||||
static void disable_sysint2_irq(unsigned int irq)
|
||||
@ -452,19 +445,12 @@ static void enable_sysint2_irq(unsigned int irq)
|
||||
icu2_set(MSYSINT2REG, 1 << SYSINT2_IRQ_TO_PIN(irq));
|
||||
}
|
||||
|
||||
static void end_sysint2_irq(unsigned int irq)
|
||||
{
|
||||
if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS)))
|
||||
icu2_set(MSYSINT2REG, 1 << SYSINT2_IRQ_TO_PIN(irq));
|
||||
}
|
||||
|
||||
static struct irq_chip sysint2_irq_type = {
|
||||
.typename = "SYSINT2",
|
||||
.ack = disable_sysint2_irq,
|
||||
.mask = disable_sysint2_irq,
|
||||
.mask_ack = disable_sysint2_irq,
|
||||
.unmask = enable_sysint2_irq,
|
||||
.end = end_sysint2_irq,
|
||||
};
|
||||
|
||||
static inline int set_sysint1_assign(unsigned int irq, unsigned char assign)
|
||||
|
1
arch/powerpc/.gitignore
vendored
Normal file
1
arch/powerpc/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
include
|
@ -112,7 +112,7 @@ choice
|
||||
default 6xx
|
||||
|
||||
config CLASSIC32
|
||||
bool "6xx/7xx/74xx"
|
||||
bool "52xx/6xx/7xx/74xx"
|
||||
select PPC_FPU
|
||||
select 6xx
|
||||
help
|
||||
@ -121,16 +121,18 @@ config CLASSIC32
|
||||
versions (821, 823, 850, 855, 860, 52xx, 82xx, 83xx), the AMCC
|
||||
embedded versions (403 and 405) and the high end 64 bit Power
|
||||
processors (POWER 3, POWER4, and IBM PPC970 also known as G5).
|
||||
|
||||
This option is the catch-all for 6xx types, including some of the
|
||||
embedded versions. Unless there is see an option for the specific
|
||||
chip family you are using, you want this option.
|
||||
|
||||
You do not want this if you are building a kernel for a 64 bit
|
||||
IBM RS/6000 or an Apple G5, choose 6xx.
|
||||
|
||||
If unsure, select this option
|
||||
|
||||
Unless you are building a kernel for one of the embedded processor
|
||||
systems, 64 bit IBM RS/6000 or an Apple G5, choose 6xx.
|
||||
Note that the kernel runs in 32-bit mode even on 64-bit chips.
|
||||
|
||||
config PPC_52xx
|
||||
bool "Freescale 52xx"
|
||||
select 6xx
|
||||
select PPC_FPU
|
||||
|
||||
config PPC_82xx
|
||||
bool "Freescale 82xx"
|
||||
select 6xx
|
||||
@ -160,9 +162,11 @@ config PPC_86xx
|
||||
|
||||
config 40x
|
||||
bool "AMCC 40x"
|
||||
select PPC_DCR_NATIVE
|
||||
|
||||
config 44x
|
||||
bool "AMCC 44x"
|
||||
select PPC_DCR_NATIVE
|
||||
|
||||
config 8xx
|
||||
bool "Freescale 8xx"
|
||||
@ -208,6 +212,24 @@ config PPC_FPU
|
||||
bool
|
||||
default y if PPC64
|
||||
|
||||
config PPC_DCR_NATIVE
|
||||
bool
|
||||
default n
|
||||
|
||||
config PPC_DCR_MMIO
|
||||
bool
|
||||
default n
|
||||
|
||||
config PPC_DCR
|
||||
bool
|
||||
depends on PPC_DCR_NATIVE || PPC_DCR_MMIO
|
||||
default y
|
||||
|
||||
config PPC_OF_PLATFORM_PCI
|
||||
bool
|
||||
depends on PPC64 # not supported on 32 bits yet
|
||||
default n
|
||||
|
||||
config BOOKE
|
||||
bool
|
||||
depends on E200 || E500
|
||||
@ -227,6 +249,7 @@ config PTE_64BIT
|
||||
config PHYS_64BIT
|
||||
bool 'Large physical address support' if E500
|
||||
depends on 44x || E500
|
||||
select RESOURCES_64BIT
|
||||
default y if 44x
|
||||
---help---
|
||||
This option enables kernel support for larger than 32-bit physical
|
||||
@ -369,11 +392,13 @@ config PPC_PSERIES
|
||||
select PPC_RTAS
|
||||
select RTAS_ERROR_LOGGING
|
||||
select PPC_UDBG_16550
|
||||
select PPC_NATIVE
|
||||
default y
|
||||
|
||||
config PPC_ISERIES
|
||||
bool "IBM Legacy iSeries"
|
||||
depends on PPC_MULTIPLATFORM && PPC64
|
||||
select PPC_INDIRECT_IO
|
||||
|
||||
config PPC_CHRP
|
||||
bool "Common Hardware Reference Platform (CHRP) based machines"
|
||||
@ -384,14 +409,35 @@ config PPC_CHRP
|
||||
select PPC_RTAS
|
||||
select PPC_MPC106
|
||||
select PPC_UDBG_16550
|
||||
select PPC_NATIVE
|
||||
default y
|
||||
|
||||
config PPC_MPC52xx
|
||||
bool
|
||||
default n
|
||||
|
||||
config PPC_EFIKA
|
||||
bool "bPlan Efika 5k2. MPC5200B based computer"
|
||||
depends on PPC_MULTIPLATFORM && PPC32
|
||||
select PPC_RTAS
|
||||
select RTAS_PROC
|
||||
select PPC_MPC52xx
|
||||
select PPC_NATIVE
|
||||
default y
|
||||
|
||||
config PPC_LITE5200
|
||||
bool "Freescale Lite5200 Eval Board"
|
||||
depends on PPC_MULTIPLATFORM && PPC32
|
||||
select PPC_MPC52xx
|
||||
default n
|
||||
|
||||
config PPC_PMAC
|
||||
bool "Apple PowerMac based machines"
|
||||
depends on PPC_MULTIPLATFORM
|
||||
select MPIC
|
||||
select PPC_INDIRECT_PCI if PPC32
|
||||
select PPC_MPC106 if PPC32
|
||||
select PPC_NATIVE
|
||||
default y
|
||||
|
||||
config PPC_PMAC64
|
||||
@ -411,6 +457,7 @@ config PPC_PREP
|
||||
select PPC_I8259
|
||||
select PPC_INDIRECT_PCI
|
||||
select PPC_UDBG_16550
|
||||
select PPC_NATIVE
|
||||
default y
|
||||
|
||||
config PPC_MAPLE
|
||||
@ -422,6 +469,7 @@ config PPC_MAPLE
|
||||
select GENERIC_TBSYNC
|
||||
select PPC_UDBG_16550
|
||||
select PPC_970_NAP
|
||||
select PPC_NATIVE
|
||||
default n
|
||||
help
|
||||
This option enables support for the Maple 970FX Evaluation Board.
|
||||
@ -434,6 +482,7 @@ config PPC_PASEMI
|
||||
select MPIC
|
||||
select PPC_UDBG_16550
|
||||
select GENERIC_TBSYNC
|
||||
select PPC_NATIVE
|
||||
help
|
||||
This option enables support for PA Semi's PWRficient line
|
||||
of SoC processors, including PA6T-1682M
|
||||
@ -445,6 +494,11 @@ config PPC_CELL
|
||||
config PPC_CELL_NATIVE
|
||||
bool
|
||||
select PPC_CELL
|
||||
select PPC_DCR_MMIO
|
||||
select PPC_OF_PLATFORM_PCI
|
||||
select PPC_INDIRECT_IO
|
||||
select PPC_NATIVE
|
||||
select MPIC
|
||||
default n
|
||||
|
||||
config PPC_IBM_CELL_BLADE
|
||||
@ -456,6 +510,22 @@ config PPC_IBM_CELL_BLADE
|
||||
select PPC_UDBG_16550
|
||||
select UDBG_RTAS_CONSOLE
|
||||
|
||||
config PPC_PS3
|
||||
bool "Sony PS3"
|
||||
depends on PPC_MULTIPLATFORM && PPC64
|
||||
select PPC_CELL
|
||||
help
|
||||
This option enables support for the Sony PS3 game console
|
||||
and other platforms using the PS3 hypervisor.
|
||||
|
||||
config PPC_NATIVE
|
||||
bool
|
||||
depends on PPC_MULTIPLATFORM
|
||||
help
|
||||
Support for running natively on the hardware, i.e. without
|
||||
a hypervisor. This option is not user-selectable but should
|
||||
be selected by all platforms that need it.
|
||||
|
||||
config UDBG_RTAS_CONSOLE
|
||||
bool "RTAS based debug console"
|
||||
depends on PPC_RTAS
|
||||
@ -517,6 +587,15 @@ config PPC_970_NAP
|
||||
bool
|
||||
default n
|
||||
|
||||
config PPC_INDIRECT_IO
|
||||
bool
|
||||
select GENERIC_IOMAP
|
||||
default n
|
||||
|
||||
config GENERIC_IOMAP
|
||||
bool
|
||||
default n
|
||||
|
||||
source "drivers/cpufreq/Kconfig"
|
||||
|
||||
config CPU_FREQ_PMAC
|
||||
@ -594,12 +673,6 @@ config TAU_AVERAGE
|
||||
|
||||
If in doubt, say N here.
|
||||
|
||||
config PPC_TODC
|
||||
depends on EMBEDDED6xx
|
||||
bool "Generic Time-of-day Clock (TODC) support"
|
||||
---help---
|
||||
This adds support for many TODC/RTC chips.
|
||||
|
||||
endmenu
|
||||
|
||||
source arch/powerpc/platforms/embedded6xx/Kconfig
|
||||
@ -610,6 +683,7 @@ source arch/powerpc/platforms/85xx/Kconfig
|
||||
source arch/powerpc/platforms/86xx/Kconfig
|
||||
source arch/powerpc/platforms/8xx/Kconfig
|
||||
source arch/powerpc/platforms/cell/Kconfig
|
||||
source arch/powerpc/platforms/ps3/Kconfig
|
||||
|
||||
menu "Kernel options"
|
||||
|
||||
@ -790,7 +864,6 @@ source "arch/powerpc/platforms/prep/Kconfig"
|
||||
|
||||
config CMDLINE_BOOL
|
||||
bool "Default bootloader kernel arguments"
|
||||
depends on !PPC_ISERIES
|
||||
|
||||
config CMDLINE
|
||||
string "Initial kernel command string"
|
||||
@ -880,7 +953,7 @@ config MCA
|
||||
|
||||
config PCI
|
||||
bool "PCI support" if 40x || CPM2 || PPC_83xx || PPC_85xx || PPC_86xx \
|
||||
|| PPC_MPC52xx || (EMBEDDED && PPC_ISERIES) || MPC7448HPC2
|
||||
|| PPC_MPC52xx || (EMBEDDED && PPC_ISERIES) || MPC7448HPC2 || PPC_PS3
|
||||
default y if !40x && !CPM2 && !8xx && !APUS && !PPC_83xx \
|
||||
&& !PPC_85xx && !PPC_86xx
|
||||
default PCI_PERMEDIA if !4xx && !CPM2 && !8xx && APUS
|
||||
|
@ -77,7 +77,7 @@ config KGDB_CONSOLE
|
||||
|
||||
config XMON
|
||||
bool "Include xmon kernel debugger"
|
||||
depends on DEBUGGER && !PPC_ISERIES
|
||||
depends on DEBUGGER
|
||||
help
|
||||
Include in-kernel hooks for the xmon kernel monitor/debugger.
|
||||
Unless you are intending to debug the kernel, say N here.
|
||||
@ -98,6 +98,15 @@ config XMON_DEFAULT
|
||||
xmon is normally disabled unless booted with 'xmon=on'.
|
||||
Use 'xmon=off' to disable xmon init during runtime.
|
||||
|
||||
config XMON_DISASSEMBLY
|
||||
bool "Include disassembly support in xmon"
|
||||
depends on XMON
|
||||
default y
|
||||
help
|
||||
Include support for disassembling in xmon. You probably want
|
||||
to say Y here, unless you're building for a memory-constrained
|
||||
system.
|
||||
|
||||
config IRQSTACKS
|
||||
bool "Use separate kernel stacks when processing interrupts"
|
||||
depends on PPC64
|
||||
@ -116,7 +125,7 @@ config BDI_SWITCH
|
||||
|
||||
config BOOTX_TEXT
|
||||
bool "Support for early boot text console (BootX or OpenFirmware only)"
|
||||
depends PPC_OF && !PPC_ISERIES
|
||||
depends PPC_OF
|
||||
help
|
||||
Say Y here to see progress messages from the boot firmware in text
|
||||
mode. Requires either BootX or Open Firmware.
|
||||
|
13
arch/powerpc/boot/.gitignore
vendored
13
arch/powerpc/boot/.gitignore
vendored
@ -1,19 +1,32 @@
|
||||
addnote
|
||||
empty.c
|
||||
hack-coff
|
||||
infblock.c
|
||||
infblock.h
|
||||
infcodes.c
|
||||
infcodes.h
|
||||
inffast.c
|
||||
inffast.h
|
||||
inffixed.h
|
||||
inflate.c
|
||||
inflate.h
|
||||
inftrees.c
|
||||
inftrees.h
|
||||
infutil.c
|
||||
infutil.h
|
||||
kernel-vmlinux.strip.c
|
||||
kernel-vmlinux.strip.gz
|
||||
mktree
|
||||
uImage
|
||||
zImage
|
||||
zImage.chrp
|
||||
zImage.coff
|
||||
zImage.coff.lds
|
||||
zImage.lds
|
||||
zImage.miboot
|
||||
zImage.pmac
|
||||
zImage.pseries
|
||||
zImage.sandpoint
|
||||
zImage.vmode
|
||||
zconf.h
|
||||
zlib.h
|
||||
|
@ -40,7 +40,8 @@ zliblinuxheader := zlib.h zconf.h zutil.h
|
||||
$(addprefix $(obj)/,$(zlib) main.o): $(addprefix $(obj)/,$(zliblinuxheader)) \
|
||||
$(addprefix $(obj)/,$(zlibheader))
|
||||
|
||||
src-wlib := string.S stdio.c main.c div64.S $(zlib)
|
||||
src-wlib := string.S stdio.c main.c flatdevtree.c flatdevtree_misc.c \
|
||||
ns16550.c serial.c simple_alloc.c div64.S util.S $(zlib)
|
||||
src-plat := of.c
|
||||
src-boot := crt0.S $(src-wlib) $(src-plat) empty.c
|
||||
|
||||
@ -74,7 +75,7 @@ $(obj)/zImage.lds $(obj)/zImage.coff.lds: $(obj)/%: $(srctree)/$(src)/%.S
|
||||
@cp $< $@
|
||||
|
||||
clean-files := $(zlib) $(zlibheader) $(zliblinuxheader) \
|
||||
$(obj)/empty.c
|
||||
empty.c zImage zImage.coff.lds zImage.lds zImage.sandpoint
|
||||
|
||||
quiet_cmd_bootcc = BOOTCC $@
|
||||
cmd_bootcc = $(CROSS32CC) -Wp,-MD,$(depfile) $(BOOTCFLAGS) -c -o $@ $<
|
||||
@ -93,13 +94,13 @@ $(patsubst %.S,%.o, $(filter %.S, $(src-boot))): %.o: %.S
|
||||
$(obj)/wrapper.a: $(obj-wlib)
|
||||
$(call cmd,bootar)
|
||||
|
||||
hostprogs-y := addnote addRamDisk hack-coff
|
||||
hostprogs-y := addnote addRamDisk hack-coff mktree
|
||||
|
||||
extra-y := $(obj)/crt0.o $(obj)/wrapper.a $(obj-plat) $(obj)/empty.o \
|
||||
$(obj)/zImage.lds $(obj)/zImage.coff.lds
|
||||
|
||||
wrapper :=$(srctree)/$(src)/wrapper
|
||||
wrapperbits := $(extra-y) $(addprefix $(obj)/,addnote hack-coff)
|
||||
wrapperbits := $(extra-y) $(addprefix $(obj)/,addnote hack-coff mktree)
|
||||
|
||||
#############
|
||||
# Bits for building various flavours of zImage
|
||||
@ -148,13 +149,18 @@ $(obj)/zImage.miboot: vmlinux $(wrapperbits)
|
||||
$(obj)/zImage.initrd.miboot: vmlinux $(wrapperbits)
|
||||
$(call cmd,wrap_initrd,miboot)
|
||||
|
||||
$(obj)/zImage.ps3: vmlinux
|
||||
$(STRIP) -s -R .comment $< -o $@
|
||||
|
||||
$(obj)/uImage: vmlinux $(wrapperbits)
|
||||
$(call cmd,wrap,uboot)
|
||||
|
||||
image-$(CONFIG_PPC_PSERIES) += zImage.pseries
|
||||
image-$(CONFIG_PPC_MAPLE) += zImage.pseries
|
||||
image-$(CONFIG_PPC_IBM_CELL_BLADE) += zImage.pseries
|
||||
image-$(CONFIG_PPC_PS3) += zImage.ps3
|
||||
image-$(CONFIG_PPC_CHRP) += zImage.chrp
|
||||
image-$(CONFIG_PPC_EFIKA) += zImage.chrp
|
||||
image-$(CONFIG_PPC_PMAC) += zImage.pmac
|
||||
image-$(CONFIG_DEFAULT_UIMAGE) += uImage
|
||||
|
||||
@ -176,3 +182,4 @@ install: $(CONFIGURE) $(image-y)
|
||||
|
||||
clean-files += $(addprefix $(objtree)/, $(obj-boot) vmlinux.strip.gz)
|
||||
clean-files += $(addprefix $(objtree)/, $(obj-boot) vmlinux.bin.gz)
|
||||
clean-files += $(image-)
|
||||
|
148
arch/powerpc/boot/dts/kuroboxHG.dts
Normal file
148
arch/powerpc/boot/dts/kuroboxHG.dts
Normal file
@ -0,0 +1,148 @@
|
||||
/*
|
||||
* Device Tree Souce for Buffalo KuroboxHG
|
||||
*
|
||||
* Choose CONFIG_LINKSTATION to build a kernel for KuroboxHG, or use
|
||||
* the default configuration linkstation_defconfig.
|
||||
*
|
||||
* Based on sandpoint.dts
|
||||
*
|
||||
* 2006 (c) G. Liakhovetski <g.liakhovetski@gmx.de>
|
||||
*
|
||||
* This file is licensed under
|
||||
* the terms of the GNU General Public License version 2. This program
|
||||
* is licensed "as is" without any warranty of any kind, whether express
|
||||
* or implied.
|
||||
|
||||
XXXX add flash parts, rtc, ??
|
||||
|
||||
build with: "dtc -f -I dts -O dtb -o kuroboxHG.dtb -V 16 kuroboxHG.dts"
|
||||
|
||||
|
||||
*/
|
||||
|
||||
/ {
|
||||
linux,phandle = <1000>;
|
||||
model = "KuroboxHG";
|
||||
compatible = "linkstation";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
cpus {
|
||||
linux,phandle = <2000>;
|
||||
#cpus = <1>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
PowerPC,603e { /* Really 8241 */
|
||||
linux,phandle = <2100>;
|
||||
linux,boot-cpu;
|
||||
device_type = "cpu";
|
||||
reg = <0>;
|
||||
clock-frequency = <fdad680>; /* Fixed by bootwrapper */
|
||||
timebase-frequency = <1F04000>; /* Fixed by bootwrapper */
|
||||
bus-frequency = <0>; /* From bootloader */
|
||||
/* Following required by dtc but not used */
|
||||
i-cache-line-size = <0>;
|
||||
d-cache-line-size = <0>;
|
||||
i-cache-size = <4000>;
|
||||
d-cache-size = <4000>;
|
||||
};
|
||||
};
|
||||
|
||||
memory {
|
||||
linux,phandle = <3000>;
|
||||
device_type = "memory";
|
||||
reg = <00000000 08000000>;
|
||||
};
|
||||
|
||||
soc10x { /* AFAICT need to make soc for 8245's uarts to be defined */
|
||||
linux,phandle = <4000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
#interrupt-cells = <2>;
|
||||
device_type = "soc";
|
||||
compatible = "mpc10x";
|
||||
store-gathering = <0>; /* 0 == off, !0 == on */
|
||||
reg = <80000000 00100000>;
|
||||
ranges = <80000000 80000000 70000000 /* pci mem space */
|
||||
fc000000 fc000000 00100000 /* EUMB */
|
||||
fe000000 fe000000 00c00000 /* pci i/o space */
|
||||
fec00000 fec00000 00300000 /* pci cfg regs */
|
||||
fef00000 fef00000 00100000>; /* pci iack */
|
||||
|
||||
i2c@80003000 {
|
||||
linux,phandle = <4300>;
|
||||
device_type = "i2c";
|
||||
compatible = "fsl-i2c";
|
||||
reg = <80003000 1000>;
|
||||
interrupts = <5 2>;
|
||||
interrupt-parent = <4400>;
|
||||
};
|
||||
|
||||
serial@80004500 {
|
||||
linux,phandle = <4511>;
|
||||
device_type = "serial";
|
||||
compatible = "ns16550";
|
||||
reg = <80004500 8>;
|
||||
clock-frequency = <7c044a8>;
|
||||
current-speed = <2580>;
|
||||
interrupts = <9 2>;
|
||||
interrupt-parent = <4400>;
|
||||
};
|
||||
|
||||
serial@80004600 {
|
||||
linux,phandle = <4512>;
|
||||
device_type = "serial";
|
||||
compatible = "ns16550";
|
||||
reg = <80004600 8>;
|
||||
clock-frequency = <7c044a8>;
|
||||
current-speed = <e100>;
|
||||
interrupts = <a 0>;
|
||||
interrupt-parent = <4400>;
|
||||
};
|
||||
|
||||
pic@80040000 {
|
||||
linux,phandle = <4400>;
|
||||
#interrupt-cells = <2>;
|
||||
#address-cells = <0>;
|
||||
device_type = "open-pic";
|
||||
compatible = "chrp,open-pic";
|
||||
interrupt-controller;
|
||||
reg = <80040000 40000>;
|
||||
built-in;
|
||||
};
|
||||
|
||||
pci@fec00000 {
|
||||
linux,phandle = <4500>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
#interrupt-cells = <1>;
|
||||
device_type = "pci";
|
||||
compatible = "mpc10x-pci";
|
||||
reg = <fec00000 400000>;
|
||||
ranges = <01000000 0 0 fe000000 0 00c00000
|
||||
02000000 0 80000000 80000000 0 70000000>;
|
||||
bus-range = <0 ff>;
|
||||
clock-frequency = <7f28155>;
|
||||
interrupt-parent = <4400>;
|
||||
interrupt-map-mask = <f800 0 0 7>;
|
||||
interrupt-map = <
|
||||
/* IDSEL 0x11 - IRQ0 ETH */
|
||||
5800 0 0 1 4400 0 1
|
||||
5800 0 0 2 4400 1 1
|
||||
5800 0 0 3 4400 2 1
|
||||
5800 0 0 4 4400 3 1
|
||||
/* IDSEL 0x12 - IRQ1 IDE0 */
|
||||
6000 0 0 1 4400 1 1
|
||||
6000 0 0 2 4400 2 1
|
||||
6000 0 0 3 4400 3 1
|
||||
6000 0 0 4 4400 0 1
|
||||
/* IDSEL 0x14 - IRQ3 USB2.0 */
|
||||
7000 0 0 1 4400 3 1
|
||||
7000 0 0 2 4400 3 1
|
||||
7000 0 0 3 4400 3 1
|
||||
7000 0 0 4 4400 3 1
|
||||
>;
|
||||
};
|
||||
};
|
||||
};
|
313
arch/powerpc/boot/dts/lite5200.dts
Normal file
313
arch/powerpc/boot/dts/lite5200.dts
Normal file
@ -0,0 +1,313 @@
|
||||
/*
|
||||
* Lite5200 board Device Tree Source
|
||||
*
|
||||
* Copyright 2006 Secret Lab Technologies Ltd.
|
||||
* Grant Likely <grant.likely@secretlab.ca>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*/
|
||||
|
||||
/ {
|
||||
model = "Lite5200";
|
||||
compatible = "lite5200\0lite52xx\0mpc5200\0mpc52xx";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
cpus {
|
||||
#cpus = <1>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
PowerPC,5200@0 {
|
||||
device_type = "cpu";
|
||||
reg = <0>;
|
||||
d-cache-line-size = <20>;
|
||||
i-cache-line-size = <20>;
|
||||
d-cache-size = <4000>; // L1, 16K
|
||||
i-cache-size = <4000>; // L1, 16K
|
||||
timebase-frequency = <0>; // from bootloader
|
||||
bus-frequency = <0>; // from bootloader
|
||||
clock-frequency = <0>; // from bootloader
|
||||
32-bit;
|
||||
};
|
||||
};
|
||||
|
||||
memory {
|
||||
device_type = "memory";
|
||||
reg = <00000000 04000000>; // 64MB
|
||||
};
|
||||
|
||||
soc5200@f0000000 {
|
||||
#interrupt-cells = <3>;
|
||||
device_type = "soc";
|
||||
ranges = <0 f0000000 f0010000>;
|
||||
reg = <f0000000 00010000>;
|
||||
bus-frequency = <0>; // from bootloader
|
||||
|
||||
cdm@200 {
|
||||
compatible = "mpc5200-cdm\0mpc52xx-cdm";
|
||||
reg = <200 38>;
|
||||
};
|
||||
|
||||
pic@500 {
|
||||
// 5200 interrupts are encoded into two levels;
|
||||
linux,phandle = <500>;
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <3>;
|
||||
device_type = "interrupt-controller";
|
||||
compatible = "mpc5200-pic\0mpc52xx-pic";
|
||||
reg = <500 80>;
|
||||
built-in;
|
||||
};
|
||||
|
||||
gpt@600 { // General Purpose Timer
|
||||
compatible = "mpc5200-gpt\0mpc52xx-gpt";
|
||||
device_type = "gpt";
|
||||
reg = <600 10>;
|
||||
interrupts = <1 9 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
gpt@610 { // General Purpose Timer
|
||||
compatible = "mpc5200-gpt\0mpc52xx-gpt";
|
||||
device_type = "gpt";
|
||||
reg = <610 10>;
|
||||
interrupts = <1 a 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
gpt@620 { // General Purpose Timer
|
||||
compatible = "mpc5200-gpt\0mpc52xx-gpt";
|
||||
device_type = "gpt";
|
||||
reg = <620 10>;
|
||||
interrupts = <1 b 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
gpt@630 { // General Purpose Timer
|
||||
compatible = "mpc5200-gpt\0mpc52xx-gpt";
|
||||
device_type = "gpt";
|
||||
reg = <630 10>;
|
||||
interrupts = <1 c 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
gpt@640 { // General Purpose Timer
|
||||
compatible = "mpc5200-gpt\0mpc52xx-gpt";
|
||||
device_type = "gpt";
|
||||
reg = <640 10>;
|
||||
interrupts = <1 d 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
gpt@650 { // General Purpose Timer
|
||||
compatible = "mpc5200-gpt\0mpc52xx-gpt";
|
||||
device_type = "gpt";
|
||||
reg = <650 10>;
|
||||
interrupts = <1 e 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
gpt@660 { // General Purpose Timer
|
||||
compatible = "mpc5200-gpt\0mpc52xx-gpt";
|
||||
device_type = "gpt";
|
||||
reg = <660 10>;
|
||||
interrupts = <1 f 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
gpt@670 { // General Purpose Timer
|
||||
compatible = "mpc5200-gpt\0mpc52xx-gpt";
|
||||
device_type = "gpt";
|
||||
reg = <670 10>;
|
||||
interrupts = <1 10 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
rtc@800 { // Real time clock
|
||||
compatible = "mpc5200-rtc\0mpc52xx-rtc";
|
||||
device_type = "rtc";
|
||||
reg = <800 100>;
|
||||
interrupts = <1 5 0 1 6 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
mscan@900 {
|
||||
device_type = "mscan";
|
||||
compatible = "mpc5200-mscan\0mpc52xx-mscan";
|
||||
interrupts = <2 11 0>;
|
||||
interrupt-parent = <500>;
|
||||
reg = <900 80>;
|
||||
};
|
||||
|
||||
mscan@980 {
|
||||
device_type = "mscan";
|
||||
compatible = "mpc5200-mscan\0mpc52xx-mscan";
|
||||
interrupts = <1 12 0>;
|
||||
interrupt-parent = <500>;
|
||||
reg = <980 80>;
|
||||
};
|
||||
|
||||
gpio@b00 {
|
||||
compatible = "mpc5200-gpio\0mpc52xx-gpio";
|
||||
reg = <b00 40>;
|
||||
interrupts = <1 7 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
gpio-wkup@b00 {
|
||||
compatible = "mpc5200-gpio-wkup\0mpc52xx-gpio-wkup";
|
||||
reg = <c00 40>;
|
||||
interrupts = <1 8 0 0 3 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
pci@0d00 {
|
||||
#interrupt-cells = <1>;
|
||||
#size-cells = <2>;
|
||||
#address-cells = <3>;
|
||||
device_type = "pci";
|
||||
compatible = "mpc5200-pci\0mpc52xx-pci";
|
||||
reg = <d00 100>;
|
||||
interrupt-map-mask = <f800 0 0 7>;
|
||||
interrupt-map = <c000 0 0 1 500 0 0 3
|
||||
c000 0 0 2 500 0 0 3
|
||||
c000 0 0 3 500 0 0 3
|
||||
c000 0 0 4 500 0 0 3>;
|
||||
clock-frequency = <0>; // From boot loader
|
||||
interrupts = <2 8 0 2 9 0 2 a 0>;
|
||||
interrupt-parent = <500>;
|
||||
bus-range = <0 0>;
|
||||
ranges = <42000000 0 80000000 80000000 0 20000000
|
||||
02000000 0 a0000000 a0000000 0 10000000
|
||||
01000000 0 00000000 b0000000 0 01000000>;
|
||||
};
|
||||
|
||||
spi@f00 {
|
||||
device_type = "spi";
|
||||
compatible = "mpc5200-spi\0mpc52xx-spi";
|
||||
reg = <f00 20>;
|
||||
interrupts = <2 d 0 2 e 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
usb@1000 {
|
||||
device_type = "usb-ohci-be";
|
||||
compatible = "mpc5200-ohci\0mpc52xx-ohci\0ohci-be";
|
||||
reg = <1000 ff>;
|
||||
interrupts = <2 6 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
bestcomm@1200 {
|
||||
device_type = "dma-controller";
|
||||
compatible = "mpc5200-bestcomm\0mpc52xx-bestcomm";
|
||||
reg = <1200 80>;
|
||||
interrupts = <3 0 0 3 1 0 3 2 0 3 3 0
|
||||
3 4 0 3 5 0 3 6 0 3 7 0
|
||||
3 8 0 3 9 0 3 a 0 3 b 0
|
||||
3 c 0 3 d 0 3 e 0 3 f 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
xlb@1f00 {
|
||||
compatible = "mpc5200-xlb\0mpc52xx-xlb";
|
||||
reg = <1f00 100>;
|
||||
};
|
||||
|
||||
serial@2000 { // PSC1
|
||||
device_type = "serial";
|
||||
compatible = "mpc5200-psc-uart\0mpc52xx-psc-uart";
|
||||
port-number = <0>; // Logical port assignment
|
||||
reg = <2000 100>;
|
||||
interrupts = <2 1 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
// PSC2 in spi mode example
|
||||
spi@2200 { // PSC2
|
||||
device_type = "spi";
|
||||
compatible = "mpc5200-psc-spi\0mpc52xx-psc-spi";
|
||||
reg = <2200 100>;
|
||||
interrupts = <2 2 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
// PSC3 in CODEC mode example
|
||||
i2s@2400 { // PSC3
|
||||
device_type = "i2s";
|
||||
compatible = "mpc5200-psc-i2s\0mpc52xx-psc-i2s";
|
||||
reg = <2400 100>;
|
||||
interrupts = <2 3 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
// PSC4 unconfigured
|
||||
//serial@2600 { // PSC4
|
||||
// device_type = "serial";
|
||||
// compatible = "mpc5200-psc-uart\0mpc52xx-psc-uart";
|
||||
// reg = <2600 100>;
|
||||
// interrupts = <2 b 0>;
|
||||
// interrupt-parent = <500>;
|
||||
//};
|
||||
|
||||
// PSC5 unconfigured
|
||||
//serial@2800 { // PSC5
|
||||
// device_type = "serial";
|
||||
// compatible = "mpc5200-psc-uart\0mpc52xx-psc-uart";
|
||||
// reg = <2800 100>;
|
||||
// interrupts = <2 c 0>;
|
||||
// interrupt-parent = <500>;
|
||||
//};
|
||||
|
||||
// PSC6 in AC97 mode example
|
||||
ac97@2c00 { // PSC6
|
||||
device_type = "ac97";
|
||||
compatible = "mpc5200-psc-ac97\0mpc52xx-psc-ac97";
|
||||
reg = <2c00 100>;
|
||||
interrupts = <2 4 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
ethernet@3000 {
|
||||
device_type = "network";
|
||||
compatible = "mpc5200-fec\0mpc52xx-fec";
|
||||
reg = <3000 800>;
|
||||
mac-address = [ 02 03 04 05 06 07 ]; // Bad!
|
||||
interrupts = <2 5 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
ata@3a00 {
|
||||
device_type = "ata";
|
||||
compatible = "mpc5200-ata\0mpc52xx-ata";
|
||||
reg = <3a00 100>;
|
||||
interrupts = <2 7 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
i2c@3d00 {
|
||||
device_type = "i2c";
|
||||
compatible = "mpc5200-i2c\0mpc52xx-i2c";
|
||||
reg = <3d00 40>;
|
||||
interrupts = <2 f 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
i2c@3d40 {
|
||||
device_type = "i2c";
|
||||
compatible = "mpc5200-i2c\0mpc52xx-i2c";
|
||||
reg = <3d40 40>;
|
||||
interrupts = <2 10 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
sram@8000 {
|
||||
device_type = "sram";
|
||||
compatible = "mpc5200-sram\0mpc52xx-sram\0sram";
|
||||
reg = <8000 4000>;
|
||||
};
|
||||
};
|
||||
};
|
318
arch/powerpc/boot/dts/lite5200b.dts
Normal file
318
arch/powerpc/boot/dts/lite5200b.dts
Normal file
@ -0,0 +1,318 @@
|
||||
/*
|
||||
* Lite5200B board Device Tree Source
|
||||
*
|
||||
* Copyright 2006 Secret Lab Technologies Ltd.
|
||||
* Grant Likely <grant.likely@secretlab.ca>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*/
|
||||
|
||||
/ {
|
||||
model = "Lite5200b";
|
||||
compatible = "lite5200b\0lite52xx\0mpc5200b\0mpc52xx";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
cpus {
|
||||
#cpus = <1>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
PowerPC,5200@0 {
|
||||
device_type = "cpu";
|
||||
reg = <0>;
|
||||
d-cache-line-size = <20>;
|
||||
i-cache-line-size = <20>;
|
||||
d-cache-size = <4000>; // L1, 16K
|
||||
i-cache-size = <4000>; // L1, 16K
|
||||
timebase-frequency = <0>; // from bootloader
|
||||
bus-frequency = <0>; // from bootloader
|
||||
clock-frequency = <0>; // from bootloader
|
||||
32-bit;
|
||||
};
|
||||
};
|
||||
|
||||
memory {
|
||||
device_type = "memory";
|
||||
reg = <00000000 10000000>; // 256MB
|
||||
};
|
||||
|
||||
soc5200@f0000000 {
|
||||
#interrupt-cells = <3>;
|
||||
device_type = "soc";
|
||||
ranges = <0 f0000000 f0010000>;
|
||||
reg = <f0000000 00010000>;
|
||||
bus-frequency = <0>; // from bootloader
|
||||
|
||||
cdm@200 {
|
||||
compatible = "mpc5200b-cdm\0mpc52xx-cdm";
|
||||
reg = <200 38>;
|
||||
};
|
||||
|
||||
pic@500 {
|
||||
// 5200 interrupts are encoded into two levels;
|
||||
linux,phandle = <500>;
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <3>;
|
||||
device_type = "interrupt-controller";
|
||||
compatible = "mpc5200b-pic\0mpc52xx-pic";
|
||||
reg = <500 80>;
|
||||
built-in;
|
||||
};
|
||||
|
||||
gpt@600 { // General Purpose Timer
|
||||
compatible = "mpc5200b-gpt\0mpc52xx-gpt";
|
||||
device_type = "gpt";
|
||||
reg = <600 10>;
|
||||
interrupts = <1 9 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
gpt@610 { // General Purpose Timer
|
||||
compatible = "mpc5200b-gpt\0mpc52xx-gpt";
|
||||
device_type = "gpt";
|
||||
reg = <610 10>;
|
||||
interrupts = <1 a 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
gpt@620 { // General Purpose Timer
|
||||
compatible = "mpc5200b-gpt\0mpc52xx-gpt";
|
||||
device_type = "gpt";
|
||||
reg = <620 10>;
|
||||
interrupts = <1 b 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
gpt@630 { // General Purpose Timer
|
||||
compatible = "mpc5200b-gpt\0mpc52xx-gpt";
|
||||
device_type = "gpt";
|
||||
reg = <630 10>;
|
||||
interrupts = <1 c 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
gpt@640 { // General Purpose Timer
|
||||
compatible = "mpc5200b-gpt\0mpc52xx-gpt";
|
||||
device_type = "gpt";
|
||||
reg = <640 10>;
|
||||
interrupts = <1 d 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
gpt@650 { // General Purpose Timer
|
||||
compatible = "mpc5200b-gpt\0mpc52xx-gpt";
|
||||
device_type = "gpt";
|
||||
reg = <650 10>;
|
||||
interrupts = <1 e 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
gpt@660 { // General Purpose Timer
|
||||
compatible = "mpc5200b-gpt\0mpc52xx-gpt";
|
||||
device_type = "gpt";
|
||||
reg = <660 10>;
|
||||
interrupts = <1 f 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
gpt@670 { // General Purpose Timer
|
||||
compatible = "mpc5200b-gpt\0mpc52xx-gpt";
|
||||
device_type = "gpt";
|
||||
reg = <670 10>;
|
||||
interrupts = <1 10 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
rtc@800 { // Real time clock
|
||||
compatible = "mpc5200b-rtc\0mpc52xx-rtc";
|
||||
device_type = "rtc";
|
||||
reg = <800 100>;
|
||||
interrupts = <1 5 0 1 6 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
mscan@900 {
|
||||
device_type = "mscan";
|
||||
compatible = "mpc5200b-mscan\0mpc52xx-mscan";
|
||||
interrupts = <2 11 0>;
|
||||
interrupt-parent = <500>;
|
||||
reg = <900 80>;
|
||||
};
|
||||
|
||||
mscan@980 {
|
||||
device_type = "mscan";
|
||||
compatible = "mpc5200b-mscan\0mpc52xx-mscan";
|
||||
interrupts = <1 12 0>;
|
||||
interrupt-parent = <500>;
|
||||
reg = <980 80>;
|
||||
};
|
||||
|
||||
gpio@b00 {
|
||||
compatible = "mpc5200b-gpio\0mpc52xx-gpio";
|
||||
reg = <b00 40>;
|
||||
interrupts = <1 7 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
gpio-wkup@b00 {
|
||||
compatible = "mpc5200b-gpio-wkup\0mpc52xx-gpio-wkup";
|
||||
reg = <c00 40>;
|
||||
interrupts = <1 8 0 0 3 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
pci@0d00 {
|
||||
#interrupt-cells = <1>;
|
||||
#size-cells = <2>;
|
||||
#address-cells = <3>;
|
||||
device_type = "pci";
|
||||
compatible = "mpc5200b-pci\0mpc52xx-pci";
|
||||
reg = <d00 100>;
|
||||
interrupt-map-mask = <f800 0 0 7>;
|
||||
interrupt-map = <c000 0 0 1 500 0 0 3 // 1st slot
|
||||
c000 0 0 2 500 1 1 3
|
||||
c000 0 0 3 500 1 2 3
|
||||
c000 0 0 4 500 1 3 3
|
||||
|
||||
c800 0 0 1 500 1 1 3 // 2nd slot
|
||||
c800 0 0 2 500 1 2 3
|
||||
c800 0 0 3 500 1 3 3
|
||||
c800 0 0 4 500 0 0 3>;
|
||||
clock-frequency = <0>; // From boot loader
|
||||
interrupts = <2 8 0 2 9 0 2 a 0>;
|
||||
interrupt-parent = <500>;
|
||||
bus-range = <0 0>;
|
||||
ranges = <42000000 0 80000000 80000000 0 20000000
|
||||
02000000 0 a0000000 a0000000 0 10000000
|
||||
01000000 0 00000000 b0000000 0 01000000>;
|
||||
};
|
||||
|
||||
spi@f00 {
|
||||
device_type = "spi";
|
||||
compatible = "mpc5200b-spi\0mpc52xx-spi";
|
||||
reg = <f00 20>;
|
||||
interrupts = <2 d 0 2 e 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
usb@1000 {
|
||||
device_type = "usb-ohci-be";
|
||||
compatible = "mpc5200b-ohci\0mpc52xx-ohci\0ohci-be";
|
||||
reg = <1000 ff>;
|
||||
interrupts = <2 6 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
bestcomm@1200 {
|
||||
device_type = "dma-controller";
|
||||
compatible = "mpc5200b-bestcomm\0mpc52xx-bestcomm";
|
||||
reg = <1200 80>;
|
||||
interrupts = <3 0 0 3 1 0 3 2 0 3 3 0
|
||||
3 4 0 3 5 0 3 6 0 3 7 0
|
||||
3 8 0 3 9 0 3 a 0 3 b 0
|
||||
3 c 0 3 d 0 3 e 0 3 f 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
xlb@1f00 {
|
||||
compatible = "mpc5200b-xlb\0mpc52xx-xlb";
|
||||
reg = <1f00 100>;
|
||||
};
|
||||
|
||||
serial@2000 { // PSC1
|
||||
device_type = "serial";
|
||||
compatible = "mpc5200b-psc-uart\0mpc52xx-psc-uart";
|
||||
port-number = <0>; // Logical port assignment
|
||||
reg = <2000 100>;
|
||||
interrupts = <2 1 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
// PSC2 in spi mode example
|
||||
spi@2200 { // PSC2
|
||||
device_type = "spi";
|
||||
compatible = "mpc5200b-psc-spi\0mpc52xx-psc-spi";
|
||||
reg = <2200 100>;
|
||||
interrupts = <2 2 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
// PSC3 in CODEC mode example
|
||||
i2s@2400 { // PSC3
|
||||
device_type = "i2s";
|
||||
compatible = "mpc5200b-psc-i2s\0mpc52xx-psc-i2s";
|
||||
reg = <2400 100>;
|
||||
interrupts = <2 3 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
// PSC4 unconfigured
|
||||
//serial@2600 { // PSC4
|
||||
// device_type = "serial";
|
||||
// compatible = "mpc5200b-psc-uart\0mpc52xx-psc-uart";
|
||||
// reg = <2600 100>;
|
||||
// interrupts = <2 b 0>;
|
||||
// interrupt-parent = <500>;
|
||||
//};
|
||||
|
||||
// PSC5 unconfigured
|
||||
//serial@2800 { // PSC5
|
||||
// device_type = "serial";
|
||||
// compatible = "mpc5200b-psc-uart\0mpc52xx-psc-uart";
|
||||
// reg = <2800 100>;
|
||||
// interrupts = <2 c 0>;
|
||||
// interrupt-parent = <500>;
|
||||
//};
|
||||
|
||||
// PSC6 in AC97 mode example
|
||||
ac97@2c00 { // PSC6
|
||||
device_type = "ac97";
|
||||
compatible = "mpc5200b-psc-ac97\0mpc52xx-psc-ac97";
|
||||
reg = <2c00 100>;
|
||||
interrupts = <2 4 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
ethernet@3000 {
|
||||
device_type = "network";
|
||||
compatible = "mpc5200b-fec\0mpc52xx-fec";
|
||||
reg = <3000 800>;
|
||||
mac-address = [ 02 03 04 05 06 07 ]; // Bad!
|
||||
interrupts = <2 5 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
ata@3a00 {
|
||||
device_type = "ata";
|
||||
compatible = "mpc5200b-ata\0mpc52xx-ata";
|
||||
reg = <3a00 100>;
|
||||
interrupts = <2 7 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
i2c@3d00 {
|
||||
device_type = "i2c";
|
||||
compatible = "mpc5200b-i2c\0mpc52xx-i2c";
|
||||
reg = <3d00 40>;
|
||||
interrupts = <2 f 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
|
||||
i2c@3d40 {
|
||||
device_type = "i2c";
|
||||
compatible = "mpc5200b-i2c\0mpc52xx-i2c";
|
||||
reg = <3d40 40>;
|
||||
interrupts = <2 10 0>;
|
||||
interrupt-parent = <500>;
|
||||
};
|
||||
sram@8000 {
|
||||
device_type = "sram";
|
||||
compatible = "mpc5200b-sram\0mpc52xx-sram\0sram";
|
||||
reg = <8000 4000>;
|
||||
};
|
||||
};
|
||||
};
|
@ -161,29 +161,41 @@
|
||||
interrupt-map = <
|
||||
|
||||
/* IDSEL 0x11 */
|
||||
0800 0 0 1 7400 24 0
|
||||
0800 0 0 2 7400 25 0
|
||||
0800 0 0 3 7400 26 0
|
||||
0800 0 0 4 7400 27 0
|
||||
0800 0 0 1 1180 24 0
|
||||
0800 0 0 2 1180 25 0
|
||||
0800 0 0 3 1180 26 0
|
||||
0800 0 0 4 1180 27 0
|
||||
|
||||
/* IDSEL 0x12 */
|
||||
1000 0 0 1 7400 25 0
|
||||
1000 0 0 2 7400 26 0
|
||||
1000 0 0 3 7400 27 0
|
||||
1000 0 0 4 7400 24 0
|
||||
1000 0 0 1 1180 25 0
|
||||
1000 0 0 2 1180 26 0
|
||||
1000 0 0 3 1180 27 0
|
||||
1000 0 0 4 1180 24 0
|
||||
|
||||
/* IDSEL 0x13 */
|
||||
1800 0 0 1 7400 26 0
|
||||
1800 0 0 2 7400 27 0
|
||||
1800 0 0 3 7400 24 0
|
||||
1800 0 0 4 7400 25 0
|
||||
1800 0 0 1 1180 26 0
|
||||
1800 0 0 2 1180 27 0
|
||||
1800 0 0 3 1180 24 0
|
||||
1800 0 0 4 1180 25 0
|
||||
|
||||
/* IDSEL 0x14 */
|
||||
2000 0 0 1 7400 27 0
|
||||
2000 0 0 2 7400 24 0
|
||||
2000 0 0 3 7400 25 0
|
||||
2000 0 0 4 7400 26 0
|
||||
2000 0 0 1 1180 27 0
|
||||
2000 0 0 2 1180 24 0
|
||||
2000 0 0 3 1180 25 0
|
||||
2000 0 0 4 1180 26 0
|
||||
>;
|
||||
router@1180 {
|
||||
linux,phandle = <1180>;
|
||||
clock-frequency = <0>;
|
||||
interrupt-controller;
|
||||
device_type = "pic-router";
|
||||
#address-cells = <0>;
|
||||
#interrupt-cells = <2>;
|
||||
built-in;
|
||||
big-endian;
|
||||
interrupts = <17 2>;
|
||||
interrupt-parent = <7400>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
880
arch/powerpc/boot/flatdevtree.c
Normal file
880
arch/powerpc/boot/flatdevtree.c
Normal file
@ -0,0 +1,880 @@
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
* Copyright Pantelis Antoniou 2006
|
||||
* Copyright (C) IBM Corporation 2006
|
||||
*
|
||||
* Authors: Pantelis Antoniou <pantelis@embeddedalley.com>
|
||||
* Hollis Blanchard <hollisb@us.ibm.com>
|
||||
* Mark A. Greer <mgreer@mvista.com>
|
||||
* Paul Mackerras <paulus@samba.org>
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <stddef.h>
|
||||
#include "flatdevtree.h"
|
||||
#include "flatdevtree_env.h"
|
||||
|
||||
#define _ALIGN(x, al) (((x) + (al) - 1) & ~((al) - 1))
|
||||
|
||||
/* Routines for keeping node ptrs returned by ft_find_device current */
|
||||
/* First entry not used b/c it would return 0 and be taken as NULL/error */
|
||||
static void *ft_node_add(struct ft_cxt *cxt, char *node)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 1; i < cxt->nodes_used; i++) /* already there? */
|
||||
if (cxt->node_tbl[i] == node)
|
||||
return (void *)i;
|
||||
|
||||
if (cxt->nodes_used < cxt->node_max) {
|
||||
cxt->node_tbl[cxt->nodes_used] = node;
|
||||
return (void *)cxt->nodes_used++;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static char *ft_node_ph2node(struct ft_cxt *cxt, const void *phandle)
|
||||
{
|
||||
unsigned int i = (unsigned int)phandle;
|
||||
|
||||
if (i < cxt->nodes_used)
|
||||
return cxt->node_tbl[i];
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void ft_node_update_before(struct ft_cxt *cxt, char *addr, int shift)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
if (shift == 0)
|
||||
return;
|
||||
|
||||
for (i = 1; i < cxt->nodes_used; i++)
|
||||
if (cxt->node_tbl[i] < addr)
|
||||
cxt->node_tbl[i] += shift;
|
||||
}
|
||||
|
||||
static void ft_node_update_after(struct ft_cxt *cxt, char *addr, int shift)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
if (shift == 0)
|
||||
return;
|
||||
|
||||
for (i = 1; i < cxt->nodes_used; i++)
|
||||
if (cxt->node_tbl[i] >= addr)
|
||||
cxt->node_tbl[i] += shift;
|
||||
}
|
||||
|
||||
/* Struct used to return info from ft_next() */
|
||||
struct ft_atom {
|
||||
u32 tag;
|
||||
const char *name;
|
||||
void *data;
|
||||
u32 size;
|
||||
};
|
||||
|
||||
/* Set ptrs to current one's info; return addr of next one */
|
||||
static char *ft_next(struct ft_cxt *cxt, char *p, struct ft_atom *ret)
|
||||
{
|
||||
u32 sz;
|
||||
|
||||
if (p >= cxt->rgn[FT_STRUCT].start + cxt->rgn[FT_STRUCT].size)
|
||||
return NULL;
|
||||
|
||||
ret->tag = be32_to_cpu(*(u32 *) p);
|
||||
p += 4;
|
||||
|
||||
switch (ret->tag) { /* Tag */
|
||||
case OF_DT_BEGIN_NODE:
|
||||
ret->name = p;
|
||||
ret->data = (void *)(p - 4); /* start of node */
|
||||
p += _ALIGN(strlen(p) + 1, 4);
|
||||
break;
|
||||
case OF_DT_PROP:
|
||||
ret->size = sz = be32_to_cpu(*(u32 *) p);
|
||||
ret->name = cxt->str_anchor + be32_to_cpu(*(u32 *) (p + 4));
|
||||
ret->data = (void *)(p + 8);
|
||||
p += 8 + _ALIGN(sz, 4);
|
||||
break;
|
||||
case OF_DT_END_NODE:
|
||||
case OF_DT_NOP:
|
||||
break;
|
||||
case OF_DT_END:
|
||||
default:
|
||||
p = NULL;
|
||||
break;
|
||||
}
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
#define HDR_SIZE _ALIGN(sizeof(struct boot_param_header), 8)
|
||||
#define EXPAND_INCR 1024 /* alloc this much extra when expanding */
|
||||
|
||||
/* See if the regions are in the standard order and non-overlapping */
|
||||
static int ft_ordered(struct ft_cxt *cxt)
|
||||
{
|
||||
char *p = (char *)cxt->bph + HDR_SIZE;
|
||||
enum ft_rgn_id r;
|
||||
|
||||
for (r = FT_RSVMAP; r <= FT_STRINGS; ++r) {
|
||||
if (p > cxt->rgn[r].start)
|
||||
return 0;
|
||||
p = cxt->rgn[r].start + cxt->rgn[r].size;
|
||||
}
|
||||
return p <= (char *)cxt->bph + cxt->max_size;
|
||||
}
|
||||
|
||||
/* Copy the tree to a newly-allocated region and put things in order */
|
||||
static int ft_reorder(struct ft_cxt *cxt, int nextra)
|
||||
{
|
||||
unsigned long tot;
|
||||
enum ft_rgn_id r;
|
||||
char *p, *pend;
|
||||
int stroff;
|
||||
|
||||
tot = HDR_SIZE + EXPAND_INCR;
|
||||
for (r = FT_RSVMAP; r <= FT_STRINGS; ++r)
|
||||
tot += cxt->rgn[r].size;
|
||||
if (nextra > 0)
|
||||
tot += nextra;
|
||||
tot = _ALIGN(tot, 8);
|
||||
|
||||
if (!cxt->realloc)
|
||||
return 0;
|
||||
p = cxt->realloc(NULL, tot);
|
||||
if (!p)
|
||||
return 0;
|
||||
|
||||
memcpy(p, cxt->bph, sizeof(struct boot_param_header));
|
||||
/* offsets get fixed up later */
|
||||
|
||||
cxt->bph = (struct boot_param_header *)p;
|
||||
cxt->max_size = tot;
|
||||
pend = p + tot;
|
||||
p += HDR_SIZE;
|
||||
|
||||
memcpy(p, cxt->rgn[FT_RSVMAP].start, cxt->rgn[FT_RSVMAP].size);
|
||||
cxt->rgn[FT_RSVMAP].start = p;
|
||||
p += cxt->rgn[FT_RSVMAP].size;
|
||||
|
||||
memcpy(p, cxt->rgn[FT_STRUCT].start, cxt->rgn[FT_STRUCT].size);
|
||||
ft_node_update_after(cxt, cxt->rgn[FT_STRUCT].start,
|
||||
p - cxt->rgn[FT_STRUCT].start);
|
||||
cxt->p += p - cxt->rgn[FT_STRUCT].start;
|
||||
cxt->rgn[FT_STRUCT].start = p;
|
||||
|
||||
p = pend - cxt->rgn[FT_STRINGS].size;
|
||||
memcpy(p, cxt->rgn[FT_STRINGS].start, cxt->rgn[FT_STRINGS].size);
|
||||
stroff = cxt->str_anchor - cxt->rgn[FT_STRINGS].start;
|
||||
cxt->rgn[FT_STRINGS].start = p;
|
||||
cxt->str_anchor = p + stroff;
|
||||
|
||||
cxt->isordered = 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline char *prev_end(struct ft_cxt *cxt, enum ft_rgn_id r)
|
||||
{
|
||||
if (r > FT_RSVMAP)
|
||||
return cxt->rgn[r - 1].start + cxt->rgn[r - 1].size;
|
||||
return (char *)cxt->bph + HDR_SIZE;
|
||||
}
|
||||
|
||||
static inline char *next_start(struct ft_cxt *cxt, enum ft_rgn_id r)
|
||||
{
|
||||
if (r < FT_STRINGS)
|
||||
return cxt->rgn[r + 1].start;
|
||||
return (char *)cxt->bph + cxt->max_size;
|
||||
}
|
||||
|
||||
/*
|
||||
* See if we can expand region rgn by nextra bytes by using up
|
||||
* free space after or before the region.
|
||||
*/
|
||||
static int ft_shuffle(struct ft_cxt *cxt, char **pp, enum ft_rgn_id rgn,
|
||||
int nextra)
|
||||
{
|
||||
char *p = *pp;
|
||||
char *rgn_start, *rgn_end;
|
||||
|
||||
rgn_start = cxt->rgn[rgn].start;
|
||||
rgn_end = rgn_start + cxt->rgn[rgn].size;
|
||||
if (nextra <= 0 || rgn_end + nextra <= next_start(cxt, rgn)) {
|
||||
/* move following stuff */
|
||||
if (p < rgn_end) {
|
||||
if (nextra < 0)
|
||||
memmove(p, p - nextra, rgn_end - p + nextra);
|
||||
else
|
||||
memmove(p + nextra, p, rgn_end - p);
|
||||
if (rgn == FT_STRUCT)
|
||||
ft_node_update_after(cxt, p, nextra);
|
||||
}
|
||||
cxt->rgn[rgn].size += nextra;
|
||||
if (rgn == FT_STRINGS)
|
||||
/* assumes strings only added at beginning */
|
||||
cxt->str_anchor += nextra;
|
||||
return 1;
|
||||
}
|
||||
if (prev_end(cxt, rgn) <= rgn_start - nextra) {
|
||||
/* move preceding stuff */
|
||||
if (p > rgn_start) {
|
||||
memmove(rgn_start - nextra, rgn_start, p - rgn_start);
|
||||
if (rgn == FT_STRUCT)
|
||||
ft_node_update_before(cxt, p, -nextra);
|
||||
}
|
||||
*p -= nextra;
|
||||
cxt->rgn[rgn].start -= nextra;
|
||||
cxt->rgn[rgn].size += nextra;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ft_make_space(struct ft_cxt *cxt, char **pp, enum ft_rgn_id rgn,
|
||||
int nextra)
|
||||
{
|
||||
unsigned long size, ssize, tot;
|
||||
char *str, *next;
|
||||
enum ft_rgn_id r;
|
||||
|
||||
if (!cxt->isordered && !ft_reorder(cxt, nextra))
|
||||
return 0;
|
||||
if (ft_shuffle(cxt, pp, rgn, nextra))
|
||||
return 1;
|
||||
|
||||
/* See if there is space after the strings section */
|
||||
ssize = cxt->rgn[FT_STRINGS].size;
|
||||
if (cxt->rgn[FT_STRINGS].start + ssize
|
||||
< (char *)cxt->bph + cxt->max_size) {
|
||||
/* move strings up as far as possible */
|
||||
str = (char *)cxt->bph + cxt->max_size - ssize;
|
||||
cxt->str_anchor += str - cxt->rgn[FT_STRINGS].start;
|
||||
memmove(str, cxt->rgn[FT_STRINGS].start, ssize);
|
||||
cxt->rgn[FT_STRINGS].start = str;
|
||||
/* enough space now? */
|
||||
if (rgn >= FT_STRUCT && ft_shuffle(cxt, pp, rgn, nextra))
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* how much total free space is there following this region? */
|
||||
tot = 0;
|
||||
for (r = rgn; r < FT_STRINGS; ++r) {
|
||||
char *r_end = cxt->rgn[r].start + cxt->rgn[r].size;
|
||||
tot += next_start(cxt, rgn) - r_end;
|
||||
}
|
||||
|
||||
/* cast is to shut gcc up; we know nextra >= 0 */
|
||||
if (tot < (unsigned int)nextra) {
|
||||
/* have to reallocate */
|
||||
char *newp, *new_start;
|
||||
int shift;
|
||||
|
||||
if (!cxt->realloc)
|
||||
return 0;
|
||||
size = _ALIGN(cxt->max_size + (nextra - tot) + EXPAND_INCR, 8);
|
||||
newp = cxt->realloc(cxt->bph, size);
|
||||
if (!newp)
|
||||
return 0;
|
||||
cxt->max_size = size;
|
||||
shift = newp - (char *)cxt->bph;
|
||||
|
||||
if (shift) { /* realloc can return same addr */
|
||||
cxt->bph = (struct boot_param_header *)newp;
|
||||
ft_node_update_after(cxt, cxt->rgn[FT_STRUCT].start,
|
||||
shift);
|
||||
for (r = FT_RSVMAP; r <= FT_STRINGS; ++r) {
|
||||
new_start = cxt->rgn[r].start + shift;
|
||||
cxt->rgn[r].start = new_start;
|
||||
}
|
||||
*pp += shift;
|
||||
cxt->str_anchor += shift;
|
||||
}
|
||||
|
||||
/* move strings up to the end */
|
||||
str = newp + size - ssize;
|
||||
cxt->str_anchor += str - cxt->rgn[FT_STRINGS].start;
|
||||
memmove(str, cxt->rgn[FT_STRINGS].start, ssize);
|
||||
cxt->rgn[FT_STRINGS].start = str;
|
||||
|
||||
if (ft_shuffle(cxt, pp, rgn, nextra))
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* must be FT_RSVMAP and we need to move FT_STRUCT up */
|
||||
if (rgn == FT_RSVMAP) {
|
||||
next = cxt->rgn[FT_RSVMAP].start + cxt->rgn[FT_RSVMAP].size
|
||||
+ nextra;
|
||||
ssize = cxt->rgn[FT_STRUCT].size;
|
||||
if (next + ssize >= cxt->rgn[FT_STRINGS].start)
|
||||
return 0; /* "can't happen" */
|
||||
memmove(next, cxt->rgn[FT_STRUCT].start, ssize);
|
||||
ft_node_update_after(cxt, cxt->rgn[FT_STRUCT].start, nextra);
|
||||
cxt->rgn[FT_STRUCT].start = next;
|
||||
|
||||
if (ft_shuffle(cxt, pp, rgn, nextra))
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0; /* "can't happen" */
|
||||
}
|
||||
|
||||
static void ft_put_word(struct ft_cxt *cxt, u32 v)
|
||||
{
|
||||
*(u32 *) cxt->p = cpu_to_be32(v);
|
||||
cxt->p += 4;
|
||||
}
|
||||
|
||||
static void ft_put_bin(struct ft_cxt *cxt, const void *data, unsigned int sz)
|
||||
{
|
||||
unsigned long sza = _ALIGN(sz, 4);
|
||||
|
||||
/* zero out the alignment gap if necessary */
|
||||
if (sz < sza)
|
||||
*(u32 *) (cxt->p + sza - 4) = 0;
|
||||
|
||||
/* copy in the data */
|
||||
memcpy(cxt->p, data, sz);
|
||||
|
||||
cxt->p += sza;
|
||||
}
|
||||
|
||||
int ft_begin_node(struct ft_cxt *cxt, const char *name)
|
||||
{
|
||||
unsigned long nlen = strlen(name) + 1;
|
||||
unsigned long len = 8 + _ALIGN(nlen, 4);
|
||||
|
||||
if (!ft_make_space(cxt, &cxt->p, FT_STRUCT, len))
|
||||
return -1;
|
||||
ft_put_word(cxt, OF_DT_BEGIN_NODE);
|
||||
ft_put_bin(cxt, name, strlen(name) + 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ft_end_node(struct ft_cxt *cxt)
|
||||
{
|
||||
ft_put_word(cxt, OF_DT_END_NODE);
|
||||
}
|
||||
|
||||
void ft_nop(struct ft_cxt *cxt)
|
||||
{
|
||||
if (ft_make_space(cxt, &cxt->p, FT_STRUCT, 4))
|
||||
ft_put_word(cxt, OF_DT_NOP);
|
||||
}
|
||||
|
||||
#define NO_STRING 0x7fffffff
|
||||
|
||||
static int lookup_string(struct ft_cxt *cxt, const char *name)
|
||||
{
|
||||
char *p, *end;
|
||||
|
||||
p = cxt->rgn[FT_STRINGS].start;
|
||||
end = p + cxt->rgn[FT_STRINGS].size;
|
||||
while (p < end) {
|
||||
if (strcmp(p, (char *)name) == 0)
|
||||
return p - cxt->str_anchor;
|
||||
p += strlen(p) + 1;
|
||||
}
|
||||
|
||||
return NO_STRING;
|
||||
}
|
||||
|
||||
/* lookup string and insert if not found */
|
||||
static int map_string(struct ft_cxt *cxt, const char *name)
|
||||
{
|
||||
int off;
|
||||
char *p;
|
||||
|
||||
off = lookup_string(cxt, name);
|
||||
if (off != NO_STRING)
|
||||
return off;
|
||||
p = cxt->rgn[FT_STRINGS].start;
|
||||
if (!ft_make_space(cxt, &p, FT_STRINGS, strlen(name) + 1))
|
||||
return NO_STRING;
|
||||
strcpy(p, name);
|
||||
return p - cxt->str_anchor;
|
||||
}
|
||||
|
||||
int ft_prop(struct ft_cxt *cxt, const char *name, const void *data,
|
||||
unsigned int sz)
|
||||
{
|
||||
int off, len;
|
||||
|
||||
off = lookup_string(cxt, name);
|
||||
if (off == NO_STRING)
|
||||
return -1;
|
||||
|
||||
len = 12 + _ALIGN(sz, 4);
|
||||
if (!ft_make_space(cxt, &cxt->p, FT_STRUCT, len))
|
||||
return -1;
|
||||
|
||||
ft_put_word(cxt, OF_DT_PROP);
|
||||
ft_put_word(cxt, sz);
|
||||
ft_put_word(cxt, off);
|
||||
ft_put_bin(cxt, data, sz);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ft_prop_str(struct ft_cxt *cxt, const char *name, const char *str)
|
||||
{
|
||||
return ft_prop(cxt, name, str, strlen(str) + 1);
|
||||
}
|
||||
|
||||
int ft_prop_int(struct ft_cxt *cxt, const char *name, unsigned int val)
|
||||
{
|
||||
u32 v = cpu_to_be32((u32) val);
|
||||
|
||||
return ft_prop(cxt, name, &v, 4);
|
||||
}
|
||||
|
||||
/* Calculate the size of the reserved map */
|
||||
static unsigned long rsvmap_size(struct ft_cxt *cxt)
|
||||
{
|
||||
struct ft_reserve *res;
|
||||
|
||||
res = (struct ft_reserve *)cxt->rgn[FT_RSVMAP].start;
|
||||
while (res->start || res->len)
|
||||
++res;
|
||||
return (char *)(res + 1) - cxt->rgn[FT_RSVMAP].start;
|
||||
}
|
||||
|
||||
/* Calculate the size of the struct region by stepping through it */
|
||||
static unsigned long struct_size(struct ft_cxt *cxt)
|
||||
{
|
||||
char *p = cxt->rgn[FT_STRUCT].start;
|
||||
char *next;
|
||||
struct ft_atom atom;
|
||||
|
||||
/* make check in ft_next happy */
|
||||
if (cxt->rgn[FT_STRUCT].size == 0)
|
||||
cxt->rgn[FT_STRUCT].size = 0xfffffffful - (unsigned long)p;
|
||||
|
||||
while ((next = ft_next(cxt, p, &atom)) != NULL)
|
||||
p = next;
|
||||
return p + 4 - cxt->rgn[FT_STRUCT].start;
|
||||
}
|
||||
|
||||
/* add `adj' on to all string offset values in the struct area */
|
||||
static void adjust_string_offsets(struct ft_cxt *cxt, int adj)
|
||||
{
|
||||
char *p = cxt->rgn[FT_STRUCT].start;
|
||||
char *next;
|
||||
struct ft_atom atom;
|
||||
int off;
|
||||
|
||||
while ((next = ft_next(cxt, p, &atom)) != NULL) {
|
||||
if (atom.tag == OF_DT_PROP) {
|
||||
off = be32_to_cpu(*(u32 *) (p + 8));
|
||||
*(u32 *) (p + 8) = cpu_to_be32(off + adj);
|
||||
}
|
||||
p = next;
|
||||
}
|
||||
}
|
||||
|
||||
/* start construction of the flat OF tree from scratch */
|
||||
void ft_begin(struct ft_cxt *cxt, void *blob, unsigned int max_size,
|
||||
void *(*realloc_fn) (void *, unsigned long))
|
||||
{
|
||||
struct boot_param_header *bph = blob;
|
||||
char *p;
|
||||
struct ft_reserve *pres;
|
||||
|
||||
/* clear the cxt */
|
||||
memset(cxt, 0, sizeof(*cxt));
|
||||
|
||||
cxt->bph = bph;
|
||||
cxt->max_size = max_size;
|
||||
cxt->realloc = realloc_fn;
|
||||
cxt->isordered = 1;
|
||||
|
||||
/* zero everything in the header area */
|
||||
memset(bph, 0, sizeof(*bph));
|
||||
|
||||
bph->magic = cpu_to_be32(OF_DT_HEADER);
|
||||
bph->version = cpu_to_be32(0x10);
|
||||
bph->last_comp_version = cpu_to_be32(0x10);
|
||||
|
||||
/* start pointers */
|
||||
cxt->rgn[FT_RSVMAP].start = p = blob + HDR_SIZE;
|
||||
cxt->rgn[FT_RSVMAP].size = sizeof(struct ft_reserve);
|
||||
pres = (struct ft_reserve *)p;
|
||||
cxt->rgn[FT_STRUCT].start = p += sizeof(struct ft_reserve);
|
||||
cxt->rgn[FT_STRUCT].size = 4;
|
||||
cxt->rgn[FT_STRINGS].start = blob + max_size;
|
||||
cxt->rgn[FT_STRINGS].size = 0;
|
||||
|
||||
/* init rsvmap and struct */
|
||||
pres->start = 0;
|
||||
pres->len = 0;
|
||||
*(u32 *) p = cpu_to_be32(OF_DT_END);
|
||||
|
||||
cxt->str_anchor = blob;
|
||||
}
|
||||
|
||||
/* open up an existing blob to be examined or modified */
|
||||
int ft_open(struct ft_cxt *cxt, void *blob, unsigned int max_size,
|
||||
unsigned int max_find_device,
|
||||
void *(*realloc_fn) (void *, unsigned long))
|
||||
{
|
||||
struct boot_param_header *bph = blob;
|
||||
|
||||
/* can't cope with version < 16 */
|
||||
if (be32_to_cpu(bph->version) < 16)
|
||||
return -1;
|
||||
|
||||
/* clear the cxt */
|
||||
memset(cxt, 0, sizeof(*cxt));
|
||||
|
||||
/* alloc node_tbl to track node ptrs returned by ft_find_device */
|
||||
++max_find_device;
|
||||
cxt->node_tbl = realloc_fn(NULL, max_find_device * sizeof(char *));
|
||||
if (!cxt->node_tbl)
|
||||
return -1;
|
||||
memset(cxt->node_tbl, 0, max_find_device * sizeof(char *));
|
||||
cxt->node_max = max_find_device;
|
||||
cxt->nodes_used = 1; /* don't use idx 0 b/c looks like NULL */
|
||||
|
||||
cxt->bph = bph;
|
||||
cxt->max_size = max_size;
|
||||
cxt->realloc = realloc_fn;
|
||||
|
||||
cxt->rgn[FT_RSVMAP].start = blob + be32_to_cpu(bph->off_mem_rsvmap);
|
||||
cxt->rgn[FT_RSVMAP].size = rsvmap_size(cxt);
|
||||
cxt->rgn[FT_STRUCT].start = blob + be32_to_cpu(bph->off_dt_struct);
|
||||
cxt->rgn[FT_STRUCT].size = struct_size(cxt);
|
||||
cxt->rgn[FT_STRINGS].start = blob + be32_to_cpu(bph->off_dt_strings);
|
||||
cxt->rgn[FT_STRINGS].size = be32_to_cpu(bph->dt_strings_size);
|
||||
/* Leave as '0' to force first ft_make_space call to do a ft_reorder
|
||||
* and move dt to an area allocated by realloc.
|
||||
cxt->isordered = ft_ordered(cxt);
|
||||
*/
|
||||
|
||||
cxt->p = cxt->rgn[FT_STRUCT].start;
|
||||
cxt->str_anchor = cxt->rgn[FT_STRINGS].start;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* add a reserver physical area to the rsvmap */
|
||||
int ft_add_rsvmap(struct ft_cxt *cxt, u64 physaddr, u64 size)
|
||||
{
|
||||
char *p;
|
||||
struct ft_reserve *pres;
|
||||
|
||||
p = cxt->rgn[FT_RSVMAP].start + cxt->rgn[FT_RSVMAP].size
|
||||
- sizeof(struct ft_reserve);
|
||||
if (!ft_make_space(cxt, &p, FT_RSVMAP, sizeof(struct ft_reserve)))
|
||||
return -1;
|
||||
|
||||
pres = (struct ft_reserve *)p;
|
||||
pres->start = cpu_to_be64(physaddr);
|
||||
pres->len = cpu_to_be64(size);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ft_begin_tree(struct ft_cxt *cxt)
|
||||
{
|
||||
cxt->p = cxt->rgn[FT_STRUCT].start;
|
||||
}
|
||||
|
||||
void ft_end_tree(struct ft_cxt *cxt)
|
||||
{
|
||||
struct boot_param_header *bph = cxt->bph;
|
||||
char *p, *oldstr, *str, *endp;
|
||||
unsigned long ssize;
|
||||
int adj;
|
||||
|
||||
if (!cxt->isordered)
|
||||
return; /* we haven't touched anything */
|
||||
|
||||
/* adjust string offsets */
|
||||
oldstr = cxt->rgn[FT_STRINGS].start;
|
||||
adj = cxt->str_anchor - oldstr;
|
||||
if (adj)
|
||||
adjust_string_offsets(cxt, adj);
|
||||
|
||||
/* make strings end on 8-byte boundary */
|
||||
ssize = cxt->rgn[FT_STRINGS].size;
|
||||
endp = (char *)_ALIGN((unsigned long)cxt->rgn[FT_STRUCT].start
|
||||
+ cxt->rgn[FT_STRUCT].size + ssize, 8);
|
||||
str = endp - ssize;
|
||||
|
||||
/* move strings down to end of structs */
|
||||
memmove(str, oldstr, ssize);
|
||||
cxt->str_anchor = str;
|
||||
cxt->rgn[FT_STRINGS].start = str;
|
||||
|
||||
/* fill in header fields */
|
||||
p = (char *)bph;
|
||||
bph->totalsize = cpu_to_be32(endp - p);
|
||||
bph->off_mem_rsvmap = cpu_to_be32(cxt->rgn[FT_RSVMAP].start - p);
|
||||
bph->off_dt_struct = cpu_to_be32(cxt->rgn[FT_STRUCT].start - p);
|
||||
bph->off_dt_strings = cpu_to_be32(cxt->rgn[FT_STRINGS].start - p);
|
||||
bph->dt_strings_size = cpu_to_be32(ssize);
|
||||
}
|
||||
|
||||
void *ft_find_device(struct ft_cxt *cxt, const char *srch_path)
|
||||
{
|
||||
char *node;
|
||||
|
||||
/* require absolute path */
|
||||
if (srch_path[0] != '/')
|
||||
return NULL;
|
||||
node = ft_find_descendent(cxt, cxt->rgn[FT_STRUCT].start, srch_path);
|
||||
return ft_node_add(cxt, node);
|
||||
}
|
||||
|
||||
void *ft_find_descendent(struct ft_cxt *cxt, void *top, const char *srch_path)
|
||||
{
|
||||
struct ft_atom atom;
|
||||
char *p;
|
||||
const char *cp, *q;
|
||||
int cl;
|
||||
int depth = -1;
|
||||
int dmatch = 0;
|
||||
const char *path_comp[FT_MAX_DEPTH];
|
||||
|
||||
cp = srch_path;
|
||||
cl = 0;
|
||||
p = top;
|
||||
|
||||
while ((p = ft_next(cxt, p, &atom)) != NULL) {
|
||||
switch (atom.tag) {
|
||||
case OF_DT_BEGIN_NODE:
|
||||
++depth;
|
||||
if (depth != dmatch)
|
||||
break;
|
||||
cxt->genealogy[depth] = atom.data;
|
||||
cxt->genealogy[depth + 1] = NULL;
|
||||
if (depth && !(strncmp(atom.name, cp, cl) == 0
|
||||
&& (atom.name[cl] == '/'
|
||||
|| atom.name[cl] == '\0'
|
||||
|| atom.name[cl] == '@')))
|
||||
break;
|
||||
path_comp[dmatch] = cp;
|
||||
/* it matches so far, advance to next path component */
|
||||
cp += cl;
|
||||
/* skip slashes */
|
||||
while (*cp == '/')
|
||||
++cp;
|
||||
/* we're done if this is the end of the string */
|
||||
if (*cp == 0)
|
||||
return atom.data;
|
||||
/* look for end of this component */
|
||||
q = strchr(cp, '/');
|
||||
if (q)
|
||||
cl = q - cp;
|
||||
else
|
||||
cl = strlen(cp);
|
||||
++dmatch;
|
||||
break;
|
||||
case OF_DT_END_NODE:
|
||||
if (depth == 0)
|
||||
return NULL;
|
||||
if (dmatch > depth) {
|
||||
--dmatch;
|
||||
cl = cp - path_comp[dmatch] - 1;
|
||||
cp = path_comp[dmatch];
|
||||
while (cl > 0 && cp[cl - 1] == '/')
|
||||
--cl;
|
||||
}
|
||||
--depth;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void *ft_get_parent(struct ft_cxt *cxt, const void *phandle)
|
||||
{
|
||||
void *node;
|
||||
int d;
|
||||
struct ft_atom atom;
|
||||
char *p;
|
||||
|
||||
node = ft_node_ph2node(cxt, phandle);
|
||||
if (node == NULL)
|
||||
return NULL;
|
||||
|
||||
for (d = 0; cxt->genealogy[d] != NULL; ++d)
|
||||
if (cxt->genealogy[d] == node)
|
||||
return cxt->genealogy[d > 0 ? d - 1 : 0];
|
||||
|
||||
/* have to do it the hard way... */
|
||||
p = cxt->rgn[FT_STRUCT].start;
|
||||
d = 0;
|
||||
while ((p = ft_next(cxt, p, &atom)) != NULL) {
|
||||
switch (atom.tag) {
|
||||
case OF_DT_BEGIN_NODE:
|
||||
cxt->genealogy[d] = atom.data;
|
||||
if (node == atom.data) {
|
||||
/* found it */
|
||||
cxt->genealogy[d + 1] = NULL;
|
||||
return d > 0 ? cxt->genealogy[d - 1] : node;
|
||||
}
|
||||
++d;
|
||||
break;
|
||||
case OF_DT_END_NODE:
|
||||
--d;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int ft_get_prop(struct ft_cxt *cxt, const void *phandle, const char *propname,
|
||||
void *buf, const unsigned int buflen)
|
||||
{
|
||||
struct ft_atom atom;
|
||||
void *node;
|
||||
char *p;
|
||||
int depth;
|
||||
unsigned int size;
|
||||
|
||||
node = ft_node_ph2node(cxt, phandle);
|
||||
if (node == NULL)
|
||||
return -1;
|
||||
|
||||
depth = 0;
|
||||
p = (char *)node;
|
||||
|
||||
while ((p = ft_next(cxt, p, &atom)) != NULL) {
|
||||
switch (atom.tag) {
|
||||
case OF_DT_BEGIN_NODE:
|
||||
++depth;
|
||||
break;
|
||||
case OF_DT_PROP:
|
||||
if ((depth != 1) || strcmp(atom.name, propname))
|
||||
break;
|
||||
size = min(atom.size, buflen);
|
||||
memcpy(buf, atom.data, size);
|
||||
return atom.size;
|
||||
case OF_DT_END_NODE:
|
||||
if (--depth <= 0)
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
int ft_set_prop(struct ft_cxt *cxt, const void *phandle, const char *propname,
|
||||
const void *buf, const unsigned int buflen)
|
||||
{
|
||||
struct ft_atom atom;
|
||||
void *node;
|
||||
char *p, *next;
|
||||
int nextra, depth;
|
||||
|
||||
node = ft_node_ph2node(cxt, phandle);
|
||||
if (node == NULL)
|
||||
return -1;
|
||||
|
||||
depth = 0;
|
||||
p = node;
|
||||
|
||||
while ((next = ft_next(cxt, p, &atom)) != NULL) {
|
||||
switch (atom.tag) {
|
||||
case OF_DT_BEGIN_NODE:
|
||||
++depth;
|
||||
break;
|
||||
case OF_DT_END_NODE:
|
||||
if (--depth > 0)
|
||||
break;
|
||||
/* haven't found the property, insert here */
|
||||
cxt->p = p;
|
||||
return ft_prop(cxt, propname, buf, buflen);
|
||||
case OF_DT_PROP:
|
||||
if ((depth != 1) || strcmp(atom.name, propname))
|
||||
break;
|
||||
/* found an existing property, overwrite it */
|
||||
nextra = _ALIGN(buflen, 4) - _ALIGN(atom.size, 4);
|
||||
cxt->p = atom.data;
|
||||
if (nextra && !ft_make_space(cxt, &cxt->p, FT_STRUCT,
|
||||
nextra))
|
||||
return -1;
|
||||
*(u32 *) (cxt->p - 8) = cpu_to_be32(buflen);
|
||||
ft_put_bin(cxt, buf, buflen);
|
||||
return 0;
|
||||
}
|
||||
p = next;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
int ft_del_prop(struct ft_cxt *cxt, const void *phandle, const char *propname)
|
||||
{
|
||||
struct ft_atom atom;
|
||||
void *node;
|
||||
char *p, *next;
|
||||
int size;
|
||||
|
||||
node = ft_node_ph2node(cxt, phandle);
|
||||
if (node == NULL)
|
||||
return -1;
|
||||
|
||||
p = node;
|
||||
while ((next = ft_next(cxt, p, &atom)) != NULL) {
|
||||
switch (atom.tag) {
|
||||
case OF_DT_BEGIN_NODE:
|
||||
case OF_DT_END_NODE:
|
||||
return -1;
|
||||
case OF_DT_PROP:
|
||||
if (strcmp(atom.name, propname))
|
||||
break;
|
||||
/* found the property, remove it */
|
||||
size = 12 + -_ALIGN(atom.size, 4);
|
||||
cxt->p = p;
|
||||
if (!ft_make_space(cxt, &cxt->p, FT_STRUCT, -size))
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
p = next;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void *ft_create_node(struct ft_cxt *cxt, const void *parent, const char *path)
|
||||
{
|
||||
struct ft_atom atom;
|
||||
char *p, *next;
|
||||
int depth = 0;
|
||||
|
||||
p = cxt->rgn[FT_STRUCT].start;
|
||||
while ((next = ft_next(cxt, p, &atom)) != NULL) {
|
||||
switch (atom.tag) {
|
||||
case OF_DT_BEGIN_NODE:
|
||||
++depth;
|
||||
if (depth == 1 && strcmp(atom.name, path) == 0)
|
||||
/* duplicate node path, return error */
|
||||
return NULL;
|
||||
break;
|
||||
case OF_DT_END_NODE:
|
||||
--depth;
|
||||
if (depth > 0)
|
||||
break;
|
||||
/* end of node, insert here */
|
||||
cxt->p = p;
|
||||
ft_begin_node(cxt, path);
|
||||
ft_end_node(cxt);
|
||||
return p;
|
||||
}
|
||||
p = next;
|
||||
}
|
||||
return NULL;
|
||||
}
|
@ -17,7 +17,7 @@
|
||||
#ifndef FLATDEVTREE_H
|
||||
#define FLATDEVTREE_H
|
||||
|
||||
#include "types.h"
|
||||
#include "flatdevtree_env.h"
|
||||
|
||||
/* Definitions used by the flattened device tree */
|
||||
#define OF_DT_HEADER 0xd00dfeed /* marker */
|
||||
@ -43,4 +43,64 @@ struct boot_param_header {
|
||||
u32 dt_strings_size; /* size of the DT strings block */
|
||||
};
|
||||
|
||||
struct ft_reserve {
|
||||
u64 start;
|
||||
u64 len;
|
||||
};
|
||||
|
||||
struct ft_region {
|
||||
char *start;
|
||||
unsigned long size;
|
||||
};
|
||||
|
||||
enum ft_rgn_id {
|
||||
FT_RSVMAP,
|
||||
FT_STRUCT,
|
||||
FT_STRINGS,
|
||||
FT_N_REGION
|
||||
};
|
||||
|
||||
#define FT_MAX_DEPTH 50
|
||||
|
||||
struct ft_cxt {
|
||||
struct boot_param_header *bph;
|
||||
int max_size; /* maximum size of tree */
|
||||
int isordered; /* everything in standard order */
|
||||
void *(*realloc)(void *, unsigned long);
|
||||
char *str_anchor;
|
||||
char *p; /* current insertion point in structs */
|
||||
struct ft_region rgn[FT_N_REGION];
|
||||
void *genealogy[FT_MAX_DEPTH+1];
|
||||
char **node_tbl;
|
||||
unsigned int node_max;
|
||||
unsigned int nodes_used;
|
||||
};
|
||||
|
||||
int ft_begin_node(struct ft_cxt *cxt, const char *name);
|
||||
void ft_end_node(struct ft_cxt *cxt);
|
||||
|
||||
void ft_begin_tree(struct ft_cxt *cxt);
|
||||
void ft_end_tree(struct ft_cxt *cxt);
|
||||
|
||||
void ft_nop(struct ft_cxt *cxt);
|
||||
int ft_prop(struct ft_cxt *cxt, const char *name,
|
||||
const void *data, unsigned int sz);
|
||||
int ft_prop_str(struct ft_cxt *cxt, const char *name, const char *str);
|
||||
int ft_prop_int(struct ft_cxt *cxt, const char *name, unsigned int val);
|
||||
void ft_begin(struct ft_cxt *cxt, void *blob, unsigned int max_size,
|
||||
void *(*realloc_fn)(void *, unsigned long));
|
||||
int ft_open(struct ft_cxt *cxt, void *blob, unsigned int max_size,
|
||||
unsigned int max_find_device,
|
||||
void *(*realloc_fn)(void *, unsigned long));
|
||||
int ft_add_rsvmap(struct ft_cxt *cxt, u64 physaddr, u64 size);
|
||||
|
||||
void ft_dump_blob(const void *bphp);
|
||||
void ft_merge_blob(struct ft_cxt *cxt, void *blob);
|
||||
void *ft_find_device(struct ft_cxt *cxt, const char *srch_path);
|
||||
void *ft_find_descendent(struct ft_cxt *cxt, void *top, const char *srch_path);
|
||||
int ft_get_prop(struct ft_cxt *cxt, const void *phandle, const char *propname,
|
||||
void *buf, const unsigned int buflen);
|
||||
int ft_set_prop(struct ft_cxt *cxt, const void *phandle, const char *propname,
|
||||
const void *buf, const unsigned int buflen);
|
||||
|
||||
#endif /* FLATDEVTREE_H */
|
||||
|
47
arch/powerpc/boot/flatdevtree_env.h
Normal file
47
arch/powerpc/boot/flatdevtree_env.h
Normal file
@ -0,0 +1,47 @@
|
||||
/*
|
||||
* This file adds the header file glue so that the shared files
|
||||
* flatdevicetree.[ch] can compile and work in the powerpc bootwrapper.
|
||||
*
|
||||
* strncmp & strchr copied from <file:lib/strings.c>
|
||||
* Copyright (C) 1991, 1992 Linus Torvalds
|
||||
*
|
||||
* Maintained by: Mark A. Greer <mgreer@mvista.com>
|
||||
*/
|
||||
#ifndef _PPC_BOOT_FLATDEVTREE_ENV_H_
|
||||
#define _PPC_BOOT_FLATDEVTREE_ENV_H_
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stddef.h>
|
||||
#include "types.h"
|
||||
#include "string.h"
|
||||
#include "stdio.h"
|
||||
#include "ops.h"
|
||||
|
||||
#define be16_to_cpu(x) (x)
|
||||
#define cpu_to_be16(x) (x)
|
||||
#define be32_to_cpu(x) (x)
|
||||
#define cpu_to_be32(x) (x)
|
||||
#define be64_to_cpu(x) (x)
|
||||
#define cpu_to_be64(x) (x)
|
||||
|
||||
static inline int strncmp(const char *cs, const char *ct, size_t count)
|
||||
{
|
||||
signed char __res = 0;
|
||||
|
||||
while (count) {
|
||||
if ((__res = *cs - *ct++) != 0 || !*cs++)
|
||||
break;
|
||||
count--;
|
||||
}
|
||||
return __res;
|
||||
}
|
||||
|
||||
static inline char *strchr(const char *s, int c)
|
||||
{
|
||||
for (; *s != (char)c; ++s)
|
||||
if (*s == '\0')
|
||||
return NULL;
|
||||
return (char *)s;
|
||||
}
|
||||
|
||||
#endif /* _PPC_BOOT_FLATDEVTREE_ENV_H_ */
|
51
arch/powerpc/boot/flatdevtree_misc.c
Normal file
51
arch/powerpc/boot/flatdevtree_misc.c
Normal file
@ -0,0 +1,51 @@
|
||||
/*
|
||||
* This file does the necessary interface mapping between the bootwrapper
|
||||
* device tree operations and the interface provided by shared source
|
||||
* files flatdevicetree.[ch].
|
||||
*
|
||||
* Author: Mark A. Greer <mgreer@mvista.com>
|
||||
*
|
||||
* 2006 (c) MontaVista Software, Inc. This file is licensed under
|
||||
* the terms of the GNU General Public License version 2. This program
|
||||
* is licensed "as is" without any warranty of any kind, whether express
|
||||
* or implied.
|
||||
*/
|
||||
#include <stddef.h>
|
||||
#include "flatdevtree.h"
|
||||
#include "ops.h"
|
||||
|
||||
static struct ft_cxt cxt;
|
||||
|
||||
static void *ft_finddevice(const char *name)
|
||||
{
|
||||
return ft_find_device(&cxt, name);
|
||||
}
|
||||
|
||||
static int ft_getprop(const void *phandle, const char *propname, void *buf,
|
||||
const int buflen)
|
||||
{
|
||||
return ft_get_prop(&cxt, phandle, propname, buf, buflen);
|
||||
}
|
||||
|
||||
static int ft_setprop(const void *phandle, const char *propname,
|
||||
const void *buf, const int buflen)
|
||||
{
|
||||
return ft_set_prop(&cxt, phandle, propname, buf, buflen);
|
||||
}
|
||||
|
||||
static unsigned long ft_finalize(void)
|
||||
{
|
||||
ft_end_tree(&cxt);
|
||||
return (unsigned long)cxt.bph;
|
||||
}
|
||||
|
||||
int ft_init(void *dt_blob, unsigned int max_size, unsigned int max_find_device)
|
||||
{
|
||||
dt_ops.finddevice = ft_finddevice;
|
||||
dt_ops.getprop = ft_getprop;
|
||||
dt_ops.setprop = ft_setprop;
|
||||
dt_ops.finalize = ft_finalize;
|
||||
|
||||
return ft_open(&cxt, dt_blob, max_size, max_find_device,
|
||||
platform_ops.realloc);
|
||||
}
|
53
arch/powerpc/boot/io.h
Normal file
53
arch/powerpc/boot/io.h
Normal file
@ -0,0 +1,53 @@
|
||||
#ifndef _IO_H
|
||||
#define __IO_H
|
||||
/*
|
||||
* Low-level I/O routines.
|
||||
*
|
||||
* Copied from <file:include/asm-powerpc/io.h> (which has no copyright)
|
||||
*/
|
||||
static inline int in_8(const volatile unsigned char *addr)
|
||||
{
|
||||
int ret;
|
||||
|
||||
__asm__ __volatile__("lbz%U1%X1 %0,%1; twi 0,%0,0; isync"
|
||||
: "=r" (ret) : "m" (*addr));
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline void out_8(volatile unsigned char *addr, int val)
|
||||
{
|
||||
__asm__ __volatile__("stb%U0%X0 %1,%0; sync"
|
||||
: "=m" (*addr) : "r" (val));
|
||||
}
|
||||
|
||||
static inline unsigned in_le32(const volatile unsigned *addr)
|
||||
{
|
||||
unsigned ret;
|
||||
|
||||
__asm__ __volatile__("lwbrx %0,0,%1; twi 0,%0,0; isync"
|
||||
: "=r" (ret) : "r" (addr), "m" (*addr));
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline unsigned in_be32(const volatile unsigned *addr)
|
||||
{
|
||||
unsigned ret;
|
||||
|
||||
__asm__ __volatile__("lwz%U1%X1 %0,%1; twi 0,%0,0; isync"
|
||||
: "=r" (ret) : "m" (*addr));
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline void out_le32(volatile unsigned *addr, int val)
|
||||
{
|
||||
__asm__ __volatile__("stwbrx %1,0,%2; sync" : "=m" (*addr)
|
||||
: "r" (val), "r" (addr));
|
||||
}
|
||||
|
||||
static inline void out_be32(volatile unsigned *addr, int val)
|
||||
{
|
||||
__asm__ __volatile__("stw%U0%X0 %1,%0; sync"
|
||||
: "=m" (*addr) : "r" (val));
|
||||
}
|
||||
|
||||
#endif /* _IO_H */
|
@ -27,6 +27,8 @@ extern char _vmlinux_start[];
|
||||
extern char _vmlinux_end[];
|
||||
extern char _initrd_start[];
|
||||
extern char _initrd_end[];
|
||||
extern char _dtb_start[];
|
||||
extern char _dtb_end[];
|
||||
|
||||
struct addr_range {
|
||||
unsigned long addr;
|
||||
@ -167,7 +169,7 @@ static int is_elf32(void *hdr)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void prep_kernel(unsigned long *a1, unsigned long *a2)
|
||||
static void prep_kernel(unsigned long a1, unsigned long a2)
|
||||
{
|
||||
int len;
|
||||
|
||||
@ -203,11 +205,14 @@ static void prep_kernel(unsigned long *a1, unsigned long *a2)
|
||||
}
|
||||
|
||||
/*
|
||||
* Now we try to alloc memory for the initrd (and copy it there)
|
||||
* Now find the initrd
|
||||
*
|
||||
* First see if we have an image attached to us. If so
|
||||
* allocate memory for it and copy it there.
|
||||
*/
|
||||
initrd.size = (unsigned long)(_initrd_end - _initrd_start);
|
||||
initrd.memsize = initrd.size;
|
||||
if ( initrd.size > 0 ) {
|
||||
if (initrd.size > 0) {
|
||||
printf("Allocating 0x%lx bytes for initrd ...\n\r",
|
||||
initrd.size);
|
||||
initrd.addr = (unsigned long)malloc((u32)initrd.size);
|
||||
@ -216,8 +221,6 @@ static void prep_kernel(unsigned long *a1, unsigned long *a2)
|
||||
"ramdisk !\n\r");
|
||||
exit();
|
||||
}
|
||||
*a1 = initrd.addr;
|
||||
*a2 = initrd.size;
|
||||
printf("initial ramdisk moving 0x%lx <- 0x%lx "
|
||||
"(0x%lx bytes)\n\r", initrd.addr,
|
||||
(unsigned long)_initrd_start, initrd.size);
|
||||
@ -225,6 +228,12 @@ static void prep_kernel(unsigned long *a1, unsigned long *a2)
|
||||
initrd.size);
|
||||
printf("initrd head: 0x%lx\n\r",
|
||||
*((unsigned long *)initrd.addr));
|
||||
} else if (a2 != 0) {
|
||||
/* Otherwise, see if yaboot or another loader gave us an initrd */
|
||||
initrd.addr = a1;
|
||||
initrd.memsize = initrd.size = a2;
|
||||
printf("Using loader supplied initrd at 0x%lx (0x%lx bytes)\n\r",
|
||||
initrd.addr, initrd.size);
|
||||
}
|
||||
|
||||
/* Eventually gunzip the kernel */
|
||||
@ -250,10 +259,6 @@ static void prep_kernel(unsigned long *a1, unsigned long *a2)
|
||||
flush_cache((void *)vmlinux.addr, vmlinux.size);
|
||||
}
|
||||
|
||||
void __attribute__ ((weak)) ft_init(void *dt_blob)
|
||||
{
|
||||
}
|
||||
|
||||
/* A buffer that may be edited by tools operating on a zImage binary so as to
|
||||
* edit the command line passed to vmlinux (by setting /chosen/bootargs).
|
||||
* The buffer is put in it's own section so that tools may locate it easier.
|
||||
@ -285,36 +290,22 @@ static void set_cmdline(char *buf)
|
||||
setprop(devp, "bootargs", buf, strlen(buf) + 1);
|
||||
}
|
||||
|
||||
/* Section where ft can be tacked on after zImage is built */
|
||||
union blobspace {
|
||||
struct boot_param_header hdr;
|
||||
char space[8*1024];
|
||||
} dt_blob __attribute__((__section__("__builtin_ft")));
|
||||
|
||||
struct platform_ops platform_ops;
|
||||
struct dt_ops dt_ops;
|
||||
struct console_ops console_ops;
|
||||
|
||||
void start(unsigned long a1, unsigned long a2, void *promptr, void *sp)
|
||||
{
|
||||
int have_dt = 0;
|
||||
kernel_entry_t kentry;
|
||||
char cmdline[COMMAND_LINE_SIZE];
|
||||
unsigned long ft_addr = 0;
|
||||
|
||||
memset(__bss_start, 0, _end - __bss_start);
|
||||
memset(&platform_ops, 0, sizeof(platform_ops));
|
||||
memset(&dt_ops, 0, sizeof(dt_ops));
|
||||
memset(&console_ops, 0, sizeof(console_ops));
|
||||
|
||||
/* Override the dt_ops and device tree if there was an flat dev
|
||||
* tree attached to the zImage.
|
||||
*/
|
||||
if (dt_blob.hdr.magic == OF_DT_HEADER) {
|
||||
have_dt = 1;
|
||||
ft_init(&dt_blob);
|
||||
}
|
||||
|
||||
if (platform_init(promptr))
|
||||
if (platform_init(promptr, _dtb_start, _dtb_end))
|
||||
exit();
|
||||
if (console_ops.open && (console_ops.open() < 0))
|
||||
exit();
|
||||
@ -324,7 +315,7 @@ void start(unsigned long a1, unsigned long a2, void *promptr, void *sp)
|
||||
printf("\n\rzImage starting: loaded at 0x%p (sp: 0x%p)\n\r",
|
||||
_start, sp);
|
||||
|
||||
prep_kernel(&a1, &a2);
|
||||
prep_kernel(a1, a2);
|
||||
|
||||
/* If cmdline came from zimage wrapper or if we can edit the one
|
||||
* in the dt, print it out and edit it, if possible.
|
||||
@ -338,15 +329,23 @@ void start(unsigned long a1, unsigned long a2, void *promptr, void *sp)
|
||||
set_cmdline(cmdline);
|
||||
}
|
||||
|
||||
printf("Finalizing device tree...");
|
||||
if (dt_ops.finalize)
|
||||
ft_addr = dt_ops.finalize();
|
||||
if (ft_addr)
|
||||
printf(" flat tree at 0x%lx\n\r", ft_addr);
|
||||
else
|
||||
printf(" using OF tree (promptr=%p)\n\r", promptr);
|
||||
|
||||
if (console_ops.close)
|
||||
console_ops.close();
|
||||
|
||||
kentry = (kernel_entry_t) vmlinux.addr;
|
||||
if (have_dt)
|
||||
kentry(dt_ops.ft_addr(), 0, NULL);
|
||||
if (ft_addr)
|
||||
kentry(ft_addr, 0, NULL);
|
||||
else
|
||||
/* XXX initrd addr/size should be passed in properties */
|
||||
kentry(a1, a2, promptr);
|
||||
kentry(initrd.addr, initrd.size, promptr);
|
||||
|
||||
/* console closed so printf below may not work */
|
||||
printf("Error: Linux kernel returned to zImage boot wrapper!\n\r");
|
||||
|
152
arch/powerpc/boot/mktree.c
Normal file
152
arch/powerpc/boot/mktree.c
Normal file
@ -0,0 +1,152 @@
|
||||
/*
|
||||
* Makes a tree bootable image for IBM Evaluation boards.
|
||||
* Basically, just take a zImage, skip the ELF header, and stuff
|
||||
* a 32 byte header on the front.
|
||||
*
|
||||
* We use htonl, which is a network macro, to make sure we're doing
|
||||
* The Right Thing on an LE machine. It's non-obvious, but it should
|
||||
* work on anything BSD'ish.
|
||||
*/
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#include <netinet/in.h>
|
||||
#ifdef __sun__
|
||||
#include <inttypes.h>
|
||||
#else
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
|
||||
/* This gets tacked on the front of the image. There are also a few
|
||||
* bytes allocated after the _start label used by the boot rom (see
|
||||
* head.S for details).
|
||||
*/
|
||||
typedef struct boot_block {
|
||||
uint32_t bb_magic; /* 0x0052504F */
|
||||
uint32_t bb_dest; /* Target address of the image */
|
||||
uint32_t bb_num_512blocks; /* Size, rounded-up, in 512 byte blks */
|
||||
uint32_t bb_debug_flag; /* Run debugger or image after load */
|
||||
uint32_t bb_entry_point; /* The image address to start */
|
||||
uint32_t bb_checksum; /* 32 bit checksum including header */
|
||||
uint32_t reserved[2];
|
||||
} boot_block_t;
|
||||
|
||||
#define IMGBLK 512
|
||||
char tmpbuf[IMGBLK];
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int in_fd, out_fd;
|
||||
int nblks, i;
|
||||
uint cksum, *cp;
|
||||
struct stat st;
|
||||
boot_block_t bt;
|
||||
|
||||
if (argc < 3) {
|
||||
fprintf(stderr, "usage: %s <zImage-file> <boot-image> [entry-point]\n",argv[0]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (stat(argv[1], &st) < 0) {
|
||||
perror("stat");
|
||||
exit(2);
|
||||
}
|
||||
|
||||
nblks = (st.st_size + IMGBLK) / IMGBLK;
|
||||
|
||||
bt.bb_magic = htonl(0x0052504F);
|
||||
|
||||
/* If we have the optional entry point parameter, use it */
|
||||
if (argc == 4)
|
||||
bt.bb_dest = bt.bb_entry_point = htonl(strtoul(argv[3], NULL, 0));
|
||||
else
|
||||
bt.bb_dest = bt.bb_entry_point = htonl(0x500000);
|
||||
|
||||
/* We know these from the linker command.
|
||||
* ...and then move it up into memory a little more so the
|
||||
* relocation can happen.
|
||||
*/
|
||||
bt.bb_num_512blocks = htonl(nblks);
|
||||
bt.bb_debug_flag = 0;
|
||||
|
||||
bt.bb_checksum = 0;
|
||||
|
||||
/* To be neat and tidy :-).
|
||||
*/
|
||||
bt.reserved[0] = 0;
|
||||
bt.reserved[1] = 0;
|
||||
|
||||
if ((in_fd = open(argv[1], O_RDONLY)) < 0) {
|
||||
perror("zImage open");
|
||||
exit(3);
|
||||
}
|
||||
|
||||
if ((out_fd = open(argv[2], (O_RDWR | O_CREAT | O_TRUNC), 0666)) < 0) {
|
||||
perror("bootfile open");
|
||||
exit(3);
|
||||
}
|
||||
|
||||
cksum = 0;
|
||||
cp = (void *)&bt;
|
||||
for (i=0; i<sizeof(bt)/sizeof(uint); i++)
|
||||
cksum += *cp++;
|
||||
|
||||
/* Assume zImage is an ELF file, and skip the 64K header.
|
||||
*/
|
||||
if (read(in_fd, tmpbuf, IMGBLK) != IMGBLK) {
|
||||
fprintf(stderr, "%s is too small to be an ELF image\n",
|
||||
argv[1]);
|
||||
exit(4);
|
||||
}
|
||||
|
||||
if ((*(uint *)tmpbuf) != htonl(0x7f454c46)) {
|
||||
fprintf(stderr, "%s is not an ELF image\n", argv[1]);
|
||||
exit(4);
|
||||
}
|
||||
|
||||
if (lseek(in_fd, (64 * 1024), SEEK_SET) < 0) {
|
||||
fprintf(stderr, "%s failed to seek in ELF image\n", argv[1]);
|
||||
exit(4);
|
||||
}
|
||||
|
||||
nblks -= (64 * 1024) / IMGBLK;
|
||||
|
||||
/* And away we go......
|
||||
*/
|
||||
if (write(out_fd, &bt, sizeof(bt)) != sizeof(bt)) {
|
||||
perror("boot-image write");
|
||||
exit(5);
|
||||
}
|
||||
|
||||
while (nblks-- > 0) {
|
||||
if (read(in_fd, tmpbuf, IMGBLK) < 0) {
|
||||
perror("zImage read");
|
||||
exit(5);
|
||||
}
|
||||
cp = (uint *)tmpbuf;
|
||||
for (i=0; i<sizeof(tmpbuf)/sizeof(uint); i++)
|
||||
cksum += *cp++;
|
||||
if (write(out_fd, tmpbuf, sizeof(tmpbuf)) != sizeof(tmpbuf)) {
|
||||
perror("boot-image write");
|
||||
exit(5);
|
||||
}
|
||||
}
|
||||
|
||||
/* rewrite the header with the computed checksum.
|
||||
*/
|
||||
bt.bb_checksum = htonl(cksum);
|
||||
if (lseek(out_fd, 0, SEEK_SET) < 0) {
|
||||
perror("rewrite seek");
|
||||
exit(1);
|
||||
}
|
||||
if (write(out_fd, &bt, sizeof(bt)) != sizeof(bt)) {
|
||||
perror("boot-image rewrite");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
exit(0);
|
||||
}
|
74
arch/powerpc/boot/ns16550.c
Normal file
74
arch/powerpc/boot/ns16550.c
Normal file
@ -0,0 +1,74 @@
|
||||
/*
|
||||
* 16550 serial console support.
|
||||
*
|
||||
* Original copied from <file:arch/ppc/boot/common/ns16550.c>
|
||||
* (which had no copyright)
|
||||
* Modifications: 2006 (c) MontaVista Software, Inc.
|
||||
*
|
||||
* Modified by: Mark A. Greer <mgreer@mvista.com>
|
||||
*/
|
||||
#include <stdarg.h>
|
||||
#include <stddef.h>
|
||||
#include "types.h"
|
||||
#include "string.h"
|
||||
#include "stdio.h"
|
||||
#include "io.h"
|
||||
#include "ops.h"
|
||||
|
||||
#define UART_DLL 0 /* Out: Divisor Latch Low */
|
||||
#define UART_DLM 1 /* Out: Divisor Latch High */
|
||||
#define UART_FCR 2 /* Out: FIFO Control Register */
|
||||
#define UART_LCR 3 /* Out: Line Control Register */
|
||||
#define UART_MCR 4 /* Out: Modem Control Register */
|
||||
#define UART_LSR 5 /* In: Line Status Register */
|
||||
#define UART_LSR_THRE 0x20 /* Transmit-hold-register empty */
|
||||
#define UART_LSR_DR 0x01 /* Receiver data ready */
|
||||
#define UART_MSR 6 /* In: Modem Status Register */
|
||||
#define UART_SCR 7 /* I/O: Scratch Register */
|
||||
|
||||
static unsigned char *reg_base;
|
||||
static u32 reg_shift;
|
||||
|
||||
static int ns16550_open(void)
|
||||
{
|
||||
out_8(reg_base + (UART_FCR << reg_shift), 0x06);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ns16550_putc(unsigned char c)
|
||||
{
|
||||
while ((in_8(reg_base + (UART_LSR << reg_shift)) & UART_LSR_THRE) == 0);
|
||||
out_8(reg_base, c);
|
||||
}
|
||||
|
||||
static unsigned char ns16550_getc(void)
|
||||
{
|
||||
while ((in_8(reg_base + (UART_LSR << reg_shift)) & UART_LSR_DR) == 0);
|
||||
return in_8(reg_base);
|
||||
}
|
||||
|
||||
static u8 ns16550_tstc(void)
|
||||
{
|
||||
return ((in_8(reg_base + (UART_LSR << reg_shift)) & UART_LSR_DR) != 0);
|
||||
}
|
||||
|
||||
int ns16550_console_init(void *devp, struct serial_console_data *scdp)
|
||||
{
|
||||
int n;
|
||||
|
||||
n = getprop(devp, "virtual-reg", ®_base, sizeof(reg_base));
|
||||
if (n != sizeof(reg_base))
|
||||
return -1;
|
||||
|
||||
n = getprop(devp, "reg-shift", ®_shift, sizeof(reg_shift));
|
||||
if (n != sizeof(reg_shift))
|
||||
reg_shift = 0;
|
||||
|
||||
scdp->open = ns16550_open;
|
||||
scdp->putc = ns16550_putc;
|
||||
scdp->getc = ns16550_getc;
|
||||
scdp->tstc = ns16550_tstc;
|
||||
scdp->close = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
@ -256,24 +256,18 @@ static void of_console_write(char *buf, int len)
|
||||
call_prom("write", 3, 1, of_stdout_handle, buf, len);
|
||||
}
|
||||
|
||||
int platform_init(void *promptr)
|
||||
int platform_init(void *promptr, char *dt_blob_start, char *dt_blob_end)
|
||||
{
|
||||
platform_ops.fixups = NULL;
|
||||
platform_ops.image_hdr = of_image_hdr;
|
||||
platform_ops.malloc = of_try_claim;
|
||||
platform_ops.free = NULL;
|
||||
platform_ops.exit = of_exit;
|
||||
|
||||
dt_ops.finddevice = of_finddevice;
|
||||
dt_ops.getprop = of_getprop;
|
||||
dt_ops.setprop = of_setprop;
|
||||
dt_ops.translate_addr = NULL;
|
||||
|
||||
console_ops.open = of_console_open;
|
||||
console_ops.write = of_console_write;
|
||||
console_ops.edit_cmdline = NULL;
|
||||
console_ops.close = NULL;
|
||||
console_ops.data = NULL;
|
||||
|
||||
prom = (int (*)(void *))promptr;
|
||||
return 0;
|
||||
|
@ -22,7 +22,8 @@ struct platform_ops {
|
||||
void (*fixups)(void);
|
||||
void (*image_hdr)(const void *);
|
||||
void * (*malloc)(u32 size);
|
||||
void (*free)(void *ptr, u32 size);
|
||||
void (*free)(void *ptr);
|
||||
void * (*realloc)(void *ptr, unsigned long size);
|
||||
void (*exit)(void);
|
||||
};
|
||||
extern struct platform_ops platform_ops;
|
||||
@ -30,13 +31,11 @@ extern struct platform_ops platform_ops;
|
||||
/* Device Tree operations */
|
||||
struct dt_ops {
|
||||
void * (*finddevice)(const char *name);
|
||||
int (*getprop)(const void *node, const char *name, void *buf,
|
||||
int (*getprop)(const void *phandle, const char *name, void *buf,
|
||||
const int buflen);
|
||||
int (*setprop)(const void *node, const char *name,
|
||||
int (*setprop)(const void *phandle, const char *name,
|
||||
const void *buf, const int buflen);
|
||||
u64 (*translate_addr)(const char *path, const u32 *in_addr,
|
||||
const u32 addr_len);
|
||||
unsigned long (*ft_addr)(void);
|
||||
unsigned long (*finalize)(void);
|
||||
};
|
||||
extern struct dt_ops dt_ops;
|
||||
|
||||
@ -59,10 +58,13 @@ struct serial_console_data {
|
||||
void (*close)(void);
|
||||
};
|
||||
|
||||
extern int platform_init(void *promptr);
|
||||
extern void simple_alloc_init(void);
|
||||
extern void ft_init(void *dt_blob);
|
||||
extern int serial_console_init(void);
|
||||
int platform_init(void *promptr, char *dt_blob_start, char *dt_blob_end);
|
||||
int ft_init(void *dt_blob, unsigned int max_size, unsigned int max_find_device);
|
||||
int serial_console_init(void);
|
||||
int ns16550_console_init(void *devp, struct serial_console_data *scdp);
|
||||
void *simple_alloc_init(char *base, u32 heap_size, u32 granularity,
|
||||
u32 max_allocs);
|
||||
|
||||
|
||||
static inline void *finddevice(const char *name)
|
||||
{
|
||||
@ -84,10 +86,10 @@ static inline void *malloc(u32 size)
|
||||
return (platform_ops.malloc) ? platform_ops.malloc(size) : NULL;
|
||||
}
|
||||
|
||||
static inline void free(void *ptr, u32 size)
|
||||
static inline void free(void *ptr)
|
||||
{
|
||||
if (platform_ops.free)
|
||||
platform_ops.free(ptr, size);
|
||||
platform_ops.free(ptr);
|
||||
}
|
||||
|
||||
static inline void exit(void)
|
||||
|
142
arch/powerpc/boot/serial.c
Normal file
142
arch/powerpc/boot/serial.c
Normal file
@ -0,0 +1,142 @@
|
||||
/*
|
||||
* Generic serial console support
|
||||
*
|
||||
* Author: Mark A. Greer <mgreer@mvista.com>
|
||||
*
|
||||
* Code in serial_edit_cmdline() copied from <file:arch/ppc/boot/simple/misc.c>
|
||||
* and was written by Matt Porter <mporter@kernel.crashing.org>.
|
||||
*
|
||||
* 2001,2006 (c) MontaVista Software, Inc. This file is licensed under
|
||||
* the terms of the GNU General Public License version 2. This program
|
||||
* is licensed "as is" without any warranty of any kind, whether express
|
||||
* or implied.
|
||||
*/
|
||||
#include <stdarg.h>
|
||||
#include <stddef.h>
|
||||
#include "types.h"
|
||||
#include "string.h"
|
||||
#include "stdio.h"
|
||||
#include "io.h"
|
||||
#include "ops.h"
|
||||
|
||||
extern void udelay(long delay);
|
||||
|
||||
static int serial_open(void)
|
||||
{
|
||||
struct serial_console_data *scdp = console_ops.data;
|
||||
return scdp->open();
|
||||
}
|
||||
|
||||
static void serial_write(char *buf, int len)
|
||||
{
|
||||
struct serial_console_data *scdp = console_ops.data;
|
||||
|
||||
while (*buf != '\0')
|
||||
scdp->putc(*buf++);
|
||||
}
|
||||
|
||||
static void serial_edit_cmdline(char *buf, int len)
|
||||
{
|
||||
int timer = 0, count;
|
||||
char ch, *cp;
|
||||
struct serial_console_data *scdp = console_ops.data;
|
||||
|
||||
cp = buf;
|
||||
count = strlen(buf);
|
||||
cp = &buf[count];
|
||||
count++;
|
||||
|
||||
while (timer++ < 5*1000) {
|
||||
if (scdp->tstc()) {
|
||||
while (((ch = scdp->getc()) != '\n') && (ch != '\r')) {
|
||||
/* Test for backspace/delete */
|
||||
if ((ch == '\b') || (ch == '\177')) {
|
||||
if (cp != buf) {
|
||||
cp--;
|
||||
count--;
|
||||
printf("\b \b");
|
||||
}
|
||||
/* Test for ^x/^u (and wipe the line) */
|
||||
} else if ((ch == '\030') || (ch == '\025')) {
|
||||
while (cp != buf) {
|
||||
cp--;
|
||||
count--;
|
||||
printf("\b \b");
|
||||
}
|
||||
} else if (count < len) {
|
||||
*cp++ = ch;
|
||||
count++;
|
||||
scdp->putc(ch);
|
||||
}
|
||||
}
|
||||
break; /* Exit 'timer' loop */
|
||||
}
|
||||
udelay(1000); /* 1 msec */
|
||||
}
|
||||
*cp = 0;
|
||||
}
|
||||
|
||||
static void serial_close(void)
|
||||
{
|
||||
struct serial_console_data *scdp = console_ops.data;
|
||||
|
||||
if (scdp->close)
|
||||
scdp->close();
|
||||
}
|
||||
|
||||
static void *serial_get_stdout_devp(void)
|
||||
{
|
||||
void *devp;
|
||||
char devtype[MAX_PROP_LEN];
|
||||
char path[MAX_PATH_LEN];
|
||||
|
||||
devp = finddevice("/chosen");
|
||||
if (devp == NULL)
|
||||
goto err_out;
|
||||
|
||||
if (getprop(devp, "linux,stdout-path", path, MAX_PATH_LEN) > 0) {
|
||||
devp = finddevice(path);
|
||||
if (devp == NULL)
|
||||
goto err_out;
|
||||
|
||||
if ((getprop(devp, "device_type", devtype, sizeof(devtype)) > 0)
|
||||
&& !strcmp(devtype, "serial"))
|
||||
return devp;
|
||||
}
|
||||
err_out:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static struct serial_console_data serial_cd;
|
||||
|
||||
/* Node's "compatible" property determines which serial driver to use */
|
||||
int serial_console_init(void)
|
||||
{
|
||||
void *devp;
|
||||
int rc = -1;
|
||||
char compat[MAX_PROP_LEN];
|
||||
|
||||
devp = serial_get_stdout_devp();
|
||||
if (devp == NULL)
|
||||
goto err_out;
|
||||
|
||||
if (getprop(devp, "compatible", compat, sizeof(compat)) < 0)
|
||||
goto err_out;
|
||||
|
||||
if (!strcmp(compat, "ns16550"))
|
||||
rc = ns16550_console_init(devp, &serial_cd);
|
||||
|
||||
/* Add other serial console driver calls here */
|
||||
|
||||
if (!rc) {
|
||||
console_ops.open = serial_open;
|
||||
console_ops.write = serial_write;
|
||||
console_ops.edit_cmdline = serial_edit_cmdline;
|
||||
console_ops.close = serial_close;
|
||||
console_ops.data = &serial_cd;
|
||||
|
||||
return 0;
|
||||
}
|
||||
err_out:
|
||||
return -1;
|
||||
}
|
149
arch/powerpc/boot/simple_alloc.c
Normal file
149
arch/powerpc/boot/simple_alloc.c
Normal file
@ -0,0 +1,149 @@
|
||||
/*
|
||||
* Implement primitive realloc(3) functionality.
|
||||
*
|
||||
* Author: Mark A. Greer <mgreer@mvista.com>
|
||||
*
|
||||
* 2006 (c) MontaVista, Software, Inc. This file is licensed under
|
||||
* the terms of the GNU General Public License version 2. This program
|
||||
* is licensed "as is" without any warranty of any kind, whether express
|
||||
* or implied.
|
||||
*/
|
||||
|
||||
#include <stddef.h>
|
||||
#include "types.h"
|
||||
#include "page.h"
|
||||
#include "string.h"
|
||||
#include "ops.h"
|
||||
|
||||
#define ENTRY_BEEN_USED 0x01
|
||||
#define ENTRY_IN_USE 0x02
|
||||
|
||||
static struct alloc_info {
|
||||
u32 flags;
|
||||
u32 base;
|
||||
u32 size;
|
||||
} *alloc_tbl;
|
||||
|
||||
static u32 tbl_entries;
|
||||
static u32 alloc_min;
|
||||
static u32 next_base;
|
||||
static u32 space_left;
|
||||
|
||||
/*
|
||||
* First time an entry is used, its base and size are set.
|
||||
* An entry can be freed and re-malloc'd but its base & size don't change.
|
||||
* Should be smart enough for needs of bootwrapper.
|
||||
*/
|
||||
static void *simple_malloc(u32 size)
|
||||
{
|
||||
u32 i;
|
||||
struct alloc_info *p = alloc_tbl;
|
||||
|
||||
if (size == 0)
|
||||
goto err_out;
|
||||
|
||||
size = _ALIGN_UP(size, alloc_min);
|
||||
|
||||
for (i=0; i<tbl_entries; i++, p++)
|
||||
if (!(p->flags & ENTRY_BEEN_USED)) { /* never been used */
|
||||
if (size <= space_left) {
|
||||
p->base = next_base;
|
||||
p->size = size;
|
||||
p->flags = ENTRY_BEEN_USED | ENTRY_IN_USE;
|
||||
next_base += size;
|
||||
space_left -= size;
|
||||
return (void *)p->base;
|
||||
}
|
||||
goto err_out; /* not enough space left */
|
||||
}
|
||||
/* reuse an entry keeping same base & size */
|
||||
else if (!(p->flags & ENTRY_IN_USE) && (size <= p->size)) {
|
||||
p->flags |= ENTRY_IN_USE;
|
||||
return (void *)p->base;
|
||||
}
|
||||
err_out:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static struct alloc_info *simple_find_entry(void *ptr)
|
||||
{
|
||||
u32 i;
|
||||
struct alloc_info *p = alloc_tbl;
|
||||
|
||||
for (i=0; i<tbl_entries; i++,p++) {
|
||||
if (!(p->flags & ENTRY_BEEN_USED))
|
||||
break;
|
||||
if ((p->flags & ENTRY_IN_USE) && (p->base == (u32)ptr))
|
||||
return p;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void simple_free(void *ptr)
|
||||
{
|
||||
struct alloc_info *p = simple_find_entry(ptr);
|
||||
|
||||
if (p != NULL)
|
||||
p->flags &= ~ENTRY_IN_USE;
|
||||
}
|
||||
|
||||
/*
|
||||
* Change size of area pointed to by 'ptr' to 'size'.
|
||||
* If 'ptr' is NULL, then its a malloc(). If 'size' is 0, then its a free().
|
||||
* 'ptr' must be NULL or a pointer to a non-freed area previously returned by
|
||||
* simple_realloc() or simple_malloc().
|
||||
*/
|
||||
static void *simple_realloc(void *ptr, unsigned long size)
|
||||
{
|
||||
struct alloc_info *p;
|
||||
void *new;
|
||||
|
||||
if (size == 0) {
|
||||
simple_free(ptr);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (ptr == NULL)
|
||||
return simple_malloc(size);
|
||||
|
||||
p = simple_find_entry(ptr);
|
||||
if (p == NULL) /* ptr not from simple_malloc/simple_realloc */
|
||||
return NULL;
|
||||
if (size <= p->size) /* fits in current block */
|
||||
return ptr;
|
||||
|
||||
new = simple_malloc(size);
|
||||
memcpy(new, ptr, p->size);
|
||||
simple_free(ptr);
|
||||
return new;
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns addr of first byte after heap so caller can see if it took
|
||||
* too much space. If so, change args & try again.
|
||||
*/
|
||||
void *simple_alloc_init(char *base, u32 heap_size, u32 granularity,
|
||||
u32 max_allocs)
|
||||
{
|
||||
u32 heap_base, tbl_size;
|
||||
|
||||
heap_size = _ALIGN_UP(heap_size, granularity);
|
||||
alloc_min = granularity;
|
||||
tbl_entries = max_allocs;
|
||||
|
||||
tbl_size = tbl_entries * sizeof(struct alloc_info);
|
||||
|
||||
alloc_tbl = (struct alloc_info *)_ALIGN_UP((unsigned long)base, 8);
|
||||
memset(alloc_tbl, 0, tbl_size);
|
||||
|
||||
heap_base = _ALIGN_UP((u32)alloc_tbl + tbl_size, alloc_min);
|
||||
|
||||
next_base = heap_base;
|
||||
space_left = heap_size;
|
||||
|
||||
platform_ops.malloc = simple_malloc;
|
||||
platform_ops.free = simple_free;
|
||||
platform_ops.realloc = simple_realloc;
|
||||
|
||||
return (void *)(heap_base + heap_size);
|
||||
}
|
@ -320,6 +320,7 @@ printf(const char *fmt, ...)
|
||||
va_start(args, fmt);
|
||||
n = vsprintf(sprint_buf, fmt, args);
|
||||
va_end(args);
|
||||
console_ops.write(sprint_buf, n);
|
||||
if (console_ops.write)
|
||||
console_ops.write(sprint_buf, n);
|
||||
return n;
|
||||
}
|
||||
|
88
arch/powerpc/boot/util.S
Normal file
88
arch/powerpc/boot/util.S
Normal file
@ -0,0 +1,88 @@
|
||||
/*
|
||||
* Copied from <file:arch/powerpc/kernel/misc_32.S>
|
||||
*
|
||||
* This file contains miscellaneous low-level functions.
|
||||
* Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
|
||||
*
|
||||
* Largely rewritten by Cort Dougan (cort@cs.nmt.edu)
|
||||
* and Paul Mackerras.
|
||||
*
|
||||
* kexec bits:
|
||||
* Copyright (C) 2002-2003 Eric Biederman <ebiederm@xmission.com>
|
||||
* GameCube/ppc32 port Copyright (C) 2004 Albert Herranz
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
*/
|
||||
#include "ppc_asm.h"
|
||||
|
||||
#define SPRN_PVR 0x11F /* Processor Version Register */
|
||||
|
||||
.text
|
||||
|
||||
/* udelay (on non-601 processors) needs to know the period of the
|
||||
* timebase in nanoseconds. This used to be hardcoded to be 60ns
|
||||
* (period of 66MHz/4). Now a variable is used that is initialized to
|
||||
* 60 for backward compatibility, but it can be overridden as necessary
|
||||
* with code something like this:
|
||||
* extern unsigned long timebase_period_ns;
|
||||
* timebase_period_ns = 1000000000 / bd->bi_tbfreq;
|
||||
*/
|
||||
.data
|
||||
.globl timebase_period_ns
|
||||
timebase_period_ns:
|
||||
.long 60
|
||||
|
||||
.text
|
||||
/*
|
||||
* Delay for a number of microseconds
|
||||
*/
|
||||
.globl udelay
|
||||
udelay:
|
||||
mfspr r4,SPRN_PVR
|
||||
srwi r4,r4,16
|
||||
cmpwi 0,r4,1 /* 601 ? */
|
||||
bne .udelay_not_601
|
||||
00: li r0,86 /* Instructions / microsecond? */
|
||||
mtctr r0
|
||||
10: addi r0,r0,0 /* NOP */
|
||||
bdnz 10b
|
||||
subic. r3,r3,1
|
||||
bne 00b
|
||||
blr
|
||||
|
||||
.udelay_not_601:
|
||||
mulli r4,r3,1000 /* nanoseconds */
|
||||
/* Change r4 to be the number of ticks using:
|
||||
* (nanoseconds + (timebase_period_ns - 1 )) / timebase_period_ns
|
||||
* timebase_period_ns defaults to 60 (16.6MHz) */
|
||||
mflr r5
|
||||
bl 0f
|
||||
0: mflr r6
|
||||
mtlr r5
|
||||
lis r5,0b@ha
|
||||
addi r5,r5,0b@l
|
||||
subf r5,r5,r6 /* In case we're relocated */
|
||||
addis r5,r5,timebase_period_ns@ha
|
||||
lwz r5,timebase_period_ns@l(r5)
|
||||
add r4,r4,r5
|
||||
addi r4,r4,-1
|
||||
divw r4,r4,r5 /* BUS ticks */
|
||||
1: mftbu r5
|
||||
mftb r6
|
||||
mftbu r7
|
||||
cmpw 0,r5,r7
|
||||
bne 1b /* Get [synced] base time */
|
||||
addc r9,r6,r4 /* Compute end time */
|
||||
addze r8,r5
|
||||
2: mftbu r5
|
||||
cmpw 0,r5,r8
|
||||
blt 2b
|
||||
bgt 3f
|
||||
mftb r6
|
||||
cmpw 0,r6,r9
|
||||
blt 2b
|
||||
3: blr
|
@ -184,6 +184,9 @@ fi
|
||||
|
||||
if [ -n "$dtb" ]; then
|
||||
addsec $tmp "$dtb" .kernel:dtb
|
||||
if [ -n "$dts" ]; then
|
||||
rm $dtb
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$platform" != "miboot" ]; then
|
||||
|
@ -21,6 +21,10 @@ SECTIONS
|
||||
*(.got2)
|
||||
__got2_end = .;
|
||||
|
||||
_dtb_start = .;
|
||||
*(.kernel:dtb)
|
||||
_dtb_end = .;
|
||||
|
||||
_vmlinux_start = .;
|
||||
*(.kernel:vmlinux.strip)
|
||||
_vmlinux_end = .;
|
||||
|
@ -1,7 +1,7 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.18
|
||||
# Wed Oct 4 15:30:50 2006
|
||||
# Linux kernel version: 2.6.19-rc6
|
||||
# Wed Nov 22 15:33:04 2006
|
||||
#
|
||||
CONFIG_PPC64=y
|
||||
CONFIG_64BIT=y
|
||||
@ -32,6 +32,10 @@ CONFIG_AUDIT_ARCH=y
|
||||
CONFIG_POWER3=y
|
||||
CONFIG_POWER4=y
|
||||
CONFIG_PPC_FPU=y
|
||||
# CONFIG_PPC_DCR_NATIVE is not set
|
||||
CONFIG_PPC_DCR_MMIO=y
|
||||
CONFIG_PPC_DCR=y
|
||||
CONFIG_PPC_OF_PLATFORM_PCI=y
|
||||
CONFIG_ALTIVEC=y
|
||||
CONFIG_PPC_STD_MMU=y
|
||||
CONFIG_VIRT_CPU_ACCOUNTING=y
|
||||
@ -67,7 +71,7 @@ CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
||||
CONFIG_SYSCTL=y
|
||||
# CONFIG_EMBEDDED is not set
|
||||
# CONFIG_SYSCTL_SYSCALL is not set
|
||||
CONFIG_SYSCTL_SYSCALL=y
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
@ -131,6 +135,7 @@ CONFIG_PPC_CELL=y
|
||||
CONFIG_PPC_CELL_NATIVE=y
|
||||
CONFIG_PPC_IBM_CELL_BLADE=y
|
||||
CONFIG_UDBG_RTAS_CONSOLE=y
|
||||
CONFIG_PPC_PS3=y
|
||||
# CONFIG_U3_DART is not set
|
||||
CONFIG_PPC_RTAS=y
|
||||
# CONFIG_RTAS_ERROR_LOGGING is not set
|
||||
@ -139,9 +144,23 @@ CONFIG_RTAS_FLASH=y
|
||||
CONFIG_MMIO_NVRAM=y
|
||||
# CONFIG_PPC_MPC106 is not set
|
||||
# CONFIG_PPC_970_NAP is not set
|
||||
# CONFIG_CPU_FREQ is not set
|
||||
CONFIG_PPC_INDIRECT_IO=y
|
||||
CONFIG_GENERIC_IOMAP=y
|
||||
CONFIG_CPU_FREQ=y
|
||||
CONFIG_CPU_FREQ_TABLE=y
|
||||
CONFIG_CPU_FREQ_DEBUG=y
|
||||
CONFIG_CPU_FREQ_STAT=y
|
||||
# CONFIG_CPU_FREQ_STAT_DETAILS is not set
|
||||
CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
|
||||
# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
|
||||
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
|
||||
CONFIG_CPU_FREQ_GOV_POWERSAVE=y
|
||||
CONFIG_CPU_FREQ_GOV_USERSPACE=y
|
||||
CONFIG_CPU_FREQ_GOV_ONDEMAND=y
|
||||
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
|
||||
# CONFIG_CPU_FREQ_PMAC64 is not set
|
||||
# CONFIG_WANT_EARLY_SERIAL is not set
|
||||
# CONFIG_MPIC is not set
|
||||
CONFIG_MPIC=y
|
||||
|
||||
#
|
||||
# Cell Broadband Engine options
|
||||
@ -149,6 +168,15 @@ CONFIG_MMIO_NVRAM=y
|
||||
CONFIG_SPU_FS=m
|
||||
CONFIG_SPU_BASE=y
|
||||
CONFIG_CBE_RAS=y
|
||||
CONFIG_CBE_THERM=m
|
||||
CONFIG_CBE_CPUFREQ=m
|
||||
|
||||
#
|
||||
# PS3 Platform Options
|
||||
#
|
||||
CONFIG_PS3_HTAB_SIZE=20
|
||||
# CONFIG_PS3_DYNAMIC_DMA is not set
|
||||
CONFIG_PS3_USE_LPAR_ADDR=y
|
||||
|
||||
#
|
||||
# Kernel options
|
||||
@ -166,13 +194,14 @@ CONFIG_BINFMT_MISC=m
|
||||
CONFIG_FORCE_MAX_ZONEORDER=9
|
||||
# CONFIG_IOMMU_VMERGE is not set
|
||||
CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
|
||||
CONFIG_KEXEC=y
|
||||
# CONFIG_KEXEC is not set
|
||||
# CONFIG_CRASH_DUMP is not set
|
||||
CONFIG_IRQ_ALL_CPUS=y
|
||||
CONFIG_NUMA=y
|
||||
CONFIG_NODES_SHIFT=4
|
||||
CONFIG_ARCH_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_ARCH_SPARSEMEM_ENABLE=y
|
||||
CONFIG_ARCH_SPARSEMEM_DEFAULT=y
|
||||
CONFIG_ARCH_POPULATES_NODE_MAP=y
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
# CONFIG_FLATMEM_MANUAL is not set
|
||||
@ -189,6 +218,7 @@ CONFIG_SPLIT_PTLOCK_CPUS=4
|
||||
CONFIG_MIGRATION=y
|
||||
CONFIG_RESOURCES_64BIT=y
|
||||
CONFIG_ARCH_MEMORY_PROBE=y
|
||||
CONFIG_NODES_SPAN_OTHER_NODES=y
|
||||
CONFIG_PPC_64K_PAGES=y
|
||||
CONFIG_SCHED_SMT=y
|
||||
CONFIG_PROC_DEVICETREE=y
|
||||
@ -207,7 +237,6 @@ CONFIG_GENERIC_ISA_DMA=y
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCI_DOMAINS=y
|
||||
CONFIG_PCIEPORTBUS=y
|
||||
# CONFIG_PCI_MULTITHREAD_PROBE is not set
|
||||
# CONFIG_PCI_DEBUG is not set
|
||||
|
||||
#
|
||||
@ -280,7 +309,6 @@ CONFIG_INET6_XFRM_MODE_TUNNEL=y
|
||||
# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
|
||||
# CONFIG_IPV6_SIT is not set
|
||||
CONFIG_IPV6_TUNNEL=m
|
||||
# CONFIG_IPV6_SUBTREES is not set
|
||||
# CONFIG_IPV6_MULTIPLE_TABLES is not set
|
||||
# CONFIG_NETWORK_SECMARK is not set
|
||||
CONFIG_NETFILTER=y
|
||||
@ -1107,7 +1135,8 @@ CONFIG_PLIST=y
|
||||
#
|
||||
# Instrumentation Support
|
||||
#
|
||||
# CONFIG_PROFILING is not set
|
||||
CONFIG_PROFILING=y
|
||||
CONFIG_OPROFILE=y
|
||||
# CONFIG_KPROBES is not set
|
||||
|
||||
#
|
||||
@ -1142,6 +1171,7 @@ CONFIG_DEBUG_FS=y
|
||||
CONFIG_DEBUGGER=y
|
||||
CONFIG_XMON=y
|
||||
CONFIG_XMON_DEFAULT=y
|
||||
CONFIG_XMON_DISASSEMBLY=y
|
||||
CONFIG_IRQSTACKS=y
|
||||
# CONFIG_BOOTX_TEXT is not set
|
||||
# CONFIG_PPC_EARLY_DEBUG is not set
|
||||
@ -1159,7 +1189,7 @@ CONFIG_CRYPTO=y
|
||||
CONFIG_CRYPTO_ALGAPI=y
|
||||
CONFIG_CRYPTO_BLKCIPHER=m
|
||||
CONFIG_CRYPTO_HASH=y
|
||||
# CONFIG_CRYPTO_MANAGER is not set
|
||||
CONFIG_CRYPTO_MANAGER=y
|
||||
CONFIG_CRYPTO_HMAC=y
|
||||
# CONFIG_CRYPTO_NULL is not set
|
||||
# CONFIG_CRYPTO_MD4 is not set
|
||||
|
1583
arch/powerpc/configs/linkstation_defconfig
Normal file
1583
arch/powerpc/configs/linkstation_defconfig
Normal file
File diff suppressed because it is too large
Load Diff
931
arch/powerpc/configs/lite5200_defconfig
Normal file
931
arch/powerpc/configs/lite5200_defconfig
Normal file
@ -0,0 +1,931 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.19-rc6
|
||||
# Mon Nov 27 11:08:20 2006
|
||||
#
|
||||
# CONFIG_PPC64 is not set
|
||||
CONFIG_PPC32=y
|
||||
CONFIG_PPC_MERGE=y
|
||||
CONFIG_MMU=y
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_IRQ_PER_CPU=y
|
||||
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
||||
CONFIG_GENERIC_HWEIGHT=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_GENERIC_FIND_NEXT_BIT=y
|
||||
CONFIG_PPC=y
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_GENERIC_NVRAM=y
|
||||
CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
|
||||
CONFIG_ARCH_MAY_HAVE_PC_FDC=y
|
||||
CONFIG_PPC_OF=y
|
||||
# CONFIG_PPC_UDBG_16550 is not set
|
||||
# CONFIG_GENERIC_TBSYNC is not set
|
||||
CONFIG_AUDIT_ARCH=y
|
||||
# CONFIG_DEFAULT_UIMAGE is not set
|
||||
|
||||
#
|
||||
# Processor support
|
||||
#
|
||||
CONFIG_CLASSIC32=y
|
||||
# CONFIG_PPC_52xx is not set
|
||||
# CONFIG_PPC_82xx is not set
|
||||
# CONFIG_PPC_83xx is not set
|
||||
# CONFIG_PPC_85xx is not set
|
||||
# CONFIG_PPC_86xx is not set
|
||||
# CONFIG_40x is not set
|
||||
# CONFIG_44x is not set
|
||||
# CONFIG_8xx is not set
|
||||
# CONFIG_E200 is not set
|
||||
CONFIG_6xx=y
|
||||
CONFIG_PPC_FPU=y
|
||||
# CONFIG_PPC_DCR_NATIVE is not set
|
||||
# CONFIG_PPC_DCR_MMIO is not set
|
||||
# CONFIG_ALTIVEC is not set
|
||||
CONFIG_PPC_STD_MMU=y
|
||||
CONFIG_PPC_STD_MMU_32=y
|
||||
# CONFIG_SMP is not set
|
||||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
#
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_BROKEN_ON_SMP=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
|
||||
#
|
||||
# General setup
|
||||
#
|
||||
CONFIG_LOCALVERSION=""
|
||||
CONFIG_LOCALVERSION_AUTO=y
|
||||
CONFIG_SWAP=y
|
||||
CONFIG_SYSVIPC=y
|
||||
# CONFIG_IPC_NS is not set
|
||||
# CONFIG_POSIX_MQUEUE is not set
|
||||
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||
# CONFIG_TASKSTATS is not set
|
||||
# CONFIG_UTS_NS is not set
|
||||
# CONFIG_AUDIT is not set
|
||||
# CONFIG_IKCONFIG is not set
|
||||
# CONFIG_RELAY is not set
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
||||
CONFIG_SYSCTL=y
|
||||
CONFIG_EMBEDDED=y
|
||||
# CONFIG_SYSCTL_SYSCALL is not set
|
||||
# CONFIG_KALLSYMS is not set
|
||||
CONFIG_HOTPLUG=y
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
CONFIG_ELF_CORE=y
|
||||
CONFIG_BASE_FULL=y
|
||||
CONFIG_FUTEX=y
|
||||
# CONFIG_EPOLL is not set
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_SLAB=y
|
||||
CONFIG_VM_EVENT_COUNTERS=y
|
||||
CONFIG_RT_MUTEXES=y
|
||||
# CONFIG_TINY_SHMEM is not set
|
||||
CONFIG_BASE_SMALL=0
|
||||
# CONFIG_SLOB is not set
|
||||
|
||||
#
|
||||
# Loadable module support
|
||||
#
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
# CONFIG_MODULE_FORCE_UNLOAD is not set
|
||||
# CONFIG_MODVERSIONS is not set
|
||||
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
||||
# CONFIG_KMOD is not set
|
||||
|
||||
#
|
||||
# Block layer
|
||||
#
|
||||
CONFIG_BLOCK=y
|
||||
# CONFIG_LBD is not set
|
||||
# CONFIG_BLK_DEV_IO_TRACE is not set
|
||||
# CONFIG_LSF is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_AS=y
|
||||
CONFIG_IOSCHED_DEADLINE=y
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
CONFIG_DEFAULT_AS=y
|
||||
# CONFIG_DEFAULT_DEADLINE is not set
|
||||
# CONFIG_DEFAULT_CFQ is not set
|
||||
# CONFIG_DEFAULT_NOOP is not set
|
||||
CONFIG_DEFAULT_IOSCHED="anticipatory"
|
||||
|
||||
#
|
||||
# Platform support
|
||||
#
|
||||
CONFIG_PPC_MULTIPLATFORM=y
|
||||
# CONFIG_EMBEDDED6xx is not set
|
||||
# CONFIG_APUS is not set
|
||||
# CONFIG_PPC_CHRP is not set
|
||||
CONFIG_PPC_MPC52xx=y
|
||||
# CONFIG_PPC_EFIKA is not set
|
||||
CONFIG_PPC_LITE5200=y
|
||||
# CONFIG_PPC_PMAC is not set
|
||||
# CONFIG_PPC_CELL is not set
|
||||
# CONFIG_PPC_CELL_NATIVE is not set
|
||||
# CONFIG_PPC_RTAS is not set
|
||||
# CONFIG_MMIO_NVRAM is not set
|
||||
# CONFIG_PPC_MPC106 is not set
|
||||
# CONFIG_PPC_970_NAP is not set
|
||||
# CONFIG_PPC_INDIRECT_IO is not set
|
||||
# CONFIG_GENERIC_IOMAP is not set
|
||||
# CONFIG_CPU_FREQ is not set
|
||||
# CONFIG_TAU is not set
|
||||
# CONFIG_WANT_EARLY_SERIAL is not set
|
||||
# CONFIG_MPIC is not set
|
||||
|
||||
#
|
||||
# Kernel options
|
||||
#
|
||||
# CONFIG_HIGHMEM is not set
|
||||
# CONFIG_HZ_100 is not set
|
||||
CONFIG_HZ_250=y
|
||||
# CONFIG_HZ_1000 is not set
|
||||
CONFIG_HZ=250
|
||||
CONFIG_PREEMPT_NONE=y
|
||||
# CONFIG_PREEMPT_VOLUNTARY is not set
|
||||
# CONFIG_PREEMPT is not set
|
||||
CONFIG_BINFMT_ELF=y
|
||||
# CONFIG_BINFMT_MISC is not set
|
||||
CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
|
||||
# CONFIG_KEXEC is not set
|
||||
CONFIG_ARCH_FLATMEM_ENABLE=y
|
||||
CONFIG_ARCH_POPULATES_NODE_MAP=y
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_FLATMEM_MANUAL=y
|
||||
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||
CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
# CONFIG_SPARSEMEM_STATIC is not set
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4
|
||||
# CONFIG_RESOURCES_64BIT is not set
|
||||
CONFIG_PROC_DEVICETREE=y
|
||||
# CONFIG_CMDLINE_BOOL is not set
|
||||
CONFIG_PM=y
|
||||
# CONFIG_PM_LEGACY is not set
|
||||
# CONFIG_PM_DEBUG is not set
|
||||
# CONFIG_PM_SYSFS_DEPRECATED is not set
|
||||
# CONFIG_SOFTWARE_SUSPEND is not set
|
||||
CONFIG_SECCOMP=y
|
||||
CONFIG_ISA_DMA_API=y
|
||||
|
||||
#
|
||||
# Bus options
|
||||
#
|
||||
CONFIG_GENERIC_ISA_DMA=y
|
||||
# CONFIG_MPIC_WEIRD is not set
|
||||
# CONFIG_PPC_I8259 is not set
|
||||
# CONFIG_PPC_INDIRECT_PCI is not set
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCI_DOMAINS=y
|
||||
# CONFIG_PCIEPORTBUS is not set
|
||||
# CONFIG_PCI_DEBUG is not set
|
||||
|
||||
#
|
||||
# PCCARD (PCMCIA/CardBus) support
|
||||
#
|
||||
# CONFIG_PCCARD is not set
|
||||
|
||||
#
|
||||
# PCI Hotplug Support
|
||||
#
|
||||
# CONFIG_HOTPLUG_PCI is not set
|
||||
|
||||
#
|
||||
# Advanced setup
|
||||
#
|
||||
# CONFIG_ADVANCED_OPTIONS is not set
|
||||
|
||||
#
|
||||
# Default settings for advanced configuration options are used
|
||||
#
|
||||
CONFIG_HIGHMEM_START=0xfe000000
|
||||
CONFIG_LOWMEM_SIZE=0x30000000
|
||||
CONFIG_KERNEL_START=0xc0000000
|
||||
CONFIG_TASK_SIZE=0x80000000
|
||||
CONFIG_BOOT_LOAD=0x00800000
|
||||
|
||||
#
|
||||
# Networking
|
||||
#
|
||||
CONFIG_NET=y
|
||||
|
||||
#
|
||||
# Networking options
|
||||
#
|
||||
# CONFIG_NETDEBUG is not set
|
||||
CONFIG_PACKET=y
|
||||
# CONFIG_PACKET_MMAP is not set
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_XFRM=y
|
||||
CONFIG_XFRM_USER=m
|
||||
# CONFIG_XFRM_SUB_POLICY is not set
|
||||
# CONFIG_NET_KEY is not set
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_MULTICAST=y
|
||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||
CONFIG_IP_FIB_HASH=y
|
||||
CONFIG_IP_PNP=y
|
||||
CONFIG_IP_PNP_DHCP=y
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
# CONFIG_IP_PNP_RARP is not set
|
||||
# CONFIG_NET_IPIP is not set
|
||||
# CONFIG_NET_IPGRE is not set
|
||||
# CONFIG_IP_MROUTE is not set
|
||||
# CONFIG_ARPD is not set
|
||||
CONFIG_SYN_COOKIES=y
|
||||
# CONFIG_INET_AH is not set
|
||||
# CONFIG_INET_ESP is not set
|
||||
# CONFIG_INET_IPCOMP is not set
|
||||
# CONFIG_INET_XFRM_TUNNEL is not set
|
||||
# CONFIG_INET_TUNNEL is not set
|
||||
CONFIG_INET_XFRM_MODE_TRANSPORT=y
|
||||
CONFIG_INET_XFRM_MODE_TUNNEL=y
|
||||
CONFIG_INET_XFRM_MODE_BEET=y
|
||||
CONFIG_INET_DIAG=y
|
||||
CONFIG_INET_TCP_DIAG=y
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_CUBIC=y
|
||||
CONFIG_DEFAULT_TCP_CONG="cubic"
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_INET6_XFRM_TUNNEL is not set
|
||||
# CONFIG_INET6_TUNNEL is not set
|
||||
# CONFIG_NETWORK_SECMARK is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
||||
#
|
||||
# DCCP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP_DCCP is not set
|
||||
|
||||
#
|
||||
# SCTP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP_SCTP is not set
|
||||
|
||||
#
|
||||
# TIPC Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_TIPC is not set
|
||||
# CONFIG_ATM is not set
|
||||
# CONFIG_BRIDGE is not set
|
||||
# CONFIG_VLAN_8021Q is not set
|
||||
# CONFIG_DECNET is not set
|
||||
# CONFIG_LLC2 is not set
|
||||
# CONFIG_IPX is not set
|
||||
# CONFIG_ATALK is not set
|
||||
# CONFIG_X25 is not set
|
||||
# CONFIG_LAPB is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
|
||||
#
|
||||
# QoS and/or fair queueing
|
||||
#
|
||||
# CONFIG_NET_SCHED is not set
|
||||
|
||||
#
|
||||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
# CONFIG_IEEE80211 is not set
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Generic Driver Options
|
||||
#
|
||||
CONFIG_STANDALONE=y
|
||||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||
# CONFIG_FW_LOADER is not set
|
||||
# CONFIG_DEBUG_DRIVER is not set
|
||||
# CONFIG_SYS_HYPERVISOR is not set
|
||||
|
||||
#
|
||||
# Connector - unified userspace <-> kernelspace linker
|
||||
#
|
||||
# CONFIG_CONNECTOR is not set
|
||||
|
||||
#
|
||||
# Memory Technology Devices (MTD)
|
||||
#
|
||||
# CONFIG_MTD is not set
|
||||
|
||||
#
|
||||
# Parallel port support
|
||||
#
|
||||
# CONFIG_PARPORT is not set
|
||||
|
||||
#
|
||||
# Plug and Play support
|
||||
#
|
||||
|
||||
#
|
||||
# Block devices
|
||||
#
|
||||
# CONFIG_BLK_DEV_FD is not set
|
||||
# CONFIG_BLK_CPQ_DA is not set
|
||||
# CONFIG_BLK_CPQ_CISS_DA is not set
|
||||
# CONFIG_BLK_DEV_DAC960 is not set
|
||||
# CONFIG_BLK_DEV_UMEM is not set
|
||||
# CONFIG_BLK_DEV_COW_COMMON is not set
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
# CONFIG_BLK_DEV_CRYPTOLOOP is not set
|
||||
# CONFIG_BLK_DEV_NBD is not set
|
||||
# CONFIG_BLK_DEV_SX8 is not set
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_BLK_DEV_RAM_SIZE=32768
|
||||
CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
|
||||
#
|
||||
# Misc devices
|
||||
#
|
||||
# CONFIG_SGI_IOC4 is not set
|
||||
# CONFIG_TIFM_CORE is not set
|
||||
|
||||
#
|
||||
# ATA/ATAPI/MFM/RLL support
|
||||
#
|
||||
# CONFIG_IDE is not set
|
||||
|
||||
#
|
||||
# SCSI device support
|
||||
#
|
||||
# CONFIG_RAID_ATTRS is not set
|
||||
CONFIG_SCSI=y
|
||||
# CONFIG_SCSI_NETLINK is not set
|
||||
# CONFIG_SCSI_PROC_FS is not set
|
||||
|
||||
#
|
||||
# SCSI support type (disk, tape, CD-ROM)
|
||||
#
|
||||
# CONFIG_BLK_DEV_SD is not set
|
||||
# CONFIG_CHR_DEV_ST is not set
|
||||
# CONFIG_CHR_DEV_OSST is not set
|
||||
# CONFIG_BLK_DEV_SR is not set
|
||||
# CONFIG_CHR_DEV_SG is not set
|
||||
# CONFIG_CHR_DEV_SCH is not set
|
||||
|
||||
#
|
||||
# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
|
||||
#
|
||||
# CONFIG_SCSI_MULTI_LUN is not set
|
||||
# CONFIG_SCSI_CONSTANTS is not set
|
||||
# CONFIG_SCSI_LOGGING is not set
|
||||
|
||||
#
|
||||
# SCSI Transports
|
||||
#
|
||||
# CONFIG_SCSI_SPI_ATTRS is not set
|
||||
# CONFIG_SCSI_FC_ATTRS is not set
|
||||
# CONFIG_SCSI_ISCSI_ATTRS is not set
|
||||
# CONFIG_SCSI_SAS_ATTRS is not set
|
||||
# CONFIG_SCSI_SAS_LIBSAS is not set
|
||||
|
||||
#
|
||||
# SCSI low-level drivers
|
||||
#
|
||||
# CONFIG_ISCSI_TCP is not set
|
||||
# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
|
||||
# CONFIG_SCSI_3W_9XXX is not set
|
||||
# CONFIG_SCSI_ACARD is not set
|
||||
# CONFIG_SCSI_AACRAID is not set
|
||||
# CONFIG_SCSI_AIC7XXX is not set
|
||||
# CONFIG_SCSI_AIC7XXX_OLD is not set
|
||||
# CONFIG_SCSI_AIC79XX is not set
|
||||
# CONFIG_SCSI_AIC94XX is not set
|
||||
# CONFIG_SCSI_DPT_I2O is not set
|
||||
# CONFIG_SCSI_ARCMSR is not set
|
||||
# CONFIG_MEGARAID_NEWGEN is not set
|
||||
# CONFIG_MEGARAID_LEGACY is not set
|
||||
# CONFIG_MEGARAID_SAS is not set
|
||||
# CONFIG_SCSI_HPTIOP is not set
|
||||
# CONFIG_SCSI_BUSLOGIC is not set
|
||||
# CONFIG_SCSI_DMX3191D is not set
|
||||
# CONFIG_SCSI_EATA is not set
|
||||
# CONFIG_SCSI_FUTURE_DOMAIN is not set
|
||||
# CONFIG_SCSI_GDTH is not set
|
||||
# CONFIG_SCSI_IPS is not set
|
||||
# CONFIG_SCSI_INITIO is not set
|
||||
# CONFIG_SCSI_INIA100 is not set
|
||||
# CONFIG_SCSI_STEX is not set
|
||||
# CONFIG_SCSI_SYM53C8XX_2 is not set
|
||||
# CONFIG_SCSI_IPR is not set
|
||||
# CONFIG_SCSI_QLOGIC_1280 is not set
|
||||
# CONFIG_SCSI_QLA_FC is not set
|
||||
# CONFIG_SCSI_QLA_ISCSI is not set
|
||||
# CONFIG_SCSI_LPFC is not set
|
||||
# CONFIG_SCSI_DC395x is not set
|
||||
# CONFIG_SCSI_DC390T is not set
|
||||
# CONFIG_SCSI_NSP32 is not set
|
||||
# CONFIG_SCSI_DEBUG is not set
|
||||
|
||||
#
|
||||
# Serial ATA (prod) and Parallel ATA (experimental) drivers
|
||||
#
|
||||
CONFIG_ATA=y
|
||||
# CONFIG_SATA_AHCI is not set
|
||||
# CONFIG_SATA_SVW is not set
|
||||
# CONFIG_ATA_PIIX is not set
|
||||
# CONFIG_SATA_MV is not set
|
||||
# CONFIG_SATA_NV is not set
|
||||
# CONFIG_PDC_ADMA is not set
|
||||
# CONFIG_SATA_QSTOR is not set
|
||||
# CONFIG_SATA_PROMISE is not set
|
||||
# CONFIG_SATA_SX4 is not set
|
||||
# CONFIG_SATA_SIL is not set
|
||||
# CONFIG_SATA_SIL24 is not set
|
||||
# CONFIG_SATA_SIS is not set
|
||||
# CONFIG_SATA_ULI is not set
|
||||
# CONFIG_SATA_VIA is not set
|
||||
# CONFIG_SATA_VITESSE is not set
|
||||
# CONFIG_PATA_ALI is not set
|
||||
# CONFIG_PATA_AMD is not set
|
||||
# CONFIG_PATA_ARTOP is not set
|
||||
# CONFIG_PATA_ATIIXP is not set
|
||||
# CONFIG_PATA_CMD64X is not set
|
||||
# CONFIG_PATA_CS5520 is not set
|
||||
# CONFIG_PATA_CS5530 is not set
|
||||
# CONFIG_PATA_CYPRESS is not set
|
||||
# CONFIG_PATA_EFAR is not set
|
||||
# CONFIG_ATA_GENERIC is not set
|
||||
# CONFIG_PATA_HPT366 is not set
|
||||
# CONFIG_PATA_HPT37X is not set
|
||||
# CONFIG_PATA_HPT3X2N is not set
|
||||
# CONFIG_PATA_HPT3X3 is not set
|
||||
# CONFIG_PATA_IT821X is not set
|
||||
# CONFIG_PATA_JMICRON is not set
|
||||
# CONFIG_PATA_TRIFLEX is not set
|
||||
CONFIG_PATA_MPC52xx=y
|
||||
# CONFIG_PATA_MPIIX is not set
|
||||
# CONFIG_PATA_OLDPIIX is not set
|
||||
# CONFIG_PATA_NETCELL is not set
|
||||
# CONFIG_PATA_NS87410 is not set
|
||||
# CONFIG_PATA_OPTI is not set
|
||||
# CONFIG_PATA_OPTIDMA is not set
|
||||
# CONFIG_PATA_PDC_OLD is not set
|
||||
# CONFIG_PATA_RADISYS is not set
|
||||
# CONFIG_PATA_RZ1000 is not set
|
||||
# CONFIG_PATA_SC1200 is not set
|
||||
# CONFIG_PATA_SERVERWORKS is not set
|
||||
# CONFIG_PATA_PDC2027X is not set
|
||||
# CONFIG_PATA_SIL680 is not set
|
||||
# CONFIG_PATA_SIS is not set
|
||||
# CONFIG_PATA_VIA is not set
|
||||
# CONFIG_PATA_WINBOND is not set
|
||||
|
||||
#
|
||||
# Multi-device support (RAID and LVM)
|
||||
#
|
||||
# CONFIG_MD is not set
|
||||
|
||||
#
|
||||
# Fusion MPT device support
|
||||
#
|
||||
# CONFIG_FUSION is not set
|
||||
# CONFIG_FUSION_SPI is not set
|
||||
# CONFIG_FUSION_FC is not set
|
||||
# CONFIG_FUSION_SAS is not set
|
||||
|
||||
#
|
||||
# IEEE 1394 (FireWire) support
|
||||
#
|
||||
# CONFIG_IEEE1394 is not set
|
||||
|
||||
#
|
||||
# I2O device support
|
||||
#
|
||||
# CONFIG_I2O is not set
|
||||
|
||||
#
|
||||
# Macintosh device drivers
|
||||
#
|
||||
# CONFIG_WINDFARM is not set
|
||||
|
||||
#
|
||||
# Network device support
|
||||
#
|
||||
CONFIG_NETDEVICES=y
|
||||
# CONFIG_DUMMY is not set
|
||||
# CONFIG_BONDING is not set
|
||||
# CONFIG_EQUALIZER is not set
|
||||
# CONFIG_TUN is not set
|
||||
|
||||
#
|
||||
# ARCnet devices
|
||||
#
|
||||
# CONFIG_ARCNET is not set
|
||||
|
||||
#
|
||||
# PHY device support
|
||||
#
|
||||
|
||||
#
|
||||
# Ethernet (10 or 100Mbit)
|
||||
#
|
||||
# CONFIG_NET_ETHERNET is not set
|
||||
|
||||
#
|
||||
# Ethernet (1000 Mbit)
|
||||
#
|
||||
# CONFIG_ACENIC is not set
|
||||
# CONFIG_DL2K is not set
|
||||
# CONFIG_E1000 is not set
|
||||
# CONFIG_NS83820 is not set
|
||||
# CONFIG_HAMACHI is not set
|
||||
# CONFIG_YELLOWFIN is not set
|
||||
# CONFIG_R8169 is not set
|
||||
# CONFIG_SIS190 is not set
|
||||
# CONFIG_SKGE is not set
|
||||
# CONFIG_SKY2 is not set
|
||||
# CONFIG_SK98LIN is not set
|
||||
# CONFIG_TIGON3 is not set
|
||||
# CONFIG_BNX2 is not set
|
||||
# CONFIG_MV643XX_ETH is not set
|
||||
# CONFIG_QLA3XXX is not set
|
||||
|
||||
#
|
||||
# Ethernet (10000 Mbit)
|
||||
#
|
||||
# CONFIG_CHELSIO_T1 is not set
|
||||
# CONFIG_IXGB is not set
|
||||
# CONFIG_S2IO is not set
|
||||
# CONFIG_MYRI10GE is not set
|
||||
|
||||
#
|
||||
# Token Ring devices
|
||||
#
|
||||
# CONFIG_TR is not set
|
||||
|
||||
#
|
||||
# Wireless LAN (non-hamradio)
|
||||
#
|
||||
# CONFIG_NET_RADIO is not set
|
||||
|
||||
#
|
||||
# Wan interfaces
|
||||
#
|
||||
# CONFIG_WAN is not set
|
||||
# CONFIG_FDDI is not set
|
||||
# CONFIG_HIPPI is not set
|
||||
# CONFIG_PPP is not set
|
||||
# CONFIG_SLIP is not set
|
||||
# CONFIG_NET_FC is not set
|
||||
# CONFIG_SHAPER is not set
|
||||
# CONFIG_NETCONSOLE is not set
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
|
||||
#
|
||||
# ISDN subsystem
|
||||
#
|
||||
# CONFIG_ISDN is not set
|
||||
|
||||
#
|
||||
# Telephony Support
|
||||
#
|
||||
# CONFIG_PHONE is not set
|
||||
|
||||
#
|
||||
# Input device support
|
||||
#
|
||||
# CONFIG_INPUT is not set
|
||||
|
||||
#
|
||||
# Hardware I/O ports
|
||||
#
|
||||
# CONFIG_SERIO is not set
|
||||
# CONFIG_GAMEPORT is not set
|
||||
|
||||
#
|
||||
# Character devices
|
||||
#
|
||||
# CONFIG_VT is not set
|
||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||
|
||||
#
|
||||
# Serial drivers
|
||||
#
|
||||
# CONFIG_SERIAL_8250 is not set
|
||||
|
||||
#
|
||||
# Non-8250 serial port support
|
||||
#
|
||||
CONFIG_SERIAL_CORE=y
|
||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||
CONFIG_SERIAL_MPC52xx=y
|
||||
CONFIG_SERIAL_MPC52xx_CONSOLE=y
|
||||
CONFIG_SERIAL_MPC52xx_CONSOLE_BAUD=9600
|
||||
# CONFIG_SERIAL_JSM is not set
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
CONFIG_LEGACY_PTYS=y
|
||||
CONFIG_LEGACY_PTY_COUNT=256
|
||||
|
||||
#
|
||||
# IPMI
|
||||
#
|
||||
# CONFIG_IPMI_HANDLER is not set
|
||||
|
||||
#
|
||||
# Watchdog Cards
|
||||
#
|
||||
# CONFIG_WATCHDOG is not set
|
||||
# CONFIG_HW_RANDOM is not set
|
||||
# CONFIG_NVRAM is not set
|
||||
# CONFIG_GEN_RTC is not set
|
||||
# CONFIG_DTLK is not set
|
||||
# CONFIG_R3964 is not set
|
||||
# CONFIG_APPLICOM is not set
|
||||
|
||||
#
|
||||
# Ftape, the floppy tape device driver
|
||||
#
|
||||
# CONFIG_AGP is not set
|
||||
# CONFIG_DRM is not set
|
||||
# CONFIG_RAW_DRIVER is not set
|
||||
|
||||
#
|
||||
# TPM devices
|
||||
#
|
||||
# CONFIG_TCG_TPM is not set
|
||||
|
||||
#
|
||||
# I2C support
|
||||
#
|
||||
# CONFIG_I2C is not set
|
||||
|
||||
#
|
||||
# SPI support
|
||||
#
|
||||
# CONFIG_SPI is not set
|
||||
# CONFIG_SPI_MASTER is not set
|
||||
|
||||
#
|
||||
# Dallas's 1-wire bus
|
||||
#
|
||||
# CONFIG_W1 is not set
|
||||
|
||||
#
|
||||
# Hardware Monitoring support
|
||||
#
|
||||
# CONFIG_HWMON is not set
|
||||
# CONFIG_HWMON_VID is not set
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
# CONFIG_VIDEO_DEV is not set
|
||||
|
||||
#
|
||||
# Digital Video Broadcasting Devices
|
||||
#
|
||||
# CONFIG_DVB is not set
|
||||
|
||||
#
|
||||
# Graphics support
|
||||
#
|
||||
# CONFIG_FIRMWARE_EDID is not set
|
||||
# CONFIG_FB is not set
|
||||
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
|
||||
|
||||
#
|
||||
# Sound
|
||||
#
|
||||
# CONFIG_SOUND is not set
|
||||
|
||||
#
|
||||
# USB support
|
||||
#
|
||||
CONFIG_USB_ARCH_HAS_HCD=y
|
||||
CONFIG_USB_ARCH_HAS_OHCI=y
|
||||
CONFIG_USB_ARCH_HAS_EHCI=y
|
||||
# CONFIG_USB is not set
|
||||
|
||||
#
|
||||
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
|
||||
#
|
||||
|
||||
#
|
||||
# USB Gadget Support
|
||||
#
|
||||
# CONFIG_USB_GADGET is not set
|
||||
|
||||
#
|
||||
# MMC/SD Card support
|
||||
#
|
||||
# CONFIG_MMC is not set
|
||||
|
||||
#
|
||||
# LED devices
|
||||
#
|
||||
# CONFIG_NEW_LEDS is not set
|
||||
|
||||
#
|
||||
# LED drivers
|
||||
#
|
||||
|
||||
#
|
||||
# LED Triggers
|
||||
#
|
||||
|
||||
#
|
||||
# InfiniBand support
|
||||
#
|
||||
# CONFIG_INFINIBAND is not set
|
||||
|
||||
#
|
||||
# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
|
||||
#
|
||||
|
||||
#
|
||||
# Real Time Clock
|
||||
#
|
||||
# CONFIG_RTC_CLASS is not set
|
||||
|
||||
#
|
||||
# DMA Engine support
|
||||
#
|
||||
# CONFIG_DMA_ENGINE is not set
|
||||
|
||||
#
|
||||
# DMA Clients
|
||||
#
|
||||
|
||||
#
|
||||
# DMA Devices
|
||||
#
|
||||
|
||||
#
|
||||
# File systems
|
||||
#
|
||||
CONFIG_EXT2_FS=y
|
||||
# CONFIG_EXT2_FS_XATTR is not set
|
||||
# CONFIG_EXT2_FS_XIP is not set
|
||||
CONFIG_EXT3_FS=y
|
||||
CONFIG_EXT3_FS_XATTR=y
|
||||
# CONFIG_EXT3_FS_POSIX_ACL is not set
|
||||
# CONFIG_EXT3_FS_SECURITY is not set
|
||||
# CONFIG_EXT4DEV_FS is not set
|
||||
CONFIG_JBD=y
|
||||
# CONFIG_JBD_DEBUG is not set
|
||||
CONFIG_FS_MBCACHE=y
|
||||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
# CONFIG_FS_POSIX_ACL is not set
|
||||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_GFS2_FS is not set
|
||||
# CONFIG_OCFS2_FS is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
CONFIG_INOTIFY=y
|
||||
CONFIG_INOTIFY_USER=y
|
||||
# CONFIG_QUOTA is not set
|
||||
CONFIG_DNOTIFY=y
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
# CONFIG_AUTOFS4_FS is not set
|
||||
# CONFIG_FUSE_FS is not set
|
||||
|
||||
#
|
||||
# CD-ROM/DVD Filesystems
|
||||
#
|
||||
# CONFIG_ISO9660_FS is not set
|
||||
# CONFIG_UDF_FS is not set
|
||||
|
||||
#
|
||||
# DOS/FAT/NT Filesystems
|
||||
#
|
||||
# CONFIG_MSDOS_FS is not set
|
||||
# CONFIG_VFAT_FS is not set
|
||||
# CONFIG_NTFS_FS is not set
|
||||
|
||||
#
|
||||
# Pseudo filesystems
|
||||
#
|
||||
CONFIG_PROC_FS=y
|
||||
CONFIG_PROC_KCORE=y
|
||||
CONFIG_PROC_SYSCTL=y
|
||||
CONFIG_SYSFS=y
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_TMPFS_POSIX_ACL is not set
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
CONFIG_RAMFS=y
|
||||
# CONFIG_CONFIGFS_FS is not set
|
||||
|
||||
#
|
||||
# Miscellaneous filesystems
|
||||
#
|
||||
# CONFIG_ADFS_FS is not set
|
||||
# CONFIG_AFFS_FS is not set
|
||||
# CONFIG_HFS_FS is not set
|
||||
# CONFIG_HFSPLUS_FS is not set
|
||||
# CONFIG_BEFS_FS is not set
|
||||
# CONFIG_BFS_FS is not set
|
||||
# CONFIG_EFS_FS is not set
|
||||
# CONFIG_CRAMFS is not set
|
||||
# CONFIG_VXFS_FS is not set
|
||||
# CONFIG_HPFS_FS is not set
|
||||
# CONFIG_QNX4FS_FS is not set
|
||||
# CONFIG_SYSV_FS is not set
|
||||
# CONFIG_UFS_FS is not set
|
||||
|
||||
#
|
||||
# Network File Systems
|
||||
#
|
||||
# CONFIG_NFS_FS is not set
|
||||
# CONFIG_NFSD is not set
|
||||
# CONFIG_SMB_FS is not set
|
||||
# CONFIG_CIFS is not set
|
||||
# CONFIG_NCP_FS is not set
|
||||
# CONFIG_CODA_FS is not set
|
||||
# CONFIG_AFS_FS is not set
|
||||
# CONFIG_9P_FS is not set
|
||||
|
||||
#
|
||||
# Partition Types
|
||||
#
|
||||
# CONFIG_PARTITION_ADVANCED is not set
|
||||
CONFIG_MSDOS_PARTITION=y
|
||||
|
||||
#
|
||||
# Native Language Support
|
||||
#
|
||||
# CONFIG_NLS is not set
|
||||
|
||||
#
|
||||
# Library routines
|
||||
#
|
||||
# CONFIG_CRC_CCITT is not set
|
||||
# CONFIG_CRC16 is not set
|
||||
# CONFIG_CRC32 is not set
|
||||
# CONFIG_LIBCRC32C is not set
|
||||
CONFIG_PLIST=y
|
||||
|
||||
#
|
||||
# Instrumentation Support
|
||||
#
|
||||
# CONFIG_PROFILING is not set
|
||||
|
||||
#
|
||||
# Kernel hacking
|
||||
#
|
||||
CONFIG_PRINTK_TIME=y
|
||||
CONFIG_ENABLE_MUST_CHECK=y
|
||||
# CONFIG_MAGIC_SYSRQ is not set
|
||||
# CONFIG_UNUSED_SYMBOLS is not set
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
# CONFIG_DEBUG_RT_MUTEXES is not set
|
||||
# CONFIG_RT_MUTEX_TESTER is not set
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
# CONFIG_DEBUG_MUTEXES is not set
|
||||
# CONFIG_DEBUG_RWSEMS is not set
|
||||
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
||||
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_DEBUG_FS is not set
|
||||
# CONFIG_DEBUG_VM is not set
|
||||
# CONFIG_DEBUG_LIST is not set
|
||||
CONFIG_FORCED_INLINING=y
|
||||
# CONFIG_HEADERS_CHECK is not set
|
||||
# CONFIG_RCU_TORTURE_TEST is not set
|
||||
# CONFIG_DEBUGGER is not set
|
||||
# CONFIG_BDI_SWITCH is not set
|
||||
# CONFIG_BOOTX_TEXT is not set
|
||||
# CONFIG_SERIAL_TEXT_DEBUG is not set
|
||||
# CONFIG_PPC_EARLY_DEBUG is not set
|
||||
|
||||
#
|
||||
# Security options
|
||||
#
|
||||
# CONFIG_KEYS is not set
|
||||
# CONFIG_SECURITY is not set
|
||||
|
||||
#
|
||||
# Cryptographic options
|
||||
#
|
||||
# CONFIG_CRYPTO is not set
|
@ -1386,8 +1386,8 @@ CONFIG_INOTIFY=y
|
||||
CONFIG_INOTIFY_USER=y
|
||||
# CONFIG_QUOTA is not set
|
||||
CONFIG_DNOTIFY=y
|
||||
CONFIG_AUTOFS_FS=y
|
||||
# CONFIG_AUTOFS4_FS is not set
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
CONFIG_AUTOFS4_FS=m
|
||||
# CONFIG_FUSE_FS is not set
|
||||
|
||||
#
|
||||
|
837
arch/powerpc/configs/ps3_defconfig
Normal file
837
arch/powerpc/configs/ps3_defconfig
Normal file
@ -0,0 +1,837 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.19-rc6
|
||||
# Tue Nov 21 19:38:53 2006
|
||||
#
|
||||
CONFIG_PPC64=y
|
||||
CONFIG_64BIT=y
|
||||
CONFIG_PPC_MERGE=y
|
||||
CONFIG_MMU=y
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_IRQ_PER_CPU=y
|
||||
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
||||
CONFIG_GENERIC_HWEIGHT=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_GENERIC_FIND_NEXT_BIT=y
|
||||
CONFIG_PPC=y
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_COMPAT=y
|
||||
CONFIG_SYSVIPC_COMPAT=y
|
||||
CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
|
||||
CONFIG_ARCH_MAY_HAVE_PC_FDC=y
|
||||
CONFIG_PPC_OF=y
|
||||
# CONFIG_PPC_UDBG_16550 is not set
|
||||
# CONFIG_GENERIC_TBSYNC is not set
|
||||
CONFIG_AUDIT_ARCH=y
|
||||
# CONFIG_DEFAULT_UIMAGE is not set
|
||||
|
||||
#
|
||||
# Processor support
|
||||
#
|
||||
# CONFIG_POWER4_ONLY is not set
|
||||
CONFIG_POWER3=y
|
||||
CONFIG_POWER4=y
|
||||
CONFIG_PPC_FPU=y
|
||||
# CONFIG_PPC_DCR_NATIVE is not set
|
||||
# CONFIG_PPC_DCR_MMIO is not set
|
||||
# CONFIG_PPC_OF_PLATFORM_PCI is not set
|
||||
CONFIG_ALTIVEC=y
|
||||
CONFIG_PPC_STD_MMU=y
|
||||
CONFIG_VIRT_CPU_ACCOUNTING=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_NR_CPUS=2
|
||||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
#
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_LOCK_KERNEL=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
|
||||
#
|
||||
# General setup
|
||||
#
|
||||
CONFIG_LOCALVERSION=""
|
||||
CONFIG_LOCALVERSION_AUTO=y
|
||||
CONFIG_SWAP=y
|
||||
CONFIG_SYSVIPC=y
|
||||
# CONFIG_IPC_NS is not set
|
||||
# CONFIG_POSIX_MQUEUE is not set
|
||||
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||
# CONFIG_TASKSTATS is not set
|
||||
# CONFIG_UTS_NS is not set
|
||||
# CONFIG_AUDIT is not set
|
||||
# CONFIG_IKCONFIG is not set
|
||||
# CONFIG_CPUSETS is not set
|
||||
# CONFIG_RELAY is not set
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
||||
CONFIG_SYSCTL=y
|
||||
CONFIG_EMBEDDED=y
|
||||
# CONFIG_SYSCTL_SYSCALL is not set
|
||||
CONFIG_KALLSYMS=y
|
||||
CONFIG_KALLSYMS_ALL=y
|
||||
CONFIG_KALLSYMS_EXTRA_PASS=y
|
||||
CONFIG_HOTPLUG=y
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
CONFIG_ELF_CORE=y
|
||||
CONFIG_BASE_FULL=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_SLAB=y
|
||||
CONFIG_VM_EVENT_COUNTERS=y
|
||||
CONFIG_RT_MUTEXES=y
|
||||
# CONFIG_TINY_SHMEM is not set
|
||||
CONFIG_BASE_SMALL=0
|
||||
# CONFIG_SLOB is not set
|
||||
|
||||
#
|
||||
# Loadable module support
|
||||
#
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
# CONFIG_MODULE_FORCE_UNLOAD is not set
|
||||
# CONFIG_MODVERSIONS is not set
|
||||
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
||||
CONFIG_KMOD=y
|
||||
CONFIG_STOP_MACHINE=y
|
||||
|
||||
#
|
||||
# Block layer
|
||||
#
|
||||
CONFIG_BLOCK=y
|
||||
# CONFIG_BLK_DEV_IO_TRACE is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_AS=y
|
||||
CONFIG_IOSCHED_DEADLINE=y
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
CONFIG_DEFAULT_AS=y
|
||||
# CONFIG_DEFAULT_DEADLINE is not set
|
||||
# CONFIG_DEFAULT_CFQ is not set
|
||||
# CONFIG_DEFAULT_NOOP is not set
|
||||
CONFIG_DEFAULT_IOSCHED="anticipatory"
|
||||
|
||||
#
|
||||
# Platform support
|
||||
#
|
||||
CONFIG_PPC_MULTIPLATFORM=y
|
||||
# CONFIG_EMBEDDED6xx is not set
|
||||
# CONFIG_APUS is not set
|
||||
# CONFIG_PPC_PSERIES is not set
|
||||
# CONFIG_PPC_ISERIES is not set
|
||||
# CONFIG_PPC_PMAC is not set
|
||||
# CONFIG_PPC_MAPLE is not set
|
||||
# CONFIG_PPC_PASEMI is not set
|
||||
CONFIG_PPC_CELL=y
|
||||
# CONFIG_PPC_CELL_NATIVE is not set
|
||||
# CONFIG_PPC_IBM_CELL_BLADE is not set
|
||||
CONFIG_PPC_PS3=y
|
||||
# CONFIG_U3_DART is not set
|
||||
# CONFIG_PPC_RTAS is not set
|
||||
# CONFIG_MMIO_NVRAM is not set
|
||||
# CONFIG_PPC_MPC106 is not set
|
||||
# CONFIG_PPC_970_NAP is not set
|
||||
# CONFIG_PPC_INDIRECT_IO is not set
|
||||
# CONFIG_GENERIC_IOMAP is not set
|
||||
# CONFIG_CPU_FREQ is not set
|
||||
# CONFIG_WANT_EARLY_SERIAL is not set
|
||||
# CONFIG_MPIC is not set
|
||||
|
||||
#
|
||||
# Cell Broadband Engine options
|
||||
#
|
||||
CONFIG_SPU_FS=y
|
||||
CONFIG_SPU_BASE=y
|
||||
# CONFIG_CBE_RAS is not set
|
||||
|
||||
#
|
||||
# PS3 Platform Options
|
||||
#
|
||||
CONFIG_PS3_HTAB_SIZE=20
|
||||
CONFIG_PS3_DYNAMIC_DMA=y
|
||||
CONFIG_PS3_USE_LPAR_ADDR=y
|
||||
|
||||
#
|
||||
# Kernel options
|
||||
#
|
||||
# CONFIG_HZ_100 is not set
|
||||
CONFIG_HZ_250=y
|
||||
# CONFIG_HZ_1000 is not set
|
||||
CONFIG_HZ=250
|
||||
CONFIG_PREEMPT_NONE=y
|
||||
# CONFIG_PREEMPT_VOLUNTARY is not set
|
||||
# CONFIG_PREEMPT is not set
|
||||
# CONFIG_PREEMPT_BKL is not set
|
||||
CONFIG_BINFMT_ELF=y
|
||||
CONFIG_BINFMT_MISC=y
|
||||
CONFIG_FORCE_MAX_ZONEORDER=9
|
||||
# CONFIG_IOMMU_VMERGE is not set
|
||||
CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
|
||||
# CONFIG_KEXEC is not set
|
||||
# CONFIG_CRASH_DUMP is not set
|
||||
# CONFIG_IRQ_ALL_CPUS is not set
|
||||
# CONFIG_NUMA is not set
|
||||
CONFIG_ARCH_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_ARCH_FLATMEM_ENABLE=y
|
||||
CONFIG_ARCH_SPARSEMEM_ENABLE=y
|
||||
CONFIG_ARCH_SPARSEMEM_DEFAULT=y
|
||||
CONFIG_ARCH_POPULATES_NODE_MAP=y
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
# CONFIG_FLATMEM_MANUAL is not set
|
||||
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||
CONFIG_SPARSEMEM_MANUAL=y
|
||||
CONFIG_SPARSEMEM=y
|
||||
CONFIG_HAVE_MEMORY_PRESENT=y
|
||||
# CONFIG_SPARSEMEM_STATIC is not set
|
||||
CONFIG_SPARSEMEM_EXTREME=y
|
||||
CONFIG_MEMORY_HOTPLUG=y
|
||||
CONFIG_MEMORY_HOTPLUG_SPARSE=y
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4
|
||||
CONFIG_RESOURCES_64BIT=y
|
||||
CONFIG_ARCH_MEMORY_PROBE=y
|
||||
CONFIG_PPC_64K_PAGES=y
|
||||
# CONFIG_SCHED_SMT is not set
|
||||
CONFIG_PROC_DEVICETREE=y
|
||||
CONFIG_CMDLINE_BOOL=y
|
||||
CONFIG_CMDLINE="root=/dev/nfs rw ip=dhcp"
|
||||
# CONFIG_PM is not set
|
||||
# CONFIG_SECCOMP is not set
|
||||
CONFIG_ISA_DMA_API=y
|
||||
|
||||
#
|
||||
# Bus options
|
||||
#
|
||||
CONFIG_GENERIC_ISA_DMA=y
|
||||
# CONFIG_MPIC_WEIRD is not set
|
||||
# CONFIG_PPC_I8259 is not set
|
||||
# CONFIG_PCI is not set
|
||||
# CONFIG_PCI_DOMAINS is not set
|
||||
|
||||
#
|
||||
# PCCARD (PCMCIA/CardBus) support
|
||||
#
|
||||
# CONFIG_PCCARD is not set
|
||||
|
||||
#
|
||||
# PCI Hotplug Support
|
||||
#
|
||||
CONFIG_KERNEL_START=0xc000000000000000
|
||||
|
||||
#
|
||||
# Networking
|
||||
#
|
||||
CONFIG_NET=y
|
||||
|
||||
#
|
||||
# Networking options
|
||||
#
|
||||
# CONFIG_NETDEBUG is not set
|
||||
# CONFIG_PACKET is not set
|
||||
CONFIG_UNIX=y
|
||||
# CONFIG_NET_KEY is not set
|
||||
CONFIG_INET=y
|
||||
# CONFIG_IP_MULTICAST is not set
|
||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||
CONFIG_IP_FIB_HASH=y
|
||||
CONFIG_IP_PNP=y
|
||||
CONFIG_IP_PNP_DHCP=y
|
||||
# CONFIG_IP_PNP_BOOTP is not set
|
||||
# CONFIG_IP_PNP_RARP is not set
|
||||
# CONFIG_NET_IPIP is not set
|
||||
# CONFIG_NET_IPGRE is not set
|
||||
# CONFIG_ARPD is not set
|
||||
# CONFIG_SYN_COOKIES is not set
|
||||
# CONFIG_INET_AH is not set
|
||||
# CONFIG_INET_ESP is not set
|
||||
# CONFIG_INET_IPCOMP is not set
|
||||
# CONFIG_INET_XFRM_TUNNEL is not set
|
||||
# CONFIG_INET_TUNNEL is not set
|
||||
# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
|
||||
# CONFIG_INET_XFRM_MODE_TUNNEL is not set
|
||||
# CONFIG_INET_XFRM_MODE_BEET is not set
|
||||
# CONFIG_INET_DIAG is not set
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_CUBIC=y
|
||||
CONFIG_DEFAULT_TCP_CONG="cubic"
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_INET6_XFRM_TUNNEL is not set
|
||||
# CONFIG_INET6_TUNNEL is not set
|
||||
# CONFIG_NETWORK_SECMARK is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
||||
#
|
||||
# DCCP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP_DCCP is not set
|
||||
|
||||
#
|
||||
# SCTP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP_SCTP is not set
|
||||
|
||||
#
|
||||
# TIPC Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_TIPC is not set
|
||||
# CONFIG_ATM is not set
|
||||
# CONFIG_BRIDGE is not set
|
||||
# CONFIG_VLAN_8021Q is not set
|
||||
# CONFIG_DECNET is not set
|
||||
# CONFIG_LLC2 is not set
|
||||
# CONFIG_IPX is not set
|
||||
# CONFIG_ATALK is not set
|
||||
# CONFIG_X25 is not set
|
||||
# CONFIG_LAPB is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
|
||||
#
|
||||
# QoS and/or fair queueing
|
||||
#
|
||||
# CONFIG_NET_SCHED is not set
|
||||
|
||||
#
|
||||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
# CONFIG_IEEE80211 is not set
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Generic Driver Options
|
||||
#
|
||||
CONFIG_STANDALONE=y
|
||||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||
# CONFIG_FW_LOADER is not set
|
||||
# CONFIG_DEBUG_DRIVER is not set
|
||||
# CONFIG_SYS_HYPERVISOR is not set
|
||||
|
||||
#
|
||||
# Connector - unified userspace <-> kernelspace linker
|
||||
#
|
||||
# CONFIG_CONNECTOR is not set
|
||||
|
||||
#
|
||||
# Memory Technology Devices (MTD)
|
||||
#
|
||||
# CONFIG_MTD is not set
|
||||
|
||||
#
|
||||
# Parallel port support
|
||||
#
|
||||
# CONFIG_PARPORT is not set
|
||||
|
||||
#
|
||||
# Plug and Play support
|
||||
#
|
||||
|
||||
#
|
||||
# Block devices
|
||||
#
|
||||
# CONFIG_BLK_DEV_FD is not set
|
||||
# CONFIG_BLK_DEV_COW_COMMON is not set
|
||||
# CONFIG_BLK_DEV_LOOP is not set
|
||||
# CONFIG_BLK_DEV_NBD is not set
|
||||
# CONFIG_BLK_DEV_RAM is not set
|
||||
# CONFIG_BLK_DEV_INITRD is not set
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
|
||||
#
|
||||
# Misc devices
|
||||
#
|
||||
# CONFIG_TIFM_CORE is not set
|
||||
|
||||
#
|
||||
# ATA/ATAPI/MFM/RLL support
|
||||
#
|
||||
# CONFIG_IDE is not set
|
||||
|
||||
#
|
||||
# SCSI device support
|
||||
#
|
||||
# CONFIG_RAID_ATTRS is not set
|
||||
CONFIG_SCSI=y
|
||||
# CONFIG_SCSI_NETLINK is not set
|
||||
CONFIG_SCSI_PROC_FS=y
|
||||
|
||||
#
|
||||
# SCSI support type (disk, tape, CD-ROM)
|
||||
#
|
||||
# CONFIG_BLK_DEV_SD is not set
|
||||
# CONFIG_CHR_DEV_ST is not set
|
||||
# CONFIG_CHR_DEV_OSST is not set
|
||||
# CONFIG_BLK_DEV_SR is not set
|
||||
# CONFIG_CHR_DEV_SG is not set
|
||||
# CONFIG_CHR_DEV_SCH is not set
|
||||
|
||||
#
|
||||
# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
|
||||
#
|
||||
# CONFIG_SCSI_MULTI_LUN is not set
|
||||
# CONFIG_SCSI_CONSTANTS is not set
|
||||
# CONFIG_SCSI_LOGGING is not set
|
||||
|
||||
#
|
||||
# SCSI Transports
|
||||
#
|
||||
# CONFIG_SCSI_SPI_ATTRS is not set
|
||||
# CONFIG_SCSI_FC_ATTRS is not set
|
||||
# CONFIG_SCSI_ISCSI_ATTRS is not set
|
||||
# CONFIG_SCSI_SAS_ATTRS is not set
|
||||
# CONFIG_SCSI_SAS_LIBSAS is not set
|
||||
|
||||
#
|
||||
# SCSI low-level drivers
|
||||
#
|
||||
# CONFIG_ISCSI_TCP is not set
|
||||
# CONFIG_SCSI_DEBUG is not set
|
||||
|
||||
#
|
||||
# Serial ATA (prod) and Parallel ATA (experimental) drivers
|
||||
#
|
||||
# CONFIG_ATA is not set
|
||||
|
||||
#
|
||||
# Multi-device support (RAID and LVM)
|
||||
#
|
||||
# CONFIG_MD is not set
|
||||
|
||||
#
|
||||
# Fusion MPT device support
|
||||
#
|
||||
# CONFIG_FUSION is not set
|
||||
|
||||
#
|
||||
# IEEE 1394 (FireWire) support
|
||||
#
|
||||
|
||||
#
|
||||
# I2O device support
|
||||
#
|
||||
|
||||
#
|
||||
# Macintosh device drivers
|
||||
#
|
||||
# CONFIG_WINDFARM is not set
|
||||
|
||||
#
|
||||
# Network device support
|
||||
#
|
||||
CONFIG_NETDEVICES=y
|
||||
# CONFIG_DUMMY is not set
|
||||
# CONFIG_BONDING is not set
|
||||
# CONFIG_EQUALIZER is not set
|
||||
# CONFIG_TUN is not set
|
||||
|
||||
#
|
||||
# PHY device support
|
||||
#
|
||||
|
||||
#
|
||||
# Ethernet (10 or 100Mbit)
|
||||
#
|
||||
# CONFIG_NET_ETHERNET is not set
|
||||
|
||||
#
|
||||
# Ethernet (1000 Mbit)
|
||||
#
|
||||
|
||||
#
|
||||
# Ethernet (10000 Mbit)
|
||||
#
|
||||
|
||||
#
|
||||
# Token Ring devices
|
||||
#
|
||||
|
||||
#
|
||||
# Wireless LAN (non-hamradio)
|
||||
#
|
||||
# CONFIG_NET_RADIO is not set
|
||||
|
||||
#
|
||||
# Wan interfaces
|
||||
#
|
||||
# CONFIG_WAN is not set
|
||||
# CONFIG_PPP is not set
|
||||
# CONFIG_SLIP is not set
|
||||
# CONFIG_SHAPER is not set
|
||||
# CONFIG_NETCONSOLE is not set
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
|
||||
#
|
||||
# ISDN subsystem
|
||||
#
|
||||
# CONFIG_ISDN is not set
|
||||
|
||||
#
|
||||
# Telephony Support
|
||||
#
|
||||
# CONFIG_PHONE is not set
|
||||
|
||||
#
|
||||
# Input device support
|
||||
#
|
||||
CONFIG_INPUT=y
|
||||
# CONFIG_INPUT_FF_MEMLESS is not set
|
||||
|
||||
#
|
||||
# Userland interfaces
|
||||
#
|
||||
# CONFIG_INPUT_MOUSEDEV is not set
|
||||
# CONFIG_INPUT_JOYDEV is not set
|
||||
# CONFIG_INPUT_TSDEV is not set
|
||||
CONFIG_INPUT_EVDEV=y
|
||||
# CONFIG_INPUT_EVBUG is not set
|
||||
|
||||
#
|
||||
# Input Device Drivers
|
||||
#
|
||||
# CONFIG_INPUT_KEYBOARD is not set
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
# CONFIG_INPUT_JOYSTICK is not set
|
||||
# CONFIG_INPUT_TOUCHSCREEN is not set
|
||||
# CONFIG_INPUT_MISC is not set
|
||||
|
||||
#
|
||||
# Hardware I/O ports
|
||||
#
|
||||
# CONFIG_SERIO is not set
|
||||
# CONFIG_GAMEPORT is not set
|
||||
|
||||
#
|
||||
# Character devices
|
||||
#
|
||||
CONFIG_VT=y
|
||||
CONFIG_VT_CONSOLE=y
|
||||
CONFIG_HW_CONSOLE=y
|
||||
# CONFIG_VT_HW_CONSOLE_BINDING is not set
|
||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||
|
||||
#
|
||||
# Serial drivers
|
||||
#
|
||||
# CONFIG_SERIAL_8250 is not set
|
||||
|
||||
#
|
||||
# Non-8250 serial port support
|
||||
#
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
# CONFIG_LEGACY_PTYS is not set
|
||||
|
||||
#
|
||||
# IPMI
|
||||
#
|
||||
# CONFIG_IPMI_HANDLER is not set
|
||||
|
||||
#
|
||||
# Watchdog Cards
|
||||
#
|
||||
# CONFIG_WATCHDOG is not set
|
||||
# CONFIG_HW_RANDOM is not set
|
||||
CONFIG_GEN_RTC=y
|
||||
# CONFIG_GEN_RTC_X is not set
|
||||
# CONFIG_DTLK is not set
|
||||
# CONFIG_R3964 is not set
|
||||
|
||||
#
|
||||
# Ftape, the floppy tape device driver
|
||||
#
|
||||
# CONFIG_RAW_DRIVER is not set
|
||||
# CONFIG_HANGCHECK_TIMER is not set
|
||||
|
||||
#
|
||||
# TPM devices
|
||||
#
|
||||
# CONFIG_TCG_TPM is not set
|
||||
|
||||
#
|
||||
# I2C support
|
||||
#
|
||||
# CONFIG_I2C is not set
|
||||
|
||||
#
|
||||
# SPI support
|
||||
#
|
||||
# CONFIG_SPI is not set
|
||||
# CONFIG_SPI_MASTER is not set
|
||||
|
||||
#
|
||||
# Dallas's 1-wire bus
|
||||
#
|
||||
# CONFIG_W1 is not set
|
||||
|
||||
#
|
||||
# Hardware Monitoring support
|
||||
#
|
||||
# CONFIG_HWMON is not set
|
||||
# CONFIG_HWMON_VID is not set
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
# CONFIG_VIDEO_DEV is not set
|
||||
|
||||
#
|
||||
# Digital Video Broadcasting Devices
|
||||
#
|
||||
# CONFIG_DVB is not set
|
||||
|
||||
#
|
||||
# Graphics support
|
||||
#
|
||||
# CONFIG_FIRMWARE_EDID is not set
|
||||
# CONFIG_FB is not set
|
||||
|
||||
#
|
||||
# Console display driver support
|
||||
#
|
||||
# CONFIG_VGA_CONSOLE is not set
|
||||
CONFIG_DUMMY_CONSOLE=y
|
||||
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
|
||||
|
||||
#
|
||||
# Sound
|
||||
#
|
||||
# CONFIG_SOUND is not set
|
||||
|
||||
#
|
||||
# USB support
|
||||
#
|
||||
# CONFIG_USB_ARCH_HAS_HCD is not set
|
||||
# CONFIG_USB_ARCH_HAS_OHCI is not set
|
||||
# CONFIG_USB_ARCH_HAS_EHCI is not set
|
||||
|
||||
#
|
||||
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
|
||||
#
|
||||
|
||||
#
|
||||
# USB Gadget Support
|
||||
#
|
||||
# CONFIG_USB_GADGET is not set
|
||||
|
||||
#
|
||||
# MMC/SD Card support
|
||||
#
|
||||
# CONFIG_MMC is not set
|
||||
|
||||
#
|
||||
# LED devices
|
||||
#
|
||||
# CONFIG_NEW_LEDS is not set
|
||||
|
||||
#
|
||||
# LED drivers
|
||||
#
|
||||
|
||||
#
|
||||
# LED Triggers
|
||||
#
|
||||
|
||||
#
|
||||
# InfiniBand support
|
||||
#
|
||||
|
||||
#
|
||||
# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
|
||||
#
|
||||
|
||||
#
|
||||
# Real Time Clock
|
||||
#
|
||||
# CONFIG_RTC_CLASS is not set
|
||||
|
||||
#
|
||||
# DMA Engine support
|
||||
#
|
||||
# CONFIG_DMA_ENGINE is not set
|
||||
|
||||
#
|
||||
# DMA Clients
|
||||
#
|
||||
|
||||
#
|
||||
# DMA Devices
|
||||
#
|
||||
|
||||
#
|
||||
# File systems
|
||||
#
|
||||
# CONFIG_EXT2_FS is not set
|
||||
# CONFIG_EXT3_FS is not set
|
||||
# CONFIG_EXT4DEV_FS is not set
|
||||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
# CONFIG_FS_POSIX_ACL is not set
|
||||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_GFS2_FS is not set
|
||||
# CONFIG_OCFS2_FS is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
CONFIG_INOTIFY=y
|
||||
CONFIG_INOTIFY_USER=y
|
||||
# CONFIG_QUOTA is not set
|
||||
CONFIG_DNOTIFY=y
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
# CONFIG_AUTOFS4_FS is not set
|
||||
# CONFIG_FUSE_FS is not set
|
||||
|
||||
#
|
||||
# CD-ROM/DVD Filesystems
|
||||
#
|
||||
# CONFIG_ISO9660_FS is not set
|
||||
# CONFIG_UDF_FS is not set
|
||||
|
||||
#
|
||||
# DOS/FAT/NT Filesystems
|
||||
#
|
||||
# CONFIG_MSDOS_FS is not set
|
||||
# CONFIG_VFAT_FS is not set
|
||||
# CONFIG_NTFS_FS is not set
|
||||
|
||||
#
|
||||
# Pseudo filesystems
|
||||
#
|
||||
CONFIG_PROC_FS=y
|
||||
CONFIG_PROC_KCORE=y
|
||||
CONFIG_PROC_SYSCTL=y
|
||||
CONFIG_SYSFS=y
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_TMPFS_POSIX_ACL is not set
|
||||
# CONFIG_HUGETLBFS is not set
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
CONFIG_RAMFS=y
|
||||
# CONFIG_CONFIGFS_FS is not set
|
||||
|
||||
#
|
||||
# Miscellaneous filesystems
|
||||
#
|
||||
# CONFIG_ADFS_FS is not set
|
||||
# CONFIG_AFFS_FS is not set
|
||||
# CONFIG_HFS_FS is not set
|
||||
# CONFIG_HFSPLUS_FS is not set
|
||||
# CONFIG_BEFS_FS is not set
|
||||
# CONFIG_BFS_FS is not set
|
||||
# CONFIG_EFS_FS is not set
|
||||
# CONFIG_CRAMFS is not set
|
||||
# CONFIG_VXFS_FS is not set
|
||||
# CONFIG_HPFS_FS is not set
|
||||
# CONFIG_QNX4FS_FS is not set
|
||||
# CONFIG_SYSV_FS is not set
|
||||
# CONFIG_UFS_FS is not set
|
||||
|
||||
#
|
||||
# Network File Systems
|
||||
#
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3=y
|
||||
# CONFIG_NFS_V3_ACL is not set
|
||||
# CONFIG_NFS_V4 is not set
|
||||
# CONFIG_NFS_DIRECTIO is not set
|
||||
# CONFIG_NFSD is not set
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_LOCKD=y
|
||||
CONFIG_LOCKD_V4=y
|
||||
CONFIG_NFS_COMMON=y
|
||||
CONFIG_SUNRPC=y
|
||||
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
||||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
||||
# CONFIG_SMB_FS is not set
|
||||
# CONFIG_CIFS is not set
|
||||
# CONFIG_NCP_FS is not set
|
||||
# CONFIG_CODA_FS is not set
|
||||
# CONFIG_AFS_FS is not set
|
||||
# CONFIG_9P_FS is not set
|
||||
|
||||
#
|
||||
# Partition Types
|
||||
#
|
||||
# CONFIG_PARTITION_ADVANCED is not set
|
||||
CONFIG_MSDOS_PARTITION=y
|
||||
|
||||
#
|
||||
# Native Language Support
|
||||
#
|
||||
# CONFIG_NLS is not set
|
||||
|
||||
#
|
||||
# Library routines
|
||||
#
|
||||
# CONFIG_CRC_CCITT is not set
|
||||
# CONFIG_CRC16 is not set
|
||||
# CONFIG_CRC32 is not set
|
||||
# CONFIG_LIBCRC32C is not set
|
||||
CONFIG_PLIST=y
|
||||
|
||||
#
|
||||
# Instrumentation Support
|
||||
#
|
||||
# CONFIG_PROFILING is not set
|
||||
# CONFIG_KPROBES is not set
|
||||
|
||||
#
|
||||
# Kernel hacking
|
||||
#
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
CONFIG_ENABLE_MUST_CHECK=y
|
||||
# CONFIG_MAGIC_SYSRQ is not set
|
||||
# CONFIG_UNUSED_SYMBOLS is not set
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_LOG_BUF_SHIFT=17
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
# CONFIG_DEBUG_RT_MUTEXES is not set
|
||||
# CONFIG_RT_MUTEX_TESTER is not set
|
||||
CONFIG_DEBUG_SPINLOCK=y
|
||||
# CONFIG_DEBUG_MUTEXES is not set
|
||||
# CONFIG_DEBUG_RWSEMS is not set
|
||||
CONFIG_DEBUG_SPINLOCK_SLEEP=y
|
||||
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_DEBUG_FS is not set
|
||||
# CONFIG_DEBUG_VM is not set
|
||||
CONFIG_DEBUG_LIST=y
|
||||
CONFIG_FORCED_INLINING=y
|
||||
# CONFIG_HEADERS_CHECK is not set
|
||||
# CONFIG_RCU_TORTURE_TEST is not set
|
||||
# CONFIG_DEBUG_STACKOVERFLOW is not set
|
||||
# CONFIG_DEBUG_STACK_USAGE is not set
|
||||
# CONFIG_DEBUGGER is not set
|
||||
CONFIG_IRQSTACKS=y
|
||||
# CONFIG_BOOTX_TEXT is not set
|
||||
CONFIG_PPC_EARLY_DEBUG=y
|
||||
# CONFIG_PPC_EARLY_DEBUG_LPAR is not set
|
||||
# CONFIG_PPC_EARLY_DEBUG_G5 is not set
|
||||
# CONFIG_PPC_EARLY_DEBUG_RTAS_PANEL is not set
|
||||
# CONFIG_PPC_EARLY_DEBUG_RTAS_CONSOLE is not set
|
||||
# CONFIG_PPC_EARLY_DEBUG_MAPLE is not set
|
||||
# CONFIG_PPC_EARLY_DEBUG_ISERIES is not set
|
||||
|
||||
#
|
||||
# Security options
|
||||
#
|
||||
# CONFIG_KEYS is not set
|
||||
# CONFIG_SECURITY is not set
|
||||
|
||||
#
|
||||
# Cryptographic options
|
||||
#
|
||||
# CONFIG_CRYPTO is not set
|
@ -17,11 +17,11 @@ obj-y += vdso32/
|
||||
obj-$(CONFIG_PPC64) += setup_64.o binfmt_elf32.o sys_ppc32.o \
|
||||
signal_64.o ptrace32.o \
|
||||
paca.o cpu_setup_ppc970.o \
|
||||
firmware.o sysfs.o
|
||||
firmware.o sysfs.o nvram_64.o
|
||||
obj-$(CONFIG_PPC64) += vdso64/
|
||||
obj-$(CONFIG_ALTIVEC) += vecemu.o vector.o
|
||||
obj-$(CONFIG_PPC_970_NAP) += idle_power4.o
|
||||
obj-$(CONFIG_PPC_OF) += of_device.o prom_parse.o
|
||||
obj-$(CONFIG_PPC_OF) += of_device.o of_platform.o prom_parse.o
|
||||
procfs-$(CONFIG_PPC64) := proc_ppc64.o
|
||||
obj-$(CONFIG_PROC_FS) += $(procfs-y)
|
||||
rtaspci-$(CONFIG_PPC64) := rtas_pci.o
|
||||
@ -32,7 +32,6 @@ obj-$(CONFIG_LPARCFG) += lparcfg.o
|
||||
obj-$(CONFIG_IBMVIO) += vio.o
|
||||
obj-$(CONFIG_IBMEBUS) += ibmebus.o
|
||||
obj-$(CONFIG_GENERIC_TBSYNC) += smp-tbsync.o
|
||||
obj64-$(CONFIG_PPC_MULTIPLATFORM) += nvram_64.o
|
||||
obj-$(CONFIG_CRASH_DUMP) += crash_dump.o
|
||||
obj-$(CONFIG_6xx) += idle_6xx.o l2cr_6xx.o cpu_setup_6xx.o
|
||||
obj-$(CONFIG_TAU) += tau_6xx.o
|
||||
@ -59,11 +58,11 @@ obj-$(CONFIG_BOOTX_TEXT) += btext.o
|
||||
obj-$(CONFIG_SMP) += smp.o
|
||||
obj-$(CONFIG_KPROBES) += kprobes.o
|
||||
obj-$(CONFIG_PPC_UDBG_16550) += legacy_serial.o udbg_16550.o
|
||||
|
||||
module-$(CONFIG_PPC64) += module_64.o
|
||||
obj-$(CONFIG_MODULES) += $(module-y)
|
||||
|
||||
pci64-$(CONFIG_PPC64) += pci_64.o pci_dn.o pci_iommu.o \
|
||||
pci_direct_iommu.o iomap.o
|
||||
pci64-$(CONFIG_PPC64) += pci_64.o pci_dn.o
|
||||
pci32-$(CONFIG_PPC32) := pci_32.o
|
||||
obj-$(CONFIG_PCI) += $(pci64-y) $(pci32-y)
|
||||
kexec-$(CONFIG_PPC64) := machine_kexec_64.o
|
||||
@ -72,8 +71,12 @@ obj-$(CONFIG_KEXEC) += machine_kexec.o crash.o $(kexec-y)
|
||||
obj-$(CONFIG_AUDIT) += audit.o
|
||||
obj64-$(CONFIG_AUDIT) += compat_audit.o
|
||||
|
||||
ifneq ($(CONFIG_PPC_INDIRECT_IO),y)
|
||||
obj-y += iomap.o
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_PPC_ISERIES),y)
|
||||
$(obj)/head_64.o: $(obj)/lparmap.s
|
||||
extra-y += lparmap.s
|
||||
AFLAGS_head_64.o += -I$(obj)
|
||||
endif
|
||||
|
||||
|
@ -118,7 +118,8 @@ int main(void)
|
||||
DEFINE(PACASTABRR, offsetof(struct paca_struct, stab_rr));
|
||||
DEFINE(PACAR1, offsetof(struct paca_struct, saved_r1));
|
||||
DEFINE(PACATOC, offsetof(struct paca_struct, kernel_toc));
|
||||
DEFINE(PACAPROCENABLED, offsetof(struct paca_struct, proc_enabled));
|
||||
DEFINE(PACASOFTIRQEN, offsetof(struct paca_struct, soft_enabled));
|
||||
DEFINE(PACAHARDIRQEN, offsetof(struct paca_struct, hard_enabled));
|
||||
DEFINE(PACASLBCACHE, offsetof(struct paca_struct, slb_cache));
|
||||
DEFINE(PACASLBCACHEPTR, offsetof(struct paca_struct, slb_cache_ptr));
|
||||
DEFINE(PACACONTEXTID, offsetof(struct paca_struct, context.id));
|
||||
|
@ -83,6 +83,22 @@ _GLOBAL(__setup_cpu_ppc970)
|
||||
rldimi r0,r11,52,8 /* set NAP and DPM */
|
||||
li r11,0
|
||||
rldimi r0,r11,32,31 /* clear EN_ATTN */
|
||||
b load_hids /* Jump to shared code */
|
||||
|
||||
|
||||
_GLOBAL(__setup_cpu_ppc970MP)
|
||||
/* Do nothing if not running in HV mode */
|
||||
mfmsr r0
|
||||
rldicl. r0,r0,4,63
|
||||
beqlr
|
||||
|
||||
mfspr r0,SPRN_HID0
|
||||
li r11,0x15 /* clear DOZE and SLEEP */
|
||||
rldimi r0,r11,52,6 /* set DEEPNAP, NAP and DPM */
|
||||
li r11,0
|
||||
rldimi r0,r11,32,31 /* clear EN_ATTN */
|
||||
|
||||
load_hids:
|
||||
mtspr SPRN_HID0,r0
|
||||
mfspr r0,SPRN_HID0
|
||||
mfspr r0,SPRN_HID0
|
||||
|
@ -42,6 +42,7 @@ extern void __setup_cpu_745x(unsigned long offset, struct cpu_spec* spec);
|
||||
#endif /* CONFIG_PPC32 */
|
||||
#ifdef CONFIG_PPC64
|
||||
extern void __setup_cpu_ppc970(unsigned long offset, struct cpu_spec* spec);
|
||||
extern void __setup_cpu_ppc970MP(unsigned long offset, struct cpu_spec* spec);
|
||||
extern void __restore_cpu_ppc970(void);
|
||||
#endif /* CONFIG_PPC64 */
|
||||
|
||||
@ -222,9 +223,9 @@ static struct cpu_spec cpu_specs[] = {
|
||||
.icache_bsize = 128,
|
||||
.dcache_bsize = 128,
|
||||
.num_pmcs = 8,
|
||||
.cpu_setup = __setup_cpu_ppc970,
|
||||
.cpu_setup = __setup_cpu_ppc970MP,
|
||||
.cpu_restore = __restore_cpu_ppc970,
|
||||
.oprofile_cpu_type = "ppc64/970",
|
||||
.oprofile_cpu_type = "ppc64/970MP",
|
||||
.oprofile_type = PPC_OPROFILE_POWER4,
|
||||
.platform = "ppc970",
|
||||
},
|
||||
@ -276,10 +277,45 @@ static struct cpu_spec cpu_specs[] = {
|
||||
.oprofile_mmcra_sipr = MMCRA_SIPR,
|
||||
.platform = "power5+",
|
||||
},
|
||||
{ /* POWER6 in P5+ mode; 2.04-compliant processor */
|
||||
.pvr_mask = 0xffffffff,
|
||||
.pvr_value = 0x0f000001,
|
||||
.cpu_name = "POWER5+",
|
||||
.cpu_features = CPU_FTRS_POWER5,
|
||||
.cpu_user_features = COMMON_USER_POWER5_PLUS,
|
||||
.icache_bsize = 128,
|
||||
.dcache_bsize = 128,
|
||||
.num_pmcs = 6,
|
||||
.oprofile_cpu_type = "ppc64/power6",
|
||||
.oprofile_type = PPC_OPROFILE_POWER4,
|
||||
.oprofile_mmcra_sihv = POWER6_MMCRA_SIHV,
|
||||
.oprofile_mmcra_sipr = POWER6_MMCRA_SIPR,
|
||||
.oprofile_mmcra_clear = POWER6_MMCRA_THRM |
|
||||
POWER6_MMCRA_OTHER,
|
||||
.platform = "power5+",
|
||||
},
|
||||
{ /* Power6 */
|
||||
.pvr_mask = 0xffff0000,
|
||||
.pvr_value = 0x003e0000,
|
||||
.cpu_name = "POWER6",
|
||||
.cpu_name = "POWER6 (raw)",
|
||||
.cpu_features = CPU_FTRS_POWER6,
|
||||
.cpu_user_features = COMMON_USER_POWER6 |
|
||||
PPC_FEATURE_POWER6_EXT,
|
||||
.icache_bsize = 128,
|
||||
.dcache_bsize = 128,
|
||||
.num_pmcs = 6,
|
||||
.oprofile_cpu_type = "ppc64/power6",
|
||||
.oprofile_type = PPC_OPROFILE_POWER4,
|
||||
.oprofile_mmcra_sihv = POWER6_MMCRA_SIHV,
|
||||
.oprofile_mmcra_sipr = POWER6_MMCRA_SIPR,
|
||||
.oprofile_mmcra_clear = POWER6_MMCRA_THRM |
|
||||
POWER6_MMCRA_OTHER,
|
||||
.platform = "power6x",
|
||||
},
|
||||
{ /* 2.05-compliant processor, i.e. Power6 "architected" mode */
|
||||
.pvr_mask = 0xffffffff,
|
||||
.pvr_value = 0x0f000002,
|
||||
.cpu_name = "POWER6 (architected)",
|
||||
.cpu_features = CPU_FTRS_POWER6,
|
||||
.cpu_user_features = COMMON_USER_POWER6,
|
||||
.icache_bsize = 128,
|
||||
@ -303,6 +339,9 @@ static struct cpu_spec cpu_specs[] = {
|
||||
PPC_FEATURE_SMT,
|
||||
.icache_bsize = 128,
|
||||
.dcache_bsize = 128,
|
||||
.num_pmcs = 4,
|
||||
.oprofile_cpu_type = "ppc64/cell-be",
|
||||
.oprofile_type = PPC_OPROFILE_CELL,
|
||||
.platform = "ppc-cell-be",
|
||||
},
|
||||
{ /* PA Semi PA6T */
|
||||
@ -801,6 +840,17 @@ static struct cpu_spec cpu_specs[] = {
|
||||
.cpu_setup = __setup_cpu_603,
|
||||
.platform = "ppc603",
|
||||
},
|
||||
{ /* e300c3 on 83xx */
|
||||
.pvr_mask = 0x7fff0000,
|
||||
.pvr_value = 0x00850000,
|
||||
.cpu_name = "e300c3",
|
||||
.cpu_features = CPU_FTRS_E300,
|
||||
.cpu_user_features = COMMON_USER,
|
||||
.icache_bsize = 32,
|
||||
.dcache_bsize = 32,
|
||||
.cpu_setup = __setup_cpu_603,
|
||||
.platform = "ppc603",
|
||||
},
|
||||
{ /* default match, we assume split I/D cache & TB (non-601)... */
|
||||
.pvr_mask = 0x00000000,
|
||||
.pvr_value = 0x00000000,
|
||||
@ -1169,19 +1219,15 @@ static struct cpu_spec cpu_specs[] = {
|
||||
#endif /* CONFIG_PPC32 */
|
||||
};
|
||||
|
||||
struct cpu_spec *identify_cpu(unsigned long offset)
|
||||
struct cpu_spec *identify_cpu(unsigned long offset, unsigned int pvr)
|
||||
{
|
||||
struct cpu_spec *s = cpu_specs;
|
||||
struct cpu_spec **cur = &cur_cpu_spec;
|
||||
unsigned int pvr = mfspr(SPRN_PVR);
|
||||
int i;
|
||||
|
||||
s = PTRRELOC(s);
|
||||
cur = PTRRELOC(cur);
|
||||
|
||||
if (*cur != NULL)
|
||||
return PTRRELOC(*cur);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(cpu_specs); i++,s++)
|
||||
if ((pvr & s->pvr_mask) == s->pvr_value) {
|
||||
*cur = cpu_specs + i;
|
||||
|
@ -111,7 +111,7 @@ void crash_ipi_callback(struct pt_regs *regs)
|
||||
if (!cpu_online(cpu))
|
||||
return;
|
||||
|
||||
local_irq_disable();
|
||||
hard_irq_disable();
|
||||
if (!cpu_isset(cpu, cpus_in_crash))
|
||||
crash_save_this_cpu(regs, cpu);
|
||||
cpu_set(cpu, cpus_in_crash);
|
||||
@ -289,7 +289,7 @@ void default_machine_crash_shutdown(struct pt_regs *regs)
|
||||
* an SMP system.
|
||||
* The kernel is broken so disable interrupts.
|
||||
*/
|
||||
local_irq_disable();
|
||||
hard_irq_disable();
|
||||
|
||||
for_each_irq(irq) {
|
||||
struct irq_desc *desc = irq_desc + irq;
|
||||
|
@ -1,151 +1,194 @@
|
||||
/*
|
||||
* Copyright (C) 2004 IBM Corporation
|
||||
* Copyright (C) 2006 Benjamin Herrenschmidt, IBM Corporation
|
||||
*
|
||||
* Implements the generic device dma API for ppc64. Handles
|
||||
* the pci and vio busses
|
||||
* Provide default implementations of the DMA mapping callbacks for
|
||||
* directly mapped busses and busses using the iommu infrastructure
|
||||
*/
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
/* Include the busses we support */
|
||||
#include <linux/pci.h>
|
||||
#include <asm/vio.h>
|
||||
#include <asm/ibmebus.h>
|
||||
#include <asm/scatterlist.h>
|
||||
#include <asm/bug.h>
|
||||
#include <asm/iommu.h>
|
||||
#include <asm/abs_addr.h>
|
||||
|
||||
static struct dma_mapping_ops *get_dma_ops(struct device *dev)
|
||||
/*
|
||||
* Generic iommu implementation
|
||||
*/
|
||||
|
||||
static inline unsigned long device_to_mask(struct device *dev)
|
||||
{
|
||||
#ifdef CONFIG_PCI
|
||||
if (dev->bus == &pci_bus_type)
|
||||
return &pci_dma_ops;
|
||||
#endif
|
||||
#ifdef CONFIG_IBMVIO
|
||||
if (dev->bus == &vio_bus_type)
|
||||
return &vio_dma_ops;
|
||||
#endif
|
||||
#ifdef CONFIG_IBMEBUS
|
||||
if (dev->bus == &ibmebus_bus_type)
|
||||
return &ibmebus_dma_ops;
|
||||
#endif
|
||||
return NULL;
|
||||
if (dev->dma_mask && *dev->dma_mask)
|
||||
return *dev->dma_mask;
|
||||
/* Assume devices without mask can take 32 bit addresses */
|
||||
return 0xfffffffful;
|
||||
}
|
||||
|
||||
int dma_supported(struct device *dev, u64 mask)
|
||||
|
||||
/* Allocates a contiguous real buffer and creates mappings over it.
|
||||
* Returns the virtual address of the buffer and sets dma_handle
|
||||
* to the dma address (mapping) of the first page.
|
||||
*/
|
||||
static void *dma_iommu_alloc_coherent(struct device *dev, size_t size,
|
||||
dma_addr_t *dma_handle, gfp_t flag)
|
||||
{
|
||||
struct dma_mapping_ops *dma_ops = get_dma_ops(dev);
|
||||
|
||||
BUG_ON(!dma_ops);
|
||||
|
||||
return dma_ops->dma_supported(dev, mask);
|
||||
return iommu_alloc_coherent(dev->archdata.dma_data, size, dma_handle,
|
||||
device_to_mask(dev), flag,
|
||||
dev->archdata.numa_node);
|
||||
}
|
||||
EXPORT_SYMBOL(dma_supported);
|
||||
|
||||
int dma_set_mask(struct device *dev, u64 dma_mask)
|
||||
static void dma_iommu_free_coherent(struct device *dev, size_t size,
|
||||
void *vaddr, dma_addr_t dma_handle)
|
||||
{
|
||||
#ifdef CONFIG_PCI
|
||||
if (dev->bus == &pci_bus_type)
|
||||
return pci_set_dma_mask(to_pci_dev(dev), dma_mask);
|
||||
#endif
|
||||
#ifdef CONFIG_IBMVIO
|
||||
if (dev->bus == &vio_bus_type)
|
||||
return -EIO;
|
||||
#endif /* CONFIG_IBMVIO */
|
||||
#ifdef CONFIG_IBMEBUS
|
||||
if (dev->bus == &ibmebus_bus_type)
|
||||
return -EIO;
|
||||
#endif
|
||||
BUG();
|
||||
return 0;
|
||||
iommu_free_coherent(dev->archdata.dma_data, size, vaddr, dma_handle);
|
||||
}
|
||||
EXPORT_SYMBOL(dma_set_mask);
|
||||
|
||||
void *dma_alloc_coherent(struct device *dev, size_t size,
|
||||
dma_addr_t *dma_handle, gfp_t flag)
|
||||
/* Creates TCEs for a user provided buffer. The user buffer must be
|
||||
* contiguous real kernel storage (not vmalloc). The address of the buffer
|
||||
* passed here is the kernel (virtual) address of the buffer. The buffer
|
||||
* need not be page aligned, the dma_addr_t returned will point to the same
|
||||
* byte within the page as vaddr.
|
||||
*/
|
||||
static dma_addr_t dma_iommu_map_single(struct device *dev, void *vaddr,
|
||||
size_t size,
|
||||
enum dma_data_direction direction)
|
||||
{
|
||||
struct dma_mapping_ops *dma_ops = get_dma_ops(dev);
|
||||
|
||||
BUG_ON(!dma_ops);
|
||||
|
||||
return dma_ops->alloc_coherent(dev, size, dma_handle, flag);
|
||||
return iommu_map_single(dev->archdata.dma_data, vaddr, size,
|
||||
device_to_mask(dev), direction);
|
||||
}
|
||||
EXPORT_SYMBOL(dma_alloc_coherent);
|
||||
|
||||
void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr,
|
||||
dma_addr_t dma_handle)
|
||||
|
||||
static void dma_iommu_unmap_single(struct device *dev, dma_addr_t dma_handle,
|
||||
size_t size,
|
||||
enum dma_data_direction direction)
|
||||
{
|
||||
struct dma_mapping_ops *dma_ops = get_dma_ops(dev);
|
||||
|
||||
BUG_ON(!dma_ops);
|
||||
|
||||
dma_ops->free_coherent(dev, size, cpu_addr, dma_handle);
|
||||
iommu_unmap_single(dev->archdata.dma_data, dma_handle, size, direction);
|
||||
}
|
||||
EXPORT_SYMBOL(dma_free_coherent);
|
||||
|
||||
dma_addr_t dma_map_single(struct device *dev, void *cpu_addr, size_t size,
|
||||
enum dma_data_direction direction)
|
||||
|
||||
static int dma_iommu_map_sg(struct device *dev, struct scatterlist *sglist,
|
||||
int nelems, enum dma_data_direction direction)
|
||||
{
|
||||
struct dma_mapping_ops *dma_ops = get_dma_ops(dev);
|
||||
|
||||
BUG_ON(!dma_ops);
|
||||
|
||||
return dma_ops->map_single(dev, cpu_addr, size, direction);
|
||||
return iommu_map_sg(dev->archdata.dma_data, sglist, nelems,
|
||||
device_to_mask(dev), direction);
|
||||
}
|
||||
EXPORT_SYMBOL(dma_map_single);
|
||||
|
||||
void dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
|
||||
enum dma_data_direction direction)
|
||||
static void dma_iommu_unmap_sg(struct device *dev, struct scatterlist *sglist,
|
||||
int nelems, enum dma_data_direction direction)
|
||||
{
|
||||
struct dma_mapping_ops *dma_ops = get_dma_ops(dev);
|
||||
|
||||
BUG_ON(!dma_ops);
|
||||
|
||||
dma_ops->unmap_single(dev, dma_addr, size, direction);
|
||||
iommu_unmap_sg(dev->archdata.dma_data, sglist, nelems, direction);
|
||||
}
|
||||
EXPORT_SYMBOL(dma_unmap_single);
|
||||
|
||||
dma_addr_t dma_map_page(struct device *dev, struct page *page,
|
||||
unsigned long offset, size_t size,
|
||||
enum dma_data_direction direction)
|
||||
/* We support DMA to/from any memory page via the iommu */
|
||||
static int dma_iommu_dma_supported(struct device *dev, u64 mask)
|
||||
{
|
||||
struct dma_mapping_ops *dma_ops = get_dma_ops(dev);
|
||||
struct iommu_table *tbl = dev->archdata.dma_data;
|
||||
|
||||
BUG_ON(!dma_ops);
|
||||
|
||||
return dma_ops->map_single(dev, page_address(page) + offset, size,
|
||||
direction);
|
||||
if (!tbl || tbl->it_offset > mask) {
|
||||
printk(KERN_INFO
|
||||
"Warning: IOMMU offset too big for device mask\n");
|
||||
if (tbl)
|
||||
printk(KERN_INFO
|
||||
"mask: 0x%08lx, table offset: 0x%08lx\n",
|
||||
mask, tbl->it_offset);
|
||||
else
|
||||
printk(KERN_INFO "mask: 0x%08lx, table unavailable\n",
|
||||
mask);
|
||||
return 0;
|
||||
} else
|
||||
return 1;
|
||||
}
|
||||
EXPORT_SYMBOL(dma_map_page);
|
||||
|
||||
void dma_unmap_page(struct device *dev, dma_addr_t dma_address, size_t size,
|
||||
enum dma_data_direction direction)
|
||||
struct dma_mapping_ops dma_iommu_ops = {
|
||||
.alloc_coherent = dma_iommu_alloc_coherent,
|
||||
.free_coherent = dma_iommu_free_coherent,
|
||||
.map_single = dma_iommu_map_single,
|
||||
.unmap_single = dma_iommu_unmap_single,
|
||||
.map_sg = dma_iommu_map_sg,
|
||||
.unmap_sg = dma_iommu_unmap_sg,
|
||||
.dma_supported = dma_iommu_dma_supported,
|
||||
};
|
||||
EXPORT_SYMBOL(dma_iommu_ops);
|
||||
|
||||
/*
|
||||
* Generic direct DMA implementation
|
||||
*
|
||||
* This implementation supports a global offset that can be applied if
|
||||
* the address at which memory is visible to devices is not 0.
|
||||
*/
|
||||
unsigned long dma_direct_offset;
|
||||
|
||||
static void *dma_direct_alloc_coherent(struct device *dev, size_t size,
|
||||
dma_addr_t *dma_handle, gfp_t flag)
|
||||
{
|
||||
struct dma_mapping_ops *dma_ops = get_dma_ops(dev);
|
||||
struct page *page;
|
||||
void *ret;
|
||||
int node = dev->archdata.numa_node;
|
||||
|
||||
BUG_ON(!dma_ops);
|
||||
/* TODO: Maybe use the numa node here too ? */
|
||||
page = alloc_pages_node(node, flag, get_order(size));
|
||||
if (page == NULL)
|
||||
return NULL;
|
||||
ret = page_address(page);
|
||||
memset(ret, 0, size);
|
||||
*dma_handle = virt_to_abs(ret) | dma_direct_offset;
|
||||
|
||||
dma_ops->unmap_single(dev, dma_address, size, direction);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(dma_unmap_page);
|
||||
|
||||
int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
|
||||
enum dma_data_direction direction)
|
||||
static void dma_direct_free_coherent(struct device *dev, size_t size,
|
||||
void *vaddr, dma_addr_t dma_handle)
|
||||
{
|
||||
struct dma_mapping_ops *dma_ops = get_dma_ops(dev);
|
||||
|
||||
BUG_ON(!dma_ops);
|
||||
|
||||
return dma_ops->map_sg(dev, sg, nents, direction);
|
||||
free_pages((unsigned long)vaddr, get_order(size));
|
||||
}
|
||||
EXPORT_SYMBOL(dma_map_sg);
|
||||
|
||||
void dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nhwentries,
|
||||
enum dma_data_direction direction)
|
||||
static dma_addr_t dma_direct_map_single(struct device *dev, void *ptr,
|
||||
size_t size,
|
||||
enum dma_data_direction direction)
|
||||
{
|
||||
struct dma_mapping_ops *dma_ops = get_dma_ops(dev);
|
||||
|
||||
BUG_ON(!dma_ops);
|
||||
|
||||
dma_ops->unmap_sg(dev, sg, nhwentries, direction);
|
||||
return virt_to_abs(ptr) | dma_direct_offset;
|
||||
}
|
||||
EXPORT_SYMBOL(dma_unmap_sg);
|
||||
|
||||
static void dma_direct_unmap_single(struct device *dev, dma_addr_t dma_addr,
|
||||
size_t size,
|
||||
enum dma_data_direction direction)
|
||||
{
|
||||
}
|
||||
|
||||
static int dma_direct_map_sg(struct device *dev, struct scatterlist *sg,
|
||||
int nents, enum dma_data_direction direction)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < nents; i++, sg++) {
|
||||
sg->dma_address = (page_to_phys(sg->page) + sg->offset) |
|
||||
dma_direct_offset;
|
||||
sg->dma_length = sg->length;
|
||||
}
|
||||
|
||||
return nents;
|
||||
}
|
||||
|
||||
static void dma_direct_unmap_sg(struct device *dev, struct scatterlist *sg,
|
||||
int nents, enum dma_data_direction direction)
|
||||
{
|
||||
}
|
||||
|
||||
static int dma_direct_dma_supported(struct device *dev, u64 mask)
|
||||
{
|
||||
/* Could be improved to check for memory though it better be
|
||||
* done via some global so platforms can set the limit in case
|
||||
* they have limited DMA windows
|
||||
*/
|
||||
return mask >= DMA_32BIT_MASK;
|
||||
}
|
||||
|
||||
struct dma_mapping_ops dma_direct_ops = {
|
||||
.alloc_coherent = dma_direct_alloc_coherent,
|
||||
.free_coherent = dma_direct_free_coherent,
|
||||
.map_single = dma_direct_map_single,
|
||||
.unmap_single = dma_direct_unmap_single,
|
||||
.map_sg = dma_direct_map_sg,
|
||||
.unmap_sg = dma_direct_unmap_sg,
|
||||
.dma_supported = dma_direct_dma_supported,
|
||||
};
|
||||
EXPORT_SYMBOL(dma_direct_ops);
|
||||
|
@ -87,15 +87,19 @@ system_call_common:
|
||||
addi r9,r1,STACK_FRAME_OVERHEAD
|
||||
ld r11,exception_marker@toc(r2)
|
||||
std r11,-16(r9) /* "regshere" marker */
|
||||
li r10,1
|
||||
stb r10,PACASOFTIRQEN(r13)
|
||||
stb r10,PACAHARDIRQEN(r13)
|
||||
std r10,SOFTE(r1)
|
||||
#ifdef CONFIG_PPC_ISERIES
|
||||
BEGIN_FW_FTR_SECTION
|
||||
/* Hack for handling interrupts when soft-enabling on iSeries */
|
||||
cmpdi cr1,r0,0x5555 /* syscall 0x5555 */
|
||||
andi. r10,r12,MSR_PR /* from kernel */
|
||||
crand 4*cr0+eq,4*cr1+eq,4*cr0+eq
|
||||
beq hardware_interrupt_entry
|
||||
lbz r10,PACAPROCENABLED(r13)
|
||||
std r10,SOFTE(r1)
|
||||
bne 2f
|
||||
b hardware_interrupt_entry
|
||||
2:
|
||||
END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES)
|
||||
#endif
|
||||
mfmsr r11
|
||||
@ -460,9 +464,9 @@ _GLOBAL(ret_from_except_lite)
|
||||
#endif
|
||||
|
||||
restore:
|
||||
ld r5,SOFTE(r1)
|
||||
#ifdef CONFIG_PPC_ISERIES
|
||||
BEGIN_FW_FTR_SECTION
|
||||
ld r5,SOFTE(r1)
|
||||
cmpdi 0,r5,0
|
||||
beq 4f
|
||||
/* Check for pending interrupts (iSeries) */
|
||||
@ -472,21 +476,25 @@ BEGIN_FW_FTR_SECTION
|
||||
beq+ 4f /* skip do_IRQ if no interrupts */
|
||||
|
||||
li r3,0
|
||||
stb r3,PACAPROCENABLED(r13) /* ensure we are soft-disabled */
|
||||
stb r3,PACASOFTIRQEN(r13) /* ensure we are soft-disabled */
|
||||
ori r10,r10,MSR_EE
|
||||
mtmsrd r10 /* hard-enable again */
|
||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
bl .do_IRQ
|
||||
b .ret_from_except_lite /* loop back and handle more */
|
||||
|
||||
4: stb r5,PACAPROCENABLED(r13)
|
||||
4:
|
||||
END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES)
|
||||
#endif
|
||||
stb r5,PACASOFTIRQEN(r13)
|
||||
|
||||
ld r3,_MSR(r1)
|
||||
andi. r0,r3,MSR_RI
|
||||
beq- unrecov_restore
|
||||
|
||||
/* extract EE bit and use it to restore paca->hard_enabled */
|
||||
rldicl r4,r3,49,63 /* r0 = (r3 >> 15) & 1 */
|
||||
stb r4,PACAHARDIRQEN(r13)
|
||||
|
||||
andi. r0,r3,MSR_PR
|
||||
|
||||
/*
|
||||
@ -538,25 +546,15 @@ do_work:
|
||||
/* Check that preempt_count() == 0 and interrupts are enabled */
|
||||
lwz r8,TI_PREEMPT(r9)
|
||||
cmpwi cr1,r8,0
|
||||
#ifdef CONFIG_PPC_ISERIES
|
||||
BEGIN_FW_FTR_SECTION
|
||||
ld r0,SOFTE(r1)
|
||||
cmpdi r0,0
|
||||
END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES)
|
||||
#endif
|
||||
BEGIN_FW_FTR_SECTION
|
||||
andi. r0,r3,MSR_EE
|
||||
END_FW_FTR_SECTION_IFCLR(FW_FEATURE_ISERIES)
|
||||
crandc eq,cr1*4+eq,eq
|
||||
bne restore
|
||||
/* here we are preempting the current task */
|
||||
1:
|
||||
#ifdef CONFIG_PPC_ISERIES
|
||||
BEGIN_FW_FTR_SECTION
|
||||
li r0,1
|
||||
stb r0,PACAPROCENABLED(r13)
|
||||
END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES)
|
||||
#endif
|
||||
stb r0,PACASOFTIRQEN(r13)
|
||||
stb r0,PACAHARDIRQEN(r13)
|
||||
ori r10,r10,MSR_EE
|
||||
mtmsrd r10,1 /* reenable interrupts */
|
||||
bl .preempt_schedule
|
||||
@ -639,8 +637,7 @@ _GLOBAL(enter_rtas)
|
||||
/* There is no way it is acceptable to get here with interrupts enabled,
|
||||
* check it with the asm equivalent of WARN_ON
|
||||
*/
|
||||
mfmsr r6
|
||||
andi. r0,r6,MSR_EE
|
||||
lbz r0,PACASOFTIRQEN(r13)
|
||||
1: tdnei r0,0
|
||||
.section __bug_table,"a"
|
||||
.llong 1b,__LINE__ + 0x1000000, 1f, 2f
|
||||
@ -649,7 +646,13 @@ _GLOBAL(enter_rtas)
|
||||
1: .asciz __FILE__
|
||||
2: .asciz "enter_rtas"
|
||||
.previous
|
||||
|
||||
|
||||
/* Hard-disable interrupts */
|
||||
mfmsr r6
|
||||
rldicl r7,r6,48,1
|
||||
rotldi r7,r7,16
|
||||
mtmsrd r7,1
|
||||
|
||||
/* Unfortunately, the stack pointer and the MSR are also clobbered,
|
||||
* so they are saved in the PACA which allows us to restore
|
||||
* our original state after RTAS returns.
|
||||
@ -735,8 +738,6 @@ _STATIC(rtas_restore_regs)
|
||||
|
||||
#endif /* CONFIG_PPC_RTAS */
|
||||
|
||||
#ifdef CONFIG_PPC_MULTIPLATFORM
|
||||
|
||||
_GLOBAL(enter_prom)
|
||||
mflr r0
|
||||
std r0,16(r1)
|
||||
@ -821,5 +822,3 @@ _GLOBAL(enter_prom)
|
||||
ld r0,16(r1)
|
||||
mtlr r0
|
||||
blr
|
||||
|
||||
#endif /* CONFIG_PPC_MULTIPLATFORM */
|
||||
|
@ -35,9 +35,7 @@
|
||||
#include <asm/thread_info.h>
|
||||
#include <asm/firmware.h>
|
||||
|
||||
#ifdef CONFIG_PPC_ISERIES
|
||||
#define DO_SOFT_DISABLE
|
||||
#endif
|
||||
|
||||
/*
|
||||
* We layout physical memory as follows:
|
||||
@ -74,13 +72,11 @@
|
||||
.text
|
||||
.globl _stext
|
||||
_stext:
|
||||
#ifdef CONFIG_PPC_MULTIPLATFORM
|
||||
_GLOBAL(__start)
|
||||
/* NOP this out unconditionally */
|
||||
BEGIN_FTR_SECTION
|
||||
b .__start_initialization_multiplatform
|
||||
END_FTR_SECTION(0, 1)
|
||||
#endif /* CONFIG_PPC_MULTIPLATFORM */
|
||||
|
||||
/* Catch branch to 0 in real mode */
|
||||
trap
|
||||
@ -308,7 +304,9 @@ exception_marker:
|
||||
std r9,_LINK(r1); \
|
||||
mfctr r10; /* save CTR in stackframe */ \
|
||||
std r10,_CTR(r1); \
|
||||
lbz r10,PACASOFTIRQEN(r13); \
|
||||
mfspr r11,SPRN_XER; /* save XER in stackframe */ \
|
||||
std r10,SOFTE(r1); \
|
||||
std r11,_XER(r1); \
|
||||
li r9,(n)+1; \
|
||||
std r9,_TRAP(r1); /* set trap number */ \
|
||||
@ -343,6 +341,34 @@ label##_pSeries: \
|
||||
EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common)
|
||||
|
||||
|
||||
#define MASKABLE_EXCEPTION_PSERIES(n, label) \
|
||||
. = n; \
|
||||
.globl label##_pSeries; \
|
||||
label##_pSeries: \
|
||||
HMT_MEDIUM; \
|
||||
mtspr SPRN_SPRG1,r13; /* save r13 */ \
|
||||
mfspr r13,SPRN_SPRG3; /* get paca address into r13 */ \
|
||||
std r9,PACA_EXGEN+EX_R9(r13); /* save r9, r10 */ \
|
||||
std r10,PACA_EXGEN+EX_R10(r13); \
|
||||
lbz r10,PACASOFTIRQEN(r13); \
|
||||
mfcr r9; \
|
||||
cmpwi r10,0; \
|
||||
beq masked_interrupt; \
|
||||
mfspr r10,SPRN_SPRG1; \
|
||||
std r10,PACA_EXGEN+EX_R13(r13); \
|
||||
std r11,PACA_EXGEN+EX_R11(r13); \
|
||||
std r12,PACA_EXGEN+EX_R12(r13); \
|
||||
clrrdi r12,r13,32; /* get high part of &label */ \
|
||||
mfmsr r10; \
|
||||
mfspr r11,SPRN_SRR0; /* save SRR0 */ \
|
||||
LOAD_HANDLER(r12,label##_common) \
|
||||
ori r10,r10,MSR_IR|MSR_DR|MSR_RI; \
|
||||
mtspr SPRN_SRR0,r12; \
|
||||
mfspr r12,SPRN_SRR1; /* and SRR1 */ \
|
||||
mtspr SPRN_SRR1,r10; \
|
||||
rfid; \
|
||||
b . /* prevent speculative execution */
|
||||
|
||||
#define STD_EXCEPTION_ISERIES(n, label, area) \
|
||||
.globl label##_iSeries; \
|
||||
label##_iSeries: \
|
||||
@ -358,40 +384,32 @@ label##_iSeries: \
|
||||
HMT_MEDIUM; \
|
||||
mtspr SPRN_SPRG1,r13; /* save r13 */ \
|
||||
EXCEPTION_PROLOG_ISERIES_1(PACA_EXGEN); \
|
||||
lbz r10,PACAPROCENABLED(r13); \
|
||||
lbz r10,PACASOFTIRQEN(r13); \
|
||||
cmpwi 0,r10,0; \
|
||||
beq- label##_iSeries_masked; \
|
||||
EXCEPTION_PROLOG_ISERIES_2; \
|
||||
b label##_common; \
|
||||
|
||||
#ifdef DO_SOFT_DISABLE
|
||||
#ifdef CONFIG_PPC_ISERIES
|
||||
#define DISABLE_INTS \
|
||||
BEGIN_FW_FTR_SECTION; \
|
||||
lbz r10,PACAPROCENABLED(r13); \
|
||||
li r11,0; \
|
||||
std r10,SOFTE(r1); \
|
||||
stb r11,PACASOFTIRQEN(r13); \
|
||||
BEGIN_FW_FTR_SECTION; \
|
||||
stb r11,PACAHARDIRQEN(r13); \
|
||||
END_FW_FTR_SECTION_IFCLR(FW_FEATURE_ISERIES); \
|
||||
BEGIN_FW_FTR_SECTION; \
|
||||
mfmsr r10; \
|
||||
stb r11,PACAPROCENABLED(r13); \
|
||||
ori r10,r10,MSR_EE; \
|
||||
mtmsrd r10,1; \
|
||||
END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES)
|
||||
|
||||
#define ENABLE_INTS \
|
||||
BEGIN_FW_FTR_SECTION; \
|
||||
lbz r10,PACAPROCENABLED(r13); \
|
||||
mfmsr r11; \
|
||||
std r10,SOFTE(r1); \
|
||||
ori r11,r11,MSR_EE; \
|
||||
END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES); \
|
||||
BEGIN_FW_FTR_SECTION; \
|
||||
ld r12,_MSR(r1); \
|
||||
mfmsr r11; \
|
||||
rlwimi r11,r12,0,MSR_EE; \
|
||||
END_FW_FTR_SECTION_IFCLR(FW_FEATURE_ISERIES); \
|
||||
mtmsrd r11,1
|
||||
#else
|
||||
#define DISABLE_INTS \
|
||||
li r11,0; \
|
||||
stb r11,PACASOFTIRQEN(r13); \
|
||||
stb r11,PACAHARDIRQEN(r13)
|
||||
|
||||
#else /* hard enable/disable interrupts */
|
||||
#define DISABLE_INTS
|
||||
#endif /* CONFIG_PPC_ISERIES */
|
||||
|
||||
#define ENABLE_INTS \
|
||||
ld r12,_MSR(r1); \
|
||||
@ -399,8 +417,6 @@ END_FW_FTR_SECTION_IFCLR(FW_FEATURE_ISERIES); \
|
||||
rlwimi r11,r12,0,MSR_EE; \
|
||||
mtmsrd r11,1
|
||||
|
||||
#endif
|
||||
|
||||
#define STD_EXCEPTION_COMMON(trap, label, hdlr) \
|
||||
.align 7; \
|
||||
.globl label##_common; \
|
||||
@ -541,11 +557,11 @@ instruction_access_slb_pSeries:
|
||||
mfspr r12,SPRN_SRR1 /* and SRR1 */
|
||||
b .slb_miss_realmode /* Rel. branch works in real mode */
|
||||
|
||||
STD_EXCEPTION_PSERIES(0x500, hardware_interrupt)
|
||||
MASKABLE_EXCEPTION_PSERIES(0x500, hardware_interrupt)
|
||||
STD_EXCEPTION_PSERIES(0x600, alignment)
|
||||
STD_EXCEPTION_PSERIES(0x700, program_check)
|
||||
STD_EXCEPTION_PSERIES(0x800, fp_unavailable)
|
||||
STD_EXCEPTION_PSERIES(0x900, decrementer)
|
||||
MASKABLE_EXCEPTION_PSERIES(0x900, decrementer)
|
||||
STD_EXCEPTION_PSERIES(0xa00, trap_0a)
|
||||
STD_EXCEPTION_PSERIES(0xb00, trap_0b)
|
||||
|
||||
@ -597,7 +613,24 @@ system_call_pSeries:
|
||||
/*** pSeries interrupt support ***/
|
||||
|
||||
/* moved from 0xf00 */
|
||||
STD_EXCEPTION_PSERIES(., performance_monitor)
|
||||
MASKABLE_EXCEPTION_PSERIES(., performance_monitor)
|
||||
|
||||
/*
|
||||
* An interrupt came in while soft-disabled; clear EE in SRR1,
|
||||
* clear paca->hard_enabled and return.
|
||||
*/
|
||||
masked_interrupt:
|
||||
stb r10,PACAHARDIRQEN(r13)
|
||||
mtcrf 0x80,r9
|
||||
ld r9,PACA_EXGEN+EX_R9(r13)
|
||||
mfspr r10,SPRN_SRR1
|
||||
rldicl r10,r10,48,1 /* clear MSR_EE */
|
||||
rotldi r10,r10,16
|
||||
mtspr SPRN_SRR1,r10
|
||||
ld r10,PACA_EXGEN+EX_R10(r13)
|
||||
mfspr r13,SPRN_SPRG1
|
||||
rfid
|
||||
b .
|
||||
|
||||
.align 7
|
||||
do_stab_bolted_pSeries:
|
||||
@ -792,7 +825,7 @@ system_reset_iSeries:
|
||||
|
||||
cmpwi 0,r23,0
|
||||
beq iSeries_secondary_smp_loop /* Loop until told to go */
|
||||
bne .__secondary_start /* Loop until told to go */
|
||||
bne __secondary_start /* Loop until told to go */
|
||||
iSeries_secondary_smp_loop:
|
||||
/* Let the Hypervisor know we are alive */
|
||||
/* 8002 is a call to HvCallCfg::getLps, a harmless Hypervisor function */
|
||||
@ -813,7 +846,6 @@ iSeries_secondary_smp_loop:
|
||||
b 1b /* If SMP not configured, secondaries
|
||||
* loop forever */
|
||||
|
||||
.globl decrementer_iSeries_masked
|
||||
decrementer_iSeries_masked:
|
||||
/* We may not have a valid TOC pointer in here. */
|
||||
li r11,1
|
||||
@ -824,7 +856,6 @@ decrementer_iSeries_masked:
|
||||
mtspr SPRN_DEC,r12
|
||||
/* fall through */
|
||||
|
||||
.globl hardware_interrupt_iSeries_masked
|
||||
hardware_interrupt_iSeries_masked:
|
||||
mtcrf 0x80,r9 /* Restore regs */
|
||||
ld r12,PACALPPACAPTR(r13)
|
||||
@ -926,10 +957,18 @@ bad_stack:
|
||||
* any task or sent any task a signal, you should use
|
||||
* ret_from_except or ret_from_except_lite instead of this.
|
||||
*/
|
||||
fast_exc_return_irq: /* restores irq state too */
|
||||
ld r3,SOFTE(r1)
|
||||
ld r12,_MSR(r1)
|
||||
stb r3,PACASOFTIRQEN(r13) /* restore paca->soft_enabled */
|
||||
rldicl r4,r12,49,63 /* get MSR_EE to LSB */
|
||||
stb r4,PACAHARDIRQEN(r13) /* restore paca->hard_enabled */
|
||||
b 1f
|
||||
|
||||
.globl fast_exception_return
|
||||
fast_exception_return:
|
||||
ld r12,_MSR(r1)
|
||||
ld r11,_NIP(r1)
|
||||
1: ld r11,_NIP(r1)
|
||||
andi. r3,r12,MSR_RI /* check if RI is set */
|
||||
beq- unrecov_fer
|
||||
|
||||
@ -952,7 +991,8 @@ fast_exception_return:
|
||||
REST_8GPRS(2, r1)
|
||||
|
||||
mfmsr r10
|
||||
clrrdi r10,r10,2 /* clear RI (LE is 0 already) */
|
||||
rldicl r10,r10,48,1 /* clear EE */
|
||||
rldicr r10,r10,16,61 /* clear RI (LE is 0 already) */
|
||||
mtmsrd r10,1
|
||||
|
||||
mtspr SPRN_SRR1,r12
|
||||
@ -1326,6 +1366,16 @@ BEGIN_FW_FTR_SECTION
|
||||
* interrupts if necessary.
|
||||
*/
|
||||
beq 13f
|
||||
END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES)
|
||||
#endif
|
||||
BEGIN_FW_FTR_SECTION
|
||||
/*
|
||||
* Here we have interrupts hard-disabled, so it is sufficient
|
||||
* to restore paca->{soft,hard}_enable and get out.
|
||||
*/
|
||||
beq fast_exc_return_irq /* Return from exception on success */
|
||||
END_FW_FTR_SECTION_IFCLR(FW_FEATURE_ISERIES)
|
||||
|
||||
/* For a hash failure, we don't bother re-enabling interrupts */
|
||||
ble- 12f
|
||||
|
||||
@ -1337,14 +1387,6 @@ BEGIN_FW_FTR_SECTION
|
||||
ld r3,SOFTE(r1)
|
||||
bl .local_irq_restore
|
||||
b 11f
|
||||
END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES)
|
||||
#endif
|
||||
BEGIN_FW_FTR_SECTION
|
||||
beq fast_exception_return /* Return from exception on success */
|
||||
ble- 12f /* Failure return from hash_page */
|
||||
|
||||
/* fall through */
|
||||
END_FW_FTR_SECTION_IFCLR(FW_FEATURE_ISERIES)
|
||||
|
||||
/* Here we have a page fault that hash_page can't handle. */
|
||||
handle_page_fault:
|
||||
@ -1362,6 +1404,8 @@ handle_page_fault:
|
||||
bl .bad_page_fault
|
||||
b .ret_from_except
|
||||
|
||||
13: b .ret_from_except_lite
|
||||
|
||||
/* We have a page fault that hash_page could handle but HV refused
|
||||
* the PTE insertion
|
||||
*/
|
||||
@ -1371,8 +1415,6 @@ handle_page_fault:
|
||||
bl .low_hash_fault
|
||||
b .ret_from_except
|
||||
|
||||
13: b .ret_from_except_lite
|
||||
|
||||
/* here we have a segment miss */
|
||||
do_ste_alloc:
|
||||
bl .ste_allocate /* try to insert stab entry */
|
||||
@ -1560,7 +1602,7 @@ _GLOBAL(generic_secondary_smp_init)
|
||||
ld r1,PACAEMERGSP(r13)
|
||||
subi r1,r1,STACK_FRAME_OVERHEAD
|
||||
|
||||
b .__secondary_start
|
||||
b __secondary_start
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PPC_ISERIES
|
||||
@ -1595,7 +1637,6 @@ _STATIC(__start_initialization_iSeries)
|
||||
b .start_here_common
|
||||
#endif /* CONFIG_PPC_ISERIES */
|
||||
|
||||
#ifdef CONFIG_PPC_MULTIPLATFORM
|
||||
|
||||
_STATIC(__mmu_off)
|
||||
mfmsr r3
|
||||
@ -1621,13 +1662,11 @@ _STATIC(__mmu_off)
|
||||
*
|
||||
*/
|
||||
_GLOBAL(__start_initialization_multiplatform)
|
||||
#ifdef CONFIG_PPC_MULTIPLATFORM
|
||||
/*
|
||||
* Are we booted from a PROM Of-type client-interface ?
|
||||
*/
|
||||
cmpldi cr0,r5,0
|
||||
bne .__boot_from_prom /* yes -> prom */
|
||||
#endif
|
||||
|
||||
/* Save parameters */
|
||||
mr r31,r3
|
||||
@ -1656,7 +1695,6 @@ _GLOBAL(__start_initialization_multiplatform)
|
||||
bl .__mmu_off
|
||||
b .__after_prom_start
|
||||
|
||||
#ifdef CONFIG_PPC_MULTIPLATFORM
|
||||
_STATIC(__boot_from_prom)
|
||||
/* Save parameters */
|
||||
mr r31,r3
|
||||
@ -1696,7 +1734,6 @@ _STATIC(__boot_from_prom)
|
||||
bl .prom_init
|
||||
/* We never return */
|
||||
trap
|
||||
#endif
|
||||
|
||||
/*
|
||||
* At this point, r3 contains the physical address we are running at,
|
||||
@ -1752,8 +1789,6 @@ _STATIC(__after_prom_start)
|
||||
bl .copy_and_flush /* copy the rest */
|
||||
b .start_here_multiplatform
|
||||
|
||||
#endif /* CONFIG_PPC_MULTIPLATFORM */
|
||||
|
||||
/*
|
||||
* Copy routine used to copy the kernel to start at physical address 0
|
||||
* and flush and invalidate the caches as needed.
|
||||
@ -1836,7 +1871,7 @@ _GLOBAL(pmac_secondary_start)
|
||||
ld r1,PACAEMERGSP(r13)
|
||||
subi r1,r1,STACK_FRAME_OVERHEAD
|
||||
|
||||
b .__secondary_start
|
||||
b __secondary_start
|
||||
|
||||
#endif /* CONFIG_PPC_PMAC */
|
||||
|
||||
@ -1853,7 +1888,7 @@ _GLOBAL(pmac_secondary_start)
|
||||
* r13 = paca virtual address
|
||||
* SPRG3 = paca virtual address
|
||||
*/
|
||||
_GLOBAL(__secondary_start)
|
||||
__secondary_start:
|
||||
/* Set thread priority to MEDIUM */
|
||||
HMT_MEDIUM
|
||||
|
||||
@ -1877,11 +1912,16 @@ _GLOBAL(__secondary_start)
|
||||
/* enable MMU and jump to start_secondary */
|
||||
LOAD_REG_ADDR(r3, .start_secondary_prolog)
|
||||
LOAD_REG_IMMEDIATE(r4, MSR_KERNEL)
|
||||
#ifdef DO_SOFT_DISABLE
|
||||
#ifdef CONFIG_PPC_ISERIES
|
||||
BEGIN_FW_FTR_SECTION
|
||||
ori r4,r4,MSR_EE
|
||||
END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES)
|
||||
#endif
|
||||
BEGIN_FW_FTR_SECTION
|
||||
stb r7,PACASOFTIRQEN(r13)
|
||||
stb r7,PACAHARDIRQEN(r13)
|
||||
END_FW_FTR_SECTION_IFCLR(FW_FEATURE_ISERIES)
|
||||
|
||||
mtspr SPRN_SRR0,r3
|
||||
mtspr SPRN_SRR1,r4
|
||||
rfid
|
||||
@ -1913,7 +1953,6 @@ _GLOBAL(enable_64b_mode)
|
||||
isync
|
||||
blr
|
||||
|
||||
#ifdef CONFIG_PPC_MULTIPLATFORM
|
||||
/*
|
||||
* This is where the main kernel code starts.
|
||||
*/
|
||||
@ -1977,7 +2016,6 @@ _STATIC(start_here_multiplatform)
|
||||
mtspr SPRN_SRR1,r4
|
||||
rfid
|
||||
b . /* prevent speculative execution */
|
||||
#endif /* CONFIG_PPC_MULTIPLATFORM */
|
||||
|
||||
/* This is where all platforms converge execution */
|
||||
_STATIC(start_here_common)
|
||||
@ -2005,15 +2043,18 @@ _STATIC(start_here_common)
|
||||
|
||||
/* Load up the kernel context */
|
||||
5:
|
||||
#ifdef DO_SOFT_DISABLE
|
||||
BEGIN_FW_FTR_SECTION
|
||||
li r5,0
|
||||
stb r5,PACAPROCENABLED(r13) /* Soft Disabled */
|
||||
stb r5,PACASOFTIRQEN(r13) /* Soft Disabled */
|
||||
#ifdef CONFIG_PPC_ISERIES
|
||||
BEGIN_FW_FTR_SECTION
|
||||
mfmsr r5
|
||||
ori r5,r5,MSR_EE /* Hard Enabled */
|
||||
mtmsrd r5
|
||||
END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES)
|
||||
#endif
|
||||
BEGIN_FW_FTR_SECTION
|
||||
stb r5,PACAHARDIRQEN(r13)
|
||||
END_FW_FTR_SECTION_IFCLR(FW_FEATURE_ISERIES)
|
||||
|
||||
bl .start_kernel
|
||||
|
||||
|
@ -112,7 +112,7 @@ static int ibmebus_dma_supported(struct device *dev, u64 mask)
|
||||
return 1;
|
||||
}
|
||||
|
||||
struct dma_mapping_ops ibmebus_dma_ops = {
|
||||
static struct dma_mapping_ops ibmebus_dma_ops = {
|
||||
.alloc_coherent = ibmebus_alloc_coherent,
|
||||
.free_coherent = ibmebus_free_coherent,
|
||||
.map_single = ibmebus_map_single,
|
||||
@ -176,6 +176,10 @@ static struct ibmebus_dev* __devinit ibmebus_register_device_common(
|
||||
dev->ofdev.dev.bus = &ibmebus_bus_type;
|
||||
dev->ofdev.dev.release = ibmebus_dev_release;
|
||||
|
||||
dev->ofdev.dev.archdata.of_node = dev->ofdev.node;
|
||||
dev->ofdev.dev.archdata.dma_ops = &ibmebus_dma_ops;
|
||||
dev->ofdev.dev.archdata.numa_node = of_node_to_nid(dev->ofdev.node);
|
||||
|
||||
/* An ibmebusdev is based on a of_device. We have to change the
|
||||
* bus type to use our own DMA mapping operations.
|
||||
*/
|
||||
@ -210,11 +214,10 @@ static struct ibmebus_dev* __devinit ibmebus_register_device_node(
|
||||
return NULL;
|
||||
}
|
||||
|
||||
dev = kmalloc(sizeof(struct ibmebus_dev), GFP_KERNEL);
|
||||
dev = kzalloc(sizeof(struct ibmebus_dev), GFP_KERNEL);
|
||||
if (!dev) {
|
||||
return NULL;
|
||||
}
|
||||
memset(dev, 0, sizeof(struct ibmebus_dev));
|
||||
|
||||
dev->ofdev.node = of_node_get(dn);
|
||||
|
||||
|
@ -39,6 +39,13 @@
|
||||
#define cpu_should_die() 0
|
||||
#endif
|
||||
|
||||
static int __init powersave_off(char *arg)
|
||||
{
|
||||
ppc_md.power_save = NULL;
|
||||
return 0;
|
||||
}
|
||||
__setup("powersave=off", powersave_off);
|
||||
|
||||
/*
|
||||
* The body of the idle task.
|
||||
*/
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user