16683132dSAlexander Motin /*- 26683132dSAlexander Motin * This file is provided under a dual BSD/GPLv2 license. When using or 36683132dSAlexander Motin * redistributing this file, you may do so under either license. 46683132dSAlexander Motin * 56683132dSAlexander Motin * GPL LICENSE SUMMARY 66683132dSAlexander Motin * 76683132dSAlexander Motin * Copyright (C) 2019 Advanced Micro Devices, Inc. 86683132dSAlexander Motin * 96683132dSAlexander Motin * This program is free software; you can redistribute it and/or modify 106683132dSAlexander Motin * it under the terms of version 2 of the GNU General Public License as 116683132dSAlexander Motin * published by the Free Software Foundation. 126683132dSAlexander Motin * 136683132dSAlexander Motin * BSD LICENSE 146683132dSAlexander Motin * 156683132dSAlexander Motin * Copyright (C) 2019 Advanced Micro Devices, Inc. 166683132dSAlexander Motin * 176683132dSAlexander Motin * Redistribution and use in source and binary forms, with or without 186683132dSAlexander Motin * modification, are permitted provided that the following conditions 196683132dSAlexander Motin * are met: 206683132dSAlexander Motin * 1. Redistributions of source code must retain the above copyright 216683132dSAlexander Motin * notice, this list of conditions and the following disclaimer. 226683132dSAlexander Motin * 2. Redistributions in binary form must reproduce the above copy 236683132dSAlexander Motin * notice, this list of conditions and the following disclaimer in 246683132dSAlexander Motin * the documentation and/or other materials provided with the distribution. 256683132dSAlexander Motin * 3. Neither the name of AMD corporation nor the names of its 266683132dSAlexander Motin * contributors may be used to endorse or promote products derived 276683132dSAlexander Motin * from this software without specific prior written permission. 286683132dSAlexander Motin * 296683132dSAlexander Motin * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 306683132dSAlexander Motin * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 316683132dSAlexander Motin * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 326683132dSAlexander Motin * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 336683132dSAlexander Motin * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 346683132dSAlexander Motin * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 356683132dSAlexander Motin * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 366683132dSAlexander Motin * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 376683132dSAlexander Motin * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 386683132dSAlexander Motin * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 396683132dSAlexander Motin * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 406683132dSAlexander Motin * 416683132dSAlexander Motin * Contact Information : 426683132dSAlexander Motin * Rajesh Kumar <rajesh1.kumar@amd.com> 436683132dSAlexander Motin */ 446683132dSAlexander Motin 456683132dSAlexander Motin #ifndef NTB_HW_AMD_H 466683132dSAlexander Motin #define NTB_HW_AMD_H 476683132dSAlexander Motin 486683132dSAlexander Motin #define NTB_HW_AMD_VENDOR_ID 0x1022 49e67b1223SAlexander Motin #define NTB_HW_AMD_DEVICE_ID1 0x145B 50e67b1223SAlexander Motin #define NTB_HW_AMD_DEVICE_ID2 0x148B 516683132dSAlexander Motin 520d9cef0aSAlexander Motin #define NTB_HW_HYGON_VENDOR_ID 0x19D4 530d9cef0aSAlexander Motin #define NTB_HW_HYGON_DEVICE_ID1 0x145B 540d9cef0aSAlexander Motin 556683132dSAlexander Motin #define NTB_DEF_PEER_CNT 1 566683132dSAlexander Motin #define NTB_DEF_PEER_IDX 0 576683132dSAlexander Motin 586683132dSAlexander Motin #define BIT(n) (1 << n) 596683132dSAlexander Motin #define AMD_LINK_HB_TIMEOUT (1 * hz) 606683132dSAlexander Motin 616683132dSAlexander Motin #define NTB_LIN_STA_ACTIVE_BIT 0x00000002 626683132dSAlexander Motin #define NTB_LNK_STA_SPEED_MASK 0x000F0000 636683132dSAlexander Motin #define NTB_LNK_STA_WIDTH_MASK 0x03F00000 646683132dSAlexander Motin #define NTB_LNK_STA_ACTIVE(x) (!!((x) & NTB_LIN_STA_ACTIVE_BIT)) 656683132dSAlexander Motin #define NTB_LNK_STA_SPEED(x) (((x) & NTB_LNK_STA_SPEED_MASK) >> 16) 666683132dSAlexander Motin #define NTB_LNK_STA_WIDTH(x) (((x) & NTB_LNK_STA_WIDTH_MASK) >> 20) 676683132dSAlexander Motin 686683132dSAlexander Motin #define amd_ntb_bar_read(SIZE, bar, offset) \ 696683132dSAlexander Motin bus_space_read_ ## SIZE (ntb->bar_info[(bar)].pci_bus_tag, \ 706683132dSAlexander Motin ntb->bar_info[(bar)].pci_bus_handle, (offset)) 716683132dSAlexander Motin #define amd_ntb_bar_write(SIZE, bar, offset, val) \ 726683132dSAlexander Motin bus_space_write_ ## SIZE (ntb->bar_info[(bar)].pci_bus_tag, \ 736683132dSAlexander Motin ntb->bar_info[(bar)].pci_bus_handle, (offset), (val)) 746683132dSAlexander Motin #define amd_ntb_reg_read(SIZE, offset) \ 756683132dSAlexander Motin amd_ntb_bar_read(SIZE, NTB_CONFIG_BAR, offset) 766683132dSAlexander Motin #define amd_ntb_reg_write(SIZE, offset, val) \ 776683132dSAlexander Motin amd_ntb_bar_write(SIZE, NTB_CONFIG_BAR, offset, val) 786683132dSAlexander Motin #define amd_ntb_peer_reg_read(SIZE, offset) \ 796683132dSAlexander Motin amd_ntb_bar_read(SIZE, NTB_CONFIG_BAR, offset + AMD_PEER_OFFSET) 806683132dSAlexander Motin #define amd_ntb_peer_reg_write(SIZE, offset, val) \ 816683132dSAlexander Motin amd_ntb_bar_write(SIZE, NTB_CONFIG_BAR, offset + AMD_PEER_OFFSET, val) 826683132dSAlexander Motin 836683132dSAlexander Motin #define DB_MASK_LOCK(sc) mtx_lock_spin(&(sc)->db_mask_lock) 846683132dSAlexander Motin #define DB_MASK_UNLOCK(sc) mtx_unlock_spin(&(sc)->db_mask_lock) 856683132dSAlexander Motin #define DB_MASK_ASSERT(sc, f) mtx_assert(&(sc)->db_mask_lock, (f)) 866683132dSAlexander Motin 87e67b1223SAlexander Motin #define QUIRK_MW0_32BIT 0x01 88e67b1223SAlexander Motin 896683132dSAlexander Motin /* amd_ntb_conn_type are hardware numbers, cannot change. */ 906683132dSAlexander Motin enum amd_ntb_conn_type { 916683132dSAlexander Motin NTB_CONN_NONE = -1, 926683132dSAlexander Motin NTB_CONN_PRI, 936683132dSAlexander Motin NTB_CONN_SEC, 946683132dSAlexander Motin }; 956683132dSAlexander Motin 966683132dSAlexander Motin enum ntb_default_port { 976683132dSAlexander Motin NTB_PORT_PRI_USD, 986683132dSAlexander Motin NTB_PORT_SEC_DSD 996683132dSAlexander Motin }; 1006683132dSAlexander Motin 1016683132dSAlexander Motin enum amd_ntb_bar { 1026683132dSAlexander Motin NTB_CONFIG_BAR = 0, 1036683132dSAlexander Motin NTB_BAR_1, 1046683132dSAlexander Motin NTB_BAR_2, 1056683132dSAlexander Motin NTB_BAR_3, 1066683132dSAlexander Motin NTB_MAX_BARS 1076683132dSAlexander Motin }; 1086683132dSAlexander Motin 1096683132dSAlexander Motin struct amd_ntb_hw_info { 110e67b1223SAlexander Motin uint16_t vendor_id; 111e67b1223SAlexander Motin uint16_t device_id; 112e67b1223SAlexander Motin uint8_t mw_count; 113e67b1223SAlexander Motin uint8_t bar_start_idx; 114e67b1223SAlexander Motin uint8_t spad_count; 115e67b1223SAlexander Motin uint8_t db_count; 116e67b1223SAlexander Motin uint8_t msix_vector_count; 117e67b1223SAlexander Motin uint8_t quirks; 118e67b1223SAlexander Motin char *desc; 1196683132dSAlexander Motin }; 1206683132dSAlexander Motin 1216683132dSAlexander Motin struct amd_ntb_pci_bar_info { 1226683132dSAlexander Motin bus_space_tag_t pci_bus_tag; 1236683132dSAlexander Motin bus_space_handle_t pci_bus_handle; 1246683132dSAlexander Motin struct resource *pci_resource; 1256683132dSAlexander Motin vm_paddr_t pbase; 1266683132dSAlexander Motin caddr_t vbase; 1276683132dSAlexander Motin vm_size_t size; 1286683132dSAlexander Motin vm_memattr_t map_mode; 1296683132dSAlexander Motin int pci_resource_id; 1306683132dSAlexander Motin 1316683132dSAlexander Motin /* Configuration register offsets */ 1326683132dSAlexander Motin uint32_t xlat_off; 1336683132dSAlexander Motin uint32_t limit_off; 1346683132dSAlexander Motin }; 1356683132dSAlexander Motin 1366683132dSAlexander Motin struct amd_ntb_int_info { 1376683132dSAlexander Motin struct resource *res; 1386683132dSAlexander Motin void *tag; 1396683132dSAlexander Motin int rid; 1406683132dSAlexander Motin }; 1416683132dSAlexander Motin 1426683132dSAlexander Motin struct amd_ntb_vec { 1436683132dSAlexander Motin struct amd_ntb_softc *ntb; 1446683132dSAlexander Motin uint32_t num; 1456683132dSAlexander Motin unsigned masked; 1466683132dSAlexander Motin }; 1476683132dSAlexander Motin 1486683132dSAlexander Motin enum { 1496683132dSAlexander Motin /* AMD NTB Link Status Offset */ 1506683132dSAlexander Motin AMD_LINK_STATUS_OFFSET = 0x68, 1516683132dSAlexander Motin 1526683132dSAlexander Motin /* AMD NTB register offset */ 1536683132dSAlexander Motin AMD_CNTL_OFFSET = 0x200, 1546683132dSAlexander Motin 1556683132dSAlexander Motin /* NTB control register bits */ 1566683132dSAlexander Motin PMM_REG_CTL = BIT(21), 1576683132dSAlexander Motin SMM_REG_CTL = BIT(20), 1586683132dSAlexander Motin SMM_REG_ACC_PATH = BIT(18), 1596683132dSAlexander Motin PMM_REG_ACC_PATH = BIT(17), 1606683132dSAlexander Motin NTB_CLK_EN = BIT(16), 1616683132dSAlexander Motin 1626683132dSAlexander Motin AMD_STA_OFFSET = 0x204, 1636683132dSAlexander Motin AMD_PGSLV_OFFSET = 0x208, 1646683132dSAlexander Motin AMD_SPAD_MUX_OFFSET = 0x20C, 1656683132dSAlexander Motin AMD_SPAD_OFFSET = 0x210, 1666683132dSAlexander Motin AMD_RSMU_HCID = 0x250, 1676683132dSAlexander Motin AMD_RSMU_SIID = 0x254, 1686683132dSAlexander Motin AMD_PSION_OFFSET = 0x300, 1696683132dSAlexander Motin AMD_SSION_OFFSET = 0x330, 1706683132dSAlexander Motin AMD_MMINDEX_OFFSET = 0x400, 1716683132dSAlexander Motin AMD_MMDATA_OFFSET = 0x404, 1726683132dSAlexander Motin AMD_SIDEINFO_OFFSET = 0x408, 1736683132dSAlexander Motin 1746683132dSAlexander Motin AMD_SIDE_MASK = BIT(0), 1756683132dSAlexander Motin AMD_SIDE_READY = BIT(1), 1766683132dSAlexander Motin 1776683132dSAlexander Motin /* limit register */ 1786683132dSAlexander Motin AMD_ROMBARLMT_OFFSET = 0x410, 1796683132dSAlexander Motin AMD_BAR1LMT_OFFSET = 0x414, 1806683132dSAlexander Motin AMD_BAR23LMT_OFFSET = 0x418, 1816683132dSAlexander Motin AMD_BAR45LMT_OFFSET = 0x420, 1826683132dSAlexander Motin 1836683132dSAlexander Motin /* xlat address */ 1846683132dSAlexander Motin AMD_ROMBARXLAT_OFFSET = 0x428, 1856683132dSAlexander Motin AMD_BAR1XLAT_OFFSET = 0x430, 1866683132dSAlexander Motin AMD_BAR23XLAT_OFFSET = 0x438, 1876683132dSAlexander Motin AMD_BAR45XLAT_OFFSET = 0x440, 1886683132dSAlexander Motin 1896683132dSAlexander Motin /* doorbell and interrupt */ 1906683132dSAlexander Motin AMD_DBFM_OFFSET = 0x450, 1916683132dSAlexander Motin AMD_DBREQ_OFFSET = 0x454, 1926683132dSAlexander Motin AMD_MIRRDBSTAT_OFFSET = 0x458, 1936683132dSAlexander Motin AMD_DBMASK_OFFSET = 0x45C, 1946683132dSAlexander Motin AMD_DBSTAT_OFFSET = 0x460, 1956683132dSAlexander Motin AMD_INTMASK_OFFSET = 0x470, 1966683132dSAlexander Motin AMD_INTSTAT_OFFSET = 0x474, 1976683132dSAlexander Motin 1986683132dSAlexander Motin /* event type */ 1996683132dSAlexander Motin AMD_PEER_FLUSH_EVENT = BIT(0), 2006683132dSAlexander Motin AMD_PEER_RESET_EVENT = BIT(1), 2016683132dSAlexander Motin AMD_PEER_D3_EVENT = BIT(2), 2026683132dSAlexander Motin AMD_PEER_PMETO_EVENT = BIT(3), 2036683132dSAlexander Motin AMD_PEER_D0_EVENT = BIT(4), 2046683132dSAlexander Motin AMD_LINK_UP_EVENT = BIT(5), 2056683132dSAlexander Motin AMD_LINK_DOWN_EVENT = BIT(6), 2066683132dSAlexander Motin AMD_EVENT_INTMASK = (AMD_PEER_FLUSH_EVENT | 2076683132dSAlexander Motin AMD_PEER_RESET_EVENT | AMD_PEER_D3_EVENT | 2086683132dSAlexander Motin AMD_PEER_PMETO_EVENT | AMD_PEER_D0_EVENT | 2096683132dSAlexander Motin AMD_LINK_UP_EVENT | AMD_LINK_DOWN_EVENT), 2106683132dSAlexander Motin 2116683132dSAlexander Motin AMD_PMESTAT_OFFSET = 0x480, 2126683132dSAlexander Motin AMD_PMSGTRIG_OFFSET = 0x490, 2136683132dSAlexander Motin AMD_LTRLATENCY_OFFSET = 0x494, 2146683132dSAlexander Motin AMD_FLUSHTRIG_OFFSET = 0x498, 2156683132dSAlexander Motin 2166683132dSAlexander Motin /* SMU register*/ 2176683132dSAlexander Motin AMD_SMUACK_OFFSET = 0x4A0, 2186683132dSAlexander Motin AMD_SINRST_OFFSET = 0x4A4, 2196683132dSAlexander Motin AMD_RSPNUM_OFFSET = 0x4A8, 2206683132dSAlexander Motin AMD_SMU_SPADMUTEX = 0x4B0, 2216683132dSAlexander Motin AMD_SMU_SPADOFFSET = 0x4B4, 2226683132dSAlexander Motin 2236683132dSAlexander Motin AMD_PEER_OFFSET = 0x400, 2246683132dSAlexander Motin }; 2256683132dSAlexander Motin 2266683132dSAlexander Motin struct amd_ntb_softc { 2276683132dSAlexander Motin /* ntb.c context. Do not move! Must go first! */ 2286683132dSAlexander Motin void *ntb_store; 2296683132dSAlexander Motin 2306683132dSAlexander Motin device_t device; 2316683132dSAlexander Motin enum amd_ntb_conn_type conn_type; 2326683132dSAlexander Motin 2336683132dSAlexander Motin struct amd_ntb_pci_bar_info bar_info[NTB_MAX_BARS]; 234e67b1223SAlexander Motin struct amd_ntb_int_info int_info[16]; 2356683132dSAlexander Motin struct amd_ntb_vec *msix_vec; 2366683132dSAlexander Motin uint16_t allocated_interrupts; 2376683132dSAlexander Motin 2386683132dSAlexander Motin struct callout hb_timer; 2396683132dSAlexander Motin 240e67b1223SAlexander Motin struct amd_ntb_hw_info *hw_info; 2416683132dSAlexander Motin uint8_t spad_count; 2426683132dSAlexander Motin uint8_t msix_vec_count; 2436683132dSAlexander Motin 2446683132dSAlexander Motin struct mtx db_mask_lock; 2456683132dSAlexander Motin 2466683132dSAlexander Motin volatile uint32_t ntb_ctl; 2476683132dSAlexander Motin volatile uint32_t lnk_sta; 2486683132dSAlexander Motin volatile uint32_t peer_sta; 2496683132dSAlexander Motin volatile uint32_t cntl_sta; 2506683132dSAlexander Motin 2516683132dSAlexander Motin uint16_t db_valid_mask; 2526683132dSAlexander Motin uint16_t db_mask; 2536683132dSAlexander Motin uint32_t int_mask; 2546683132dSAlexander Motin 2556683132dSAlexander Motin unsigned int self_spad; 2566683132dSAlexander Motin unsigned int peer_spad; 2576683132dSAlexander Motin }; 2586683132dSAlexander Motin 2596683132dSAlexander Motin static void amd_init_side_info(struct amd_ntb_softc *ntb); 2606683132dSAlexander Motin static void amd_deinit_side_info(struct amd_ntb_softc *ntb); 2616683132dSAlexander Motin static int amd_ntb_detach(device_t device); 2626683132dSAlexander Motin 2636683132dSAlexander Motin #endif 264