Each display driver allocates and initializes a phys_displays structure during configuration. The phys_displays structure is defined in the /usr/include/sys/display.h file. The display driver stores a pointer to the phys_displays structure in the display driver's devsw structure, which is then added to the device switch table. A pointer to the display driver's vtmstruct structure is initialized in the phys_displays structure when the display driver's vttact routine is called. The phys_displays structure is defined as follows:
struct phys_displays { /***********************************/ struct { /* data to set up interrupt call */ struct intr intr; /* at init time (i_init) */ long intr_args[4]; /* */ } interrupt_data; /***********************************/ struct phys_displays *same_level; /* other interrupts on same level */ struct phys_displays *next; /* ptr to next minor number data */ struct _gscDev *pGSC; /* device struct used by rcm */ dev_t devno; /* Device number of this adapter */ struct lft *lftanchor;/* lft subsystem */ int dds_length; /* length in bytes */ char *odmdds; /* ptr to define device structure */ struct display_info display_info; /* display information */ uchar disp_devid[4]; /* device information */ /* [1] = 04=display device */ /* [2] = 21=reserved 22=reserved */ /* 25=reserved 27=reserved */ /* 29=reserved */ /* [3] = 00=functional */ /* [4] = 01-04=adapter instance */ uchar usage; /* number of VT's using real screen */ /* used to prevent deletion of */ /* real screen from configuration */ /* if any VT is using it. */ uchar open_cnt; /* Open flag for display */ uchar display_mode; /* Actual state of the display, */ /* not the virtual terminal: */ /* KSR_MODE or MOM_MODE (see vt.h) */ uchar dma_characteristics; /* Attributes related to DMA ops */ # define DMA_SLAVE_DEV 1 /* Device is bus slave, ow. master */ struct font_data *default_font; /* Pointer to the default font for */ /* this display */ struct vtmstruc *visible_vt; /* Pointer to current vt active or */ /* pseudo-active on THIS display */ /***********************************/ /* DMA Data Areas */ /***********************************/ int dma_chan_id; /* channel id returned from d_init */ struct dma_bufs /* DMA buffer structure */ d_dma_area[MAXDMABUFS]; /* */ /***********************************/ /* Rendering Context Manager Areas */ /***********************************/ rcmProcPtr cur_rcm; /* Pointer to current rcm on this */ /* display */ int num_domains; /* number of domains */ int dwa_device; /* supports direct window access */ struct _bmr /* bus memory ranges */ busmemr[MAX_DOMAINS]; /* */ uint io_range; /* Used for MCA adapter only! */ /* low limit in high short */ /* high limit in low short */ /* to match IOCC register */ uint *free_area; /* area free for usage in a device */ /* dependent manner by the VDD */ /* for this real screen. */ #ifndef __64BIT_KERNEL #define RCM_ACC_METHOD_1 (0L) /* MCA and SGA bus adapters */ #endif #define RCM_ACC_METHOD_2 (1L) /* 60X and PCI bus adapters */ uint access_method; /* Access method flags */ #ifndef __64BIT_KERNEL #define RCM_RUBY_NO_MAP (1L) /* Tells RCM to not map the space */ #endif uint access_flags; /* Misc flags (used for Ruby now) */ uint reserved13[13]; int current_dpm_phase; /* current phase of DPM this display is in */ /* full-on=1, standby=2, suspend=3, off=4 */ #define DPMS_ON 0x1 #define DPMS_STANDBY 0x2 #define DPMS_SUSPEND 0x3 #define DPMS_OFF 0x4 int NumAddrRanges; rcmAddrRange *AddrRange; int reserved4; int (*reserved7)(); /***********************************/ /* VDD Function Pointers */ /***********************************/ int (*vttpwrphase)(); /* power management phase change */ /* function. It's device dependent */ int (*vttact)(); /* Activate the display */ int (*vttcfl)(); /* Move lines around */ int (*vttclr)(); /* Clear a box on screen */ int (*vttcpl)(); /* Copy a part of the line */ int (*vttdact)(); /* Mark the terminal as being */ /* deactivated */ int (*vttddf)(); /* Device dependent functions */ /* i.e. Pacing, context support */ int (*vttdefc)(); /* Change the cursor shape */ int (*vttdma)(); /* Issue dma operation */ int (*vttdma_setup)(); /* Setup dma */ int (*vttterm)(); /* Free any resources used */ /* by this VT */ int (*vttinit)(); /* setup new logical terminal */ int (*vttmovc)(); /* Move the cursor to the */ /* position indicated */ int (*vttrds)(); /* Read a line segment */ int (*vtttext)(); /* Write a string of chars */ int (*vttscr)(); /* Scroll text on the VT */ int (*vttsetm)(); /* Set mode to KSR or MOM */ int (*vttstct)(); /* Change color mappings */ int (*reserved5)(); /* Despite its name, this field is */ /* used for kdb debug */ int (*bind_draw_read_windows)(); /***********************************/ /* RCM Function Pointers */ /***********************************/ int (*make_gp)(); /* Make a graphics process */ int (*unmake_gp)(); /* Unmake a graphics process */ int (*state_change)(); /* State change handler invoked */ int (*update_read_win_geom)(); int (*create_rcx)(); /* Create a hardware context */ int (*delete_rcx)(); /* Delete a hardware context */ #ifdef __64BIT_KERNEL int (*reserved21)(); int (*reserved22)(); int (*reserved23)(); int (*reserved24)(); #else int (*create_rcxp)(); /* Create a context part */ int (*delete_rcxp)(); /* Delete a context part */ int (*associate_rcxp)(); /* Link a part to a context */ int (*disassociate_rcxp)(); /* Unlink a part from a context */ #endif int (*create_win_geom)(); /* Create a window on the screen */ int (*delete_win_geom)(); /* Delete a window on the screen */ int (*update_win_geom)(); /* Update a window on the screen */ #ifdef __64BIT_KERNEL int (*reserved25)(); int (*reserved26)(); int (*reserved27)(); #else int (*create_win_attr)(); /* Create a window on the screen */ int (*delete_win_attr)(); /* Delete a window on the screen */ int (*update_win_attr)(); /* Update a window on the screen */ #endif int (*bind_window)(); /* Update a window bound to rcx */ int (*start_switch)(); /* Start a context switch */ /* Note: This routine runs on */ /* the interrupt level */ int (*end_switch)(); /* Finish the context switch */ /* started by start_switch() */ #ifdef __64BIT_KERNEL int (*reserved28)(); int (*reserved29)(); int (*reserved30)(); int (*reserved31)(); #else int (*check_dev)(); /* Check if this address beints */ /* to this device. */ /* Note: this is run on interrupt */ /* level. */ int (*async_mask)(); /* Set async events reporting */ int (*sync_mask)(); /* Set sync events reporting */ int (*enable_event)(); /* Turns adapter function on */ /* without reports to application */ #endif int (*create_thread)(); /* Make a graphics thread */ int (*delete_thread)(); /* Delete a graphics thread */ void (*give_up_time_slice)(); /* Relinquish remaining time */ #ifdef __64BIT_KERNEL int (*reserved32)(); #else int (*diag_svc)(); /* Diagnostics Services (DMA) */ #endif int (*dev_init)(); /* Device dep. initialization */ #ifdef __64BIT_KERNEL int (*reserved33)(); #else int (*dev_term)(); /* Device dep. cleanup */ #endif /***********************************/ /* Font Support Function Pointers */ /***********************************/ #ifdef __64BIT_KERNEL int (*reserved34)(); #else int (*pinned_font_ready)(); #endif int (*vttddf_fast)(); /* fast ddf functions */ ushort bus_type; /* indicates what type of bus */ #ifndef __64BIT_KERNEL # define DISP_BUS_MCA 0x8000/* Microchannel */ # define DISP_BUS_SGA 0x4000/* currently not used */ # define DISP_BUS_PPC 0x2000/* processor bus */ # define DISP_PLANAR 0x0800/* planar registers */ #endif # define DISP_BUS_PCI 0x1000/* PCI bus */ ushort flags; /* physical display flags */ # define GS_DD_DOES_AS_ATT(1L << 0)/* no as_att() by RCM */ /* not currently used */ # define GS_BUS_AUTH_CONTROL(1L << 1)/* Request bus access ctrl */ # define GS_HAS_INTERRUPT_HANDLER (1L << 2)/* 1 after i_init() */ /* 0 after i_clear() */ /* not currently used */ # define GS_DD_SUPPORTS_MP (1L << 3) uint reserved11[5]; /* not used */ int ear; /* image for EAR reg (xferdata) if !0 */ uint spares[18]; /* not used - for future development */ };
lft Structure.
lft_dds Structure.
vtmstruct Structure.