it8xxx2: espi: fill OOB header at driver level

With this change, app code has not to fill/prepare OOB header.
fixes #43568

Signed-off-by: Dino Li <Dino.Li@ite.com.tw>
This commit is contained in:
Dino Li 2022-03-29 17:52:21 +08:00 committed by Carles Cufí
commit e2ce171bed

View file

@ -918,13 +918,11 @@ static int espi_it8xxx2_write_lpc_request(const struct device *dev,
#define ESPI_OOB_TAG 0x00 #define ESPI_OOB_TAG 0x00
#define ESPI_OOB_TIMEOUT_MS 200 #define ESPI_OOB_TIMEOUT_MS 200
/* eSPI oob cycle type, tag, and length fields. */ /* eSPI tag + len[11:8] field */
#define ESPI_OOB_PACKET_SIZE_WITHOUT_DATA_BYTE 3 #define ESPI_TAG_LEN_FIELD(tag, len) \
((((tag) & 0xF) << 4) | (((len) >> 8) & 0xF))
struct espi_oob_msg_packet { struct espi_oob_msg_packet {
uint8_t cycle_type;
uint8_t tag_len_bit_11_8;
uint8_t len_bit_7_0;
uint8_t data_byte[0]; uint8_t data_byte[0];
}; };
@ -938,10 +936,6 @@ static int espi_it8xxx2_send_oob(const struct device *dev,
(struct espi_queue1_regs *)config->base_espi_queue1; (struct espi_queue1_regs *)config->base_espi_queue1;
struct espi_oob_msg_packet *oob_pckt = struct espi_oob_msg_packet *oob_pckt =
(struct espi_oob_msg_packet *)pckt->buf; (struct espi_oob_msg_packet *)pckt->buf;
uint16_t oob_msg_len;
__ASSERT(pckt->len >= ESPI_OOB_PACKET_SIZE_WITHOUT_DATA_BYTE,
"Invalid OOB packet length");
if (!(slave_reg->CH_OOB_CAPCFG3 & IT8XXX2_ESPI_OOB_READY_MASK)) { if (!(slave_reg->CH_OOB_CAPCFG3 & IT8XXX2_ESPI_OOB_READY_MASK)) {
LOG_ERR("%s: OOB channel isn't ready", __func__); LOG_ERR("%s: OOB channel isn't ready", __func__);
@ -953,17 +947,7 @@ static int espi_it8xxx2_send_oob(const struct device *dev,
return -EIO; return -EIO;
} }
oob_msg_len = oob_pckt->len_bit_7_0 | if (pckt->len > ESPI_IT8XXX2_OOB_MAX_PAYLOAD_SIZE) {
((oob_pckt->tag_len_bit_11_8 & 0xf) << 8);
if (pckt->len < (oob_msg_len +
ESPI_OOB_PACKET_SIZE_WITHOUT_DATA_BYTE)) {
LOG_ERR("%s: Out of tx buf %d vs %d", __func__, pckt->len,
(oob_msg_len + ESPI_OOB_PACKET_SIZE_WITHOUT_DATA_BYTE));
return -EINVAL;
}
if (oob_msg_len > ESPI_IT8XXX2_OOB_MAX_PAYLOAD_SIZE) {
LOG_ERR("%s: Out of OOB queue space", __func__); LOG_ERR("%s: Out of OOB queue space", __func__);
return -EINVAL; return -EINVAL;
} }
@ -971,12 +955,12 @@ static int espi_it8xxx2_send_oob(const struct device *dev,
/* Set cycle type */ /* Set cycle type */
slave_reg->ESUCTRL1 = IT8XXX2_ESPI_CYCLE_TYPE_OOB; slave_reg->ESUCTRL1 = IT8XXX2_ESPI_CYCLE_TYPE_OOB;
/* Set tag and length[11:8] */ /* Set tag and length[11:8] */
slave_reg->ESUCTRL2 = oob_pckt->tag_len_bit_11_8; slave_reg->ESUCTRL2 = ESPI_TAG_LEN_FIELD(0, pckt->len);
/* Set length [7:0] */ /* Set length [7:0] */
slave_reg->ESUCTRL3 = oob_pckt->len_bit_7_0; slave_reg->ESUCTRL3 = pckt->len & 0xff;
/* Set data byte */ /* Set data byte */
for (int i = 0; i < oob_msg_len; i++) { for (int i = 0; i < pckt->len; i++) {
queue1_reg->UPSTREAM_DATA[i] = oob_pckt->data_byte[i]; queue1_reg->UPSTREAM_DATA[i] = oob_pckt->data_byte[i];
} }
@ -1023,18 +1007,15 @@ static int espi_it8xxx2_receive_oob(const struct device *dev,
* Buffer passed to driver isn't enough. * Buffer passed to driver isn't enough.
* The first three bytes of buffer are cycle type, tag, and length. * The first three bytes of buffer are cycle type, tag, and length.
*/ */
if ((oob_len + ESPI_OOB_PACKET_SIZE_WITHOUT_DATA_BYTE) > pckt->len) { if (oob_len > pckt->len) {
LOG_ERR("%s: Out of rx buf %d vs %d", __func__, LOG_ERR("%s: Out of rx buf %d vs %d", __func__,
(oob_len + ESPI_OOB_PACKET_SIZE_WITHOUT_DATA_BYTE), pckt->len); oob_len, pckt->len);
return -EINVAL; return -EINVAL;
} }
oob_pckt->cycle_type = ESPI_OOB_CYCLE_TYPE; pckt->len = oob_len;
oob_pckt->tag_len_bit_11_8 = ESPI_OOB_TAG;
oob_pckt->len_bit_7_0 = oob_len;
/* Get data byte */ /* Get data byte */
for (int i = 0; i < oob_pckt->len_bit_7_0; i++) { for (int i = 0; i < oob_len; i++) {
oob_pckt->data_byte[i] = queue0_reg->PUT_OOB_DATA[i]; oob_pckt->data_byte[i] = queue0_reg->PUT_OOB_DATA[i];
} }