Home | History | Annotate | Line # | Download | only in pci
      1 /* $NetBSD: radeonfbvar.h,v 1.23 2023/07/23 21:06:52 andvar Exp $ */
      2 
      3 /*-
      4  * Copyright (c) 2006 Itronix Inc.
      5  * All rights reserved.
      6  *
      7  * Written by Garrett D'Amore for Itronix Inc.
      8  *
      9  * Redistribution and use in source and binary forms, with or without
     10  * modification, are permitted provided that the following conditions
     11  * are met:
     12  * 1. Redistributions of source code must retain the above copyright
     13  *    notice, this list of conditions and the following disclaimer.
     14  * 2. Redistributions in binary form must reproduce the above copyright
     15  *    notice, this list of conditions and the following disclaimer in the
     16  *    documentation and/or other materials provided with the distribution.
     17  * 3. The name of Itronix Inc. may not be used to endorse
     18  *    or promote products derived from this software without specific
     19  *    prior written permission.
     20  *
     21  * THIS SOFTWARE IS PROVIDED BY ITRONIX INC. ``AS IS'' AND
     22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     23  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     24  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL ITRONIX INC. BE LIABLE FOR ANY
     25  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     26  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     27  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
     28  * ON ANY THEORY OF LIABILITY, WHETHER IN
     29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     31  * POSSIBILITY OF SUCH DAMAGE.
     32  */
     33 
     34 /*
     35  * ATI Technologies Inc. ("ATI") has not assisted in the creation of, and
     36  * does not endorse, this software.  ATI will not be responsible or liable
     37  * for any actual or alleged damage or loss caused by or in connection with
     38  * the use of or reliance on this software.
     39  */
     40 
     41 #ifndef _DEV_PCI_RADEONFBVAR_H
     42 #define	_DEV_PCI_RADEONFBVAR_H
     43 
     44 #include "opt_splash.h"
     45 
     46 #include <sys/param.h>
     47 #include <sys/types.h>
     48 #include <sys/device.h>
     49 #include <sys/callout.h>
     50 #include <dev/pci/pcivar.h>
     51 #include <dev/wscons/wsdisplayvar.h>
     52 #include <dev/wscons/wsconsio.h>
     53 #include <dev/wsfont/wsfont.h>
     54 #include <dev/rasops/rasops.h>
     55 #include <dev/wscons/wsdisplay_vconsvar.h>
     56 #include <dev/wscons/wsdisplay_glyphcachevar.h>
     57 #include <dev/videomode/videomode.h>
     58 #include <dev/videomode/edidvar.h>
     59 #ifdef SPLASHSCREEN
     60 #include <dev/splash/splash.h>
     61 #endif
     62 #include <dev/i2c/i2cvar.h>
     63 
     64 /* XXX: change this when we complete the support for multi HEAD */
     65 #define	RADEON_NDISPLAYS	(1)
     66 #define	RADEON_MAXX		(2048)
     67 #define	RADEON_MAXY		(1536)
     68 #define	RADEON_MAXBPP		(32)
     69 #define	RADEON_STRIDEALIGN	(64)
     70 #define	RADEON_CURSORMAXX	(64)
     71 #define	RADEON_CURSORMAXY	(64)
     72 #define	RADEON_PANINCREMENT	(1)
     73 
     74 struct radeonfb_softc;
     75 
     76 struct radeonfb_port {
     77 	int			rp_number;
     78 	int			rp_mon_type;
     79 	int			rp_conn_type;
     80 	int			rp_dac_type;
     81 	int			rp_ddc_type;
     82 	int			rp_tmds_type;
     83 	int			rp_edid_valid;
     84 	struct edid_info	rp_edid;
     85 };
     86 
     87 /* connector values used by legacy bios */
     88 #define	RADEON_CONN_NONE	0
     89 #define	RADEON_CONN_PROPRIETARY	1	/* think LVDS ribbon cable */
     90 #define	RADEON_CONN_CRT		2
     91 #define	RADEON_CONN_DVI_I	3
     92 #define	RADEON_CONN_DVI_D	4
     93 #define	RADEON_CONN_CTV		5
     94 #define	RADEON_CONN_STV		6
     95 #define	RADEON_CONN_UNSUPPORTED	7
     96 
     97 /* connector values used by atom bios */
     98 #define	ATOM_CONN_NONE		0
     99 #define	ATOM_CONN_VGA		1
    100 #define	ATOM_CONN_DVI_I		2
    101 #define	ATOM_CONN_DVI_D		3
    102 #define	ATOM_CONN_DVI_A		4
    103 #define	ATOM_CONN_STV		5
    104 #define	ATOM_CONN_CTV		6
    105 #define	ATOM_CONN_LVDS		7
    106 #define	ATOM_CONN_DIGITAL	8
    107 #define	ATOM_CONN_UNSUPPORTED	9
    108 
    109 #define	RADEON_DDC_NONE		0
    110 #define	RADEON_DDC_MONID	1
    111 #define	RADEON_DDC_DVI		2
    112 #define	RADEON_DDC_VGA		3
    113 #define	RADEON_DDC_CRT2		4
    114 
    115 #define	RADEON_DAC_UNKNOWN	-1
    116 #define	RADEON_DAC_PRIMARY	0
    117 #define	RADEON_DAC_TVDAC	1
    118 
    119 #define	RADEON_TMDS_UNKNOWN	-1
    120 #define	RADEON_TMDS_INT		0
    121 #define	RADEON_TMDS_EXT		1
    122 
    123 #define	RADEON_MT_UNKNOWN	-1
    124 #define	RADEON_MT_NONE		0
    125 #define	RADEON_MT_CRT		1
    126 #define	RADEON_MT_LCD		2	/* LVDS */
    127 #define	RADEON_MT_DFP		3	/* TMDS */
    128 #define	RADEON_MT_CTV		4
    129 #define	RADEON_MT_STV		5
    130 
    131 struct radeonfb_i2c {
    132 	struct radeonfb_softc	*ric_softc;
    133 	int			ric_register;
    134 	struct i2c_controller	ric_controller;
    135 };
    136 
    137 struct radeonfb_crtc {
    138 	int			rc_number;
    139 	struct videomode	rc_videomode;
    140 	uint16_t		rc_xoffset;
    141 	uint16_t		rc_yoffset;
    142 
    143 	struct radeonfb_port	*rc_port;
    144 };
    145 
    146 struct radeonfb_cursor {
    147 	int			rc_visible;
    148 	struct wsdisplay_curpos	rc_pos;
    149 	struct wsdisplay_curpos	rc_hot;
    150 	struct wsdisplay_curpos	rc_size;
    151 	uint32_t		rc_cmap[2];
    152 	uint8_t			rc_image[512];	/* 64x64x1 bit */
    153 	uint8_t			rc_mask[512];	/* 64x64x1 bit */
    154 };
    155 
    156 struct radeonfb_display {
    157 	struct radeonfb_softc	*rd_softc;
    158 	int			rd_number;	/* 0 .. RADEON_NDISPLAYS */
    159 
    160 	bus_size_t		rd_offset;	/* offset within FB memory */
    161 	vaddr_t			rd_fbptr;	/* framebuffer pointer */
    162 	vaddr_t			rd_curptr;	/* cursor data pointer */
    163 	size_t			rd_curoff;	/* cursor offset */
    164 
    165 	uint16_t		rd_bpp;
    166 	uint16_t		rd_virtx;
    167 	uint16_t		rd_virty;
    168 	uint16_t		rd_stride;
    169 	uint16_t		rd_format;	/* chip pixel format */
    170 
    171 	uint16_t		rd_xoffset;
    172 	uint16_t		rd_yoffset;
    173 
    174 	uint32_t		rd_bg;		/* background */
    175 	bool			rd_console;
    176 
    177 	struct callout          rd_bl_lvds_co;  /* delayed lvds operation */
    178 	uint32_t                rd_bl_lvds_val; /* value of delayed lvds */
    179 	int			rd_bl_on;
    180 	int			rd_bl_level;
    181 
    182 	int			rd_wsmode;
    183 
    184 	int			rd_ncrtcs;
    185 	struct radeonfb_crtc	rd_crtcs[2];
    186 
    187 	struct radeonfb_cursor	rd_cursor, rd_tempcursor;
    188 	/* XXX: this should probably be an array for CRTCs */
    189 	//struct videomode	rd_videomode;
    190 
    191 	struct wsscreen_list	rd_wsscreenlist;
    192 	struct wsscreen_descr	rd_wsscreens_storage[1];
    193 	struct wsscreen_descr	*rd_wsscreens;
    194 	struct vcons_screen	rd_vscreen;
    195 	struct vcons_data	rd_vd;
    196 	void (*rd_putchar)(void *, int, int, u_int, long);
    197 	glyphcache		rd_gc;
    198 
    199 	uint8_t			rd_cmap_red[256];
    200 	uint8_t			rd_cmap_green[256];
    201 	uint8_t			rd_cmap_blue[256];
    202 
    203 #ifdef SPLASHSCREEN
    204 	struct splash_info	rd_splash;
    205 #endif
    206 };
    207 
    208 struct radeon_tmds_pll {
    209 	uint32_t		rtp_freq;
    210 	uint32_t		rtp_pll;
    211 };
    212 
    213 struct radeonfb_softc {
    214 	device_t		sc_dev;
    215 	uint16_t		sc_family;
    216 	uint16_t		sc_flags;
    217 	pcireg_t		sc_id;
    218 
    219 	bus_space_tag_t		sc_regt;
    220 	bus_space_handle_t	sc_regh;
    221 	bus_size_t		sc_regsz;
    222 	bus_addr_t		sc_regaddr;
    223 
    224 	bus_space_tag_t		sc_memt;
    225 	bus_space_handle_t	sc_memh;
    226 	bus_size_t		sc_memsz;
    227 	bus_addr_t		sc_memaddr;
    228 
    229 	bus_space_tag_t		sc_iot;
    230 	bus_space_handle_t	sc_ioh;
    231 	bus_size_t		sc_iosz;
    232 	bus_addr_t		sc_ioaddr;
    233 
    234 	int			sc_needs_unmap;
    235 	int			sc_mapped;
    236 
    237 	/* size of a single display */
    238 	int			sc_maxx;
    239 	int			sc_maxy;
    240 	int			sc_maxbpp;
    241 	int			sc_fboffset;
    242 	int			sc_fbsize;
    243 
    244 	bus_space_tag_t		sc_romt;
    245 	bus_space_handle_t	sc_romh;
    246 	bus_size_t		sc_romsz;
    247 	bus_addr_t		sc_romaddr;
    248 	bus_space_handle_t	sc_biosh;
    249 
    250 	bus_dma_tag_t		sc_dmat;
    251 
    252 	uint16_t		sc_refclk;
    253 	uint16_t		sc_refdiv;
    254 	uint32_t		sc_minpll;
    255 	uint32_t		sc_maxpll;
    256 
    257 	pci_chipset_tag_t	sc_pc;
    258 	pcitag_t		sc_pt;
    259 
    260 	/* card's idea of addresses, internally */
    261 	uint32_t		sc_aperbase;
    262 
    263 	int			sc_ndisplays;
    264 	struct radeonfb_display	sc_displays[RADEON_NDISPLAYS];
    265 
    266 	int			sc_nports;
    267 	struct radeonfb_port	sc_ports[2];
    268 
    269 	struct radeon_tmds_pll	sc_tmds_pll[4];
    270 
    271 	struct radeonfb_i2c	sc_i2c[4];
    272 
    273 	uint8_t			*sc_bios;
    274 	bus_size_t		sc_biossz;
    275 	uint32_t		sc_fp_gen_cntl;
    276 
    277 	char			sc_modebuf[64];
    278 	const char		*sc_defaultmode;
    279 };
    280 
    281 /* chip families */
    282 #define	RADEON_R100	1
    283 #define	RADEON_RV100	2
    284 #define	RADEON_RS100	3
    285 #define	RADEON_RV200	4
    286 #define	RADEON_RS200	5
    287 #define	RADEON_R200	6
    288 #define	RADEON_RV250	7
    289 #define	RADEON_RS300	8
    290 #define	RADEON_RV280	9
    291 #define	RADEON_R300	10
    292 #define	RADEON_R350	11
    293 #define	RADEON_RV350	12
    294 #define	RADEON_RV380	13
    295 #define	RADEON_R420	14
    296 #define RADEON_R580	15
    297 #define	RADEON_FAMILIES	16
    298 
    299 /* feature flags */
    300 #define	RFB_MOB		(1 << 0)	/* Mobility */
    301 #define	RFB_NCRTC2	(1 << 1)	/* No CRTC2 */
    302 #define	RFB_IGP		(1 << 2)
    303 #define	RFB_R300CG	(1 << 3)
    304 #define	RFB_SDAC	(1 << 4)	/* Single DAC */
    305 #define	RFB_R300	(1 << 5)	/* R300 variants -- newer parts */
    306 #define	RFB_RV100	(1 << 6)	/* RV100 variants -- previous gen */
    307 #define	RFB_ATOM	(1 << 7)	/* ATOM bios */
    308 #define RFB_INV_BLIGHT	(1 << 8)	/* backlight level inverted */
    309 #define RFB_IS_AVIVO	(1 << 9)	/* MC and CRTCs are different here */
    310 
    311 #define	IS_MOBILITY(sc)	((sc)->sc_flags & RFB_MOB)
    312 #define	HAS_CRTC2(sc)	(((sc)->sc_flags & RFB_NCRTC2) == 0)
    313 
    314 #define	IS_R300(sc)	((sc)->sc_flags & RFB_R300)
    315 #define	HAS_R300CG(sc)	((sc)->sc_flags & RFB_R300CG)
    316 #define	HAS_SDAC(sc)	((sc)->sc_flags & RFB_SDAC)
    317 #define	IS_RV100(sc)	((sc)->sc_flags & RFB_RV100)
    318 #define	IS_IGP(sc)	((sc)->sc_flags & RFB_IGP)
    319 #define	IS_ATOM(sc)	((sc)->sc_flags & RFB_ATOM)
    320 #define	IS_AVIVO(sc)	((sc)->sc_flags & RFB_IS_AVIVO)
    321 
    322 #define	RADEON_TIMEOUT	2000000
    323 
    324 #define	GET32(sc, r)	radeonfb_get32(sc, r)
    325 #define	PUT32(sc, r, v)	radeonfb_put32(sc, r, v)
    326 #define	PUT32S(sc, r, v)	radeonfb_put32s(sc, r, v)
    327 #define	SET32(sc, r, v)	PUT32(sc, r, GET32(sc, r) | (v))
    328 #define	CLR32(sc, r, v)	PUT32(sc, r, GET32(sc, r) & ~(v))
    329 #define	PATCH32(sc, r, v, m)	PUT32(sc, r, (GET32(sc, r) & (m)) | (v))
    330 
    331 
    332 #define	GETPLL(sc, r)		radeonfb_getpll(sc, r)
    333 #define	PUTPLL(sc, r, v)	radeonfb_putpll(sc, r, v)
    334 #define	SETPLL(sc, r, v)	PUTPLL(sc, r, GETPLL(sc, r) | (v))
    335 #define	CLRPLL(sc, r, v)	PUTPLL(sc, r, GETPLL(sc, r) & ~(v))
    336 #define	PATCHPLL(sc, r, v, m)	PUTPLL(sc, r, (GETPLL(sc, r) & (m)) | (v))
    337 
    338 #define	GETROM32(sc, r)	bus_space_read_4(sc->sc_romt, sc->sc_romh, r)
    339 #define	GETROM16(sc, r)	bus_space_read_2(sc->sc_romt, sc->sc_romh, r)
    340 #define	GETROM8(sc, r)	bus_space_read_1(sc->sc_romt, sc->sc_romh, r)
    341 
    342 /*
    343  * Some values in BIOS are misaligned...
    344  */
    345 #define	GETBIOS8(sc, r)		((sc)->sc_bios[(r)])
    346 
    347 #define	GETBIOS16(sc, r)	\
    348 	((GETBIOS8(sc, (r) + 1) << 8) | GETBIOS8(sc, (r)))
    349 
    350 #define	GETBIOS32(sc, r)	\
    351 	((GETBIOS16(sc, (r) + 2) << 16) | GETBIOS16(sc, (r)))
    352 
    353 #define	XNAME(sc)	device_xname(sc->sc_dev)
    354 
    355 #define	DIVIDE(x,y)	(((x) + (y / 2)) / (y))
    356 
    357 uint32_t radeonfb_get32(struct radeonfb_softc *, uint32_t);
    358 void radeonfb_put32(struct radeonfb_softc *, uint32_t, uint32_t);
    359 void radeonfb_put32s(struct radeonfb_softc *, uint32_t, uint32_t);
    360 void radeonfb_mask32(struct radeonfb_softc *, uint32_t, uint32_t, uint32_t);
    361 
    362 uint32_t radeonfb_getindex(struct radeonfb_softc *, uint32_t);
    363 void radeonfb_putindex(struct radeonfb_softc *, uint32_t, uint32_t);
    364 void radeonfb_maskindex(struct radeonfb_softc *, uint32_t, uint32_t, uint32_t);
    365 
    366 uint32_t radeonfb_getpll(struct radeonfb_softc *, uint32_t);
    367 void radeonfb_putpll(struct radeonfb_softc *, uint32_t, uint32_t);
    368 void radeonfb_maskpll(struct radeonfb_softc *, uint32_t, uint32_t, uint32_t);
    369 
    370 int	radeonfb_bios_init(struct radeonfb_softc *);
    371 
    372 void	radeonfb_i2c_init(struct radeonfb_softc *);
    373 int	radeonfb_i2c_read_edid(struct radeonfb_softc *, int, uint8_t *);
    374 
    375 #endif	/* _DEV_PCI_RADEONFBVAR_H */
    376