35
35
/* Core 0 Port 0 counter */
36
36
#define smnPCIEP_NAK_COUNTER 0x1A340218
37
37
38
+ #define smnPCIE_PERF_CNTL_TXCLK3 0x1A38021c
39
+ #define smnPCIE_PERF_CNTL_TXCLK7 0x1A380888
40
+ #define smnPCIE_PERF_COUNT_CNTL 0x1A380200
41
+ #define smnPCIE_PERF_COUNT0_TXCLK3 0x1A380220
42
+ #define smnPCIE_PERF_COUNT0_TXCLK7 0x1A38088C
43
+ #define smnPCIE_PERF_COUNT0_UPVAL_TXCLK3 0x1A3808F8
44
+ #define smnPCIE_PERF_COUNT0_UPVAL_TXCLK7 0x1A380918
45
+
46
+
38
47
static void nbio_v7_9_remap_hdp_registers (struct amdgpu_device * adev )
39
48
{
40
49
WREG32_SOC15 (NBIO , 0 , regBIF_BX0_REMAP_HDP_MEM_FLUSH_CNTL ,
@@ -446,6 +455,59 @@ static u64 nbio_v7_9_get_pcie_replay_count(struct amdgpu_device *adev)
446
455
return (nak_r + nak_g );
447
456
}
448
457
458
+ static void nbio_v7_9_get_pcie_usage (struct amdgpu_device * adev , uint64_t * count0 ,
459
+ uint64_t * count1 )
460
+ {
461
+ uint32_t perfctrrx = 0 ;
462
+ uint32_t perfctrtx = 0 ;
463
+
464
+ /* This reports 0 on APUs, so return to avoid writing/reading registers
465
+ * that may or may not be different from their GPU counterparts
466
+ */
467
+ if (adev -> flags & AMD_IS_APU )
468
+ return ;
469
+
470
+ /* Use TXCLK3 counter group for rx event */
471
+ /* Use TXCLK7 counter group for tx event */
472
+ /* Set the 2 events that we wish to watch, defined above */
473
+ /* 40 is event# for received msgs */
474
+ /* 2 is event# of posted requests sent */
475
+ perfctrrx = REG_SET_FIELD (perfctrrx , PCIE_PERF_CNTL_TXCLK3 , EVENT0_SEL , 40 );
476
+ perfctrtx = REG_SET_FIELD (perfctrtx , PCIE_PERF_CNTL_TXCLK7 , EVENT0_SEL , 2 );
477
+
478
+ /* Write to enable desired perf counters */
479
+ WREG32_PCIE (smnPCIE_PERF_CNTL_TXCLK3 , perfctrrx );
480
+ WREG32_PCIE (smnPCIE_PERF_CNTL_TXCLK7 , perfctrtx );
481
+
482
+ /* Zero out and enable SHADOW_WR
483
+ * Write 0x6:
484
+ * Bit 1 = Global Shadow wr(1)
485
+ * Bit 2 = Global counter reset enable(1)
486
+ */
487
+ WREG32_PCIE (smnPCIE_PERF_COUNT_CNTL , 0x00000006 );
488
+
489
+ /* Enable Gloabl Counter
490
+ * Write 0x1:
491
+ * Bit 0 = Global Counter Enable(1)
492
+ */
493
+ WREG32_PCIE (smnPCIE_PERF_COUNT_CNTL , 0x00000001 );
494
+
495
+ msleep (1000 );
496
+
497
+ /* Disable Global Counter, Reset and enable SHADOW_WR
498
+ * Write 0x6:
499
+ * Bit 1 = Global Shadow wr(1)
500
+ * Bit 2 = Global counter reset enable(1)
501
+ */
502
+ WREG32_PCIE (smnPCIE_PERF_COUNT_CNTL , 0x00000006 );
503
+
504
+ /* Get the upper and lower count */
505
+ * count0 = RREG32_PCIE (smnPCIE_PERF_COUNT0_TXCLK3 ) |
506
+ ((uint64_t )RREG32_PCIE (smnPCIE_PERF_COUNT0_UPVAL_TXCLK3 ) << 32 );
507
+ * count1 = RREG32_PCIE (smnPCIE_PERF_COUNT0_TXCLK7 ) |
508
+ ((uint64_t )RREG32_PCIE (smnPCIE_PERF_COUNT0_UPVAL_TXCLK7 ) << 32 );
509
+ }
510
+
449
511
const struct amdgpu_nbio_funcs nbio_v7_9_funcs = {
450
512
.get_hdp_flush_req_offset = nbio_v7_9_get_hdp_flush_req_offset ,
451
513
.get_hdp_flush_done_offset = nbio_v7_9_get_hdp_flush_done_offset ,
@@ -470,6 +532,7 @@ const struct amdgpu_nbio_funcs nbio_v7_9_funcs = {
470
532
.get_memory_partition_mode = nbio_v7_9_get_memory_partition_mode ,
471
533
.init_registers = nbio_v7_9_init_registers ,
472
534
.get_pcie_replay_count = nbio_v7_9_get_pcie_replay_count ,
535
+ .get_pcie_usage = nbio_v7_9_get_pcie_usage ,
473
536
};
474
537
475
538
static void nbio_v7_9_query_ras_error_count (struct amdgpu_device * adev ,
0 commit comments