| /* pdp11_uqssp.h: Unibus/Qbus storage systems port definitions file | |
| Copyright (c) 2001-2008, Robert M Supnik | |
| Derived from work by Stephen F. Shirron | |
| Permission is hereby granted, free of charge, to any person obtaining a | |
| copy of this software and associated documentation files (the "Software"), | |
| to deal in the Software without restriction, including without limitation | |
| the rights to use, copy, modify, merge, publish, distribute, sublicense, | |
| and/or sell copies of the Software, and to permit persons to whom the | |
| Software is furnished to do so, subject to the following conditions: | |
| The above copyright notice and this permission notice shall be included in | |
| all copies or substantial portions of the Software. | |
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |
| ROBERT M SUPNIK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER | |
| IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | |
| CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
| Except as contained in this notice, the name of Robert M Supnik shall not be | |
| used in advertising or otherwise to promote the sale, use or other dealings | |
| in this Software without prior written authorization from Robert M Supnik. | |
| 30-Aug-02 RMS Added TMSCP support | |
| */ | |
| #ifndef PDP11_UQSSP_H_ | |
| #define PDP11_UQSSP_H_ 0 | |
| /* IP register - initialization and polling | |
| read - controller polls command queue | |
| write - controller re-initializes | |
| */ | |
| /* SA register - status, address, and purge | |
| read - data and error information | |
| write - host startup information, purge complete | |
| */ | |
| #define SA_ER 0x8000 /* error */ | |
| #define SA_S4 0x4000 /* init step 4 */ | |
| #define SA_S3 0x2000 /* init step 3 */ | |
| #define SA_S2 0x1000 /* init step 2 */ | |
| #define SA_S1 0x0800 /* init step 1 */ | |
| /* Init step 1, controller to host */ | |
| #define SA_S1C_NV 0x0400 /* fixed vec NI */ | |
| #define SA_S1C_Q22 0x0200 /* Q22 device */ | |
| #define SA_S1C_DI 0x0100 /* ext diags */ | |
| #define SA_S1C_OD 0x0080 /* odd addrs NI */ | |
| #define SA_S1C_MP 0x0040 /* mapping */ | |
| #define SA_S1C_SM 0x0020 /* spec fncs NI */ | |
| #define SA_S1C_CN 0x0010 /* node name NI */ | |
| /* Init step 1, host to controller */ | |
| #define SA_S1H_VL 0x8000 /* valid */ | |
| #define SA_S1H_WR 0x4000 /* wrap mode */ | |
| #define SA_S1H_V_CQ 11 /* cmd q len */ | |
| #define SA_S1H_M_CQ 0x7 | |
| #define SA_S1H_V_RQ 8 /* resp q len */ | |
| #define SA_S1H_M_RQ 0x7 | |
| #define SA_S1H_IE 0x0080 /* int enb */ | |
| #define SA_S1H_VEC 0x007F /* vector */ | |
| #define SA_S1H_CQ(x) (1 << (((x) >> SA_S1H_V_CQ) & SA_S1H_M_CQ)) | |
| #define SA_S1H_RQ(x) (1 << (((x) >> SA_S1H_V_RQ) & SA_S1H_M_RQ)) | |
| /* Init step 2, controller to host */ | |
| #define SA_S2C_PT 0x0000 /* port type */ | |
| #define SA_S2C_V_EC 8 /* info to echo */ | |
| #define SA_S2C_M_EC 0xFF | |
| #define SA_S2C_EC(x) (((x) >> SA_S2C_V_EC) & SA_S2C_M_EC) | |
| /* Init step 2, host to controller */ | |
| #define SA_S2H_CLO 0xFFFE /* comm addr lo */ | |
| #define SA_S2H_PI 0x0001 /* adp prg int */ | |
| /* Init step 3, controller to host */ | |
| #define SA_S3C_V_EC 0 /* info to echo */ | |
| #define SA_S3C_M_EC 0xFF | |
| #define SA_S3C_EC(x) (((x) >> SA_S3C_V_EC) & SA_S3C_M_EC) | |
| /* Init step 3, host to controller */ | |
| #define SA_S3H_PP 0x8000 /* purge, poll test */ | |
| #define SA_S3H_CHI 0x7FFF /* comm addr hi */ | |
| /* Init step 4, controller to host */ | |
| #define SA_S4C_V_MOD 4 /* adapter # */ | |
| #define SA_S4C_V_VER 0 /* version # */ | |
| /* Init step 4, host to controller */ | |
| #define SA_S4H_CS 0x0400 /* host scrpad NI */ | |
| #define SA_S4H_NN 0x0200 /* snd node name NI */ | |
| #define SA_S4H_SF 0x0100 /* spec fnc NI */ | |
| #define SA_S4H_LF 0x0002 /* send last fail */ | |
| #define SA_S4H_GO 0x0001 /* go */ | |
| /* Fatal error codes (generic through 32) */ | |
| #define PE_PRE 1 /* packet read err */ | |
| #define PE_PWE 2 /* packet write err */ | |
| #define PE_QRE 6 /* queue read err */ | |
| #define PE_QWE 7 /* queue write err */ | |
| #define PE_HAT 9 /* host access tmo */ | |
| #define PE_ICI 14 /* inv conn ident */ | |
| #define PE_PIE 20 /* prot incompat */ | |
| #define PE_PPF 21 /* prg/poll err */ | |
| #define PE_MRE 22 /* map reg rd err */ | |
| #define PE_T11 475 /* T11 err NI */ | |
| #define PE_SND 476 /* SND err NI */ | |
| #define PE_RCV 477 /* RCV err NI */ | |
| #define PE_NSR 478 /* no such rsrc */ | |
| /* Comm region offsets */ | |
| #define SA_COMM_QQ -8 /* unused */ | |
| #define SA_COMM_PI -6 /* purge int */ | |
| #define SA_COMM_CI -4 /* cmd int */ | |
| #define SA_COMM_RI -2 /* resp int */ | |
| #define SA_COMM_MAX ((4 << SA_S1H_M_CQ) + (4 << SA_S1H_M_RQ) - SA_COMM_QQ) | |
| /* Command/response rings */ | |
| struct uq_ring { | |
| int32 ioff; /* intr offset */ | |
| uint32 ba; /* base addr */ | |
| uint32 lnt; /* size in bytes */ | |
| uint32 idx; /* current index */ | |
| }; | |
| /* Ring descriptor entry */ | |
| #define UQ_DESC_OWN 0x80000000 /* ownership */ | |
| #define UQ_DESC_F 0x40000000 /* flag */ | |
| #define UQ_ADDR 0x003FFFFE /* addr, word aligned */ | |
| /* Packet header */ | |
| #define UQ_HDR_OFF -4 /* offset */ | |
| #define UQ_HLNT 0 /* length */ | |
| #define UQ_HCTC 1 /* credits, type, CID */ | |
| #define UQ_HCTC_V_CR 0 /* credits */ | |
| #define UQ_HCTC_M_CR 0xF | |
| #define UQ_HCTC_V_TYP 4 /* type */ | |
| #define UQ_HCTC_M_TYP 0xF | |
| #define UQ_TYP_SEQ 0 /* sequential */ | |
| #define UQ_TYP_DAT 1 /* datagram */ | |
| #define UQ_HCTC_V_CID 8 /* conn ID */ | |
| #define UQ_HCTC_M_CID 0xFF | |
| #define UQ_CID_MSCP 0 /* MSCP */ | |
| #define UQ_CID_TMSCP 1 /* TMSCP */ | |
| #define UQ_CID_DUP 2 /* DUP */ | |
| #define UQ_CID_DIAG 0xFF /* diagnostic */ | |
| #endif |