xref: /openbmc/linux/drivers/ipack/carriers/tpci200.h (revision 762f99f4f3cb41a775b5157dd761217beba65873)
1b886d83cSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
2*0419bf0fSAditya Srivastava /*
305e5027eSGreg Kroah-Hartman  * driver for the carrier TEWS TPCI-200
405e5027eSGreg Kroah-Hartman  *
505e5027eSGreg Kroah-Hartman  * Copyright (C) 2009-2012 CERN (www.cern.ch)
605e5027eSGreg Kroah-Hartman  * Author: Nicolas Serafini, EIC2 SA
705e5027eSGreg Kroah-Hartman  * Author: Samuel Iglesias Gonsalvez <siglesias@igalia.com>
805e5027eSGreg Kroah-Hartman  */
905e5027eSGreg Kroah-Hartman 
1005e5027eSGreg Kroah-Hartman #ifndef _TPCI200_H_
1105e5027eSGreg Kroah-Hartman #define _TPCI200_H_
1205e5027eSGreg Kroah-Hartman 
1305e5027eSGreg Kroah-Hartman #include <linux/limits.h>
1405e5027eSGreg Kroah-Hartman #include <linux/pci.h>
1505e5027eSGreg Kroah-Hartman #include <linux/spinlock.h>
1605e5027eSGreg Kroah-Hartman #include <linux/swab.h>
1705e5027eSGreg Kroah-Hartman #include <linux/io.h>
187dbce021SSamuel Iglesias Gonsalvez #include <linux/ipack.h>
1905e5027eSGreg Kroah-Hartman 
2005e5027eSGreg Kroah-Hartman #define TPCI200_NB_SLOT               0x4
2105e5027eSGreg Kroah-Hartman #define TPCI200_NB_BAR                0x6
2205e5027eSGreg Kroah-Hartman 
2305e5027eSGreg Kroah-Hartman #define TPCI200_VENDOR_ID             0x1498
2405e5027eSGreg Kroah-Hartman #define TPCI200_DEVICE_ID             0x30C8
2505e5027eSGreg Kroah-Hartman #define TPCI200_SUBVENDOR_ID          0x1498
2605e5027eSGreg Kroah-Hartman #define TPCI200_SUBDEVICE_ID          0x300A
2705e5027eSGreg Kroah-Hartman 
2805e5027eSGreg Kroah-Hartman #define TPCI200_CFG_MEM_BAR           0
2905e5027eSGreg Kroah-Hartman #define TPCI200_IP_INTERFACE_BAR      2
3005e5027eSGreg Kroah-Hartman #define TPCI200_IO_ID_INT_SPACES_BAR  3
3105e5027eSGreg Kroah-Hartman #define TPCI200_MEM16_SPACE_BAR       4
3205e5027eSGreg Kroah-Hartman #define TPCI200_MEM8_SPACE_BAR        5
3305e5027eSGreg Kroah-Hartman 
3405e5027eSGreg Kroah-Hartman struct tpci200_regs {
3505e5027eSGreg Kroah-Hartman 	__le16	revision;
3605e5027eSGreg Kroah-Hartman 	/* writes to control should occur with the mutex held to protect
3705e5027eSGreg Kroah-Hartman 	 * read-modify-write operations */
3805e5027eSGreg Kroah-Hartman 	__le16  control[4];
3905e5027eSGreg Kroah-Hartman 	__le16	reset;
4005e5027eSGreg Kroah-Hartman 	__le16	status;
4105e5027eSGreg Kroah-Hartman 	u8	reserved[242];
4205e5027eSGreg Kroah-Hartman } __packed;
4305e5027eSGreg Kroah-Hartman 
4405e5027eSGreg Kroah-Hartman #define TPCI200_IFACE_SIZE            0x100
4505e5027eSGreg Kroah-Hartman 
4605e5027eSGreg Kroah-Hartman #define TPCI200_IO_SPACE_OFF          0x0000
4705e5027eSGreg Kroah-Hartman #define TPCI200_IO_SPACE_INTERVAL     0x0100
4805e5027eSGreg Kroah-Hartman #define TPCI200_IO_SPACE_SIZE         0x0080
4905e5027eSGreg Kroah-Hartman #define TPCI200_ID_SPACE_OFF          0x0080
5005e5027eSGreg Kroah-Hartman #define TPCI200_ID_SPACE_INTERVAL     0x0100
5105e5027eSGreg Kroah-Hartman #define TPCI200_ID_SPACE_SIZE         0x0040
5205e5027eSGreg Kroah-Hartman #define TPCI200_INT_SPACE_OFF         0x00C0
5305e5027eSGreg Kroah-Hartman #define TPCI200_INT_SPACE_INTERVAL    0x0100
5405e5027eSGreg Kroah-Hartman #define TPCI200_INT_SPACE_SIZE        0x0040
5505e5027eSGreg Kroah-Hartman #define TPCI200_IOIDINT_SIZE          0x0400
5605e5027eSGreg Kroah-Hartman 
5705e5027eSGreg Kroah-Hartman #define TPCI200_MEM8_SPACE_INTERVAL   0x00400000
5805e5027eSGreg Kroah-Hartman #define TPCI200_MEM8_SPACE_SIZE       0x00400000
5905e5027eSGreg Kroah-Hartman #define TPCI200_MEM16_SPACE_INTERVAL  0x00800000
6005e5027eSGreg Kroah-Hartman #define TPCI200_MEM16_SPACE_SIZE      0x00800000
6105e5027eSGreg Kroah-Hartman 
6205e5027eSGreg Kroah-Hartman /* control field in tpci200_regs */
6305e5027eSGreg Kroah-Hartman #define TPCI200_INT0_EN               0x0040
6405e5027eSGreg Kroah-Hartman #define TPCI200_INT1_EN               0x0080
6505e5027eSGreg Kroah-Hartman #define TPCI200_INT0_EDGE             0x0010
6605e5027eSGreg Kroah-Hartman #define TPCI200_INT1_EDGE             0x0020
6705e5027eSGreg Kroah-Hartman #define TPCI200_ERR_INT_EN            0x0008
6805e5027eSGreg Kroah-Hartman #define TPCI200_TIME_INT_EN           0x0004
6905e5027eSGreg Kroah-Hartman #define TPCI200_RECOVER_EN            0x0002
7005e5027eSGreg Kroah-Hartman #define TPCI200_CLK32                 0x0001
7105e5027eSGreg Kroah-Hartman 
7205e5027eSGreg Kroah-Hartman /* reset field in tpci200_regs */
7305e5027eSGreg Kroah-Hartman #define TPCI200_A_RESET               0x0001
7405e5027eSGreg Kroah-Hartman #define TPCI200_B_RESET               0x0002
7505e5027eSGreg Kroah-Hartman #define TPCI200_C_RESET               0x0004
7605e5027eSGreg Kroah-Hartman #define TPCI200_D_RESET               0x0008
7705e5027eSGreg Kroah-Hartman 
7805e5027eSGreg Kroah-Hartman /* status field in tpci200_regs */
7905e5027eSGreg Kroah-Hartman #define TPCI200_A_TIMEOUT             0x1000
8005e5027eSGreg Kroah-Hartman #define TPCI200_B_TIMEOUT             0x2000
8105e5027eSGreg Kroah-Hartman #define TPCI200_C_TIMEOUT             0x4000
8205e5027eSGreg Kroah-Hartman #define TPCI200_D_TIMEOUT             0x8000
8305e5027eSGreg Kroah-Hartman 
8405e5027eSGreg Kroah-Hartman #define TPCI200_A_ERROR               0x0100
8505e5027eSGreg Kroah-Hartman #define TPCI200_B_ERROR               0x0200
8605e5027eSGreg Kroah-Hartman #define TPCI200_C_ERROR               0x0400
8705e5027eSGreg Kroah-Hartman #define TPCI200_D_ERROR               0x0800
8805e5027eSGreg Kroah-Hartman 
8905e5027eSGreg Kroah-Hartman #define TPCI200_A_INT0                0x0001
9005e5027eSGreg Kroah-Hartman #define TPCI200_A_INT1                0x0002
9105e5027eSGreg Kroah-Hartman #define TPCI200_B_INT0                0x0004
9205e5027eSGreg Kroah-Hartman #define TPCI200_B_INT1                0x0008
9305e5027eSGreg Kroah-Hartman #define TPCI200_C_INT0                0x0010
9405e5027eSGreg Kroah-Hartman #define TPCI200_C_INT1                0x0020
9505e5027eSGreg Kroah-Hartman #define TPCI200_D_INT0                0x0040
9605e5027eSGreg Kroah-Hartman #define TPCI200_D_INT1                0x0080
9705e5027eSGreg Kroah-Hartman 
9805e5027eSGreg Kroah-Hartman #define TPCI200_SLOT_INT_MASK         0x00FF
9905e5027eSGreg Kroah-Hartman 
10005e5027eSGreg Kroah-Hartman /* PCI Configuration registers. The PCI bridge is a PLX Technology PCI9030. */
10105e5027eSGreg Kroah-Hartman #define LAS1_DESC		      0x2C
10205e5027eSGreg Kroah-Hartman #define LAS2_DESC		      0x30
10305e5027eSGreg Kroah-Hartman 
10405e5027eSGreg Kroah-Hartman /* Bits in the LAS?_DESC registers */
10505e5027eSGreg Kroah-Hartman #define LAS_BIT_BIGENDIAN	      24
10605e5027eSGreg Kroah-Hartman 
10705e5027eSGreg Kroah-Hartman #define VME_IOID_SPACE  "IOID"
10805e5027eSGreg Kroah-Hartman #define VME_MEM_SPACE  "MEM"
10905e5027eSGreg Kroah-Hartman 
11005e5027eSGreg Kroah-Hartman /**
11105e5027eSGreg Kroah-Hartman  * struct slot_irq - slot IRQ definition.
11205e5027eSGreg Kroah-Hartman  * @vector	Vector number
11305e5027eSGreg Kroah-Hartman  * @handler	Handler called when IRQ arrives
11405e5027eSGreg Kroah-Hartman  * @arg		Handler argument
11505e5027eSGreg Kroah-Hartman  *
11605e5027eSGreg Kroah-Hartman  */
11705e5027eSGreg Kroah-Hartman struct slot_irq {
11805e5027eSGreg Kroah-Hartman 	struct ipack_device *holder;
11905e5027eSGreg Kroah-Hartman 	int		vector;
12005e5027eSGreg Kroah-Hartman 	irqreturn_t	(*handler)(void *);
12105e5027eSGreg Kroah-Hartman 	void		*arg;
12205e5027eSGreg Kroah-Hartman };
12305e5027eSGreg Kroah-Hartman 
12405e5027eSGreg Kroah-Hartman /**
12505e5027eSGreg Kroah-Hartman  * struct tpci200_slot - data specific to the tpci200 slot.
12605e5027eSGreg Kroah-Hartman  * @slot_id	Slot identification gived to external interface
12705e5027eSGreg Kroah-Hartman  * @irq		Slot IRQ infos
12805e5027eSGreg Kroah-Hartman  * @io_phys	IO physical base address register of the slot
12905e5027eSGreg Kroah-Hartman  * @id_phys	ID physical base address register of the slot
13005e5027eSGreg Kroah-Hartman  * @int_phys	INT physical base address register of the slot
13105e5027eSGreg Kroah-Hartman  * @mem_phys	MEM physical base address register of the slot
13205e5027eSGreg Kroah-Hartman  *
13305e5027eSGreg Kroah-Hartman  */
13405e5027eSGreg Kroah-Hartman struct tpci200_slot {
13505e5027eSGreg Kroah-Hartman 	struct slot_irq	    *irq;
13605e5027eSGreg Kroah-Hartman };
13705e5027eSGreg Kroah-Hartman 
13805e5027eSGreg Kroah-Hartman /**
13905e5027eSGreg Kroah-Hartman  * struct tpci200_infos - informations specific of the TPCI200 tpci200.
14005e5027eSGreg Kroah-Hartman  * @pci_dev		PCI device
14105e5027eSGreg Kroah-Hartman  * @interface_regs	Pointer to IP interface space (Bar 2)
14205e5027eSGreg Kroah-Hartman  * @ioidint_space	Pointer to IP ID, IO and INT space (Bar 3)
14305e5027eSGreg Kroah-Hartman  * @mem8_space		Pointer to MEM space (Bar 4)
14405e5027eSGreg Kroah-Hartman  *
14505e5027eSGreg Kroah-Hartman  */
14605e5027eSGreg Kroah-Hartman struct tpci200_infos {
14705e5027eSGreg Kroah-Hartman 	struct pci_dev			*pdev;
14805e5027eSGreg Kroah-Hartman 	struct pci_device_id		*id_table;
14905e5027eSGreg Kroah-Hartman 	struct tpci200_regs __iomem	*interface_regs;
15005e5027eSGreg Kroah-Hartman 	void __iomem			*cfg_regs;
15105e5027eSGreg Kroah-Hartman 	struct ipack_bus_device		*ipack_bus;
15205e5027eSGreg Kroah-Hartman };
15305e5027eSGreg Kroah-Hartman struct tpci200_board {
15405e5027eSGreg Kroah-Hartman 	unsigned int		number;
15505e5027eSGreg Kroah-Hartman 	struct mutex		mutex;
15605e5027eSGreg Kroah-Hartman 	spinlock_t		regs_lock;
15705e5027eSGreg Kroah-Hartman 	struct tpci200_slot	*slots;
15805e5027eSGreg Kroah-Hartman 	struct tpci200_infos	*info;
15905e5027eSGreg Kroah-Hartman 	phys_addr_t             mod_mem[IPACK_SPACE_COUNT];
16005e5027eSGreg Kroah-Hartman };
16105e5027eSGreg Kroah-Hartman 
16205e5027eSGreg Kroah-Hartman #endif /* _TPCI200_H_ */
163