Commit fcd46b34425da52703fe65b7f08850c509dcb0ed

Authored by Stefan Richter
1 parent 8bc588e0e5

firewire: Enable remote DMA above 4 GB

This makes all of a machine's memory accessible to remote debugging via
FireWire, using the physical response unit (i.e. RDMA) of OHCI-1394 link
layer controllers.

This requires actual support by the controller.  The only ones currently
known to support it are Agere/LSI FW643.  Most if not all other OHCI-1394
controllers do not implement the optional Physical Upper Bound register.
With them, RDMA will continue to be limited to the lowermost 4 GB.

firewire-ohci's startup message in the kernel log is augmented to tell
whether the controller does expose more than 4 GB to RDMA.

While OHCI-1394 allows for a maximum Physical Upper Bound of
0xffff'0000'0000 (near 256 TB), this implementation sets it to
0x8000'0000'0000 (128 TB) in order to avoid interference with applications
that require interrupt-served asynchronous request reception at
respectively low addresses.

Note, this change does not switch remote DMA on.  It only increases the
range of remote access to all memory (instead of just 4 GB) whenever
remote DMA was switched on by other means.  The latter is achieved by
setting firewire-ohci's remote_dma parameter, or if the physical DMA
filter is opened through firewire-sbp2.

Derived from patch "firewire: Enable physical DMA above 4GB" by
Peter Hurley <peter@hurleysoftware.com> from March 27, 2013.

Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>

Showing 4 changed files with 20 additions and 10 deletions Side-by-side Diff

Documentation/debugging-via-ohci1394.txt
... ... @@ -22,10 +22,12 @@
22 22 Retrieving a full system memory dump is also possible over the FireWire,
23 23 using data transfer rates in the order of 10MB/s or more.
24 24  
25   -Memory access is currently limited to the low 4G of physical address
26   -space which can be a problem on IA64 machines where memory is located
27   -mostly above that limit, but it is rarely a problem on more common
28   -hardware such as hardware based on x86, x86-64 and PowerPC.
  25 +With most FireWire controllers, memory access is limited to the low 4 GB
  26 +of physical address space. This can be a problem on IA64 machines where
  27 +memory is located mostly above that limit, but it is rarely a problem on
  28 +more common hardware such as x86, x86-64 and PowerPC. However, at least
  29 +Agere/LSI FW643e and FW643e2 controllers are known to support access to
  30 +physical addresses above 4 GB.
29 31  
30 32 Together with a early initialization of the OHCI-1394 controller for debugging,
31 33 this facility proved most useful for examining long debugs logs in the printk
... ... @@ -98,6 +100,9 @@
98 100 systems, it most likely is. Only specialized shops have cards which are not
99 101 compliant, they are based on TI PCILynx chips and require drivers for Win-
100 102 dows operating systems.
  103 +
  104 + The mentioned kernel log message contains ">4 GB phys DMA" in case of
  105 + OHCI-1394 controllers which support accesses above this limit.
101 106  
102 107 2) Establish a working FireWire cable connection:
103 108  
drivers/firewire/core-transaction.c
... ... @@ -523,11 +523,11 @@
523 523 static LIST_HEAD(address_handler_list);
524 524  
525 525 const struct fw_address_region fw_high_memory_region =
526   - { .start = 0x000100000000ULL, .end = 0xffffe0000000ULL, };
  526 + { .start = FW_MAX_PHYSICAL_RANGE, .end = 0xffffe0000000ULL, };
527 527 EXPORT_SYMBOL(fw_high_memory_region);
528 528  
529 529 static const struct fw_address_region low_memory_region =
530   - { .start = 0x000000000000ULL, .end = 0x000100000000ULL, };
  530 + { .start = 0x000000000000ULL, .end = FW_MAX_PHYSICAL_RANGE, };
531 531  
532 532 #if 0
533 533 const struct fw_address_region fw_private_region =
... ... @@ -1217,7 +1217,7 @@
1217 1217 }
1218 1218  
1219 1219 static struct fw_address_handler low_memory = {
1220   - .length = 0x000100000000ULL,
  1220 + .length = FW_MAX_PHYSICAL_RANGE,
1221 1221 .address_callback = handle_low_memory,
1222 1222 };
1223 1223  
drivers/firewire/core.h
... ... @@ -237,6 +237,9 @@
237 237  
238 238 #define LOCAL_BUS 0xffc0
239 239  
  240 +/* arbitrarily chosen maximum range for physical DMA: 128 TB */
  241 +#define FW_MAX_PHYSICAL_RANGE (128ULL << 40)
  242 +
240 243 void fw_core_handle_request(struct fw_card *card, struct fw_packet *request);
241 244 void fw_core_handle_response(struct fw_card *card, struct fw_packet *packet);
242 245 int fw_get_response_length(struct fw_request *request);
drivers/firewire/ohci.c
... ... @@ -2367,7 +2367,7 @@
2367 2367 reg_write(ohci, OHCI1394_FairnessControl, 0);
2368 2368 card->priority_budget_implemented = ohci->pri_req_max != 0;
2369 2369  
2370   - reg_write(ohci, OHCI1394_PhyUpperBound, 0x00010000);
  2370 + reg_write(ohci, OHCI1394_PhyUpperBound, FW_MAX_PHYSICAL_RANGE >> 16);
2371 2371 reg_write(ohci, OHCI1394_IntEventClear, ~0);
2372 2372 reg_write(ohci, OHCI1394_IntMaskClear, ~0);
2373 2373  
2374 2374  
... ... @@ -3723,9 +3723,11 @@
3723 3723 version = reg_read(ohci, OHCI1394_Version) & 0x00ff00ff;
3724 3724 ohci_notice(ohci,
3725 3725 "added OHCI v%x.%x device as card %d, "
3726   - "%d IR + %d IT contexts, quirks 0x%x\n",
  3726 + "%d IR + %d IT contexts, quirks 0x%x%s\n",
3727 3727 version >> 16, version & 0xff, ohci->card.index,
3728   - ohci->n_ir, ohci->n_it, ohci->quirks);
  3728 + ohci->n_ir, ohci->n_it, ohci->quirks,
  3729 + reg_read(ohci, OHCI1394_PhyUpperBound) ?
  3730 + ", >4 GB phys DMA" : "");
3729 3731  
3730 3732 return 0;
3731 3733