114283Sgiacomo.travaglini@arm.com# Copyright (c) 2019 ARM Limited
214283Sgiacomo.travaglini@arm.com# All rights reserved.
314283Sgiacomo.travaglini@arm.com#
414283Sgiacomo.travaglini@arm.com# The license below extends only to copyright in the software and shall
514283Sgiacomo.travaglini@arm.com# not be construed as granting a license to any other intellectual
614283Sgiacomo.travaglini@arm.com# property including but not limited to intellectual property relating
714283Sgiacomo.travaglini@arm.com# to a hardware implementation of the functionality of the software
814283Sgiacomo.travaglini@arm.com# licensed hereunder.  You may use the software subject to the license
914283Sgiacomo.travaglini@arm.com# terms below provided that you ensure that this notice is replicated
1014283Sgiacomo.travaglini@arm.com# unmodified and in its entirety in all distributions of the software,
1114283Sgiacomo.travaglini@arm.com# modified or unmodified, in source code or in binary form.
1214283Sgiacomo.travaglini@arm.com#
1314283Sgiacomo.travaglini@arm.com# Redistribution and use in source and binary forms, with or without
1414283Sgiacomo.travaglini@arm.com# modification, are permitted provided that the following conditions are
1514283Sgiacomo.travaglini@arm.com# met: redistributions of source code must retain the above copyright
1614283Sgiacomo.travaglini@arm.com# notice, this list of conditions and the following disclaimer;
1714283Sgiacomo.travaglini@arm.com# redistributions in binary form must reproduce the above copyright
1814283Sgiacomo.travaglini@arm.com# notice, this list of conditions and the following disclaimer in the
1914283Sgiacomo.travaglini@arm.com# documentation and/or other materials provided with the distribution;
2014283Sgiacomo.travaglini@arm.com# neither the name of the copyright holders nor the names of its
2114283Sgiacomo.travaglini@arm.com# contributors may be used to endorse or promote products derived from
2214283Sgiacomo.travaglini@arm.com# this software without specific prior written permission.
2314283Sgiacomo.travaglini@arm.com#
2414283Sgiacomo.travaglini@arm.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2514283Sgiacomo.travaglini@arm.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2614283Sgiacomo.travaglini@arm.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2714283Sgiacomo.travaglini@arm.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2814283Sgiacomo.travaglini@arm.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2914283Sgiacomo.travaglini@arm.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3014283Sgiacomo.travaglini@arm.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3114283Sgiacomo.travaglini@arm.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3214283Sgiacomo.travaglini@arm.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3314283Sgiacomo.travaglini@arm.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3414283Sgiacomo.travaglini@arm.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3514283Sgiacomo.travaglini@arm.com#
3614283Sgiacomo.travaglini@arm.com# Authors: Giacomo Travaglini
3714283Sgiacomo.travaglini@arm.com
3814283Sgiacomo.travaglini@arm.comfrom m5.params import *
3914283Sgiacomo.travaglini@arm.comfrom m5.SimObject import SimObject
4014283Sgiacomo.travaglini@arm.comfrom m5.util.fdthelper import *
4114283Sgiacomo.travaglini@arm.com
4214283Sgiacomo.travaglini@arm.comclass Display(SimObject):
4314283Sgiacomo.travaglini@arm.com    type = 'Display'
4414283Sgiacomo.travaglini@arm.com    cxx_header = "dev/arm/display.hh"
4514283Sgiacomo.travaglini@arm.com    clock_frequency = Param.Unsigned("clock-frequency property")
4614283Sgiacomo.travaglini@arm.com    hactive = Param.Unsigned("hactive property")
4714283Sgiacomo.travaglini@arm.com    vactive = Param.Unsigned("vactive property")
4814283Sgiacomo.travaglini@arm.com    hfront_porch = Param.Unsigned("hfront-porch property")
4914283Sgiacomo.travaglini@arm.com    hback_porch = Param.Unsigned("hback-porch property")
5014283Sgiacomo.travaglini@arm.com    hsync_len = Param.Unsigned("hsync-len property")
5114283Sgiacomo.travaglini@arm.com    vfront_porch = Param.Unsigned("vfront-porch property")
5214283Sgiacomo.travaglini@arm.com    vback_porch = Param.Unsigned("vback-porch property")
5314283Sgiacomo.travaglini@arm.com    vsync_len = Param.Unsigned("vsync-len property")
5414283Sgiacomo.travaglini@arm.com
5514283Sgiacomo.travaglini@arm.com    _endpoint_node = None
5614283Sgiacomo.travaglini@arm.com
5714283Sgiacomo.travaglini@arm.com    def endpointPhandle(self):
5814283Sgiacomo.travaglini@arm.com        return "encoder_endpoint"
5914283Sgiacomo.travaglini@arm.com
6014283Sgiacomo.travaglini@arm.com    def endpointNode(self):
6114283Sgiacomo.travaglini@arm.com        assert self._endpoint_node is not None
6214283Sgiacomo.travaglini@arm.com        return self._endpoint_node
6314283Sgiacomo.travaglini@arm.com
6414283Sgiacomo.travaglini@arm.com    def generateDeviceTree(self, state):
6514283Sgiacomo.travaglini@arm.com        # timing node
6614283Sgiacomo.travaglini@arm.com        timing_node = FdtNode(self.timingNode())
6714283Sgiacomo.travaglini@arm.com
6814283Sgiacomo.travaglini@arm.com        timing_node.append(FdtPropertyWords(
6914283Sgiacomo.travaglini@arm.com            "clock-frequency", [self.clock_frequency]))
7014283Sgiacomo.travaglini@arm.com        timing_node.append(FdtPropertyWords(
7114283Sgiacomo.travaglini@arm.com            "hactive", [self.hactive]))
7214283Sgiacomo.travaglini@arm.com        timing_node.append(FdtPropertyWords(
7314283Sgiacomo.travaglini@arm.com            "vactive", [self.vactive]))
7414283Sgiacomo.travaglini@arm.com        timing_node.append(FdtPropertyWords(
7514283Sgiacomo.travaglini@arm.com            "hfront-porch", [self.hfront_porch]))
7614283Sgiacomo.travaglini@arm.com        timing_node.append(FdtPropertyWords(
7714283Sgiacomo.travaglini@arm.com            "hback-porch", [self.hback_porch]))
7814283Sgiacomo.travaglini@arm.com        timing_node.append(FdtPropertyWords(
7914283Sgiacomo.travaglini@arm.com            "hsync-len", [self.hsync_len]))
8014283Sgiacomo.travaglini@arm.com        timing_node.append(FdtPropertyWords(
8114283Sgiacomo.travaglini@arm.com            "vfront-porch", [self.vfront_porch]))
8214283Sgiacomo.travaglini@arm.com        timing_node.append(FdtPropertyWords(
8314283Sgiacomo.travaglini@arm.com            "vback-porch", [self.vback_porch]))
8414283Sgiacomo.travaglini@arm.com        timing_node.append(FdtPropertyWords(
8514283Sgiacomo.travaglini@arm.com            "vsync-len", [self.vsync_len]))
8614283Sgiacomo.travaglini@arm.com
8714283Sgiacomo.travaglini@arm.com        timing_node.appendPhandle(self.timingNode())
8814283Sgiacomo.travaglini@arm.com
8914283Sgiacomo.travaglini@arm.com        # display timing node
9014283Sgiacomo.travaglini@arm.com        dispt_node = FdtNode("display-timings")
9114283Sgiacomo.travaglini@arm.com        dispt_node.append(FdtPropertyWords("native-mode",
9214283Sgiacomo.travaglini@arm.com            state.phandle(self.timingNode())))
9314283Sgiacomo.travaglini@arm.com        dispt_node.append(timing_node)
9414283Sgiacomo.travaglini@arm.com
9514283Sgiacomo.travaglini@arm.com        # endpoint node
9614283Sgiacomo.travaglini@arm.com        endpoint_node = FdtNode("endpoint")
9714283Sgiacomo.travaglini@arm.com        endpoint_node.appendPhandle(
9814283Sgiacomo.travaglini@arm.com            self.endpointPhandle())
9914283Sgiacomo.travaglini@arm.com
10014283Sgiacomo.travaglini@arm.com        # Assign node so that it can be retrieved
10114283Sgiacomo.travaglini@arm.com        self._endpoint_node = endpoint_node
10214283Sgiacomo.travaglini@arm.com
10314283Sgiacomo.travaglini@arm.com        # port node
10414283Sgiacomo.travaglini@arm.com        port_node = FdtNode("port")
10514283Sgiacomo.travaglini@arm.com        port_node.append(endpoint_node)
10614283Sgiacomo.travaglini@arm.com
10714283Sgiacomo.travaglini@arm.com        # Virt-encoder
10814283Sgiacomo.travaglini@arm.com        node = FdtNode("virt-encoder")
10914283Sgiacomo.travaglini@arm.com        node.appendCompatible(["drm,virtual-encoder"])
11014283Sgiacomo.travaglini@arm.com        node.append(dispt_node)
11114283Sgiacomo.travaglini@arm.com        node.append(port_node)
11214283Sgiacomo.travaglini@arm.com
11314283Sgiacomo.travaglini@arm.com        yield node
11414283Sgiacomo.travaglini@arm.com
11514283Sgiacomo.travaglini@arm.comclass Display1080p(Display):
11614283Sgiacomo.travaglini@arm.com    clock_frequency = 148500000
11714283Sgiacomo.travaglini@arm.com    hactive = 1920
11814283Sgiacomo.travaglini@arm.com    vactive = 1080
11914283Sgiacomo.travaglini@arm.com    hfront_porch = 148
12014283Sgiacomo.travaglini@arm.com    hback_porch = 88
12114283Sgiacomo.travaglini@arm.com    hsync_len = 44
12214283Sgiacomo.travaglini@arm.com    vfront_porch = 36
12314283Sgiacomo.travaglini@arm.com    vback_porch = 4
12414283Sgiacomo.travaglini@arm.com    vsync_len = 5
12514283Sgiacomo.travaglini@arm.com
12614283Sgiacomo.travaglini@arm.com    def timingNode(self):
12714283Sgiacomo.travaglini@arm.com        return "timing_1080p60"
128