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];
38vesa_info* gDeviceInfo[MAX_CARDS];
39isa_module_info* gISA;
40mutex gLock;
41
42
43extern "C" const char**
44publish_devices(void)
45{
46	TRACE((DEVICE_NAME ": publish_devices()\n"));
47	return (const char**)gDeviceNames;
48}
49
50
51extern "C" status_t
52init_hardware(void)
53{
54	TRACE((DEVICE_NAME ": init_hardware()\n"));
55
56	// If we don't have the VESA mode info, then we have a
57	// dumb framebuffer, in which case we bail, and leave it
58	// up to the framebuffer driver to handle.
59	return (get_boot_item(VESA_MODES_BOOT_INFO, NULL) != NULL
60			&& get_boot_item(FRAME_BUFFER_BOOT_INFO, NULL) != NULL)
61		? B_OK : B_ERROR;
62}
63
64
65extern "C" status_t
66init_driver(void)
67{
68	TRACE((DEVICE_NAME ": init_driver()\n"));
69
70	gDeviceInfo[0] = (vesa_info*)malloc(sizeof(vesa_info));
71	if (gDeviceInfo[0] == NULL)
72		return B_NO_MEMORY;
73
74	memset(gDeviceInfo[0], 0, sizeof(vesa_info));
75
76	status_t status;
77
78	// ISA may not be available on all architectures
79	status = get_module(B_ISA_MODULE_NAME, (module_info**)&gISA);
80	if (status != B_OK) {
81		TRACE((DEVICE_NAME ": ISA bus unavailable\n"));
82		gISA = NULL;
83	}
84
85	gDeviceNames[0] = strdup("graphics/vesa");
86	if (gDeviceNames[0] == NULL) {
87		status = B_NO_MEMORY;
88		goto err;
89	}
90
91	gDeviceNames[1] = NULL;
92
93	mutex_init(&gLock, "vesa lock");
94	return B_OK;
95
96err:
97	put_module(B_ISA_MODULE_NAME);
98	free(gDeviceInfo[0]);
99	return status;
100}
101
102
103extern "C" void
104uninit_driver(void)
105{
106	TRACE((DEVICE_NAME ": uninit_driver()\n"));
107
108	put_module(B_ISA_MODULE_NAME);
109	mutex_destroy(&gLock);
110
111	// free device related structures
112	char* name;
113	for (int32 index = 0; (name = gDeviceNames[index]) != NULL; index++) {
114		free(gDeviceInfo[index]);
115		free(name);
116	}
117}
118
119
120extern "C" device_hooks*
121find_device(const char* name)
122{
123	int index;
124
125	TRACE((DEVICE_NAME ": find_device()\n"));
126
127	for (index = 0; gDeviceNames[index] != NULL; index++) {
128		if (!strcmp(name, gDeviceNames[index]))
129			return &gDeviceHooks;
130	}
131
132	return NULL;
133}
134
135