Skip to content

Commit 817e60a

Browse files
committed
Merge branch 'nfp-add-NFP5000-support'
Jakub Kicinski says: ==================== nfp: add NFP5000 support This series broadly speaking adds support for NFP5000 and related products. First we add support for loading FW from flash. We need to allow for the management processor to provide extended log messages when FW is loaded. This is needed when FW selection policy is to compare the FW on the disk and in the flash, and load the newer. User should be told what FW was selected. We use this opportunity to add extended errors for normal FW loading as well. Next we add support for requesting HW information from the management processor. Up until now the driver read the HWinfo as it appears in card memory, but there can be cases when management processor has additional information or generates the entries dynamically so occasionally we will have to consult it. We use this to look up MAC addresses for PCIe netdevs. Next the actual patch with NFP5000 support and a small dose of refactoring of PCIe init. The remaining patches add support for reading RTsymbol types we didn't need before. Ones explicitly placed in external memory unit's cache and absolute ones. This part begins with a patch moving the logic which figures out the correct bit offsets to device probe, to avoid redoing the calculation for each access. Second patch adds error messages for easier troubleshooting. Next patch adds helpers which will take care of address conversions to reach into EMU cache. Subsequently users are migrated from the raw CPP API to the new RTsym helpers. Finally we add support for reading absolute symbols. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
2 parents 09990ad + 4152e58 commit 817e60a

File tree

15 files changed

+682
-236
lines changed

15 files changed

+682
-236
lines changed

drivers/net/ethernet/netronome/nfp/abm/ctrl.c

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -55,30 +55,21 @@
5555
#define NFP_QMSTAT_DROP 16
5656
#define NFP_QMSTAT_ECN 24
5757

