|
@@ -30,6 +30,7 @@
|
|
|
#include "octeon_main.h"
|
|
|
#include "octeon_network.h"
|
|
|
#include "cn66xx_device.h"
|
|
|
+#include "cn23xx_pf_device.h"
|
|
|
|
|
|
#define INCR_INSTRQUEUE_PKT_COUNT(octeon_dev_ptr, iq_no, field, count) \
|
|
|
(octeon_dev_ptr->instr_queue[iq_no]->stats.field += count)
|
|
@@ -71,7 +72,8 @@ int octeon_init_instr_queue(struct octeon_device *oct,
|
|
|
|
|
|
if (OCTEON_CN6XXX(oct))
|
|
|
conf = &(CFG_GET_IQ_CFG(CHIP_FIELD(oct, cn6xxx, conf)));
|
|
|
-
|
|
|
+ else if (OCTEON_CN23XX_PF(oct))
|
|
|
+ conf = &(CFG_GET_IQ_CFG(CHIP_FIELD(oct, cn23xx_pf, conf)));
|
|
|
if (!conf) {
|
|
|
dev_err(&oct->pci_dev->dev, "Unsupported Chip %x\n",
|
|
|
oct->chip_id);
|
|
@@ -88,6 +90,7 @@ int octeon_init_instr_queue(struct octeon_device *oct,
|
|
|
q_size = (u32)conf->instr_type * num_descs;
|
|
|
|
|
|
iq = oct->instr_queue[iq_no];
|
|
|
+
|
|
|
iq->oct_dev = oct;
|
|
|
|
|
|
set_dev_node(&oct->pci_dev->dev, numa_node);
|
|
@@ -181,6 +184,9 @@ int octeon_delete_instr_queue(struct octeon_device *oct, u32 iq_no)
|
|
|
if (OCTEON_CN6XXX(oct))
|
|
|
desc_size =
|
|
|
CFG_GET_IQ_INSTR_TYPE(CHIP_FIELD(oct, cn6xxx, conf));
|
|
|
+ else if (OCTEON_CN23XX_PF(oct))
|
|
|
+ desc_size =
|
|
|
+ CFG_GET_IQ_INSTR_TYPE(CHIP_FIELD(oct, cn23xx_pf, conf));
|
|
|
|
|
|
vfree(iq->request_list);
|
|
|
|
|
@@ -383,7 +389,12 @@ lio_process_iq_request_list(struct octeon_device *oct,
|
|
|
case REQTYPE_SOFT_COMMAND:
|
|
|
sc = buf;
|
|
|
|
|
|
- irh = (struct octeon_instr_irh *)&sc->cmd.cmd2.irh;
|
|
|
+ if (OCTEON_CN23XX_PF(oct))
|
|
|
+ irh = (struct octeon_instr_irh *)
|
|
|
+ &sc->cmd.cmd3.irh;
|
|
|
+ else
|
|
|
+ irh = (struct octeon_instr_irh *)
|
|
|
+ &sc->cmd.cmd2.irh;
|
|
|
if (irh->rflag) {
|
|
|
/* We're expecting a response from Octeon.
|
|
|
* It's up to lio_process_ordered_list() to
|
|
@@ -583,6 +594,8 @@ octeon_prepare_soft_command(struct octeon_device *oct,
|
|
|
{
|
|
|
struct octeon_config *oct_cfg;
|
|
|
struct octeon_instr_ih2 *ih2;
|
|
|
+ struct octeon_instr_ih3 *ih3;
|
|
|
+ struct octeon_instr_pki_ih3 *pki_ih3;
|
|
|
struct octeon_instr_irh *irh;
|
|
|
struct octeon_instr_rdp *rdp;
|
|
|
|
|
@@ -591,36 +604,88 @@ octeon_prepare_soft_command(struct octeon_device *oct,
|
|
|
|
|
|
oct_cfg = octeon_get_conf(oct);
|
|
|
|
|
|
- ih2 = (struct octeon_instr_ih2 *)&sc->cmd.cmd2.ih2;
|
|
|
- ih2->tagtype = ATOMIC_TAG;
|
|
|
- ih2->tag = LIO_CONTROL;
|
|
|
- ih2->raw = 1;
|
|
|
- ih2->grp = CFG_GET_CTRL_Q_GRP(oct_cfg);
|
|
|
-
|
|
|
- if (sc->datasize) {
|
|
|
- ih2->dlengsz = sc->datasize;
|
|
|
- ih2->rs = 1;
|
|
|
- }
|
|
|
-
|
|
|
- irh = (struct octeon_instr_irh *)&sc->cmd.cmd2.irh;
|
|
|
- irh->opcode = opcode;
|
|
|
- irh->subcode = subcode;
|
|
|
-
|
|
|
- /* opcode/subcode specific parameters (ossp) */
|
|
|
- irh->ossp = irh_ossp;
|
|
|
- sc->cmd.cmd2.ossp[0] = ossp0;
|
|
|
- sc->cmd.cmd2.ossp[1] = ossp1;
|
|
|
-
|
|
|
- if (sc->rdatasize) {
|
|
|
- rdp = (struct octeon_instr_rdp *)&sc->cmd.cmd2.rdp;
|
|
|
- rdp->pcie_port = oct->pcie_port;
|
|
|
- rdp->rlen = sc->rdatasize;
|
|
|
+ if (OCTEON_CN23XX_PF(oct)) {
|
|
|
+ ih3 = (struct octeon_instr_ih3 *)&sc->cmd.cmd3.ih3;
|
|
|
+
|
|
|
+ ih3->pkind = oct->instr_queue[sc->iq_no]->txpciq.s.pkind;
|
|
|
+
|
|
|
+ pki_ih3 = (struct octeon_instr_pki_ih3 *)&sc->cmd.cmd3.pki_ih3;
|
|
|
+
|
|
|
+ pki_ih3->w = 1;
|
|
|
+ pki_ih3->raw = 1;
|
|
|
+ pki_ih3->utag = 1;
|
|
|
+ pki_ih3->uqpg =
|
|
|
+ oct->instr_queue[sc->iq_no]->txpciq.s.use_qpg;
|
|
|
+ pki_ih3->utt = 1;
|
|
|
+ pki_ih3->tag = LIO_CONTROL;
|
|
|
+ pki_ih3->tagtype = ATOMIC_TAG;
|
|
|
+ pki_ih3->qpg =
|
|
|
+ oct->instr_queue[sc->iq_no]->txpciq.s.qpg;
|
|
|
+ pki_ih3->pm = 0x7;
|
|
|
+ pki_ih3->sl = 8;
|
|
|
+
|
|
|
+ if (sc->datasize)
|
|
|
+ ih3->dlengsz = sc->datasize;
|
|
|
+
|
|
|
+ irh = (struct octeon_instr_irh *)&sc->cmd.cmd3.irh;
|
|
|
+ irh->opcode = opcode;
|
|
|
+ irh->subcode = subcode;
|
|
|
+
|
|
|
+ /* opcode/subcode specific parameters (ossp) */
|
|
|
+ irh->ossp = irh_ossp;
|
|
|
+ sc->cmd.cmd3.ossp[0] = ossp0;
|
|
|
+ sc->cmd.cmd3.ossp[1] = ossp1;
|
|
|
+
|
|
|
+ if (sc->rdatasize) {
|
|
|
+ rdp = (struct octeon_instr_rdp *)&sc->cmd.cmd3.rdp;
|
|
|
+ rdp->pcie_port = oct->pcie_port;
|
|
|
+ rdp->rlen = sc->rdatasize;
|
|
|
+
|
|
|
+ irh->rflag = 1;
|
|
|
+ /*PKI IH3*/
|
|
|
+ /* pki_ih3 irh+ossp[0]+ossp[1]+rdp+rptr = 48 bytes */
|
|
|
+ ih3->fsz = LIO_SOFTCMDRESP_IH3;
|
|
|
+ } else {
|
|
|
+ irh->rflag = 0;
|
|
|
+ /*PKI IH3*/
|
|
|
+ /* pki_h3 + irh + ossp[0] + ossp[1] = 32 bytes */
|
|
|
+ ih3->fsz = LIO_PCICMD_O3;
|
|
|
+ }
|
|
|
|
|
|
- irh->rflag = 1;
|
|
|
- ih2->fsz = 40; /* irh+ossp[0]+ossp[1]+rdp+rptr = 40 bytes */
|
|
|
} else {
|
|
|
- irh->rflag = 0;
|
|
|
- ih2->fsz = 24; /* irh + ossp[0] + ossp[1] = 24 bytes */
|
|
|
+ ih2 = (struct octeon_instr_ih2 *)&sc->cmd.cmd2.ih2;
|
|
|
+ ih2->tagtype = ATOMIC_TAG;
|
|
|
+ ih2->tag = LIO_CONTROL;
|
|
|
+ ih2->raw = 1;
|
|
|
+ ih2->grp = CFG_GET_CTRL_Q_GRP(oct_cfg);
|
|
|
+
|
|
|
+ if (sc->datasize) {
|
|
|
+ ih2->dlengsz = sc->datasize;
|
|
|
+ ih2->rs = 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ irh = (struct octeon_instr_irh *)&sc->cmd.cmd2.irh;
|
|
|
+ irh->opcode = opcode;
|
|
|
+ irh->subcode = subcode;
|
|
|
+
|
|
|
+ /* opcode/subcode specific parameters (ossp) */
|
|
|
+ irh->ossp = irh_ossp;
|
|
|
+ sc->cmd.cmd2.ossp[0] = ossp0;
|
|
|
+ sc->cmd.cmd2.ossp[1] = ossp1;
|
|
|
+
|
|
|
+ if (sc->rdatasize) {
|
|
|
+ rdp = (struct octeon_instr_rdp *)&sc->cmd.cmd2.rdp;
|
|
|
+ rdp->pcie_port = oct->pcie_port;
|
|
|
+ rdp->rlen = sc->rdatasize;
|
|
|
+
|
|
|
+ irh->rflag = 1;
|
|
|
+ /* irh+ossp[0]+ossp[1]+rdp+rptr = 40 bytes */
|
|
|
+ ih2->fsz = LIO_SOFTCMDRESP_IH2;
|
|
|
+ } else {
|
|
|
+ irh->rflag = 0;
|
|
|
+ /* irh + ossp[0] + ossp[1] = 24 bytes */
|
|
|
+ ih2->fsz = LIO_PCICMD_O2;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -628,23 +693,39 @@ int octeon_send_soft_command(struct octeon_device *oct,
|
|
|
struct octeon_soft_command *sc)
|
|
|
{
|
|
|
struct octeon_instr_ih2 *ih2;
|
|
|
+ struct octeon_instr_ih3 *ih3;
|
|
|
struct octeon_instr_irh *irh;
|
|
|
u32 len;
|
|
|
|
|
|
- ih2 = (struct octeon_instr_ih2 *)&sc->cmd.cmd2.ih2;
|
|
|
- if (ih2->dlengsz) {
|
|
|
- WARN_ON(!sc->dmadptr);
|
|
|
- sc->cmd.cmd2.dptr = sc->dmadptr;
|
|
|
- }
|
|
|
- irh = (struct octeon_instr_irh *)&sc->cmd.cmd2.irh;
|
|
|
- if (irh->rflag) {
|
|
|
- WARN_ON(!sc->dmarptr);
|
|
|
- WARN_ON(!sc->status_word);
|
|
|
- *sc->status_word = COMPLETION_WORD_INIT;
|
|
|
-
|
|
|
- sc->cmd.cmd2.rptr = sc->dmarptr;
|
|
|
+ if (OCTEON_CN23XX_PF(oct)) {
|
|
|
+ ih3 = (struct octeon_instr_ih3 *)&sc->cmd.cmd3.ih3;
|
|
|
+ if (ih3->dlengsz) {
|
|
|
+ WARN_ON(!sc->dmadptr);
|
|
|
+ sc->cmd.cmd3.dptr = sc->dmadptr;
|
|
|
+ }
|
|
|
+ irh = (struct octeon_instr_irh *)&sc->cmd.cmd3.irh;
|
|
|
+ if (irh->rflag) {
|
|
|
+ WARN_ON(!sc->dmarptr);
|
|
|
+ WARN_ON(!sc->status_word);
|
|
|
+ *sc->status_word = COMPLETION_WORD_INIT;
|
|
|
+ sc->cmd.cmd3.rptr = sc->dmarptr;
|
|
|
+ }
|
|
|
+ len = (u32)ih3->dlengsz;
|
|
|
+ } else {
|
|
|
+ ih2 = (struct octeon_instr_ih2 *)&sc->cmd.cmd2.ih2;
|
|
|
+ if (ih2->dlengsz) {
|
|
|
+ WARN_ON(!sc->dmadptr);
|
|
|
+ sc->cmd.cmd2.dptr = sc->dmadptr;
|
|
|
+ }
|
|
|
+ irh = (struct octeon_instr_irh *)&sc->cmd.cmd2.irh;
|
|
|
+ if (irh->rflag) {
|
|
|
+ WARN_ON(!sc->dmarptr);
|
|
|
+ WARN_ON(!sc->status_word);
|
|
|
+ *sc->status_word = COMPLETION_WORD_INIT;
|
|
|
+ sc->cmd.cmd2.rptr = sc->dmarptr;
|
|
|
+ }
|
|
|
+ len = (u32)ih2->dlengsz;
|
|
|
}
|
|
|
- len = (u32)ih2->dlengsz;
|
|
|
|
|
|
if (sc->wait_time)
|
|
|
sc->timeout = jiffies + sc->wait_time;
|