[PATCH 1/3] ntb: Add asynchronous devices support to NTB-bus interface
Currently supported AMD and Intel Non-transparent PCIe-bridges are synchronous devices, so translated base address of memory windows can be direcly written to peer registers. But there are some IDT PCIe-switches which implement complex interfaces using Lookup Tables of translation addresses. Due to the way the table is accessed, it can not be done synchronously from different RCs, that's why the asynchronous interface should be developed. For these purpose the Memory Window related interface is correspondingly split as it is for Doorbell and Scratchpad registers. The definition of Memory Window is following: "It is a virtual memory region, which locally reflects a physical memory of peer device." So to speak the "ntb_peer_mw_"-prefixed methods control the peers memory windows, "ntb_mw_"-prefixed functions work with the local memory windows. Here is the description of the Memory Window related NTB-bus callback functions: - ntb_mw_count() - number of local memory windows. - ntb_mw_get_maprsc() - get the physical address and size of the local memory window to map. - ntb_mw_set_trans() - set translation address of local memory window (this address should be somehow retrieved from a peer). - ntb_mw_get_trans() - get translation address of local memory window. - ntb_mw_get_align() - get alignment of translated base address and size of local memory window. Additionally one can get the upper size limit of the memory window. - ntb_peer_mw_count() - number of peer memory windows (it can differ from the local number). - ntb_peer_mw_set_trans() - set translation address of peer memory window - ntb_peer_mw_get_trans() - get translation address of peer memory window - ntb_peer_mw_get_align() - get alignment of translated base address and size of peer memory window.Additionally one can get the upper size limit of the memory window. As one can see current AMD and Intel NTB drivers mostly implement the "ntb_peer_mw_"-prefixed methods. So this patch correspondingly renames the driver functions. IDT NTB driver mostly expose "ntb_nw_"-prefixed methods, since it doesn't have convenient access to the peer Lookup Table. In order to pass information from one RC to another NTB functions of IDT PCIe-switch implement Messaging subsystem. They currently support four message registers to transfer DWORD sized data to a specified peer. So there are two new callback methods are introduced: - ntb_msg_size() - get the number of DWORDs supported by NTB function to send and receive messages - ntb_msg_post() - send message of size retrieved from ntb_msg_size() to a peer Additionally there is a new event function: - ntb_msg_event() - it is invoked when either a new message was retrieved (NTB_MSG_NEW), or last message was successfully sent (NTB_MSG_SENT), or the last message failed to be sent (NTB_MSG_FAIL). The last change concerns the IDs (practically names) of NTB-devices on the NTB-bus. It is not good to have the devices with same names in the system and it brakes my IDT NTB driver from being loaded =) So I developed a simple algorithm of NTB devices naming. Particulary it generates names "ntbS{N}" for synchronous devices, "ntbA{N}" for asynchronous devices, and "ntbAS{N}" for devices supporting both interfaces. Signed-off-by: Serge Semin--- drivers/ntb/Kconfig | 4 +- drivers/ntb/hw/amd/ntb_hw_amd.c | 49 ++- drivers/ntb/hw/intel/ntb_hw_intel.c | 59 +++- drivers/ntb/ntb.c | 86 +- drivers/ntb/ntb_transport.c | 19 +- drivers/ntb/test/ntb_perf.c | 16 +- drivers/ntb/test/ntb_pingpong.c | 5 + drivers/ntb/test/ntb_tool.c | 25 +- include/linux/ntb.h | 600 +--- 9 files changed, 701 insertions(+), 162 deletions(-) diff --git a/drivers/ntb/Kconfig b/drivers/ntb/Kconfig index 95944e5..67d80c4 100644 --- a/drivers/ntb/Kconfig +++ b/drivers/ntb/Kconfig @@ -14,8 +14,6 @@ if NTB source "drivers/ntb/hw/Kconfig" -source "drivers/ntb/test/Kconfig" - config NTB_TRANSPORT tristate "NTB Transport Client" help @@ -25,4 +23,6 @@ config NTB_TRANSPORT If unsure, say N. +source "drivers/ntb/test/Kconfig" + endif # NTB diff --git a/drivers/ntb/hw/amd/ntb_hw_amd.c b/drivers/ntb/hw/amd/ntb_hw_amd.c index 6ccba0d..ab6f353 100644 --- a/drivers/ntb/hw/amd/ntb_hw_amd.c +++ b/drivers/ntb/hw/amd/ntb_hw_amd.c @@ -55,6 +55,7 @@ #include #include #include +#include #include #include "ntb_hw_amd.h" @@ -84,11 +85,8 @@ static int amd_ntb_mw_count(struct ntb_dev *ntb) return ntb_ndev(ntb)->mw_count; } -static int amd_ntb_mw_get_range(struct ntb_dev *ntb, int idx, -
[PATCH 1/3] ntb: Add asynchronous devices support to NTB-bus interface
Currently supported AMD and Intel Non-transparent PCIe-bridges are synchronous devices, so translated base address of memory windows can be direcly written to peer registers. But there are some IDT PCIe-switches which implement complex interfaces using Lookup Tables of translation addresses. Due to the way the table is accessed, it can not be done synchronously from different RCs, that's why the asynchronous interface should be developed. For these purpose the Memory Window related interface is correspondingly split as it is for Doorbell and Scratchpad registers. The definition of Memory Window is following: "It is a virtual memory region, which locally reflects a physical memory of peer device." So to speak the "ntb_peer_mw_"-prefixed methods control the peers memory windows, "ntb_mw_"-prefixed functions work with the local memory windows. Here is the description of the Memory Window related NTB-bus callback functions: - ntb_mw_count() - number of local memory windows. - ntb_mw_get_maprsc() - get the physical address and size of the local memory window to map. - ntb_mw_set_trans() - set translation address of local memory window (this address should be somehow retrieved from a peer). - ntb_mw_get_trans() - get translation address of local memory window. - ntb_mw_get_align() - get alignment of translated base address and size of local memory window. Additionally one can get the upper size limit of the memory window. - ntb_peer_mw_count() - number of peer memory windows (it can differ from the local number). - ntb_peer_mw_set_trans() - set translation address of peer memory window - ntb_peer_mw_get_trans() - get translation address of peer memory window - ntb_peer_mw_get_align() - get alignment of translated base address and size of peer memory window.Additionally one can get the upper size limit of the memory window. As one can see current AMD and Intel NTB drivers mostly implement the "ntb_peer_mw_"-prefixed methods. So this patch correspondingly renames the driver functions. IDT NTB driver mostly expose "ntb_nw_"-prefixed methods, since it doesn't have convenient access to the peer Lookup Table. In order to pass information from one RC to another NTB functions of IDT PCIe-switch implement Messaging subsystem. They currently support four message registers to transfer DWORD sized data to a specified peer. So there are two new callback methods are introduced: - ntb_msg_size() - get the number of DWORDs supported by NTB function to send and receive messages - ntb_msg_post() - send message of size retrieved from ntb_msg_size() to a peer Additionally there is a new event function: - ntb_msg_event() - it is invoked when either a new message was retrieved (NTB_MSG_NEW), or last message was successfully sent (NTB_MSG_SENT), or the last message failed to be sent (NTB_MSG_FAIL). The last change concerns the IDs (practically names) of NTB-devices on the NTB-bus. It is not good to have the devices with same names in the system and it brakes my IDT NTB driver from being loaded =) So I developed a simple algorithm of NTB devices naming. Particulary it generates names "ntbS{N}" for synchronous devices, "ntbA{N}" for asynchronous devices, and "ntbAS{N}" for devices supporting both interfaces. Signed-off-by: Serge Semin --- drivers/ntb/Kconfig | 4 +- drivers/ntb/hw/amd/ntb_hw_amd.c | 49 ++- drivers/ntb/hw/intel/ntb_hw_intel.c | 59 +++- drivers/ntb/ntb.c | 86 +- drivers/ntb/ntb_transport.c | 19 +- drivers/ntb/test/ntb_perf.c | 16 +- drivers/ntb/test/ntb_pingpong.c | 5 + drivers/ntb/test/ntb_tool.c | 25 +- include/linux/ntb.h | 600 +--- 9 files changed, 701 insertions(+), 162 deletions(-) diff --git a/drivers/ntb/Kconfig b/drivers/ntb/Kconfig index 95944e5..67d80c4 100644 --- a/drivers/ntb/Kconfig +++ b/drivers/ntb/Kconfig @@ -14,8 +14,6 @@ if NTB source "drivers/ntb/hw/Kconfig" -source "drivers/ntb/test/Kconfig" - config NTB_TRANSPORT tristate "NTB Transport Client" help @@ -25,4 +23,6 @@ config NTB_TRANSPORT If unsure, say N. +source "drivers/ntb/test/Kconfig" + endif # NTB diff --git a/drivers/ntb/hw/amd/ntb_hw_amd.c b/drivers/ntb/hw/amd/ntb_hw_amd.c index 6ccba0d..ab6f353 100644 --- a/drivers/ntb/hw/amd/ntb_hw_amd.c +++ b/drivers/ntb/hw/amd/ntb_hw_amd.c @@ -55,6 +55,7 @@ #include #include #include +#include #include #include "ntb_hw_amd.h" @@ -84,11 +85,8 @@ static int amd_ntb_mw_count(struct ntb_dev *ntb) return ntb_ndev(ntb)->mw_count; } -static int amd_ntb_mw_get_range(struct ntb_dev *ntb, int idx, -