58-
static unsigned long long
59-
nfp_abm_q_lvl_thrs(struct nfp_abm_link *alink, unsigned int queue)
60-
{
61-
return alink->abm->q_lvls->addr +
62-
(alink->queue_base + queue) * NFP_QLVL_STRIDE + NFP_QLVL_THRS;
63-
}
64-
6558
static int
6659
nfp_abm_ctrl_stat(struct nfp_abm_link *alink, const struct nfp_rtsym *sym,
6760
unsigned int stride, unsigned int offset, unsigned int i,
6861
bool is_u64, u64 *res)
6962
{
7063
struct nfp_cpp *cpp = alink->abm->app->cpp;
71-
u32 val32, mur;
72-
u64 val, addr;
64+
u64 val, sym_offset;
65+
u32 val32;
7366
int err;
7467

75-
mur = NFP_CPP_ATOMIC_RD(sym->target, sym->domain);
76-
77-
addr = sym->addr + (alink->queue_base + i) * stride + offset;
68+
sym_offset = (alink->queue_base + i) * stride + offset;
7869
if (is_u64)
79-
err = nfp_cpp_readq(cpp, mur, addr, &val);
70+
err = __nfp_rtsym_readq(cpp, sym, 3, 0, sym_offset, &val);
8071
else
81-
err = nfp_cpp_readl(cpp, mur, addr, &val32);
72+
err = __nfp_rtsym_readl(cpp, sym, 3, 0, sym_offset, &val32);
8273
if (err) {
8374
nfp_err(cpp,
8475
"RED offload reading stat failed on vNIC %d queue %d\n",
@@ -114,13 +105,12 @@ nfp_abm_ctrl_stat_all(struct nfp_abm_link *alink, const struct nfp_rtsym *sym,
114105
int nfp_abm_ctrl_set_q_lvl(struct nfp_abm_link *alink, unsigned int i, u32 val)
115106
{
116107
struct nfp_cpp *cpp = alink->abm->app->cpp;
117-
u32 muw;
108+
u64 sym_offset;
118109
int err;
119110

120-
muw = NFP_CPP_ATOMIC_WR(alink->abm->q_lvls->target,
121-
alink->abm->q_lvls->domain);
122-
123-
err = nfp_cpp_writel(cpp, muw, nfp_abm_q_lvl_thrs(alink, i), val);
111+
sym_offset = (alink->queue_base + i) * NFP_QLVL_STRIDE + NFP_QLVL_THRS;
112+
err = __nfp_rtsym_writel(cpp, alink->abm->q_lvls, 4, 0,
113+
sym_offset, val);
124114
if (err) {
125115
nfp_err(cpp, "RED offload setting level failed on vNIC %d queue %d\n",
126116
alink->id, i);
@@ -290,10 +280,10 @@ nfp_abm_ctrl_find_rtsym(struct nfp_pf *pf, const char *name, unsigned int size)
290280
nfp_err(pf->cpp, "Symbol '%s' not found\n", name);
291281
return ERR_PTR(-ENOENT);
292282
}
293-
if (sym->size != size) {
283+
if (nfp_rtsym_size(sym) != size) {
294284
nfp_err(pf->cpp,
295285
"Symbol '%s' wrong size: expected %u got %llu\n",
296-
name, size, sym->size);
286+
name, size, nfp_rtsym_size(sym));
297287
return ERR_PTR(-EINVAL);
298288
}
299289

drivers/net/ethernet/netronome/nfp/abm/main.c

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -540,31 +540,47 @@ nfp_abm_vnic_set_mac(struct nfp_pf *pf, struct nfp_abm *abm, struct nfp_net *nn,
540540
{
541541
struct nfp_eth_table_port *eth_port = &pf->eth_tbl->ports[id];
542542
u8 mac_addr[ETH_ALEN];
543-
const char *mac_str;
544-
char name[32];
543+
struct nfp_nsp *nsp;
544+
char hwinfo[32];
545+
int err;
545546

546547
if (id > pf->eth_tbl->count) {
547548
nfp_warn(pf->cpp, "No entry for persistent MAC address\n");
548549
eth_hw_addr_random(nn->dp.netdev);
549550
return;
550551
}
551552

552-
snprintf(name, sizeof(name), "eth%u.mac.pf%u",
553+
snprintf(hwinfo, sizeof(hwinfo), "eth%u.mac.pf%u",
553554
eth_port->eth_index, abm->pf_id);
554555

555-
mac_str = nfp_hwinfo_lookup(pf->hwinfo, name);
556-
if (!mac_str) {
557-
nfp_warn(pf->cpp, "Can't lookup persistent MAC address (%s)\n",
558-
name);
556+
nsp = nfp_nsp_open(pf->cpp);
557+
if (IS_ERR(nsp)) {
558+
nfp_warn(pf->cpp, "Failed to access the NSP for persistent MAC address: %ld\n",
559+
PTR_ERR(nsp));
560+
eth_hw_addr_random(nn->dp.netdev);
561+
return;
562+
}
563+
564+
if (!nfp_nsp_has_hwinfo_lookup(nsp)) {
565+
nfp_warn(pf->cpp, "NSP doesn't support PF MAC generation\n");
566+
eth_hw_addr_random(nn->dp.netdev);
567+
return;
568+
}
569+
570+
err = nfp_nsp_hwinfo_lookup(nsp, hwinfo, sizeof(hwinfo));
571+
nfp_nsp_close(nsp);
572+
if (err) {
573+
nfp_warn(pf->cpp, "Reading persistent MAC address failed: %d\n",
574+
err);
559575
eth_hw_addr_random(nn->dp.netdev);
560576
return;
561577
}
562578

563-
if (sscanf(mac_str, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
579+
if (sscanf(hwinfo, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
564580
&mac_addr[0], &mac_addr[1], &mac_addr[2],
565581
&mac_addr[3], &mac_addr[4], &mac_addr[5]) != 6) {
566582
nfp_warn(pf->cpp, "Can't parse persistent MAC address (%s)\n",
567-
mac_str);
583+
hwinfo);
568584
eth_hw_addr_random(nn->dp.netdev);
569585
return;
570586
}

drivers/net/ethernet/netronome/nfp/nfp_main.c

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ static const struct pci_device_id nfp_pci_device_ids[] = {
6868
PCI_VENDOR_ID_NETRONOME, PCI_ANY_ID,
6969
PCI_ANY_ID, 0,
7070
},
71+
{ PCI_VENDOR_ID_NETRONOME, PCI_DEVICE_ID_NETRONOME_NFP5000,
72+
PCI_VENDOR_ID_NETRONOME, PCI_ANY_ID,
73+
PCI_ANY_ID, 0,
74+
},
7175
{ PCI_VENDOR_ID_NETRONOME, PCI_DEVICE_ID_NETRONOME_NFP4000,
7276
PCI_VENDOR_ID_NETRONOME, PCI_ANY_ID,
7377
PCI_ANY_ID, 0,
@@ -112,54 +116,48 @@ nfp_pf_map_rtsym(struct nfp_pf *pf, const char *name, const char *sym_fmt,
112116
int nfp_mbox_cmd(struct nfp_pf *pf, u32 cmd, void *in_data, u64 in_length,
113117
void *out_data, u64 out_length)
114118
{
115-
unsigned long long addr;
116119
unsigned long err_at;
117120
u64 max_data_sz;
118121
u32 val = 0;
119-
u32 cpp_id;
120122
int n, err;
121123

122124
if (!pf->mbox)
123125
return -EOPNOTSUPP;
124126

125-
cpp_id = NFP_CPP_ISLAND_ID(pf->mbox->target, NFP_CPP_ACTION_RW, 0,
126-
pf->mbox->domain);
127-
addr = pf->mbox->addr;
128-
max_data_sz = pf->mbox->size - NFP_MBOX_SYM_MIN_SIZE;
127+
max_data_sz = nfp_rtsym_size(pf->mbox) - NFP_MBOX_SYM_MIN_SIZE;
129128

130129
/* Check if cmd field is clear */
131-
err = nfp_cpp_readl(pf->cpp, cpp_id, addr + NFP_MBOX_CMD, &val);
130+
err = nfp_rtsym_readl(pf->cpp, pf->mbox, NFP_MBOX_CMD, &val);
132131
if (err || val) {
133132
nfp_warn(pf->cpp, "failed to issue command (%u): %u, err: %d\n",
134133
cmd, val, err);
135134
return err ?: -EBUSY;
136135
}
137136

138137
in_length = min(in_length, max_data_sz);
139-
n = nfp_cpp_write(pf->cpp, cpp_id, addr + NFP_MBOX_DATA,
140-
in_data, in_length);
138+
n = nfp_rtsym_write(pf->cpp, pf->mbox, NFP_MBOX_DATA, in_data,
139+
in_length);
141140
if (n != in_length)
142141
return -EIO;
143142
/* Write data_len and wipe reserved */
144-
err = nfp_cpp_writeq(pf->cpp, cpp_id, addr + NFP_MBOX_DATA_LEN,
145-
in_length);
143+
err = nfp_rtsym_writeq(pf->cpp, pf->mbox, NFP_MBOX_DATA_LEN, in_length);
146144
if (err)
147145
return err;
148146

149147
/* Read back for ordering */
150-
err = nfp_cpp_readl(pf->cpp, cpp_id, addr + NFP_MBOX_DATA_LEN, &val);
148+
err = nfp_rtsym_readl(pf->cpp, pf->mbox, NFP_MBOX_DATA_LEN, &val);
151149
if (err)
152150
return err;
153151

154152
/* Write cmd and wipe return value */
155-
err = nfp_cpp_writeq(pf->cpp, cpp_id, addr + NFP_MBOX_CMD, cmd);
153+
err = nfp_rtsym_writeq(pf->cpp, pf->mbox, NFP_MBOX_CMD, cmd);
156154
if (err)
157155
return err;
158156

159157
err_at = jiffies + 5 * HZ;
160158
while (true) {
161159
/* Wait for command to go to 0 (NFP_MBOX_NO_CMD) */
162-
err = nfp_cpp_readl(pf->cpp, cpp_id, addr + NFP_MBOX_CMD, &val);
160+
err = nfp_rtsym_readl(pf->cpp, pf->mbox, NFP_MBOX_CMD, &val);
163161
if (err)
164162
return err;
165163
if (!val)
@@ -172,18 +170,18 @@ int nfp_mbox_cmd(struct nfp_pf *pf, u32 cmd, void *in_data, u64 in_length,
172170
}
173171

174172
/* Copy output if any (could be error info, do it before reading ret) */
175-
err = nfp_cpp_readl(pf->cpp, cpp_id, addr + NFP_MBOX_DATA_LEN, &val);
173+
err = nfp_rtsym_readl(pf->cpp, pf->mbox, NFP_MBOX_DATA_LEN, &val);
176174
if (err)
177175
return err;
178176

179177
out_length = min_t(u32, val, min(out_length, max_data_sz));
180-
n = nfp_cpp_read(pf->cpp, cpp_id, addr + NFP_MBOX_DATA,
181-
out_data, out_length);
178+
n = nfp_rtsym_read(pf->cpp, pf->mbox, NFP_MBOX_DATA,
179+
out_data, out_length);
182180
if (n != out_length)
183181
return -EIO;
184182

185183
/* Check if there is an error */
186-
err = nfp_cpp_readl(pf->cpp, cpp_id, addr + NFP_MBOX_RET, &val);
184+
err = nfp_rtsym_readl(pf->cpp, pf->mbox, NFP_MBOX_RET, &val);
187185
if (err)
188186
return err;
189187
if (val)
@@ -441,8 +439,11 @@ nfp_fw_load(struct pci_dev *pdev, struct nfp_pf *pf, struct nfp_nsp *nsp)
441439
}
442440

443441
fw = nfp_net_fw_find(pdev, pf);
444-
if (!fw)
442+
if (!fw) {
443+
if (nfp_nsp_has_stored_fw_load(nsp))
444+
nfp_nsp_load_stored_fw(nsp);
445445
return 0;
446+
}
446447

447448
dev_info(&pdev->dev, "Soft-reset, loading FW image\n");
448449
err = nfp_nsp_device_soft_reset(nsp);
@@ -453,7 +454,6 @@ nfp_fw_load(struct pci_dev *pdev, struct nfp_pf *pf, struct nfp_nsp *nsp)
453454
}
454455

455456
err = nfp_nsp_load_fw(nsp, fw);
456-
457457
if (err < 0) {
458458
dev_err(&pdev->dev, "FW loading failed: %d\n", err);
459459
goto exit_release_fw;
@@ -566,9 +566,9 @@ static int nfp_pf_find_rtsyms(struct nfp_pf *pf)
566566
/* Optional per-PCI PF mailbox */
567567
snprintf(pf_symbol, sizeof(pf_symbol), NFP_MBOX_SYM_NAME, pf_id);
568568
pf->mbox = nfp_rtsym_lookup(pf->rtbl, pf_symbol);
569-
if (pf->mbox && pf->mbox->size < NFP_MBOX_SYM_MIN_SIZE) {
569+
if (pf->mbox && nfp_rtsym_size(pf->mbox) < NFP_MBOX_SYM_MIN_SIZE) {
570570
nfp_err(pf->cpp, "PF mailbox symbol too small: %llu < %d\n",
571-
pf->mbox->size, NFP_MBOX_SYM_MIN_SIZE);
571+
nfp_rtsym_size(pf->mbox), NFP_MBOX_SYM_MIN_SIZE);
572572
return -EINVAL;
573573
}
574574

drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c

Lines changed: 16 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -188,25 +188,21 @@ nfp_net_dump_load_dumpspec(struct nfp_cpp *cpp, struct nfp_rtsym_table *rtbl)
188188
const struct nfp_rtsym *specsym;
189189
struct nfp_dumpspec *dumpspec;
190190
int bytes_read;
191-
u32 cpp_id;
191+
u64 sym_size;
192192

193193
specsym = nfp_rtsym_lookup(rtbl, NFP_DUMP_SPEC_RTSYM);
194194
if (!specsym)
195195
return NULL;
196+
sym_size = nfp_rtsym_size(specsym);
196197

197198
/* expected size of this buffer is in the order of tens of kilobytes */
198-
dumpspec = vmalloc(sizeof(*dumpspec) + specsym->size);
199+
dumpspec = vmalloc(sizeof(*dumpspec) + sym_size);
199200
if (!dumpspec)
200201
return NULL;
202+
dumpspec->size = sym_size;
201203

202-
dumpspec->size = specsym->size;
203-
204-
cpp_id = NFP_CPP_ISLAND_ID(specsym->target, NFP_CPP_ACTION_RW, 0,
205-
specsym->domain);
206-
207-
bytes_read = nfp_cpp_read(cpp, cpp_id, specsym->addr, dumpspec->data,
208-
specsym->size);
209-
if (bytes_read != specsym->size) {
204+
bytes_read = nfp_rtsym_read(cpp, specsym, 0, dumpspec->data, sym_size);
205+
if (bytes_read != sym_size) {
210206
vfree(dumpspec);
211207
nfp_warn(cpp, "Debug dump specification read failed.\n");
212208
return NULL;
@@ -266,7 +262,6 @@ nfp_calc_rtsym_dump_sz(struct nfp_pf *pf, struct nfp_dump_tl *spec)
266262
struct nfp_dumpspec_rtsym *spec_rtsym;
267263
const struct nfp_rtsym *sym;
268264
u32 tl_len, key_len;
269-
u32 size;
270265

271266
spec_rtsym = (struct nfp_dumpspec_rtsym *)spec;
272267
tl_len = be32_to_cpu(spec->length);
@@ -278,13 +273,8 @@ nfp_calc_rtsym_dump_sz(struct nfp_pf *pf, struct nfp_dump_tl *spec)
278273
if (!sym)
279274
return nfp_dump_error_tlv_size(spec);
280275

281-
if (sym->type == NFP_RTSYM_TYPE_ABS)
282-
size = sizeof(sym->addr);
283-
else
284-
size = sym->size;
285-
286276
return ALIGN8(offsetof(struct nfp_dump_rtsym, rtsym) + key_len + 1) +
287-
ALIGN8(size);
277+
ALIGN8(nfp_rtsym_size(sym));
288278
}
289279

290280
static int
@@ -644,7 +634,6 @@ nfp_dump_single_rtsym(struct nfp_pf *pf, struct nfp_dumpspec_rtsym *spec,
644634
const struct nfp_rtsym *sym;
645635
u32 tl_len, key_len;
646636
int bytes_read;
647-
u32 cpp_id;
648637
void *dest;
649638
int err;
650639

@@ -657,11 +646,7 @@ nfp_dump_single_rtsym(struct nfp_pf *pf, struct nfp_dumpspec_rtsym *spec,
657646
if (!sym)
658647
return nfp_dump_error_tlv(&spec->tl, -ENOENT, dump);
659648

660-
if (sym->type == NFP_RTSYM_TYPE_ABS)
661-
sym_size = sizeof(sym->addr);
662-
else
663-
sym_size = sym->size;
664-
649+
sym_size = nfp_rtsym_size(sym);
665650
header_size =
666651
ALIGN8(offsetof(struct nfp_dump_rtsym, rtsym) + key_len + 1);
667652
total_size = header_size + ALIGN8(sym_size);
@@ -676,23 +661,20 @@ nfp_dump_single_rtsym(struct nfp_pf *pf, struct nfp_dumpspec_rtsym *spec,
676661
memcpy(dump_header->rtsym, spec->rtsym, key_len + 1);
677662
dump_header->cpp.dump_length = cpu_to_be32(sym_size);
678663

679-
if (sym->type == NFP_RTSYM_TYPE_ABS) {
680-
*(u64 *)dest = sym->addr;
681-
} else {
664+
if (sym->type != NFP_RTSYM_TYPE_ABS) {
682665
cpp_params.target = sym->target;
683666
cpp_params.action = NFP_CPP_ACTION_RW;
684667
cpp_params.token = 0;
685668
cpp_params.island = sym->domain;
686-
cpp_id = nfp_get_numeric_cpp_id(&cpp_params);
687669
dump_header->cpp.cpp_id = cpp_params;
688670
dump_header->cpp.offset = cpu_to_be32(sym->addr);
689-
bytes_read = nfp_cpp_read(pf->cpp, cpp_id, sym->addr, dest,
690-
sym_size);
691-
if (bytes_read != sym_size) {
692-
if (bytes_read >= 0)
693-
bytes_read = -EIO;
694-
dump_header->error = cpu_to_be32(bytes_read);
695-
}
671+
}
672+
673+
bytes_read = nfp_rtsym_read(pf->cpp, sym, 0, dest, sym_size);
674+
if (bytes_read != sym_size) {
675+
if (bytes_read >= 0)
676+
bytes_read = -EIO;
677+
dump_header->error = cpu_to_be32(bytes_read);
696678
}
697679

698680
return 0;

drivers/net/ethernet/netronome/nfp/nfp_net_main.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -470,8 +470,8 @@ static void nfp_net_pci_unmap_mem(struct nfp_pf *pf)
470470

471471
static int nfp_net_pci_map_mem(struct nfp_pf *pf)
472472
{
473+
u32 min_size, cpp_id;
473474
u8 __iomem *mem;
474-
u32 min_size;
475475
int err;
476476

477477
min_size = pf->max_data_vnics * NFP_PF_CSR_SLICE_SIZE;
@@ -519,9 +519,9 @@ static int nfp_net_pci_map_mem(struct nfp_pf *pf)
519519
pf->vfcfg_tbl2 = NULL;
520520
}
521521

522-
mem = nfp_cpp_map_area(pf->cpp, "net.qc", 0, 0,
523-
NFP_PCIE_QUEUE(0), NFP_QCP_QUEUE_AREA_SZ,
524-
&pf->qc_area);
522+
cpp_id = NFP_CPP_ISLAND_ID(0, NFP_CPP_ACTION_RW, 0, 0);
523+
mem = nfp_cpp_map_area(pf->cpp, "net.qc", cpp_id, NFP_PCIE_QUEUE(0),
524+
NFP_QCP_QUEUE_AREA_SZ, &pf->qc_area);
525525
if (IS_ERR(mem)) {
526526
nfp_err(pf->cpp, "Failed to map Queue Controller area.\n");
527527
err = PTR_ERR(mem);

0 commit comments

Comments
 (0)