NTB: add support for hotplug feature
authorXiangliang Yu <Xiangliang.Yu@amd.com>
Fri, 18 Nov 2016 09:21:41 +0000 (14:51 +0530)
committerJon Mason <jdmason@kudzu.us>
Fri, 23 Dec 2016 21:09:15 +0000 (16:09 -0500)
AMD NTB support hotplug under B2B mode. NTB will trigger link
up/down interrupt event when doing plug add/remove, this patch
implements the two interrupt event to support B2B hotplug function.

Signed-off-by: Xiangliang Yu <Xiangliang.Yu@amd.com>
Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
Acked-by: Allen Hubbe <Allen.Hubbe@dell.com>
Signed-off-by: Jon Mason <jdmason@kudzu.us>
drivers/ntb/hw/amd/ntb_hw_amd.c
drivers/ntb/hw/amd/ntb_hw_amd.h

index 6ccba0d..b33f13b 100644 (file)
@@ -199,6 +199,11 @@ static int amd_link_is_up(struct amd_ntb_dev *ndev)
        if (!ndev->peer_sta)
                return NTB_LNK_STA_ACTIVE(ndev->cntl_sta);
 
+       if (ndev->peer_sta & AMD_LINK_UP_EVENT) {
+               ndev->peer_sta = 0;
+               return 1;
+       }
+
        /* If peer_sta is reset or D0 event, the ISR has
         * started a timer to check link status of hardware.
         * So here just clear status bit. And if peer_sta is
@@ -207,7 +212,7 @@ static int amd_link_is_up(struct amd_ntb_dev *ndev)
         */
        if (ndev->peer_sta & AMD_PEER_RESET_EVENT)
                ndev->peer_sta &= ~AMD_PEER_RESET_EVENT;
-       else if (ndev->peer_sta & AMD_PEER_D0_EVENT)
+       else if (ndev->peer_sta & (AMD_PEER_D0_EVENT | AMD_LINK_DOWN_EVENT))
                ndev->peer_sta = 0;
 
        return 0;
@@ -491,6 +496,8 @@ static void amd_handle_event(struct amd_ntb_dev *ndev, int vec)
                break;
        case AMD_PEER_D3_EVENT:
        case AMD_PEER_PMETO_EVENT:
+       case AMD_LINK_UP_EVENT:
+       case AMD_LINK_DOWN_EVENT:
                amd_ack_smu(ndev, status);
 
                /* link down */
index 2eac3cd..13d73ed 100644 (file)
@@ -148,9 +148,12 @@ enum {
        AMD_PEER_D3_EVENT       = BIT(2),
        AMD_PEER_PMETO_EVENT    = BIT(3),
        AMD_PEER_D0_EVENT       = BIT(4),
+       AMD_LINK_UP_EVENT       = BIT(5),
+       AMD_LINK_DOWN_EVENT     = BIT(6),
        AMD_EVENT_INTMASK       = (AMD_PEER_FLUSH_EVENT |
                                AMD_PEER_RESET_EVENT | AMD_PEER_D3_EVENT |
-                               AMD_PEER_PMETO_EVENT | AMD_PEER_D0_EVENT),
+                               AMD_PEER_PMETO_EVENT | AMD_PEER_D0_EVENT |
+                               AMD_LINK_UP_EVENT | AMD_LINK_DOWN_EVENT),
 
        AMD_PMESTAT_OFFSET      = 0x480,
        AMD_PMSGTRIG_OFFSET     = 0x490,