cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ntb_hw_amd.c (33607B)


      1/*
      2 * This file is provided under a dual BSD/GPLv2 license.  When using or
      3 *   redistributing this file, you may do so under either license.
      4 *
      5 *   GPL LICENSE SUMMARY
      6 *
      7 *   Copyright (C) 2016 Advanced Micro Devices, Inc. All Rights Reserved.
      8 *   Copyright (C) 2016 T-Platforms. All Rights Reserved.
      9 *
     10 *   This program is free software; you can redistribute it and/or modify
     11 *   it under the terms of version 2 of the GNU General Public License as
     12 *   published by the Free Software Foundation.
     13 *
     14 *   BSD LICENSE
     15 *
     16 *   Copyright (C) 2016 Advanced Micro Devices, Inc. All Rights Reserved.
     17 *   Copyright (C) 2016 T-Platforms. All Rights Reserved.
     18 *
     19 *   Redistribution and use in source and binary forms, with or without
     20 *   modification, are permitted provided that the following conditions
     21 *   are met:
     22 *
     23 *     * Redistributions of source code must retain the above copyright
     24 *       notice, this list of conditions and the following disclaimer.
     25 *     * Redistributions in binary form must reproduce the above copy
     26 *       notice, this list of conditions and the following disclaimer in
     27 *       the documentation and/or other materials provided with the
     28 *       distribution.
     29 *     * Neither the name of AMD Corporation nor the names of its
     30 *       contributors may be used to endorse or promote products derived
     31 *       from this software without specific prior written permission.
     32 *
     33 *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     34 *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     35 *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     36 *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     37 *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     38 *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     39 *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     40 *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     41 *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     42 *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     43 *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     44 *
     45 * AMD PCIe NTB Linux driver
     46 *
     47 * Contact Information:
     48 * Xiangliang Yu <Xiangliang.Yu@amd.com>
     49 */
     50
     51#include <linux/debugfs.h>
     52#include <linux/delay.h>
     53#include <linux/init.h>
     54#include <linux/interrupt.h>
     55#include <linux/module.h>
     56#include <linux/acpi.h>
     57#include <linux/pci.h>
     58#include <linux/random.h>
     59#include <linux/slab.h>
     60#include <linux/ntb.h>
     61
     62#include "ntb_hw_amd.h"
     63
     64#define NTB_NAME	"ntb_hw_amd"
     65#define NTB_DESC	"AMD(R) PCI-E Non-Transparent Bridge Driver"
     66#define NTB_VER		"1.0"
     67
     68MODULE_DESCRIPTION(NTB_DESC);
     69MODULE_VERSION(NTB_VER);
     70MODULE_LICENSE("Dual BSD/GPL");
     71MODULE_AUTHOR("AMD Inc.");
     72
     73static const struct file_operations amd_ntb_debugfs_info;
     74static struct dentry *debugfs_dir;
     75
     76static int ndev_mw_to_bar(struct amd_ntb_dev *ndev, int idx)
     77{
     78	if (idx < 0 || idx > ndev->mw_count)
     79		return -EINVAL;
     80
     81	return ndev->dev_data->mw_idx << idx;
     82}
     83
     84static int amd_ntb_mw_count(struct ntb_dev *ntb, int pidx)
     85{
     86	if (pidx != NTB_DEF_PEER_IDX)
     87		return -EINVAL;
     88
     89	return ntb_ndev(ntb)->mw_count;
     90}
     91
     92static int amd_ntb_mw_get_align(struct ntb_dev *ntb, int pidx, int idx,
     93				resource_size_t *addr_align,
     94				resource_size_t *size_align,
     95				resource_size_t *size_max)
     96{
     97	struct amd_ntb_dev *ndev = ntb_ndev(ntb);
     98	int bar;
     99
    100	if (pidx != NTB_DEF_PEER_IDX)
    101		return -EINVAL;
    102
    103	bar = ndev_mw_to_bar(ndev, idx);
    104	if (bar < 0)
    105		return bar;
    106
    107	if (addr_align)
    108		*addr_align = SZ_4K;
    109
    110	if (size_align)
    111		*size_align = 1;
    112
    113	if (size_max)
    114		*size_max = pci_resource_len(ndev->ntb.pdev, bar);
    115
    116	return 0;
    117}
    118
    119static int amd_ntb_mw_set_trans(struct ntb_dev *ntb, int pidx, int idx,
    120				dma_addr_t addr, resource_size_t size)
    121{
    122	struct amd_ntb_dev *ndev = ntb_ndev(ntb);
    123	unsigned long xlat_reg, limit_reg = 0;
    124	resource_size_t mw_size;
    125	void __iomem *mmio, *peer_mmio;
    126	u64 base_addr, limit, reg_val;
    127	int bar;
    128
    129	if (pidx != NTB_DEF_PEER_IDX)
    130		return -EINVAL;
    131
    132	bar = ndev_mw_to_bar(ndev, idx);
    133	if (bar < 0)
    134		return bar;
    135
    136	mw_size = pci_resource_len(ntb->pdev, bar);
    137
    138	/* make sure the range fits in the usable mw size */
    139	if (size > mw_size)
    140		return -EINVAL;
    141
    142	mmio = ndev->self_mmio;
    143	peer_mmio = ndev->peer_mmio;
    144
    145	base_addr = pci_resource_start(ntb->pdev, bar);
    146
    147	if (bar != 1) {
    148		xlat_reg = AMD_BAR23XLAT_OFFSET + ((bar - 2) << 2);
    149		limit_reg = AMD_BAR23LMT_OFFSET + ((bar - 2) << 2);
    150
    151		/* Set the limit if supported */
    152		limit = size;
    153
    154		/* set and verify setting the translation address */
    155		write64(addr, peer_mmio + xlat_reg);
    156		reg_val = read64(peer_mmio + xlat_reg);
    157		if (reg_val != addr) {
    158			write64(0, peer_mmio + xlat_reg);
    159			return -EIO;
    160		}
    161
    162		/* set and verify setting the limit */
    163		write64(limit, peer_mmio + limit_reg);
    164		reg_val = read64(peer_mmio + limit_reg);
    165		if (reg_val != limit) {
    166			write64(base_addr, mmio + limit_reg);
    167			write64(0, peer_mmio + xlat_reg);
    168			return -EIO;
    169		}
    170	} else {
    171		xlat_reg = AMD_BAR1XLAT_OFFSET;
    172		limit_reg = AMD_BAR1LMT_OFFSET;
    173
    174		/* Set the limit if supported */
    175		limit = size;
    176
    177		/* set and verify setting the translation address */
    178		write64(addr, peer_mmio + xlat_reg);
    179		reg_val = read64(peer_mmio + xlat_reg);
    180		if (reg_val != addr) {
    181			write64(0, peer_mmio + xlat_reg);
    182			return -EIO;
    183		}
    184
    185		/* set and verify setting the limit */
    186		writel(limit, peer_mmio + limit_reg);
    187		reg_val = readl(peer_mmio + limit_reg);
    188		if (reg_val != limit) {
    189			writel(base_addr, mmio + limit_reg);
    190			writel(0, peer_mmio + xlat_reg);
    191			return -EIO;
    192		}
    193	}
    194
    195	return 0;
    196}
    197
    198static int amd_ntb_get_link_status(struct amd_ntb_dev *ndev)
    199{
    200	struct pci_dev *pdev = NULL;
    201	struct pci_dev *pci_swds = NULL;
    202	struct pci_dev *pci_swus = NULL;
    203	u32 stat;
    204	int rc;
    205
    206	if (ndev->ntb.topo == NTB_TOPO_SEC) {
    207		/* Locate the pointer to Downstream Switch for this device */
    208		pci_swds = pci_upstream_bridge(ndev->ntb.pdev);
    209		if (pci_swds) {
    210			/*
    211			 * Locate the pointer to Upstream Switch for
    212			 * the Downstream Switch.
    213			 */
    214			pci_swus = pci_upstream_bridge(pci_swds);
    215			if (pci_swus) {
    216				rc = pcie_capability_read_dword(pci_swus,
    217								PCI_EXP_LNKCTL,
    218								&stat);
    219				if (rc)
    220					return 0;
    221			} else {
    222				return 0;
    223			}
    224		} else {
    225			return 0;
    226		}
    227	} else if (ndev->ntb.topo == NTB_TOPO_PRI) {
    228		/*
    229		 * For NTB primary, we simply read the Link Status and control
    230		 * register of the NTB device itself.
    231		 */
    232		pdev = ndev->ntb.pdev;
    233		rc = pcie_capability_read_dword(pdev, PCI_EXP_LNKCTL, &stat);
    234		if (rc)
    235			return 0;
    236	} else {
    237		/* Catch all for everything else */
    238		return 0;
    239	}
    240
    241	ndev->lnk_sta = stat;
    242
    243	return 1;
    244}
    245
    246static int amd_link_is_up(struct amd_ntb_dev *ndev)
    247{
    248	int ret;
    249
    250	/*
    251	 * We consider the link to be up under two conditions:
    252	 *
    253	 *   - When a link-up event is received. This is indicated by
    254	 *     AMD_LINK_UP_EVENT set in peer_sta.
    255	 *   - When driver on both sides of the link have been loaded.
    256	 *     This is indicated by bit 1 being set in the peer
    257	 *     SIDEINFO register.
    258	 *
    259	 * This function should return 1 when the latter of the above
    260	 * two conditions is true.
    261	 *
    262	 * Now consider the sequence of events - Link-Up event occurs,
    263	 * then the peer side driver loads. In this case, we would have
    264	 * received LINK_UP event and bit 1 of peer SIDEINFO is also
    265	 * set. What happens now if the link goes down? Bit 1 of
    266	 * peer SIDEINFO remains set, but LINK_DOWN bit is set in
    267	 * peer_sta. So we should return 0 from this function. Not only
    268	 * that, we clear bit 1 of peer SIDEINFO to 0, since the peer
    269	 * side driver did not even get a chance to clear it before
    270	 * the link went down. This can be the case of surprise link
    271	 * removal.
    272	 *
    273	 * LINK_UP event will always occur before the peer side driver
    274	 * gets loaded the very first time. So there can be a case when
    275	 * the LINK_UP event has occurred, but the peer side driver hasn't
    276	 * yet loaded. We return 0 in that case.
    277	 *
    278	 * There is also a special case when the primary side driver is
    279	 * unloaded and then loaded again. Since there is no change in
    280	 * the status of NTB secondary in this case, there is no Link-Up
    281	 * or Link-Down notification received. We recognize this condition
    282	 * with peer_sta being set to 0.
    283	 *
    284	 * If bit 1 of peer SIDEINFO register is not set, then we
    285	 * simply return 0 irrespective of the link up or down status
    286	 * set in peer_sta.
    287	 */
    288	ret = amd_poll_link(ndev);
    289	if (ret) {
    290		/*
    291		 * We need to check the below only for NTB primary. For NTB
    292		 * secondary, simply checking the result of PSIDE_INFO
    293		 * register will suffice.
    294		 */
    295		if (ndev->ntb.topo == NTB_TOPO_PRI) {
    296			if ((ndev->peer_sta & AMD_LINK_UP_EVENT) ||
    297			    (ndev->peer_sta == 0))
    298				return ret;
    299			else if (ndev->peer_sta & AMD_LINK_DOWN_EVENT) {
    300				/* Clear peer sideinfo register */
    301				amd_clear_side_info_reg(ndev, true);
    302
    303				return 0;
    304			}
    305		} else { /* NTB_TOPO_SEC */
    306			return ret;
    307		}
    308	}
    309
    310	return 0;
    311}
    312
    313static u64 amd_ntb_link_is_up(struct ntb_dev *ntb,
    314			      enum ntb_speed *speed,
    315			      enum ntb_width *width)
    316{
    317	struct amd_ntb_dev *ndev = ntb_ndev(ntb);
    318	int ret = 0;
    319
    320	if (amd_link_is_up(ndev)) {
    321		if (speed)
    322			*speed = NTB_LNK_STA_SPEED(ndev->lnk_sta);
    323		if (width)
    324			*width = NTB_LNK_STA_WIDTH(ndev->lnk_sta);
    325
    326		dev_dbg(&ntb->pdev->dev, "link is up.\n");
    327
    328		ret = 1;
    329	} else {
    330		if (speed)
    331			*speed = NTB_SPEED_NONE;
    332		if (width)
    333			*width = NTB_WIDTH_NONE;
    334
    335		dev_dbg(&ntb->pdev->dev, "link is down.\n");
    336	}
    337
    338	return ret;
    339}
    340
    341static int amd_ntb_link_enable(struct ntb_dev *ntb,
    342			       enum ntb_speed max_speed,
    343			       enum ntb_width max_width)
    344{
    345	struct amd_ntb_dev *ndev = ntb_ndev(ntb);
    346	void __iomem *mmio = ndev->self_mmio;
    347
    348	/* Enable event interrupt */
    349	ndev->int_mask &= ~AMD_EVENT_INTMASK;
    350	writel(ndev->int_mask, mmio + AMD_INTMASK_OFFSET);
    351
    352	if (ndev->ntb.topo == NTB_TOPO_SEC)
    353		return -EINVAL;
    354	dev_dbg(&ntb->pdev->dev, "Enabling Link.\n");
    355
    356	return 0;
    357}
    358
    359static int amd_ntb_link_disable(struct ntb_dev *ntb)
    360{
    361	struct amd_ntb_dev *ndev = ntb_ndev(ntb);
    362	void __iomem *mmio = ndev->self_mmio;
    363
    364	/* Disable event interrupt */
    365	ndev->int_mask |= AMD_EVENT_INTMASK;
    366	writel(ndev->int_mask, mmio + AMD_INTMASK_OFFSET);
    367
    368	if (ndev->ntb.topo == NTB_TOPO_SEC)
    369		return -EINVAL;
    370	dev_dbg(&ntb->pdev->dev, "Enabling Link.\n");
    371
    372	return 0;
    373}
    374
    375static int amd_ntb_peer_mw_count(struct ntb_dev *ntb)
    376{
    377	/* The same as for inbound MWs */
    378	return ntb_ndev(ntb)->mw_count;
    379}
    380
    381static int amd_ntb_peer_mw_get_addr(struct ntb_dev *ntb, int idx,
    382				    phys_addr_t *base, resource_size_t *size)
    383{
    384	struct amd_ntb_dev *ndev = ntb_ndev(ntb);
    385	int bar;
    386
    387	bar = ndev_mw_to_bar(ndev, idx);
    388	if (bar < 0)
    389		return bar;
    390
    391	if (base)
    392		*base = pci_resource_start(ndev->ntb.pdev, bar);
    393
    394	if (size)
    395		*size = pci_resource_len(ndev->ntb.pdev, bar);
    396
    397	return 0;
    398}
    399
    400static u64 amd_ntb_db_valid_mask(struct ntb_dev *ntb)
    401{
    402	return ntb_ndev(ntb)->db_valid_mask;
    403}
    404
    405static int amd_ntb_db_vector_count(struct ntb_dev *ntb)
    406{
    407	return ntb_ndev(ntb)->db_count;
    408}
    409
    410static u64 amd_ntb_db_vector_mask(struct ntb_dev *ntb, int db_vector)
    411{
    412	struct amd_ntb_dev *ndev = ntb_ndev(ntb);
    413
    414	if (db_vector < 0 || db_vector > ndev->db_count)
    415		return 0;
    416
    417	return ntb_ndev(ntb)->db_valid_mask & (1ULL << db_vector);
    418}
    419
    420static u64 amd_ntb_db_read(struct ntb_dev *ntb)
    421{
    422	struct amd_ntb_dev *ndev = ntb_ndev(ntb);
    423	void __iomem *mmio = ndev->self_mmio;
    424
    425	return (u64)readw(mmio + AMD_DBSTAT_OFFSET);
    426}
    427
    428static int amd_ntb_db_clear(struct ntb_dev *ntb, u64 db_bits)
    429{
    430	struct amd_ntb_dev *ndev = ntb_ndev(ntb);
    431	void __iomem *mmio = ndev->self_mmio;
    432
    433	writew((u16)db_bits, mmio + AMD_DBSTAT_OFFSET);
    434
    435	return 0;
    436}
    437
    438static int amd_ntb_db_set_mask(struct ntb_dev *ntb, u64 db_bits)
    439{
    440	struct amd_ntb_dev *ndev = ntb_ndev(ntb);
    441	void __iomem *mmio = ndev->self_mmio;
    442	unsigned long flags;
    443
    444	if (db_bits & ~ndev->db_valid_mask)
    445		return -EINVAL;
    446
    447	spin_lock_irqsave(&ndev->db_mask_lock, flags);
    448	ndev->db_mask |= db_bits;
    449	writew((u16)ndev->db_mask, mmio + AMD_DBMASK_OFFSET);
    450	spin_unlock_irqrestore(&ndev->db_mask_lock, flags);
    451
    452	return 0;
    453}
    454
    455static int amd_ntb_db_clear_mask(struct ntb_dev *ntb, u64 db_bits)
    456{
    457	struct amd_ntb_dev *ndev = ntb_ndev(ntb);
    458	void __iomem *mmio = ndev->self_mmio;
    459	unsigned long flags;
    460
    461	if (db_bits & ~ndev->db_valid_mask)
    462		return -EINVAL;
    463
    464	spin_lock_irqsave(&ndev->db_mask_lock, flags);
    465	ndev->db_mask &= ~db_bits;
    466	writew((u16)ndev->db_mask, mmio + AMD_DBMASK_OFFSET);
    467	spin_unlock_irqrestore(&ndev->db_mask_lock, flags);
    468
    469	return 0;
    470}
    471
    472static int amd_ntb_peer_db_set(struct ntb_dev *ntb, u64 db_bits)
    473{
    474	struct amd_ntb_dev *ndev = ntb_ndev(ntb);
    475	void __iomem *mmio = ndev->self_mmio;
    476
    477	writew((u16)db_bits, mmio + AMD_DBREQ_OFFSET);
    478
    479	return 0;
    480}
    481
    482static int amd_ntb_spad_count(struct ntb_dev *ntb)
    483{
    484	return ntb_ndev(ntb)->spad_count;
    485}
    486
    487static u32 amd_ntb_spad_read(struct ntb_dev *ntb, int idx)
    488{
    489	struct amd_ntb_dev *ndev = ntb_ndev(ntb);
    490	void __iomem *mmio = ndev->self_mmio;
    491	u32 offset;
    492
    493	if (idx < 0 || idx >= ndev->spad_count)
    494		return 0;
    495
    496	offset = ndev->self_spad + (idx << 2);
    497	return readl(mmio + AMD_SPAD_OFFSET + offset);
    498}
    499
    500static int amd_ntb_spad_write(struct ntb_dev *ntb,
    501			      int idx, u32 val)
    502{
    503	struct amd_ntb_dev *ndev = ntb_ndev(ntb);
    504	void __iomem *mmio = ndev->self_mmio;
    505	u32 offset;
    506
    507	if (idx < 0 || idx >= ndev->spad_count)
    508		return -EINVAL;
    509
    510	offset = ndev->self_spad + (idx << 2);
    511	writel(val, mmio + AMD_SPAD_OFFSET + offset);
    512
    513	return 0;
    514}
    515
    516static u32 amd_ntb_peer_spad_read(struct ntb_dev *ntb, int pidx, int sidx)
    517{
    518	struct amd_ntb_dev *ndev = ntb_ndev(ntb);
    519	void __iomem *mmio = ndev->self_mmio;
    520	u32 offset;
    521
    522	if (sidx < 0 || sidx >= ndev->spad_count)
    523		return -EINVAL;
    524
    525	offset = ndev->peer_spad + (sidx << 2);
    526	return readl(mmio + AMD_SPAD_OFFSET + offset);
    527}
    528
    529static int amd_ntb_peer_spad_write(struct ntb_dev *ntb, int pidx,
    530				   int sidx, u32 val)
    531{
    532	struct amd_ntb_dev *ndev = ntb_ndev(ntb);
    533	void __iomem *mmio = ndev->self_mmio;
    534	u32 offset;
    535
    536	if (sidx < 0 || sidx >= ndev->spad_count)
    537		return -EINVAL;
    538
    539	offset = ndev->peer_spad + (sidx << 2);
    540	writel(val, mmio + AMD_SPAD_OFFSET + offset);
    541
    542	return 0;
    543}
    544
    545static const struct ntb_dev_ops amd_ntb_ops = {
    546	.mw_count		= amd_ntb_mw_count,
    547	.mw_get_align		= amd_ntb_mw_get_align,
    548	.mw_set_trans		= amd_ntb_mw_set_trans,
    549	.peer_mw_count		= amd_ntb_peer_mw_count,
    550	.peer_mw_get_addr	= amd_ntb_peer_mw_get_addr,
    551	.link_is_up		= amd_ntb_link_is_up,
    552	.link_enable		= amd_ntb_link_enable,
    553	.link_disable		= amd_ntb_link_disable,
    554	.db_valid_mask		= amd_ntb_db_valid_mask,
    555	.db_vector_count	= amd_ntb_db_vector_count,
    556	.db_vector_mask		= amd_ntb_db_vector_mask,
    557	.db_read		= amd_ntb_db_read,
    558	.db_clear		= amd_ntb_db_clear,
    559	.db_set_mask		= amd_ntb_db_set_mask,
    560	.db_clear_mask		= amd_ntb_db_clear_mask,
    561	.peer_db_set		= amd_ntb_peer_db_set,
    562	.spad_count		= amd_ntb_spad_count,
    563	.spad_read		= amd_ntb_spad_read,
    564	.spad_write		= amd_ntb_spad_write,
    565	.peer_spad_read		= amd_ntb_peer_spad_read,
    566	.peer_spad_write	= amd_ntb_peer_spad_write,
    567};
    568
    569static void amd_ack_smu(struct amd_ntb_dev *ndev, u32 bit)
    570{
    571	void __iomem *mmio = ndev->self_mmio;
    572	int reg;
    573
    574	reg = readl(mmio + AMD_SMUACK_OFFSET);
    575	reg |= bit;
    576	writel(reg, mmio + AMD_SMUACK_OFFSET);
    577}
    578
    579static void amd_handle_event(struct amd_ntb_dev *ndev, int vec)
    580{
    581	void __iomem *mmio = ndev->self_mmio;
    582	struct device *dev = &ndev->ntb.pdev->dev;
    583	u32 status;
    584
    585	status = readl(mmio + AMD_INTSTAT_OFFSET);
    586	if (!(status & AMD_EVENT_INTMASK))
    587		return;
    588
    589	dev_dbg(dev, "status = 0x%x and vec = %d\n", status, vec);
    590
    591	status &= AMD_EVENT_INTMASK;
    592	switch (status) {
    593	case AMD_PEER_FLUSH_EVENT:
    594		ndev->peer_sta |= AMD_PEER_FLUSH_EVENT;
    595		dev_info(dev, "Flush is done.\n");
    596		break;
    597	case AMD_PEER_RESET_EVENT:
    598	case AMD_LINK_DOWN_EVENT:
    599		ndev->peer_sta |= status;
    600		if (status == AMD_LINK_DOWN_EVENT)
    601			ndev->peer_sta &= ~AMD_LINK_UP_EVENT;
    602
    603		amd_ack_smu(ndev, status);
    604
    605		/* link down first */
    606		ntb_link_event(&ndev->ntb);
    607		/* polling peer status */
    608		schedule_delayed_work(&ndev->hb_timer, AMD_LINK_HB_TIMEOUT);
    609
    610		break;
    611	case AMD_PEER_D3_EVENT:
    612	case AMD_PEER_PMETO_EVENT:
    613	case AMD_LINK_UP_EVENT:
    614		ndev->peer_sta |= status;
    615		if (status == AMD_LINK_UP_EVENT)
    616			ndev->peer_sta &= ~AMD_LINK_DOWN_EVENT;
    617		else if (status == AMD_PEER_D3_EVENT)
    618			ndev->peer_sta &= ~AMD_PEER_D0_EVENT;
    619
    620		amd_ack_smu(ndev, status);
    621
    622		/* link down */
    623		ntb_link_event(&ndev->ntb);
    624
    625		break;
    626	case AMD_PEER_D0_EVENT:
    627		mmio = ndev->peer_mmio;
    628		status = readl(mmio + AMD_PMESTAT_OFFSET);
    629		/* check if this is WAKEUP event */
    630		if (status & 0x1)
    631			dev_info(dev, "Wakeup is done.\n");
    632
    633		ndev->peer_sta |= AMD_PEER_D0_EVENT;
    634		ndev->peer_sta &= ~AMD_PEER_D3_EVENT;
    635		amd_ack_smu(ndev, AMD_PEER_D0_EVENT);
    636
    637		/* start a timer to poll link status */
    638		schedule_delayed_work(&ndev->hb_timer,
    639				      AMD_LINK_HB_TIMEOUT);
    640		break;
    641	default:
    642		dev_info(dev, "event status = 0x%x.\n", status);
    643		break;
    644	}
    645
    646	/* Clear the interrupt status */
    647	writel(status, mmio + AMD_INTSTAT_OFFSET);
    648}
    649
    650static void amd_handle_db_event(struct amd_ntb_dev *ndev, int vec)
    651{
    652	struct device *dev = &ndev->ntb.pdev->dev;
    653	u64 status;
    654
    655	status = amd_ntb_db_read(&ndev->ntb);
    656
    657	dev_dbg(dev, "status = 0x%llx and vec = %d\n", status, vec);
    658
    659	/*
    660	 * Since we had reserved highest order bit of DB for signaling peer of
    661	 * a special event, this is the only status bit we should be concerned
    662	 * here now.
    663	 */
    664	if (status & BIT(ndev->db_last_bit)) {
    665		ntb_db_clear(&ndev->ntb, BIT(ndev->db_last_bit));
    666		/* send link down event notification */
    667		ntb_link_event(&ndev->ntb);
    668
    669		/*
    670		 * If we are here, that means the peer has signalled a special
    671		 * event which notifies that the peer driver has been
    672		 * un-loaded for some reason. Since there is a chance that the
    673		 * peer will load its driver again sometime, we schedule link
    674		 * polling routine.
    675		 */
    676		schedule_delayed_work(&ndev->hb_timer, AMD_LINK_HB_TIMEOUT);
    677	}
    678}
    679
    680static irqreturn_t ndev_interrupt(struct amd_ntb_dev *ndev, int vec)
    681{
    682	dev_dbg(&ndev->ntb.pdev->dev, "vec %d\n", vec);
    683
    684	if (vec > (AMD_DB_CNT - 1) || (ndev->msix_vec_count == 1))
    685		amd_handle_event(ndev, vec);
    686
    687	if (vec < AMD_DB_CNT) {
    688		amd_handle_db_event(ndev, vec);
    689		ntb_db_event(&ndev->ntb, vec);
    690	}
    691
    692	return IRQ_HANDLED;
    693}
    694
    695static irqreturn_t ndev_vec_isr(int irq, void *dev)
    696{
    697	struct amd_ntb_vec *nvec = dev;
    698
    699	return ndev_interrupt(nvec->ndev, nvec->num);
    700}
    701
    702static irqreturn_t ndev_irq_isr(int irq, void *dev)
    703{
    704	struct amd_ntb_dev *ndev = dev;
    705
    706	return ndev_interrupt(ndev, irq - ndev->ntb.pdev->irq);
    707}
    708
    709static int ndev_init_isr(struct amd_ntb_dev *ndev,
    710			 int msix_min, int msix_max)
    711{
    712	struct pci_dev *pdev;
    713	int rc, i, msix_count, node;
    714
    715	pdev = ndev->ntb.pdev;
    716
    717	node = dev_to_node(&pdev->dev);
    718
    719	ndev->db_mask = ndev->db_valid_mask;
    720
    721	/* Try to set up msix irq */
    722	ndev->vec = kcalloc_node(msix_max, sizeof(*ndev->vec),
    723				 GFP_KERNEL, node);
    724	if (!ndev->vec)
    725		goto err_msix_vec_alloc;
    726
    727	ndev->msix = kcalloc_node(msix_max, sizeof(*ndev->msix),
    728				  GFP_KERNEL, node);
    729	if (!ndev->msix)
    730		goto err_msix_alloc;
    731
    732	for (i = 0; i < msix_max; ++i)
    733		ndev->msix[i].entry = i;
    734
    735	msix_count = pci_enable_msix_range(pdev, ndev->msix,
    736					   msix_min, msix_max);
    737	if (msix_count < 0)
    738		goto err_msix_enable;
    739
    740	/* NOTE: Disable MSIX if msix count is less than 16 because of
    741	 * hardware limitation.
    742	 */
    743	if (msix_count < msix_min) {
    744		pci_disable_msix(pdev);
    745		goto err_msix_enable;
    746	}
    747
    748	for (i = 0; i < msix_count; ++i) {
    749		ndev->vec[i].ndev = ndev;
    750		ndev->vec[i].num = i;
    751		rc = request_irq(ndev->msix[i].vector, ndev_vec_isr, 0,
    752				 "ndev_vec_isr", &ndev->vec[i]);
    753		if (rc)
    754			goto err_msix_request;
    755	}
    756
    757	dev_dbg(&pdev->dev, "Using msix interrupts\n");
    758	ndev->db_count = msix_min;
    759	ndev->msix_vec_count = msix_max;
    760	return 0;
    761
    762err_msix_request:
    763	while (i-- > 0)
    764		free_irq(ndev->msix[i].vector, &ndev->vec[i]);
    765	pci_disable_msix(pdev);
    766err_msix_enable:
    767	kfree(ndev->msix);
    768err_msix_alloc:
    769	kfree(ndev->vec);
    770err_msix_vec_alloc:
    771	ndev->msix = NULL;
    772	ndev->vec = NULL;
    773
    774	/* Try to set up msi irq */
    775	rc = pci_enable_msi(pdev);
    776	if (rc)
    777		goto err_msi_enable;
    778
    779	rc = request_irq(pdev->irq, ndev_irq_isr, 0,
    780			 "ndev_irq_isr", ndev);
    781	if (rc)
    782		goto err_msi_request;
    783
    784	dev_dbg(&pdev->dev, "Using msi interrupts\n");
    785	ndev->db_count = 1;
    786	ndev->msix_vec_count = 1;
    787	return 0;
    788
    789err_msi_request:
    790	pci_disable_msi(pdev);
    791err_msi_enable:
    792
    793	/* Try to set up intx irq */
    794	pci_intx(pdev, 1);
    795
    796	rc = request_irq(pdev->irq, ndev_irq_isr, IRQF_SHARED,
    797			 "ndev_irq_isr", ndev);
    798	if (rc)
    799		goto err_intx_request;
    800
    801	dev_dbg(&pdev->dev, "Using intx interrupts\n");
    802	ndev->db_count = 1;
    803	ndev->msix_vec_count = 1;
    804	return 0;
    805
    806err_intx_request:
    807	return rc;
    808}
    809
    810static void ndev_deinit_isr(struct amd_ntb_dev *ndev)
    811{
    812	struct pci_dev *pdev;
    813	void __iomem *mmio = ndev->self_mmio;
    814	int i;
    815
    816	pdev = ndev->ntb.pdev;
    817
    818	/* Mask all doorbell interrupts */
    819	ndev->db_mask = ndev->db_valid_mask;
    820	writel(ndev->db_mask, mmio + AMD_DBMASK_OFFSET);
    821
    822	if (ndev->msix) {
    823		i = ndev->msix_vec_count;
    824		while (i--)
    825			free_irq(ndev->msix[i].vector, &ndev->vec[i]);
    826		pci_disable_msix(pdev);
    827		kfree(ndev->msix);
    828		kfree(ndev->vec);
    829	} else {
    830		free_irq(pdev->irq, ndev);
    831		if (pci_dev_msi_enabled(pdev))
    832			pci_disable_msi(pdev);
    833		else
    834			pci_intx(pdev, 0);
    835	}
    836}
    837
    838static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,
    839				 size_t count, loff_t *offp)
    840{
    841	struct amd_ntb_dev *ndev;
    842	void __iomem *mmio;
    843	char *buf;
    844	size_t buf_size;
    845	ssize_t ret, off;
    846	union { u64 v64; u32 v32; u16 v16; } u;
    847
    848	ndev = filp->private_data;
    849	mmio = ndev->self_mmio;
    850
    851	buf_size = min(count, 0x800ul);
    852
    853	buf = kmalloc(buf_size, GFP_KERNEL);
    854	if (!buf)
    855		return -ENOMEM;
    856
    857	off = 0;
    858
    859	off += scnprintf(buf + off, buf_size - off,
    860			 "NTB Device Information:\n");
    861
    862	off += scnprintf(buf + off, buf_size - off,
    863			 "Connection Topology -\t%s\n",
    864			 ntb_topo_string(ndev->ntb.topo));
    865
    866	off += scnprintf(buf + off, buf_size - off,
    867			 "LNK STA -\t\t%#06x\n", ndev->lnk_sta);
    868
    869	if (!amd_link_is_up(ndev)) {
    870		off += scnprintf(buf + off, buf_size - off,
    871				 "Link Status -\t\tDown\n");
    872	} else {
    873		off += scnprintf(buf + off, buf_size - off,
    874				 "Link Status -\t\tUp\n");
    875		off += scnprintf(buf + off, buf_size - off,
    876				 "Link Speed -\t\tPCI-E Gen %u\n",
    877				 NTB_LNK_STA_SPEED(ndev->lnk_sta));
    878		off += scnprintf(buf + off, buf_size - off,
    879				 "Link Width -\t\tx%u\n",
    880				 NTB_LNK_STA_WIDTH(ndev->lnk_sta));
    881	}
    882
    883	off += scnprintf(buf + off, buf_size - off,
    884			 "Memory Window Count -\t%u\n", ndev->mw_count);
    885	off += scnprintf(buf + off, buf_size - off,
    886			 "Scratchpad Count -\t%u\n", ndev->spad_count);
    887	off += scnprintf(buf + off, buf_size - off,
    888			 "Doorbell Count -\t%u\n", ndev->db_count);
    889	off += scnprintf(buf + off, buf_size - off,
    890			 "MSIX Vector Count -\t%u\n", ndev->msix_vec_count);
    891
    892	off += scnprintf(buf + off, buf_size - off,
    893			 "Doorbell Valid Mask -\t%#llx\n", ndev->db_valid_mask);
    894
    895	u.v32 = readl(ndev->self_mmio + AMD_DBMASK_OFFSET);
    896	off += scnprintf(buf + off, buf_size - off,
    897			 "Doorbell Mask -\t\t\t%#06x\n", u.v32);
    898
    899	u.v32 = readl(mmio + AMD_DBSTAT_OFFSET);
    900	off += scnprintf(buf + off, buf_size - off,
    901			 "Doorbell Bell -\t\t\t%#06x\n", u.v32);
    902
    903	off += scnprintf(buf + off, buf_size - off,
    904			 "\nNTB Incoming XLAT:\n");
    905
    906	u.v64 = read64(mmio + AMD_BAR1XLAT_OFFSET);
    907	off += scnprintf(buf + off, buf_size - off,
    908			 "XLAT1 -\t\t%#018llx\n", u.v64);
    909
    910	u.v64 = read64(ndev->self_mmio + AMD_BAR23XLAT_OFFSET);
    911	off += scnprintf(buf + off, buf_size - off,
    912			 "XLAT23 -\t\t%#018llx\n", u.v64);
    913
    914	u.v64 = read64(ndev->self_mmio + AMD_BAR45XLAT_OFFSET);
    915	off += scnprintf(buf + off, buf_size - off,
    916			 "XLAT45 -\t\t%#018llx\n", u.v64);
    917
    918	u.v32 = readl(mmio + AMD_BAR1LMT_OFFSET);
    919	off += scnprintf(buf + off, buf_size - off,
    920			 "LMT1 -\t\t\t%#06x\n", u.v32);
    921
    922	u.v64 = read64(ndev->self_mmio + AMD_BAR23LMT_OFFSET);
    923	off += scnprintf(buf + off, buf_size - off,
    924			 "LMT23 -\t\t\t%#018llx\n", u.v64);
    925
    926	u.v64 = read64(ndev->self_mmio + AMD_BAR45LMT_OFFSET);
    927	off += scnprintf(buf + off, buf_size - off,
    928			 "LMT45 -\t\t\t%#018llx\n", u.v64);
    929
    930	ret = simple_read_from_buffer(ubuf, count, offp, buf, off);
    931	kfree(buf);
    932	return ret;
    933}
    934
    935static void ndev_init_debugfs(struct amd_ntb_dev *ndev)
    936{
    937	if (!debugfs_dir) {
    938		ndev->debugfs_dir = NULL;
    939		ndev->debugfs_info = NULL;
    940	} else {
    941		ndev->debugfs_dir =
    942			debugfs_create_dir(pci_name(ndev->ntb.pdev),
    943					   debugfs_dir);
    944		if (!ndev->debugfs_dir)
    945			ndev->debugfs_info = NULL;
    946		else
    947			ndev->debugfs_info =
    948				debugfs_create_file("info", S_IRUSR,
    949						    ndev->debugfs_dir, ndev,
    950						    &amd_ntb_debugfs_info);
    951	}
    952}
    953
    954static void ndev_deinit_debugfs(struct amd_ntb_dev *ndev)
    955{
    956	debugfs_remove_recursive(ndev->debugfs_dir);
    957}
    958
    959static inline void ndev_init_struct(struct amd_ntb_dev *ndev,
    960				    struct pci_dev *pdev)
    961{
    962	ndev->ntb.pdev = pdev;
    963	ndev->ntb.topo = NTB_TOPO_NONE;
    964	ndev->ntb.ops = &amd_ntb_ops;
    965	ndev->int_mask = AMD_EVENT_INTMASK;
    966	spin_lock_init(&ndev->db_mask_lock);
    967}
    968
    969static int amd_poll_link(struct amd_ntb_dev *ndev)
    970{
    971	void __iomem *mmio = ndev->peer_mmio;
    972	u32 reg;
    973
    974	reg = readl(mmio + AMD_SIDEINFO_OFFSET);
    975	reg &= AMD_SIDE_READY;
    976
    977	dev_dbg(&ndev->ntb.pdev->dev, "%s: reg_val = 0x%x.\n", __func__, reg);
    978
    979	ndev->cntl_sta = reg;
    980
    981	amd_ntb_get_link_status(ndev);
    982
    983	return ndev->cntl_sta;
    984}
    985
    986static void amd_link_hb(struct work_struct *work)
    987{
    988	struct amd_ntb_dev *ndev = hb_ndev(work);
    989
    990	if (amd_poll_link(ndev))
    991		ntb_link_event(&ndev->ntb);
    992
    993	if (!amd_link_is_up(ndev))
    994		schedule_delayed_work(&ndev->hb_timer, AMD_LINK_HB_TIMEOUT);
    995}
    996
    997static int amd_init_isr(struct amd_ntb_dev *ndev)
    998{
    999	return ndev_init_isr(ndev, AMD_DB_CNT, AMD_MSIX_VECTOR_CNT);
   1000}
   1001
   1002static void amd_set_side_info_reg(struct amd_ntb_dev *ndev, bool peer)
   1003{
   1004	void __iomem *mmio = NULL;
   1005	unsigned int reg;
   1006
   1007	if (peer)
   1008		mmio = ndev->peer_mmio;
   1009	else
   1010		mmio = ndev->self_mmio;
   1011
   1012	reg = readl(mmio + AMD_SIDEINFO_OFFSET);
   1013	if (!(reg & AMD_SIDE_READY)) {
   1014		reg |= AMD_SIDE_READY;
   1015		writel(reg, mmio + AMD_SIDEINFO_OFFSET);
   1016	}
   1017}
   1018
   1019static void amd_clear_side_info_reg(struct amd_ntb_dev *ndev, bool peer)
   1020{
   1021	void __iomem *mmio = NULL;
   1022	unsigned int reg;
   1023
   1024	if (peer)
   1025		mmio = ndev->peer_mmio;
   1026	else
   1027		mmio = ndev->self_mmio;
   1028
   1029	reg = readl(mmio + AMD_SIDEINFO_OFFSET);
   1030	if (reg & AMD_SIDE_READY) {
   1031		reg &= ~AMD_SIDE_READY;
   1032		writel(reg, mmio + AMD_SIDEINFO_OFFSET);
   1033		readl(mmio + AMD_SIDEINFO_OFFSET);
   1034	}
   1035}
   1036
   1037static void amd_init_side_info(struct amd_ntb_dev *ndev)
   1038{
   1039	void __iomem *mmio = ndev->self_mmio;
   1040	u32 ntb_ctl;
   1041
   1042	amd_set_side_info_reg(ndev, false);
   1043
   1044	ntb_ctl = readl(mmio + AMD_CNTL_OFFSET);
   1045	ntb_ctl |= (PMM_REG_CTL | SMM_REG_CTL);
   1046	writel(ntb_ctl, mmio + AMD_CNTL_OFFSET);
   1047}
   1048
   1049static void amd_deinit_side_info(struct amd_ntb_dev *ndev)
   1050{
   1051	void __iomem *mmio = ndev->self_mmio;
   1052	u32 ntb_ctl;
   1053
   1054	amd_clear_side_info_reg(ndev, false);
   1055
   1056	ntb_ctl = readl(mmio + AMD_CNTL_OFFSET);
   1057	ntb_ctl &= ~(PMM_REG_CTL | SMM_REG_CTL);
   1058	writel(ntb_ctl, mmio + AMD_CNTL_OFFSET);
   1059}
   1060
   1061static int amd_init_ntb(struct amd_ntb_dev *ndev)
   1062{
   1063	void __iomem *mmio = ndev->self_mmio;
   1064
   1065	ndev->mw_count = ndev->dev_data->mw_count;
   1066	ndev->spad_count = AMD_SPADS_CNT;
   1067	ndev->db_count = AMD_DB_CNT;
   1068
   1069	switch (ndev->ntb.topo) {
   1070	case NTB_TOPO_PRI:
   1071	case NTB_TOPO_SEC:
   1072		ndev->spad_count >>= 1;
   1073		if (ndev->ntb.topo == NTB_TOPO_PRI) {
   1074			ndev->self_spad = 0;
   1075			ndev->peer_spad = 0x20;
   1076		} else {
   1077			ndev->self_spad = 0x20;
   1078			ndev->peer_spad = 0;
   1079		}
   1080
   1081		INIT_DELAYED_WORK(&ndev->hb_timer, amd_link_hb);
   1082		schedule_delayed_work(&ndev->hb_timer, AMD_LINK_HB_TIMEOUT);
   1083
   1084		break;
   1085	default:
   1086		dev_err(&ndev->ntb.pdev->dev,
   1087			"AMD NTB does not support B2B mode.\n");
   1088		return -EINVAL;
   1089	}
   1090
   1091	/* Mask event interrupts */
   1092	writel(ndev->int_mask, mmio + AMD_INTMASK_OFFSET);
   1093
   1094	return 0;
   1095}
   1096
   1097static enum ntb_topo amd_get_topo(struct amd_ntb_dev *ndev)
   1098{
   1099	void __iomem *mmio = ndev->self_mmio;
   1100	u32 info;
   1101
   1102	info = readl(mmio + AMD_SIDEINFO_OFFSET);
   1103	if (info & AMD_SIDE_MASK)
   1104		return NTB_TOPO_SEC;
   1105	else
   1106		return NTB_TOPO_PRI;
   1107}
   1108
   1109static int amd_init_dev(struct amd_ntb_dev *ndev)
   1110{
   1111	void __iomem *mmio = ndev->self_mmio;
   1112	struct pci_dev *pdev;
   1113	int rc = 0;
   1114
   1115	pdev = ndev->ntb.pdev;
   1116
   1117	ndev->ntb.topo = amd_get_topo(ndev);
   1118	dev_dbg(&pdev->dev, "AMD NTB topo is %s\n",
   1119		ntb_topo_string(ndev->ntb.topo));
   1120
   1121	rc = amd_init_ntb(ndev);
   1122	if (rc)
   1123		return rc;
   1124
   1125	rc = amd_init_isr(ndev);
   1126	if (rc) {
   1127		dev_err(&pdev->dev, "fail to init isr.\n");
   1128		return rc;
   1129	}
   1130
   1131	ndev->db_valid_mask = BIT_ULL(ndev->db_count) - 1;
   1132	/*
   1133	 * We reserve the highest order bit of the DB register which will
   1134	 * be used to notify peer when the driver on this side is being
   1135	 * un-loaded.
   1136	 */
   1137	ndev->db_last_bit =
   1138			find_last_bit((unsigned long *)&ndev->db_valid_mask,
   1139				      hweight64(ndev->db_valid_mask));
   1140	writew((u16)~BIT(ndev->db_last_bit), mmio + AMD_DBMASK_OFFSET);
   1141	/*
   1142	 * Since now there is one less bit to account for, the DB count
   1143	 * and DB mask should be adjusted accordingly.
   1144	 */
   1145	ndev->db_count -= 1;
   1146	ndev->db_valid_mask = BIT_ULL(ndev->db_count) - 1;
   1147
   1148	/* Enable Link-Up and Link-Down event interrupts */
   1149	ndev->int_mask &= ~(AMD_LINK_UP_EVENT | AMD_LINK_DOWN_EVENT);
   1150	writel(ndev->int_mask, mmio + AMD_INTMASK_OFFSET);
   1151
   1152	return 0;
   1153}
   1154
   1155static void amd_deinit_dev(struct amd_ntb_dev *ndev)
   1156{
   1157	cancel_delayed_work_sync(&ndev->hb_timer);
   1158
   1159	ndev_deinit_isr(ndev);
   1160}
   1161
   1162static int amd_ntb_init_pci(struct amd_ntb_dev *ndev,
   1163			    struct pci_dev *pdev)
   1164{
   1165	int rc;
   1166
   1167	pci_set_drvdata(pdev, ndev);
   1168
   1169	rc = pci_enable_device(pdev);
   1170	if (rc)
   1171		goto err_pci_enable;
   1172
   1173	rc = pci_request_regions(pdev, NTB_NAME);
   1174	if (rc)
   1175		goto err_pci_regions;
   1176
   1177	pci_set_master(pdev);
   1178
   1179	rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
   1180	if (rc) {
   1181		rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
   1182		if (rc)
   1183			goto err_dma_mask;
   1184		dev_warn(&pdev->dev, "Cannot DMA highmem\n");
   1185	}
   1186
   1187	ndev->self_mmio = pci_iomap(pdev, 0, 0);
   1188	if (!ndev->self_mmio) {
   1189		rc = -EIO;
   1190		goto err_dma_mask;
   1191	}
   1192	ndev->peer_mmio = ndev->self_mmio + AMD_PEER_OFFSET;
   1193
   1194	return 0;
   1195
   1196err_dma_mask:
   1197	pci_clear_master(pdev);
   1198	pci_release_regions(pdev);
   1199err_pci_regions:
   1200	pci_disable_device(pdev);
   1201err_pci_enable:
   1202	pci_set_drvdata(pdev, NULL);
   1203	return rc;
   1204}
   1205
   1206static void amd_ntb_deinit_pci(struct amd_ntb_dev *ndev)
   1207{
   1208	struct pci_dev *pdev = ndev->ntb.pdev;
   1209
   1210	pci_iounmap(pdev, ndev->self_mmio);
   1211
   1212	pci_clear_master(pdev);
   1213	pci_release_regions(pdev);
   1214	pci_disable_device(pdev);
   1215	pci_set_drvdata(pdev, NULL);
   1216}
   1217
   1218static int amd_ntb_pci_probe(struct pci_dev *pdev,
   1219			     const struct pci_device_id *id)
   1220{
   1221	struct amd_ntb_dev *ndev;
   1222	int rc, node;
   1223
   1224	node = dev_to_node(&pdev->dev);
   1225
   1226	ndev = kzalloc_node(sizeof(*ndev), GFP_KERNEL, node);
   1227	if (!ndev) {
   1228		rc = -ENOMEM;
   1229		goto err_ndev;
   1230	}
   1231
   1232	ndev->dev_data = (struct ntb_dev_data *)id->driver_data;
   1233
   1234	ndev_init_struct(ndev, pdev);
   1235
   1236	rc = amd_ntb_init_pci(ndev, pdev);
   1237	if (rc)
   1238		goto err_init_pci;
   1239
   1240	rc = amd_init_dev(ndev);
   1241	if (rc)
   1242		goto err_init_dev;
   1243
   1244	/* write side info */
   1245	amd_init_side_info(ndev);
   1246
   1247	amd_poll_link(ndev);
   1248
   1249	ndev_init_debugfs(ndev);
   1250
   1251	rc = ntb_register_device(&ndev->ntb);
   1252	if (rc)
   1253		goto err_register;
   1254
   1255	dev_info(&pdev->dev, "NTB device registered.\n");
   1256
   1257	return 0;
   1258
   1259err_register:
   1260	ndev_deinit_debugfs(ndev);
   1261	amd_deinit_dev(ndev);
   1262err_init_dev:
   1263	amd_ntb_deinit_pci(ndev);
   1264err_init_pci:
   1265	kfree(ndev);
   1266err_ndev:
   1267	return rc;
   1268}
   1269
   1270static void amd_ntb_pci_remove(struct pci_dev *pdev)
   1271{
   1272	struct amd_ntb_dev *ndev = pci_get_drvdata(pdev);
   1273
   1274	/*
   1275	 * Clear the READY bit in SIDEINFO register before sending DB event
   1276	 * to the peer. This will make sure that when the peer handles the
   1277	 * DB event, it correctly reads this bit as being 0.
   1278	 */
   1279	amd_deinit_side_info(ndev);
   1280	ntb_peer_db_set(&ndev->ntb, BIT_ULL(ndev->db_last_bit));
   1281	ntb_unregister_device(&ndev->ntb);
   1282	ndev_deinit_debugfs(ndev);
   1283	amd_deinit_dev(ndev);
   1284	amd_ntb_deinit_pci(ndev);
   1285	kfree(ndev);
   1286}
   1287
   1288static void amd_ntb_pci_shutdown(struct pci_dev *pdev)
   1289{
   1290	struct amd_ntb_dev *ndev = pci_get_drvdata(pdev);
   1291
   1292	/* Send link down notification */
   1293	ntb_link_event(&ndev->ntb);
   1294
   1295	amd_deinit_side_info(ndev);
   1296	ntb_peer_db_set(&ndev->ntb, BIT_ULL(ndev->db_last_bit));
   1297	ntb_unregister_device(&ndev->ntb);
   1298	ndev_deinit_debugfs(ndev);
   1299	amd_deinit_dev(ndev);
   1300	amd_ntb_deinit_pci(ndev);
   1301	kfree(ndev);
   1302}
   1303
   1304static const struct file_operations amd_ntb_debugfs_info = {
   1305	.owner = THIS_MODULE,
   1306	.open = simple_open,
   1307	.read = ndev_debugfs_read,
   1308};
   1309
   1310static const struct ntb_dev_data dev_data[] = {
   1311	{ /* for device 145b */
   1312		.mw_count = 3,
   1313		.mw_idx = 1,
   1314	},
   1315	{ /* for device 148b */
   1316		.mw_count = 2,
   1317		.mw_idx = 2,
   1318	},
   1319};
   1320
   1321static const struct pci_device_id amd_ntb_pci_tbl[] = {
   1322	{ PCI_VDEVICE(AMD, 0x145b), (kernel_ulong_t)&dev_data[0] },
   1323	{ PCI_VDEVICE(AMD, 0x148b), (kernel_ulong_t)&dev_data[1] },
   1324	{ PCI_VDEVICE(AMD, 0x14c0), (kernel_ulong_t)&dev_data[1] },
   1325	{ PCI_VDEVICE(AMD, 0x14c3), (kernel_ulong_t)&dev_data[1] },
   1326	{ PCI_VDEVICE(HYGON, 0x145b), (kernel_ulong_t)&dev_data[0] },
   1327	{ 0, }
   1328};
   1329MODULE_DEVICE_TABLE(pci, amd_ntb_pci_tbl);
   1330
   1331static struct pci_driver amd_ntb_pci_driver = {
   1332	.name		= KBUILD_MODNAME,
   1333	.id_table	= amd_ntb_pci_tbl,
   1334	.probe		= amd_ntb_pci_probe,
   1335	.remove		= amd_ntb_pci_remove,
   1336	.shutdown	= amd_ntb_pci_shutdown,
   1337};
   1338
   1339static int __init amd_ntb_pci_driver_init(void)
   1340{
   1341	pr_info("%s %s\n", NTB_DESC, NTB_VER);
   1342
   1343	if (debugfs_initialized())
   1344		debugfs_dir = debugfs_create_dir(KBUILD_MODNAME, NULL);
   1345
   1346	return pci_register_driver(&amd_ntb_pci_driver);
   1347}
   1348module_init(amd_ntb_pci_driver_init);
   1349
   1350static void __exit amd_ntb_pci_driver_exit(void)
   1351{
   1352	pci_unregister_driver(&amd_ntb_pci_driver);
   1353	debugfs_remove_recursive(debugfs_dir);
   1354}
   1355module_exit(amd_ntb_pci_driver_exit);