1/*
2 * Copyright 2005-2009, Axel D��rfler, axeld@pinc-software.de.
3 * Copyright 2016, Jessica Hamilton, jessica.l.hamilton@gmail.com.
4 * Distributed under the terms of the MIT License.
5 */
6
7
8#include <OS.h>
9#include <KernelExport.h>
10#include <SupportDefs.h>
11#include <PCI.h>
12#include <frame_buffer_console.h>
13#include <boot_item.h>
14#include <vesa_info.h>
15
16#include <stdlib.h>
17#include <stdio.h>
18#include <string.h>
19#include <malloc.h>
20
21#include "driver.h"
22#include "device.h"
23
24
25#define TRACE_DRIVER
26#ifdef TRACE_DRIVER
27#	define TRACE(x) dprintf x
28#else
29#	define TRACE(x) ;
30#endif
31
32#define MAX_CARDS 1
33
34
35int32 api_version = B_CUR_DRIVER_API_VERSION;
36
37char* gDeviceNames[MAX_CARDS + 1];
38framebuffer_info* gDeviceInfo[MAX_CARDS];
39mutex gLock;
40
41
42extern "C" const char**
43publish_devices(void)
44{
45	TRACE((DEVICE_NAME ": publish_devices()\n"));
46	return (const char**)gDeviceNames;
47}
48
49
50extern "C" status_t
51init_hardware(void)
52{
53	TRACE((DEVICE_NAME ": init_hardware()\n"));
54
55	// If we don't have a VESA mode list, then we are a dumb
56	// framebuffer, e.g. when there are no drivers available
57	// on a UEFI system.
58	return (get_boot_item(VESA_MODES_BOOT_INFO, NULL) == NULL
59			&& get_boot_item(FRAME_BUFFER_BOOT_INFO, NULL) != NULL)
60		? B_OK : B_ERROR;
61}
62
63
64extern "C" status_t
65init_driver(void)
66{
67	TRACE((DEVICE_NAME ": init_driver()\n"));
68
69	gDeviceInfo[0] = (framebuffer_info*)malloc(sizeof(framebuffer_info));
70	if (gDeviceInfo[0] == NULL)
71		return B_NO_MEMORY;
72
73	memset(gDeviceInfo[0], 0, sizeof(framebuffer_info));
74
75	gDeviceNames[0] = strdup("graphics/framebuffer");
76	if (gDeviceNames[0] == NULL) {
77		free(gDeviceNames[0]);
78		return B_NO_MEMORY;
79	}
80
81	gDeviceNames[1] = NULL;
82
83	mutex_init(&gLock, "framebuffer lock");
84	return B_OK;
85}
86
87
88extern "C" void
89uninit_driver(void)
90{
91	TRACE((DEVICE_NAME ": uninit_driver()\n"));
92
93	mutex_destroy(&gLock);
94
95	// free device related structures
96	char* name;
97	for (int32 index = 0; (name = gDeviceNames[index]) != NULL; index++) {
98		free(gDeviceInfo[index]);
99		free(name);
100	}
101}
102
103
104extern "C" device_hooks*
105find_device(const char* name)
106{
107	int index;
108
109	TRACE((DEVICE_NAME ": find_device()\n"));
110
111	for (index = 0; gDeviceNames[index] != NULL; index++) {
112		if (!strcmp(name, gDeviceNames[index]))
113			return &gDeviceHooks;
114	}
115
116	return NULL;
117}
118
119