Lines Matching +full:fixed +full:- +full:layout
1 // SPDX-License-Identifier: MIT
16 * DOC: Write Once Protected Content Memory (WOPCM) Layout
18 * The layout of the WOPCM will be fixed after writing to GuC WOPCM size and
32 * | Size +--------------------+
34 * | | +--------------------+
36 * | | +------------------- +
40 * | +------------------- + <== HuC Firmware Top
94 size = wopcm_size - ctx_rsvd; in __check_layout()
96 guc_wopcm_size > size - guc_wopcm_base)) { in __check_layout()
97 drm_err(&xe->drm, in __check_layout()
98 "WOPCM: invalid GuC region layout: %uK + %uK > %uK\n", in __check_layout()
106 drm_err(&xe->drm, "WOPCM: no space for %s: %uK < %uK\n", in __check_layout()
114 drm_err(&xe->drm, "WOPCM: no space for %s: %uK < %uK\n", in __check_layout()
141 u32 base = wopcm->guc.base; in __wopcm_init_regs()
142 u32 size = wopcm->guc.size; in __wopcm_init_regs()
143 u32 huc_agent = xe_uc_fw_is_available(>->uc.huc.fw) ? HUC_LOADING_AGENT_GUC : 0; in __wopcm_init_regs()
169 drm_notice(&xe->drm, "Failed to init uC WOPCM registers!\n"); in __wopcm_init_regs()
170 drm_notice(&xe->drm, "%s(%#x)=%#x\n", "DMA_GUC_WOPCM_OFFSET", in __wopcm_init_regs()
173 drm_notice(&xe->drm, "%s(%#x)=%#x\n", "GUC_WOPCM_SIZE", in __wopcm_init_regs()
183 xe->info.platform == XE_METEORLAKE ? MTL_WOPCM_SIZE : in xe_wopcm_size()
188 * xe_wopcm_init() - Initialize the WOPCM structure.
201 u32 guc_fw_size = xe_uc_fw_get_upload_size(>->uc.guc.fw); in xe_wopcm_init()
202 u32 huc_fw_size = xe_uc_fw_get_upload_size(>->uc.huc.fw); in xe_wopcm_init()
210 return -EINVAL; in xe_wopcm_init()
212 wopcm->size = xe_wopcm_size(xe); in xe_wopcm_init()
213 drm_dbg(&xe->drm, "WOPCM: %uK\n", wopcm->size / SZ_1K); in xe_wopcm_init()
216 XE_WARN_ON(guc_fw_size >= wopcm->size); in xe_wopcm_init()
217 XE_WARN_ON(huc_fw_size >= wopcm->size); in xe_wopcm_init()
218 XE_WARN_ON(ctx_rsvd + WOPCM_RESERVED_SIZE >= wopcm->size); in xe_wopcm_init()
222 drm_dbg(&xe->drm, "GuC WOPCM is already locked [%uK, %uK)\n", in xe_wopcm_init()
227 * validate if the programmed values align to the wopcm layout. in xe_wopcm_init()
229 wopcm->size = MAX_WOPCM_SIZE; in xe_wopcm_init()
243 * correct. Formal check of whole WOPCM layout will be done below. in xe_wopcm_init()
245 guc_wopcm_base = min(guc_wopcm_base, wopcm->size - ctx_rsvd); in xe_wopcm_init()
248 guc_wopcm_size = wopcm->size - ctx_rsvd - guc_wopcm_base; in xe_wopcm_init()
251 drm_dbg(&xe->drm, "Calculated GuC WOPCM [%uK, %uK)\n", in xe_wopcm_init()
255 if (__check_layout(xe, wopcm->size, guc_wopcm_base, guc_wopcm_size, in xe_wopcm_init()
257 wopcm->guc.base = guc_wopcm_base; in xe_wopcm_init()
258 wopcm->guc.size = guc_wopcm_size; in xe_wopcm_init()
259 XE_WARN_ON(!wopcm->guc.base); in xe_wopcm_init()
260 XE_WARN_ON(!wopcm->guc.size); in xe_wopcm_init()
262 drm_notice(&xe->drm, "Unsuccessful WOPCM partitioning\n"); in xe_wopcm_init()
263 return -E2BIG; in xe_wopcm_init()