1c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#ifndef TARGET_CORE_RD_H
2c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#define TARGET_CORE_RD_H
3c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger
4c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#define RD_HBA_VERSION		"v4.0"
5c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#define RD_DR_VERSION		"4.0"
6c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#define RD_MCP_VERSION		"4.0"
7c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger
8c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* Largest piece of memory kmalloc can allocate */
9c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#define RD_MAX_ALLOCATION_SIZE	65536
10c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#define RD_DEVICE_QUEUE_DEPTH	32
11c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#define RD_MAX_DEVICE_QUEUE_DEPTH 128
12c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#define RD_BLOCKSIZE		512
13c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#define RD_MAX_SECTORS		1024
14c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger
15c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* Used in target_core_init_configfs() for virtual LUN 0 access */
16c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerint __init rd_module_init(void);
17c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingervoid rd_module_exit(void);
18c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger
19c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#define RRF_EMULATE_CDB		0x01
20c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#define RRF_GOT_LBA		0x02
21c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger
22c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstruct rd_request {
23c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger	struct se_task	rd_task;
24c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger
25c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger	/* Offset from start of page */
26c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger	u32		rd_offset;
27c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger	/* Starting page in Ramdisk for request */
28c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger	u32		rd_page;
29c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger	/* Total number of pages needed for request */
30c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger	u32		rd_page_count;
31c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger	/* Scatterlist count */
32c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger	u32		rd_size;
33c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} ____cacheline_aligned;
34c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger
35c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstruct rd_dev_sg_table {
36c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger	u32		page_start_offset;
37c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger	u32		page_end_offset;
38c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger	u32		rd_sg_count;
39c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger	struct scatterlist *sg_table;
40c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} ____cacheline_aligned;
41c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger
42c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#define RDF_HAS_PAGE_COUNT	0x01
43c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger
44c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstruct rd_dev {
45c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger	int		rd_direct;
46c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger	u32		rd_flags;
47c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger	/* Unique Ramdisk Device ID in Ramdisk HBA */
48c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger	u32		rd_dev_id;
49c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger	/* Total page count for ramdisk device */
50c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger	u32		rd_page_count;
51c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger	/* Number of SG tables in sg_table_array */
52c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger	u32		sg_table_count;
53c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger	u32		rd_queue_depth;
54c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger	/* Array of rd_dev_sg_table_t containing scatterlists */
55c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger	struct rd_dev_sg_table *sg_table_array;
56c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger	/* Ramdisk HBA device is connected to */
57c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger	struct rd_host *rd_host;
58c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} ____cacheline_aligned;
59c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger
60c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstruct rd_host {
61c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger	u32		rd_host_dev_id_count;
62c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger	u32		rd_host_id;		/* Unique Ramdisk Host ID */
63c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} ____cacheline_aligned;
64c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger
65c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#endif /* TARGET_CORE_RD_H */
66