1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun 3*4882a593Smuzhiyun #define FDOMAIN_REGION_SIZE 0x10 4*4882a593Smuzhiyun #define FDOMAIN_BIOS_SIZE 0x2000 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun enum { 7*4882a593Smuzhiyun in_arbitration = 0x02, 8*4882a593Smuzhiyun in_selection = 0x04, 9*4882a593Smuzhiyun in_other = 0x08, 10*4882a593Smuzhiyun disconnect = 0x10, 11*4882a593Smuzhiyun aborted = 0x20, 12*4882a593Smuzhiyun sent_ident = 0x40, 13*4882a593Smuzhiyun }; 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun /* (@) = not present on TMC1800, (#) = not present on TMC1800 and TMC18C50 */ 16*4882a593Smuzhiyun #define REG_SCSI_DATA 0 /* R/W: SCSI Data (with ACK) */ 17*4882a593Smuzhiyun #define REG_BSTAT 1 /* R: SCSI Bus Status */ 18*4882a593Smuzhiyun #define BSTAT_BSY BIT(0) /* Busy */ 19*4882a593Smuzhiyun #define BSTAT_MSG BIT(1) /* Message */ 20*4882a593Smuzhiyun #define BSTAT_IO BIT(2) /* Input/Output */ 21*4882a593Smuzhiyun #define BSTAT_CMD BIT(3) /* Command/Data */ 22*4882a593Smuzhiyun #define BSTAT_REQ BIT(4) /* Request and Not Ack */ 23*4882a593Smuzhiyun #define BSTAT_SEL BIT(5) /* Select */ 24*4882a593Smuzhiyun #define BSTAT_ACK BIT(6) /* Acknowledge and Request */ 25*4882a593Smuzhiyun #define BSTAT_ATN BIT(7) /* Attention */ 26*4882a593Smuzhiyun #define REG_BCTL 1 /* W: SCSI Bus Control */ 27*4882a593Smuzhiyun #define BCTL_RST BIT(0) /* Bus Reset */ 28*4882a593Smuzhiyun #define BCTL_SEL BIT(1) /* Select */ 29*4882a593Smuzhiyun #define BCTL_BSY BIT(2) /* Busy */ 30*4882a593Smuzhiyun #define BCTL_ATN BIT(3) /* Attention */ 31*4882a593Smuzhiyun #define BCTL_IO BIT(4) /* Input/Output */ 32*4882a593Smuzhiyun #define BCTL_CMD BIT(5) /* Command/Data */ 33*4882a593Smuzhiyun #define BCTL_MSG BIT(6) /* Message */ 34*4882a593Smuzhiyun #define BCTL_BUSEN BIT(7) /* Enable bus drivers */ 35*4882a593Smuzhiyun #define REG_ASTAT 2 /* R: Adapter Status 1 */ 36*4882a593Smuzhiyun #define ASTAT_IRQ BIT(0) /* Interrupt active */ 37*4882a593Smuzhiyun #define ASTAT_ARB BIT(1) /* Arbitration complete */ 38*4882a593Smuzhiyun #define ASTAT_PARERR BIT(2) /* Parity error */ 39*4882a593Smuzhiyun #define ASTAT_RST BIT(3) /* SCSI reset occurred */ 40*4882a593Smuzhiyun #define ASTAT_FIFODIR BIT(4) /* FIFO direction */ 41*4882a593Smuzhiyun #define ASTAT_FIFOEN BIT(5) /* FIFO enabled */ 42*4882a593Smuzhiyun #define ASTAT_PAREN BIT(6) /* Parity enabled */ 43*4882a593Smuzhiyun #define ASTAT_BUSEN BIT(7) /* Bus drivers enabled */ 44*4882a593Smuzhiyun #define REG_ICTL 2 /* W: Interrupt Control */ 45*4882a593Smuzhiyun #define ICTL_FIFO_MASK 0x0f /* FIFO threshold, 1/16 FIFO size */ 46*4882a593Smuzhiyun #define ICTL_FIFO BIT(4) /* Int. on FIFO count */ 47*4882a593Smuzhiyun #define ICTL_ARB BIT(5) /* Int. on Arbitration complete */ 48*4882a593Smuzhiyun #define ICTL_SEL BIT(6) /* Int. on SCSI Select */ 49*4882a593Smuzhiyun #define ICTL_REQ BIT(7) /* Int. on SCSI Request */ 50*4882a593Smuzhiyun #define REG_FSTAT 3 /* R: Adapter Status 2 (FIFO) - (@) */ 51*4882a593Smuzhiyun #define FSTAT_ONOTEMPTY BIT(0) /* Output FIFO not empty */ 52*4882a593Smuzhiyun #define FSTAT_INOTEMPTY BIT(1) /* Input FIFO not empty */ 53*4882a593Smuzhiyun #define FSTAT_NOTEMPTY BIT(2) /* Main FIFO not empty */ 54*4882a593Smuzhiyun #define FSTAT_NOTFULL BIT(3) /* Main FIFO not full */ 55*4882a593Smuzhiyun #define REG_MCTL 3 /* W: SCSI Data Mode Control */ 56*4882a593Smuzhiyun #define MCTL_ACK_MASK 0x0f /* Acknowledge period */ 57*4882a593Smuzhiyun #define MCTL_ACTDEASS BIT(4) /* Active deassert of REQ and ACK */ 58*4882a593Smuzhiyun #define MCTL_TARGET BIT(5) /* Enable target mode */ 59*4882a593Smuzhiyun #define MCTL_FASTSYNC BIT(6) /* Enable Fast Synchronous */ 60*4882a593Smuzhiyun #define MCTL_SYNC BIT(7) /* Enable Synchronous */ 61*4882a593Smuzhiyun #define REG_INTCOND 4 /* R: Interrupt Condition - (@) */ 62*4882a593Smuzhiyun #define IRQ_FIFO BIT(1) /* FIFO interrupt */ 63*4882a593Smuzhiyun #define IRQ_REQ BIT(2) /* SCSI Request interrupt */ 64*4882a593Smuzhiyun #define IRQ_SEL BIT(3) /* SCSI Select interrupt */ 65*4882a593Smuzhiyun #define IRQ_ARB BIT(4) /* SCSI Arbitration interrupt */ 66*4882a593Smuzhiyun #define IRQ_RST BIT(5) /* SCSI Reset interrupt */ 67*4882a593Smuzhiyun #define IRQ_FORCED BIT(6) /* Forced interrupt */ 68*4882a593Smuzhiyun #define IRQ_TIMEOUT BIT(7) /* Bus timeout */ 69*4882a593Smuzhiyun #define REG_ACTL 4 /* W: Adapter Control 1 */ 70*4882a593Smuzhiyun #define ACTL_RESET BIT(0) /* Reset FIFO, parity, reset int. */ 71*4882a593Smuzhiyun #define ACTL_FIRQ BIT(1) /* Set Forced interrupt */ 72*4882a593Smuzhiyun #define ACTL_ARB BIT(2) /* Initiate Bus Arbitration */ 73*4882a593Smuzhiyun #define ACTL_PAREN BIT(3) /* Enable SCSI Parity */ 74*4882a593Smuzhiyun #define ACTL_IRQEN BIT(4) /* Enable interrupts */ 75*4882a593Smuzhiyun #define ACTL_CLRFIRQ BIT(5) /* Clear Forced interrupt */ 76*4882a593Smuzhiyun #define ACTL_FIFOWR BIT(6) /* FIFO Direction (1=write) */ 77*4882a593Smuzhiyun #define ACTL_FIFOEN BIT(7) /* Enable FIFO */ 78*4882a593Smuzhiyun #define REG_ID_LSB 5 /* R: ID Code (LSB) */ 79*4882a593Smuzhiyun #define REG_ACTL2 5 /* Adapter Control 2 - (@) */ 80*4882a593Smuzhiyun #define ACTL2_RAMOVRLY BIT(0) /* Enable RAM overlay */ 81*4882a593Smuzhiyun #define ACTL2_SLEEP BIT(7) /* Sleep mode */ 82*4882a593Smuzhiyun #define REG_ID_MSB 6 /* R: ID Code (MSB) */ 83*4882a593Smuzhiyun #define REG_LOOPBACK 7 /* R/W: Loopback */ 84*4882a593Smuzhiyun #define REG_SCSI_DATA_NOACK 8 /* R/W: SCSI Data (no ACK) */ 85*4882a593Smuzhiyun #define REG_ASTAT3 9 /* R: Adapter Status 3 */ 86*4882a593Smuzhiyun #define ASTAT3_ACTDEASS BIT(0) /* Active deassert enabled */ 87*4882a593Smuzhiyun #define ASTAT3_RAMOVRLY BIT(1) /* RAM overlay enabled */ 88*4882a593Smuzhiyun #define ASTAT3_TARGERR BIT(2) /* Target error */ 89*4882a593Smuzhiyun #define ASTAT3_IRQEN BIT(3) /* Interrupts enabled */ 90*4882a593Smuzhiyun #define ASTAT3_IRQMASK 0xf0 /* Enabled interrupts mask */ 91*4882a593Smuzhiyun #define REG_CFG1 10 /* R: Configuration Register 1 */ 92*4882a593Smuzhiyun #define CFG1_BUS BIT(0) /* 0 = ISA */ 93*4882a593Smuzhiyun #define CFG1_IRQ_MASK 0x0e /* IRQ jumpers */ 94*4882a593Smuzhiyun #define CFG1_IO_MASK 0x30 /* I/O base jumpers */ 95*4882a593Smuzhiyun #define CFG1_BIOS_MASK 0xc0 /* BIOS base jumpers */ 96*4882a593Smuzhiyun #define REG_CFG2 11 /* R/W: Configuration Register 2 (@) */ 97*4882a593Smuzhiyun #define CFG2_ROMDIS BIT(0) /* ROM disabled */ 98*4882a593Smuzhiyun #define CFG2_RAMDIS BIT(1) /* RAM disabled */ 99*4882a593Smuzhiyun #define CFG2_IRQEDGE BIT(2) /* Edge-triggered interrupts */ 100*4882a593Smuzhiyun #define CFG2_NOWS BIT(3) /* No wait states */ 101*4882a593Smuzhiyun #define CFG2_32BIT BIT(7) /* 32-bit mode */ 102*4882a593Smuzhiyun #define REG_FIFO 12 /* R/W: FIFO */ 103*4882a593Smuzhiyun #define REG_FIFO_COUNT 14 /* R: FIFO Data Count */ 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun #ifdef CONFIG_PM_SLEEP 106*4882a593Smuzhiyun static const struct dev_pm_ops __maybe_unused fdomain_pm_ops; 107*4882a593Smuzhiyun #define FDOMAIN_PM_OPS (&fdomain_pm_ops) 108*4882a593Smuzhiyun #else 109*4882a593Smuzhiyun #define FDOMAIN_PM_OPS NULL 110*4882a593Smuzhiyun #endif /* CONFIG_PM_SLEEP */ 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun struct Scsi_Host *fdomain_create(int base, int irq, int this_id, 113*4882a593Smuzhiyun struct device *dev); 114*4882a593Smuzhiyun int fdomain_destroy(struct Scsi_Host *sh); 115