18c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz/**************************************************************************
28c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz *
38c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz * Copyright © 2009 VMware, Inc., Palo Alto, CA., USA
48c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz * All Rights Reserved.
58c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz *
68c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz * Permission is hereby granted, free of charge, to any person obtaining a
78c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz * copy of this software and associated documentation files (the
88c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz * "Software"), to deal in the Software without restriction, including
98c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz * without limitation the rights to use, copy, modify, merge, publish,
108c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz * distribute, sub license, and/or sell copies of the Software, and to
118c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz * permit persons to whom the Software is furnished to do so, subject to
128c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz * the following conditions:
138c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz *
148c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz * The above copyright notice and this permission notice (including the
158c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz * next paragraph) shall be included in all copies or substantial portions
168c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz * of the Software.
178c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz *
188c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
198c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
208c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
218c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
228c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
238c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
248c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz * USE OR OTHER DEALINGS IN THE SOFTWARE.
258c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz *
268c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz **************************************************************************/
278c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz
288c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz
298e93afc9765f1de613c65a76e9a86e17db96e653Emil Velikov#ifdef HAVE_CONFIG_H
305dbc1b333b85695735dc5b484372758b9979b693Jakob Bornecrantz#include "config.h"
318e93afc9765f1de613c65a76e9a86e17db96e653Emil Velikov#endif
328c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz#include <errno.h>
338c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz#include <stdlib.h>
348c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz#include <string.h>
358c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz#include "internal.h"
368c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz
379042d72109d8ae448b8e0f23b93067cc37deff23Jakob Bornecrantzint kms_create(int fd, struct kms_driver **out)
389042d72109d8ae448b8e0f23b93067cc37deff23Jakob Bornecrantz{
39d920fa9d0b54873d53f03a006d0fe3df11136b74Jakob Bornecrantz	return linux_create(fd, out);
408c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz}
418c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz
428c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantzint kms_get_prop(struct kms_driver *kms, unsigned key, unsigned *out)
438c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz{
448c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz	switch (key) {
4544a0e0a099eeeb6501359f08449dcaa5e9899398Jakob Bornecrantz	case KMS_BO_TYPE:
468c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz		break;
478c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz	default:
488c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz		return -EINVAL;
498c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz	}
508c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz	return kms->get_prop(kms, key, out);
518c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz}
528c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz
53201f5795a26ae7b5580a35b24f4e89e5cd3455b1Jakob Bornecrantzint kms_destroy(struct kms_driver **kms)
548c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz{
55201f5795a26ae7b5580a35b24f4e89e5cd3455b1Jakob Bornecrantz	if (!(*kms))
56201f5795a26ae7b5580a35b24f4e89e5cd3455b1Jakob Bornecrantz		return 0;
57201f5795a26ae7b5580a35b24f4e89e5cd3455b1Jakob Bornecrantz
58201f5795a26ae7b5580a35b24f4e89e5cd3455b1Jakob Bornecrantz	free(*kms);
59201f5795a26ae7b5580a35b24f4e89e5cd3455b1Jakob Bornecrantz	*kms = NULL;
608c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz	return 0;
618c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz}
628c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz
638c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantzint kms_bo_create(struct kms_driver *kms, const unsigned *attr, struct kms_bo **out)
648c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz{
658c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz	unsigned width = 0;
668c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz	unsigned height = 0;
6744a0e0a099eeeb6501359f08449dcaa5e9899398Jakob Bornecrantz	enum kms_bo_type type = KMS_BO_TYPE_SCANOUT_X8R8G8B8;
688c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz	int i;
698c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz
708c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz	for (i = 0; attr[i];) {
718c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz		unsigned key = attr[i++];
728c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz		unsigned value = attr[i++];
738c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz
748c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz		switch (key) {
758c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz		case KMS_WIDTH:
768c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz			width = value;
778c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz			break;
788c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz		case KMS_HEIGHT:
798c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz			height = value;
808c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz			break;
818c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz		case KMS_BO_TYPE:
828c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz			type = value;
838c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz			break;
848c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz		default:
85aa4afdf0b3be20aa6037b64f90983ea0146b2893Laurent Pinchart			return -EINVAL;
868c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz		}
878c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz	}
888c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz
898c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz	if (width == 0 || height == 0)
908c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz		return -EINVAL;
918c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz
9244a0e0a099eeeb6501359f08449dcaa5e9899398Jakob Bornecrantz	/* XXX sanity check type */
9344a0e0a099eeeb6501359f08449dcaa5e9899398Jakob Bornecrantz
9444a0e0a099eeeb6501359f08449dcaa5e9899398Jakob Bornecrantz	if (type == KMS_BO_TYPE_CURSOR_64X64_A8R8G8B8 &&
9544a0e0a099eeeb6501359f08449dcaa5e9899398Jakob Bornecrantz	    (width != 64 || height != 64))
9644a0e0a099eeeb6501359f08449dcaa5e9899398Jakob Bornecrantz		return -EINVAL;
9744a0e0a099eeeb6501359f08449dcaa5e9899398Jakob Bornecrantz
988c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz	return kms->bo_create(kms, width, height, type, attr, out);
998c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz}
1008c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz
1018c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantzint kms_bo_get_prop(struct kms_bo *bo, unsigned key, unsigned *out)
1028c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz{
1038c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz	switch (key) {
1048c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz	case KMS_PITCH:
1058c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz		*out = bo->pitch;
1068c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz		break;
1078c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz	case KMS_HANDLE:
1088c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz		*out = bo->handle;
1098c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz		break;
1108c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz	default:
1118c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz		return -EINVAL;
1128c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz	}
1138c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz
1148c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz	return 0;
1158c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz}
1168c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz
1178c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantzint kms_bo_map(struct kms_bo *bo, void **out)
1188c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz{
1198c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz	return bo->kms->bo_map(bo, out);
1208c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz}
1218c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz
1228c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantzint kms_bo_unmap(struct kms_bo *bo)
1238c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz{
1248c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz	return bo->kms->bo_unmap(bo);
1258c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz}
1268c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz
127201f5795a26ae7b5580a35b24f4e89e5cd3455b1Jakob Bornecrantzint kms_bo_destroy(struct kms_bo **bo)
1288c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz{
129201f5795a26ae7b5580a35b24f4e89e5cd3455b1Jakob Bornecrantz	int ret;
130201f5795a26ae7b5580a35b24f4e89e5cd3455b1Jakob Bornecrantz
131201f5795a26ae7b5580a35b24f4e89e5cd3455b1Jakob Bornecrantz	if (!(*bo))
132201f5795a26ae7b5580a35b24f4e89e5cd3455b1Jakob Bornecrantz		return 0;
133201f5795a26ae7b5580a35b24f4e89e5cd3455b1Jakob Bornecrantz
134201f5795a26ae7b5580a35b24f4e89e5cd3455b1Jakob Bornecrantz	ret = (*bo)->kms->bo_destroy(*bo);
135201f5795a26ae7b5580a35b24f4e89e5cd3455b1Jakob Bornecrantz	if (ret)
136201f5795a26ae7b5580a35b24f4e89e5cd3455b1Jakob Bornecrantz		return ret;
137201f5795a26ae7b5580a35b24f4e89e5cd3455b1Jakob Bornecrantz
138201f5795a26ae7b5580a35b24f4e89e5cd3455b1Jakob Bornecrantz	*bo = NULL;
139201f5795a26ae7b5580a35b24f4e89e5cd3455b1Jakob Bornecrantz	return 0;
1408c0571a73399c372644c8d92a136a474f3e05d48Jakob Bornecrantz}
141