From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S964925AbbLWIo4 (ORCPT ); Wed, 23 Dec 2015 03:44:56 -0500 Received: from mail-bn1on0078.outbound.protection.outlook.com ([157.56.110.78]:54166 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S964894AbbLWIou (ORCPT ); Wed, 23 Dec 2015 03:44:50 -0500 Authentication-Results: spf=none (sender IP is 165.204.84.221) smtp.mailfrom=amd.com; emc.com; dkim=none (message not signed) header.d=none;emc.com; dmarc=permerror action=none header.from=amd.com; X-WSS-ID: 0NZSYYL-07-29B-02 X-M-MSG: From: Xiangliang Yu To: , , , , CC: , Xiangliang Yu Subject: [PATCH V2 3/3] NTB: Add flush_req and wakeup interface Date: Wed, 23 Dec 2015 21:43:24 +0800 Message-ID: <1450878204-9383-1-git-send-email-Xiangliang.Yu@amd.com> X-Mailer: git-send-email 1.9.1 MIME-Version: 1.0 Content-Type: text/plain X-EOPAttributedMessage: 0 X-Forefront-Antispam-Report: CIP:165.204.84.221;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(2980300002)(428002)(189002)(199003)(5003600100002)(77096005)(92566002)(189998001)(5008740100001)(19580405001)(5001770100001)(106466001)(50986999)(47776003)(50466002)(11100500001)(97736004)(48376002)(50226001)(5003940100001)(101416001)(86362001)(2201001)(87936001)(586003)(1220700001)(1096002)(53416004)(36756003)(19580395003)(105586002)(229853001)(7059030)(2101003);DIR:OUT;SFP:1101;SCL:1;SRVR:CY1PR12MB0855;H:atltwp01.amd.com;FPR:;SPF:None;PTR:InfoDomainNonexistent;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;CY1PR12MB0855;2:GT+wvv9jV3fBnnmj5RGRDTwIsyrcjW4ru6+qDQA1Pms7NYr6NQB2LjP6QlqskH15UKe0myTOBPEhatOctYolfVJugbOASYomvxLgX3n6HNMNdLqT6iCTzy5gB03r9i/aBPiju06gHNjNDuC6aqgggg==;3:BwvbPyN2Jmln2hugX3DkHIoWmJULmasOEX2lw9HxBvTqwA9zSiDrV0peJVC3h7CI6O0cfPmmKJ0lw0Hfk4p1+WGBbXBZSAs7MIaS4PU7aYXfjjKAJOCKthvhbf7PsNRY5+jWiOS4w/bsVcrrAsXacvl702NBnFflkp6iRu8i/cKcuviBi99JHLumj52xPuI76qY4X10fBRv/9j+jdJI0DgXCQscjecjvGd7VEItepiw=;25:2CeK9o1mgIgY8aL5QCTSB2ZJk4U5NDiejbMtYVrWGih4wRXiAj+D7dVopoiYJSCRwa5lEAfqQSxxym5yls6CBGDthqllZzMNxm7MLugR7FoW4ndGusaIK8goSxg+MKSKVKj+JTkMoKOfBxi8DmM7Q3UXidODNgkZ/Qg/sP6JCjO2+CBR8MKZvGfz2UbxwJNZ605bYrxmlD/Ef29Sg7qaKKDuUedHQYA1QX8d+TDU/Kn2aIpeOc1eDQTnTt4LHplT6kK2SbtQaruwYL0hkv2NzA== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR12MB0855; X-Microsoft-Exchange-Diagnostics: 1;CY1PR12MB0855;20:c322rQ45ztRNgzGmYJt9aJR9zoUzHbDQsK/p2DU0LNzJAPqybuZXHaLmxuypjGMibv37wvvxjiUgvme8hpV88AypCZEeSoNP9JnkTop+ddsdc0smebCwxa9VNcFYtEt90UC9V1XizVpbdNlE0sNLGtaUbWiE7/QHh9DOOP+yj6LZJddVpDn0qY1QwIZiYWAdcSEFUmtBPtDTwz85UorQKKkblSJQJF4Dv1/i8r48JJC37rekC3ORP3CrMjPIpmZtHFI55/vE7DcG7lwm9Hxv1Jx0JvR5xHsY+eQHirG33c2bIakRKg+6LqdCAa9dT+m9b88IFtGI2+/aog+X4Y0kCBnRTHXJrR/GA71hYBzqPnde183jIk/3mplhBfuZ853JQ8ZwG/y/mqCuzPGX/dAZTFFZ4FKykHiXHCMvHkPLTbH2PZspZJspHfTANzYsW6UY9gzl2mFN5/cfV3e5z4CCb11XIKA4TxLKU/MJxB+CbVYJTuzMa59TC34F0rrymCh+;4:bWRJt71/T6tMdjG0ZL5/ixKrpgxgczYyJ/bkbJ9c+i1WWK/ADFYGYk+9dsHG3tTkh14dlx7vs9NHkc77jmqYo/zFQatw6/CVO6KHuyNuBcsSEWgswxaFIAEV8RI4MXblL2MdO/LcxmTfS1g9mV1i9CIfKXuxmk1ScsrnF9uDlYZbPFCE/ajwIoXXPKIUlijkIBrOWPY7XDRYfF2BkypwfLBRihkkFVks8etb/RrNaTMtTP6dXpKKUxqoCqzM7fGxDlRYUTPuWkpEhWO9nVZrOfHerpcE5LvVdxhOc3l+JlaVUGLgYUBNkDZA0qorBLu57Oj9tD7KUW+Vsfmu84X4QzgjlLzfBBFlB5dRo+mwR+8AntwqOVU8lgUdkWiJf0mVtvLODHkAr/mwNMHkA8RowRxAisd48X6QE0uWJJBiA0s= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(5005006)(520078)(8121501046)(10201501046)(3002001);SRVR:CY1PR12MB0855;BCL:0;PCL:0;RULEID:;SRVR:CY1PR12MB0855; X-Forefront-PRVS: 0799B1B2D7 X-Microsoft-Exchange-Diagnostics: 1;CY1PR12MB0855;23:nsHm1ljqozGTMSO0ERW3tnlv2x0vXC8G8I14mwlxlZoWMsAGdhgN7BdCjil1cXEHWwFqq7zygirFN3TtFhf572CH1ibnMpD8tZaLWGx+wM0NUAaJhWkf1Z61ComgreiSUK10sW86qXiNMLxTpzk2/Xby0rfG741MZEW5u/kwcxjCbJsQEubExr/AEesCpqk/pLj7zYa06hZ5c9HbFcDSvZ3BjSmjx2u1nxLyfXQLZZVe/38DTNL2el8yTTsulFKcGkE5RIJqXQeiT/hexVH31hhvRYmn4vpsQkqC2zQQHAb4rTVzk9U5tt68brWT1EfsFukSHeWroz8U3NrqMaqDAaeLJLIsK7ixty7Ub/EPHKv53yIsbWrqVnyROJ68yAAaRc2Zx+bUocSGqnNuE8zwx4yRXRYWfld6+C4wUOsWxM8SQX8QhKhXv8qvdE2kjiGrRgKZPOv4t3342RhuzdzwM3BHcm0kWke3fTdkVOq/UGK1vkb5tmsxQ4e3TsEGw9emKNPtQYT5FX/fnl2vXN0XPrvfokdPY00g4RXSSg/dnCNxqo7vvlhjfvanfUZ4OfgXgHt3XZzfwVPGBxG0iee4AyFYzCGHX88PPBNTLJwxWI99XFsPk4kM26dyoTJ7SUorwEMX2iB7MTYYXuJTzQO7Ou+AfZAzZmZl8LZFBnYejk95a2xs26X+gZMx+C+iDFv9GAawSsaL1PP+SntcfIUF2QRYLw1I82pJ9s7BIlIWvH8rKnyMAsD8yISkYQSnvnDkXIOyaruEWLLmprjMDW+GBTRz1etTWrJ2il13hNXh6M77cKLLO/seTwFdXpIU4DlAVnq1xfNfMHjsxezCCHCPoXsnf8FU4QYuR6UQD+P5+L0kIISf71dma1KZ3UeBLft9aY2ldkSn6BAzqu3pYAcMODbSNhM5zzoVV/P7cRW2YBoUS3VYtQU1AUpj8/AqzQzK X-Microsoft-Exchange-Diagnostics: 1;CY1PR12MB0855;5:aZWLYiQXp8lXQzFuXlW2bQdYULb3hVZf+F4D3IlC/MojJTJnNGapnHQBQAHlELa9Tk5MMcr02s+QA/1QI8wd/NPRz/BLR8j1Gin1Uut2VS0irvovMXi6B8Tg/XOnCXek4wzieoiKz34zLha7rl5zEQ==;24:xlxzWBPc46neTsShpqq71eVo3c+M+HUNoqT0soRCEMb+gT229dEHt2NCB5O/4Q6kdWMlk0Fub9aqZZ9z/MXqeESWSqfEjyFfu27T901kjS8=;20:mLNDb87A7yeSqKFqPQvdoLhD6qGZ5NpSAYevZn5UHEs5s21bdRVEKPInFQqBdRw9eP3vbS0XFNdR6RE8IdTUpgqbdd91ZbBtsP2cPOwUK+NL1QAEHj2ptdZZE/7kxcTDDkArkidME+G2i8nd//2YlSkOmqIWBofW7yh2+x95odIeJa7jGziPP2WoJ1VCDGYa4k6iV5AfUiF6XqLYITr3Cie1h/3qS1TjxMXoYVfyOQ94yqdzj+Th2p3L8bBQIeIa SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Dec 2015 08:44:46.3470 (UTC) X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.221];Helo=[atltwp01.amd.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR12MB0855 X-Microsoft-Exchange-Diagnostics: 1;CY1PR12MB0197;2:2oaosZkynWEL7CTCNKxp7OQlglNpf0mwdygOdDN3zHhuzHUd5WrMk/Ni5cEW4Je2Qu0qD70rVBqXCD5OoQWu3pszVh2nI2EmQwgbcSytmbqFqSuFbXWk602Xsq15Z0paKkB39WU4XwwNhihSEnmuyg==;23:/N0Zl3bPBnAinqpdzyMITeDjppgjGH4gSVKPs59UsGUkCXCxwlOC5/Y/FYif0DOdGb0H42eaf0X/QQdnqVFlY6ctt9zenjhdYpH4Rcv1NVk/yIwscmWIlCkM/0STmsTS142HqKFm9X2EwrN49WIrtezuyBMm0OoDNUlwRp8x2SZPICzfBfeTvx/4yOzvYgZ3 X-OriginatorOrg: amd.com Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org AMD NTB support two features: flush pending requests and wakeup opposite side from low power state. This patch add two interface to support these features. Signed-off-by: Xiangliang Yu --- drivers/ntb/hw/amd/ntb_hw_amd.c | 40 ++++++++++++++++++++++++++++++++++++++-- drivers/ntb/hw/amd/ntb_hw_amd.h | 2 ++ include/linux/ntb.h | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+), 2 deletions(-) diff --git a/drivers/ntb/hw/amd/ntb_hw_amd.c b/drivers/ntb/hw/amd/ntb_hw_amd.c index cedac8d..6ca0191 100644 --- a/drivers/ntb/hw/amd/ntb_hw_amd.c +++ b/drivers/ntb/hw/amd/ntb_hw_amd.c @@ -93,6 +93,8 @@ static const struct ntb_dev_ops amd_ntb_ops = { .peer_spad_addr = amd_ntb_peer_spad_addr, .peer_spad_read = amd_ntb_peer_spad_read, .peer_spad_write = amd_ntb_peer_spad_write, + .flush_req = amd_ntb_flush_req, + .peer_wakeup = amd_ntb_wakeup_peer_side, }; static int ndev_mw_to_bar(struct amd_ntb_dev *ndev, int idx) @@ -489,7 +491,6 @@ static void amd_ack_SMU(struct amd_ntb_dev *ndev, u32 bit) ndev->peer_sta |= bit; } -#ifdef CONFIG_PM /* * flush the requests to peer side */ @@ -513,7 +514,42 @@ static int amd_flush_peer_requests(struct amd_ntb_dev *ndev) return 0; } -#endif + +static int amd_ntb_flush_req(struct ntb_dev *ntb) +{ + struct amd_ntb_dev *ndev = ntb_ndev(ntb); + + return amd_flush_peer_requests(ndev); +} + +/* + * wake up the peer side + */ +static int amd_wakeup_peer_side(struct amd_ntb_dev *ndev) +{ + void __iomem *mmio = ndev->self_mmio; + u32 reg; + + if (!amd_link_is_up(ndev)) { + dev_warn(ndev_dev(ndev), "link is down.\n"); + return -EINVAL; + } + + reg = NTB_READ_REG(mmio, PMSGTRIG); + reg |= 0x1; + NTB_WRITE_REG(mmio, reg, PMSGTRIG); + + wait_for_completion(&ndev->wakeup_cmpl); + + return 0; +} + +static int amd_ntb_wakeup_peer_side(struct ntb_dev *ntb) +{ + struct amd_ntb_dev *ndev = ntb_ndev(ntb); + + return amd_wakeup_peer_side(ndev); +} static void amd_handle_event(struct amd_ntb_dev *ndev, int vec) { diff --git a/drivers/ntb/hw/amd/ntb_hw_amd.h b/drivers/ntb/hw/amd/ntb_hw_amd.h index 6005040..acf1d57 100644 --- a/drivers/ntb/hw/amd/ntb_hw_amd.h +++ b/drivers/ntb/hw/amd/ntb_hw_amd.h @@ -260,4 +260,6 @@ static int amd_ntb_peer_spad_addr(struct ntb_dev *ntb, int idx, phys_addr_t *spad_addr); static u32 amd_ntb_peer_spad_read(struct ntb_dev *ntb, int idx); static int amd_ntb_peer_spad_write(struct ntb_dev *ntb, int idx, u32 val); +static int amd_ntb_flush_req(struct ntb_dev *ntb); +static int amd_ntb_wakeup_peer_side(struct ntb_dev *ntb); #endif diff --git a/include/linux/ntb.h b/include/linux/ntb.h index f798e2a..ada98be 100644 --- a/include/linux/ntb.h +++ b/include/linux/ntb.h @@ -210,6 +210,8 @@ static inline int ntb_ctx_ops_is_valid(const struct ntb_ctx_ops *ops) * @peer_spad_addr: See ntb_peer_spad_addr(). * @peer_spad_read: See ntb_peer_spad_read(). * @peer_spad_write: See ntb_peer_spad_write(). + * @flush_req: See ntb_flush_requests(). + * @peer_wakeup: See ntb_wakeup_peer_side(). */ struct ntb_dev_ops { int (*mw_count)(struct ntb_dev *ntb); @@ -259,6 +261,9 @@ struct ntb_dev_ops { phys_addr_t *spad_addr); u32 (*peer_spad_read)(struct ntb_dev *ntb, int idx); int (*peer_spad_write)(struct ntb_dev *ntb, int idx, u32 val); + + int (*flush_req)(struct ntb_dev *ntb); + int (*peer_wakeup)(struct ntb_dev *ntb); }; static inline int ntb_dev_ops_is_valid(const struct ntb_dev_ops *ops) @@ -980,4 +985,34 @@ static inline int ntb_peer_spad_write(struct ntb_dev *ntb, int idx, u32 val) return ntb->ops->peer_spad_write(ntb, idx, val); } +/** + * ntb_flush_requests() - flush all pending requests + * @ntb: NTB device context. + * + * For some usage, one side of NTB need to first make sure that all previous + * requests have been completed and then execute next step such as power down, + * or device removed. + * NOTE: This function may go to sleep, so can't call it in interrupt context. + * + * Return: Zero on success, otherwise an error number. + */ +static inline int ntb_flush_requests(struct ntb_dev *ntb) +{ + return ntb->ops->flush_req(ntb); +} + +/** + * ntb_wakeup_peer_side() - wakeup peer side of NTB. + * @ntb: NTB device context. + * + * Provide a mechanism that wakeup opposite side from low power state. + * NOTE: This function may go to sleep, so can't call it in interrupt context. + * + * Return: Zero on success, otherwise an error number. + */ +static inline int ntb_wakeup_peer_side(struct ntb_dev *ntb) +{ + return ntb->ops->peer_wakeup(ntb); +} + #endif -- 1.9.1