0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033 #include <asm/octeon/octeon.h>
0034
0035 #include <asm/octeon/cvmx-asxx-defs.h>
0036 #include <asm/octeon/cvmx-gmxx-defs.h>
0037
0038 #ifndef PRINT_ERROR
0039 #define PRINT_ERROR(format, ...)
0040 #endif
0041
0042 void __cvmx_interrupt_gmxx_rxx_int_en_enable(int index, int block);
0043
0044
0045
0046
0047
0048
0049
0050 void __cvmx_interrupt_asxx_enable(int block)
0051 {
0052 int mask;
0053 union cvmx_asxx_int_en csr;
0054
0055
0056
0057
0058
0059 if (OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN58XX))
0060 mask = 0xf;
0061 else
0062 mask = 0x7;
0063
0064
0065 csr.u64 = cvmx_read_csr(CVMX_ASXX_INT_EN(block));
0066 csr.s.txpsh = mask;
0067 csr.s.txpop = mask;
0068 csr.s.ovrflw = mask;
0069 cvmx_write_csr(CVMX_ASXX_INT_EN(block), csr.u64);
0070 }
0071
0072
0073
0074
0075
0076 void __cvmx_interrupt_gmxx_enable(int interface)
0077 {
0078 union cvmx_gmxx_inf_mode mode;
0079 union cvmx_gmxx_tx_int_en gmx_tx_int_en;
0080 int num_ports;
0081 int index;
0082
0083 mode.u64 = cvmx_read_csr(CVMX_GMXX_INF_MODE(interface));
0084
0085 if (OCTEON_IS_MODEL(OCTEON_CN56XX) || OCTEON_IS_MODEL(OCTEON_CN52XX)) {
0086 if (mode.s.en) {
0087 switch (mode.cn52xx.mode) {
0088 case 1:
0089 num_ports = 1;
0090 break;
0091 case 2:
0092 case 3:
0093 num_ports = 4;
0094 break;
0095 default:
0096 num_ports = 0;
0097 break;
0098 }
0099 } else
0100 num_ports = 0;
0101 } else {
0102 if (mode.s.en) {
0103 if (OCTEON_IS_MODEL(OCTEON_CN38XX)
0104 || OCTEON_IS_MODEL(OCTEON_CN58XX)) {
0105
0106
0107
0108
0109
0110 if (mode.s.type)
0111 num_ports = 1;
0112 else
0113 num_ports = 4;
0114 } else {
0115
0116
0117
0118
0119
0120 if (mode.s.type)
0121 num_ports = 2;
0122 else
0123 num_ports = 3;
0124 }
0125 } else
0126 num_ports = 0;
0127 }
0128
0129 gmx_tx_int_en.u64 = 0;
0130 if (num_ports) {
0131 if (OCTEON_IS_MODEL(OCTEON_CN38XX)
0132 || OCTEON_IS_MODEL(OCTEON_CN58XX))
0133 gmx_tx_int_en.cn38xx.ncb_nxa = 1;
0134 gmx_tx_int_en.s.pko_nxa = 1;
0135 }
0136 gmx_tx_int_en.s.undflw = (1 << num_ports) - 1;
0137 cvmx_write_csr(CVMX_GMXX_TX_INT_EN(interface), gmx_tx_int_en.u64);
0138 for (index = 0; index < num_ports; index++)
0139 __cvmx_interrupt_gmxx_rxx_int_en_enable(index, interface);
0140 }