/*      $NetBSD: stivar.h,v 1.12 2024/12/16 08:56:25 macallan Exp $     */

/*      $OpenBSD: stivar.h,v 1.24 2009/02/06 22:51:04 miod Exp $        */

/*
* Copyright (c) 2000-2003 Michael Shalayeff
* 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.
*
* 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 OR HIS RELATIVES 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 MIND, 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 _IC_STIVAR_H_
#define _IC_STIVAR_H_

struct sti_softc;

/*
* STI ROM information - one per device
*/
struct sti_rom {
       struct sti_softc        *rom_softc;     /* backpointer to device */
       int                      rom_devtype;

       bus_space_tag_t          iot, memt;     /* XXX iot unused */
       bus_space_handle_t       romh;
       bus_space_handle_t       regh[STI_REGION_MAX];
       bus_addr_t              *bases;

       struct sti_dd            rom_dd;        /* in word format */
       vaddr_t                  rom_code;

       /*
        * ROM-provided function pointers
        */
       sti_init_t               init;
       sti_mgmt_t               mgmt;
       sti_unpmv_t              unpmv;
       sti_blkmv_t              blkmv;
       sti_test_t               test;
       sti_exhdl_t              exhdl;
       sti_inqconf_t            inqconf;
       sti_scment_t             scment;
       sti_dmac_t               dmac;
       sti_flowc_t              flowc;
       sti_utiming_t            utiming;
       sti_pmgr_t               pmgr;
       sti_util_t               util;
};

/*
* STI screen information - one per head
*/
struct sti_screen {
       struct sti_rom          *scr_rom;

#ifdef notyet
       u_int                    scr_flags;
#endif

       int                      scr_bpp;

       struct sti_font          scr_curfont;
       struct sti_cfg           scr_cfg;
       struct sti_ecfg          scr_ecfg;
       char                     name[STI_DEVNAME_LEN];

       void                    *scr_romfont;   /* ROM font copy in memory... */
       u_int                    scr_fontmaxcol;/* ...or in off-screen area */
       u_int                    scr_fontbase;

       uint8_t                  scr_rcmap[STI_NCMAP],
                                scr_gcmap[STI_NCMAP],
                                scr_bcmap[STI_NCMAP];

       uint16_t                 fbheight, fbwidth;
       uint16_t                 oheight, owidth;       /* offscreen size */
       bus_addr_t               fbaddr;
       bus_size_t               fblen;

       /* wsdisplay information */
       int                      scr_nscreens;
       u_int                    scr_wsmode;
       struct  wsscreen_descr   scr_wsd;
       const struct wsscreen_descr     *scr_scrlist[1];
       struct  wsscreen_list    scr_screenlist;

       /*
        * Board-specific function data and pointers
        */
       void                    (*setupfb)(struct sti_screen *);
       int                     (*putcmap)(struct sti_screen *, u_int, u_int);

       uint32_t                reg10_value;
       uint32_t                reg12_value;
       bus_addr_t              cmap_finish_register;
};

/*
* STI device state
*/
struct sti_softc {
       device_t sc_dev;
#if notyet
       void *sc_ih;
#endif

       u_int                   sc_flags;
#define STI_CONSOLE     0x0001  /* first head is console... */
#define STI_ATTACHED    0x0002  /* ... and wsdisplay_cnattach() has been done */
#define STI_ROM_ENABLED 0x0004  /* PCI ROM is enabled */

       bus_addr_t              bases[STI_REGION_MAX];
       struct sti_rom          *sc_rom;
       struct sti_screen       *sc_scr;

       /* optional, required for PCI */
       void                    (*sc_enable_rom)(struct sti_softc *);
       void                    (*sc_disable_rom)(struct sti_softc *);
};

/*
* this maps 0xa0 - 0xff from ISO8859-1 to HP Roman 8
* 0x00-0x7f are identical, 0x80-0x9f are empty
*/
extern const uint8_t sti_unitoroman[];

int     sti_attach_common(struct sti_softc *, bus_space_tag_t, bus_space_tag_t,
           bus_space_handle_t, u_int);
int     sti_cnattach(struct sti_rom *, struct sti_screen *, bus_space_tag_t,
           bus_addr_t *, u_int);
void    sti_describe(struct sti_softc *);
void    sti_end_attach(struct sti_softc *);
u_int   sti_rom_size(bus_space_tag_t, bus_space_handle_t);

int     sti_init(struct sti_screen *, int);
#define STI_TEXTMODE    0x01
#define STI_CLEARSCR    0x02
#define STI_FBMODE      0x04
int     sti_ioctl(void *, void *, u_long, void *, int, struct lwp *);
paddr_t sti_mmap(void *, void *, off_t, int);
int     sti_alloc_screen(void *, const struct wsscreen_descr *,
           void **, int *, int *, long *);
void    sti_free_screen(void *, void *);
int     sti_show_screen(void *, void *, int, void (*cb)(void *, int, int),
           void *);
int     sti_load_font(void *, void *, struct wsdisplay_font *);

int     sti_cnattach(struct sti_rom *, struct sti_screen *, bus_space_tag_t,
           bus_addr_t *, u_int);

#endif /* _IC_STIVAR_H_ */