The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/ntb/ntb_hw/ntb_hw_amd.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    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) 2019 Advanced Micro Devices, Inc.
    8  *
    9  * This program is free software; you can redistribute it and/or modify
   10  * it under the terms of version 2 of the GNU General Public License as
   11  * published by the Free Software Foundation.
   12  *
   13  * BSD LICENSE
   14  *
   15  * Copyright (C) 2019 Advanced Micro Devices, Inc.
   16  *
   17  * Redistribution and use in source and binary forms, with or without
   18  * modification, are permitted provided that the following conditions
   19  * are met:
   20  * 1. Redistributions of source code must retain the above copyright
   21  *    notice, this list of conditions and the following disclaimer.
   22  * 2. Redistributions in binary form must reproduce the above copy
   23  *    notice, this list of conditions and the following disclaimer in
   24  *    the documentation and/or other materials provided with the distribution.
   25  * 3. Neither the name of AMD corporation nor the names of its
   26  *    contributors may be used to endorse or promote products derived
   27  *    from this software without specific prior written permission.
   28  *
   29  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
   30  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
   31  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
   32  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
   33  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   34  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   35  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   36  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   37  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   38  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
   39  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   40  *
   41  * Contact Information :
   42  * Rajesh Kumar <rajesh1.kumar@amd.com>
   43  *
   44  * $FreeBSD$
   45  */
   46 
   47 #ifndef NTB_HW_AMD_H
   48 #define NTB_HW_AMD_H
   49 
   50 #define NTB_HW_AMD_VENDOR_ID    0x1022
   51 #define NTB_HW_AMD_DEVICE_ID1   0x145B
   52 #define NTB_HW_AMD_DEVICE_ID2   0x148B
   53 
   54 #define NTB_HW_HYGON_VENDOR_ID  0x19D4
   55 #define NTB_HW_HYGON_DEVICE_ID1 0x145B
   56 
   57 #define NTB_DEF_PEER_CNT        1
   58 #define NTB_DEF_PEER_IDX        0
   59 
   60 #define BIT(n)                  (1 << n)
   61 #define AMD_LINK_HB_TIMEOUT     (1 * hz)
   62 
   63 #define NTB_LIN_STA_ACTIVE_BIT  0x00000002
   64 #define NTB_LNK_STA_SPEED_MASK  0x000F0000
   65 #define NTB_LNK_STA_WIDTH_MASK  0x03F00000
   66 #define NTB_LNK_STA_ACTIVE(x)   (!!((x) & NTB_LIN_STA_ACTIVE_BIT))
   67 #define NTB_LNK_STA_SPEED(x)    (((x) & NTB_LNK_STA_SPEED_MASK) >> 16)
   68 #define NTB_LNK_STA_WIDTH(x)    (((x) & NTB_LNK_STA_WIDTH_MASK) >> 20)
   69 
   70 #define amd_ntb_bar_read(SIZE, bar, offset) \
   71             bus_space_read_ ## SIZE (ntb->bar_info[(bar)].pci_bus_tag, \
   72             ntb->bar_info[(bar)].pci_bus_handle, (offset))
   73 #define amd_ntb_bar_write(SIZE, bar, offset, val) \
   74             bus_space_write_ ## SIZE (ntb->bar_info[(bar)].pci_bus_tag, \
   75             ntb->bar_info[(bar)].pci_bus_handle, (offset), (val))
   76 #define amd_ntb_reg_read(SIZE, offset) \
   77             amd_ntb_bar_read(SIZE, NTB_CONFIG_BAR, offset)
   78 #define amd_ntb_reg_write(SIZE, offset, val) \
   79             amd_ntb_bar_write(SIZE, NTB_CONFIG_BAR, offset, val)
   80 #define amd_ntb_peer_reg_read(SIZE, offset) \
   81             amd_ntb_bar_read(SIZE, NTB_CONFIG_BAR, offset + AMD_PEER_OFFSET)
   82 #define amd_ntb_peer_reg_write(SIZE, offset, val) \
   83             amd_ntb_bar_write(SIZE, NTB_CONFIG_BAR, offset + AMD_PEER_OFFSET, val)
   84 
   85 #define DB_MASK_LOCK(sc)        mtx_lock_spin(&(sc)->db_mask_lock)
   86 #define DB_MASK_UNLOCK(sc)      mtx_unlock_spin(&(sc)->db_mask_lock)
   87 #define DB_MASK_ASSERT(sc, f)   mtx_assert(&(sc)->db_mask_lock, (f))
   88 
   89 #define QUIRK_MW0_32BIT 0x01
   90 
   91 /* amd_ntb_conn_type are hardware numbers, cannot change. */
   92 enum amd_ntb_conn_type {
   93         NTB_CONN_NONE = -1,
   94         NTB_CONN_PRI,
   95         NTB_CONN_SEC,
   96 };
   97 
   98 enum ntb_default_port {
   99         NTB_PORT_PRI_USD,
  100         NTB_PORT_SEC_DSD
  101 };
  102 
  103 enum amd_ntb_bar {
  104         NTB_CONFIG_BAR = 0,
  105         NTB_BAR_1,
  106         NTB_BAR_2,
  107         NTB_BAR_3,
  108         NTB_MAX_BARS
  109 };
  110 
  111 struct amd_ntb_hw_info {
  112         uint16_t vendor_id;
  113         uint16_t device_id;
  114         uint8_t  mw_count;
  115         uint8_t  bar_start_idx;
  116         uint8_t  spad_count;
  117         uint8_t  db_count;
  118         uint8_t  msix_vector_count;
  119         uint8_t  quirks;
  120         char     *desc;
  121 };
  122 
  123 struct amd_ntb_pci_bar_info {
  124         bus_space_tag_t         pci_bus_tag;
  125         bus_space_handle_t      pci_bus_handle;
  126         struct resource         *pci_resource;
  127         vm_paddr_t              pbase;
  128         caddr_t                 vbase;
  129         vm_size_t               size;
  130         vm_memattr_t            map_mode;
  131         int                     pci_resource_id;
  132 
  133         /* Configuration register offsets */
  134         uint32_t                xlat_off;
  135         uint32_t                limit_off;
  136 };
  137 
  138 struct amd_ntb_int_info {
  139         struct resource *res;
  140         void            *tag;
  141         int             rid;
  142 };
  143 
  144 struct amd_ntb_vec {
  145         struct amd_ntb_softc    *ntb;
  146         uint32_t                num;
  147         unsigned                masked;
  148 };
  149 
  150 enum {
  151         /* AMD NTB Link Status Offset */
  152         AMD_LINK_STATUS_OFFSET  = 0x68,
  153 
  154         /*  AMD NTB register offset */
  155         AMD_CNTL_OFFSET         = 0x200,
  156 
  157         /* NTB control register bits */
  158         PMM_REG_CTL             = BIT(21),
  159         SMM_REG_CTL             = BIT(20),
  160         SMM_REG_ACC_PATH        = BIT(18),
  161         PMM_REG_ACC_PATH        = BIT(17),
  162         NTB_CLK_EN              = BIT(16),
  163 
  164         AMD_STA_OFFSET          = 0x204,
  165         AMD_PGSLV_OFFSET        = 0x208,
  166         AMD_SPAD_MUX_OFFSET     = 0x20C,
  167         AMD_SPAD_OFFSET         = 0x210,
  168         AMD_RSMU_HCID           = 0x250,
  169         AMD_RSMU_SIID           = 0x254,
  170         AMD_PSION_OFFSET        = 0x300,
  171         AMD_SSION_OFFSET        = 0x330,
  172         AMD_MMINDEX_OFFSET      = 0x400,
  173         AMD_MMDATA_OFFSET       = 0x404,
  174         AMD_SIDEINFO_OFFSET     = 0x408,
  175 
  176         AMD_SIDE_MASK           = BIT(0),
  177         AMD_SIDE_READY          = BIT(1),
  178 
  179         /* limit register */
  180         AMD_ROMBARLMT_OFFSET    = 0x410,
  181         AMD_BAR1LMT_OFFSET      = 0x414,
  182         AMD_BAR23LMT_OFFSET     = 0x418,
  183         AMD_BAR45LMT_OFFSET     = 0x420,
  184 
  185         /* xlat address */
  186         AMD_ROMBARXLAT_OFFSET   = 0x428,
  187         AMD_BAR1XLAT_OFFSET     = 0x430,
  188         AMD_BAR23XLAT_OFFSET    = 0x438,
  189         AMD_BAR45XLAT_OFFSET    = 0x440,
  190 
  191         /* doorbell and interrupt */
  192         AMD_DBFM_OFFSET         = 0x450,
  193         AMD_DBREQ_OFFSET        = 0x454,
  194         AMD_MIRRDBSTAT_OFFSET   = 0x458,
  195         AMD_DBMASK_OFFSET       = 0x45C,
  196         AMD_DBSTAT_OFFSET       = 0x460,
  197         AMD_INTMASK_OFFSET      = 0x470,
  198         AMD_INTSTAT_OFFSET      = 0x474,
  199 
  200         /* event type */
  201         AMD_PEER_FLUSH_EVENT    = BIT(0),
  202         AMD_PEER_RESET_EVENT    = BIT(1),
  203         AMD_PEER_D3_EVENT       = BIT(2),
  204         AMD_PEER_PMETO_EVENT    = BIT(3),
  205         AMD_PEER_D0_EVENT       = BIT(4),
  206         AMD_LINK_UP_EVENT       = BIT(5),
  207         AMD_LINK_DOWN_EVENT     = BIT(6),
  208         AMD_EVENT_INTMASK       = (AMD_PEER_FLUSH_EVENT |
  209                                 AMD_PEER_RESET_EVENT | AMD_PEER_D3_EVENT |
  210                                 AMD_PEER_PMETO_EVENT | AMD_PEER_D0_EVENT |
  211                                 AMD_LINK_UP_EVENT | AMD_LINK_DOWN_EVENT),
  212 
  213         AMD_PMESTAT_OFFSET      = 0x480,
  214         AMD_PMSGTRIG_OFFSET     = 0x490,
  215         AMD_LTRLATENCY_OFFSET   = 0x494,
  216         AMD_FLUSHTRIG_OFFSET    = 0x498,
  217 
  218         /* SMU register*/
  219         AMD_SMUACK_OFFSET       = 0x4A0,
  220         AMD_SINRST_OFFSET       = 0x4A4,
  221         AMD_RSPNUM_OFFSET       = 0x4A8,
  222         AMD_SMU_SPADMUTEX       = 0x4B0,
  223         AMD_SMU_SPADOFFSET      = 0x4B4,
  224 
  225         AMD_PEER_OFFSET         = 0x400,
  226 };
  227 
  228 struct amd_ntb_softc {
  229         /* ntb.c context. Do not move! Must go first! */
  230         void                    *ntb_store;
  231 
  232         device_t                device;
  233         enum amd_ntb_conn_type  conn_type;
  234 
  235         struct amd_ntb_pci_bar_info     bar_info[NTB_MAX_BARS];
  236         struct amd_ntb_int_info int_info[16];
  237         struct amd_ntb_vec      *msix_vec;
  238         uint16_t                allocated_interrupts;
  239 
  240         struct callout          hb_timer;
  241 
  242         struct amd_ntb_hw_info  *hw_info;
  243         uint8_t                 spad_count;
  244         uint8_t                 msix_vec_count;
  245 
  246         struct mtx              db_mask_lock;
  247 
  248         volatile uint32_t       ntb_ctl;
  249         volatile uint32_t       lnk_sta;
  250         volatile uint32_t       peer_sta;
  251         volatile uint32_t       cntl_sta;
  252 
  253         uint16_t                db_valid_mask;
  254         uint16_t                db_mask;
  255         uint32_t                int_mask;
  256 
  257         unsigned int            self_spad;
  258         unsigned int            peer_spad;
  259 };
  260 
  261 static void amd_init_side_info(struct amd_ntb_softc *ntb);
  262 static void amd_deinit_side_info(struct amd_ntb_softc *ntb);
  263 static int amd_ntb_detach(device_t device);
  264 
  265 #endif

Cache object: a6226d133b9556434fc18bc046c8fee5


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.