root/usr/src/uts/sun4u/sys/pci/db21554_config.h
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright (c) 1999 by Sun Microsystems, Inc.
 * All rights reserved.
 */

#ifndef _SYS_DB21554_CONFIG_H
#define _SYS_DB21554_CONFIG_H

#pragma ident   "%Z%%M% %I%     %E% SMI"

#ifdef  __cplusplus
extern "C" {
#endif

#include <sys/types.h>
#include <sys/pci.h>

#define DB_PCONF_PRI_HDR_OFF            0x00 /* primary offset on primary */
#define DB_PCONF_SEC_HDR_OFF            0x40 /* secondary offset on sec */
#define DB_SCONF_PRI_HDR_OFF            0x40 /* primary offset on sec */
#define DB_SCONF_SEC_HDR_OFF            0x00 /* secondary offset on sec */
#define DB_CONF_REGS                    0x80 /* configuration regs after hdrs */
#define DB_SCONF_HDR_OFF                0x40 /* second config hdr offset */

/*
 * Some register definitions for configuration header.
 */
#define DB_PCONF_MEM_CSR                PCI_CONF_BASE0
#define DB_PCONF_IO_CSR                 PCI_CONF_BASE1
#define DB_PCONF_DS_IO_MEM1             PCI_CONF_BASE2
#define DB_PCONF_DS_MEM2                PCI_CONF_BASE3
#define DB_PCONF_DS_MEM3                PCI_CONF_BASE4
#define DB_PCONF_DS_UMEM3               PCI_CONF_BASE5
#define DB_PCONF_EXP_ROM                PCI_CONF_ROM
#define DB_PCONF_US_IO_MEM0             DB_PCONF_SEC_HDR_OFF+PCI_CONF_BASE2
#define DB_PCONF_US_MEM1                DB_PCONF_SEC_HDR_OFF+PCI_CONF_BASE3
#define DB_PCONF_US_MEM2                DB_PCONF_SEC_HDR_OFF+PCI_CONF_BASE4

#define DB_SCONF_MEM_CSR                PCI_CONF_BASE0
#define DB_SCONF_IO_CSR                 PCI_CONF_BASE1
#define DB_SCONF_US_IO_MEM0             PCI_CONF_BASE2
#define DB_SCONF_US_MEM1                PCI_CONF_BASE3
#define DB_SCONF_US_MEM2                PCI_CONF_BASE4
#define DB_SCONF_DS_IO_MEM1             DB_SCONF_PRI_HDR_OFF+PCI_CONF_BASE2
#define DB_SCONF_DS_MEM2                DB_SCONF_PRI_HDR_OFF+PCI_CONF_BASE3
#define DB_SCONF_DS_MEM3                DB_PCONF_PRI_HDR_OFF+PCI_CONF_BASE4
#define DB_SCONF_DS_UMEM3               DB_PCONF_PRI_HDR_OFF+PCI_CONF_BASE5

#define DB_IO_BIT                       0x00000001

/* register definitions in configuration space after primary/sec. header */

#define DB_CONF_DS_CONF_ADDR            0x80 /* downstream config address */
#define DB_CONF_DS_CONF_DATA            0x84 /* downstream config data */
#define DB_CONF_US_CONF_ADDR            0x88 /* upstream config address */
#define DB_CONF_US_CONF_DATA            0x8C /* upstream config data */
#define DB_CONF_CONF_OWN                0x90 /* config own bits - word reg */
#define DB_CONF8_DS_CONF_OWN            0x90 /* config own bits - byte reg */
#define DB_CONF8_US_CONF_OWN            0x91 /* config own bits - byte reg */
#define DB_CONF_CONF_CSR                0x92 /* config control status - word */
#define DB_CONF8_DS_CONF_CSR            0x92 /* config DS CSR - byte reg */
#define DB_CONF8_US_CONF_CSR            0x93 /* config US CSR - byte reg */
#define DB_CONF_DS_MEM0_TR_BASE         0x94 /* DS memory 0 translated base */
#define DB_CONF_DS_IO_MEM1_TR_BASE      0x98 /* DS IO or mem 1 trans base */
#define DB_CONF_DS_MEM2_TR_BASE         0x9C /* DS memory 2 translated base */
#define DB_CONF_DS_MEM3_TR_BASE         0xA0 /* DS memory 3 translated base */
#define DB_CONF_US_IO_MEM0_TR_BASE      0xA4 /* DS IO or mem0 trans base */
#define DB_CONF_US_MEM1_TR_BASE         0xA8 /* US memory 1 translated base */
#define DB_CONF_DS_MEM0_SETUP           0xAC /* DS memory 0 setup */
#define DB_CONF_DS_IO_MEM1_SETUP        0xB0 /* DS IO or memory 1 setup */
#define DB_CONF_DS_MEM2_SETUP           0xB4 /* DS memory 2 setup */
#define DB_CONF_DS_MEM3_SETUP           0xB8 /* DS memory 3 setup */
#define DB_CONF_DS_UP32_MEM3_SETUP      0xBC /* Upper 32bits DS mem3 setup */
#define DB_CONF_PRIM_EXP_ROM_SETUP      0xC0 /* Primary Expansion ROM setup */
#define DB_CONF_US_IO_MEM0_SETUP        0xC4 /* Upstream IO or memory 0 setup */
#define DB_CONF_US_MEM1_SETUP           0xC8 /* upstream memory 1 setup */
#define DB_CONF_CHIP_CTRL0              0xCC /* chip control 0 */
#define DB_CONF_CHIP_CTRL1              0xCE /* chip control 1 */
#define DB_CONF_STATUS                  0xD0 /* chip status */
#define DB_CONF_ARBITER_CTRL            0xD2 /* Arbiter control */
#define DB_CONF_PRIM_SERR_DISABLES      0xD4 /* primary SERR# disables */
#define DB_CONF_SEC_SERR_DISABLES       0xD5 /* Secondary SERR# disables */
#define DB_CONF_RESET_CTRL              0xD8 /* Reset Control */
#define DB_CONF_CAP_ID_1                0xDC /* Capabilities ID */
#define DB_CONF_NEXT_ITEM_PTR_1         0xDD /* Next Item Pointer */
#define DB_CONF_PM_CAP                  0xDE /* Power Management Capabilities */
#define DB_CONF_PM_CSR                  0xE0 /* Power Management CSR */
#define DB_CONF_PM_CSR_BSE              0xE2 /* PMCSR Bridge Support Exts */
#define DB_CONF_PM_DATA                 0xE3 /* Power Management data */
#define DB_CONF_CAP_ID_2                0xE4 /* Capabilities ID */
#define DB_CONF_NEXT_ITEM_PTR_2         0xE5 /* Next Item Pointer */
#define DB_CONF_VPD_ADDRESS             0xE6 /* VPD Address */
#define DB_CONF_VPD_DATA                0xE8 /* VPD Data */
#define DB_CONF_CAP_ID_3                0xEC /* Capabilities ID */
#define DB_CONF_NEXT_ITEM_PTR_3         0xED /* Next Item Pointer */
#define DB_CONF_HS_CSR                  0xEE /* Hotswap control status */

#define DB_VENDOR_ID            0x1011
#define DB_DEVICE_ID            0x46
#define DB_INVAL_VEND           0xffff

/* configuration own register bits : Register offset 0x90-91 */
#define DS_CONF_OWN             0x0001 /* master owns DSconfig address/data */
#define US_CONF_OWN             0x0100 /* master owns USconfig address/data */
/* the following is a 8-bit register version definition. */
#define DS8_CONF_OWN            0x01
#define US8_CONF_OWN            0x01

/* configuration control status register bits: Register offset 0x92-93 */
#define DS_OWN_STAT             0x0001 /* downstream config own status */
#define DS_ENABLE               0x0002 /* enable downstream config cycles */
#define US_OWN_STAT             0x0100 /* upstream config own status */
#define US_ENABLE               0x0200 /* enable upstream config cycles */

/* chip control 0 register bits: Register Offset 0xcc-cd */
#define DELAYED_TRANS_ORDER     0x0040 /* delayed transaction order control */
#define SERR_FWD                0x0080 /* forward SERR# from sec to prim */
#define PLOCKOUT                0x0400 /* primary lockout set */
#define SEC_CLK_DIS             0x0800 /* disable secondary clock */

/* chip control 1 register bits: Register Offset 0xce-cf */
#define P_PW_THRESHOLD          0x0001
#define S_PW_THRESHOLD          0x0002
#define P_DREAD_THRESHOLD_MASK  0x000C
#define S_DREAD_THRESHOLD_MASK  0x0030
#define DREAD_THRESHOLD_VALBITS 0x3

#define US_MEM2_DISABLE         0x0000 /* disable USmem2 BAR */
#define PAGESIZE_256            0x0100
#define PAGESIZE_512            0x0200
#define PAGESIZE_1K             0x0300
#define PAGESIZE_2K             0x0400
#define PAGESIZE_4K             0x0500
#define PAGESIZE_8K             0x0600
#define PAGESIZE_16K            0x0700
#define PAGESIZE_32K            0x0800
#define PAGESIZE_64K            0x0900
#define PAGESIZE_128K           0x0A00
#define PAGESIZE_256K           0x0B00
#define PAGESIZE_512K           0x0C00
#define PAGESIZE_1M             0x0D00
#define PAGESIZE_2M             0x0E00
#define PAGESIZE_4M             0x0F00

#define GET_PAGESIZE(chip_ctrl1)        (((chip_ctrl1) & 0x0F00) >> 8)

/* chip reset control register bits : Register Offset 0xd8-db */
#define RESET_CTRL_RST_SEC      0x01 /* reset secondary */
#define RESET_CTRL_RST          0x02 /* reset chip */
#define RESET_CTRL_LSTAT        0x08 /* when set, l_stat is high */

/* chip status register bits : Register Offset 0xd0-d1 */
#define DS_DEL_MTO              0x0001 /* DS delayed master TO */
#define DS_DEL_RD_DISCARD       0x0002 /* DS delayed read discard */
#define DS_DEL_WR_DISCARD       0x0004 /* DS delayed write discard */
#define DS_POST_WRDATA_DISCA    0x0008
#define US_DEL_MTO              0x0100 /* US delayed trans master TO */
#define US_DEL_RD_DISCARD       0x0200 /* US delayed trans.read disc */
#define US_DEL_WR_DISCARD       0x0400 /* US delayed trans.writ disc */
#define US_POST_WRDATA_DISCA    0x0800

#define DB_PCI_REG_ADDR(bus, device, function, reg) \
        (((bus) & 0xff) << 16) | (((device & 0x1f)) << 11) \
                    | (((function) & 0x7) << 8) | ((reg) & 0xff)

/* form a type 0 configuration address */
#define DB_PCI_REG_ADDR_TYPE0(bus, device, function, reg) \
        (((1 << (device & 0x1f)) << 11) \
                    | (((function) & 0x7) << 8) | \
                    ((reg) & 0xfc))

/* form a type 1 configuration address */
#define DB_PCI_REG_ADDR_TYPE1(bus, device, function, reg) \
        ((((bus) & 0xff) << 16) | (((device & 0x1f)) << 11) \
                    | (((function) & 0x7) << 8) | ((reg) & 0xfc))


#define DB_ENABLE_PCI_CONF_CYCLE_TYPE0  0
#define DB_ENABLE_PCI_CONF_CYCLE_TYPE1  1

/*
 * add local address offsets and get the right config address double
 * word aligned type 0 format addresses.
 */
#define DB_PCI_CONF_CYCLE_TYPE0_ADDR(conf_addr) \
        (((conf_addr) & 0xfffffffc) | DB_ENABLE_PCI_CONF_CYCLE_TYPE0)

/*
 * add local address offsets and get the right config address double
 * word aligned type 1 format addresses.
 */
#define DB_PCI_CONF_CYCLE_TYPE1_ADDR(conf_addr) \
        (((conf_addr)  & 0xfffffffc) | DB_ENABLE_PCI_CONF_CYCLE_TYPE1)

#define PCI_HDR_SIZE    64

typedef struct db_pci_header {
        uint16_t        venid;
        uint16_t        devid;
        uint16_t        command;
        uint16_t        status;
        uint8_t         revid;
        uint8_t         pif;
        uint8_t         subclass;
        uint8_t         class;
        uint8_t         cacheline;
        uint8_t         lat;
        uint8_t         hdr_type;
        uint8_t         bist;
        uint32_t        bar0;
        uint32_t        bar1;
        uint32_t        bar2;
        uint32_t        bar3;
        uint32_t        bar4;
        uint32_t        bar5;
        uint32_t        cardbus_cisp;
        uint16_t        sub_venid;
        uint16_t        sub_devid;
        uint32_t        exprom_bar;
        uint32_t        res1;
        uint32_t        res2;
        uint8_t         int_line;
        uint8_t         int_pin;
        uint8_t         min_gnt;
        uint8_t         max_lat;
} db_pci_header_t;

typedef struct db_conf_regs {
        uint32_t        ds_mem0_tr_base; /* DS memory 0 translated base */
        uint32_t        ds_io_mem1_tr_base; /* DS IO or memory1 trans base */
        uint32_t        ds_mem2_tr_base; /* DS memory 2 trans base */
        uint32_t        ds_mem3_tr_base; /* DS memory 3 trans base */
        uint32_t        us_io_mem0_tr_base; /* US IO or memory0 trans base */
        uint32_t        us_mem1_tr_base; /* US memory 1 translated base */
        uint32_t        ds_mem0_setup_reg; /* DS memory 0 setup reg */
        uint32_t        ds_io_mem1_setup_reg; /* DS IO or memory1 setup reg */
        uint32_t        ds_mem2_setup_reg; /* DS memory 2 setup reg */
        uint64_t        ds_mem3_setup_reg; /* DS memory 3 setup reg */
        uint32_t        p_exp_rom_setup; /* primary expansion ROM setup reg */
        uint32_t        us_io_mem0_setup_reg; /* US IO or memory 0 setup reg */
        uint32_t        us_mem1_setup_reg; /* US memory 1 setup reg */
        ushort_t        chip_control0;  /* chip control 0 */
        ushort_t        chip_control1;  /* chip control 1 */
        ushort_t        chip_status;    /* chip status */
        ushort_t        arb_control;    /* arbiter control */
        uchar_t         p_serr_disables; /* primary SERR# disables */
        uchar_t         s_serr_disables; /* secondary SERR# disables */
        ushort_t        config_csr;     /* configuration control and status */
        uint32_t        reset_control;  /* reset control */
        ushort_t        pm_cap;         /* power management capabilities reg */
        ushort_t        pm_csr;         /* power management control status */
        uint8_t         hs_csr;         /* hotswap control status */
} db_conf_regs_t;

#ifdef  __cplusplus
}
#endif

#endif  /* _SYS_DB21554_CONFIG_H */