Lines Matching full:domain
119 static const char *get_domain_name(u8 domain) in get_domain_name() argument
121 switch (domain) { in get_domain_name()
136 static u32 get_domain_base(u8 domain) in get_domain_base() argument
138 switch (domain) { in get_domain_base()
153 static u32 get_domain_ready_reg(u32 domain) in get_domain_ready_reg() argument
155 return get_domain_base(domain) + (PWR_L2_READY - PWR_L2_PRESENT); in get_domain_ready_reg()
158 static u32 get_domain_pwrtrans_reg(u32 domain) in get_domain_pwrtrans_reg() argument
160 return get_domain_base(domain) + (PWR_L2_PWRTRANS - PWR_L2_PRESENT); in get_domain_pwrtrans_reg()
163 static bool is_valid_domain(u32 domain) in is_valid_domain() argument
165 return get_domain_base(domain) != 0; in is_valid_domain()
173 static u8 get_domain_subdomain(struct panthor_device *ptdev, u32 domain) in get_domain_subdomain() argument
175 if (domain == PWR_COMMAND_DOMAIN_SHADER && has_rtu(ptdev)) in get_domain_subdomain()
181 static int panthor_pwr_domain_wait_transition(struct panthor_device *ptdev, u32 domain, in panthor_pwr_domain_wait_transition() argument
184 u32 pwrtrans_reg = get_domain_pwrtrans_reg(domain); in panthor_pwr_domain_wait_transition()
191 drm_err(&ptdev->base, "%s domain power in transition, pwrtrans(0x%llx)", in panthor_pwr_domain_wait_transition()
192 get_domain_name(domain), val); in panthor_pwr_domain_wait_transition()
214 static int panthor_pwr_domain_transition(struct panthor_device *ptdev, u32 cmd, u32 domain, in panthor_pwr_domain_transition() argument
217 u32 ready_reg = get_domain_ready_reg(domain); in panthor_pwr_domain_transition()
218 u32 pwr_cmd = PWR_COMMAND_DEF(cmd, domain, get_domain_subdomain(ptdev, domain)); in panthor_pwr_domain_transition()
223 if (drm_WARN_ON(&ptdev->base, !is_valid_domain(domain))) in panthor_pwr_domain_transition()
234 drm_err(&ptdev->base, "Invalid power domain transition command (0x%x)", cmd); in panthor_pwr_domain_transition()
238 ret = panthor_pwr_domain_wait_transition(ptdev, domain, timeout_us); in panthor_pwr_domain_transition()
242 /* domain already in target state, return early */ in panthor_pwr_domain_transition()
252 "timeout waiting on %s power domain transition, cmd(0x%x), arg(0x%llx)", in panthor_pwr_domain_transition()
253 get_domain_name(domain), pwr_cmd, mask); in panthor_pwr_domain_transition()
269 * retract_domain() - Retract control of a domain from MCU
271 * @domain: Domain to retract the control
273 * Retracting L2 domain is not expected since it won't be delegated.
276 * -EPERM if domain is L2.
279 static int retract_domain(struct panthor_device *ptdev, u32 domain) in retract_domain() argument
281 const u32 pwr_cmd = PWR_COMMAND_DEF(PWR_COMMAND_RETRACT, domain, 0); in retract_domain()
283 const u64 delegated_mask = PWR_STATUS_DOMAIN_DELEGATED(domain); in retract_domain()
284 const u64 allow_mask = PWR_STATUS_DOMAIN_ALLOWED(domain); in retract_domain()
288 if (drm_WARN_ON(&ptdev->base, domain == PWR_COMMAND_DOMAIN_L2)) in retract_domain()
294 drm_err(&ptdev->base, "%s domain retract pending", get_domain_name(domain)); in retract_domain()
299 drm_dbg(&ptdev->base, "%s domain already retracted", get_domain_name(domain)); in retract_domain()
313 drm_err(&ptdev->base, "Retracting %s domain timeout, cmd(0x%x)", in retract_domain()
314 get_domain_name(domain), pwr_cmd); in retract_domain()
322 * delegate_domain() - Delegate control of a domain to MCU
324 * @domain: Domain to delegate the control
326 * Delegating L2 domain is prohibited.
330 * * -EPERM if domain is L2.
333 static int delegate_domain(struct panthor_device *ptdev, u32 domain) in delegate_domain() argument
335 const u32 pwr_cmd = PWR_COMMAND_DEF(PWR_COMMAND_DELEGATE, domain, 0); in delegate_domain()
337 const u64 allow_mask = PWR_STATUS_DOMAIN_ALLOWED(domain); in delegate_domain()
338 const u64 delegated_mask = PWR_STATUS_DOMAIN_DELEGATED(domain); in delegate_domain()
342 if (drm_WARN_ON(&ptdev->base, domain == PWR_COMMAND_DOMAIN_L2)) in delegate_domain()
351 drm_warn(&ptdev->base, "Delegating %s domain not allowed", get_domain_name(domain)); in delegate_domain()
355 ret = panthor_pwr_domain_wait_transition(ptdev, domain, PWR_TRANSITION_TIMEOUT_US); in delegate_domain()
369 drm_err(&ptdev->base, "Delegating %s domain timeout, cmd(0x%x)", in delegate_domain()
370 get_domain_name(domain), pwr_cmd); in delegate_domain()
401 * panthor_pwr_domain_force_off - Forcefully power down a domain.
403 * @domain: Domain to forcefully power down.
406 * domain. However, if retraction fails, the operation is aborted. If power off
407 * fails, the domain will remain retracted and under the host control.
411 static int panthor_pwr_domain_force_off(struct panthor_device *ptdev, u32 domain) in panthor_pwr_domain_force_off() argument
413 const u64 domain_ready = gpu_read64(ptdev, get_domain_ready_reg(domain)); in panthor_pwr_domain_force_off()
416 /* Domain already powered down, early exit. */ in panthor_pwr_domain_force_off()
420 /* Domain has to be in host control to issue power off command. */ in panthor_pwr_domain_force_off()
421 ret = retract_domain(ptdev, domain); in panthor_pwr_domain_force_off()
425 return panthor_pwr_domain_power_off(ptdev, domain, domain_ready, PWR_TRANSITION_TIMEOUT_US); in panthor_pwr_domain_force_off()
489 drm_warn(&ptdev->base, "Power off L2 domain not allowed"); in panthor_pwr_l2_power_off()
516 drm_warn(&ptdev->base, "Power on L2 domain not allowed"); in panthor_pwr_l2_power_on()