xref: /aosp_15_r20/external/libkmsxx/kms++/src/blob.cpp (revision f0687c8a10b3e371dbe09214db6664e37c283cca)
1*f0687c8aSRaman Tenneti #include <xf86drm.h>
2*f0687c8aSRaman Tenneti #include <xf86drmMode.h>
3*f0687c8aSRaman Tenneti 
4*f0687c8aSRaman Tenneti #include <kms++/kms++.h>
5*f0687c8aSRaman Tenneti 
6*f0687c8aSRaman Tenneti using namespace std;
7*f0687c8aSRaman Tenneti 
8*f0687c8aSRaman Tenneti namespace kms
9*f0687c8aSRaman Tenneti {
Blob(Card & card,uint32_t blob_id)10*f0687c8aSRaman Tenneti Blob::Blob(Card& card, uint32_t blob_id)
11*f0687c8aSRaman Tenneti 	: DrmObject(card, blob_id, DRM_MODE_OBJECT_BLOB), m_created(false)
12*f0687c8aSRaman Tenneti {
13*f0687c8aSRaman Tenneti 	// XXX should we verify that the blob_id is a blob object?
14*f0687c8aSRaman Tenneti }
15*f0687c8aSRaman Tenneti 
Blob(Card & card,void * data,size_t len)16*f0687c8aSRaman Tenneti Blob::Blob(Card& card, void* data, size_t len)
17*f0687c8aSRaman Tenneti 	: DrmObject(card, DRM_MODE_OBJECT_BLOB), m_created(true)
18*f0687c8aSRaman Tenneti {
19*f0687c8aSRaman Tenneti 	uint32_t id;
20*f0687c8aSRaman Tenneti 
21*f0687c8aSRaman Tenneti 	int r = drmModeCreatePropertyBlob(card.fd(), data, len, &id);
22*f0687c8aSRaman Tenneti 	if (r)
23*f0687c8aSRaman Tenneti 		throw invalid_argument("FAILED TO CREATE PROP\n");
24*f0687c8aSRaman Tenneti 
25*f0687c8aSRaman Tenneti 	set_id(id);
26*f0687c8aSRaman Tenneti }
27*f0687c8aSRaman Tenneti 
~Blob()28*f0687c8aSRaman Tenneti Blob::~Blob()
29*f0687c8aSRaman Tenneti {
30*f0687c8aSRaman Tenneti 	if (m_created)
31*f0687c8aSRaman Tenneti 		drmModeDestroyPropertyBlob(card().fd(), id());
32*f0687c8aSRaman Tenneti }
33*f0687c8aSRaman Tenneti 
data()34*f0687c8aSRaman Tenneti vector<uint8_t> Blob::data()
35*f0687c8aSRaman Tenneti {
36*f0687c8aSRaman Tenneti 	drmModePropertyBlobPtr blob = drmModeGetPropertyBlob(card().fd(), id());
37*f0687c8aSRaman Tenneti 
38*f0687c8aSRaman Tenneti 	if (!blob)
39*f0687c8aSRaman Tenneti 		throw invalid_argument("Blob data not available");
40*f0687c8aSRaman Tenneti 
41*f0687c8aSRaman Tenneti 	uint8_t* data = (uint8_t*)blob->data;
42*f0687c8aSRaman Tenneti 
43*f0687c8aSRaman Tenneti 	auto v = vector<uint8_t>(data, data + blob->length);
44*f0687c8aSRaman Tenneti 
45*f0687c8aSRaman Tenneti 	drmModeFreePropertyBlob(blob);
46*f0687c8aSRaman Tenneti 
47*f0687c8aSRaman Tenneti 	return v;
48*f0687c8aSRaman Tenneti }
49*f0687c8aSRaman Tenneti 
50*f0687c8aSRaman Tenneti } // namespace kms
51