Re: [kmsxx] [PATCH 1/2] card: Add support for writeback connectors

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 24/08/2020 17:27, Laurent Pinchart wrote:
> Hi Tomi,
> 
> On Mon, Aug 24, 2020 at 09:30:35AM +0300, Tomi Valkeinen wrote:
>> On 24/08/2020 01:11, Laurent Pinchart wrote:
>>> Enable enumeration of writeback connectors if both libdrm and the device
>>> support it. The new Card::has_writeback() method report if the card
>>> support writeback connectors.
>>>
>>> Existing code that expect all connectors to model an output may be
>>> confused by the sudden availability of new connectors. To handle this
>>> issue,
>>>
>>> - add a KMSXX_DISABLE_WRITEBACK_CONNECTORS environment variable to
>>>   disable enumeration of writeback connectors, similarly to universal
>>>   planes ; and
>>>
>>> - ignore writeback connectors where no specific connector is requested
>>>   (Card::get_first_connected_connector(),
>>>   ResourceManager::reserve_connector() if no connector name is
>>>   specified, and applications that use all connected outputs).
>>>
>>> Signed-off-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx>
>>> ---
>>>  kms++/inc/kms++/card.h            |  2 ++
>>>  kms++/src/card.cpp                | 13 +++++++++++++
>>>  kms++/src/connector.cpp           |  1 +
>>>  kms++util/CMakeLists.txt          |  2 ++
>>>  kms++util/src/resourcemanager.cpp |  5 +++++
>>>  py/pykms/pykmsbase.cpp            |  1 +
>>>  utils/kmsblank.cpp                |  5 +++++
>>>  utils/kmstest.cpp                 |  4 ++++
>>>  8 files changed, 33 insertions(+)
>>>
>>> diff --git a/kms++/inc/kms++/card.h b/kms++/inc/kms++/card.h
>>> index 0a7eaaf81a8d..26468edbb503 100644
>>> --- a/kms++/inc/kms++/card.h
>>> +++ b/kms++/inc/kms++/card.h
>>> @@ -53,6 +53,7 @@ public:
>>>  	bool has_universal_planes() const { return m_has_universal_planes; }
>>>  	bool has_dumb_buffers() const { return m_has_dumb; }
>>>  	bool has_kms() const;
>>> +	bool has_writeback() const { return m_has_writeback; }
>>>  
>>>  	std::vector<Connector*> get_connectors() const { return m_connectors; }
>>>  	std::vector<Encoder*> get_encoders() const { return m_encoders; }
>>> @@ -91,6 +92,7 @@ private:
>>>  	bool m_has_atomic;
>>>  	bool m_has_universal_planes;
>>>  	bool m_has_dumb;
>>> +	bool m_has_writeback;
>>>  
>>>  	CardVersion m_version;
>>>  };
>>> diff --git a/kms++/src/card.cpp b/kms++/src/card.cpp
>>> index 3a7ab700ed49..cbb5d50b505f 100644
>>> --- a/kms++/src/card.cpp
>>> +++ b/kms++/src/card.cpp
>>> @@ -217,6 +217,17 @@ void Card::setup()
>>>  	m_has_atomic = false;
>>>  #endif
>>>  
>>> +#ifdef DRM_CLIENT_CAP_WRITEBACK_CONNECTORS
>>> +	if (getenv("KMSXX_DISABLE_WRITEBACK_CONNECTORS") == 0) {
>>> +		r = drmSetClientCap(m_fd, DRM_CLIENT_CAP_WRITEBACK_CONNECTORS, 1);
>>> +		m_has_writeback = r == 0;
>>> +	} else {
>>> +		m_has_writeback = false;
>>> +	}
>>> +#else
>>> +	m_has_writeback = false;
>>> +#endif
>>> +
>>>  	uint64_t has_dumb;
>>>  	r = drmGetCap(m_fd, DRM_CAP_DUMB_BUFFER, &has_dumb);
>>>  	m_has_dumb = r == 0 && has_dumb;
>>> @@ -316,6 +327,8 @@ void Card::restore_modes()
>>>  Connector* Card::get_first_connected_connector() const
>>>  {
>>>  	for(auto c : m_connectors) {
>>> +		if (c->connector_type() == DRM_MODE_CONNECTOR_WRITEBACK)
>>> +			continue;
>>>  		if (c->connected())
>>>  			return c;
>>>  	}
>>> diff --git a/kms++/src/connector.cpp b/kms++/src/connector.cpp
>>> index a40861957c67..6f5f79f0e523 100644
>>> --- a/kms++/src/connector.cpp
>>> +++ b/kms++/src/connector.cpp
>>> @@ -36,6 +36,7 @@ static const map<int, string> connector_names = {
>>>  	{ DRM_MODE_CONNECTOR_VIRTUAL, "Virtual" },
>>>  	{ DRM_MODE_CONNECTOR_DSI, "DSI" },
>>>  	{ DRM_MODE_CONNECTOR_DPI, "DPI" },
>>> +	{ DRM_MODE_CONNECTOR_WRITEBACK, "writeback" },
>>>  };
>>>  
>>>  static const map<int, string> connection_str = {
>>> diff --git a/kms++util/CMakeLists.txt b/kms++util/CMakeLists.txt
>>> index 0bfb56b0d58f..362824ad13d5 100644
>>> --- a/kms++util/CMakeLists.txt
>>> +++ b/kms++util/CMakeLists.txt
>>> @@ -1,3 +1,5 @@
>>> +include_directories(${LIBDRM_INCLUDE_DIRS})
>>> +
>>>  file(GLOB SRCS "src/*.cpp" "src/*.h")
>>>  file(GLOB PUB_HDRS "inc/kms++util/*.h")
>>>  add_library(kms++util ${SRCS} ${PUB_HDRS})
>>> diff --git a/kms++util/src/resourcemanager.cpp b/kms++util/src/resourcemanager.cpp
>>> index 5a9f016c06ab..01edaf39202b 100644
>>> --- a/kms++util/src/resourcemanager.cpp
>>> +++ b/kms++util/src/resourcemanager.cpp
>>> @@ -2,6 +2,8 @@
>>>  #include <algorithm>
>>>  #include <kms++util/strhelpers.h>
>>>  
>>> +#include <xf86drmMode.h>
>>
>> This and adding the LIBDRM_INCLUDE_DIRS is not ok. I don't want kms++
>> to leak libdrm C headers.
> 
> I was expecting that feedback :-)
> 
>> We need to add an enum class for connector types, and map the libdrm
>> types to that.
>>
>> As a simple quick alternative, I think just conn->is_writeback() would
>> do the trick, as we have no users for the connector type as such.
> 
> Should I go for that, or byte the bullet and wrap the connector types ?

At the moment I don't see a need exposing the connector types. Usually it's better to only add code
that's actually used for something =).

So I'd just go with the helper function. Although while thinking about this, I wonder if an inverse
helper would be better, like is_display() or such. As that's what the callers are looking for, a
connector that can be used as a display.

That said, I don't know what other non-display connectors we might have. Still, usually, I think a
bool helper is better if it's checking for the thing we actually want (a display).

 Tomi

-- 
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki



[Index of Archives]     [Linux Samsung SOC]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]

  Powered by Linux