Skip to content

Commit 88d25ca

Browse files
Merge pull request #5 from SrikarJosyula/main
BSA: Fix for bug related to 32/64 bit access in pal_exerciser
2 parents 90c6401 + 5b91ec0 commit 88d25ca

2 files changed

Lines changed: 27 additions & 10 deletions

File tree

pal/baremetal/target/RDN2/src/pal_exerciser.c

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@ uint32_t pal_exerciser_set_param(EXERCISER_PARAM_TYPE Type, uint64_t Value1, uin
230230
uint64_t Base;
231231
uint64_t Ecam;
232232
uint32_t bdf;
233+
uint32_t upper_range, lower_range;
233234

234235
Base = pal_exerciser_get_ecsr_base(Bdf,0);
235236
Ecam = pal_exerciser_get_ecam(Bdf);
@@ -243,8 +244,13 @@ uint32_t pal_exerciser_set_param(EXERCISER_PARAM_TYPE Type, uint64_t Value1, uin
243244
return 0;
244245

245246
case DMA_ATTRIBUTES:
246-
pal_mmio_write(Base + DMA_BUS_ADDR,Value1);// wrting into the DMA Control Register 2
247-
pal_mmio_write(Base + DMA_LEN,Value2);// writing into the DMA Control Register 3
247+
/* writing into the DMA Control Register 2 */
248+
lower_range = (uint32_t)(Value1 & 0xFFFFFFFF);
249+
upper_range = (uint32_t)((Value1 >> 32) & 0xFFFFFFFF);
250+
pal_mmio_write(Base + DMA_BUS_ADDR, lower_range);
251+
pal_mmio_write(Base + DMA_BUS_ADDR + 4, upper_range);
252+
/* writing into the DMA Control Register 3 */
253+
pal_mmio_write(Base + DMA_LEN, (uint32_t)Value2);
248254
return 0;
249255

250256
case P2P_ATTRIBUTES:
@@ -399,6 +405,7 @@ uint32_t pal_exerciser_get_param(EXERCISER_PARAM_TYPE Type, uint64_t *Value1, ui
399405
uint32_t addr_high = 0;
400406
uint32_t data_low = 0;
401407
uint32_t data_high = 0;
408+
uint32_t upper_range, lower_range;
402409

403410
Base = pal_exerciser_get_ecsr_base(Bdf,0);
404411
switch (Type) {
@@ -409,8 +416,12 @@ uint32_t pal_exerciser_get_param(EXERCISER_PARAM_TYPE Type, uint64_t *Value1, ui
409416
*Value1 = pal_mmio_read(Base + INTXCTL);
410417
return pal_mmio_read(Base + INTXCTL) | MASK_BIT ;
411418
case DMA_ATTRIBUTES:
412-
*Value1 = pal_mmio_read(Base + DMA_BUS_ADDR); // Reading the data from DMA Control Register 2
413-
*Value2 = pal_mmio_read(Base + DMA_LEN); // Reading the data from DMA Control Register 3
419+
/* Reading the data from DMA Control Register 2 */
420+
lower_range = pal_mmio_read(Base + DMA_BUS_ADDR);
421+
upper_range = pal_mmio_read(Base + DMA_BUS_ADDR + 4);
422+
*Value1 = ((uint64_t)upper_range << 32) | lower_range;
423+
/* Reading the data from DMA Control Register 3 */
424+
*Value2 = pal_mmio_read(Base + DMA_LEN);
414425
Temp = pal_mmio_read(Base + DMASTATUS);
415426
Status = Temp & MASK_BIT;// returning the DMA status
416427
return Status;
@@ -423,7 +434,9 @@ uint32_t pal_exerciser_get_param(EXERCISER_PARAM_TYPE Type, uint64_t *Value1, ui
423434
*Value1 = pal_mmio_read(Base + MSICTL);
424435
return pal_mmio_read(Base + MSICTL) | MASK_BIT;
425436
case ATS_RES_ATTRIBUTES:
426-
*Value1 = pal_mmio_read(Base + ATS_ADDR);
437+
lower_range = pal_mmio_read(Base + ATS_ADDR);
438+
upper_range = pal_mmio_read(Base + ATS_ADDR + 4);
439+
*Value1 = ((uint64_t)upper_range << 32) | lower_range;
427440
return 0;
428441
case CFG_TXN_ATTRIBUTES:
429442
case TRANSACTION_TYPE:
@@ -509,6 +522,7 @@ uint32_t pal_exerciser_ops(EXERCISER_OPS Ops, uint64_t Param, uint32_t Bdf)
509522
uint64_t Ecam;
510523
uint32_t CapabilityOffset = 0;
511524
uint32_t data;
525+
uint32_t upper_range, lower_range;
512526

513527
Base = pal_exerciser_get_base(Bdf,0);
514528
Ecam = pal_exerciser_get_ecam(Bdf); // Getting the ECAM address
@@ -584,7 +598,10 @@ uint32_t pal_exerciser_ops(EXERCISER_OPS Ops, uint64_t Param, uint32_t Bdf)
584598
return 0;
585599

586600
case ATS_TXN_REQ:
587-
pal_mmio_write(Base + DMA_BUS_ADDR, Param);
601+
lower_range = (uint32_t)(Param & 0xFFFFFFFF);
602+
upper_range = (uint32_t)((Param >> 32) & 0xFFFFFFFF);
603+
pal_mmio_write(Base + DMA_BUS_ADDR, lower_range);
604+
pal_mmio_write(Base + DMA_BUS_ADDR + 4, upper_range);
588605
pal_mmio_write(Base + ATSCTL, ATS_TRIGGER);
589606
return !(pal_mmio_read(Base + ATSCTL) & ATS_STATUS);
590607

test_pool/exerciser/e007.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,11 @@ uint32_t test_sequence2(void *dram_buf1_virt, void *dram_buf1_phys, uint32_t ins
7070
val_pe_cache_clean_invalidate_range((uint64_t)dram_buf2_virt, (uint64_t)dma_len);
7171

7272
/* Perform DMA OUT to copy contents of dram_buf2 to exerciser memory */
73-
val_exerciser_set_param(DMA_ATTRIBUTES, (uint64_t)dram_buf2_phys, dma_len, instance);
73+
val_exerciser_set_param(DMA_ATTRIBUTES, (uint64_t)dram_buf2_phys, (uint64_t)dma_len, instance);
7474
val_exerciser_ops(START_DMA, EDMA_TO_DEVICE, instance);
7575

7676
/* Perform DMA IN to copy content back from exerciser memory to dram_buf1 */
77-
val_exerciser_set_param(DMA_ATTRIBUTES, (uint64_t)dram_buf1_phys, dma_len, instance);
77+
val_exerciser_set_param(DMA_ATTRIBUTES, (uint64_t)dram_buf1_phys, (uint64_t)dma_len, instance);
7878
val_exerciser_ops(START_DMA, EDMA_FROM_DEVICE, instance);
7979

8080
/* Invalidate dram_buf1 and dram_buf2 contents present in CPU caches */
@@ -109,11 +109,11 @@ uint32_t test_sequence1(void *dram_buf1_virt, void *dram_buf1_phys, uint32_t ins
109109
val_memory_set(dram_buf1_virt, dma_len, NEW_DATA);
110110

111111
/* Perform DMA OUT to copy contents of dram_buf1 to exerciser memory */
112-
val_exerciser_set_param(DMA_ATTRIBUTES, (uint64_t)dram_buf1_phys, dma_len, instance);
112+
val_exerciser_set_param(DMA_ATTRIBUTES, (uint64_t)dram_buf1_phys, (uint64_t)dma_len, instance);
113113
val_exerciser_ops(START_DMA, EDMA_TO_DEVICE, instance);
114114

115115
/* Perform DMA IN to copy the content from exerciser memory to dram_buf1 */
116-
val_exerciser_set_param(DMA_ATTRIBUTES, (uint64_t)dram_buf1_phys, dma_len, instance);
116+
val_exerciser_set_param(DMA_ATTRIBUTES, (uint64_t)dram_buf1_phys, (uint64_t)dma_len, instance);
117117
val_exerciser_ops(START_DMA, EDMA_FROM_DEVICE, instance);
118118

119119
/* Write dram_buf2 with NEW_DATA to compare dram_buf1 content */

0 commit comments

Comments
 (0)