IEEE 1394 (FireWire) subsystem changes:
- make remote debugging over 1394 a runtime option instead of a buildtime option - extend remote debug access past the 4 GB barrier on respectively capable hardware - documentation update -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIcBAABAgAGBQJS5mQyAAoJEHnzb7JUXXnQW/UQAI8+oZAmq67dTMNnASO3XJjc B4rO/xU1ISvf4uCO7gZb1KHUDem1XnkG1YLGtJbrlWqEwqsF6RizUSNtStaiVKo3 WXu1OK74KvtyGgqZhpbn1OttYLac+Tj22XooPQ7q1fQ/ihzeODKEWnKpTv0RFaQf EMgKxorfDe7JTr8ZoSk5JJ/Vmg47RaPeymX+wQoLZRQtrSiKt3+wbH51XHOIacjj DJgmek9zjmd0S8D7uRyF7/35HdPazMh8uclI8HjSM9r7YfGhUetuPMRNIETbuLAj gj59kgJujCnMuuBQ2DBZWXjcZEUf6+0ttcMBVME6I2vKZ+M+Z5VsdbWZrfjvKzXN QF5wJpFVfVPoPOP2YUq3OGqK9mJ/rOPzhm2mpkvIe8qIiKne4EcHnLIlZBnGQxOL axI1FLlwjmqxL0WAnnfUWp3jqDfUJm53X+bRgMYjsyhZTYfurQuVgPcJ0odlEu7o 47Al3VEV97hCJlGyNpp+T4G1Fpd8WpPH5FyDEwQm5N4P0Xl3r6llD+DTBdil2OYW nqe/tXKI1Xu71jXKq/qtBvIRwFNFgIsX5pYhLvXBnKSUYIT1j346Ya1WeaDBQ865 EWMUVB+13UopLJgFA4qHVX/X35OXG3NJBuAWb7e1AMcXvfKniUrPPtycmN5oFlv1 wksJpVNH8xBc8q+MANSy =82Pd -----END PGP SIGNATURE----- Merge tag 'firewire-updates' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394 Pull firewire updates from Stefan Richter: "IEEE 1394 (FireWire) subsystem changes: - make remote debugging over 1394 a runtime option instead of a buildtime option - extend remote debug access past the 4 GB barrier on respectively capable hardware - documentation update" * tag 'firewire-updates' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394: firewire: Enable remote DMA above 4 GB firewire: ohci: Turn remote DMA support into a module parameter Documentation/: update FireWire debugging documentation
This commit is contained in:
commit
028e219eff
@ -22,10 +22,12 @@ locations such as buffers like the printk buffer or the process table.
|
||||
Retrieving a full system memory dump is also possible over the FireWire,
|
||||
using data transfer rates in the order of 10MB/s or more.
|
||||
|
||||
Memory access is currently limited to the low 4G of physical address
|
||||
space which can be a problem on IA64 machines where memory is located
|
||||
mostly above that limit, but it is rarely a problem on more common
|
||||
hardware such as hardware based on x86, x86-64 and PowerPC.
|
||||
With most FireWire controllers, memory access is limited to the low 4 GB
|
||||
of physical address space. This can be a problem on IA64 machines where
|
||||
memory is located mostly above that limit, but it is rarely a problem on
|
||||
more common hardware such as x86, x86-64 and PowerPC. However, at least
|
||||
Agere/LSI FW643e and FW643e2 controllers are known to support access to
|
||||
physical addresses above 4 GB.
|
||||
|
||||
Together with a early initialization of the OHCI-1394 controller for debugging,
|
||||
this facility proved most useful for examining long debugs logs in the printk
|
||||
@ -36,17 +38,11 @@ available (notebooks) or too slow for extensive debug information (like ACPI).
|
||||
Drivers
|
||||
-------
|
||||
|
||||
The ohci1394 driver in drivers/ieee1394 initializes the OHCI-1394 controllers
|
||||
to a working state and enables physical DMA by default for all remote nodes.
|
||||
This can be turned off by ohci1394's module parameter phys_dma=0.
|
||||
|
||||
The alternative firewire-ohci driver in drivers/firewire uses filtered physical
|
||||
The firewire-ohci driver in drivers/firewire uses filtered physical
|
||||
DMA by default, which is more secure but not suitable for remote debugging.
|
||||
Compile the driver with CONFIG_FIREWIRE_OHCI_REMOTE_DMA (Kernel hacking menu:
|
||||
Remote debugging over FireWire with firewire-ohci) to get unfiltered physical
|
||||
DMA.
|
||||
Pass the remote_dma=1 parameter to the driver to get unfiltered physical DMA.
|
||||
|
||||
Because ohci1394 and firewire-ohci depend on the PCI enumeration to be
|
||||
Because the firewire-ohci driver depends on the PCI enumeration to be
|
||||
completed, an initialization routine which runs pretty early has been
|
||||
implemented for x86. This routine runs long before console_init() can be
|
||||
called, i.e. before the printk buffer appears on the console.
|
||||
@ -64,7 +60,7 @@ be used to view the printk buffer of a remote machine, even with live update.
|
||||
|
||||
Bernhard Kaindl enhanced firescope to support accessing 64-bit machines
|
||||
from 32-bit firescope and vice versa:
|
||||
- http://halobates.de/firewire/firescope-0.2.2.tar.bz2
|
||||
- http://v3.sk/~lkundrak/firescope/
|
||||
|
||||
and he implemented fast system dump (alpha version - read README.txt):
|
||||
- http://halobates.de/firewire/firedump-0.1.tar.bz2
|
||||
@ -92,11 +88,11 @@ Step-by-step instructions for using firescope with early OHCI initialization:
|
||||
|
||||
1) Verify that your hardware is supported:
|
||||
|
||||
Load the ohci1394 or the fw-ohci module and check your kernel logs.
|
||||
Load the firewire-ohci module and check your kernel logs.
|
||||
You should see a line similar to
|
||||
|
||||
ohci1394: fw-host0: OHCI-1394 1.1 (PCI): IRQ=[18] MMIO=[fe9ff800-fe9fffff]
|
||||
... Max Packet=[2048] IR/IT contexts=[4/8]
|
||||
firewire_ohci 0000:15:00.1: added OHCI v1.0 device as card 2, 4 IR + 4 IT
|
||||
... contexts, quirks 0x11
|
||||
|
||||
when loading the driver. If you have no supported controller, many PCI,
|
||||
CardBus and even some Express cards which are fully compliant to OHCI-1394
|
||||
@ -105,6 +101,9 @@ Step-by-step instructions for using firescope with early OHCI initialization:
|
||||
compliant, they are based on TI PCILynx chips and require drivers for Win-
|
||||
dows operating systems.
|
||||
|
||||
The mentioned kernel log message contains ">4 GB phys DMA" in case of
|
||||
OHCI-1394 controllers which support accesses above this limit.
|
||||
|
||||
2) Establish a working FireWire cable connection:
|
||||
|
||||
Any FireWire cable, as long at it provides electrically and mechanically
|
||||
@ -113,20 +112,18 @@ Step-by-step instructions for using firescope with early OHCI initialization:
|
||||
|
||||
If an driver is running on both machines you should see a line like
|
||||
|
||||
ieee1394: Node added: ID:BUS[0-01:1023] GUID[0090270001b84bba]
|
||||
firewire_core 0000:15:00.1: created device fw1: GUID 00061b0020105917, S400
|
||||
|
||||
on both machines in the kernel log when the cable is plugged in
|
||||
and connects the two machines.
|
||||
|
||||
3) Test physical DMA using firescope:
|
||||
|
||||
On the debug host,
|
||||
- load the raw1394 module,
|
||||
- make sure that /dev/raw1394 is accessible,
|
||||
On the debug host, make sure that /dev/fw* is accessible,
|
||||
then start firescope:
|
||||
|
||||
$ firescope
|
||||
Port 0 (ohci1394) opened, 2 nodes detected
|
||||
Port 0 (/dev/fw1) opened, 2 nodes detected
|
||||
|
||||
FireScope
|
||||
---------
|
||||
|
@ -172,7 +172,7 @@ you can boot the kernel with the 'no_console_suspend' parameter and try to log
|
||||
kernel messages using the serial console. This may provide you with some
|
||||
information about the reasons of the suspend (resume) failure. Alternatively,
|
||||
it may be possible to use a FireWire port for debugging with firescope
|
||||
(ftp://ftp.firstfloor.org/pub/ak/firescope/). On x86 it is also possible to
|
||||
(http://v3.sk/~lkundrak/firescope/). On x86 it is also possible to
|
||||
use the PM_TRACE mechanism documented in Documentation/power/s2ram.txt .
|
||||
|
||||
2. Testing suspend to RAM (STR)
|
||||
|
@ -523,11 +523,11 @@ static DEFINE_SPINLOCK(address_handler_list_lock);
|
||||
static LIST_HEAD(address_handler_list);
|
||||
|
||||
const struct fw_address_region fw_high_memory_region =
|
||||
{ .start = 0x000100000000ULL, .end = 0xffffe0000000ULL, };
|
||||
{ .start = FW_MAX_PHYSICAL_RANGE, .end = 0xffffe0000000ULL, };
|
||||
EXPORT_SYMBOL(fw_high_memory_region);
|
||||
|
||||
static const struct fw_address_region low_memory_region =
|
||||
{ .start = 0x000000000000ULL, .end = 0x000100000000ULL, };
|
||||
{ .start = 0x000000000000ULL, .end = FW_MAX_PHYSICAL_RANGE, };
|
||||
|
||||
#if 0
|
||||
const struct fw_address_region fw_private_region =
|
||||
@ -1217,7 +1217,7 @@ static void handle_low_memory(struct fw_card *card, struct fw_request *request,
|
||||
}
|
||||
|
||||
static struct fw_address_handler low_memory = {
|
||||
.length = 0x000100000000ULL,
|
||||
.length = FW_MAX_PHYSICAL_RANGE,
|
||||
.address_callback = handle_low_memory,
|
||||
};
|
||||
|
||||
|
@ -237,6 +237,9 @@ static inline bool is_next_generation(int new_generation, int old_generation)
|
||||
|
||||
#define LOCAL_BUS 0xffc0
|
||||
|
||||
/* arbitrarily chosen maximum range for physical DMA: 128 TB */
|
||||
#define FW_MAX_PHYSICAL_RANGE (128ULL << 40)
|
||||
|
||||
void fw_core_handle_request(struct fw_card *card, struct fw_packet *request);
|
||||
void fw_core_handle_response(struct fw_card *card, struct fw_packet *packet);
|
||||
int fw_get_response_length(struct fw_request *request);
|
||||
|
@ -370,6 +370,10 @@ MODULE_PARM_DESC(debug, "Verbose logging (default = 0"
|
||||
", busReset events = " __stringify(OHCI_PARAM_DEBUG_BUSRESETS)
|
||||
", or a combination, or all = -1)");
|
||||
|
||||
static bool param_remote_dma;
|
||||
module_param_named(remote_dma, param_remote_dma, bool, 0444);
|
||||
MODULE_PARM_DESC(remote_dma, "Enable unfiltered remote DMA (default = N)");
|
||||
|
||||
static void log_irqs(struct fw_ohci *ohci, u32 evt)
|
||||
{
|
||||
if (likely(!(param_debug &
|
||||
@ -2050,10 +2054,10 @@ static void bus_reset_work(struct work_struct *work)
|
||||
be32_to_cpu(ohci->next_header));
|
||||
}
|
||||
|
||||
#ifdef CONFIG_FIREWIRE_OHCI_REMOTE_DMA
|
||||
reg_write(ohci, OHCI1394_PhyReqFilterHiSet, ~0);
|
||||
reg_write(ohci, OHCI1394_PhyReqFilterLoSet, ~0);
|
||||
#endif
|
||||
if (param_remote_dma) {
|
||||
reg_write(ohci, OHCI1394_PhyReqFilterHiSet, ~0);
|
||||
reg_write(ohci, OHCI1394_PhyReqFilterLoSet, ~0);
|
||||
}
|
||||
|
||||
spin_unlock_irq(&ohci->lock);
|
||||
|
||||
@ -2363,7 +2367,7 @@ static int ohci_enable(struct fw_card *card,
|
||||
reg_write(ohci, OHCI1394_FairnessControl, 0);
|
||||
card->priority_budget_implemented = ohci->pri_req_max != 0;
|
||||
|
||||
reg_write(ohci, OHCI1394_PhyUpperBound, 0x00010000);
|
||||
reg_write(ohci, OHCI1394_PhyUpperBound, FW_MAX_PHYSICAL_RANGE >> 16);
|
||||
reg_write(ohci, OHCI1394_IntEventClear, ~0);
|
||||
reg_write(ohci, OHCI1394_IntMaskClear, ~0);
|
||||
|
||||
@ -2587,13 +2591,13 @@ static int ohci_cancel_packet(struct fw_card *card, struct fw_packet *packet)
|
||||
static int ohci_enable_phys_dma(struct fw_card *card,
|
||||
int node_id, int generation)
|
||||
{
|
||||
#ifdef CONFIG_FIREWIRE_OHCI_REMOTE_DMA
|
||||
return 0;
|
||||
#else
|
||||
struct fw_ohci *ohci = fw_ohci(card);
|
||||
unsigned long flags;
|
||||
int n, ret = 0;
|
||||
|
||||
if (param_remote_dma)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* FIXME: Make sure this bitmask is cleared when we clear the busReset
|
||||
* interrupt bit. Clear physReqResourceAllBuses on bus reset.
|
||||
@ -2622,7 +2626,6 @@ static int ohci_enable_phys_dma(struct fw_card *card,
|
||||
spin_unlock_irqrestore(&ohci->lock, flags);
|
||||
|
||||
return ret;
|
||||
#endif /* CONFIG_FIREWIRE_OHCI_REMOTE_DMA */
|
||||
}
|
||||
|
||||
static u32 ohci_read_csr(struct fw_card *card, int csr_offset)
|
||||
@ -3720,9 +3723,11 @@ static int pci_probe(struct pci_dev *dev,
|
||||
version = reg_read(ohci, OHCI1394_Version) & 0x00ff00ff;
|
||||
ohci_notice(ohci,
|
||||
"added OHCI v%x.%x device as card %d, "
|
||||
"%d IR + %d IT contexts, quirks 0x%x\n",
|
||||
"%d IR + %d IT contexts, quirks 0x%x%s\n",
|
||||
version >> 16, version & 0xff, ohci->card.index,
|
||||
ohci->n_ir, ohci->n_it, ohci->quirks);
|
||||
ohci->n_ir, ohci->n_it, ohci->quirks,
|
||||
reg_read(ohci, OHCI1394_PhyUpperBound) ?
|
||||
", >4 GB phys DMA" : "");
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -1556,17 +1556,6 @@ config PROVIDE_OHCI1394_DMA_INIT
|
||||
|
||||
See Documentation/debugging-via-ohci1394.txt for more information.
|
||||
|
||||
config FIREWIRE_OHCI_REMOTE_DMA
|
||||
bool "Remote debugging over FireWire with firewire-ohci"
|
||||
depends on FIREWIRE_OHCI
|
||||
help
|
||||
This option lets you use the FireWire bus for remote debugging
|
||||
with help of the firewire-ohci driver. It enables unfiltered
|
||||
remote DMA in firewire-ohci.
|
||||
See Documentation/debugging-via-ohci1394.txt for more information.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config BUILD_DOCSRC
|
||||
bool "Build targets in Documentation/ tree"
|
||||
depends on HEADERS_CHECK
|
||||
|
Loading…
Reference in New Issue
Block a user