tcw
int ccw_device_tm_start_key(struct ccw_device *cdev, struct tcw *tcw,
int ccw_device_tm_start_key(struct ccw_device *, struct tcw *,
int ccw_device_tm_start_timeout_key(struct ccw_device *, struct tcw *,
int ccw_device_tm_start(struct ccw_device *, struct tcw *,
int ccw_device_tm_start_timeout(struct ccw_device *, struct tcw *,
struct tcw *tcw_get_intrg(struct tcw *tcw);
void *tcw_get_data(struct tcw *tcw);
struct tccb *tcw_get_tccb(struct tcw *tcw);
struct tsb *tcw_get_tsb(struct tcw *tcw);
void tcw_init(struct tcw *tcw, int r, int w);
void tcw_finalize(struct tcw *tcw, int num_tidaws);
void tcw_set_intrg(struct tcw *tcw, struct tcw *intrg_tcw);
void tcw_set_data(struct tcw *tcw, void *data, int use_tidal);
void tcw_set_tccb(struct tcw *tcw, struct tccb *tccb);
void tcw_set_tsb(struct tcw *tcw, struct tsb *tsb);
struct tidaw *tcw_add_tidaw(struct tcw *tcw, int num_tidaws, u8 flags,
struct tcw *itcw_get_tcw(struct itcw *itcw);
dma32_t tcw;
struct iv_tcw_private tcw;
struct iv_tcw_private *tcw = &cc->iv_gen_private.tcw;
kfree_sensitive(tcw->iv_seed);
tcw->iv_seed = NULL;
kfree_sensitive(tcw->whitening);
tcw->whitening = NULL;
struct iv_tcw_private *tcw = &cc->iv_gen_private.tcw;
tcw->iv_seed = kzalloc(cc->iv_size, GFP_KERNEL);
tcw->whitening = kzalloc(TCW_WHITENING_SIZE, GFP_KERNEL);
if (!tcw->iv_seed || !tcw->whitening) {
struct iv_tcw_private *tcw = &cc->iv_gen_private.tcw;
memcpy(tcw->iv_seed, &cc->key[key_offset], cc->iv_size);
memcpy(tcw->whitening, &cc->key[key_offset + cc->iv_size],
struct iv_tcw_private *tcw = &cc->iv_gen_private.tcw;
memset(tcw->iv_seed, 0, cc->iv_size);
memset(tcw->whitening, 0, TCW_WHITENING_SIZE);
struct iv_tcw_private *tcw = &cc->iv_gen_private.tcw;
crypto_xor_cpy(buf, tcw->whitening, (u8 *)§or, 8);
crypto_xor_cpy(&buf[8], tcw->whitening + 8, (u8 *)§or, 8);
struct iv_tcw_private *tcw = &cc->iv_gen_private.tcw;
crypto_xor_cpy(iv, tcw->iv_seed, (u8 *)§or, 8);
crypto_xor_cpy(&iv[8], tcw->iv_seed + 8, (u8 *)§or,
if (irb->scsw.tm.tcw)
tsb = tcw_get_tsb(dma32_to_virt(irb->scsw.tm.tcw));
struct tcw *tcw;
datasize = 64 + sizeof(struct tcw) + sizeof(struct tsb);
tcw = erp->cpaddr;
tsb = (struct tsb *) &tcw[1];
*tcw = *((struct tcw *)cqr->cpaddr);
tcw->tsb = virt_to_dma64(tsb);
struct tcw *tcw;
tcw = cqr->cpaddr;
tccb = tcw_get_tccb(tcw);
dma32_to_virt(irb->scsw.tm.tcw));
if (irb->scsw.tm.tcw && (irb->scsw.tm.fcxs & 0x01))
tsb = tcw_get_tsb(dma32_to_virt(irb->scsw.tm.tcw));
int cio_tm_start_key(struct subchannel *sch, struct tcw *tcw, u8 lpm, u8 key)
orb->tm.tcw = virt_to_dma32(tcw);
int cio_tm_start_key(struct subchannel *sch, struct tcw *tcw, u8 lpm, u8 key);
dma32_to_virt(orb->tm.tcw),
sizeof(struct tcw), 0);
int ccw_device_tm_start_timeout_key(struct ccw_device *cdev, struct tcw *tcw,
rc = cio_tm_start_key(sch, tcw, lpm, key);
int ccw_device_tm_start_key(struct ccw_device *cdev, struct tcw *tcw,
return ccw_device_tm_start_timeout_key(cdev, tcw, intparm, lpm, key, 0);
int ccw_device_tm_start(struct ccw_device *cdev, struct tcw *tcw,
return ccw_device_tm_start_key(cdev, tcw, intparm, lpm,
int ccw_device_tm_start_timeout(struct ccw_device *cdev, struct tcw *tcw,
return ccw_device_tm_start_timeout_key(cdev, tcw, intparm, lpm,
void tcw_finalize(struct tcw *tcw, int num_tidaws)
tidaw = tcw_get_data(tcw);
tccb = tcw_get_tccb(tcw);
if (tcw->w && (tcw->flags & TCW_FLAGS_OUTPUT_TIDA))
if (tcw->r)
tcw->input_count = count;
else if (tcw->w)
tcw->output_count = count;
tcw->tccbl = (sizeof(struct tccb) + tca_size(tccb) +
void tcw_set_intrg(struct tcw *tcw, struct tcw *intrg_tcw)
tcw->intrg = virt_to_dma32(intrg_tcw);
void tcw_set_data(struct tcw *tcw, void *data, int use_tidal)
if (tcw->r) {
tcw->input = virt_to_dma64(data);
tcw->flags |= TCW_FLAGS_INPUT_TIDA;
} else if (tcw->w) {
tcw->output = virt_to_dma64(data);
tcw->flags |= TCW_FLAGS_OUTPUT_TIDA;
void tcw_set_tccb(struct tcw *tcw, struct tccb *tccb)
tcw->tccb = virt_to_dma64(tccb);
void tcw_set_tsb(struct tcw *tcw, struct tsb *tsb)
tcw->tsb = virt_to_dma64(tsb);
struct tcw *tcw_get_intrg(struct tcw *tcw)
return dma32_to_virt(tcw->intrg);
struct tidaw *tcw_add_tidaw(struct tcw *tcw, int num_tidaws, u8 flags,
tidaw = ((struct tidaw *) tcw_get_data(tcw)) + num_tidaws;
void *tcw_get_data(struct tcw *tcw)
if (tcw->r)
return dma64_to_virt(tcw->input);
if (tcw->w)
return dma64_to_virt(tcw->output);
struct tccb *tcw_get_tccb(struct tcw *tcw)
return dma64_to_virt(tcw->tccb);
struct tsb *tcw_get_tsb(struct tcw *tcw)
return dma64_to_virt(tcw->tsb);
void tcw_init(struct tcw *tcw, int r, int w)
memset(tcw, 0, sizeof(struct tcw));
tcw->format = TCW_FORMAT_DEFAULT;
tcw->flags = TCW_FLAGS_TIDAW_FORMAT(TCW_TIDAW_FORMAT_DEFAULT);
tcw->r = 1;
tcw->w = 1;
len += /* TCW */ sizeof(struct tcw) + /* TCCB */ TCCB_MAX_SIZE +
len += /* TCW */ sizeof(struct tcw) + /* TCCB */ TCCB_MAX_SIZE +
chunk = fit_chunk(&start, end, sizeof(struct tcw), 64, 0);
itcw->tcw = chunk;
tcw_init(itcw->tcw, (op == ITCW_OP_READ) ? 1 : 0,
chunk = fit_chunk(&start, end, sizeof(struct tcw), 64, 0);
tcw_set_intrg(itcw->tcw, itcw->intrg_tcw);
tcw_set_data(itcw->tcw, chunk, 1);
tcw_set_tsb(itcw->tcw, chunk);
tcw_set_tccb(itcw->tcw, chunk);
return tccb_add_dcw(tcw_get_tccb(itcw->tcw), TCCB_MAX_SIZE, cmd,
following = ((struct tidaw *) tcw_get_data(itcw->tcw))
tcw_add_tidaw(itcw->tcw, itcw->num_tidaws++,
return tcw_add_tidaw(itcw->tcw, itcw->num_tidaws++, flags, addr, count);
tcw_set_data(itcw->tcw, addr, use_tidal);
tcw_finalize(itcw->tcw, itcw->num_tidaws);
struct tcw *tcw;
struct tcw *intrg_tcw;
struct tcw *itcw_get_tcw(struct itcw *itcw)
return itcw->tcw;
dma32_t tcw;