Skip to content

Commit faadbc4

Browse files
jxstelternashif
authored andcommitted
mm_drv: tlb: Fix mapped page in bank calculation
The initial implementation was broken during improvements. There was incorrect assumption that all pages are unmapped at initials state. In reality at the beginning whole memory is powered on, so we should mark all pages as mapped. Later in initialization code unused pages are unmapped and if after this some banks become empty (all pages unmapped), the power is switched off. Signed-off-by: Jaroslaw Stelter <[email protected]>
1 parent e2e3dc0 commit faadbc4

File tree

4 files changed

+19
-12
lines changed

4 files changed

+19
-12
lines changed

drivers/mm/mm_drv_bank.c

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,32 +15,30 @@
1515
*/
1616

1717
#include <zephyr/kernel.h>
18-
18+
#include <zephyr/sys/__assert.h>
1919
#include <zephyr/drivers/mm/mm_drv_bank.h>
2020
#include <zephyr/sys/mem_stats.h>
2121

2222
void sys_mm_drv_bank_init(struct mem_drv_bank *bank, uint32_t bank_pages)
2323
{
24-
bank->unmapped_pages = bank_pages;
25-
bank->mapped_pages = 0;
26-
bank->max_mapped_pages = 0;
24+
bank->unmapped_pages = 0;
25+
bank->mapped_pages = bank_pages;
26+
bank->max_mapped_pages = bank_pages;
2727
}
2828

2929
uint32_t sys_mm_drv_bank_page_mapped(struct mem_drv_bank *bank)
3030
{
3131
bank->unmapped_pages--;
3232
bank->mapped_pages++;
33-
if (bank->mapped_pages > bank->max_mapped_pages) {
34-
bank->max_mapped_pages = bank->mapped_pages;
35-
}
33+
__ASSERT_NO_MSG(bank->mapped_pages <= bank->max_mapped_pages);
3634
return bank->mapped_pages;
3735
}
3836

3937
uint32_t sys_mm_drv_bank_page_unmapped(struct mem_drv_bank *bank)
4038
{
4139
bank->unmapped_pages++;
4240
bank->mapped_pages--;
43-
41+
__ASSERT_NO_MSG(bank->unmapped_pages <= bank->max_mapped_pages);
4442
return bank->unmapped_pages;
4543
}
4644

drivers/mm/mm_drv_intel_adsp_mtl_tlb.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,7 @@ int sys_mm_drv_unmap_page(void *virt)
378378
sys_mm_drv_report_page_usage();
379379
#endif
380380

381-
if (sys_mm_drv_bank_page_unmapped(&hpsram_bank[bank_idx]) == 0) {
381+
if (sys_mm_drv_bank_page_unmapped(&hpsram_bank[bank_idx]) == SRAM_BANK_PAGE_NUM) {
382382
sys_mm_drv_hpsram_pwr(bank_idx, false, false);
383383
}
384384
}
@@ -649,7 +649,7 @@ static int sys_mm_drv_mm_init(const struct device *dev)
649649
*/
650650
for (int i = 0; i < L2_SRAM_BANK_NUM; i++) {
651651
sys_mm_drv_bank_init(&hpsram_bank[i],
652-
SRAM_BANK_SIZE / CONFIG_MM_DRV_PAGE_SIZE);
652+
SRAM_BANK_PAGE_NUM);
653653
}
654654
#ifdef CONFIG_SOC_INTEL_COMM_WIDGET
655655
used_pages = L2_SRAM_BANK_NUM * SRAM_BANK_SIZE / CONFIG_MM_DRV_PAGE_SIZE;

include/zephyr/drivers/mm/mm_drv_bank.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
#include <zephyr/sys/mem_stats.h>
2222
#include <stdint.h>
2323

24+
#define SRAM_BANK_PAGE_NUM (SRAM_BANK_SIZE / CONFIG_MM_DRV_PAGE_SIZE)
25+
2426
struct mem_drv_bank {
2527
uint32_t unmapped_pages;
2628
uint32_t mapped_pages;
@@ -32,7 +34,9 @@ struct mem_drv_bank {
3234
*
3335
* The driver may wish to track various information about the memory banks
3436
* that it uses. This routine will initialize a generic structure containing
35-
* that information.
37+
* that information. Since at the power on all memory banks are switched on
38+
* it will start with all pages mapped. In next phase of driver initialization
39+
* unused pages will be unmapped.
3640
*
3741
* @param bank Pointer to the memory bank structure used for tracking
3842
* @param bank_pages Number of pages in the memory bank

tests/drivers/mm/sys_mm_drv_bank/src/main.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,15 @@ ZTEST(sys_mm_bank_api, test_sys_mm_drv_bank)
3434
struct sys_memory_stats stats;
3535
struct sys_memory_stats expected;
3636
uint32_t count;
37+
uint32_t index;
3738

3839
/* Verify that the initialization routine works as expected. */
39-
40+
/* It set mapped state for all pages */
4041
sys_mm_drv_bank_init(&bank_data, BANK_PAGES);
42+
/* Now unmap all pages */
43+
for (index = 0; index < BANK_PAGES; index++) {
44+
sys_mm_drv_bank_page_unmapped(&bank_data);
45+
}
4146

4247
expected.free_bytes = EXPECTED(BANK_PAGES);
4348
expected.allocated_bytes = EXPECTED(0);

0 commit comments

Comments
 (0)