mirror of
https://github.com/phabrics/Run-Sun3-SunOS-4.1.1.git
synced 2026-04-29 11:02:59 -04:00
246 lines
8.8 KiB
C
246 lines
8.8 KiB
C
/* $Id: sun-fb.h,v 1.4 2009/11/08 17:02:39 fredette Exp $ */
|
|
|
|
/* machine/sun/sun-fb.h - header file for Sun framebuffer emulation: */
|
|
|
|
/*
|
|
* Copyright (c) 2004, 2006 Matt Fredette
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* 3. All advertising materials mentioning features or use of this software
|
|
* must display the following acknowledgement:
|
|
* This product includes software developed by Matt Fredette.
|
|
* 4. The name of the author may not be used to endorse or promote products
|
|
* derived from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
* DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
#ifndef _MACHINE_SUN_FB_H
|
|
#define _MACHINE_SUN_FB_H
|
|
|
|
#include <tme/common.h>
|
|
_TME_RCSID("$Id: sun-fb.h,v 1.4 2009/11/08 17:02:39 fredette Exp $");
|
|
|
|
/* includes: */
|
|
#include <tme/generic/bus.h>
|
|
#include <tme/generic/bus-device.h>
|
|
#include <tme/generic/fb.h>
|
|
#include <tme/ic/bt458.h>
|
|
#include <tme/completion.h>
|
|
|
|
/* macros: */
|
|
|
|
/* Sun framebuffer sizes: */
|
|
/* NB: TME_SUNFB_SIZE_1152_900 should be first, since whatever size is
|
|
first is what most framebuffers will default to: */
|
|
#define TME_SUNFB_SIZE_NULL (0)
|
|
#define TME_SUNFB_SIZE_1152_900 TME_BIT(0)
|
|
#define TME_SUNFB_SIZE_1024_1024 TME_BIT(1)
|
|
#define TME_SUNFB_SIZE_1280_1024 TME_BIT(2)
|
|
#define TME_SUNFB_SIZE_1600_1280 TME_BIT(3)
|
|
#define TME_SUNFB_SIZE_1440_1440 TME_BIT(4)
|
|
#define TME_SUNFB_SIZE_1024_768 TME_BIT(5)
|
|
#define TME_SUNFB_SIZE_640_480 TME_BIT(6)
|
|
|
|
/* P4 register framebuffer identifiers: */
|
|
#define TME_SUNFB_P4_ID_MASK (0xf0000000)
|
|
#define TME_SUNFB_P4_ID_BWTWO (0x00000000)
|
|
#define TME_SUNFB_P4_ID_CGFOUR (0x40000000)
|
|
#define TME_SUNFB_P4_ID_CGEIGHT (0x45000000)
|
|
#define TME_SUNFB_P4_ID_CGSIX (0x60000000)
|
|
|
|
/* offsets in many P4 framebuffers: */
|
|
#define TME_SUNFB_P4_OFFSET_P4 (0x00000000)
|
|
#define TME_SUNFB_P4_OFFSET_BITMAP (0x00100000)
|
|
|
|
/* offsets in many S4 framebuffers: */
|
|
#define TME_SUNFB_S4_OFFSET_REGS (0x00400000)
|
|
#define TME_SUNFB_S4_OFFSET_MEMORY (0x00800000)
|
|
|
|
/* flags: */
|
|
#define TME_SUNFB_FLAG_BT458_CMAP_PACKED TME_BIT(0)
|
|
#define TME_SUNFB_FLAG_BT458_BYTE_D0_D7 (0)
|
|
#define TME_SUNFB_FLAG_BT458_BYTE_D24_D31 TME_BIT(1)
|
|
|
|
/* callout flags: */
|
|
#define TME_SUNFB_CALLOUT_RUNNING TME_BIT(0)
|
|
#define TME_SUNFB_CALLOUTS_MASK (-2)
|
|
#define TME_SUNFB_CALLOUT_MODE_CHANGE TME_BIT(1)
|
|
#define TME_SUNFB_CALLOUT_INT TME_BIT(2)
|
|
|
|
/* the maximum number of bus subregions for registers that a Sun
|
|
framebuffer can have: */
|
|
#define TME_SUNFB_BUS_SUBREGIONS_MAX (8)
|
|
|
|
/* the log handle: */
|
|
#define TME_SUNFB_LOG_HANDLE(sunfb) (&(sunfb)->tme_sunfb_element->tme_element_log_handle)
|
|
|
|
#define TME_SUNFB_BUS_TRANSITION (1)
|
|
|
|
/* a Sun framebuffer: */
|
|
struct tme_sunfb {
|
|
|
|
/* our simple bus device header: */
|
|
struct tme_bus_device tme_sunfb_device;
|
|
#define tme_sunfb_element tme_sunfb_device.tme_bus_device_element
|
|
|
|
/* the mutex protecting the card: */
|
|
tme_mutex_t tme_sunfb_mutex;
|
|
|
|
/* the rwlock protecting the card: */
|
|
tme_rwlock_t tme_sunfb_rwlock;
|
|
|
|
/* the framebuffer connection: */
|
|
struct tme_fb_connection *tme_sunfb_fb_connection;
|
|
|
|
/* more bus subregions: */
|
|
struct tme_bus_subregion tme_sunfb_bus_subregions[TME_SUNFB_BUS_SUBREGIONS_MAX];
|
|
|
|
/* bus cycle handlers for the subregions: */
|
|
tme_bus_cycle_handler tme_sunfb_bus_handlers[TME_SUNFB_BUS_SUBREGIONS_MAX];
|
|
|
|
/* some of the bus subregions have specific purposes: */
|
|
#define tme_sunfb_bus_subregion_memory tme_sunfb_device.tme_bus_device_subregions
|
|
#define tme_sunfb_bus_subregion_regs tme_sunfb_bus_subregions[0]
|
|
#define tme_sunfb_bus_handler_regs tme_sunfb_bus_handlers[0]
|
|
|
|
/* the class of the framebuffer: */
|
|
unsigned int tme_sunfb_class;
|
|
|
|
/* the depth of the framebuffer: */
|
|
unsigned int tme_sunfb_depth;
|
|
|
|
/* the size of the framebuffer: */
|
|
tme_uint32_t tme_sunfb_size;
|
|
|
|
/* framebuffer flags: */
|
|
tme_uint32_t tme_sunfb_flags;
|
|
|
|
/* the callout flags: */
|
|
int tme_sunfb_callout_flags;
|
|
|
|
/* this is nonzero if the interrupt is asserted: */
|
|
int tme_sunfb_int_asserted;
|
|
|
|
/* the callout thread condition: */
|
|
tme_cond_t tme_sunfb_callout_cond;
|
|
|
|
/* the (relative) bus address of the last byte of displayed
|
|
framebuffer memory: */
|
|
tme_bus_addr32_t tme_sunfb_memory_address_last_displayed;
|
|
|
|
/* the memory. usually, this memory is displayed directly, but this
|
|
won't be the case when there is an overlay plane, for example: */
|
|
tme_uint8_t *tme_sunfb_memory;
|
|
|
|
/* any memory pad: */
|
|
tme_uint8_t *tme_sunfb_memory_pad;
|
|
|
|
/* a framebuffer memory update function: */
|
|
int (*tme_sunfb_memory_update)(struct tme_fb_connection *conn_fb);
|
|
|
|
/* this forces the next update to be a full one: */
|
|
void (*tme_sunfb_update_full) _TME_P((struct tme_sunfb *));
|
|
|
|
/* the token for one outstanding writable TLB entry: */
|
|
struct tme_token *tme_sunfb_tlb_token;
|
|
|
|
/* the offsets of the first and last bytes updated in the real
|
|
framebuffer memory: */
|
|
tme_uint32_t tme_sunfb_offset_updated_first;
|
|
tme_uint32_t tme_sunfb_offset_updated_last;
|
|
|
|
/* these are used for index-mapping pixel values or pixel subfield
|
|
values to intensities, or vice-versa. if these are NULL,
|
|
everything is linearly mapped: */
|
|
void *tme_sunfb_cmap_primaries[3];
|
|
#define tme_sunfb_cmap_g tme_sunfb_cmap_primaries[0]
|
|
#define tme_sunfb_cmap_r tme_sunfb_cmap_primaries[1]
|
|
#define tme_sunfb_cmap_b tme_sunfb_cmap_primaries[2]
|
|
|
|
/* a P4 register: */
|
|
tme_uint32_t tme_sunfb_p4;
|
|
|
|
/* many Sun 8-bit framebuffers use the Brooktree Bt458 RAMDAC: */
|
|
struct tme_bt458 tme_sunfb_bt458;
|
|
|
|
/* S4 basic registers: */
|
|
struct {
|
|
tme_uint8_t tme_sunfb_s4_regs_control;
|
|
#define tme_sunfb_s4_regs_first tme_sunfb_s4_regs_control
|
|
tme_uint8_t tme_sunfb_s4_regs_status;
|
|
tme_uint8_t tme_sunfb_s4_regs_cursor_start;
|
|
tme_uint8_t tme_sunfb_s4_regs_cursor_end;
|
|
tme_uint8_t tme_sunfb_s4_regs_h_blank_set;
|
|
tme_uint8_t tme_sunfb_s4_regs_h_blank_clear;
|
|
tme_uint8_t tme_sunfb_s4_regs_h_sync_set;
|
|
tme_uint8_t tme_sunfb_s4_regs_h_sync_clear;
|
|
tme_uint8_t tme_sunfb_s4_regs_comp_sync_clear;
|
|
tme_uint8_t tme_sunfb_s4_regs_v_blank_set_high;
|
|
tme_uint8_t tme_sunfb_s4_regs_v_blank_set_low;
|
|
tme_uint8_t tme_sunfb_s4_regs_v_blank_clear;
|
|
tme_uint8_t tme_sunfb_s4_regs_v_sync_set;
|
|
tme_uint8_t tme_sunfb_s4_regs_v_sync_clear;
|
|
tme_uint8_t tme_sunfb_s4_regs_xfer_holdoff_set;
|
|
tme_uint8_t tme_sunfb_s4_regs_xfer_holdoff_clear;
|
|
} tme_sunfb_s4_regs;
|
|
|
|
/* if the given type is valid, it returns NULL and updates the
|
|
framebuffer structure, else it returns a string of valid types: */
|
|
const char *(*tme_sunfb_type_set) _TME_P((struct tme_sunfb *, const char *));
|
|
|
|
/* any interrupt signal: */
|
|
tme_uint32_t tme_sunfb_bus_signal_int;
|
|
};
|
|
|
|
/* prototypes: */
|
|
|
|
/* miscellaneous: */
|
|
tme_uint32_t tme_sunfb_size _TME_P((const char *));
|
|
tme_uint32_t tme_sunfb_size_width _TME_P((tme_uint32_t));
|
|
tme_uint32_t tme_sunfb_size_height _TME_P((tme_uint32_t));
|
|
|
|
/* this creates a new Sun framebuffer: */
|
|
int tme_sunfb_new(struct tme_sunfb *sunfb, const char * const *args, char **_output);
|
|
|
|
/* some standard register bus cycle handlers: */
|
|
int tme_sunfb_bus_cycle_p4 _TME_P((void *, struct tme_bus_cycle *));
|
|
int tme_sunfb_bus_cycle_s4 _TME_P((void *, struct tme_bus_cycle *));
|
|
int tme_sunfb_bus_cycle_bt458 _TME_P((void *, struct tme_bus_cycle *));
|
|
|
|
/* this is called before the framebuffer's display is updated: */
|
|
int tme_sunfb_memory_update _TME_P((struct tme_fb_connection *));
|
|
|
|
#if TME_SUNFB_BUS_TRANSITION
|
|
|
|
/* this is the bus cycle transition glue: */
|
|
struct tme_completion;
|
|
int tme_sunfb_bus_cycle_transition _TME_P((void *,
|
|
struct tme_bus_cycle *,
|
|
void (*) _TME_P((struct tme_sunfb *,
|
|
struct tme_bus_cycle *,
|
|
tme_uint32_t *,
|
|
struct tme_completion *))));
|
|
|
|
#endif /* TME_SUNFB_BUS_TRANSITION */
|
|
|
|
#endif /* !_MACHINE_SUN_FB_H */
|