blob: 878f6f577ce649d54e92a2b88876c27218a431dc [file] [log] [blame]
--
-- Copyright (C) 2022 Google, LLC
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
with GNAT.Source_Info;
with HW.Debug;
with HW.GFX.GMA.Config_Helpers;
with HW.GFX.GMA.Connectors.TC.Ownership;
with HW.GFX.GMA.Power_Domains_Common;
use HW.GFX.GMA.Power_Domains_Common;
package body HW.GFX.GMA.Power_Domains is
function Need_PW (PW : Dynamic_Well; Configs : Pipe_Configs) return Boolean
is
function Any_PW2_Combo_Port return Boolean is
(for some Pipe in Pipe_Index =>
Configs (Pipe).Port /= Disabled and then
Config_Helpers.To_GPU_Port (Pipe, Configs (Pipe).Port) in DIGI_C .. DIGI_E);
function Any_TC_Port return Boolean is
(for some Pipe in Pipe_Index =>
Configs (Pipe).Port /= Disabled and then
Config_Helpers.To_GPU_Port (Pipe, Configs (Pipe).Port) in USBC_Port);
function Any_Pipe_From (First : Pipe_Index) return Boolean is
(for some Pipe in First .. Pipe_Index'Last => Configs (Pipe).Port /= Disabled);
function VGA return Boolean is
(Configs (Primary).Framebuffer.Offset = VGA_PLANE_FRAMEBUFFER_OFFSET);
begin
case PW is
when PW2 =>
return Any_Pipe_From (Secondary) or Any_PW2_Combo_Port or Any_TC_Port or VGA;
when PWA =>
return Configs (Primary).Port /= Disabled;
when PWB =>
return Configs (Secondary).Port /= Disabled;
when PWC =>
return Configs (Tertiary).Port /= Disabled;
when PWD =>
return False; -- Fourth pipe not supported yet.
end case;
end Need_PW;
procedure Power_Up (Port : Active_Port_Type; Success : out Boolean)
is
GPU_Port : constant GMA.GPU_Port :=
Config_Helpers.To_GPU_Port (Pipe_Index'First, Port);
procedure On (Aux : AUX_Domain; DDI : DDI_Domain) is
begin
PD_On (PW1);
if DDI in DDI_PW2_Domain then
PD_On (PW2);
end if;
PD_On (DDI);
if GPU_Port in USBC_Port then
Connectors.TC.Ownership.Claim
(Port => GPU_Port,
DP_Alt => Port in Physical_USBC_Ports,
Success => Success);
if not Success then
return;
end if;
end if;
PD_On (Aux);
Success := True;
end On;
begin
pragma Debug (Debug.Put_Line (GNAT.Source_Info.Enclosing_Entity));
case GPU_Port is
when GMA.DIGI_A => On (AUX_A, DDI_A);
when GMA.DIGI_B => On (AUX_B, DDI_B);
when GMA.DIGI_C => On (AUX_C, DDI_C);
when GMA.DIGI_D => On (AUX_D, DDI_D);
when GMA.DIGI_E => On (AUX_E, DDI_E);
when GMA.DDI_TC1 => On (AUX_USBC1, DDI_USBC1);
when GMA.DDI_TC2 => On (AUX_USBC2, DDI_USBC2);
when GMA.DDI_TC3 => On (AUX_USBC3, DDI_USBC3);
when GMA.DDI_TC4 => On (AUX_USBC4, DDI_USBC4);
when others => Success := True;
end case;
end Power_Up;
end HW.GFX.GMA.Power_Domains;