1 /*
2  * This file and its contents are supplied under the terms of the
3  * Common Development and Distribution License ("CDDL"), version 1.0.
4  * You may only use this file in accordance with the terms of version
5  * 1.0 of the CDDL.
6  *
7  * A full copy of the text of the CDDL should have accompanied this
8  * source.  A copy of the CDDL is also available via the Internet at
9  * http://www.illumos.org/license/CDDL.
10  */
11 
12 /*
13  * Copyright (C) 2013 Hewlett-Packard Development Company, L.P.
14  */
15 
16 #ifndef	_CPQARY3_Q_MEM_H
17 #define	_CPQARY3_Q_MEM_H
18 
19 #ifdef	__cplusplus
20 extern "C" {
21 #endif
22 
23 #define	CPQARY3_GET_MEM_TAG		4
24 
25 #define	CPQARY3_FREE			0
26 #define	CPQARY3_OCCUPIED		1
27 #define	CPQARY3_SELF_OCCUPIED		2
28 #define	CPQARY3_POLL_OCCUPIED		3
29 
30 #define	CPQARY3_PHYCTGS_DONE		0x01
31 #define	CPQARY3_CMDMEM_DONE		0x02
32 #define	CPQARY3_MEMLIST_DONE		0x04
33 
34 #define	CPQARY3_SUBMITTED_Q		0x0100
35 #define	CPQARY3_APPEND_RETRIEVE		1
36 #define	CPQARY3_REMOVE_SUBMITTED	0
37 
38 #define	CPQARY3_Q_UNMASK		0x0300
39 
40 /*
41  * No. of Commands that would be accomodated in each Command Pool
42  * Each command needs a physical contigous memory of 564 Bytes.
43  * The number of blocks to be allocated would be decided at run time
44  * depending upon the maximum outstanding commands supported by that controller.
45  */
46 #define	NO_OF_CMDLIST_IN_A_BLK		3
47 
48 
49 /*
50  * This structure is meant to store the handle of the physically contiguous
51  * memory blcoks that will be allocated during the _meminit().
52  * The no. of blocks that will be allocated will be decide at run time
53  * depending upon the maximum outstanding commands supported by the controller.
54  * each block is physically contiguous & can hold 3 commands.
55  */
56 typedef struct cpqary3_phyctg {
57 	size_t			real_size;
58 	ddi_dma_handle_t	cpqary3_dmahandle;
59 	ddi_acc_handle_t	cpqary3_acchandle;
60 	ddi_dma_cookie_t	cpqary3_dmacookie;
61 } cpqary3_phyctg_t;
62 
63 typedef struct cpqary3_command_private CMDLIST;
64 
65 /* Linked List Structure to hold Command List Details */
66 typedef struct cpqary3_command_private {
67 	uint8_t				occupied;
68 	uint8_t				cmdpvt_flag;
69 	uint32_t			cmdlist_phyaddr;
70 	uint32_t			cmdlist_erraddr;
71 	cpqary3_tag_t 			tag;
72 	ErrorInfo_t			*errorinfop;
73 	CommandList_t			*cmdlist_memaddr;
74 	struct cpqary3_command_private	*next; /* next Command Memory */
75 	struct cpqary3_command_private	*prev; /* previous Command Memory */
76 	struct cpqary3_per_controller	*ctlr; /* to its controller */
77 	struct cpqary3_pkt		*pvt_pkt; /* Driver Private Packet */
78 	struct cpqary3_driver_private	*driverdata; /* command private data */
79 	struct cpqary3_command_private	*snext; /* to maintain Submitted Q & */
80 	struct cpqary3_command_private	*sprev; /* Retrieved Q. */
81 	void				(*complete)(CMDLIST *);
82 } cpqary3_cmdpvt_t;
83 
84 /* structure to maintain a linked list of the memory blocks */
85 typedef struct physical_handle_address {
86 	cpqary3_phyctg_t 		*blk_addr;
87 	struct physical_handle_address  *next;
88 } cpqary3_phys_hdl_addr_t;
89 
90 /* Structure to hold Memory Pool Details */
91 typedef struct cpqary3_cmdmemlist {
92 	uint16_t		max_memcnt;
93 	cpqary3_cmdpvt_t	*pool;
94 	cpqary3_cmdpvt_t	*head;
95 	cpqary3_cmdpvt_t	*tail;
96 	cpqary3_phys_hdl_addr_t *cpqary3_phyctgp; /* list of memory blocks */
97 } cpqary3_cmdmemlist_t;
98 
99 #ifdef	__cplusplus
100 }
101 #endif
102 
103 #endif	/* _CPQARY3_Q_MEM_H */
104