pccardvar.h revision 58581
152506Simp/*	$NetBSD: pcmciavar.h,v 1.9 1998/12/29 09:00:28 marc Exp $	*/
252506Simp/* $FreeBSD: head/sys/dev/pccard/pccardvar.h 58581 2000-03-26 07:01:52Z imp $ */
352506Simp
452506Simp/*
552506Simp * Copyright (c) 1997 Marc Horowitz.  All rights reserved.
652506Simp *
752506Simp * Redistribution and use in source and binary forms, with or without
852506Simp * modification, are permitted provided that the following conditions
952506Simp * are met:
1052506Simp * 1. Redistributions of source code must retain the above copyright
1152506Simp *    notice, this list of conditions and the following disclaimer.
1252506Simp * 2. Redistributions in binary form must reproduce the above copyright
1352506Simp *    notice, this list of conditions and the following disclaimer in the
1452506Simp *    documentation and/or other materials provided with the distribution.
1552506Simp * 3. All advertising materials mentioning features or use of this software
1652506Simp *    must display the following acknowledgement:
1752506Simp *	This product includes software developed by Marc Horowitz.
1852506Simp * 4. The name of the author may not be used to endorse or promote products
1952506Simp *    derived from this software without specific prior written permission.
2052506Simp *
2152506Simp * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
2252506Simp * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
2352506Simp * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
2452506Simp * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2552506Simp * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2652506Simp * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2752506Simp * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2852506Simp * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2952506Simp * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
3052506Simp * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3152506Simp */
3252506Simp
3352506Simp#include <sys/types.h>
3452506Simp#include <sys/queue.h>
3552506Simp
3652506Simp#include <machine/bus.h>
3752506Simp
3852506Simp#include <dev/pccard/pccardchip.h>
3952506Simp
4052506Simpextern int	pccard_verbose;
4152506Simp
4252506Simp/*
4352506Simp * Contains information about mapped/allocated i/o spaces.
4452506Simp */
4552506Simpstruct pccard_io_handle {
4652506Simp	bus_space_tag_t iot;		/* bus space tag (from chipset) */
4752506Simp	bus_space_handle_t ioh;		/* mapped space handle */
4852506Simp	bus_addr_t      addr;		/* resulting address in bus space */
4952506Simp	bus_size_t      size;		/* size of i/o space */
5052506Simp	int             flags;		/* misc. information */
5154250Simp	int		width;
5252506Simp};
5352506Simp
5452506Simp#define	PCCARD_IO_ALLOCATED	0x01	/* i/o space was allocated */
5552506Simp
5652506Simp/*
5752506Simp * Contains information about allocated memory space.
5852506Simp */
5952506Simpstruct pccard_mem_handle {
6052506Simp	bus_space_tag_t memt;		/* bus space tag (from chipset) */
6152506Simp	bus_space_handle_t memh;	/* mapped space handle */
6252506Simp	bus_addr_t      addr;		/* resulting address in bus space */
6352506Simp	bus_size_t      size;		/* size of mem space */
6452506Simp	pccard_mem_handle_t mhandle;	/* opaque memory handle */
6552506Simp	bus_size_t      realsize;	/* how much we really allocated */
6654250Simp	long		offset;
6754250Simp	int		kind;
6852506Simp};
6952506Simp
7052506Simp/* pccard itself */
7152506Simp
7252506Simp#define PCCARD_CFE_MWAIT_REQUIRED	0x0001
7352506Simp#define PCCARD_CFE_RDYBSY_ACTIVE	0x0002
7452506Simp#define PCCARD_CFE_WP_ACTIVE		0x0004
7552506Simp#define PCCARD_CFE_BVD_ACTIVE		0x0008
7652506Simp#define PCCARD_CFE_IO8			0x0010
7752506Simp#define PCCARD_CFE_IO16			0x0020
7852506Simp#define PCCARD_CFE_IRQSHARE		0x0040
7952506Simp#define PCCARD_CFE_IRQPULSE		0x0080
8052506Simp#define PCCARD_CFE_IRQLEVEL		0x0100
8152506Simp#define PCCARD_CFE_POWERDOWN		0x0200
8252506Simp#define PCCARD_CFE_READONLY		0x0400
8352506Simp#define PCCARD_CFE_AUDIO		0x0800
8452506Simp
8552506Simpstruct pccard_config_entry {
8652506Simp	int		number;
8752506Simp	u_int32_t	flags;
8852506Simp	int		iftype;
8952506Simp	int		num_iospace;
9052506Simp
9152506Simp	/*
9252506Simp	 * The card will only decode this mask in any case, so we can
9352506Simp	 * do dynamic allocation with this in mind, in case the suggestions
9452506Simp	 * below are no good.
9552506Simp	 */
9652506Simp	u_long		iomask;
9752506Simp	struct {
9852506Simp		u_long	length;
9952506Simp		u_long	start;
10052506Simp	} iospace[4];		/* XXX this could be as high as 16 */
10152506Simp	u_int16_t	irqmask;
10252506Simp	int		num_memspace;
10352506Simp	struct {
10452506Simp		u_long	length;
10552506Simp		u_long	cardaddr;
10652506Simp		u_long	hostaddr;
10752506Simp	} memspace[2];		/* XXX this could be as high as 8 */
10852506Simp	int		maxtwins;
10952506Simp	STAILQ_ENTRY(pccard_config_entry) cfe_list;
11052506Simp};
11152506Simp
11252506Simpstruct pccard_function {
11352506Simp	/* read off the card */
11452506Simp	int		number;
11552506Simp	int		function;
11652506Simp	int		last_config_index;
11752506Simp	u_long		ccr_base;
11852506Simp	u_long		ccr_mask;
11955720Simp	struct resource *ccr_res;
12055720Simp	int		ccr_rid;
12152506Simp	STAILQ_HEAD(, pccard_config_entry) cfe_head;
12252506Simp	STAILQ_ENTRY(pccard_function) pf_list;
12352506Simp	/* run-time state */
12452506Simp	struct pccard_softc *sc;
12552506Simp	struct device *child;
12652506Simp	struct pccard_config_entry *cfe;
12752506Simp	struct pccard_mem_handle pf_pcmh;
12852506Simp#define	pf_ccrt		pf_pcmh.memt
12952506Simp#define	pf_ccrh		pf_pcmh.memh
13052506Simp#define	pf_ccr_mhandle	pf_pcmh.mhandle
13152506Simp#define	pf_ccr_realsize	pf_pcmh.realsize
13252506Simp	bus_addr_t	pf_ccr_offset;
13352506Simp	int		pf_ccr_window;
13452506Simp	long		pf_mfc_iobase;
13552506Simp	long		pf_mfc_iomax;
13654250Simp	int		(*ih_fct)(void *);
13752506Simp	void		*ih_arg;
13852506Simp	int		ih_ipl;
13952506Simp	int		pf_flags;
14052506Simp};
14152506Simp
14252506Simp/* pf_flags */
14352506Simp#define	PFF_ENABLED	0x0001		/* function is enabled */
14452506Simp
14552506Simpstruct pccard_card {
14652506Simp	int		cis1_major;
14752506Simp	int		cis1_minor;
14852506Simp	/* XXX waste of space? */
14952506Simp	char		cis1_info_buf[256];
15052506Simp	char		*cis1_info[4];
15152506Simp	/*
15252506Simp	 * Use int32_t for manufacturer and product so that they can
15352506Simp	 * hold the id value found in card CIS and special value that
15452506Simp	 * indicates no id was found.
15552506Simp	 */
15652506Simp	int32_t		manufacturer;
15752506Simp#define	PCCARD_VENDOR_INVALID	-1
15852506Simp	int32_t		product;
15952506Simp#define	PCCARD_PRODUCT_INVALID		-1
16052506Simp	u_int16_t	error;
16152506Simp#define	PCCARD_CIS_INVALID		{ NULL, NULL, NULL, NULL }
16252506Simp	STAILQ_HEAD(, pccard_function) pf_head;
16352506Simp};
16452506Simp
16553873Simp/* More later? */
16653873Simpstruct pccard_ivar {
16753873Simp	struct resource_list resources;
16853873Simp	int	slotnum;
16952506Simp};
17052506Simp
17152506Simpstruct pccard_softc {
17255720Simp	device_t		dev;
17352506Simp	/* this stuff is for the socket */
17452506Simp
17552506Simp	/* this stuff is for the card */
17652506Simp	struct pccard_card card;
17752506Simp	void		*ih;
17855500Simp	int		sc_enabled_count;	/* num functions enabled */
17952506Simp
18052506Simp};
18152506Simp
18252506Simpvoid
18354250Simppccardbus_if_setup(struct pccard_softc*);
18452506Simp
18552506Simpstruct pccard_cis_quirk {
18652506Simp	int32_t manufacturer;
18752506Simp	int32_t product;
18852506Simp	char *cis1_info[4];
18952506Simp	struct pccard_function *pf;
19052506Simp	struct pccard_config_entry *cfe;
19152506Simp};
19252506Simp
19352506Simpstruct pccard_tuple {
19452506Simp	unsigned int	code;
19552506Simp	unsigned int	length;
19652506Simp	u_long		mult;
19752506Simp	bus_addr_t	ptr;
19852506Simp	bus_space_tag_t	memt;
19952506Simp	bus_space_handle_t memh;
20052506Simp};
20152506Simp
20254250Simpvoid	pccard_read_cis(struct pccard_softc *);
20352506Simpvoid	pccard_check_cis_quirks(device_t);
20452506Simpvoid	pccard_print_cis(device_t);
20554250Simpint	pccard_scan_cis(struct device * dev,
20654250Simp	    int (*) (struct pccard_tuple *, void *), void *);
20752506Simp
20852506Simp#define	pccard_cis_read_1(tuple, idx0)					\
20952506Simp	(bus_space_read_1((tuple)->memt, (tuple)->memh, (tuple)->mult*(idx0)))
21052506Simp
21152506Simp#define	pccard_tuple_read_1(tuple, idx1)				\
21252506Simp	(pccard_cis_read_1((tuple), ((tuple)->ptr+(2+(idx1)))))
21352506Simp
21452506Simp#define	pccard_tuple_read_2(tuple, idx2)				\
21552506Simp	(pccard_tuple_read_1((tuple), (idx2)) | 			\
21652506Simp	 (pccard_tuple_read_1((tuple), (idx2)+1)<<8))
21752506Simp
21852506Simp#define	pccard_tuple_read_3(tuple, idx3)				\
21952506Simp	(pccard_tuple_read_1((tuple), (idx3)) |				\
22052506Simp	 (pccard_tuple_read_1((tuple), (idx3)+1)<<8) |			\
22152506Simp	 (pccard_tuple_read_1((tuple), (idx3)+2)<<16))
22252506Simp
22352506Simp#define	pccard_tuple_read_4(tuple, idx4)				\
22452506Simp	(pccard_tuple_read_1((tuple), (idx4)) |				\
22552506Simp	 (pccard_tuple_read_1((tuple), (idx4)+1)<<8) |			\
22652506Simp	 (pccard_tuple_read_1((tuple), (idx4)+2)<<16) |			\
22752506Simp	 (pccard_tuple_read_1((tuple), (idx4)+3)<<24))
22852506Simp
22952506Simp#define	pccard_tuple_read_n(tuple, n, idxn)				\
23052506Simp	(((n)==1)?pccard_tuple_read_1((tuple), (idxn)) :		\
23152506Simp	 (((n)==2)?pccard_tuple_read_2((tuple), (idxn)) :		\
23252506Simp	  (((n)==3)?pccard_tuple_read_3((tuple), (idxn)) :		\
23352506Simp	   /* n == 4 */ pccard_tuple_read_4((tuple), (idxn)))))
23452506Simp
23552506Simp#define	PCCARD_SPACE_MEMORY	1
23652506Simp#define	PCCARD_SPACE_IO		2
23752506Simp
23854250Simpint	pccard_ccr_read(struct pccard_function *, int);
23954250Simpvoid	pccard_ccr_write(struct pccard_function *, int, int);
24052506Simp
24152506Simp#define	pccard_mfc(sc)	(STAILQ_FIRST(&(sc)->card.pf_head) &&		\
24252506Simp		 STAILQ_NEXT(STAILQ_FIRST(&(sc)->card.pf_head),pf_list))
24352506Simp
24454250Simpvoid	pccard_function_init(struct pccard_function *,
24554250Simp	    struct pccard_config_entry *);
24654250Simpint	pccard_function_enable(struct pccard_function *);
24754250Simpvoid	pccard_function_disable(struct pccard_function *);
24852506Simp
24952506Simp#define	pccard_io_alloc(pf, start, size, align, pciop)			\
25052506Simp	(pccard_chip_io_alloc((pf)->sc->pct, pf->sc->pch, (start),	\
25152506Simp	 (size), (align), (pciop)))
25252506Simp
25352506Simp#define	pccard_io_free(pf, pciohp)					\
25452506Simp	(pccard_chip_io_free((pf)->sc->pct, (pf)->sc->pch, (pciohp)))
25552506Simp
25654250Simpint	pccard_io_map(struct pccard_function *, int, bus_addr_t,
25754250Simp	    bus_size_t, struct pccard_io_handle *, int *);
25854250Simpvoid	pccard_io_unmap(struct pccard_function *, int);
25952506Simp
26052506Simp#define pccard_mem_alloc(pf, size, pcmhp)				\
26152506Simp	(pccard_chip_mem_alloc((pf)->sc->pct, (pf)->sc->pch, (size), (pcmhp)))
26252506Simp
26352506Simp#define pccard_mem_free(pf, pcmhp)					\
26452506Simp	(pccard_chip_mem_free((pf)->sc->pct, (pf)->sc->pch, (pcmhp)))
26552506Simp
26652506Simp#define pccard_mem_map(pf, kind, card_addr, size, pcmhp, offsetp, windowp) \
26752506Simp	(pccard_chip_mem_map((pf)->sc->pct, (pf)->sc->pch, (kind),	\
26852506Simp	 (card_addr), (size), (pcmhp), (offsetp), (windowp)))
26952506Simp
27052506Simp#define	pccard_mem_unmap(pf, window)					\
27152506Simp	(pccard_chip_mem_unmap((pf)->sc->pct, (pf)->sc->pch, (window)))
27256361Shosokawa
27356361Shosokawa/* ivar interface */
27456361Shosokawaenum {
27556361Shosokawa	PCCARD_IVAR_ETHADDR,	/* read ethernet address from CIS tupple */
27656361Shosokawa};
27756361Shosokawa
27856361Shosokawa/* read ethernet address from CIS tupple */
27956361Shosokawa__inline static int
28056361Shosokawapccard_get_ether(device_t dev, u_char *enaddr)
28156361Shosokawa{
28256361Shosokawa	return BUS_READ_IVAR(device_get_parent(dev), dev,
28358581Simp	    PCCARD_IVAR_ETHADDR, (uintptr_t *)enaddr);
28456361Shosokawa}
28558581Simp
28658581Simpenum {
28758581Simp	PCCARD_A_MEM_ATTR
28858581Simp};
28958581Simp
29058581Simp/* Set the */
29158581Simp
29258581Simpstatic __inline__ void
29358581Simppccard_set_attribute(device_t dev, struct resource *r, int rid, int flags)
29458581Simp{
29558581Simp}
296