mei: hw: add dma ring control block

The DMA ring control block contains write and read
indices for host and device circular buffers.

Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: Alexander Usyskin <alexander.usyskin@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Tomas Winkler 2018-11-22 13:11:38 +02:00 committed by Greg Kroah-Hartman
parent c55bf542e9
commit 2513eb0dd7
4 changed files with 46 additions and 0 deletions

View File

@ -97,3 +97,23 @@ bool mei_dma_ring_is_allocated(struct mei_device *dev)
{ {
return !!dev->dr_dscr[DMA_DSCR_HOST].vaddr; return !!dev->dr_dscr[DMA_DSCR_HOST].vaddr;
} }
static inline
struct hbm_dma_ring_ctrl *mei_dma_ring_ctrl(struct mei_device *dev)
{
return (struct hbm_dma_ring_ctrl *)dev->dr_dscr[DMA_DSCR_CTRL].vaddr;
}
/**
* mei_dma_ring_reset() - reset the dma control block
* @dev: mei device
*/
void mei_dma_ring_reset(struct mei_device *dev)
{
struct hbm_dma_ring_ctrl *ctrl = mei_dma_ring_ctrl(dev);
if (!ctrl)
return;
memset(ctrl, 0, sizeof(*ctrl));
}

View File

@ -323,6 +323,8 @@ static int mei_hbm_dma_setup_req(struct mei_device *dev)
req.dma_dscr[i].size = dev->dr_dscr[i].size; req.dma_dscr[i].size = dev->dr_dscr[i].size;
} }
mei_dma_ring_reset(dev);
ret = mei_hbm_write_message(dev, &mei_hdr, &req); ret = mei_hbm_write_message(dev, &mei_hdr, &req);
if (ret) { if (ret) {
dev_err(dev->dev, "dma setup request write failed: ret = %d.\n", dev_err(dev->dev, "dma setup request write failed: ret = %d.\n",

View File

@ -512,4 +512,27 @@ struct hbm_dma_setup_response {
u8 reserved[2]; u8 reserved[2];
} __packed; } __packed;
/**
* struct mei_dma_ring_ctrl - dma ring control block
*
* @hbuf_wr_idx: host circular buffer write index in slots
* @reserved1: reserved for alignment
* @hbuf_rd_idx: host circular buffer read index in slots
* @reserved2: reserved for alignment
* @dbuf_wr_idx: device circular buffer write index in slots
* @reserved3: reserved for alignment
* @dbuf_rd_idx: device circular buffer read index in slots
* @reserved4: reserved for alignment
*/
struct hbm_dma_ring_ctrl {
u32 hbuf_wr_idx;
u32 reserved1;
u32 hbuf_rd_idx;
u32 reserved2;
u32 dbuf_wr_idx;
u32 reserved3;
u32 dbuf_rd_idx;
u32 reserved4;
} __packed;
#endif #endif

View File

@ -597,6 +597,7 @@ void mei_cancel_work(struct mei_device *dev);
int mei_dmam_ring_alloc(struct mei_device *dev); int mei_dmam_ring_alloc(struct mei_device *dev);
void mei_dmam_ring_free(struct mei_device *dev); void mei_dmam_ring_free(struct mei_device *dev);
bool mei_dma_ring_is_allocated(struct mei_device *dev); bool mei_dma_ring_is_allocated(struct mei_device *dev);
void mei_dma_ring_reset(struct mei_device *dev);
/* /*
* MEI interrupt functions prototype * MEI interrupt functions prototype