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,
|
Retrieving a full system memory dump is also possible over the FireWire,
|
||||||
using data transfer rates in the order of 10MB/s or more.
|
using data transfer rates in the order of 10MB/s or more.
|
||||||
|
|
||||||
Memory access is currently limited to the low 4G of physical address
|
With most FireWire controllers, memory access is limited to the low 4 GB
|
||||||
space which can be a problem on IA64 machines where memory is located
|
of physical address space. This can be a problem on IA64 machines where
|
||||||
mostly above that limit, but it is rarely a problem on more common
|
memory is located mostly above that limit, but it is rarely a problem on
|
||||||
hardware such as hardware based on x86, x86-64 and PowerPC.
|
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,
|
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
|
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
|
Drivers
|
||||||
-------
|
-------
|
||||||
|
|
||||||
The ohci1394 driver in drivers/ieee1394 initializes the OHCI-1394 controllers
|
The firewire-ohci driver in drivers/firewire uses filtered physical
|
||||||
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
|
|
||||||
DMA by default, which is more secure but not suitable for remote debugging.
|
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:
|
Pass the remote_dma=1 parameter to the driver to get unfiltered physical DMA.
|
||||||
Remote debugging over FireWire with firewire-ohci) 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
|
completed, an initialization routine which runs pretty early has been
|
||||||
implemented for x86. This routine runs long before console_init() can be
|
implemented for x86. This routine runs long before console_init() can be
|
||||||
called, i.e. before the printk buffer appears on the console.
|
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
|
Bernhard Kaindl enhanced firescope to support accessing 64-bit machines
|
||||||
from 32-bit firescope and vice versa:
|
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):
|
and he implemented fast system dump (alpha version - read README.txt):
|
||||||
- http://halobates.de/firewire/firedump-0.1.tar.bz2
|
- 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:
|
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
|
You should see a line similar to
|
||||||
|
|
||||||
ohci1394: fw-host0: OHCI-1394 1.1 (PCI): IRQ=[18] MMIO=[fe9ff800-fe9fffff]
|
firewire_ohci 0000:15:00.1: added OHCI v1.0 device as card 2, 4 IR + 4 IT
|
||||||
... Max Packet=[2048] IR/IT contexts=[4/8]
|
... contexts, quirks 0x11
|
||||||
|
|
||||||
when loading the driver. If you have no supported controller, many PCI,
|
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
|
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-
|
compliant, they are based on TI PCILynx chips and require drivers for Win-
|
||||||
dows operating systems.
|
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:
|
2) Establish a working FireWire cable connection:
|
||||||
|
|
||||||
Any FireWire cable, as long at it provides electrically and mechanically
|
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
|
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
|
on both machines in the kernel log when the cable is plugged in
|
||||||
and connects the two machines.
|
and connects the two machines.
|
||||||
|
|
||||||
3) Test physical DMA using firescope:
|
3) Test physical DMA using firescope:
|
||||||
|
|
||||||
On the debug host,
|
On the debug host, make sure that /dev/fw* is accessible,
|
||||||
- load the raw1394 module,
|
|
||||||
- make sure that /dev/raw1394 is accessible,
|
|
||||||
then start firescope:
|
then start firescope:
|
||||||
|
|
||||||
$ firescope
|
$ firescope
|
||||||
Port 0 (ohci1394) opened, 2 nodes detected
|
Port 0 (/dev/fw1) opened, 2 nodes detected
|
||||||
|
|
||||||
FireScope
|
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
|
kernel messages using the serial console. This may provide you with some
|
||||||
information about the reasons of the suspend (resume) failure. Alternatively,
|
information about the reasons of the suspend (resume) failure. Alternatively,
|
||||||
it may be possible to use a FireWire port for debugging with firescope
|
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 .
|
use the PM_TRACE mechanism documented in Documentation/power/s2ram.txt .
|
||||||
|
|
||||||
2. Testing suspend to RAM (STR)
|
2. Testing suspend to RAM (STR)
|
||||||
|
@ -523,11 +523,11 @@ static DEFINE_SPINLOCK(address_handler_list_lock);
|
|||||||
static LIST_HEAD(address_handler_list);
|
static LIST_HEAD(address_handler_list);
|
||||||
|
|
||||||
const struct fw_address_region fw_high_memory_region =
|
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);
|
EXPORT_SYMBOL(fw_high_memory_region);
|
||||||
|
|
||||||
static const struct fw_address_region low_memory_region =
|
static const struct fw_address_region low_memory_region =
|
||||||
{ .start = 0x000000000000ULL, .end = 0x000100000000ULL, };
|
{ .start = 0x000000000000ULL, .end = FW_MAX_PHYSICAL_RANGE, };
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
const struct fw_address_region fw_private_region =
|
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 = {
|
static struct fw_address_handler low_memory = {
|
||||||
.length = 0x000100000000ULL,
|
.length = FW_MAX_PHYSICAL_RANGE,
|
||||||
.address_callback = handle_low_memory,
|
.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
|
#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_request(struct fw_card *card, struct fw_packet *request);
|
||||||
void fw_core_handle_response(struct fw_card *card, struct fw_packet *packet);
|
void fw_core_handle_response(struct fw_card *card, struct fw_packet *packet);
|
||||||
int fw_get_response_length(struct fw_request *request);
|
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)
|
", busReset events = " __stringify(OHCI_PARAM_DEBUG_BUSRESETS)
|
||||||
", or a combination, or all = -1)");
|
", 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)
|
static void log_irqs(struct fw_ohci *ohci, u32 evt)
|
||||||
{
|
{
|
||||||
if (likely(!(param_debug &
|
if (likely(!(param_debug &
|
||||||
@ -2050,10 +2054,10 @@ static void bus_reset_work(struct work_struct *work)
|
|||||||
be32_to_cpu(ohci->next_header));
|
be32_to_cpu(ohci->next_header));
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_FIREWIRE_OHCI_REMOTE_DMA
|
if (param_remote_dma) {
|
||||||
reg_write(ohci, OHCI1394_PhyReqFilterHiSet, ~0);
|
reg_write(ohci, OHCI1394_PhyReqFilterHiSet, ~0);
|
||||||
reg_write(ohci, OHCI1394_PhyReqFilterLoSet, ~0);
|
reg_write(ohci, OHCI1394_PhyReqFilterLoSet, ~0);
|
||||||
#endif
|
}
|
||||||
|
|
||||||
spin_unlock_irq(&ohci->lock);
|
spin_unlock_irq(&ohci->lock);
|
||||||
|
|
||||||
@ -2363,7 +2367,7 @@ static int ohci_enable(struct fw_card *card,
|
|||||||
reg_write(ohci, OHCI1394_FairnessControl, 0);
|
reg_write(ohci, OHCI1394_FairnessControl, 0);
|
||||||
card->priority_budget_implemented = ohci->pri_req_max != 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_IntEventClear, ~0);
|
||||||
reg_write(ohci, OHCI1394_IntMaskClear, ~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,
|
static int ohci_enable_phys_dma(struct fw_card *card,
|
||||||
int node_id, int generation)
|
int node_id, int generation)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_FIREWIRE_OHCI_REMOTE_DMA
|
|
||||||
return 0;
|
|
||||||
#else
|
|
||||||
struct fw_ohci *ohci = fw_ohci(card);
|
struct fw_ohci *ohci = fw_ohci(card);
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int n, ret = 0;
|
int n, ret = 0;
|
||||||
|
|
||||||
|
if (param_remote_dma)
|
||||||
|
return 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FIXME: Make sure this bitmask is cleared when we clear the busReset
|
* FIXME: Make sure this bitmask is cleared when we clear the busReset
|
||||||
* interrupt bit. Clear physReqResourceAllBuses on bus reset.
|
* 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);
|
spin_unlock_irqrestore(&ohci->lock, flags);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
#endif /* CONFIG_FIREWIRE_OHCI_REMOTE_DMA */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static u32 ohci_read_csr(struct fw_card *card, int csr_offset)
|
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;
|
version = reg_read(ohci, OHCI1394_Version) & 0x00ff00ff;
|
||||||
ohci_notice(ohci,
|
ohci_notice(ohci,
|
||||||
"added OHCI v%x.%x device as card %d, "
|
"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,
|
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;
|
return 0;
|
||||||
|
|
||||||
|
@ -1556,17 +1556,6 @@ config PROVIDE_OHCI1394_DMA_INIT
|
|||||||
|
|
||||||
See Documentation/debugging-via-ohci1394.txt for more information.
|
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
|
config BUILD_DOCSRC
|
||||||
bool "Build targets in Documentation/ tree"
|
bool "Build targets in Documentation/ tree"
|
||||||
depends on HEADERS_CHECK
|
depends on HEADERS_CHECK
|
||||||
|
Loading…
Reference in New Issue
Block a user