xref: /OK3568_Linux_fs/kernel/drivers/misc/hpilo.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * linux/drivers/char/hpilo.h
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2008 Hewlett-Packard Development Company, L.P.
6*4882a593Smuzhiyun  *	David Altobelli <david.altobelli@hp.com>
7*4882a593Smuzhiyun  */
8*4882a593Smuzhiyun #ifndef __HPILO_H
9*4882a593Smuzhiyun #define __HPILO_H
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #define ILO_NAME "hpilo"
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun /* max number of open channel control blocks per device, hw limited to 32 */
14*4882a593Smuzhiyun #define MAX_CCB	       24
15*4882a593Smuzhiyun /* min number of open channel control blocks per device, hw limited to 32 */
16*4882a593Smuzhiyun #define MIN_CCB		8
17*4882a593Smuzhiyun /* max number of supported devices */
18*4882a593Smuzhiyun #define MAX_ILO_DEV	1
19*4882a593Smuzhiyun /* max number of files */
20*4882a593Smuzhiyun #define MAX_OPEN	(MAX_CCB * MAX_ILO_DEV)
21*4882a593Smuzhiyun /* total wait time in usec */
22*4882a593Smuzhiyun #define MAX_WAIT_TIME	10000
23*4882a593Smuzhiyun /* per spin wait time in usec */
24*4882a593Smuzhiyun #define WAIT_TIME	10
25*4882a593Smuzhiyun /* spin counter for open/close delay */
26*4882a593Smuzhiyun #define MAX_WAIT	(MAX_WAIT_TIME / WAIT_TIME)
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun /*
29*4882a593Smuzhiyun  * Per device, used to track global memory allocations.
30*4882a593Smuzhiyun  */
31*4882a593Smuzhiyun struct ilo_hwinfo {
32*4882a593Smuzhiyun 	/* mmio registers on device */
33*4882a593Smuzhiyun 	char __iomem *mmio_vaddr;
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun 	/* doorbell registers on device */
36*4882a593Smuzhiyun 	char __iomem *db_vaddr;
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun 	/* shared memory on device used for channel control blocks */
39*4882a593Smuzhiyun 	char __iomem *ram_vaddr;
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun 	/* files corresponding to this device */
42*4882a593Smuzhiyun 	struct ccb_data *ccb_alloc[MAX_CCB];
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun 	struct pci_dev *ilo_dev;
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun 	/*
47*4882a593Smuzhiyun 	 * open_lock      serializes ccb_cnt during open and close
48*4882a593Smuzhiyun 	 * [ irq disabled ]
49*4882a593Smuzhiyun 	 * -> alloc_lock  used when adding/removing/searching ccb_alloc,
50*4882a593Smuzhiyun 	 *                which represents all ccbs open on the device
51*4882a593Smuzhiyun 	 * --> fifo_lock  controls access to fifo queues shared with hw
52*4882a593Smuzhiyun 	 *
53*4882a593Smuzhiyun 	 * Locks must be taken in this order, but open_lock and alloc_lock
54*4882a593Smuzhiyun 	 * are optional, they do not need to be held in order to take a
55*4882a593Smuzhiyun 	 * lower level lock.
56*4882a593Smuzhiyun 	 */
57*4882a593Smuzhiyun 	spinlock_t open_lock;
58*4882a593Smuzhiyun 	spinlock_t alloc_lock;
59*4882a593Smuzhiyun 	spinlock_t fifo_lock;
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun 	struct cdev cdev;
62*4882a593Smuzhiyun };
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun /* offset from mmio_vaddr for enabling doorbell interrupts */
65*4882a593Smuzhiyun #define DB_IRQ		0xB2
66*4882a593Smuzhiyun /* offset from mmio_vaddr for outbound communications */
67*4882a593Smuzhiyun #define DB_OUT		0xD4
68*4882a593Smuzhiyun /* DB_OUT reset bit */
69*4882a593Smuzhiyun #define DB_RESET	26
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun /*
72*4882a593Smuzhiyun  * Channel control block. Used to manage hardware queues.
73*4882a593Smuzhiyun  * The format must match hw's version.  The hw ccb is 128 bytes,
74*4882a593Smuzhiyun  * but the context area shouldn't be touched by the driver.
75*4882a593Smuzhiyun  */
76*4882a593Smuzhiyun #define ILOSW_CCB_SZ	64
77*4882a593Smuzhiyun #define ILOHW_CCB_SZ 	128
78*4882a593Smuzhiyun struct ccb {
79*4882a593Smuzhiyun 	union {
80*4882a593Smuzhiyun 		char *send_fifobar;
81*4882a593Smuzhiyun 		u64 send_fifobar_pa;
82*4882a593Smuzhiyun 	} ccb_u1;
83*4882a593Smuzhiyun 	union {
84*4882a593Smuzhiyun 		char *send_desc;
85*4882a593Smuzhiyun 		u64 send_desc_pa;
86*4882a593Smuzhiyun 	} ccb_u2;
87*4882a593Smuzhiyun 	u64 send_ctrl;
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun 	union {
90*4882a593Smuzhiyun 		char *recv_fifobar;
91*4882a593Smuzhiyun 		u64 recv_fifobar_pa;
92*4882a593Smuzhiyun 	} ccb_u3;
93*4882a593Smuzhiyun 	union {
94*4882a593Smuzhiyun 		char *recv_desc;
95*4882a593Smuzhiyun 		u64 recv_desc_pa;
96*4882a593Smuzhiyun 	} ccb_u4;
97*4882a593Smuzhiyun 	u64 recv_ctrl;
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun 	union {
100*4882a593Smuzhiyun 		char __iomem *db_base;
101*4882a593Smuzhiyun 		u64 padding5;
102*4882a593Smuzhiyun 	} ccb_u5;
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun 	u64 channel;
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun 	/* unused context area (64 bytes) */
107*4882a593Smuzhiyun };
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun /* ccb queue parameters */
110*4882a593Smuzhiyun #define SENDQ		1
111*4882a593Smuzhiyun #define RECVQ 		2
112*4882a593Smuzhiyun #define NR_QENTRY    	4
113*4882a593Smuzhiyun #define L2_QENTRY_SZ 	12
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun /* ccb ctrl bitfields */
116*4882a593Smuzhiyun #define CTRL_BITPOS_L2SZ             0
117*4882a593Smuzhiyun #define CTRL_BITPOS_FIFOINDEXMASK    4
118*4882a593Smuzhiyun #define CTRL_BITPOS_DESCLIMIT        18
119*4882a593Smuzhiyun #define CTRL_BITPOS_A                30
120*4882a593Smuzhiyun #define CTRL_BITPOS_G                31
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun /* ccb doorbell macros */
123*4882a593Smuzhiyun #define L2_DB_SIZE		14
124*4882a593Smuzhiyun #define ONE_DB_SIZE		(1 << L2_DB_SIZE)
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun /*
127*4882a593Smuzhiyun  * Per fd structure used to track the ccb allocated to that dev file.
128*4882a593Smuzhiyun  */
129*4882a593Smuzhiyun struct ccb_data {
130*4882a593Smuzhiyun 	/* software version of ccb, using virtual addrs */
131*4882a593Smuzhiyun 	struct ccb  driver_ccb;
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun 	/* hardware version of ccb, using physical addrs */
134*4882a593Smuzhiyun 	struct ccb  ilo_ccb;
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun 	/* hardware ccb is written to this shared mapped device memory */
137*4882a593Smuzhiyun 	struct ccb __iomem *mapped_ccb;
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun 	/* dma'able memory used for send/recv queues */
140*4882a593Smuzhiyun 	void       *dma_va;
141*4882a593Smuzhiyun 	dma_addr_t  dma_pa;
142*4882a593Smuzhiyun 	size_t      dma_size;
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun 	/* pointer to hardware device info */
145*4882a593Smuzhiyun 	struct ilo_hwinfo *ilo_hw;
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun 	/* queue for this ccb to wait for recv data */
148*4882a593Smuzhiyun 	wait_queue_head_t ccb_waitq;
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun 	/* usage count, to allow for shared ccb's */
151*4882a593Smuzhiyun 	int	    ccb_cnt;
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun 	/* open wanted exclusive access to this ccb */
154*4882a593Smuzhiyun 	int	    ccb_excl;
155*4882a593Smuzhiyun };
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun /*
158*4882a593Smuzhiyun  * FIFO queue structure, shared with hw.
159*4882a593Smuzhiyun  */
160*4882a593Smuzhiyun #define ILO_START_ALIGN	4096
161*4882a593Smuzhiyun #define ILO_CACHE_SZ 	 128
162*4882a593Smuzhiyun struct fifo {
163*4882a593Smuzhiyun 	u64 nrents;	/* user requested number of fifo entries */
164*4882a593Smuzhiyun 	u64 imask;  /* mask to extract valid fifo index */
165*4882a593Smuzhiyun 	u64 merge;	/*  O/C bits to merge in during enqueue operation */
166*4882a593Smuzhiyun 	u64 reset;	/* set to non-zero when the target device resets */
167*4882a593Smuzhiyun 	u8  pad_0[ILO_CACHE_SZ - (sizeof(u64) * 4)];
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun 	u64 head;
170*4882a593Smuzhiyun 	u8  pad_1[ILO_CACHE_SZ - (sizeof(u64))];
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun 	u64 tail;
173*4882a593Smuzhiyun 	u8  pad_2[ILO_CACHE_SZ - (sizeof(u64))];
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun 	u64 fifobar[];
176*4882a593Smuzhiyun };
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun /* convert between struct fifo, and the fifobar, which is saved in the ccb */
179*4882a593Smuzhiyun #define FIFOHANDLESIZE (sizeof(struct fifo))
180*4882a593Smuzhiyun #define FIFOBARTOHANDLE(_fifo) \
181*4882a593Smuzhiyun 	((struct fifo *)(((char *)(_fifo)) - FIFOHANDLESIZE))
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun /* the number of qwords to consume from the entry descriptor */
184*4882a593Smuzhiyun #define ENTRY_BITPOS_QWORDS      0
185*4882a593Smuzhiyun /* descriptor index number (within a specified queue) */
186*4882a593Smuzhiyun #define ENTRY_BITPOS_DESCRIPTOR  10
187*4882a593Smuzhiyun /* state bit, fifo entry consumed by consumer */
188*4882a593Smuzhiyun #define ENTRY_BITPOS_C           22
189*4882a593Smuzhiyun /* state bit, fifo entry is occupied */
190*4882a593Smuzhiyun #define ENTRY_BITPOS_O           23
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun #define ENTRY_BITS_QWORDS        10
193*4882a593Smuzhiyun #define ENTRY_BITS_DESCRIPTOR    12
194*4882a593Smuzhiyun #define ENTRY_BITS_C             1
195*4882a593Smuzhiyun #define ENTRY_BITS_O             1
196*4882a593Smuzhiyun #define ENTRY_BITS_TOTAL	\
197*4882a593Smuzhiyun 	(ENTRY_BITS_C + ENTRY_BITS_O + \
198*4882a593Smuzhiyun 	 ENTRY_BITS_QWORDS + ENTRY_BITS_DESCRIPTOR)
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun /* extract various entry fields */
201*4882a593Smuzhiyun #define ENTRY_MASK ((1 << ENTRY_BITS_TOTAL) - 1)
202*4882a593Smuzhiyun #define ENTRY_MASK_C (((1 << ENTRY_BITS_C) - 1) << ENTRY_BITPOS_C)
203*4882a593Smuzhiyun #define ENTRY_MASK_O (((1 << ENTRY_BITS_O) - 1) << ENTRY_BITPOS_O)
204*4882a593Smuzhiyun #define ENTRY_MASK_QWORDS \
205*4882a593Smuzhiyun 	(((1 << ENTRY_BITS_QWORDS) - 1) << ENTRY_BITPOS_QWORDS)
206*4882a593Smuzhiyun #define ENTRY_MASK_DESCRIPTOR \
207*4882a593Smuzhiyun 	(((1 << ENTRY_BITS_DESCRIPTOR) - 1) << ENTRY_BITPOS_DESCRIPTOR)
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun #define ENTRY_MASK_NOSTATE (ENTRY_MASK >> (ENTRY_BITS_C + ENTRY_BITS_O))
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun #endif /* __HPILO_H */
212