|
@@ -38,69 +38,7 @@
|
|
|
|
|
|
#define CMD_POLL_TOKEN 0xffff
|
|
|
#define CMD_MAX_NUM 32
|
|
|
-#define STATUS_MASK 0xff
|
|
|
#define CMD_TOKEN_MASK 0x1f
|
|
|
-#define GO_BIT_TIMEOUT_MSECS 10000
|
|
|
-
|
|
|
-enum {
|
|
|
- HCR_TOKEN_OFFSET = 0x14,
|
|
|
- HCR_STATUS_OFFSET = 0x18,
|
|
|
- HCR_GO_BIT = 15,
|
|
|
-};
|
|
|
-
|
|
|
-static int cmd_pending(struct hns_roce_dev *hr_dev)
|
|
|
-{
|
|
|
- u32 status = readl(hr_dev->cmd.hcr + HCR_TOKEN_OFFSET);
|
|
|
-
|
|
|
- return (!!(status & (1 << HCR_GO_BIT)));
|
|
|
-}
|
|
|
-
|
|
|
-/* this function should be serialized with "hcr_mutex" */
|
|
|
-static int __hns_roce_cmd_mbox_post_hw(struct hns_roce_dev *hr_dev,
|
|
|
- u64 in_param, u64 out_param,
|
|
|
- u32 in_modifier, u8 op_modifier, u16 op,
|
|
|
- u16 token, int event)
|
|
|
-{
|
|
|
- struct hns_roce_cmdq *cmd = &hr_dev->cmd;
|
|
|
- struct device *dev = &hr_dev->pdev->dev;
|
|
|
- u32 __iomem *hcr = (u32 *)cmd->hcr;
|
|
|
- int ret = -EAGAIN;
|
|
|
- unsigned long end;
|
|
|
- u32 val = 0;
|
|
|
-
|
|
|
- end = msecs_to_jiffies(GO_BIT_TIMEOUT_MSECS) + jiffies;
|
|
|
- while (cmd_pending(hr_dev)) {
|
|
|
- if (time_after(jiffies, end)) {
|
|
|
- dev_dbg(dev, "jiffies=%d end=%d\n", (int)jiffies,
|
|
|
- (int)end);
|
|
|
- goto out;
|
|
|
- }
|
|
|
- cond_resched();
|
|
|
- }
|
|
|
-
|
|
|
- roce_set_field(val, ROCEE_MB6_ROCEE_MB_CMD_M, ROCEE_MB6_ROCEE_MB_CMD_S,
|
|
|
- op);
|
|
|
- roce_set_field(val, ROCEE_MB6_ROCEE_MB_CMD_MDF_M,
|
|
|
- ROCEE_MB6_ROCEE_MB_CMD_MDF_S, op_modifier);
|
|
|
- roce_set_bit(val, ROCEE_MB6_ROCEE_MB_EVENT_S, event);
|
|
|
- roce_set_bit(val, ROCEE_MB6_ROCEE_MB_HW_RUN_S, 1);
|
|
|
- roce_set_field(val, ROCEE_MB6_ROCEE_MB_TOKEN_M,
|
|
|
- ROCEE_MB6_ROCEE_MB_TOKEN_S, token);
|
|
|
-
|
|
|
- __raw_writeq(cpu_to_le64(in_param), hcr + 0);
|
|
|
- __raw_writeq(cpu_to_le64(out_param), hcr + 2);
|
|
|
- __raw_writel(cpu_to_le32(in_modifier), hcr + 4);
|
|
|
- /* Memory barrier */
|
|
|
- wmb();
|
|
|
-
|
|
|
- __raw_writel(cpu_to_le32(val), hcr + 5);
|
|
|
-
|
|
|
- mmiowb();
|
|
|
- ret = 0;
|
|
|
-
|
|
|
-out:
|
|
|
- return ret;
|
|
|
-}
|
|
|
|
|
|
static int hns_roce_cmd_mbox_post_hw(struct hns_roce_dev *hr_dev, u64 in_param,
|
|
|
u64 out_param, u32 in_modifier,
|
|
@@ -108,12 +46,11 @@ static int hns_roce_cmd_mbox_post_hw(struct hns_roce_dev *hr_dev, u64 in_param,
|
|
|
int event)
|
|
|
{
|
|
|
struct hns_roce_cmdq *cmd = &hr_dev->cmd;
|
|
|
- int ret = -EAGAIN;
|
|
|
+ int ret;
|
|
|
|
|
|
mutex_lock(&cmd->hcr_mutex);
|
|
|
- ret = __hns_roce_cmd_mbox_post_hw(hr_dev, in_param, out_param,
|
|
|
- in_modifier, op_modifier, op, token,
|
|
|
- event);
|
|
|
+ ret = hr_dev->hw->post_mbox(hr_dev, in_param, out_param, in_modifier,
|
|
|
+ op_modifier, op, token, event);
|
|
|
mutex_unlock(&cmd->hcr_mutex);
|
|
|
|
|
|
return ret;
|
|
@@ -126,9 +63,6 @@ static int __hns_roce_cmd_mbox_poll(struct hns_roce_dev *hr_dev, u64 in_param,
|
|
|
unsigned long timeout)
|
|
|
{
|
|
|
struct device *dev = hr_dev->dev;
|
|
|
- u8 __iomem *hcr = hr_dev->cmd.hcr;
|
|
|
- unsigned long end = 0;
|
|
|
- u32 status = 0;
|
|
|
int ret;
|
|
|
|
|
|
ret = hns_roce_cmd_mbox_post_hw(hr_dev, in_param, out_param,
|
|
@@ -136,29 +70,10 @@ static int __hns_roce_cmd_mbox_poll(struct hns_roce_dev *hr_dev, u64 in_param,
|
|
|
CMD_POLL_TOKEN, 0);
|
|
|
if (ret) {
|
|
|
dev_err(dev, "[cmd_poll]hns_roce_cmd_mbox_post_hw failed\n");
|
|
|
- goto out;
|
|
|
- }
|
|
|
-
|
|
|
- end = msecs_to_jiffies(timeout) + jiffies;
|
|
|
- while (cmd_pending(hr_dev) && time_before(jiffies, end))
|
|
|
- cond_resched();
|
|
|
-
|
|
|
- if (cmd_pending(hr_dev)) {
|
|
|
- dev_err(dev, "[cmd_poll]hw run cmd TIMEDOUT!\n");
|
|
|
- ret = -ETIMEDOUT;
|
|
|
- goto out;
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
- status = le32_to_cpu((__force __be32)
|
|
|
- __raw_readl(hcr + HCR_STATUS_OFFSET));
|
|
|
- if ((status & STATUS_MASK) != 0x1) {
|
|
|
- dev_err(dev, "mailbox status 0x%x!\n", status);
|
|
|
- ret = -EBUSY;
|
|
|
- goto out;
|
|
|
- }
|
|
|
-
|
|
|
-out:
|
|
|
- return ret;
|
|
|
+ return hr_dev->hw->chk_mbox(hr_dev, timeout);
|
|
|
}
|
|
|
|
|
|
static int hns_roce_cmd_mbox_poll(struct hns_roce_dev *hr_dev, u64 in_param,
|
|
@@ -198,7 +113,7 @@ static int __hns_roce_cmd_mbox_wait(struct hns_roce_dev *hr_dev, u64 in_param,
|
|
|
struct hns_roce_cmdq *cmd = &hr_dev->cmd;
|
|
|
struct hns_roce_cmd_context *context;
|
|
|
struct device *dev = hr_dev->dev;
|
|
|
- int ret = 0;
|
|
|
+ int ret;
|
|
|
|
|
|
spin_lock(&cmd->context_lock);
|
|
|
WARN_ON(cmd->free_head < 0);
|
|
@@ -280,7 +195,6 @@ int hns_roce_cmd_init(struct hns_roce_dev *hr_dev)
|
|
|
hr_dev->cmd.use_events = 0;
|
|
|
hr_dev->cmd.toggle = 1;
|
|
|
hr_dev->cmd.max_cmds = CMD_MAX_NUM;
|
|
|
- hr_dev->cmd.hcr = hr_dev->reg_base + ROCEE_MB1_REG;
|
|
|
hr_dev->cmd.pool = dma_pool_create("hns_roce_cmd", dev,
|
|
|
HNS_ROCE_MAILBOX_SIZE,
|
|
|
HNS_ROCE_MAILBOX_SIZE, 0);
|