1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2010-2018 Intel Corporation 3 */ 4 5 #include "ifpga_feature_dev.h" 6 #include "opae_spi.h" 7 #include "opae_intel_max10.h" 8 #include "opae_i2c.h" 9 #include "opae_at24_eeprom.h" 10 #include "ifpga_sec_mgr.h" 11 12 #define PWR_THRESHOLD_MAX 0x7F 13 14 int fme_get_prop(struct ifpga_fme_hw *fme, struct feature_prop *prop) 15 { 16 struct ifpga_feature *feature; 17 18 if (!fme) 19 return -ENOENT; 20 21 feature = get_fme_feature_by_id(fme, prop->feature_id); 22 23 if (feature && feature->ops && feature->ops->get_prop) 24 return feature->ops->get_prop(feature, prop); 25 26 return -ENOENT; 27 } 28 29 int fme_set_prop(struct ifpga_fme_hw *fme, struct feature_prop *prop) 30 { 31 struct ifpga_feature *feature; 32 33 if (!fme) 34 return -ENOENT; 35 36 feature = get_fme_feature_by_id(fme, prop->feature_id); 37 38 if (feature && feature->ops && feature->ops->set_prop) 39 return feature->ops->set_prop(feature, prop); 40 41 return -ENOENT; 42 } 43 44 int fme_set_irq(struct ifpga_fme_hw *fme, u32 feature_id, void *irq_set) 45 { 46 struct ifpga_feature *feature; 47 48 if (!fme) 49 return -ENOENT; 50 51 feature = get_fme_feature_by_id(fme, feature_id); 52 53 if (feature && feature->ops && feature->ops->set_irq) 54 return feature->ops->set_irq(feature, irq_set); 55 56 return -ENOENT; 57 } 58 59 /* fme private feature head */ 60 static int fme_hdr_init(struct ifpga_feature *feature) 61 { 62 struct feature_fme_header *fme_hdr; 63 64 fme_hdr = (struct feature_fme_header *)feature->addr; 65 66 dev_info(NULL, "FME HDR Init.\n"); 67 dev_info(NULL, "FME cap %llx.\n", 68 (unsigned long long)fme_hdr->capability.csr); 69 70 return 0; 71 } 72 73 static void fme_hdr_uinit(struct ifpga_feature *feature) 74 { 75 UNUSED(feature); 76 77 dev_info(NULL, "FME HDR UInit.\n"); 78 } 79 80 static int fme_hdr_get_revision(struct ifpga_fme_hw *fme, u64 *revision) 81 { 82 struct feature_fme_header *fme_hdr 83 = get_fme_feature_ioaddr_by_index(fme, FME_FEATURE_ID_HEADER); 84 struct feature_header header; 85 86 header.csr = readq(&fme_hdr->header); 87 *revision = header.revision; 88 89 return 0; 90 } 91 92 static int fme_hdr_get_ports_num(struct ifpga_fme_hw *fme, u64 *ports_num) 93 { 94 struct feature_fme_header *fme_hdr 95 = get_fme_feature_ioaddr_by_index(fme, FME_FEATURE_ID_HEADER); 96 struct feature_fme_capability fme_capability; 97 98 fme_capability.csr = readq(&fme_hdr->capability); 99 *ports_num = fme_capability.num_ports; 100 101 return 0; 102 } 103 104 static int fme_hdr_get_port_type(struct ifpga_fme_hw *fme, u64 *port_type) 105 { 106 struct feature_fme_header *fme_hdr 107 = get_fme_feature_ioaddr_by_index(fme, FME_FEATURE_ID_HEADER); 108 struct feature_fme_port pt; 109 u32 port = (u32)((*port_type >> 32) & 0xffffffff); 110 111 pt.csr = readq(&fme_hdr->port[port]); 112 if (!pt.port_implemented) 113 return -ENODEV; 114 if (pt.afu_access_control) 115 *port_type |= 0x1; 116 else 117 *port_type &= ~0x1; 118 119 return 0; 120 } 121 122 static int fme_hdr_get_cache_size(struct ifpga_fme_hw *fme, u64 *cache_size) 123 { 124 struct feature_fme_header *fme_hdr 125 = get_fme_feature_ioaddr_by_index(fme, FME_FEATURE_ID_HEADER); 126 struct feature_fme_capability fme_capability; 127 128 fme_capability.csr = readq(&fme_hdr->capability); 129 *cache_size = fme_capability.cache_size; 130 131 return 0; 132 } 133 134 static int fme_hdr_get_version(struct ifpga_fme_hw *fme, u64 *version) 135 { 136 struct feature_fme_header *fme_hdr 137 = get_fme_feature_ioaddr_by_index(fme, FME_FEATURE_ID_HEADER); 138 struct feature_fme_capability fme_capability; 139 140 fme_capability.csr = readq(&fme_hdr->capability); 141 *version = fme_capability.fabric_verid; 142 143 return 0; 144 } 145 146 static int fme_hdr_get_socket_id(struct ifpga_fme_hw *fme, u64 *socket_id) 147 { 148 struct feature_fme_header *fme_hdr 149 = get_fme_feature_ioaddr_by_index(fme, FME_FEATURE_ID_HEADER); 150 struct feature_fme_capability fme_capability; 151 152 fme_capability.csr = readq(&fme_hdr->capability); 153 *socket_id = fme_capability.socket_id; 154 155 return 0; 156 } 157 158 static int fme_hdr_get_bitstream_id(struct ifpga_fme_hw *fme, 159 u64 *bitstream_id) 160 { 161 struct feature_fme_header *fme_hdr 162 = get_fme_feature_ioaddr_by_index(fme, FME_FEATURE_ID_HEADER); 163 164 *bitstream_id = readq(&fme_hdr->bitstream_id); 165 166 return 0; 167 } 168 169 static int fme_hdr_get_bitstream_metadata(struct ifpga_fme_hw *fme, 170 u64 *bitstream_metadata) 171 { 172 struct feature_fme_header *fme_hdr 173 = get_fme_feature_ioaddr_by_index(fme, FME_FEATURE_ID_HEADER); 174 175 *bitstream_metadata = readq(&fme_hdr->bitstream_md); 176 177 return 0; 178 } 179 180 static int 181 fme_hdr_get_prop(struct ifpga_feature *feature, struct feature_prop *prop) 182 { 183 struct ifpga_fme_hw *fme = feature->parent; 184 185 switch (prop->prop_id) { 186 case FME_HDR_PROP_REVISION: 187 return fme_hdr_get_revision(fme, &prop->data); 188 case FME_HDR_PROP_PORTS_NUM: 189 return fme_hdr_get_ports_num(fme, &prop->data); 190 case FME_HDR_PROP_CACHE_SIZE: 191 return fme_hdr_get_cache_size(fme, &prop->data); 192 case FME_HDR_PROP_VERSION: 193 return fme_hdr_get_version(fme, &prop->data); 194 case FME_HDR_PROP_SOCKET_ID: 195 return fme_hdr_get_socket_id(fme, &prop->data); 196 case FME_HDR_PROP_BITSTREAM_ID: 197 return fme_hdr_get_bitstream_id(fme, &prop->data); 198 case FME_HDR_PROP_BITSTREAM_METADATA: 199 return fme_hdr_get_bitstream_metadata(fme, &prop->data); 200 case FME_HDR_PROP_PORT_TYPE: 201 return fme_hdr_get_port_type(fme, &prop->data); 202 } 203 204 return -ENOENT; 205 } 206 207 struct ifpga_feature_ops fme_hdr_ops = { 208 .init = fme_hdr_init, 209 .uinit = fme_hdr_uinit, 210 .get_prop = fme_hdr_get_prop, 211 }; 212 213 /* thermal management */ 214 static int fme_thermal_get_threshold1(struct ifpga_fme_hw *fme, u64 *thres1) 215 { 216 struct feature_fme_thermal *thermal; 217 struct feature_fme_tmp_threshold temp_threshold; 218 219 thermal = get_fme_feature_ioaddr_by_index(fme, 220 FME_FEATURE_ID_THERMAL_MGMT); 221 222 temp_threshold.csr = readq(&thermal->threshold); 223 *thres1 = temp_threshold.tmp_thshold1; 224 225 return 0; 226 } 227 228 static int fme_thermal_set_threshold1(struct ifpga_fme_hw *fme, u64 thres1) 229 { 230 struct feature_fme_thermal *thermal; 231 struct feature_fme_header *fme_hdr; 232 struct feature_fme_tmp_threshold tmp_threshold; 233 struct feature_fme_capability fme_capability; 234 235 thermal = get_fme_feature_ioaddr_by_index(fme, 236 FME_FEATURE_ID_THERMAL_MGMT); 237 fme_hdr = get_fme_feature_ioaddr_by_index(fme, FME_FEATURE_ID_HEADER); 238 239 spinlock_lock(&fme->lock); 240 tmp_threshold.csr = readq(&thermal->threshold); 241 fme_capability.csr = readq(&fme_hdr->capability); 242 243 if (fme_capability.lock_bit == 1) { 244 spinlock_unlock(&fme->lock); 245 return -EBUSY; 246 } else if (thres1 > 100) { 247 spinlock_unlock(&fme->lock); 248 return -EINVAL; 249 } else if (thres1 == 0) { 250 tmp_threshold.tmp_thshold1_enable = 0; 251 tmp_threshold.tmp_thshold1 = thres1; 252 } else { 253 tmp_threshold.tmp_thshold1_enable = 1; 254 tmp_threshold.tmp_thshold1 = thres1; 255 } 256 257 writeq(tmp_threshold.csr, &thermal->threshold); 258 spinlock_unlock(&fme->lock); 259 260 return 0; 261 } 262 263 static int fme_thermal_get_threshold2(struct ifpga_fme_hw *fme, u64 *thres2) 264 { 265 struct feature_fme_thermal *thermal; 266 struct feature_fme_tmp_threshold temp_threshold; 267 268 thermal = get_fme_feature_ioaddr_by_index(fme, 269 FME_FEATURE_ID_THERMAL_MGMT); 270 271 temp_threshold.csr = readq(&thermal->threshold); 272 *thres2 = temp_threshold.tmp_thshold2; 273 274 return 0; 275 } 276 277 static int fme_thermal_set_threshold2(struct ifpga_fme_hw *fme, u64 thres2) 278 { 279 struct feature_fme_thermal *thermal; 280 struct feature_fme_header *fme_hdr; 281 struct feature_fme_tmp_threshold tmp_threshold; 282 struct feature_fme_capability fme_capability; 283 284 thermal = get_fme_feature_ioaddr_by_index(fme, 285 FME_FEATURE_ID_THERMAL_MGMT); 286 fme_hdr = get_fme_feature_ioaddr_by_index(fme, FME_FEATURE_ID_HEADER); 287 288 spinlock_lock(&fme->lock); 289 tmp_threshold.csr = readq(&thermal->threshold); 290 fme_capability.csr = readq(&fme_hdr->capability); 291 292 if (fme_capability.lock_bit == 1) { 293 spinlock_unlock(&fme->lock); 294 return -EBUSY; 295 } else if (thres2 > 100) { 296 spinlock_unlock(&fme->lock); 297 return -EINVAL; 298 } else if (thres2 == 0) { 299 tmp_threshold.tmp_thshold2_enable = 0; 300 tmp_threshold.tmp_thshold2 = thres2; 301 } else { 302 tmp_threshold.tmp_thshold2_enable = 1; 303 tmp_threshold.tmp_thshold2 = thres2; 304 } 305 306 writeq(tmp_threshold.csr, &thermal->threshold); 307 spinlock_unlock(&fme->lock); 308 309 return 0; 310 } 311 312 static int fme_thermal_get_threshold_trip(struct ifpga_fme_hw *fme, 313 u64 *thres_trip) 314 { 315 struct feature_fme_thermal *thermal; 316 struct feature_fme_tmp_threshold temp_threshold; 317 318 thermal = get_fme_feature_ioaddr_by_index(fme, 319 FME_FEATURE_ID_THERMAL_MGMT); 320 321 temp_threshold.csr = readq(&thermal->threshold); 322 *thres_trip = temp_threshold.therm_trip_thshold; 323 324 return 0; 325 } 326 327 static int fme_thermal_get_threshold1_reached(struct ifpga_fme_hw *fme, 328 u64 *thres1_reached) 329 { 330 struct feature_fme_thermal *thermal; 331 struct feature_fme_tmp_threshold temp_threshold; 332 333 thermal = get_fme_feature_ioaddr_by_index(fme, 334 FME_FEATURE_ID_THERMAL_MGMT); 335 336 temp_threshold.csr = readq(&thermal->threshold); 337 *thres1_reached = temp_threshold.thshold1_status; 338 339 return 0; 340 } 341 342 static int fme_thermal_get_threshold2_reached(struct ifpga_fme_hw *fme, 343 u64 *thres1_reached) 344 { 345 struct feature_fme_thermal *thermal; 346 struct feature_fme_tmp_threshold temp_threshold; 347 348 thermal = get_fme_feature_ioaddr_by_index(fme, 349 FME_FEATURE_ID_THERMAL_MGMT); 350 351 temp_threshold.csr = readq(&thermal->threshold); 352 *thres1_reached = temp_threshold.thshold2_status; 353 354 return 0; 355 } 356 357 static int fme_thermal_get_threshold1_policy(struct ifpga_fme_hw *fme, 358 u64 *thres1_policy) 359 { 360 struct feature_fme_thermal *thermal; 361 struct feature_fme_tmp_threshold temp_threshold; 362 363 thermal = get_fme_feature_ioaddr_by_index(fme, 364 FME_FEATURE_ID_THERMAL_MGMT); 365 366 temp_threshold.csr = readq(&thermal->threshold); 367 *thres1_policy = temp_threshold.thshold_policy; 368 369 return 0; 370 } 371 372 static int fme_thermal_set_threshold1_policy(struct ifpga_fme_hw *fme, 373 u64 thres1_policy) 374 { 375 struct feature_fme_thermal *thermal; 376 struct feature_fme_tmp_threshold tmp_threshold; 377 378 thermal = get_fme_feature_ioaddr_by_index(fme, 379 FME_FEATURE_ID_THERMAL_MGMT); 380 381 spinlock_lock(&fme->lock); 382 tmp_threshold.csr = readq(&thermal->threshold); 383 384 if (thres1_policy == 0) { 385 tmp_threshold.thshold_policy = 0; 386 } else if (thres1_policy == 1) { 387 tmp_threshold.thshold_policy = 1; 388 } else { 389 spinlock_unlock(&fme->lock); 390 return -EINVAL; 391 } 392 393 writeq(tmp_threshold.csr, &thermal->threshold); 394 spinlock_unlock(&fme->lock); 395 396 return 0; 397 } 398 399 static int fme_thermal_get_temperature(struct ifpga_fme_hw *fme, u64 *temp) 400 { 401 struct feature_fme_thermal *thermal; 402 struct feature_fme_temp_rdsensor_fmt1 temp_rdsensor_fmt1; 403 404 thermal = get_fme_feature_ioaddr_by_index(fme, 405 FME_FEATURE_ID_THERMAL_MGMT); 406 407 temp_rdsensor_fmt1.csr = readq(&thermal->rdsensor_fm1); 408 *temp = temp_rdsensor_fmt1.fpga_temp; 409 410 return 0; 411 } 412 413 static int fme_thermal_get_revision(struct ifpga_fme_hw *fme, u64 *revision) 414 { 415 struct feature_fme_thermal *fme_thermal 416 = get_fme_feature_ioaddr_by_index(fme, 417 FME_FEATURE_ID_THERMAL_MGMT); 418 struct feature_header header; 419 420 header.csr = readq(&fme_thermal->header); 421 *revision = header.revision; 422 423 return 0; 424 } 425 426 #define FME_THERMAL_CAP_NO_TMP_THRESHOLD 0x1 427 428 static int fme_thermal_mgmt_init(struct ifpga_feature *feature) 429 { 430 struct feature_fme_thermal *fme_thermal; 431 struct feature_fme_tmp_threshold_cap thermal_cap; 432 433 UNUSED(feature); 434 435 dev_info(NULL, "FME thermal mgmt Init.\n"); 436 437 fme_thermal = (struct feature_fme_thermal *)feature->addr; 438 thermal_cap.csr = readq(&fme_thermal->threshold_cap); 439 440 dev_info(NULL, "FME thermal cap %llx.\n", 441 (unsigned long long)fme_thermal->threshold_cap.csr); 442 443 if (thermal_cap.tmp_thshold_disabled) 444 feature->cap |= FME_THERMAL_CAP_NO_TMP_THRESHOLD; 445 446 return 0; 447 } 448 449 static void fme_thermal_mgmt_uinit(struct ifpga_feature *feature) 450 { 451 UNUSED(feature); 452 453 dev_info(NULL, "FME thermal mgmt UInit.\n"); 454 } 455 456 static int 457 fme_thermal_set_prop(struct ifpga_feature *feature, struct feature_prop *prop) 458 { 459 struct ifpga_fme_hw *fme = feature->parent; 460 461 if (feature->cap & FME_THERMAL_CAP_NO_TMP_THRESHOLD) 462 return -ENOENT; 463 464 switch (prop->prop_id) { 465 case FME_THERMAL_PROP_THRESHOLD1: 466 return fme_thermal_set_threshold1(fme, prop->data); 467 case FME_THERMAL_PROP_THRESHOLD2: 468 return fme_thermal_set_threshold2(fme, prop->data); 469 case FME_THERMAL_PROP_THRESHOLD1_POLICY: 470 return fme_thermal_set_threshold1_policy(fme, prop->data); 471 } 472 473 return -ENOENT; 474 } 475 476 static int 477 fme_thermal_get_prop(struct ifpga_feature *feature, struct feature_prop *prop) 478 { 479 struct ifpga_fme_hw *fme = feature->parent; 480 481 if (feature->cap & FME_THERMAL_CAP_NO_TMP_THRESHOLD && 482 prop->prop_id != FME_THERMAL_PROP_TEMPERATURE && 483 prop->prop_id != FME_THERMAL_PROP_REVISION) 484 return -ENOENT; 485 486 switch (prop->prop_id) { 487 case FME_THERMAL_PROP_THRESHOLD1: 488 return fme_thermal_get_threshold1(fme, &prop->data); 489 case FME_THERMAL_PROP_THRESHOLD2: 490 return fme_thermal_get_threshold2(fme, &prop->data); 491 case FME_THERMAL_PROP_THRESHOLD_TRIP: 492 return fme_thermal_get_threshold_trip(fme, &prop->data); 493 case FME_THERMAL_PROP_THRESHOLD1_REACHED: 494 return fme_thermal_get_threshold1_reached(fme, &prop->data); 495 case FME_THERMAL_PROP_THRESHOLD2_REACHED: 496 return fme_thermal_get_threshold2_reached(fme, &prop->data); 497 case FME_THERMAL_PROP_THRESHOLD1_POLICY: 498 return fme_thermal_get_threshold1_policy(fme, &prop->data); 499 case FME_THERMAL_PROP_TEMPERATURE: 500 return fme_thermal_get_temperature(fme, &prop->data); 501 case FME_THERMAL_PROP_REVISION: 502 return fme_thermal_get_revision(fme, &prop->data); 503 } 504 505 return -ENOENT; 506 } 507 508 struct ifpga_feature_ops fme_thermal_mgmt_ops = { 509 .init = fme_thermal_mgmt_init, 510 .uinit = fme_thermal_mgmt_uinit, 511 .get_prop = fme_thermal_get_prop, 512 .set_prop = fme_thermal_set_prop, 513 }; 514 515 static int fme_pwr_get_consumed(struct ifpga_fme_hw *fme, u64 *consumed) 516 { 517 struct feature_fme_power *fme_power 518 = get_fme_feature_ioaddr_by_index(fme, 519 FME_FEATURE_ID_POWER_MGMT); 520 struct feature_fme_pm_status pm_status; 521 522 pm_status.csr = readq(&fme_power->status); 523 524 *consumed = pm_status.pwr_consumed; 525 526 return 0; 527 } 528 529 static int fme_pwr_get_threshold1(struct ifpga_fme_hw *fme, u64 *threshold) 530 { 531 struct feature_fme_power *fme_power 532 = get_fme_feature_ioaddr_by_index(fme, 533 FME_FEATURE_ID_POWER_MGMT); 534 struct feature_fme_pm_ap_threshold pm_ap_threshold; 535 536 pm_ap_threshold.csr = readq(&fme_power->threshold); 537 538 *threshold = pm_ap_threshold.threshold1; 539 540 return 0; 541 } 542 543 static int fme_pwr_set_threshold1(struct ifpga_fme_hw *fme, u64 threshold) 544 { 545 struct feature_fme_power *fme_power 546 = get_fme_feature_ioaddr_by_index(fme, 547 FME_FEATURE_ID_POWER_MGMT); 548 struct feature_fme_pm_ap_threshold pm_ap_threshold; 549 550 spinlock_lock(&fme->lock); 551 pm_ap_threshold.csr = readq(&fme_power->threshold); 552 553 if (threshold <= PWR_THRESHOLD_MAX) { 554 pm_ap_threshold.threshold1 = threshold; 555 } else { 556 spinlock_unlock(&fme->lock); 557 return -EINVAL; 558 } 559 560 writeq(pm_ap_threshold.csr, &fme_power->threshold); 561 spinlock_unlock(&fme->lock); 562 563 return 0; 564 } 565 566 static int fme_pwr_get_threshold2(struct ifpga_fme_hw *fme, u64 *threshold) 567 { 568 struct feature_fme_power *fme_power 569 = get_fme_feature_ioaddr_by_index(fme, 570 FME_FEATURE_ID_POWER_MGMT); 571 struct feature_fme_pm_ap_threshold pm_ap_threshold; 572 573 pm_ap_threshold.csr = readq(&fme_power->threshold); 574 575 *threshold = pm_ap_threshold.threshold2; 576 577 return 0; 578 } 579 580 static int fme_pwr_set_threshold2(struct ifpga_fme_hw *fme, u64 threshold) 581 { 582 struct feature_fme_power *fme_power 583 = get_fme_feature_ioaddr_by_index(fme, 584 FME_FEATURE_ID_POWER_MGMT); 585 struct feature_fme_pm_ap_threshold pm_ap_threshold; 586 587 spinlock_lock(&fme->lock); 588 pm_ap_threshold.csr = readq(&fme_power->threshold); 589 590 if (threshold <= PWR_THRESHOLD_MAX) { 591 pm_ap_threshold.threshold2 = threshold; 592 } else { 593 spinlock_unlock(&fme->lock); 594 return -EINVAL; 595 } 596 597 writeq(pm_ap_threshold.csr, &fme_power->threshold); 598 spinlock_unlock(&fme->lock); 599 600 return 0; 601 } 602 603 static int fme_pwr_get_threshold1_status(struct ifpga_fme_hw *fme, 604 u64 *threshold_status) 605 { 606 struct feature_fme_power *fme_power 607 = get_fme_feature_ioaddr_by_index(fme, 608 FME_FEATURE_ID_POWER_MGMT); 609 struct feature_fme_pm_ap_threshold pm_ap_threshold; 610 611 pm_ap_threshold.csr = readq(&fme_power->threshold); 612 613 *threshold_status = pm_ap_threshold.threshold1_status; 614 615 return 0; 616 } 617 618 static int fme_pwr_get_threshold2_status(struct ifpga_fme_hw *fme, 619 u64 *threshold_status) 620 { 621 struct feature_fme_power *fme_power 622 = get_fme_feature_ioaddr_by_index(fme, 623 FME_FEATURE_ID_POWER_MGMT); 624 struct feature_fme_pm_ap_threshold pm_ap_threshold; 625 626 pm_ap_threshold.csr = readq(&fme_power->threshold); 627 628 *threshold_status = pm_ap_threshold.threshold2_status; 629 630 return 0; 631 } 632 633 static int fme_pwr_get_rtl(struct ifpga_fme_hw *fme, u64 *rtl) 634 { 635 struct feature_fme_power *fme_power 636 = get_fme_feature_ioaddr_by_index(fme, 637 FME_FEATURE_ID_POWER_MGMT); 638 struct feature_fme_pm_status pm_status; 639 640 pm_status.csr = readq(&fme_power->status); 641 642 *rtl = pm_status.fpga_latency_report; 643 644 return 0; 645 } 646 647 static int fme_pwr_get_xeon_limit(struct ifpga_fme_hw *fme, u64 *limit) 648 { 649 struct feature_fme_power *fme_power 650 = get_fme_feature_ioaddr_by_index(fme, 651 FME_FEATURE_ID_POWER_MGMT); 652 struct feature_fme_pm_xeon_limit xeon_limit; 653 654 xeon_limit.csr = readq(&fme_power->xeon_limit); 655 656 if (!xeon_limit.enable) 657 xeon_limit.pwr_limit = 0; 658 659 *limit = xeon_limit.pwr_limit; 660 661 return 0; 662 } 663 664 static int fme_pwr_get_fpga_limit(struct ifpga_fme_hw *fme, u64 *limit) 665 { 666 struct feature_fme_power *fme_power 667 = get_fme_feature_ioaddr_by_index(fme, 668 FME_FEATURE_ID_POWER_MGMT); 669 struct feature_fme_pm_fpga_limit fpga_limit; 670 671 fpga_limit.csr = readq(&fme_power->fpga_limit); 672 673 if (!fpga_limit.enable) 674 fpga_limit.pwr_limit = 0; 675 676 *limit = fpga_limit.pwr_limit; 677 678 return 0; 679 } 680 681 static int fme_pwr_get_revision(struct ifpga_fme_hw *fme, u64 *revision) 682 { 683 struct feature_fme_power *fme_power 684 = get_fme_feature_ioaddr_by_index(fme, 685 FME_FEATURE_ID_POWER_MGMT); 686 struct feature_header header; 687 688 header.csr = readq(&fme_power->header); 689 *revision = header.revision; 690 691 return 0; 692 } 693 694 static int fme_power_mgmt_init(struct ifpga_feature *feature) 695 { 696 UNUSED(feature); 697 698 dev_info(NULL, "FME power mgmt Init.\n"); 699 700 return 0; 701 } 702 703 static void fme_power_mgmt_uinit(struct ifpga_feature *feature) 704 { 705 UNUSED(feature); 706 707 dev_info(NULL, "FME power mgmt UInit.\n"); 708 } 709 710 static int fme_power_mgmt_get_prop(struct ifpga_feature *feature, 711 struct feature_prop *prop) 712 { 713 struct ifpga_fme_hw *fme = feature->parent; 714 715 switch (prop->prop_id) { 716 case FME_PWR_PROP_CONSUMED: 717 return fme_pwr_get_consumed(fme, &prop->data); 718 case FME_PWR_PROP_THRESHOLD1: 719 return fme_pwr_get_threshold1(fme, &prop->data); 720 case FME_PWR_PROP_THRESHOLD2: 721 return fme_pwr_get_threshold2(fme, &prop->data); 722 case FME_PWR_PROP_THRESHOLD1_STATUS: 723 return fme_pwr_get_threshold1_status(fme, &prop->data); 724 case FME_PWR_PROP_THRESHOLD2_STATUS: 725 return fme_pwr_get_threshold2_status(fme, &prop->data); 726 case FME_PWR_PROP_RTL: 727 return fme_pwr_get_rtl(fme, &prop->data); 728 case FME_PWR_PROP_XEON_LIMIT: 729 return fme_pwr_get_xeon_limit(fme, &prop->data); 730 case FME_PWR_PROP_FPGA_LIMIT: 731 return fme_pwr_get_fpga_limit(fme, &prop->data); 732 case FME_PWR_PROP_REVISION: 733 return fme_pwr_get_revision(fme, &prop->data); 734 } 735 736 return -ENOENT; 737 } 738 739 static int fme_power_mgmt_set_prop(struct ifpga_feature *feature, 740 struct feature_prop *prop) 741 { 742 struct ifpga_fme_hw *fme = feature->parent; 743 744 switch (prop->prop_id) { 745 case FME_PWR_PROP_THRESHOLD1: 746 return fme_pwr_set_threshold1(fme, prop->data); 747 case FME_PWR_PROP_THRESHOLD2: 748 return fme_pwr_set_threshold2(fme, prop->data); 749 } 750 751 return -ENOENT; 752 } 753 754 struct ifpga_feature_ops fme_power_mgmt_ops = { 755 .init = fme_power_mgmt_init, 756 .uinit = fme_power_mgmt_uinit, 757 .get_prop = fme_power_mgmt_get_prop, 758 .set_prop = fme_power_mgmt_set_prop, 759 }; 760 761 static int fme_hssi_eth_init(struct ifpga_feature *feature) 762 { 763 UNUSED(feature); 764 return 0; 765 } 766 767 static void fme_hssi_eth_uinit(struct ifpga_feature *feature) 768 { 769 UNUSED(feature); 770 } 771 772 struct ifpga_feature_ops fme_hssi_eth_ops = { 773 .init = fme_hssi_eth_init, 774 .uinit = fme_hssi_eth_uinit, 775 }; 776 777 static int fme_emif_init(struct ifpga_feature *feature) 778 { 779 UNUSED(feature); 780 return 0; 781 } 782 783 static void fme_emif_uinit(struct ifpga_feature *feature) 784 { 785 UNUSED(feature); 786 } 787 788 struct ifpga_feature_ops fme_emif_ops = { 789 .init = fme_emif_init, 790 .uinit = fme_emif_uinit, 791 }; 792 793 static const char *board_type_to_string(u32 type) 794 { 795 switch (type) { 796 case VC_8_10G: 797 return "VC_8x10G"; 798 case VC_4_25G: 799 return "VC_4x25G"; 800 case VC_2_1_25: 801 return "VC_2x1x25G"; 802 case VC_4_25G_2_25G: 803 return "VC_4x25G+2x25G"; 804 case VC_2_2_25G: 805 return "VC_2x2x25G"; 806 } 807 808 return "unknown"; 809 } 810 811 static const char *board_major_to_string(u32 major) 812 { 813 switch (major) { 814 case VISTA_CREEK: 815 return "VISTA_CREEK"; 816 case RUSH_CREEK: 817 return "RUSH_CREEK"; 818 case DARBY_CREEK: 819 return "DARBY_CREEK"; 820 } 821 822 return "unknown"; 823 } 824 825 static int board_type_to_info(u32 type, 826 struct opae_board_info *info) 827 { 828 switch (type) { 829 case VC_8_10G: 830 info->nums_of_retimer = 2; 831 info->ports_per_retimer = 4; 832 info->nums_of_fvl = 2; 833 info->ports_per_fvl = 4; 834 break; 835 case VC_4_25G: 836 info->nums_of_retimer = 1; 837 info->ports_per_retimer = 4; 838 info->nums_of_fvl = 2; 839 info->ports_per_fvl = 2; 840 break; 841 case VC_2_1_25: 842 info->nums_of_retimer = 2; 843 info->ports_per_retimer = 1; 844 info->nums_of_fvl = 1; 845 info->ports_per_fvl = 2; 846 break; 847 case VC_2_2_25G: 848 info->nums_of_retimer = 2; 849 info->ports_per_retimer = 2; 850 info->nums_of_fvl = 2; 851 info->ports_per_fvl = 2; 852 break; 853 default: 854 return -EINVAL; 855 } 856 857 return 0; 858 } 859 860 static int fme_get_board_interface(struct ifpga_fme_hw *fme) 861 { 862 struct fme_bitstream_id id; 863 struct ifpga_hw *hw; 864 u32 val; 865 866 hw = fme->parent; 867 if (!hw) 868 return -ENODEV; 869 870 if (fme_hdr_get_bitstream_id(fme, &id.id)) 871 return -EINVAL; 872 873 fme->board_info.major = id.major; 874 fme->board_info.minor = id.minor; 875 fme->board_info.type = id.interface; 876 fme->board_info.fvl_bypass = id.fvl_bypass; 877 fme->board_info.mac_lightweight = id.mac_lightweight; 878 fme->board_info.lightweight = id.lightweiht; 879 fme->board_info.disaggregate = id.disagregate; 880 fme->board_info.seu = id.seu; 881 fme->board_info.ptp = id.ptp; 882 883 dev_info(fme, "found: PCI dev: %02x:%02x:%x board: %s type: %s\n", 884 hw->pci_data->bus, 885 hw->pci_data->devid, 886 hw->pci_data->function, 887 board_major_to_string(fme->board_info.major), 888 board_type_to_string(fme->board_info.type)); 889 890 dev_info(fme, "support feature:\n" 891 "fvl_bypass:%s\n" 892 "mac_lightweight:%s\n" 893 "lightweight:%s\n" 894 "disaggregate:%s\n" 895 "seu:%s\n" 896 "ptp1588:%s\n", 897 check_support(fme->board_info.fvl_bypass), 898 check_support(fme->board_info.mac_lightweight), 899 check_support(fme->board_info.lightweight), 900 check_support(fme->board_info.disaggregate), 901 check_support(fme->board_info.seu), 902 check_support(fme->board_info.ptp)); 903 904 905 if (board_type_to_info(fme->board_info.type, &fme->board_info)) 906 return -EINVAL; 907 908 dev_info(fme, "get board info: nums_retimers %d ports_per_retimer %d nums_fvl %d ports_per_fvl %d\n", 909 fme->board_info.nums_of_retimer, 910 fme->board_info.ports_per_retimer, 911 fme->board_info.nums_of_fvl, 912 fme->board_info.ports_per_fvl); 913 914 if (max10_sys_read(fme->max10_dev, FPGA_PAGE_INFO, &val)) 915 return -EINVAL; 916 fme->board_info.boot_page = val & 0x7; 917 918 if (max10_sys_read(fme->max10_dev, MAX10_BUILD_VER, &val)) 919 return -EINVAL; 920 fme->board_info.max10_version = val; 921 922 if (max10_sys_read(fme->max10_dev, NIOS2_FW_VERSION, &val)) 923 return -EINVAL; 924 fme->board_info.nios_fw_version = val; 925 926 dev_info(fme, "max10 version 0x%x, nios fw version 0x%x\n", 927 fme->board_info.max10_version, 928 fme->board_info.nios_fw_version); 929 930 return 0; 931 } 932 933 static int spi_self_checking(struct intel_max10_device *dev) 934 { 935 u32 val; 936 int ret; 937 938 ret = max10_sys_read(dev, MAX10_TEST_REG, &val); 939 if (ret) 940 return -EIO; 941 942 dev_info(NULL, "Read MAX10 test register 0x%x\n", val); 943 944 return 0; 945 } 946 947 static void init_spi_share_data(struct ifpga_fme_hw *fme, 948 struct altera_spi_device *spi) 949 { 950 struct ifpga_hw *hw = (struct ifpga_hw *)fme->parent; 951 opae_share_data *sd = NULL; 952 953 if (hw && hw->adapter && hw->adapter->shm.ptr) { 954 dev_info(NULL, "transfer share data to spi\n"); 955 sd = (opae_share_data *)hw->adapter->shm.ptr; 956 spi->mutex = &sd->spi_mutex; 957 spi->dtb_sz_ptr = &sd->dtb_size; 958 spi->dtb = sd->dtb; 959 } else { 960 spi->mutex = NULL; 961 spi->dtb_sz_ptr = NULL; 962 spi->dtb = NULL; 963 } 964 } 965 966 static int fme_spi_init(struct ifpga_feature *feature) 967 { 968 struct ifpga_fme_hw *fme = (struct ifpga_fme_hw *)feature->parent; 969 struct altera_spi_device *spi_master; 970 struct intel_max10_device *max10; 971 int ret = 0; 972 973 dev_info(fme, "FME SPI Master (Max10) Init.\n"); 974 dev_debug(fme, "FME SPI base addr %p.\n", 975 feature->addr); 976 dev_debug(fme, "spi param=0x%llx\n", 977 (unsigned long long)opae_readq(feature->addr + 0x8)); 978 979 spi_master = altera_spi_alloc(feature->addr, TYPE_SPI); 980 if (!spi_master) 981 return -ENODEV; 982 init_spi_share_data(fme, spi_master); 983 984 altera_spi_init(spi_master); 985 986 max10 = intel_max10_device_probe(spi_master, 0); 987 if (!max10) { 988 ret = -ENODEV; 989 dev_err(fme, "max10 init fail\n"); 990 goto spi_fail; 991 } 992 993 fme->max10_dev = max10; 994 995 /* SPI self test */ 996 if (spi_self_checking(max10)) { 997 ret = -EIO; 998 goto max10_fail; 999 } 1000 1001 return ret; 1002 1003 max10_fail: 1004 intel_max10_device_remove(fme->max10_dev); 1005 spi_fail: 1006 altera_spi_release(spi_master); 1007 return ret; 1008 } 1009 1010 static void fme_spi_uinit(struct ifpga_feature *feature) 1011 { 1012 struct ifpga_fme_hw *fme = (struct ifpga_fme_hw *)feature->parent; 1013 1014 if (fme->max10_dev) 1015 intel_max10_device_remove(fme->max10_dev); 1016 } 1017 1018 struct ifpga_feature_ops fme_spi_master_ops = { 1019 .init = fme_spi_init, 1020 .uinit = fme_spi_uinit, 1021 }; 1022 1023 static int nios_spi_wait_init_done(struct altera_spi_device *dev) 1024 { 1025 u32 val = 0; 1026 unsigned long timeout = rte_get_timer_cycles() + 1027 msecs_to_timer_cycles(10000); 1028 unsigned long ticks; 1029 int major_version; 1030 int fecmode = FEC_MODE_NO; 1031 1032 if (spi_reg_read(dev, NIOS_VERSION, &val)) 1033 return -EIO; 1034 1035 major_version = 1036 (val & NIOS_VERSION_MAJOR) >> NIOS_VERSION_MAJOR_SHIFT; 1037 dev_info(dev, "A10 NIOS FW version %d\n", major_version); 1038 1039 if (major_version >= 3) { 1040 /* read NIOS_INIT to check if PKVL INIT done or not */ 1041 if (spi_reg_read(dev, NIOS_INIT, &val)) 1042 return -EIO; 1043 1044 dev_debug(dev, "read NIOS_INIT: 0x%x\n", val); 1045 1046 /* check if PKVLs are initialized already */ 1047 if (val & NIOS_INIT_DONE || val & NIOS_INIT_START) 1048 goto nios_init_done; 1049 1050 /* start to config the default FEC mode */ 1051 val = fecmode | NIOS_INIT_START; 1052 1053 if (spi_reg_write(dev, NIOS_INIT, val)) 1054 return -EIO; 1055 } 1056 1057 nios_init_done: 1058 do { 1059 if (spi_reg_read(dev, NIOS_INIT, &val)) 1060 return -EIO; 1061 if (val & NIOS_INIT_DONE) 1062 break; 1063 1064 ticks = rte_get_timer_cycles(); 1065 if (time_after(ticks, timeout)) 1066 return -ETIMEDOUT; 1067 msleep(100); 1068 } while (1); 1069 1070 /* get the fecmode */ 1071 if (spi_reg_read(dev, NIOS_INIT, &val)) 1072 return -EIO; 1073 dev_debug(dev, "read NIOS_INIT: 0x%x\n", val); 1074 fecmode = (val & REQ_FEC_MODE) >> REQ_FEC_MODE_SHIFT; 1075 dev_info(dev, "fecmode: 0x%x, %s\n", fecmode, 1076 (fecmode == FEC_MODE_KR) ? "kr" : 1077 ((fecmode == FEC_MODE_RS) ? "rs" : "no")); 1078 1079 return 0; 1080 } 1081 1082 static int nios_spi_check_error(struct altera_spi_device *dev) 1083 { 1084 u32 value = 0; 1085 1086 if (spi_reg_read(dev, PKVL_A_MODE_STS, &value)) 1087 return -EIO; 1088 1089 dev_debug(dev, "PKVL A Mode Status 0x%x\n", value); 1090 1091 if (value >= 0x100) 1092 return -EINVAL; 1093 1094 if (spi_reg_read(dev, PKVL_B_MODE_STS, &value)) 1095 return -EIO; 1096 1097 dev_debug(dev, "PKVL B Mode Status 0x%x\n", value); 1098 1099 if (value >= 0x100) 1100 return -EINVAL; 1101 1102 return 0; 1103 } 1104 1105 static int fme_nios_spi_init(struct ifpga_feature *feature) 1106 { 1107 struct ifpga_fme_hw *fme = (struct ifpga_fme_hw *)feature->parent; 1108 struct altera_spi_device *spi_master; 1109 struct intel_max10_device *max10; 1110 struct ifpga_hw *hw; 1111 struct opae_manager *mgr; 1112 int ret = 0; 1113 1114 hw = fme->parent; 1115 if (!hw) 1116 return -ENODEV; 1117 1118 mgr = hw->adapter->mgr; 1119 if (!mgr) 1120 return -ENODEV; 1121 1122 dev_info(fme, "FME SPI Master (NIOS) Init.\n"); 1123 dev_debug(fme, "FME SPI base addr %p.\n", 1124 feature->addr); 1125 dev_debug(fme, "spi param=0x%llx\n", 1126 (unsigned long long)opae_readq(feature->addr + 0x8)); 1127 1128 spi_master = altera_spi_alloc(feature->addr, TYPE_NIOS_SPI); 1129 if (!spi_master) 1130 return -ENODEV; 1131 init_spi_share_data(fme, spi_master); 1132 1133 /** 1134 * 1. wait A10 NIOS initial finished and 1135 * release the SPI master to Host 1136 */ 1137 if (spi_master->mutex) 1138 pthread_mutex_lock(spi_master->mutex); 1139 1140 ret = nios_spi_wait_init_done(spi_master); 1141 if (ret != 0) { 1142 dev_err(fme, "FME NIOS_SPI init fail\n"); 1143 if (spi_master->mutex) 1144 pthread_mutex_unlock(spi_master->mutex); 1145 goto release_dev; 1146 } 1147 1148 dev_info(fme, "FME NIOS_SPI initial done\n"); 1149 1150 /* 2. check if error occur? */ 1151 if (nios_spi_check_error(spi_master)) 1152 dev_info(fme, "NIOS_SPI INIT done, but found some error\n"); 1153 1154 if (spi_master->mutex) 1155 pthread_mutex_unlock(spi_master->mutex); 1156 1157 /* 3. init the spi master*/ 1158 altera_spi_init(spi_master); 1159 1160 /* init the max10 device */ 1161 max10 = intel_max10_device_probe(spi_master, 0); 1162 if (!max10) { 1163 ret = -ENODEV; 1164 dev_err(fme, "max10 init fail\n"); 1165 goto release_dev; 1166 } 1167 1168 fme->max10_dev = max10; 1169 1170 max10->bus = hw->pci_data->bus; 1171 1172 fme_get_board_interface(fme); 1173 1174 mgr->sensor_list = &max10->opae_sensor_list; 1175 1176 /* SPI self test */ 1177 if (spi_self_checking(max10)) 1178 goto spi_fail; 1179 1180 ret = init_sec_mgr(fme); 1181 if (ret) { 1182 dev_err(fme, "security manager init fail\n"); 1183 goto spi_fail; 1184 } 1185 1186 return ret; 1187 1188 spi_fail: 1189 intel_max10_device_remove(fme->max10_dev); 1190 release_dev: 1191 altera_spi_release(spi_master); 1192 return -ENODEV; 1193 } 1194 1195 static void fme_nios_spi_uinit(struct ifpga_feature *feature) 1196 { 1197 struct ifpga_fme_hw *fme = (struct ifpga_fme_hw *)feature->parent; 1198 1199 release_sec_mgr(fme); 1200 if (fme->max10_dev) 1201 intel_max10_device_remove(fme->max10_dev); 1202 } 1203 1204 struct ifpga_feature_ops fme_nios_spi_master_ops = { 1205 .init = fme_nios_spi_init, 1206 .uinit = fme_nios_spi_uinit, 1207 }; 1208 1209 static int i2c_mac_rom_test(struct altera_i2c_dev *dev) 1210 { 1211 char buf[20]; 1212 int ret; 1213 char read_buf[20] = {0,}; 1214 const char *string = "1a2b3c4d5e"; 1215 1216 opae_memcpy(buf, string, strlen(string)); 1217 1218 ret = at24_eeprom_write(dev, AT24512_SLAVE_ADDR, 0, 1219 (u8 *)buf, strlen(string)); 1220 if (ret < 0) { 1221 dev_err(NULL, "write i2c error:%d\n", ret); 1222 return ret; 1223 } 1224 1225 ret = at24_eeprom_read(dev, AT24512_SLAVE_ADDR, 0, 1226 (u8 *)read_buf, strlen(string)); 1227 if (ret < 0) { 1228 dev_err(NULL, "read i2c error:%d\n", ret); 1229 return ret; 1230 } 1231 1232 if (memcmp(buf, read_buf, strlen(string))) { 1233 dev_err(NULL, "%s test fail!\n", __func__); 1234 return -EFAULT; 1235 } 1236 1237 dev_info(NULL, "%s test successful\n", __func__); 1238 1239 return 0; 1240 } 1241 1242 static void init_i2c_mutex(struct ifpga_fme_hw *fme) 1243 { 1244 struct ifpga_hw *hw = (struct ifpga_hw *)fme->parent; 1245 struct altera_i2c_dev *i2c_dev; 1246 opae_share_data *sd = NULL; 1247 1248 if (fme->i2c_master) { 1249 i2c_dev = (struct altera_i2c_dev *)fme->i2c_master; 1250 if (hw && hw->adapter && hw->adapter->shm.ptr) { 1251 dev_info(NULL, "use multi-process mutex in i2c\n"); 1252 sd = (opae_share_data *)hw->adapter->shm.ptr; 1253 i2c_dev->mutex = &sd->i2c_mutex; 1254 } else { 1255 dev_info(NULL, "use multi-thread mutex in i2c\n"); 1256 i2c_dev->mutex = &i2c_dev->lock; 1257 } 1258 } 1259 } 1260 1261 static int fme_i2c_init(struct ifpga_feature *feature) 1262 { 1263 struct feature_fme_i2c *i2c; 1264 struct ifpga_fme_hw *fme = (struct ifpga_fme_hw *)feature->parent; 1265 1266 i2c = (struct feature_fme_i2c *)feature->addr; 1267 1268 dev_info(NULL, "FME I2C Master Init.\n"); 1269 1270 fme->i2c_master = altera_i2c_probe(i2c); 1271 if (!fme->i2c_master) 1272 return -ENODEV; 1273 1274 init_i2c_mutex(fme); 1275 1276 /* MAC ROM self test */ 1277 i2c_mac_rom_test(fme->i2c_master); 1278 1279 return 0; 1280 } 1281 1282 static void fme_i2c_uninit(struct ifpga_feature *feature) 1283 { 1284 struct ifpga_fme_hw *fme = (struct ifpga_fme_hw *)feature->parent; 1285 1286 altera_i2c_remove(fme->i2c_master); 1287 } 1288 1289 struct ifpga_feature_ops fme_i2c_master_ops = { 1290 .init = fme_i2c_init, 1291 .uinit = fme_i2c_uninit, 1292 }; 1293 1294 static int fme_eth_group_init(struct ifpga_feature *feature) 1295 { 1296 struct ifpga_fme_hw *fme = (struct ifpga_fme_hw *)feature->parent; 1297 struct eth_group_device *dev; 1298 1299 dev = (struct eth_group_device *)eth_group_probe(feature->addr); 1300 if (!dev) 1301 return -ENODEV; 1302 1303 fme->eth_dev[dev->group_id] = dev; 1304 1305 fme->eth_group_region[dev->group_id].addr = 1306 feature->addr; 1307 fme->eth_group_region[dev->group_id].phys_addr = 1308 feature->phys_addr; 1309 fme->eth_group_region[dev->group_id].len = 1310 feature->size; 1311 1312 fme->nums_eth_dev++; 1313 1314 dev_info(NULL, "FME PHY Group %d Init.\n", dev->group_id); 1315 dev_info(NULL, "found %d eth group, addr %p phys_addr 0x%llx len %u\n", 1316 dev->group_id, feature->addr, 1317 (unsigned long long)feature->phys_addr, 1318 feature->size); 1319 1320 return 0; 1321 } 1322 1323 static void fme_eth_group_uinit(struct ifpga_feature *feature) 1324 { 1325 UNUSED(feature); 1326 } 1327 1328 struct ifpga_feature_ops fme_eth_group_ops = { 1329 .init = fme_eth_group_init, 1330 .uinit = fme_eth_group_uinit, 1331 }; 1332 1333 int fme_mgr_read_mac_rom(struct ifpga_fme_hw *fme, int offset, 1334 void *buf, int size) 1335 { 1336 struct altera_i2c_dev *dev; 1337 1338 dev = fme->i2c_master; 1339 if (!dev) 1340 return -ENODEV; 1341 1342 return at24_eeprom_read(dev, AT24512_SLAVE_ADDR, offset, buf, size); 1343 } 1344 1345 int fme_mgr_write_mac_rom(struct ifpga_fme_hw *fme, int offset, 1346 void *buf, int size) 1347 { 1348 struct altera_i2c_dev *dev; 1349 1350 dev = fme->i2c_master; 1351 if (!dev) 1352 return -ENODEV; 1353 1354 return at24_eeprom_write(dev, AT24512_SLAVE_ADDR, offset, buf, size); 1355 } 1356 1357 static struct eth_group_device *get_eth_group_dev(struct ifpga_fme_hw *fme, 1358 u8 group_id) 1359 { 1360 struct eth_group_device *dev; 1361 1362 if (group_id > (MAX_ETH_GROUP_DEVICES - 1)) 1363 return NULL; 1364 1365 dev = (struct eth_group_device *)fme->eth_dev[group_id]; 1366 if (!dev) 1367 return NULL; 1368 1369 if (dev->status != ETH_GROUP_DEV_ATTACHED) 1370 return NULL; 1371 1372 return dev; 1373 } 1374 1375 int fme_mgr_get_eth_group_nums(struct ifpga_fme_hw *fme) 1376 { 1377 return fme->nums_eth_dev; 1378 } 1379 1380 int fme_mgr_get_eth_group_info(struct ifpga_fme_hw *fme, 1381 u8 group_id, struct opae_eth_group_info *info) 1382 { 1383 struct eth_group_device *dev; 1384 1385 dev = get_eth_group_dev(fme, group_id); 1386 if (!dev) 1387 return -ENODEV; 1388 1389 info->group_id = group_id; 1390 info->speed = dev->speed; 1391 info->nums_of_mac = dev->mac_num; 1392 info->nums_of_phy = dev->phy_num; 1393 1394 return 0; 1395 } 1396 1397 int fme_mgr_eth_group_read_reg(struct ifpga_fme_hw *fme, u8 group_id, 1398 u8 type, u8 index, u16 addr, u32 *data) 1399 { 1400 struct eth_group_device *dev; 1401 1402 dev = get_eth_group_dev(fme, group_id); 1403 if (!dev) 1404 return -ENODEV; 1405 1406 return eth_group_read_reg(dev, type, index, addr, data); 1407 } 1408 1409 int fme_mgr_eth_group_write_reg(struct ifpga_fme_hw *fme, u8 group_id, 1410 u8 type, u8 index, u16 addr, u32 data) 1411 { 1412 struct eth_group_device *dev; 1413 1414 dev = get_eth_group_dev(fme, group_id); 1415 if (!dev) 1416 return -ENODEV; 1417 1418 return eth_group_write_reg(dev, type, index, addr, data); 1419 } 1420 1421 static int fme_get_eth_group_speed(struct ifpga_fme_hw *fme, 1422 u8 group_id) 1423 { 1424 struct eth_group_device *dev; 1425 1426 dev = get_eth_group_dev(fme, group_id); 1427 if (!dev) 1428 return -ENODEV; 1429 1430 return dev->speed; 1431 } 1432 1433 int fme_mgr_get_retimer_info(struct ifpga_fme_hw *fme, 1434 struct opae_retimer_info *info) 1435 { 1436 struct intel_max10_device *dev; 1437 1438 dev = (struct intel_max10_device *)fme->max10_dev; 1439 if (!dev) 1440 return -ENODEV; 1441 1442 info->nums_retimer = fme->board_info.nums_of_retimer; 1443 info->ports_per_retimer = fme->board_info.ports_per_retimer; 1444 info->nums_fvl = fme->board_info.nums_of_fvl; 1445 info->ports_per_fvl = fme->board_info.ports_per_fvl; 1446 1447 /* The speed of PKVL is identical the eth group's speed */ 1448 info->support_speed = fme_get_eth_group_speed(fme, 1449 LINE_SIDE_GROUP_ID); 1450 1451 return 0; 1452 } 1453 1454 int fme_mgr_get_retimer_status(struct ifpga_fme_hw *fme, 1455 struct opae_retimer_status *status) 1456 { 1457 struct intel_max10_device *dev; 1458 unsigned int val; 1459 1460 dev = (struct intel_max10_device *)fme->max10_dev; 1461 if (!dev) 1462 return -ENODEV; 1463 1464 if (max10_sys_read(dev, PKVL_LINK_STATUS, &val)) { 1465 dev_err(dev, "%s: read pkvl status fail\n", __func__); 1466 return -EINVAL; 1467 } 1468 1469 /* The speed of PKVL is identical the eth group's speed */ 1470 status->speed = fme_get_eth_group_speed(fme, 1471 LINE_SIDE_GROUP_ID); 1472 1473 status->line_link_bitmap = val; 1474 1475 dev_debug(dev, "get retimer status: speed:%d. line_link_bitmap:0x%x\n", 1476 status->speed, 1477 status->line_link_bitmap); 1478 1479 return 0; 1480 } 1481 1482 int fme_mgr_get_sensor_value(struct ifpga_fme_hw *fme, 1483 struct opae_sensor_info *sensor, 1484 unsigned int *value) 1485 { 1486 struct intel_max10_device *dev; 1487 1488 dev = (struct intel_max10_device *)fme->max10_dev; 1489 if (!dev) 1490 return -ENODEV; 1491 1492 if (max10_sys_read(dev, sensor->value_reg, value)) { 1493 dev_err(dev, "%s: read sensor value register 0x%x fail\n", 1494 __func__, sensor->value_reg); 1495 return -EINVAL; 1496 } 1497 1498 *value *= sensor->multiplier; 1499 1500 return 0; 1501 } 1502