Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions common/CMakeLists.txt
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,6 +23,7 @@ target_sources(${PROJECT_NAME} PRIVATE
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_format_extended.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_free_block_list_add.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_initialize.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_logical_group_compact.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_mapped_block_list_add.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_mapped_block_list_get.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_mapped_block_list_remove.c
Expand Down
29 changes: 27 additions & 2 deletions common/inc/lx_api.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -149,8 +149,8 @@ typedef unsigned long long ULONG64;
#define AZURE_RTOS_LEVELX
#define LEVELX_MAJOR_VERSION 6
#define LEVELX_MINOR_VERSION 5
#define LEVELX_PATCH_VERSION 0
#define LEVELX_BUILD_VERSION 202601
#define LEVELX_PATCH_VERSION 1
#define LEVELX_BUILD_VERSION 202602
#define LEVELX_HOTFIX_VERSION ' '


Expand DownExpand Up@@ -274,6 +274,17 @@ typedef unsigned long long ULONG64;
#define LX_NAND_FLASH_MAX_METADATA_BLOCKS 4
#endif

/* When LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE is defined, sector releases from full blocks
are deferred when free block count exceeds the threshold below (opt-in, default: off).
Requires pages_per_block <= 4095 (bit 12 is reserved for COMPACTION_PENDING flag). */
/* #define LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE */

#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
#ifndef LX_NAND_FLASH_SECTOR_RELEASE_LAZY_THRESHOLD
#define LX_NAND_FLASH_SECTOR_RELEASE_LAZY_THRESHOLD 10u
#endif
#endif

#ifndef LX_UTILITY_SHORT_SET
#define LX_UTILITY_SHORT_SET(address, value) *((USHORT*)(address)) = (USHORT)(value)
#endif
Expand DownExpand Up@@ -328,6 +339,11 @@ typedef unsigned long long ULONG64;
#define LX_NAND_BLOCK_STATUS_FULL 0x4000u
#define LX_NAND_BLOCK_STATUS_NON_SEQUENTIAL 0x2000u
#define LX_NAND_BLOCK_STATUS_MAPPING_PRESENT 0x1000u
#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
/* Repurpose the otherwise-unused MAPPING_PRESENT bit to signal a block whose compaction
has been deferred. Only valid when pages_per_block <= 4095. */
#define LX_NAND_BLOCK_STATUS_COMPACTION_PENDING LX_NAND_BLOCK_STATUS_MAPPING_PRESENT
#endif
#define LX_NAND_BLOCK_STATUS_PAGE_NUMBER_MASK 0x0FFFu
#define LX_NAND_BLOCK_STATUS_FREE 0xFFFFu
#define LX_NAND_BLOCK_STATUS_BAD 0xFF00u
Expand DownExpand Up@@ -402,6 +418,12 @@ typedef struct LX_NAND_FLASH_STRUCT
USHORT *lx_nand_flash_block_list;
ULONG lx_nand_flash_block_list_size;
ULONG lx_nand_flash_free_block_list_tail;
#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
/* Parallel to block_mapping_table: physical block with pending compaction for a group,
or LX_NAND_BLOCK_UNMAPPED when no compaction is pending. */
USHORT *lx_nand_flash_block_compaction_table;
ULONG lx_nand_flash_block_compaction_table_size;
#endif
ULONG lx_nand_flash_mapped_block_list_head;

ULONG lx_nand_flash_metadata_block_number;
Expand DownExpand Up@@ -771,6 +793,9 @@ UINT _lx_nand_flash_metadata_write(LX_NAND_FLASH *nand_flash, UCHAR* main_buf
VOID _lx_nand_flash_system_error(LX_NAND_FLASH *nand_flash, UINT error_code, ULONG block, ULONG page);
UINT _lx_nand_flash_256byte_ecc_check(UCHAR *page_buffer, UCHAR *ecc_buffer);
UINT _lx_nand_flash_256byte_ecc_compute(UCHAR *page_buffer, UCHAR *ecc_buffer);
#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
UINT _lx_nand_flash_logical_group_compact(LX_NAND_FLASH *nand_flash, ULONG logical_group);
#endif

UINT _lx_nor_flash_block_reclaim(LX_NOR_FLASH *nor_flash);
UINT _lx_nor_flash_driver_block_erase(LX_NOR_FLASH *nor_flash, ULONG block, ULONG erase_count);
Expand Down
38 changes: 38 additions & 0 deletions common/src/lx_nand_flash_block_allocate.c
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
* SPDX-License-Identifier: MIT
**************************************************************************/

// Some portions generated by Copilot (Sonnet 4.6).

/**************************************************************************/
/**************************************************************************/
Expand DownExpand Up@@ -75,6 +76,43 @@ UINT _lx_nand_flash_block_allocate(LX_NAND_FLASH* nand_flash, ULONG* block)
if (nand_flash -> lx_nand_flash_free_block_list_tail == 0)
{

#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
{

ULONG lg;
UINT compact_status;

/* Emergency compaction: find any pending compaction and execute it to
reclaim the old full block. */
for (lg = 0; lg < nand_flash -> lx_nand_flash_total_blocks; lg++)
{

if (nand_flash -> lx_nand_flash_block_compaction_table[lg] != (USHORT)LX_NAND_BLOCK_UNMAPPED)
{

compact_status = _lx_nand_flash_logical_group_compact(nand_flash, lg);

if (compact_status == LX_SUCCESS)
{

/* Retry the allocation after compaction freed a block. */
if (nand_flash -> lx_nand_flash_free_block_list_tail > 0)
{

nand_flash -> lx_nand_flash_free_block_list_tail--;
*block = nand_flash -> lx_nand_flash_block_list[nand_flash -> lx_nand_flash_free_block_list_tail];
return(LX_SUCCESS);
}
}

/* Attempt only one compaction per allocate call. */
break;
}
}

}
#endif /* LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE */

/* Empty list, return error. */
return(LX_NO_BLOCKS);
}
Expand Down
28 changes: 28 additions & 0 deletions common/src/lx_nand_flash_block_data_move.c
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
* SPDX-License-Identifier: MIT
**************************************************************************/

// Some portions generated by Copilot (Sonnet 4.6).

/**************************************************************************/
/**************************************************************************/
Expand DownExpand Up@@ -111,6 +112,33 @@ ULONG block_mapping_index;
return(LX_ERROR);
}

#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
/* If this logical group has a pending compaction source, redirect the
data move to a full logical-group compact to correctly merge data from
both source blocks. */
if (nand_flash -> lx_nand_flash_block_compaction_table[block_mapping_index] != (USHORT)LX_NAND_BLOCK_UNMAPPED)
{

/* Return the pre-allocated new_block to the free list. */
status = _lx_nand_flash_block_status_set(nand_flash, new_block, LX_NAND_BLOCK_STATUS_FREE);

if (status)
{
_lx_nand_flash_system_error(nand_flash, status, new_block, 0);
return(LX_ERROR);
}

_lx_nand_flash_free_block_list_add(nand_flash, new_block);

/* Restore block_mapping_index to the mapped list; mapped_block_list_get
already removed it before this function was called. */
_lx_nand_flash_mapped_block_list_add(nand_flash, block_mapping_index);

/* Perform full compaction merge of both source blocks. */
return(_lx_nand_flash_logical_group_compact(nand_flash, block_mapping_index));
}
#endif /* LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE */

/* Set new block status to allocated for now. */
new_block_status = LX_NAND_BLOCK_STATUS_ALLOCATED;

Expand Down
29 changes: 29 additions & 0 deletions common/src/lx_nand_flash_defragment.c
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
* SPDX-License-Identifier: MIT
**************************************************************************/

// Some portions generated by Copilot (Sonnet 4.6).

/**************************************************************************/
/**************************************************************************/
Expand DownExpand Up@@ -72,10 +73,38 @@
UINT _lx_nand_flash_defragment(LX_NAND_FLASH *nand_flash)
{

#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE

UINT status;
ULONG lg;

/* Compact every logical group that has a deferred compaction pending. */
for (lg = 0; lg < nand_flash -> lx_nand_flash_total_blocks; lg++)
{

if (nand_flash -> lx_nand_flash_block_compaction_table[lg] != (USHORT)LX_NAND_BLOCK_UNMAPPED)
{

status = _lx_nand_flash_logical_group_compact(nand_flash, lg);

/* On error, continue to compact remaining groups. */
if (status)
{
_lx_nand_flash_system_error(nand_flash, status, lg, 0);
}
}
}

return(LX_SUCCESS);

#else

LX_PARAMETER_NOT_USED(nand_flash);

/* Return not supported. */
return(LX_NOT_SUPPORTED);

#endif /* LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE */
}


Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions common/CMakeLists.txt
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,6 +23,7 @@ target_sources(${PROJECT_NAME} PRIVATE
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_format_extended.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_free_block_list_add.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_initialize.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_logical_group_compact.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_mapped_block_list_add.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_mapped_block_list_get.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_mapped_block_list_remove.c
Expand Down
29 changes: 27 additions & 2 deletions common/inc/lx_api.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -149,8 +149,8 @@ typedef unsigned long long ULONG64;
#define AZURE_RTOS_LEVELX
#define LEVELX_MAJOR_VERSION 6
#define LEVELX_MINOR_VERSION 5
#define LEVELX_PATCH_VERSION 0
#define LEVELX_BUILD_VERSION 202601
#define LEVELX_PATCH_VERSION 1
#define LEVELX_BUILD_VERSION 202602
#define LEVELX_HOTFIX_VERSION ' '


Expand DownExpand Up@@ -274,6 +274,17 @@ typedef unsigned long long ULONG64;
#define LX_NAND_FLASH_MAX_METADATA_BLOCKS 4
#endif

/* When LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE is defined, sector releases from full blocks
are deferred when free block count exceeds the threshold below (opt-in, default: off).
Requires pages_per_block <= 4095 (bit 12 is reserved for COMPACTION_PENDING flag). */
/* #define LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE */

#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
#ifndef LX_NAND_FLASH_SECTOR_RELEASE_LAZY_THRESHOLD
#define LX_NAND_FLASH_SECTOR_RELEASE_LAZY_THRESHOLD 10u
#endif
#endif

#ifndef LX_UTILITY_SHORT_SET
#define LX_UTILITY_SHORT_SET(address, value) *((USHORT*)(address)) = (USHORT)(value)
#endif
Expand DownExpand Up@@ -328,6 +339,11 @@ typedef unsigned long long ULONG64;
#define LX_NAND_BLOCK_STATUS_FULL 0x4000u
#define LX_NAND_BLOCK_STATUS_NON_SEQUENTIAL 0x2000u
#define LX_NAND_BLOCK_STATUS_MAPPING_PRESENT 0x1000u
#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
/* Repurpose the otherwise-unused MAPPING_PRESENT bit to signal a block whose compaction
has been deferred. Only valid when pages_per_block <= 4095. */
#define LX_NAND_BLOCK_STATUS_COMPACTION_PENDING LX_NAND_BLOCK_STATUS_MAPPING_PRESENT
#endif
#define LX_NAND_BLOCK_STATUS_PAGE_NUMBER_MASK 0x0FFFu
#define LX_NAND_BLOCK_STATUS_FREE 0xFFFFu
#define LX_NAND_BLOCK_STATUS_BAD 0xFF00u
Expand DownExpand Up@@ -402,6 +418,12 @@ typedef struct LX_NAND_FLASH_STRUCT
USHORT *lx_nand_flash_block_list;
ULONG lx_nand_flash_block_list_size;
ULONG lx_nand_flash_free_block_list_tail;
#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
/* Parallel to block_mapping_table: physical block with pending compaction for a group,
or LX_NAND_BLOCK_UNMAPPED when no compaction is pending. */
USHORT *lx_nand_flash_block_compaction_table;
ULONG lx_nand_flash_block_compaction_table_size;
#endif
ULONG lx_nand_flash_mapped_block_list_head;

ULONG lx_nand_flash_metadata_block_number;
Expand DownExpand Up@@ -771,6 +793,9 @@ UINT _lx_nand_flash_metadata_write(LX_NAND_FLASH *nand_flash, UCHAR* main_buf
VOID _lx_nand_flash_system_error(LX_NAND_FLASH *nand_flash, UINT error_code, ULONG block, ULONG page);
UINT _lx_nand_flash_256byte_ecc_check(UCHAR *page_buffer, UCHAR *ecc_buffer);
UINT _lx_nand_flash_256byte_ecc_compute(UCHAR *page_buffer, UCHAR *ecc_buffer);
#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
UINT _lx_nand_flash_logical_group_compact(LX_NAND_FLASH *nand_flash, ULONG logical_group);
#endif

UINT _lx_nor_flash_block_reclaim(LX_NOR_FLASH *nor_flash);
UINT _lx_nor_flash_driver_block_erase(LX_NOR_FLASH *nor_flash, ULONG block, ULONG erase_count);
Expand Down
38 changes: 38 additions & 0 deletions common/src/lx_nand_flash_block_allocate.c
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
* SPDX-License-Identifier: MIT
**************************************************************************/

// Some portions generated by Copilot (Sonnet 4.6).

/**************************************************************************/
/**************************************************************************/
Expand DownExpand Up@@ -75,6 +76,43 @@ UINT _lx_nand_flash_block_allocate(LX_NAND_FLASH* nand_flash, ULONG* block)
if (nand_flash -> lx_nand_flash_free_block_list_tail == 0)
{

#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
{

ULONG lg;
UINT compact_status;

/* Emergency compaction: find any pending compaction and execute it to
reclaim the old full block. */
for (lg = 0; lg < nand_flash -> lx_nand_flash_total_blocks; lg++)
{

if (nand_flash -> lx_nand_flash_block_compaction_table[lg] != (USHORT)LX_NAND_BLOCK_UNMAPPED)
{

compact_status = _lx_nand_flash_logical_group_compact(nand_flash, lg);

if (compact_status == LX_SUCCESS)
{

/* Retry the allocation after compaction freed a block. */
if (nand_flash -> lx_nand_flash_free_block_list_tail > 0)
{

nand_flash -> lx_nand_flash_free_block_list_tail--;
*block = nand_flash -> lx_nand_flash_block_list[nand_flash -> lx_nand_flash_free_block_list_tail];
return(LX_SUCCESS);
}
}

/* Attempt only one compaction per allocate call. */
break;
}
}

}
#endif /* LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE */

/* Empty list, return error. */
return(LX_NO_BLOCKS);
}
Expand Down
28 changes: 28 additions & 0 deletions common/src/lx_nand_flash_block_data_move.c
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
* SPDX-License-Identifier: MIT
**************************************************************************/

// Some portions generated by Copilot (Sonnet 4.6).

/**************************************************************************/
/**************************************************************************/
Expand DownExpand Up@@ -111,6 +112,33 @@ ULONG block_mapping_index;
return(LX_ERROR);
}

#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
/* If this logical group has a pending compaction source, redirect the
data move to a full logical-group compact to correctly merge data from
both source blocks. */
if (nand_flash -> lx_nand_flash_block_compaction_table[block_mapping_index] != (USHORT)LX_NAND_BLOCK_UNMAPPED)
{

/* Return the pre-allocated new_block to the free list. */
status = _lx_nand_flash_block_status_set(nand_flash, new_block, LX_NAND_BLOCK_STATUS_FREE);

if (status)
{
_lx_nand_flash_system_error(nand_flash, status, new_block, 0);
return(LX_ERROR);
}

_lx_nand_flash_free_block_list_add(nand_flash, new_block);

/* Restore block_mapping_index to the mapped list; mapped_block_list_get
already removed it before this function was called. */
_lx_nand_flash_mapped_block_list_add(nand_flash, block_mapping_index);

/* Perform full compaction merge of both source blocks. */
return(_lx_nand_flash_logical_group_compact(nand_flash, block_mapping_index));
}
#endif /* LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE */

/* Set new block status to allocated for now. */
new_block_status = LX_NAND_BLOCK_STATUS_ALLOCATED;

Expand Down
29 changes: 29 additions & 0 deletions common/src/lx_nand_flash_defragment.c
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
* SPDX-License-Identifier: MIT
**************************************************************************/

// Some portions generated by Copilot (Sonnet 4.6).

/**************************************************************************/
/**************************************************************************/
Expand DownExpand Up@@ -72,10 +73,38 @@
UINT _lx_nand_flash_defragment(LX_NAND_FLASH *nand_flash)
{

#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE

UINT status;
ULONG lg;

/* Compact every logical group that has a deferred compaction pending. */
for (lg = 0; lg < nand_flash -> lx_nand_flash_total_blocks; lg++)
{

if (nand_flash -> lx_nand_flash_block_compaction_table[lg] != (USHORT)LX_NAND_BLOCK_UNMAPPED)
{

status = _lx_nand_flash_logical_group_compact(nand_flash, lg);

/* On error, continue to compact remaining groups. */
if (status)
{
_lx_nand_flash_system_error(nand_flash, status, lg, 0);
}
}
}

return(LX_SUCCESS);

#else

LX_PARAMETER_NOT_USED(nand_flash);

/* Return not supported. */
return(LX_NOT_SUPPORTED);

#endif /* LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE */
}


Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions common/CMakeLists.txt
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,6 +23,7 @@ target_sources(${PROJECT_NAME} PRIVATE
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_format_extended.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_free_block_list_add.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_initialize.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_logical_group_compact.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_mapped_block_list_add.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_mapped_block_list_get.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_mapped_block_list_remove.c
Expand Down
29 changes: 27 additions & 2 deletions common/inc/lx_api.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -149,8 +149,8 @@ typedef unsigned long long ULONG64;
#define AZURE_RTOS_LEVELX
#define LEVELX_MAJOR_VERSION 6
#define LEVELX_MINOR_VERSION 5
#define LEVELX_PATCH_VERSION 0
#define LEVELX_BUILD_VERSION 202601
#define LEVELX_PATCH_VERSION 1
#define LEVELX_BUILD_VERSION 202602
#define LEVELX_HOTFIX_VERSION ' '


Expand DownExpand Up@@ -274,6 +274,17 @@ typedef unsigned long long ULONG64;
#define LX_NAND_FLASH_MAX_METADATA_BLOCKS 4
#endif

/* When LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE is defined, sector releases from full blocks
are deferred when free block count exceeds the threshold below (opt-in, default: off).
Requires pages_per_block <= 4095 (bit 12 is reserved for COMPACTION_PENDING flag). */
/* #define LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE */

#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
#ifndef LX_NAND_FLASH_SECTOR_RELEASE_LAZY_THRESHOLD
#define LX_NAND_FLASH_SECTOR_RELEASE_LAZY_THRESHOLD 10u
#endif
#endif

#ifndef LX_UTILITY_SHORT_SET
#define LX_UTILITY_SHORT_SET(address, value) *((USHORT*)(address)) = (USHORT)(value)
#endif
Expand DownExpand Up@@ -328,6 +339,11 @@ typedef unsigned long long ULONG64;
#define LX_NAND_BLOCK_STATUS_FULL 0x4000u
#define LX_NAND_BLOCK_STATUS_NON_SEQUENTIAL 0x2000u
#define LX_NAND_BLOCK_STATUS_MAPPING_PRESENT 0x1000u
#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
/* Repurpose the otherwise-unused MAPPING_PRESENT bit to signal a block whose compaction
has been deferred. Only valid when pages_per_block <= 4095. */
#define LX_NAND_BLOCK_STATUS_COMPACTION_PENDING LX_NAND_BLOCK_STATUS_MAPPING_PRESENT
#endif
#define LX_NAND_BLOCK_STATUS_PAGE_NUMBER_MASK 0x0FFFu
#define LX_NAND_BLOCK_STATUS_FREE 0xFFFFu
#define LX_NAND_BLOCK_STATUS_BAD 0xFF00u
Expand DownExpand Up@@ -402,6 +418,12 @@ typedef struct LX_NAND_FLASH_STRUCT
USHORT *lx_nand_flash_block_list;
ULONG lx_nand_flash_block_list_size;
ULONG lx_nand_flash_free_block_list_tail;
#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
/* Parallel to block_mapping_table: physical block with pending compaction for a group,
or LX_NAND_BLOCK_UNMAPPED when no compaction is pending. */
USHORT *lx_nand_flash_block_compaction_table;
ULONG lx_nand_flash_block_compaction_table_size;
#endif
ULONG lx_nand_flash_mapped_block_list_head;

ULONG lx_nand_flash_metadata_block_number;
Expand DownExpand Up@@ -771,6 +793,9 @@ UINT _lx_nand_flash_metadata_write(LX_NAND_FLASH *nand_flash, UCHAR* main_buf
VOID _lx_nand_flash_system_error(LX_NAND_FLASH *nand_flash, UINT error_code, ULONG block, ULONG page);
UINT _lx_nand_flash_256byte_ecc_check(UCHAR *page_buffer, UCHAR *ecc_buffer);
UINT _lx_nand_flash_256byte_ecc_compute(UCHAR *page_buffer, UCHAR *ecc_buffer);
#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
UINT _lx_nand_flash_logical_group_compact(LX_NAND_FLASH *nand_flash, ULONG logical_group);
#endif

UINT _lx_nor_flash_block_reclaim(LX_NOR_FLASH *nor_flash);
UINT _lx_nor_flash_driver_block_erase(LX_NOR_FLASH *nor_flash, ULONG block, ULONG erase_count);
Expand Down
38 changes: 38 additions & 0 deletions common/src/lx_nand_flash_block_allocate.c
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
* SPDX-License-Identifier: MIT
**************************************************************************/

// Some portions generated by Copilot (Sonnet 4.6).

/**************************************************************************/
/**************************************************************************/
Expand DownExpand Up@@ -75,6 +76,43 @@ UINT _lx_nand_flash_block_allocate(LX_NAND_FLASH* nand_flash, ULONG* block)
if (nand_flash -> lx_nand_flash_free_block_list_tail == 0)
{

#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
{

ULONG lg;
UINT compact_status;

/* Emergency compaction: find any pending compaction and execute it to
reclaim the old full block. */
for (lg = 0; lg < nand_flash -> lx_nand_flash_total_blocks; lg++)
{

if (nand_flash -> lx_nand_flash_block_compaction_table[lg] != (USHORT)LX_NAND_BLOCK_UNMAPPED)
{

compact_status = _lx_nand_flash_logical_group_compact(nand_flash, lg);

if (compact_status == LX_SUCCESS)
{

/* Retry the allocation after compaction freed a block. */
if (nand_flash -> lx_nand_flash_free_block_list_tail > 0)
{

nand_flash -> lx_nand_flash_free_block_list_tail--;
*block = nand_flash -> lx_nand_flash_block_list[nand_flash -> lx_nand_flash_free_block_list_tail];
return(LX_SUCCESS);
}
}

/* Attempt only one compaction per allocate call. */
break;
}
}

}
#endif /* LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE */

/* Empty list, return error. */
return(LX_NO_BLOCKS);
}
Expand Down
28 changes: 28 additions & 0 deletions common/src/lx_nand_flash_block_data_move.c
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
* SPDX-License-Identifier: MIT
**************************************************************************/

// Some portions generated by Copilot (Sonnet 4.6).

/**************************************************************************/
/**************************************************************************/
Expand DownExpand Up@@ -111,6 +112,33 @@ ULONG block_mapping_index;
return(LX_ERROR);
}

#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
/* If this logical group has a pending compaction source, redirect the
data move to a full logical-group compact to correctly merge data from
both source blocks. */
if (nand_flash -> lx_nand_flash_block_compaction_table[block_mapping_index] != (USHORT)LX_NAND_BLOCK_UNMAPPED)
{

/* Return the pre-allocated new_block to the free list. */
status = _lx_nand_flash_block_status_set(nand_flash, new_block, LX_NAND_BLOCK_STATUS_FREE);

if (status)
{
_lx_nand_flash_system_error(nand_flash, status, new_block, 0);
return(LX_ERROR);
}

_lx_nand_flash_free_block_list_add(nand_flash, new_block);

/* Restore block_mapping_index to the mapped list; mapped_block_list_get
already removed it before this function was called. */
_lx_nand_flash_mapped_block_list_add(nand_flash, block_mapping_index);

/* Perform full compaction merge of both source blocks. */
return(_lx_nand_flash_logical_group_compact(nand_flash, block_mapping_index));
}
#endif /* LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE */

/* Set new block status to allocated for now. */
new_block_status = LX_NAND_BLOCK_STATUS_ALLOCATED;

Expand Down
29 changes: 29 additions & 0 deletions common/src/lx_nand_flash_defragment.c
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
* SPDX-License-Identifier: MIT
**************************************************************************/

// Some portions generated by Copilot (Sonnet 4.6).

/**************************************************************************/
/**************************************************************************/
Expand DownExpand Up@@ -72,10 +73,38 @@
UINT _lx_nand_flash_defragment(LX_NAND_FLASH *nand_flash)
{

#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE

UINT status;
ULONG lg;

/* Compact every logical group that has a deferred compaction pending. */
for (lg = 0; lg < nand_flash -> lx_nand_flash_total_blocks; lg++)
{

if (nand_flash -> lx_nand_flash_block_compaction_table[lg] != (USHORT)LX_NAND_BLOCK_UNMAPPED)
{

status = _lx_nand_flash_logical_group_compact(nand_flash, lg);

/* On error, continue to compact remaining groups. */
if (status)
{
_lx_nand_flash_system_error(nand_flash, status, lg, 0);
}
}
}

return(LX_SUCCESS);

#else

LX_PARAMETER_NOT_USED(nand_flash);

/* Return not supported. */
return(LX_NOT_SUPPORTED);

#endif /* LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE */
}


Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions common/CMakeLists.txt
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,6 +23,7 @@ target_sources(${PROJECT_NAME} PRIVATE
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_format_extended.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_free_block_list_add.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_initialize.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_logical_group_compact.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_mapped_block_list_add.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_mapped_block_list_get.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_mapped_block_list_remove.c
Expand Down
29 changes: 27 additions & 2 deletions common/inc/lx_api.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -149,8 +149,8 @@ typedef unsigned long long ULONG64;
#define AZURE_RTOS_LEVELX
#define LEVELX_MAJOR_VERSION 6
#define LEVELX_MINOR_VERSION 5
#define LEVELX_PATCH_VERSION 0
#define LEVELX_BUILD_VERSION 202601
#define LEVELX_PATCH_VERSION 1
#define LEVELX_BUILD_VERSION 202602
#define LEVELX_HOTFIX_VERSION ' '


Expand DownExpand Up@@ -274,6 +274,17 @@ typedef unsigned long long ULONG64;
#define LX_NAND_FLASH_MAX_METADATA_BLOCKS 4
#endif

/* When LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE is defined, sector releases from full blocks
are deferred when free block count exceeds the threshold below (opt-in, default: off).
Requires pages_per_block <= 4095 (bit 12 is reserved for COMPACTION_PENDING flag). */
/* #define LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE */

#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
#ifndef LX_NAND_FLASH_SECTOR_RELEASE_LAZY_THRESHOLD
#define LX_NAND_FLASH_SECTOR_RELEASE_LAZY_THRESHOLD 10u
#endif
#endif

#ifndef LX_UTILITY_SHORT_SET
#define LX_UTILITY_SHORT_SET(address, value) *((USHORT*)(address)) = (USHORT)(value)
#endif
Expand DownExpand Up@@ -328,6 +339,11 @@ typedef unsigned long long ULONG64;
#define LX_NAND_BLOCK_STATUS_FULL 0x4000u
#define LX_NAND_BLOCK_STATUS_NON_SEQUENTIAL 0x2000u
#define LX_NAND_BLOCK_STATUS_MAPPING_PRESENT 0x1000u
#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
/* Repurpose the otherwise-unused MAPPING_PRESENT bit to signal a block whose compaction
has been deferred. Only valid when pages_per_block <= 4095. */
#define LX_NAND_BLOCK_STATUS_COMPACTION_PENDING LX_NAND_BLOCK_STATUS_MAPPING_PRESENT
#endif
#define LX_NAND_BLOCK_STATUS_PAGE_NUMBER_MASK 0x0FFFu
#define LX_NAND_BLOCK_STATUS_FREE 0xFFFFu
#define LX_NAND_BLOCK_STATUS_BAD 0xFF00u
Expand DownExpand Up@@ -402,6 +418,12 @@ typedef struct LX_NAND_FLASH_STRUCT
USHORT *lx_nand_flash_block_list;
ULONG lx_nand_flash_block_list_size;
ULONG lx_nand_flash_free_block_list_tail;
#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
/* Parallel to block_mapping_table: physical block with pending compaction for a group,
or LX_NAND_BLOCK_UNMAPPED when no compaction is pending. */
USHORT *lx_nand_flash_block_compaction_table;
ULONG lx_nand_flash_block_compaction_table_size;
#endif
ULONG lx_nand_flash_mapped_block_list_head;

ULONG lx_nand_flash_metadata_block_number;
Expand DownExpand Up@@ -771,6 +793,9 @@ UINT _lx_nand_flash_metadata_write(LX_NAND_FLASH *nand_flash, UCHAR* main_buf
VOID _lx_nand_flash_system_error(LX_NAND_FLASH *nand_flash, UINT error_code, ULONG block, ULONG page);
UINT _lx_nand_flash_256byte_ecc_check(UCHAR *page_buffer, UCHAR *ecc_buffer);
UINT _lx_nand_flash_256byte_ecc_compute(UCHAR *page_buffer, UCHAR *ecc_buffer);
#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
UINT _lx_nand_flash_logical_group_compact(LX_NAND_FLASH *nand_flash, ULONG logical_group);
#endif

UINT _lx_nor_flash_block_reclaim(LX_NOR_FLASH *nor_flash);
UINT _lx_nor_flash_driver_block_erase(LX_NOR_FLASH *nor_flash, ULONG block, ULONG erase_count);
Expand Down
38 changes: 38 additions & 0 deletions common/src/lx_nand_flash_block_allocate.c
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
* SPDX-License-Identifier: MIT
**************************************************************************/

// Some portions generated by Copilot (Sonnet 4.6).

/**************************************************************************/
/**************************************************************************/
Expand DownExpand Up@@ -75,6 +76,43 @@ UINT _lx_nand_flash_block_allocate(LX_NAND_FLASH* nand_flash, ULONG* block)
if (nand_flash -> lx_nand_flash_free_block_list_tail == 0)
{

#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
{

ULONG lg;
UINT compact_status;

/* Emergency compaction: find any pending compaction and execute it to
reclaim the old full block. */
for (lg = 0; lg < nand_flash -> lx_nand_flash_total_blocks; lg++)
{

if (nand_flash -> lx_nand_flash_block_compaction_table[lg] != (USHORT)LX_NAND_BLOCK_UNMAPPED)
{

compact_status = _lx_nand_flash_logical_group_compact(nand_flash, lg);

if (compact_status == LX_SUCCESS)
{

/* Retry the allocation after compaction freed a block. */
if (nand_flash -> lx_nand_flash_free_block_list_tail > 0)
{

nand_flash -> lx_nand_flash_free_block_list_tail--;
*block = nand_flash -> lx_nand_flash_block_list[nand_flash -> lx_nand_flash_free_block_list_tail];
return(LX_SUCCESS);
}
}

/* Attempt only one compaction per allocate call. */
break;
}
}

}
#endif /* LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE */

/* Empty list, return error. */
return(LX_NO_BLOCKS);
}
Expand Down
28 changes: 28 additions & 0 deletions common/src/lx_nand_flash_block_data_move.c
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
* SPDX-License-Identifier: MIT
**************************************************************************/

// Some portions generated by Copilot (Sonnet 4.6).

/**************************************************************************/
/**************************************************************************/
Expand DownExpand Up@@ -111,6 +112,33 @@ ULONG block_mapping_index;
return(LX_ERROR);
}

#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
/* If this logical group has a pending compaction source, redirect the
data move to a full logical-group compact to correctly merge data from
both source blocks. */
if (nand_flash -> lx_nand_flash_block_compaction_table[block_mapping_index] != (USHORT)LX_NAND_BLOCK_UNMAPPED)
{

/* Return the pre-allocated new_block to the free list. */
status = _lx_nand_flash_block_status_set(nand_flash, new_block, LX_NAND_BLOCK_STATUS_FREE);

if (status)
{
_lx_nand_flash_system_error(nand_flash, status, new_block, 0);
return(LX_ERROR);
}

_lx_nand_flash_free_block_list_add(nand_flash, new_block);

/* Restore block_mapping_index to the mapped list; mapped_block_list_get
already removed it before this function was called. */
_lx_nand_flash_mapped_block_list_add(nand_flash, block_mapping_index);

/* Perform full compaction merge of both source blocks. */
return(_lx_nand_flash_logical_group_compact(nand_flash, block_mapping_index));
}
#endif /* LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE */

/* Set new block status to allocated for now. */
new_block_status = LX_NAND_BLOCK_STATUS_ALLOCATED;

Expand Down
29 changes: 29 additions & 0 deletions common/src/lx_nand_flash_defragment.c
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
* SPDX-License-Identifier: MIT
**************************************************************************/

// Some portions generated by Copilot (Sonnet 4.6).

/**************************************************************************/
/**************************************************************************/
Expand DownExpand Up@@ -72,10 +73,38 @@
UINT _lx_nand_flash_defragment(LX_NAND_FLASH *nand_flash)
{

#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE

UINT status;
ULONG lg;

/* Compact every logical group that has a deferred compaction pending. */
for (lg = 0; lg < nand_flash -> lx_nand_flash_total_blocks; lg++)
{

if (nand_flash -> lx_nand_flash_block_compaction_table[lg] != (USHORT)LX_NAND_BLOCK_UNMAPPED)
{

status = _lx_nand_flash_logical_group_compact(nand_flash, lg);

/* On error, continue to compact remaining groups. */
if (status)
{
_lx_nand_flash_system_error(nand_flash, status, lg, 0);
}
}
}

return(LX_SUCCESS);

#else

LX_PARAMETER_NOT_USED(nand_flash);

/* Return not supported. */
return(LX_NOT_SUPPORTED);

#endif /* LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE */
}


Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions common/CMakeLists.txt
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,6 +23,7 @@ target_sources(${PROJECT_NAME} PRIVATE
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_format_extended.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_free_block_list_add.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_initialize.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_logical_group_compact.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_mapped_block_list_add.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_mapped_block_list_get.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_mapped_block_list_remove.c
Expand Down
29 changes: 27 additions & 2 deletions common/inc/lx_api.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -149,8 +149,8 @@ typedef unsigned long long ULONG64;
#define AZURE_RTOS_LEVELX
#define LEVELX_MAJOR_VERSION 6
#define LEVELX_MINOR_VERSION 5
#define LEVELX_PATCH_VERSION 0
#define LEVELX_BUILD_VERSION 202601
#define LEVELX_PATCH_VERSION 1
#define LEVELX_BUILD_VERSION 202602
#define LEVELX_HOTFIX_VERSION ' '


Expand DownExpand Up@@ -274,6 +274,17 @@ typedef unsigned long long ULONG64;
#define LX_NAND_FLASH_MAX_METADATA_BLOCKS 4
#endif

/* When LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE is defined, sector releases from full blocks
are deferred when free block count exceeds the threshold below (opt-in, default: off).
Requires pages_per_block <= 4095 (bit 12 is reserved for COMPACTION_PENDING flag). */
/* #define LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE */

#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
#ifndef LX_NAND_FLASH_SECTOR_RELEASE_LAZY_THRESHOLD
#define LX_NAND_FLASH_SECTOR_RELEASE_LAZY_THRESHOLD 10u
#endif
#endif

#ifndef LX_UTILITY_SHORT_SET
#define LX_UTILITY_SHORT_SET(address, value) *((USHORT*)(address)) = (USHORT)(value)
#endif
Expand DownExpand Up@@ -328,6 +339,11 @@ typedef unsigned long long ULONG64;
#define LX_NAND_BLOCK_STATUS_FULL 0x4000u
#define LX_NAND_BLOCK_STATUS_NON_SEQUENTIAL 0x2000u
#define LX_NAND_BLOCK_STATUS_MAPPING_PRESENT 0x1000u
#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
/* Repurpose the otherwise-unused MAPPING_PRESENT bit to signal a block whose compaction
has been deferred. Only valid when pages_per_block <= 4095. */
#define LX_NAND_BLOCK_STATUS_COMPACTION_PENDING LX_NAND_BLOCK_STATUS_MAPPING_PRESENT
#endif
#define LX_NAND_BLOCK_STATUS_PAGE_NUMBER_MASK 0x0FFFu
#define LX_NAND_BLOCK_STATUS_FREE 0xFFFFu
#define LX_NAND_BLOCK_STATUS_BAD 0xFF00u
Expand DownExpand Up@@ -402,6 +418,12 @@ typedef struct LX_NAND_FLASH_STRUCT
USHORT *lx_nand_flash_block_list;
ULONG lx_nand_flash_block_list_size;
ULONG lx_nand_flash_free_block_list_tail;
#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
/* Parallel to block_mapping_table: physical block with pending compaction for a group,
or LX_NAND_BLOCK_UNMAPPED when no compaction is pending. */
USHORT *lx_nand_flash_block_compaction_table;
ULONG lx_nand_flash_block_compaction_table_size;
#endif
ULONG lx_nand_flash_mapped_block_list_head;

ULONG lx_nand_flash_metadata_block_number;
Expand DownExpand Up@@ -771,6 +793,9 @@ UINT _lx_nand_flash_metadata_write(LX_NAND_FLASH *nand_flash, UCHAR* main_buf
VOID _lx_nand_flash_system_error(LX_NAND_FLASH *nand_flash, UINT error_code, ULONG block, ULONG page);
UINT _lx_nand_flash_256byte_ecc_check(UCHAR *page_buffer, UCHAR *ecc_buffer);
UINT _lx_nand_flash_256byte_ecc_compute(UCHAR *page_buffer, UCHAR *ecc_buffer);
#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
UINT _lx_nand_flash_logical_group_compact(LX_NAND_FLASH *nand_flash, ULONG logical_group);
#endif

UINT _lx_nor_flash_block_reclaim(LX_NOR_FLASH *nor_flash);
UINT _lx_nor_flash_driver_block_erase(LX_NOR_FLASH *nor_flash, ULONG block, ULONG erase_count);
Expand Down
38 changes: 38 additions & 0 deletions common/src/lx_nand_flash_block_allocate.c
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
* SPDX-License-Identifier: MIT
**************************************************************************/

// Some portions generated by Copilot (Sonnet 4.6).

/**************************************************************************/
/**************************************************************************/
Expand DownExpand Up@@ -75,6 +76,43 @@ UINT _lx_nand_flash_block_allocate(LX_NAND_FLASH* nand_flash, ULONG* block)
if (nand_flash -> lx_nand_flash_free_block_list_tail == 0)
{

#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
{

ULONG lg;
UINT compact_status;

/* Emergency compaction: find any pending compaction and execute it to
reclaim the old full block. */
for (lg = 0; lg < nand_flash -> lx_nand_flash_total_blocks; lg++)
{

if (nand_flash -> lx_nand_flash_block_compaction_table[lg] != (USHORT)LX_NAND_BLOCK_UNMAPPED)
{

compact_status = _lx_nand_flash_logical_group_compact(nand_flash, lg);

if (compact_status == LX_SUCCESS)
{

/* Retry the allocation after compaction freed a block. */
if (nand_flash -> lx_nand_flash_free_block_list_tail > 0)
{

nand_flash -> lx_nand_flash_free_block_list_tail--;
*block = nand_flash -> lx_nand_flash_block_list[nand_flash -> lx_nand_flash_free_block_list_tail];
return(LX_SUCCESS);
}
}

/* Attempt only one compaction per allocate call. */
break;
}
}

}
#endif /* LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE */

/* Empty list, return error. */
return(LX_NO_BLOCKS);
}
Expand Down
28 changes: 28 additions & 0 deletions common/src/lx_nand_flash_block_data_move.c
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
* SPDX-License-Identifier: MIT
**************************************************************************/

// Some portions generated by Copilot (Sonnet 4.6).

/**************************************************************************/
/**************************************************************************/
Expand DownExpand Up@@ -111,6 +112,33 @@ ULONG block_mapping_index;
return(LX_ERROR);
}

#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
/* If this logical group has a pending compaction source, redirect the
data move to a full logical-group compact to correctly merge data from
both source blocks. */
if (nand_flash -> lx_nand_flash_block_compaction_table[block_mapping_index] != (USHORT)LX_NAND_BLOCK_UNMAPPED)
{

/* Return the pre-allocated new_block to the free list. */
status = _lx_nand_flash_block_status_set(nand_flash, new_block, LX_NAND_BLOCK_STATUS_FREE);

if (status)
{
_lx_nand_flash_system_error(nand_flash, status, new_block, 0);
return(LX_ERROR);
}

_lx_nand_flash_free_block_list_add(nand_flash, new_block);

/* Restore block_mapping_index to the mapped list; mapped_block_list_get
already removed it before this function was called. */
_lx_nand_flash_mapped_block_list_add(nand_flash, block_mapping_index);

/* Perform full compaction merge of both source blocks. */
return(_lx_nand_flash_logical_group_compact(nand_flash, block_mapping_index));
}
#endif /* LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE */

/* Set new block status to allocated for now. */
new_block_status = LX_NAND_BLOCK_STATUS_ALLOCATED;

Expand Down
29 changes: 29 additions & 0 deletions common/src/lx_nand_flash_defragment.c
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
* SPDX-License-Identifier: MIT
**************************************************************************/

// Some portions generated by Copilot (Sonnet 4.6).

/**************************************************************************/
/**************************************************************************/
Expand DownExpand Up@@ -72,10 +73,38 @@
UINT _lx_nand_flash_defragment(LX_NAND_FLASH *nand_flash)
{

#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE

UINT status;
ULONG lg;

/* Compact every logical group that has a deferred compaction pending. */
for (lg = 0; lg < nand_flash -> lx_nand_flash_total_blocks; lg++)
{

if (nand_flash -> lx_nand_flash_block_compaction_table[lg] != (USHORT)LX_NAND_BLOCK_UNMAPPED)
{

status = _lx_nand_flash_logical_group_compact(nand_flash, lg);

/* On error, continue to compact remaining groups. */
if (status)
{
_lx_nand_flash_system_error(nand_flash, status, lg, 0);
}
}
}

return(LX_SUCCESS);

#else

LX_PARAMETER_NOT_USED(nand_flash);

/* Return not supported. */
return(LX_NOT_SUPPORTED);

#endif /* LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE */
}


Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions common/CMakeLists.txt
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,6 +23,7 @@ target_sources(${PROJECT_NAME} PRIVATE
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_format_extended.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_free_block_list_add.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_initialize.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_logical_group_compact.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_mapped_block_list_add.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_mapped_block_list_get.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_mapped_block_list_remove.c
Expand Down
29 changes: 27 additions & 2 deletions common/inc/lx_api.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -149,8 +149,8 @@ typedef unsigned long long ULONG64;
#define AZURE_RTOS_LEVELX
#define LEVELX_MAJOR_VERSION 6
#define LEVELX_MINOR_VERSION 5
#define LEVELX_PATCH_VERSION 0
#define LEVELX_BUILD_VERSION 202601
#define LEVELX_PATCH_VERSION 1
#define LEVELX_BUILD_VERSION 202602
#define LEVELX_HOTFIX_VERSION ' '


Expand DownExpand Up@@ -274,6 +274,17 @@ typedef unsigned long long ULONG64;
#define LX_NAND_FLASH_MAX_METADATA_BLOCKS 4
#endif

/* When LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE is defined, sector releases from full blocks
are deferred when free block count exceeds the threshold below (opt-in, default: off).
Requires pages_per_block <= 4095 (bit 12 is reserved for COMPACTION_PENDING flag). */
/* #define LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE */

#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
#ifndef LX_NAND_FLASH_SECTOR_RELEASE_LAZY_THRESHOLD
#define LX_NAND_FLASH_SECTOR_RELEASE_LAZY_THRESHOLD 10u
#endif
#endif

#ifndef LX_UTILITY_SHORT_SET
#define LX_UTILITY_SHORT_SET(address, value) *((USHORT*)(address)) = (USHORT)(value)
#endif
Expand DownExpand Up@@ -328,6 +339,11 @@ typedef unsigned long long ULONG64;
#define LX_NAND_BLOCK_STATUS_FULL 0x4000u
#define LX_NAND_BLOCK_STATUS_NON_SEQUENTIAL 0x2000u
#define LX_NAND_BLOCK_STATUS_MAPPING_PRESENT 0x1000u
#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
/* Repurpose the otherwise-unused MAPPING_PRESENT bit to signal a block whose compaction
has been deferred. Only valid when pages_per_block <= 4095. */
#define LX_NAND_BLOCK_STATUS_COMPACTION_PENDING LX_NAND_BLOCK_STATUS_MAPPING_PRESENT
#endif
#define LX_NAND_BLOCK_STATUS_PAGE_NUMBER_MASK 0x0FFFu
#define LX_NAND_BLOCK_STATUS_FREE 0xFFFFu
#define LX_NAND_BLOCK_STATUS_BAD 0xFF00u
Expand DownExpand Up@@ -402,6 +418,12 @@ typedef struct LX_NAND_FLASH_STRUCT
USHORT *lx_nand_flash_block_list;
ULONG lx_nand_flash_block_list_size;
ULONG lx_nand_flash_free_block_list_tail;
#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
/* Parallel to block_mapping_table: physical block with pending compaction for a group,
or LX_NAND_BLOCK_UNMAPPED when no compaction is pending. */
USHORT *lx_nand_flash_block_compaction_table;
ULONG lx_nand_flash_block_compaction_table_size;
#endif
ULONG lx_nand_flash_mapped_block_list_head;

ULONG lx_nand_flash_metadata_block_number;
Expand DownExpand Up@@ -771,6 +793,9 @@ UINT _lx_nand_flash_metadata_write(LX_NAND_FLASH *nand_flash, UCHAR* main_buf
VOID _lx_nand_flash_system_error(LX_NAND_FLASH *nand_flash, UINT error_code, ULONG block, ULONG page);
UINT _lx_nand_flash_256byte_ecc_check(UCHAR *page_buffer, UCHAR *ecc_buffer);
UINT _lx_nand_flash_256byte_ecc_compute(UCHAR *page_buffer, UCHAR *ecc_buffer);
#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
UINT _lx_nand_flash_logical_group_compact(LX_NAND_FLASH *nand_flash, ULONG logical_group);
#endif

UINT _lx_nor_flash_block_reclaim(LX_NOR_FLASH *nor_flash);
UINT _lx_nor_flash_driver_block_erase(LX_NOR_FLASH *nor_flash, ULONG block, ULONG erase_count);
Expand Down
38 changes: 38 additions & 0 deletions common/src/lx_nand_flash_block_allocate.c
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
* SPDX-License-Identifier: MIT
**************************************************************************/

// Some portions generated by Copilot (Sonnet 4.6).

/**************************************************************************/
/**************************************************************************/
Expand DownExpand Up@@ -75,6 +76,43 @@ UINT _lx_nand_flash_block_allocate(LX_NAND_FLASH* nand_flash, ULONG* block)
if (nand_flash -> lx_nand_flash_free_block_list_tail == 0)
{

#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
{

ULONG lg;
UINT compact_status;

/* Emergency compaction: find any pending compaction and execute it to
reclaim the old full block. */
for (lg = 0; lg < nand_flash -> lx_nand_flash_total_blocks; lg++)
{

if (nand_flash -> lx_nand_flash_block_compaction_table[lg] != (USHORT)LX_NAND_BLOCK_UNMAPPED)
{

compact_status = _lx_nand_flash_logical_group_compact(nand_flash, lg);

if (compact_status == LX_SUCCESS)
{

/* Retry the allocation after compaction freed a block. */
if (nand_flash -> lx_nand_flash_free_block_list_tail > 0)
{

nand_flash -> lx_nand_flash_free_block_list_tail--;
*block = nand_flash -> lx_nand_flash_block_list[nand_flash -> lx_nand_flash_free_block_list_tail];
return(LX_SUCCESS);
}
}

/* Attempt only one compaction per allocate call. */
break;
}
}

}
#endif /* LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE */

/* Empty list, return error. */
return(LX_NO_BLOCKS);
}
Expand Down
28 changes: 28 additions & 0 deletions common/src/lx_nand_flash_block_data_move.c
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
* SPDX-License-Identifier: MIT
**************************************************************************/

// Some portions generated by Copilot (Sonnet 4.6).

/**************************************************************************/
/**************************************************************************/
Expand DownExpand Up@@ -111,6 +112,33 @@ ULONG block_mapping_index;
return(LX_ERROR);
}

#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
/* If this logical group has a pending compaction source, redirect the
data move to a full logical-group compact to correctly merge data from
both source blocks. */
if (nand_flash -> lx_nand_flash_block_compaction_table[block_mapping_index] != (USHORT)LX_NAND_BLOCK_UNMAPPED)
{

/* Return the pre-allocated new_block to the free list. */
status = _lx_nand_flash_block_status_set(nand_flash, new_block, LX_NAND_BLOCK_STATUS_FREE);

if (status)
{
_lx_nand_flash_system_error(nand_flash, status, new_block, 0);
return(LX_ERROR);
}

_lx_nand_flash_free_block_list_add(nand_flash, new_block);

/* Restore block_mapping_index to the mapped list; mapped_block_list_get
already removed it before this function was called. */
_lx_nand_flash_mapped_block_list_add(nand_flash, block_mapping_index);

/* Perform full compaction merge of both source blocks. */
return(_lx_nand_flash_logical_group_compact(nand_flash, block_mapping_index));
}
#endif /* LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE */

/* Set new block status to allocated for now. */
new_block_status = LX_NAND_BLOCK_STATUS_ALLOCATED;

Expand Down
29 changes: 29 additions & 0 deletions common/src/lx_nand_flash_defragment.c
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
* SPDX-License-Identifier: MIT
**************************************************************************/

// Some portions generated by Copilot (Sonnet 4.6).

/**************************************************************************/
/**************************************************************************/
Expand DownExpand Up@@ -72,10 +73,38 @@
UINT _lx_nand_flash_defragment(LX_NAND_FLASH *nand_flash)
{

#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE

UINT status;
ULONG lg;

/* Compact every logical group that has a deferred compaction pending. */
for (lg = 0; lg < nand_flash -> lx_nand_flash_total_blocks; lg++)
{

if (nand_flash -> lx_nand_flash_block_compaction_table[lg] != (USHORT)LX_NAND_BLOCK_UNMAPPED)
{

status = _lx_nand_flash_logical_group_compact(nand_flash, lg);

/* On error, continue to compact remaining groups. */
if (status)
{
_lx_nand_flash_system_error(nand_flash, status, lg, 0);
}
}
}

return(LX_SUCCESS);

#else

LX_PARAMETER_NOT_USED(nand_flash);

/* Return not supported. */
return(LX_NOT_SUPPORTED);

#endif /* LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE */
}


Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions common/CMakeLists.txt
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,6 +23,7 @@ target_sources(${PROJECT_NAME} PRIVATE
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_format_extended.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_free_block_list_add.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_initialize.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_logical_group_compact.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_mapped_block_list_add.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_mapped_block_list_get.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_mapped_block_list_remove.c
Expand Down
29 changes: 27 additions & 2 deletions common/inc/lx_api.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -149,8 +149,8 @@ typedef unsigned long long ULONG64;
#define AZURE_RTOS_LEVELX
#define LEVELX_MAJOR_VERSION 6
#define LEVELX_MINOR_VERSION 5
#define LEVELX_PATCH_VERSION 0
#define LEVELX_BUILD_VERSION 202601
#define LEVELX_PATCH_VERSION 1
#define LEVELX_BUILD_VERSION 202602
#define LEVELX_HOTFIX_VERSION ' '


Expand DownExpand Up@@ -274,6 +274,17 @@ typedef unsigned long long ULONG64;
#define LX_NAND_FLASH_MAX_METADATA_BLOCKS 4
#endif

/* When LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE is defined, sector releases from full blocks
are deferred when free block count exceeds the threshold below (opt-in, default: off).
Requires pages_per_block <= 4095 (bit 12 is reserved for COMPACTION_PENDING flag). */
/* #define LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE */

#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
#ifndef LX_NAND_FLASH_SECTOR_RELEASE_LAZY_THRESHOLD
#define LX_NAND_FLASH_SECTOR_RELEASE_LAZY_THRESHOLD 10u
#endif
#endif

#ifndef LX_UTILITY_SHORT_SET
#define LX_UTILITY_SHORT_SET(address, value) *((USHORT*)(address)) = (USHORT)(value)
#endif
Expand DownExpand Up@@ -328,6 +339,11 @@ typedef unsigned long long ULONG64;
#define LX_NAND_BLOCK_STATUS_FULL 0x4000u
#define LX_NAND_BLOCK_STATUS_NON_SEQUENTIAL 0x2000u
#define LX_NAND_BLOCK_STATUS_MAPPING_PRESENT 0x1000u
#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
/* Repurpose the otherwise-unused MAPPING_PRESENT bit to signal a block whose compaction
has been deferred. Only valid when pages_per_block <= 4095. */
#define LX_NAND_BLOCK_STATUS_COMPACTION_PENDING LX_NAND_BLOCK_STATUS_MAPPING_PRESENT
#endif
#define LX_NAND_BLOCK_STATUS_PAGE_NUMBER_MASK 0x0FFFu
#define LX_NAND_BLOCK_STATUS_FREE 0xFFFFu
#define LX_NAND_BLOCK_STATUS_BAD 0xFF00u
Expand DownExpand Up@@ -402,6 +418,12 @@ typedef struct LX_NAND_FLASH_STRUCT
USHORT *lx_nand_flash_block_list;
ULONG lx_nand_flash_block_list_size;
ULONG lx_nand_flash_free_block_list_tail;
#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
/* Parallel to block_mapping_table: physical block with pending compaction for a group,
or LX_NAND_BLOCK_UNMAPPED when no compaction is pending. */
USHORT *lx_nand_flash_block_compaction_table;
ULONG lx_nand_flash_block_compaction_table_size;
#endif
ULONG lx_nand_flash_mapped_block_list_head;

ULONG lx_nand_flash_metadata_block_number;
Expand DownExpand Up@@ -771,6 +793,9 @@ UINT _lx_nand_flash_metadata_write(LX_NAND_FLASH *nand_flash, UCHAR* main_buf
VOID _lx_nand_flash_system_error(LX_NAND_FLASH *nand_flash, UINT error_code, ULONG block, ULONG page);
UINT _lx_nand_flash_256byte_ecc_check(UCHAR *page_buffer, UCHAR *ecc_buffer);
UINT _lx_nand_flash_256byte_ecc_compute(UCHAR *page_buffer, UCHAR *ecc_buffer);
#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
UINT _lx_nand_flash_logical_group_compact(LX_NAND_FLASH *nand_flash, ULONG logical_group);
#endif

UINT _lx_nor_flash_block_reclaim(LX_NOR_FLASH *nor_flash);
UINT _lx_nor_flash_driver_block_erase(LX_NOR_FLASH *nor_flash, ULONG block, ULONG erase_count);
Expand Down
38 changes: 38 additions & 0 deletions common/src/lx_nand_flash_block_allocate.c
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
* SPDX-License-Identifier: MIT
**************************************************************************/

// Some portions generated by Copilot (Sonnet 4.6).

/**************************************************************************/
/**************************************************************************/
Expand DownExpand Up@@ -75,6 +76,43 @@ UINT _lx_nand_flash_block_allocate(LX_NAND_FLASH* nand_flash, ULONG* block)
if (nand_flash -> lx_nand_flash_free_block_list_tail == 0)
{

#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
{

ULONG lg;
UINT compact_status;

/* Emergency compaction: find any pending compaction and execute it to
reclaim the old full block. */
for (lg = 0; lg < nand_flash -> lx_nand_flash_total_blocks; lg++)
{

if (nand_flash -> lx_nand_flash_block_compaction_table[lg] != (USHORT)LX_NAND_BLOCK_UNMAPPED)
{

compact_status = _lx_nand_flash_logical_group_compact(nand_flash, lg);

if (compact_status == LX_SUCCESS)
{

/* Retry the allocation after compaction freed a block. */
if (nand_flash -> lx_nand_flash_free_block_list_tail > 0)
{

nand_flash -> lx_nand_flash_free_block_list_tail--;
*block = nand_flash -> lx_nand_flash_block_list[nand_flash -> lx_nand_flash_free_block_list_tail];
return(LX_SUCCESS);
}
}

/* Attempt only one compaction per allocate call. */
break;
}
}

}
#endif /* LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE */

/* Empty list, return error. */
return(LX_NO_BLOCKS);
}
Expand Down
28 changes: 28 additions & 0 deletions common/src/lx_nand_flash_block_data_move.c
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
* SPDX-License-Identifier: MIT
**************************************************************************/

// Some portions generated by Copilot (Sonnet 4.6).

/**************************************************************************/
/**************************************************************************/
Expand DownExpand Up@@ -111,6 +112,33 @@ ULONG block_mapping_index;
return(LX_ERROR);
}

#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
/* If this logical group has a pending compaction source, redirect the
data move to a full logical-group compact to correctly merge data from
both source blocks. */
if (nand_flash -> lx_nand_flash_block_compaction_table[block_mapping_index] != (USHORT)LX_NAND_BLOCK_UNMAPPED)
{

/* Return the pre-allocated new_block to the free list. */
status = _lx_nand_flash_block_status_set(nand_flash, new_block, LX_NAND_BLOCK_STATUS_FREE);

if (status)
{
_lx_nand_flash_system_error(nand_flash, status, new_block, 0);
return(LX_ERROR);
}

_lx_nand_flash_free_block_list_add(nand_flash, new_block);

/* Restore block_mapping_index to the mapped list; mapped_block_list_get
already removed it before this function was called. */
_lx_nand_flash_mapped_block_list_add(nand_flash, block_mapping_index);

/* Perform full compaction merge of both source blocks. */
return(_lx_nand_flash_logical_group_compact(nand_flash, block_mapping_index));
}
#endif /* LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE */

/* Set new block status to allocated for now. */
new_block_status = LX_NAND_BLOCK_STATUS_ALLOCATED;

Expand Down
29 changes: 29 additions & 0 deletions common/src/lx_nand_flash_defragment.c
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
* SPDX-License-Identifier: MIT
**************************************************************************/

// Some portions generated by Copilot (Sonnet 4.6).

/**************************************************************************/
/**************************************************************************/
Expand DownExpand Up@@ -72,10 +73,38 @@
UINT _lx_nand_flash_defragment(LX_NAND_FLASH *nand_flash)
{

#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE

UINT status;
ULONG lg;

/* Compact every logical group that has a deferred compaction pending. */
for (lg = 0; lg < nand_flash -> lx_nand_flash_total_blocks; lg++)
{

if (nand_flash -> lx_nand_flash_block_compaction_table[lg] != (USHORT)LX_NAND_BLOCK_UNMAPPED)
{

status = _lx_nand_flash_logical_group_compact(nand_flash, lg);

/* On error, continue to compact remaining groups. */
if (status)
{
_lx_nand_flash_system_error(nand_flash, status, lg, 0);
}
}
}

return(LX_SUCCESS);

#else

LX_PARAMETER_NOT_USED(nand_flash);

/* Return not supported. */
return(LX_NOT_SUPPORTED);

#endif /* LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE */
}


Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions common/CMakeLists.txt
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,6 +23,7 @@ target_sources(${PROJECT_NAME} PRIVATE
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_format_extended.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_free_block_list_add.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_initialize.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_logical_group_compact.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_mapped_block_list_add.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_mapped_block_list_get.c
${CMAKE_CURRENT_LIST_DIR}/src/lx_nand_flash_mapped_block_list_remove.c
Expand Down
29 changes: 27 additions & 2 deletions common/inc/lx_api.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -149,8 +149,8 @@ typedef unsigned long long ULONG64;
#define AZURE_RTOS_LEVELX
#define LEVELX_MAJOR_VERSION 6
#define LEVELX_MINOR_VERSION 5
#define LEVELX_PATCH_VERSION 0
#define LEVELX_BUILD_VERSION 202601
#define LEVELX_PATCH_VERSION 1
#define LEVELX_BUILD_VERSION 202602
#define LEVELX_HOTFIX_VERSION ' '


Expand DownExpand Up@@ -274,6 +274,17 @@ typedef unsigned long long ULONG64;
#define LX_NAND_FLASH_MAX_METADATA_BLOCKS 4
#endif

/* When LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE is defined, sector releases from full blocks
are deferred when free block count exceeds the threshold below (opt-in, default: off).
Requires pages_per_block <= 4095 (bit 12 is reserved for COMPACTION_PENDING flag). */
/* #define LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE */

#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
#ifndef LX_NAND_FLASH_SECTOR_RELEASE_LAZY_THRESHOLD
#define LX_NAND_FLASH_SECTOR_RELEASE_LAZY_THRESHOLD 10u
#endif
#endif

#ifndef LX_UTILITY_SHORT_SET
#define LX_UTILITY_SHORT_SET(address, value) *((USHORT*)(address)) = (USHORT)(value)
#endif
Expand DownExpand Up@@ -328,6 +339,11 @@ typedef unsigned long long ULONG64;
#define LX_NAND_BLOCK_STATUS_FULL 0x4000u
#define LX_NAND_BLOCK_STATUS_NON_SEQUENTIAL 0x2000u
#define LX_NAND_BLOCK_STATUS_MAPPING_PRESENT 0x1000u
#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
/* Repurpose the otherwise-unused MAPPING_PRESENT bit to signal a block whose compaction
has been deferred. Only valid when pages_per_block <= 4095. */
#define LX_NAND_BLOCK_STATUS_COMPACTION_PENDING LX_NAND_BLOCK_STATUS_MAPPING_PRESENT
#endif
#define LX_NAND_BLOCK_STATUS_PAGE_NUMBER_MASK 0x0FFFu
#define LX_NAND_BLOCK_STATUS_FREE 0xFFFFu
#define LX_NAND_BLOCK_STATUS_BAD 0xFF00u
Expand DownExpand Up@@ -402,6 +418,12 @@ typedef struct LX_NAND_FLASH_STRUCT
USHORT *lx_nand_flash_block_list;
ULONG lx_nand_flash_block_list_size;
ULONG lx_nand_flash_free_block_list_tail;
#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
/* Parallel to block_mapping_table: physical block with pending compaction for a group,
or LX_NAND_BLOCK_UNMAPPED when no compaction is pending. */
USHORT *lx_nand_flash_block_compaction_table;
ULONG lx_nand_flash_block_compaction_table_size;
#endif
ULONG lx_nand_flash_mapped_block_list_head;

ULONG lx_nand_flash_metadata_block_number;
Expand DownExpand Up@@ -771,6 +793,9 @@ UINT _lx_nand_flash_metadata_write(LX_NAND_FLASH *nand_flash, UCHAR* main_buf
VOID _lx_nand_flash_system_error(LX_NAND_FLASH *nand_flash, UINT error_code, ULONG block, ULONG page);
UINT _lx_nand_flash_256byte_ecc_check(UCHAR *page_buffer, UCHAR *ecc_buffer);
UINT _lx_nand_flash_256byte_ecc_compute(UCHAR *page_buffer, UCHAR *ecc_buffer);
#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
UINT _lx_nand_flash_logical_group_compact(LX_NAND_FLASH *nand_flash, ULONG logical_group);
#endif

UINT _lx_nor_flash_block_reclaim(LX_NOR_FLASH *nor_flash);
UINT _lx_nor_flash_driver_block_erase(LX_NOR_FLASH *nor_flash, ULONG block, ULONG erase_count);
Expand Down
38 changes: 38 additions & 0 deletions common/src/lx_nand_flash_block_allocate.c
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
* SPDX-License-Identifier: MIT
**************************************************************************/

// Some portions generated by Copilot (Sonnet 4.6).

/**************************************************************************/
/**************************************************************************/
Expand DownExpand Up@@ -75,6 +76,43 @@ UINT _lx_nand_flash_block_allocate(LX_NAND_FLASH* nand_flash, ULONG* block)
if (nand_flash -> lx_nand_flash_free_block_list_tail == 0)
{

#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
{

ULONG lg;
UINT compact_status;

/* Emergency compaction: find any pending compaction and execute it to
reclaim the old full block. */
for (lg = 0; lg < nand_flash -> lx_nand_flash_total_blocks; lg++)
{

if (nand_flash -> lx_nand_flash_block_compaction_table[lg] != (USHORT)LX_NAND_BLOCK_UNMAPPED)
{

compact_status = _lx_nand_flash_logical_group_compact(nand_flash, lg);

if (compact_status == LX_SUCCESS)
{

/* Retry the allocation after compaction freed a block. */
if (nand_flash -> lx_nand_flash_free_block_list_tail > 0)
{

nand_flash -> lx_nand_flash_free_block_list_tail--;
*block = nand_flash -> lx_nand_flash_block_list[nand_flash -> lx_nand_flash_free_block_list_tail];
return(LX_SUCCESS);
}
}

/* Attempt only one compaction per allocate call. */
break;
}
}

}
#endif /* LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE */

/* Empty list, return error. */
return(LX_NO_BLOCKS);
}
Expand Down
28 changes: 28 additions & 0 deletions common/src/lx_nand_flash_block_data_move.c
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
* SPDX-License-Identifier: MIT
**************************************************************************/

// Some portions generated by Copilot (Sonnet 4.6).

/**************************************************************************/
/**************************************************************************/
Expand DownExpand Up@@ -111,6 +112,33 @@ ULONG block_mapping_index;
return(LX_ERROR);
}

#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE
/* If this logical group has a pending compaction source, redirect the
data move to a full logical-group compact to correctly merge data from
both source blocks. */
if (nand_flash -> lx_nand_flash_block_compaction_table[block_mapping_index] != (USHORT)LX_NAND_BLOCK_UNMAPPED)
{

/* Return the pre-allocated new_block to the free list. */
status = _lx_nand_flash_block_status_set(nand_flash, new_block, LX_NAND_BLOCK_STATUS_FREE);

if (status)
{
_lx_nand_flash_system_error(nand_flash, status, new_block, 0);
return(LX_ERROR);
}

_lx_nand_flash_free_block_list_add(nand_flash, new_block);

/* Restore block_mapping_index to the mapped list; mapped_block_list_get
already removed it before this function was called. */
_lx_nand_flash_mapped_block_list_add(nand_flash, block_mapping_index);

/* Perform full compaction merge of both source blocks. */
return(_lx_nand_flash_logical_group_compact(nand_flash, block_mapping_index));
}
#endif /* LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE */

/* Set new block status to allocated for now. */
new_block_status = LX_NAND_BLOCK_STATUS_ALLOCATED;

Expand Down
29 changes: 29 additions & 0 deletions common/src/lx_nand_flash_defragment.c
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
* SPDX-License-Identifier: MIT
**************************************************************************/

// Some portions generated by Copilot (Sonnet 4.6).

/**************************************************************************/
/**************************************************************************/
Expand DownExpand Up@@ -72,10 +73,38 @@
UINT _lx_nand_flash_defragment(LX_NAND_FLASH *nand_flash)
{

#ifdef LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE

UINT status;
ULONG lg;

/* Compact every logical group that has a deferred compaction pending. */
for (lg = 0; lg < nand_flash -> lx_nand_flash_total_blocks; lg++)
{

if (nand_flash -> lx_nand_flash_block_compaction_table[lg] != (USHORT)LX_NAND_BLOCK_UNMAPPED)
{

status = _lx_nand_flash_logical_group_compact(nand_flash, lg);

/* On error, continue to compact remaining groups. */
if (status)
{
_lx_nand_flash_system_error(nand_flash, status, lg, 0);
}
}
}

return(LX_SUCCESS);

#else

LX_PARAMETER_NOT_USED(nand_flash);

/* Return not supported. */
return(LX_NOT_SUPPORTED);

#endif /* LX_NAND_FLASH_ENABLE_LAZY_SECTOR_RELEASE */
}


Loading
Loading