xref: /freebsd/sys/dev/ntb/ntb_hw/ntb_hw_amd.h (revision 95ee2897)
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