1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 234c2b712SChristof Schmitt /* 334c2b712SChristof Schmitt * zfcp device driver 434c2b712SChristof Schmitt * 534c2b712SChristof Schmitt * Header file for zfcp qdio interface 634c2b712SChristof Schmitt * 7a53c8fabSHeiko Carstens * Copyright IBM Corp. 2010 834c2b712SChristof Schmitt */ 934c2b712SChristof Schmitt 1034c2b712SChristof Schmitt #ifndef ZFCP_QDIO_H 1134c2b712SChristof Schmitt #define ZFCP_QDIO_H 1234c2b712SChristof Schmitt 1334c2b712SChristof Schmitt #include <asm/qdio.h> 1434c2b712SChristof Schmitt 1568322984SChristof Schmitt #define ZFCP_QDIO_SBALE_LEN PAGE_SIZE 1668322984SChristof Schmitt 1701b04759SSwen Schillig /* Max SBALS for chaining */ 1801b04759SSwen Schillig #define ZFCP_QDIO_MAX_SBALS_PER_REQ 36 1901b04759SSwen Schillig 2034c2b712SChristof Schmitt /** 2134c2b712SChristof Schmitt * struct zfcp_qdio - basic qdio data structure 22706eca49SSwen Schillig * @res_q: response queue 2334c2b712SChristof Schmitt * @req_q: request queue 24706eca49SSwen Schillig * @req_q_idx: index of next free buffer 25706eca49SSwen Schillig * @req_q_free: number of free buffers in queue 2634c2b712SChristof Schmitt * @stat_lock: lock to protect req_q_util and req_q_time 2734c2b712SChristof Schmitt * @req_q_lock: lock to serialize access to request queue 2834c2b712SChristof Schmitt * @req_q_time: time of last fill level change 2934c2b712SChristof Schmitt * @req_q_util: used for accounting 3034c2b712SChristof Schmitt * @req_q_full: queue full incidents 3134c2b712SChristof Schmitt * @req_q_wq: used to wait for SBAL availability 3234c2b712SChristof Schmitt * @adapter: adapter used in conjunction with this qdio structure 33*623cd180SSteffen Maier * @max_sbale_per_sbal: qdio limit per sbal 34*623cd180SSteffen Maier * @max_sbale_per_req: qdio limit per request 3534c2b712SChristof Schmitt */ 3634c2b712SChristof Schmitt struct zfcp_qdio { 37706eca49SSwen Schillig struct qdio_buffer *res_q[QDIO_MAX_BUFFERS_PER_Q]; 38706eca49SSwen Schillig struct qdio_buffer *req_q[QDIO_MAX_BUFFERS_PER_Q]; 39706eca49SSwen Schillig u8 req_q_idx; 40706eca49SSwen Schillig atomic_t req_q_free; 4134c2b712SChristof Schmitt spinlock_t stat_lock; 4234c2b712SChristof Schmitt spinlock_t req_q_lock; 4334c2b712SChristof Schmitt unsigned long long req_q_time; 4434c2b712SChristof Schmitt u64 req_q_util; 4534c2b712SChristof Schmitt atomic_t req_q_full; 4634c2b712SChristof Schmitt wait_queue_head_t req_q_wq; 4734c2b712SChristof Schmitt struct zfcp_adapter *adapter; 4886a9668aSSwen Schillig u16 max_sbale_per_sbal; 4986a9668aSSwen Schillig u16 max_sbale_per_req; 5034c2b712SChristof Schmitt }; 5134c2b712SChristof Schmitt 5234c2b712SChristof Schmitt /** 5334c2b712SChristof Schmitt * struct zfcp_qdio_req - qdio queue related values for a request 541674b405SChristof Schmitt * @sbtype: sbal type flags for sbale 0 5534c2b712SChristof Schmitt * @sbal_number: number of free sbals 5634c2b712SChristof Schmitt * @sbal_first: first sbal for this request 5734c2b712SChristof Schmitt * @sbal_last: last sbal for this request 5834c2b712SChristof Schmitt * @sbal_limit: last possible sbal for this request 5934c2b712SChristof Schmitt * @sbale_curr: current sbale at creation of this request 6034c2b712SChristof Schmitt * @qdio_outb_usage: usage of outbound queue 6134c2b712SChristof Schmitt */ 6234c2b712SChristof Schmitt struct zfcp_qdio_req { 633ec90878SJan Glauber u8 sbtype; 6434c2b712SChristof Schmitt u8 sbal_number; 6534c2b712SChristof Schmitt u8 sbal_first; 6634c2b712SChristof Schmitt u8 sbal_last; 6734c2b712SChristof Schmitt u8 sbal_limit; 6834c2b712SChristof Schmitt u8 sbale_curr; 6934c2b712SChristof Schmitt u16 qdio_outb_usage; 7034c2b712SChristof Schmitt }; 7134c2b712SChristof Schmitt 7234c2b712SChristof Schmitt /** 7334c2b712SChristof Schmitt * zfcp_qdio_sbale_req - return pointer to sbale on req_q for a request 7434c2b712SChristof Schmitt * @qdio: pointer to struct zfcp_qdio 75*623cd180SSteffen Maier * @q_req: pointer to struct zfcp_qdio_req 7634c2b712SChristof Schmitt * Returns: pointer to qdio_buffer_element (sbale) structure 7734c2b712SChristof Schmitt */ 7834c2b712SChristof Schmitt static inline struct qdio_buffer_element * 7934c2b712SChristof Schmitt zfcp_qdio_sbale_req(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req) 8034c2b712SChristof Schmitt { 81706eca49SSwen Schillig return &qdio->req_q[q_req->sbal_last]->element[0]; 8234c2b712SChristof Schmitt } 8334c2b712SChristof Schmitt 8434c2b712SChristof Schmitt /** 8534c2b712SChristof Schmitt * zfcp_qdio_sbale_curr - return current sbale on req_q for a request 8634c2b712SChristof Schmitt * @qdio: pointer to struct zfcp_qdio 87*623cd180SSteffen Maier * @q_req: pointer to struct zfcp_qdio_req 8834c2b712SChristof Schmitt * Returns: pointer to qdio_buffer_element (sbale) structure 8934c2b712SChristof Schmitt */ 9034c2b712SChristof Schmitt static inline struct qdio_buffer_element * 9134c2b712SChristof Schmitt zfcp_qdio_sbale_curr(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req) 9234c2b712SChristof Schmitt { 93706eca49SSwen Schillig return &qdio->req_q[q_req->sbal_last]->element[q_req->sbale_curr]; 9434c2b712SChristof Schmitt } 9534c2b712SChristof Schmitt 961674b405SChristof Schmitt /** 971674b405SChristof Schmitt * zfcp_qdio_req_init - initialize qdio request 981674b405SChristof Schmitt * @qdio: request queue where to start putting the request 991674b405SChristof Schmitt * @q_req: the qdio request to start 1001674b405SChristof Schmitt * @req_id: The request id 1011674b405SChristof Schmitt * @sbtype: type flags to set for all sbals 1021674b405SChristof Schmitt * @data: First data block 1031674b405SChristof Schmitt * @len: Length of first data block 1041674b405SChristof Schmitt * 1051674b405SChristof Schmitt * This is the start of putting the request into the queue, the last 1061674b405SChristof Schmitt * step is passing the request to zfcp_qdio_send. The request queue 1071674b405SChristof Schmitt * lock must be held during the whole process from init to send. 1081674b405SChristof Schmitt */ 1091674b405SChristof Schmitt static inline 1101674b405SChristof Schmitt void zfcp_qdio_req_init(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req, 1113ec90878SJan Glauber unsigned long req_id, u8 sbtype, void *data, u32 len) 1121674b405SChristof Schmitt { 1131674b405SChristof Schmitt struct qdio_buffer_element *sbale; 114706eca49SSwen Schillig int count = min(atomic_read(&qdio->req_q_free), 11501b04759SSwen Schillig ZFCP_QDIO_MAX_SBALS_PER_REQ); 1161674b405SChristof Schmitt 117706eca49SSwen Schillig q_req->sbal_first = q_req->sbal_last = qdio->req_q_idx; 1181674b405SChristof Schmitt q_req->sbal_number = 1; 1191674b405SChristof Schmitt q_req->sbtype = sbtype; 120706eca49SSwen Schillig q_req->sbale_curr = 1; 12101b04759SSwen Schillig q_req->sbal_limit = (q_req->sbal_first + count - 1) 12201b04759SSwen Schillig % QDIO_MAX_BUFFERS_PER_Q; 1231674b405SChristof Schmitt 1241674b405SChristof Schmitt sbale = zfcp_qdio_sbale_req(qdio, q_req); 1251674b405SChristof Schmitt sbale->addr = (void *) req_id; 1263ec90878SJan Glauber sbale->eflags = 0; 1273ec90878SJan Glauber sbale->sflags = SBAL_SFLAGS0_COMMAND | sbtype; 1281674b405SChristof Schmitt 129706eca49SSwen Schillig if (unlikely(!data)) 130706eca49SSwen Schillig return; 1311674b405SChristof Schmitt sbale++; 1321674b405SChristof Schmitt sbale->addr = data; 1331674b405SChristof Schmitt sbale->length = len; 1341674b405SChristof Schmitt } 1351674b405SChristof Schmitt 1361674b405SChristof Schmitt /** 1371674b405SChristof Schmitt * zfcp_qdio_fill_next - Fill next sbale, only for single sbal requests 1381674b405SChristof Schmitt * @qdio: pointer to struct zfcp_qdio 1391674b405SChristof Schmitt * @q_req: pointer to struct zfcp_queue_req 140*623cd180SSteffen Maier * @data: pointer to data 141*623cd180SSteffen Maier * @len: length of data 1421674b405SChristof Schmitt * 1431674b405SChristof Schmitt * This is only required for single sbal requests, calling it when 1441674b405SChristof Schmitt * wrapping around to the next sbal is a bug. 1451674b405SChristof Schmitt */ 1461674b405SChristof Schmitt static inline 1471674b405SChristof Schmitt void zfcp_qdio_fill_next(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req, 1481674b405SChristof Schmitt void *data, u32 len) 1491674b405SChristof Schmitt { 1501674b405SChristof Schmitt struct qdio_buffer_element *sbale; 1511674b405SChristof Schmitt 15286a9668aSSwen Schillig BUG_ON(q_req->sbale_curr == qdio->max_sbale_per_sbal - 1); 1531674b405SChristof Schmitt q_req->sbale_curr++; 1541674b405SChristof Schmitt sbale = zfcp_qdio_sbale_curr(qdio, q_req); 1551674b405SChristof Schmitt sbale->addr = data; 1561674b405SChristof Schmitt sbale->length = len; 1571674b405SChristof Schmitt } 1581674b405SChristof Schmitt 1591674b405SChristof Schmitt /** 1601674b405SChristof Schmitt * zfcp_qdio_set_sbale_last - set last entry flag in current sbale 1611674b405SChristof Schmitt * @qdio: pointer to struct zfcp_qdio 1621674b405SChristof Schmitt * @q_req: pointer to struct zfcp_queue_req 1631674b405SChristof Schmitt */ 1641674b405SChristof Schmitt static inline 1651674b405SChristof Schmitt void zfcp_qdio_set_sbale_last(struct zfcp_qdio *qdio, 1661674b405SChristof Schmitt struct zfcp_qdio_req *q_req) 1671674b405SChristof Schmitt { 1681674b405SChristof Schmitt struct qdio_buffer_element *sbale; 1691674b405SChristof Schmitt 1701674b405SChristof Schmitt sbale = zfcp_qdio_sbale_curr(qdio, q_req); 1713ec90878SJan Glauber sbale->eflags |= SBAL_EFLAGS_LAST_ENTRY; 1721674b405SChristof Schmitt } 1731674b405SChristof Schmitt 1741674b405SChristof Schmitt /** 1751674b405SChristof Schmitt * zfcp_qdio_sg_one_sbal - check if one sbale is enough for sg data 1761674b405SChristof Schmitt * @sg: The scatterlist where to check the data size 1771674b405SChristof Schmitt * 1781674b405SChristof Schmitt * Returns: 1 when one sbale is enough for the data in the scatterlist, 1791674b405SChristof Schmitt * 0 if not. 1801674b405SChristof Schmitt */ 1811674b405SChristof Schmitt static inline 1821674b405SChristof Schmitt int zfcp_qdio_sg_one_sbale(struct scatterlist *sg) 1831674b405SChristof Schmitt { 1841674b405SChristof Schmitt return sg_is_last(sg) && sg->length <= ZFCP_QDIO_SBALE_LEN; 1851674b405SChristof Schmitt } 1861674b405SChristof Schmitt 1871674b405SChristof Schmitt /** 1881674b405SChristof Schmitt * zfcp_qdio_skip_to_last_sbale - skip to last sbale in sbal 189*623cd180SSteffen Maier * @qdio: pointer to struct zfcp_qdio 1901674b405SChristof Schmitt * @q_req: The current zfcp_qdio_req 1911674b405SChristof Schmitt */ 1921674b405SChristof Schmitt static inline 19386a9668aSSwen Schillig void zfcp_qdio_skip_to_last_sbale(struct zfcp_qdio *qdio, 19486a9668aSSwen Schillig struct zfcp_qdio_req *q_req) 1951674b405SChristof Schmitt { 19686a9668aSSwen Schillig q_req->sbale_curr = qdio->max_sbale_per_sbal - 1; 1971674b405SChristof Schmitt } 1981674b405SChristof Schmitt 19901b04759SSwen Schillig /** 20001b04759SSwen Schillig * zfcp_qdio_sbal_limit - set the sbal limit for a request in q_req 20101b04759SSwen Schillig * @qdio: pointer to struct zfcp_qdio 20201b04759SSwen Schillig * @q_req: The current zfcp_qdio_req 20301b04759SSwen Schillig * @max_sbals: maximum number of SBALs allowed 20401b04759SSwen Schillig */ 20501b04759SSwen Schillig static inline 20601b04759SSwen Schillig void zfcp_qdio_sbal_limit(struct zfcp_qdio *qdio, 20701b04759SSwen Schillig struct zfcp_qdio_req *q_req, int max_sbals) 20801b04759SSwen Schillig { 209706eca49SSwen Schillig int count = min(atomic_read(&qdio->req_q_free), max_sbals); 21001b04759SSwen Schillig 21101b04759SSwen Schillig q_req->sbal_limit = (q_req->sbal_first + count - 1) % 21201b04759SSwen Schillig QDIO_MAX_BUFFERS_PER_Q; 21301b04759SSwen Schillig } 21401b04759SSwen Schillig 215ef3eb71dSFelix Beck /** 216ef3eb71dSFelix Beck * zfcp_qdio_set_data_div - set data division count 217ef3eb71dSFelix Beck * @qdio: pointer to struct zfcp_qdio 218ef3eb71dSFelix Beck * @q_req: The current zfcp_qdio_req 219ef3eb71dSFelix Beck * @count: The data division count 220ef3eb71dSFelix Beck */ 221ef3eb71dSFelix Beck static inline 222ef3eb71dSFelix Beck void zfcp_qdio_set_data_div(struct zfcp_qdio *qdio, 223ef3eb71dSFelix Beck struct zfcp_qdio_req *q_req, u32 count) 224ef3eb71dSFelix Beck { 225ef3eb71dSFelix Beck struct qdio_buffer_element *sbale; 226ef3eb71dSFelix Beck 22786a9668aSSwen Schillig sbale = qdio->req_q[q_req->sbal_first]->element; 228ef3eb71dSFelix Beck sbale->length = count; 229ef3eb71dSFelix Beck } 230ef3eb71dSFelix Beck 23186a9668aSSwen Schillig /** 23286a9668aSSwen Schillig * zfcp_qdio_real_bytes - count bytes used 23386a9668aSSwen Schillig * @sg: pointer to struct scatterlist 23486a9668aSSwen Schillig */ 23586a9668aSSwen Schillig static inline 23686a9668aSSwen Schillig unsigned int zfcp_qdio_real_bytes(struct scatterlist *sg) 23786a9668aSSwen Schillig { 23886a9668aSSwen Schillig unsigned int real_bytes = 0; 23986a9668aSSwen Schillig 24086a9668aSSwen Schillig for (; sg; sg = sg_next(sg)) 24186a9668aSSwen Schillig real_bytes += sg->length; 24286a9668aSSwen Schillig 24386a9668aSSwen Schillig return real_bytes; 24486a9668aSSwen Schillig } 24586a9668aSSwen Schillig 24686a9668aSSwen Schillig /** 24786a9668aSSwen Schillig * zfcp_qdio_set_scount - set SBAL count value 24886a9668aSSwen Schillig * @qdio: pointer to struct zfcp_qdio 24986a9668aSSwen Schillig * @q_req: The current zfcp_qdio_req 25086a9668aSSwen Schillig */ 25186a9668aSSwen Schillig static inline 25286a9668aSSwen Schillig void zfcp_qdio_set_scount(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req) 25386a9668aSSwen Schillig { 25486a9668aSSwen Schillig struct qdio_buffer_element *sbale; 25586a9668aSSwen Schillig 25686a9668aSSwen Schillig sbale = qdio->req_q[q_req->sbal_first]->element; 25786a9668aSSwen Schillig sbale->scount = q_req->sbal_number - 1; 25886a9668aSSwen Schillig } 25986a9668aSSwen Schillig 26034c2b712SChristof Schmitt #endif /* ZFCP_QDIO_H */ 261