xref: /aosp_15_r20/external/libkmsxx/kms++/src/drmpropobject.cpp (revision f0687c8a10b3e371dbe09214db6664e37c283cca)
1*f0687c8aSRaman Tenneti #include <cstring>
2*f0687c8aSRaman Tenneti #include <iostream>
3*f0687c8aSRaman Tenneti #include <stdexcept>
4*f0687c8aSRaman Tenneti 
5*f0687c8aSRaman Tenneti #include <xf86drm.h>
6*f0687c8aSRaman Tenneti #include <xf86drmMode.h>
7*f0687c8aSRaman Tenneti 
8*f0687c8aSRaman Tenneti #include <kms++/kms++.h>
9*f0687c8aSRaman Tenneti 
10*f0687c8aSRaman Tenneti using namespace std;
11*f0687c8aSRaman Tenneti 
12*f0687c8aSRaman Tenneti namespace kms
13*f0687c8aSRaman Tenneti {
DrmPropObject(Card & card,uint32_t object_type)14*f0687c8aSRaman Tenneti DrmPropObject::DrmPropObject(Card& card, uint32_t object_type)
15*f0687c8aSRaman Tenneti 	: DrmObject(card, object_type)
16*f0687c8aSRaman Tenneti {
17*f0687c8aSRaman Tenneti }
18*f0687c8aSRaman Tenneti 
DrmPropObject(Card & card,uint32_t id,uint32_t object_type,uint32_t idx)19*f0687c8aSRaman Tenneti DrmPropObject::DrmPropObject(Card& card, uint32_t id, uint32_t object_type, uint32_t idx)
20*f0687c8aSRaman Tenneti 	: DrmObject(card, id, object_type, idx)
21*f0687c8aSRaman Tenneti {
22*f0687c8aSRaman Tenneti 	refresh_props();
23*f0687c8aSRaman Tenneti }
24*f0687c8aSRaman Tenneti 
~DrmPropObject()25*f0687c8aSRaman Tenneti DrmPropObject::~DrmPropObject()
26*f0687c8aSRaman Tenneti {
27*f0687c8aSRaman Tenneti }
28*f0687c8aSRaman Tenneti 
refresh_props()29*f0687c8aSRaman Tenneti void DrmPropObject::refresh_props()
30*f0687c8aSRaman Tenneti {
31*f0687c8aSRaman Tenneti 	auto props = drmModeObjectGetProperties(card().fd(), this->id(), this->object_type());
32*f0687c8aSRaman Tenneti 
33*f0687c8aSRaman Tenneti 	if (props == nullptr)
34*f0687c8aSRaman Tenneti 		return;
35*f0687c8aSRaman Tenneti 
36*f0687c8aSRaman Tenneti 	for (unsigned i = 0; i < props->count_props; ++i) {
37*f0687c8aSRaman Tenneti 		uint32_t prop_id = props->props[i];
38*f0687c8aSRaman Tenneti 		uint64_t prop_value = props->prop_values[i];
39*f0687c8aSRaman Tenneti 
40*f0687c8aSRaman Tenneti 		m_prop_values[prop_id] = prop_value;
41*f0687c8aSRaman Tenneti 	}
42*f0687c8aSRaman Tenneti 
43*f0687c8aSRaman Tenneti 	drmModeFreeObjectProperties(props);
44*f0687c8aSRaman Tenneti }
45*f0687c8aSRaman Tenneti 
get_prop(const string & name) const46*f0687c8aSRaman Tenneti Property* DrmPropObject::get_prop(const string& name) const
47*f0687c8aSRaman Tenneti {
48*f0687c8aSRaman Tenneti 	for (auto pair : m_prop_values) {
49*f0687c8aSRaman Tenneti 		auto prop = card().get_prop(pair.first);
50*f0687c8aSRaman Tenneti 
51*f0687c8aSRaman Tenneti 		if (name == prop->name())
52*f0687c8aSRaman Tenneti 			return prop;
53*f0687c8aSRaman Tenneti 	}
54*f0687c8aSRaman Tenneti 
55*f0687c8aSRaman Tenneti 	return nullptr;
56*f0687c8aSRaman Tenneti }
57*f0687c8aSRaman Tenneti 
get_prop_value(uint32_t id) const58*f0687c8aSRaman Tenneti uint64_t DrmPropObject::get_prop_value(uint32_t id) const
59*f0687c8aSRaman Tenneti {
60*f0687c8aSRaman Tenneti 	return m_prop_values.at(id);
61*f0687c8aSRaman Tenneti }
62*f0687c8aSRaman Tenneti 
get_prop_value(const string & name) const63*f0687c8aSRaman Tenneti uint64_t DrmPropObject::get_prop_value(const string& name) const
64*f0687c8aSRaman Tenneti {
65*f0687c8aSRaman Tenneti 	for (auto pair : m_prop_values) {
66*f0687c8aSRaman Tenneti 		auto prop = card().get_prop(pair.first);
67*f0687c8aSRaman Tenneti 		if (name == prop->name())
68*f0687c8aSRaman Tenneti 			return m_prop_values.at(prop->id());
69*f0687c8aSRaman Tenneti 	}
70*f0687c8aSRaman Tenneti 
71*f0687c8aSRaman Tenneti 	throw invalid_argument("property not found: " + name);
72*f0687c8aSRaman Tenneti }
73*f0687c8aSRaman Tenneti 
get_prop_value_as_blob(const string & name) const74*f0687c8aSRaman Tenneti unique_ptr<Blob> DrmPropObject::get_prop_value_as_blob(const string& name) const
75*f0687c8aSRaman Tenneti {
76*f0687c8aSRaman Tenneti 	uint32_t blob_id = (uint32_t)get_prop_value(name);
77*f0687c8aSRaman Tenneti 
78*f0687c8aSRaman Tenneti 	return unique_ptr<Blob>(new Blob(card(), blob_id));
79*f0687c8aSRaman Tenneti }
80*f0687c8aSRaman Tenneti 
set_prop_value(Property * prop,uint64_t value)81*f0687c8aSRaman Tenneti int DrmPropObject::set_prop_value(Property* prop, uint64_t value)
82*f0687c8aSRaman Tenneti {
83*f0687c8aSRaman Tenneti 	return drmModeObjectSetProperty(card().fd(), this->id(), this->object_type(), prop->id(), value);
84*f0687c8aSRaman Tenneti }
85*f0687c8aSRaman Tenneti 
set_prop_value(uint32_t id,uint64_t value)86*f0687c8aSRaman Tenneti int DrmPropObject::set_prop_value(uint32_t id, uint64_t value)
87*f0687c8aSRaman Tenneti {
88*f0687c8aSRaman Tenneti 	return drmModeObjectSetProperty(card().fd(), this->id(), this->object_type(), id, value);
89*f0687c8aSRaman Tenneti }
90*f0687c8aSRaman Tenneti 
set_prop_value(const string & name,uint64_t value)91*f0687c8aSRaman Tenneti int DrmPropObject::set_prop_value(const string& name, uint64_t value)
92*f0687c8aSRaman Tenneti {
93*f0687c8aSRaman Tenneti 	Property* prop = get_prop(name);
94*f0687c8aSRaman Tenneti 
95*f0687c8aSRaman Tenneti 	if (prop == nullptr)
96*f0687c8aSRaman Tenneti 		throw invalid_argument("property not found: " + name);
97*f0687c8aSRaman Tenneti 
98*f0687c8aSRaman Tenneti 	return set_prop_value(prop->id(), value);
99*f0687c8aSRaman Tenneti }
100*f0687c8aSRaman Tenneti 
101*f0687c8aSRaman Tenneti } // namespace kms
102